Merge "Fix scaleType in CameraView + Add support for all scaleTypes from PreviewView." into androidx-master-dev
diff --git a/OWNERS b/OWNERS
index 67a6139..4ef17c5 100644
--- a/OWNERS
+++ b/OWNERS
@@ -21,3 +21,6 @@
 sjgilbert@google.com
 sumir@google.com
 yboyar@google.com
+
+per-file *settings.gradle = set noparent
+per-file *settings.gradle = nickanthony@google.com, alanv@google.com, aurimas@google.com
\ No newline at end of file
diff --git a/activity/activity-ktx/api/1.2.0-alpha04.txt b/activity/activity-ktx/api/1.2.0-alpha04.txt
index 6b7ae22..f28cc78 100644
--- a/activity/activity-ktx/api/1.2.0-alpha04.txt
+++ b/activity/activity-ktx/api/1.2.0-alpha04.txt
@@ -2,8 +2,8 @@
 package androidx.activity {
 
   public final class ActivityResultCallerKt {
-    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> prepareCall(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
-    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> prepareCall(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
   }
 
   public final class ActivityResultLauncherKt {
diff --git a/activity/activity-ktx/api/current.txt b/activity/activity-ktx/api/current.txt
index 6b7ae22..f28cc78 100644
--- a/activity/activity-ktx/api/current.txt
+++ b/activity/activity-ktx/api/current.txt
@@ -2,8 +2,8 @@
 package androidx.activity {
 
   public final class ActivityResultCallerKt {
-    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> prepareCall(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
-    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> prepareCall(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
   }
 
   public final class ActivityResultLauncherKt {
diff --git a/activity/activity-ktx/api/public_plus_experimental_1.2.0-alpha04.txt b/activity/activity-ktx/api/public_plus_experimental_1.2.0-alpha04.txt
index 6b7ae22..f28cc78 100644
--- a/activity/activity-ktx/api/public_plus_experimental_1.2.0-alpha04.txt
+++ b/activity/activity-ktx/api/public_plus_experimental_1.2.0-alpha04.txt
@@ -2,8 +2,8 @@
 package androidx.activity {
 
   public final class ActivityResultCallerKt {
-    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> prepareCall(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
-    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> prepareCall(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
   }
 
   public final class ActivityResultLauncherKt {
diff --git a/activity/activity-ktx/api/public_plus_experimental_current.txt b/activity/activity-ktx/api/public_plus_experimental_current.txt
index 6b7ae22..f28cc78 100644
--- a/activity/activity-ktx/api/public_plus_experimental_current.txt
+++ b/activity/activity-ktx/api/public_plus_experimental_current.txt
@@ -2,8 +2,8 @@
 package androidx.activity {
 
   public final class ActivityResultCallerKt {
-    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> prepareCall(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
-    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> prepareCall(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
   }
 
   public final class ActivityResultLauncherKt {
diff --git a/activity/activity-ktx/api/restricted_1.2.0-alpha04.txt b/activity/activity-ktx/api/restricted_1.2.0-alpha04.txt
index 6b7ae22..f28cc78 100644
--- a/activity/activity-ktx/api/restricted_1.2.0-alpha04.txt
+++ b/activity/activity-ktx/api/restricted_1.2.0-alpha04.txt
@@ -2,8 +2,8 @@
 package androidx.activity {
 
   public final class ActivityResultCallerKt {
-    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> prepareCall(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
-    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> prepareCall(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
   }
 
   public final class ActivityResultLauncherKt {
diff --git a/activity/activity-ktx/api/restricted_current.txt b/activity/activity-ktx/api/restricted_current.txt
index 6b7ae22..f28cc78 100644
--- a/activity/activity-ktx/api/restricted_current.txt
+++ b/activity/activity-ktx/api/restricted_current.txt
@@ -2,8 +2,8 @@
 package androidx.activity {
 
   public final class ActivityResultCallerKt {
-    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> prepareCall(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
-    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> prepareCall(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static inline <I, O> kotlin.jvm.functions.Function0<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
   }
 
   public final class ActivityResultLauncherKt {
diff --git a/activity/activity-ktx/src/main/java/androidx/activity/ActivityResultCaller.kt b/activity/activity-ktx/src/main/java/androidx/activity/ActivityResultCaller.kt
index aed0651..5ee3376 100644
--- a/activity/activity-ktx/src/main/java/androidx/activity/ActivityResultCaller.kt
+++ b/activity/activity-ktx/src/main/java/androidx/activity/ActivityResultCaller.kt
@@ -21,32 +21,32 @@
 import androidx.activity.result.contract.ActivityResultContract
 
 /**
- * A version of [ActivityResultCaller.prepareCall]
+ * A version of [ActivityResultCaller.registerForActivityResult]
  * that additionally takes an input right away, producing a launcher that doesn't take any
  * additional input when called.
  *
- * @see ActivityResultCaller.prepareCall
+ * @see ActivityResultCaller.registerForActivityResult
  */
-inline fun <I, O> ActivityResultCaller.prepareCall(
+inline fun <I, O> ActivityResultCaller.registerForActivityResult(
     contract: ActivityResultContract<I, O>,
     input: I,
     registry: ActivityResultRegistry,
     crossinline callback: (O) -> Unit
 ): () -> Unit {
-    return { prepareCall(contract, registry) { callback(it) }.launch(input) }
+    return { registerForActivityResult(contract, registry) { callback(it) }.launch(input) }
 }
 
 /**
- * A version of [ActivityResultCaller.prepareCall]
+ * A version of [ActivityResultCaller.registerForActivityResult]
  * that additionally takes an input right away, producing a launcher that doesn't take any
  * additional input when called.
  *
- * @see ActivityResultCaller.prepareCall
+ * @see ActivityResultCaller.registerForActivityResult
  */
-inline fun <I, O> ActivityResultCaller.prepareCall(
+inline fun <I, O> ActivityResultCaller.registerForActivityResult(
     contract: ActivityResultContract<I, O>,
     input: I,
     crossinline callback: (O) -> Unit
 ): () -> Unit {
-    return { prepareCall(contract) { callback(it) }.launch(input) }
+    return { registerForActivityResult(contract) { callback(it) }.launch(input) }
 }
\ No newline at end of file
diff --git a/activity/activity/api/1.2.0-alpha04.txt b/activity/activity/api/1.2.0-alpha04.txt
index 025e865..b879153 100644
--- a/activity/activity/api/1.2.0-alpha04.txt
+++ b/activity/activity/api/1.2.0-alpha04.txt
@@ -13,8 +13,8 @@
     method public androidx.lifecycle.ViewModelStore getViewModelStore();
     method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
     method public final Object? onRetainNonConfigurationInstance();
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
   }
 
   public abstract class OnBackPressedCallback {
@@ -57,8 +57,8 @@
   }
 
   public interface ActivityResultCaller {
-    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
-    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
   }
 
   public abstract class ActivityResultLauncher<I> {
@@ -79,6 +79,22 @@
     method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
   }
 
+  public final class IntentSenderRequest {
+    method public android.content.Intent? getFillInIntent();
+    method public int getFlagsMask();
+    method public int getFlagsValues();
+    method public android.content.IntentSender getIntentSender();
+  }
+
+  public static final class IntentSenderRequest.Builder {
+    ctor public IntentSenderRequest.Builder(android.content.IntentSender);
+    ctor public IntentSenderRequest.Builder(android.app.PendingIntent);
+    method public androidx.activity.result.IntentSenderRequest build();
+    method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent?);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlagsMask(int);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlagsValues(int);
+  }
+
 }
 
 package androidx.activity.result.contract {
@@ -169,6 +185,14 @@
     method public androidx.activity.result.ActivityResult parseResult(int, android.content.Intent?);
   }
 
+  public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartIntentSenderForResult();
+    method public android.content.Intent createIntent(android.content.Context, androidx.activity.result.IntentSenderRequest);
+    method public androidx.activity.result.ActivityResult parseResult(int, android.content.Intent?);
+    field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+    field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
+  }
+
   public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
     ctor public ActivityResultContracts.TakePicture();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
diff --git a/activity/activity/api/current.txt b/activity/activity/api/current.txt
index 025e865..b879153 100644
--- a/activity/activity/api/current.txt
+++ b/activity/activity/api/current.txt
@@ -13,8 +13,8 @@
     method public androidx.lifecycle.ViewModelStore getViewModelStore();
     method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
     method public final Object? onRetainNonConfigurationInstance();
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
   }
 
   public abstract class OnBackPressedCallback {
@@ -57,8 +57,8 @@
   }
 
   public interface ActivityResultCaller {
-    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
-    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
   }
 
   public abstract class ActivityResultLauncher<I> {
@@ -79,6 +79,22 @@
     method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
   }
 
+  public final class IntentSenderRequest {
+    method public android.content.Intent? getFillInIntent();
+    method public int getFlagsMask();
+    method public int getFlagsValues();
+    method public android.content.IntentSender getIntentSender();
+  }
+
+  public static final class IntentSenderRequest.Builder {
+    ctor public IntentSenderRequest.Builder(android.content.IntentSender);
+    ctor public IntentSenderRequest.Builder(android.app.PendingIntent);
+    method public androidx.activity.result.IntentSenderRequest build();
+    method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent?);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlagsMask(int);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlagsValues(int);
+  }
+
 }
 
 package androidx.activity.result.contract {
@@ -169,6 +185,14 @@
     method public androidx.activity.result.ActivityResult parseResult(int, android.content.Intent?);
   }
 
+  public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartIntentSenderForResult();
+    method public android.content.Intent createIntent(android.content.Context, androidx.activity.result.IntentSenderRequest);
+    method public androidx.activity.result.ActivityResult parseResult(int, android.content.Intent?);
+    field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+    field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
+  }
+
   public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
     ctor public ActivityResultContracts.TakePicture();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
diff --git a/activity/activity/api/public_plus_experimental_1.2.0-alpha04.txt b/activity/activity/api/public_plus_experimental_1.2.0-alpha04.txt
index b69316f..d0ab50f 100644
--- a/activity/activity/api/public_plus_experimental_1.2.0-alpha04.txt
+++ b/activity/activity/api/public_plus_experimental_1.2.0-alpha04.txt
@@ -12,8 +12,8 @@
     method public androidx.lifecycle.ViewModelStore getViewModelStore();
     method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
     method public final Object? onRetainNonConfigurationInstance();
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
   }
 
   public abstract class OnBackPressedCallback {
@@ -56,8 +56,8 @@
   }
 
   public interface ActivityResultCaller {
-    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
-    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
   }
 
   public abstract class ActivityResultLauncher<I> {
@@ -78,6 +78,22 @@
     method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
   }
 
+  public final class IntentSenderRequest {
+    method public android.content.Intent? getFillInIntent();
+    method public int getFlagsMask();
+    method public int getFlagsValues();
+    method public android.content.IntentSender getIntentSender();
+  }
+
+  public static final class IntentSenderRequest.Builder {
+    ctor public IntentSenderRequest.Builder(android.content.IntentSender);
+    ctor public IntentSenderRequest.Builder(android.app.PendingIntent);
+    method public androidx.activity.result.IntentSenderRequest build();
+    method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent?);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlagsMask(int);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlagsValues(int);
+  }
+
 }
 
 package androidx.activity.result.contract {
@@ -168,6 +184,14 @@
     method public androidx.activity.result.ActivityResult parseResult(int, android.content.Intent?);
   }
 
+  public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartIntentSenderForResult();
+    method public android.content.Intent createIntent(android.content.Context, androidx.activity.result.IntentSenderRequest);
+    method public androidx.activity.result.ActivityResult parseResult(int, android.content.Intent?);
+    field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+    field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
+  }
+
   public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
     ctor public ActivityResultContracts.TakePicture();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
diff --git a/activity/activity/api/public_plus_experimental_current.txt b/activity/activity/api/public_plus_experimental_current.txt
index b69316f..d0ab50f 100644
--- a/activity/activity/api/public_plus_experimental_current.txt
+++ b/activity/activity/api/public_plus_experimental_current.txt
@@ -12,8 +12,8 @@
     method public androidx.lifecycle.ViewModelStore getViewModelStore();
     method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
     method public final Object? onRetainNonConfigurationInstance();
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
   }
 
   public abstract class OnBackPressedCallback {
@@ -56,8 +56,8 @@
   }
 
   public interface ActivityResultCaller {
-    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
-    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
   }
 
   public abstract class ActivityResultLauncher<I> {
@@ -78,6 +78,22 @@
     method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
   }
 
+  public final class IntentSenderRequest {
+    method public android.content.Intent? getFillInIntent();
+    method public int getFlagsMask();
+    method public int getFlagsValues();
+    method public android.content.IntentSender getIntentSender();
+  }
+
+  public static final class IntentSenderRequest.Builder {
+    ctor public IntentSenderRequest.Builder(android.content.IntentSender);
+    ctor public IntentSenderRequest.Builder(android.app.PendingIntent);
+    method public androidx.activity.result.IntentSenderRequest build();
+    method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent?);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlagsMask(int);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlagsValues(int);
+  }
+
 }
 
 package androidx.activity.result.contract {
@@ -168,6 +184,14 @@
     method public androidx.activity.result.ActivityResult parseResult(int, android.content.Intent?);
   }
 
+  public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartIntentSenderForResult();
+    method public android.content.Intent createIntent(android.content.Context, androidx.activity.result.IntentSenderRequest);
+    method public androidx.activity.result.ActivityResult parseResult(int, android.content.Intent?);
+    field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+    field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
+  }
+
   public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
     ctor public ActivityResultContracts.TakePicture();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
diff --git a/activity/activity/api/restricted_1.2.0-alpha04.txt b/activity/activity/api/restricted_1.2.0-alpha04.txt
index b69316f..d0ab50f 100644
--- a/activity/activity/api/restricted_1.2.0-alpha04.txt
+++ b/activity/activity/api/restricted_1.2.0-alpha04.txt
@@ -12,8 +12,8 @@
     method public androidx.lifecycle.ViewModelStore getViewModelStore();
     method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
     method public final Object? onRetainNonConfigurationInstance();
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
   }
 
   public abstract class OnBackPressedCallback {
@@ -56,8 +56,8 @@
   }
 
   public interface ActivityResultCaller {
-    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
-    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
   }
 
   public abstract class ActivityResultLauncher<I> {
@@ -78,6 +78,22 @@
     method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
   }
 
+  public final class IntentSenderRequest {
+    method public android.content.Intent? getFillInIntent();
+    method public int getFlagsMask();
+    method public int getFlagsValues();
+    method public android.content.IntentSender getIntentSender();
+  }
+
+  public static final class IntentSenderRequest.Builder {
+    ctor public IntentSenderRequest.Builder(android.content.IntentSender);
+    ctor public IntentSenderRequest.Builder(android.app.PendingIntent);
+    method public androidx.activity.result.IntentSenderRequest build();
+    method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent?);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlagsMask(int);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlagsValues(int);
+  }
+
 }
 
 package androidx.activity.result.contract {
@@ -168,6 +184,14 @@
     method public androidx.activity.result.ActivityResult parseResult(int, android.content.Intent?);
   }
 
+  public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartIntentSenderForResult();
+    method public android.content.Intent createIntent(android.content.Context, androidx.activity.result.IntentSenderRequest);
+    method public androidx.activity.result.ActivityResult parseResult(int, android.content.Intent?);
+    field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+    field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
+  }
+
   public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
     ctor public ActivityResultContracts.TakePicture();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
diff --git a/activity/activity/api/restricted_current.txt b/activity/activity/api/restricted_current.txt
index b69316f..d0ab50f 100644
--- a/activity/activity/api/restricted_current.txt
+++ b/activity/activity/api/restricted_current.txt
@@ -12,8 +12,8 @@
     method public androidx.lifecycle.ViewModelStore getViewModelStore();
     method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
     method public final Object? onRetainNonConfigurationInstance();
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
   }
 
   public abstract class OnBackPressedCallback {
@@ -56,8 +56,8 @@
   }
 
   public interface ActivityResultCaller {
-    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
-    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
   }
 
   public abstract class ActivityResultLauncher<I> {
@@ -78,6 +78,22 @@
     method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
   }
 
+  public final class IntentSenderRequest {
+    method public android.content.Intent? getFillInIntent();
+    method public int getFlagsMask();
+    method public int getFlagsValues();
+    method public android.content.IntentSender getIntentSender();
+  }
+
+  public static final class IntentSenderRequest.Builder {
+    ctor public IntentSenderRequest.Builder(android.content.IntentSender);
+    ctor public IntentSenderRequest.Builder(android.app.PendingIntent);
+    method public androidx.activity.result.IntentSenderRequest build();
+    method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent?);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlagsMask(int);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlagsValues(int);
+  }
+
 }
 
 package androidx.activity.result.contract {
@@ -168,6 +184,14 @@
     method public androidx.activity.result.ActivityResult parseResult(int, android.content.Intent?);
   }
 
+  public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartIntentSenderForResult();
+    method public android.content.Intent createIntent(android.content.Context, androidx.activity.result.IntentSenderRequest);
+    method public androidx.activity.result.ActivityResult parseResult(int, android.content.Intent?);
+    field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+    field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
+  }
+
   public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
     ctor public ActivityResultContracts.TakePicture();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
diff --git a/activity/activity/src/main/java/androidx/activity/ComponentActivity.java b/activity/activity/src/main/java/androidx/activity/ComponentActivity.java
index fe9104b..bf5f9e4 100644
--- a/activity/activity/src/main/java/androidx/activity/ComponentActivity.java
+++ b/activity/activity/src/main/java/androidx/activity/ComponentActivity.java
@@ -21,10 +21,13 @@
 import static androidx.activity.result.contract.ActivityResultContracts.RequestPermissions.ACTION_REQUEST_PERMISSIONS;
 import static androidx.activity.result.contract.ActivityResultContracts.RequestPermissions.EXTRA_PERMISSIONS;
 import static androidx.activity.result.contract.ActivityResultContracts.RequestPermissions.EXTRA_PERMISSION_GRANT_RESULTS;
+import static androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.ACTION_INTENT_SENDER_REQUEST;
+import static androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.EXTRA_SEND_INTENT_EXCEPTION;
 
 import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.content.Intent;
+import android.content.IntentSender;
 import android.content.pm.PackageManager;
 import android.os.Build;
 import android.os.Bundle;
@@ -39,6 +42,7 @@
 import androidx.activity.result.ActivityResultCaller;
 import androidx.activity.result.ActivityResultLauncher;
 import androidx.activity.result.ActivityResultRegistry;
+import androidx.activity.result.IntentSenderRequest;
 import androidx.activity.result.contract.ActivityResultContract;
 import androidx.annotation.CallSuper;
 import androidx.annotation.ContentView;
@@ -165,6 +169,23 @@
                     ActivityCompat.requestPermissions(activity,
                             nonGrantedPermissions.toArray(new String[0]), requestCode);
                 }
+            } else if (ACTION_INTENT_SENDER_REQUEST.equals(intent.getAction())) {
+                IntentSenderRequest request = (IntentSenderRequest) input;
+                try {
+                    ActivityCompat.startIntentSenderForResult(activity, request.getIntentSender(),
+                            requestCode, request.getFillInIntent(),
+                            request.getFlagsMask(), request.getFlagsValues(), 0,
+                            options != null ? options.toBundle() : null);
+                } catch (final IntentSender.SendIntentException e) {
+                    new Handler(Looper.getMainLooper()).post(new Runnable() {
+                        @Override
+                        public void run() {
+                            dispatchResult(requestCode, RESULT_CANCELED,
+                                    new Intent().setAction(ACTION_INTENT_SENDER_REQUEST)
+                                            .putExtra(EXTRA_SEND_INTENT_EXCEPTION, e));
+                        }
+                    });
+                }
             } else {
                 // startActivityForResult path
                 ActivityCompat.startActivityForResult(activity, intent, requestCode,
@@ -488,7 +509,7 @@
 
     @NonNull
     @Override
-    public final <I, O> ActivityResultLauncher<I> prepareCall(
+    public final <I, O> ActivityResultLauncher<I> registerForActivityResult(
             @NonNull final ActivityResultContract<I, O> contract,
             @NonNull final ActivityResultRegistry registry,
             @NonNull final ActivityResultCallback<O> callback) {
@@ -498,10 +519,10 @@
 
     @NonNull
     @Override
-    public final <I, O> ActivityResultLauncher<I> prepareCall(
+    public final <I, O> ActivityResultLauncher<I> registerForActivityResult(
             @NonNull ActivityResultContract<I, O> contract,
             @NonNull ActivityResultCallback<O> callback) {
-        return prepareCall(contract, mActivityResultRegistry, callback);
+        return registerForActivityResult(contract, mActivityResultRegistry, callback);
     }
 
     /**
diff --git a/activity/activity/src/main/java/androidx/activity/result/ActivityResultCaller.java b/activity/activity/src/main/java/androidx/activity/result/ActivityResultCaller.java
index 33486aa..b60d58e 100644
--- a/activity/activity/src/main/java/androidx/activity/result/ActivityResultCaller.java
+++ b/activity/activity/src/main/java/androidx/activity/result/ActivityResultCaller.java
@@ -30,8 +30,8 @@
 public interface ActivityResultCaller {
 
     /**
-     * Prepare to {@link Activity#startActivityForResult start an activity for result}, designated
-     * by the given {@link ActivityResultContract contract}.
+     * Register a request to {@link Activity#startActivityForResult start an activity for result},
+     * designated by the given {@link ActivityResultContract contract}.
      *
      * This creates a record in the {@link ActivityResultRegistry registry} associated wit this
      * caller, managing request code, as well as conversions to/from {@link Intent} under the hood.
@@ -49,13 +49,13 @@
      * @return the launcher that can be used to start the activity or dispose of the prepared call.
      */
     @NonNull
-    <I, O> ActivityResultLauncher<I> prepareCall(
+    <I, O> ActivityResultLauncher<I> registerForActivityResult(
             @NonNull ActivityResultContract<I, O> contract,
             @NonNull ActivityResultCallback<O> callback);
 
     /**
-     * Prepare to {@link Activity#startActivityForResult start an activity for result}, designated
-     * by the given {@link ActivityResultContract contract}.
+     * Register a request to {@link Activity#startActivityForResult start an activity for result},
+     * designated by the given {@link ActivityResultContract contract}.
      *
      * This creates a record in the given {@link ActivityResultRegistry registry}, managing request
      * code, as well as conversions to/from {@link Intent} under the hood.
@@ -74,7 +74,7 @@
      * @return the launcher that can be used to start the activity or dispose of the prepared call.
      */
     @NonNull
-    <I, O> ActivityResultLauncher<I> prepareCall(
+    <I, O> ActivityResultLauncher<I> registerForActivityResult(
             @NonNull ActivityResultContract<I, O> contract,
             @NonNull ActivityResultRegistry registry,
             @NonNull ActivityResultCallback<O> callback);
diff --git a/activity/activity/src/main/java/androidx/activity/result/ActivityResultLauncher.java b/activity/activity/src/main/java/androidx/activity/result/ActivityResultLauncher.java
index 43b5a8a..5d29e2b 100644
--- a/activity/activity/src/main/java/androidx/activity/result/ActivityResultLauncher.java
+++ b/activity/activity/src/main/java/androidx/activity/result/ActivityResultLauncher.java
@@ -25,8 +25,8 @@
 import androidx.core.app.ActivityOptionsCompat;
 
 /**
- * A launcher for a prevoiusly-{@link ActivityResultCaller#prepareCall prepared call} to start
- * the process of executing an {@link ActivityResultContract}.
+ * A launcher for a previously-{@link ActivityResultCaller#registerForActivityResult prepared call}
+ * to start the process of executing an {@link ActivityResultContract}.
  *
  * @param <I> type of the input required to launch
  */
diff --git a/activity/activity/src/main/java/androidx/activity/result/ActivityResultRegistry.java b/activity/activity/src/main/java/androidx/activity/result/ActivityResultRegistry.java
index 71975da..3d9760a 100644
--- a/activity/activity/src/main/java/androidx/activity/result/ActivityResultRegistry.java
+++ b/activity/activity/src/main/java/androidx/activity/result/ActivityResultRegistry.java
@@ -39,14 +39,14 @@
 
 /**
  * A registry that stores {@link ActivityResultCallback activity result callbacks} for
- * {@link ActivityResultCaller#prepareCall prepared calls}.
+ * {@link ActivityResultCaller#registerForActivityResult registered calls}.
  *
  * You can create your own instance for testing by overriding {@link #invoke} and calling
  * {@link #dispatchResult} immediately within it, thus skipping the actual
  * {@link Activity#startActivityForResult} call.
  *
  * When testing, make sure to explicitly provide a registry instance whenever calling
- * {@link ActivityResultCaller#prepareCall}, to be able to inject a test instance.
+ * {@link ActivityResultCaller#registerForActivityResult}, to be able to inject a test instance.
  */
 public abstract class ActivityResultRegistry {
     private static final String KEY_COMPONENT_ACTIVITY_REGISTERED_RCS =
@@ -86,7 +86,7 @@
      * Register a new callback with this registry.
      *
      * This is normally called by a higher level convenience methods like
-     * {@link ActivityResultCaller#prepareCall}.
+     * {@link ActivityResultCaller#registerForActivityResult}.
      *
      * @param key a unique string key identifying this call
      * @param lifecycleOwner a {@link LifecycleOwner} that makes this call.
@@ -157,7 +157,7 @@
      * Register a new callback with this registry.
      *
      * This is normally called by a higher level convenience methods like
-     * {@link ActivityResultCaller#prepareCall}.
+     * {@link ActivityResultCaller#registerForActivityResult}.
      *
      * When calling this, you must call {@link ActivityResultLauncher#unregister()} on the
      * returned {@link ActivityResultLauncher} when the launcher is no longer needed to
diff --git a/activity/activity/src/main/java/androidx/activity/result/IntentSenderRequest.java b/activity/activity/src/main/java/androidx/activity/result/IntentSenderRequest.java
new file mode 100644
index 0000000..6af1cf5
--- /dev/null
+++ b/activity/activity/src/main/java/androidx/activity/result/IntentSenderRequest.java
@@ -0,0 +1,164 @@
+/*
+ * 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.activity.result;
+
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.content.IntentSender;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+/**
+ * A request for a
+ * {@link androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult}
+ * Activity Contract.
+ */
+public final class IntentSenderRequest {
+    @NonNull
+    private final IntentSender mIntentSender;
+    @Nullable
+    private final Intent mFillInIntent;
+    private final int mFlagsMask;
+    private final int mFlagsValues;
+
+    IntentSenderRequest(@NonNull IntentSender intentSender, @Nullable Intent intent, int flagsMask,
+            int flagsValues) {
+        mIntentSender = intentSender;
+        mFillInIntent = intent;
+        mFlagsMask = flagsMask;
+        mFlagsValues = flagsValues;
+    }
+
+    /**
+     * Get the intentSender from this IntentSenderRequest.
+     *
+     * @return the IntentSender to launch.
+     */
+    @NonNull
+    public IntentSender getIntentSender() {
+        return mIntentSender;
+    }
+
+    /**
+     * Get the intent from this IntentSender request.  If non-null, this will be provided as the
+     * intent parameter to IntentSender#sendIntent.
+     *
+     * @return the fill in intent.
+     */
+    @Nullable
+    public Intent getFillInIntent() {
+        return mFillInIntent;
+    }
+
+    /**
+     * Get the flag mask from this IntentSender request.
+     *
+     * @return intent flags in the original IntentSender that you would like to change.
+     */
+    public int getFlagsMask() {
+        return mFlagsMask;
+    }
+
+    /**
+     * Get the flag values from this IntentSender request.
+     *
+     * @return desired values for any bits set in flagsMask
+     */
+    public int getFlagsValues() {
+        return mFlagsValues;
+    }
+
+    /**
+     * A builder for constructing {@link IntentSenderRequest} instances.
+     */
+    public static final class Builder {
+        private IntentSender mIntentSender;
+        private Intent mFillInIntent;
+        private int mFlagsMask;
+        private int mFlagsValues;
+
+        /**
+         * Constructor that takes an {@link IntentSender} and sets it for the builder.
+         *
+         * @param intentSender IntentSender to go in the IntentSenderRequest.
+         */
+        public Builder(@NonNull IntentSender intentSender) {
+            mIntentSender = intentSender;
+        }
+
+        /**
+         * Convenience constructor that takes an {@link PendingIntent} and uses
+         * its {@link IntentSender}.
+         *
+         * @param pendingIntent the pendingIntent containing with the intentSender to go in the
+         *                      IntentSenderRequest.
+         */
+        public Builder(@NonNull PendingIntent pendingIntent) {
+            this(pendingIntent.getIntentSender());
+        }
+
+        /**
+         * Set the intent for the {@link IntentSenderRequest}.
+         *
+         * @param fillInIntent intent to go in the IntentSenderRequest. If non-null, this
+         *                     will be provided as the intent parameter to IntentSender#sendIntent.
+         * @return This builder.
+         */
+        @NonNull
+        public Builder setFillInIntent(@Nullable Intent fillInIntent) {
+            mFillInIntent = fillInIntent;
+            return this;
+        }
+
+        /**
+         * Set the flag mask for the {@link IntentSenderRequest}.
+         *
+         * @param flagsMask mask to go in the IntentSenderRequest. Intent flags in the original
+         *                  IntentSender that you would like to change.
+         * @return This builder.
+         */
+        @NonNull
+        public Builder setFlagsMask(int flagsMask) {
+            mFlagsMask = flagsMask;
+            return this;
+        }
+
+        /**
+         * Set the flag values for the {@link IntentSenderRequest}.
+         *
+         * @param flagsValues flagValues to go in the IntentSenderRequest. Desired values for any
+         *                  bits set in flagsMask
+         * @return This builder.
+         */
+        @NonNull
+        public Builder setFlagsValues(int flagsValues) {
+            mFlagsValues = flagsValues;
+            return this;
+        }
+
+        /**
+         * Build the IntentSenderRequest specified by this builder.
+         *
+         * @return the newly constructed IntentSenderRequest.
+         */
+        @NonNull
+        public IntentSenderRequest build() {
+            return new IntentSenderRequest(mIntentSender, mFillInIntent, mFlagsMask, mFlagsValues);
+        }
+    }
+}
diff --git a/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.java b/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.java
index 55042f3..9f72161 100644
--- a/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.java
+++ b/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.java
@@ -25,6 +25,7 @@
 import android.content.ClipData;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentSender;
 import android.content.pm.PackageManager;
 import android.graphics.Bitmap;
 import android.net.Uri;
@@ -35,6 +36,7 @@
 
 import androidx.activity.result.ActivityResult;
 import androidx.activity.result.ActivityResultCaller;
+import androidx.activity.result.IntentSenderRequest;
 import androidx.annotation.CallSuper;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -44,6 +46,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 
@@ -57,7 +60,7 @@
      * An {@link ActivityResultContract} that doesn't do any type conversion, taking raw
      * {@link Intent} as an input and {@link ActivityResult} as an output.
      *
-     * Can be used with {@link ActivityResultCaller#prepareCall} to avoid
+     * Can be used with {@link ActivityResultCaller#registerForActivityResult} to avoid
      * having to manage request codes when calling an activity API for which a type-safe contract is
      * not available.
      */
@@ -79,6 +82,55 @@
     }
 
     /**
+     * An {@link ActivityResultContract} that calls
+     * {@link Activity#startIntentSender(IntentSender, Intent, int, int, int)}.
+     *
+     * This {@link ActivityResultContract} takes an {@link IntentSenderRequest}, which must be
+     * constructed using an {@link IntentSenderRequest.Builder}.
+     *
+     * If the call to
+     * {@link Activity#startIntentSenderForResult(IntentSender, int, Intent, int, int, int)}
+     * throws an {@link android.content.IntentSender.SendIntentException} the
+     * {@link androidx.activity.result.ActivityResultCallback} will receive an
+     * {@link ActivityResult} with an {@link Activity#RESULT_CANCELED} {@code resultCode} and
+     * whose intent has the {@link Intent#getAction() action} of
+     * {@link #ACTION_INTENT_SENDER_REQUEST} and an extra {@link #EXTRA_SEND_INTENT_EXCEPTION}
+     * that contains the thrown exception.
+     */
+    public static final class StartIntentSenderForResult
+            extends ActivityResultContract<IntentSenderRequest, ActivityResult> {
+
+        /**
+         * An {@link Intent} action for making a request via the
+         * {@link Activity#startIntentSenderForResult} API.
+         */
+        public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result"
+                + ".contract.action.INTENT_SENDER_REQUEST";
+
+        /**
+         * Key for the extra containing the {@link android.content.IntentSender.SendIntentException}
+         * if the call to
+         * {@link Activity#startIntentSenderForResult(IntentSender, int, Intent, int, int, int)}
+         * fails.
+         */
+        public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result"
+                + ".contract.extra.SEND_INTENT_EXCEPTION";
+
+        @NonNull
+        @Override
+        public Intent createIntent(@NonNull Context context, @NonNull IntentSenderRequest input) {
+            return new Intent(ACTION_INTENT_SENDER_REQUEST);
+        }
+
+        @NonNull
+        @Override
+        public ActivityResult parseResult(
+                int resultCode, @Nullable Intent intent) {
+            return new ActivityResult(resultCode, intent);
+        }
+    }
+
+    /**
      * An {@link ActivityResultContract} to {@link Activity#requestPermissions request permissions}
      */
     public static final class RequestPermissions
@@ -413,14 +465,22 @@
 
         @NonNull
         static List<Uri> getClipDataUris(@NonNull Intent intent) {
-            ClipData clipData = intent.getClipData();
-            if (clipData == null) return Collections.emptyList();
-            ArrayList<Uri> result = new ArrayList<>();
-            int size = clipData.getItemCount();
-            for (int i = 0; i < size; i++) {
-                result.add(clipData.getItemAt(i).getUri());
+            HashSet<Uri> resultSet = new HashSet<>();
+            if (intent.getData() != null) {
+                resultSet.add(intent.getData());
             }
-            return result;
+            ClipData clipData = intent.getClipData();
+            if (clipData == null && resultSet.isEmpty()) {
+                return Collections.emptyList();
+            } else if (clipData != null) {
+                for (int i = 0; i < clipData.getItemCount(); i++) {
+                    Uri uri = clipData.getItemAt(i).getUri();
+                    if (uri != null) {
+                        resultSet.add(uri);
+                    }
+                }
+            }
+            return new ArrayList<>(resultSet);
         }
     }
 
@@ -496,8 +556,7 @@
         @Nullable
         @Override
         public final List<Uri> parseResult(int resultCode, @Nullable Intent intent) {
-            if (resultCode != Activity.RESULT_OK) return null;
-            if (intent == null) return null;
+            if (resultCode != Activity.RESULT_OK || intent == null) return null;
             return GetContents.getClipDataUris(intent);
         }
     }
diff --git a/activity/integration-tests/testapp/src/main/java/androidx/activity/integration/testapp/MainActivity.kt b/activity/integration-tests/testapp/src/main/java/androidx/activity/integration/testapp/MainActivity.kt
index bb630f8..ec43b2e 100644
--- a/activity/integration-tests/testapp/src/main/java/androidx/activity/integration/testapp/MainActivity.kt
+++ b/activity/integration-tests/testapp/src/main/java/androidx/activity/integration/testapp/MainActivity.kt
@@ -31,25 +31,35 @@
 import android.widget.Toast
 import androidx.activity.ComponentActivity
 import androidx.activity.invoke
-import androidx.activity.prepareCall
+import androidx.activity.registerForActivityResult
+import androidx.activity.result.contract.ActivityResultContracts.OpenDocuments
 import androidx.activity.result.contract.ActivityResultContracts.GetContent
 import androidx.activity.result.contract.ActivityResultContracts.RequestPermission
 import androidx.activity.result.contract.ActivityResultContracts.TakePicturePreview
 
 class MainActivity : ComponentActivity() {
 
-    val requestLocation = prepareCall(RequestPermission(), ACCESS_FINE_LOCATION) { isGranted ->
+    val requestLocation = registerForActivityResult(
+        RequestPermission(), ACCESS_FINE_LOCATION) { isGranted ->
         toast("Location granted: $isGranted")
     }
 
-    val takePicture = prepareCall(TakePicturePreview()) { bitmap ->
+    val takePicture = registerForActivityResult(TakePicturePreview()) { bitmap ->
         toast("Got picture: $bitmap")
     }
 
-    val getContent = prepareCall(GetContent()) { uri ->
+    val getContent = registerForActivityResult(GetContent()) { uri ->
         toast("Got image: $uri")
     }
 
+    val openDocuments = registerForActivityResult(OpenDocuments()) { uris ->
+        var docs = ""
+        uris.forEach {
+            docs += "uri: $it \n"
+        }
+        toast("Got documents: $docs")
+    }
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
@@ -66,6 +76,9 @@
                 button("Pick an image") {
                     getContent("image/*")
                 }
+                button("Open documents") {
+                    openDocuments(arrayOf("*/*"))
+                }
             }
         }
     }
diff --git a/appcompat/appcompat/build.gradle b/appcompat/appcompat/build.gradle
index a6f32e2..3f30b8c 100644
--- a/appcompat/appcompat/build.gradle
+++ b/appcompat/appcompat/build.gradle
@@ -12,7 +12,7 @@
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
 
-    api(project(":core:core"))
+    api("androidx.core:core:1.3.0-beta01")
     implementation("androidx.collection:collection:1.0.0")
     api("androidx.cursoradapter:cursoradapter:1.0.0")
     api("androidx.fragment:fragment:1.1.0")
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/AppSearchManagerTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/AppSearchManagerTest.java
index bbb669e..d50fd6f 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/AppSearchManagerTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/AppSearchManagerTest.java
@@ -21,7 +21,6 @@
 import androidx.appsearch.app.AppSearchSchema.PropertyConfig;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.util.concurrent.ListenableFuture;
 
 import junit.framework.AssertionFailedError;
 
@@ -31,13 +30,14 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.Future;
 
 public class AppSearchManagerTest {
     private final AppSearchManager mAppSearch = new AppSearchManager();
 
     @After
     public void tearDown() throws Exception {
-        ListenableFuture<AppSearchResult<Void>> future = mAppSearch.deleteAll();
+        Future<AppSearchResult<Void>> future = mAppSearch.deleteAll();
         future.get();
     }
 
@@ -73,7 +73,7 @@
                 .setBody("This is the body of the testPut email")
                 .build();
 
-        ListenableFuture<AppSearchBatchResult<String, Void>> future =
+        Future<AppSearchBatchResult<String, Void>> future =
                 mAppSearch.putDocuments(ImmutableList.of(email));
         checkIsSuccess(future);
         AppSearchBatchResult<String, Void> result = future.get();
@@ -193,6 +193,13 @@
         assertThat(getResult.getFailures().get("uri1").getResultCode())
                 .isEqualTo(AppSearchResult.RESULT_NOT_FOUND);
         assertThat(getResult.getSuccesses().get("uri2")).isEqualTo(email2);
+
+        // Test if we delete a nonexistent URI.
+        AppSearchBatchResult<String, Void> deleteResult =
+                mAppSearch.delete(ImmutableList.of("uri1")).get();
+        assertThat(deleteResult.getFailures()).containsExactly("uri1",
+                AppSearchResult.newFailedResult(
+                        AppSearchResult.RESULT_NOT_FOUND, /*errorMessage=*/ null));
     }
 
     @Test
@@ -238,7 +245,7 @@
     }
 
     private List<AppSearchDocument> doGet(String... uris) throws Exception {
-        ListenableFuture<AppSearchBatchResult<String, AppSearchDocument>> future =
+        Future<AppSearchBatchResult<String, AppSearchDocument>> future =
                 mAppSearch.getDocuments(Arrays.asList(uris));
         checkIsSuccess(future);
         AppSearchBatchResult<String, AppSearchDocument> result = future.get();
@@ -267,7 +274,7 @@
         return documents;
     }
 
-    private <T> void checkIsSuccess(ListenableFuture<T> future) throws Exception {
+    private <T> void checkIsSuccess(Future<T> future) throws Exception {
         T futureGet = future.get();
         if (futureGet instanceof AppSearchBatchResult) {
             AppSearchBatchResult<?, ?> result = (AppSearchBatchResult) futureGet;
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchManager.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchManager.java
index 66ceccd..e3a4052 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchManager.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchManager.java
@@ -22,18 +22,20 @@
 import androidx.annotation.RestrictTo;
 import androidx.appsearch.exceptions.AppSearchException;
 import androidx.appsearch.impl.AppSearchImpl;
-import androidx.concurrent.futures.ResolvableFuture;
 
 import com.google.android.icing.proto.DocumentProto;
 import com.google.android.icing.proto.SchemaProto;
 import com.google.android.icing.proto.SearchResultProto;
 import com.google.android.icing.proto.SearchSpecProto;
 import com.google.android.icing.proto.StatusProto;
-import com.google.common.util.concurrent.ListenableFuture;
 
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
 
 /**
  * This class provides access to the centralized AppSearch index maintained by the system.
@@ -48,7 +50,8 @@
 public class AppSearchManager {
 
     private final AppSearchImpl mAppSearchImpl = new AppSearchImpl();
-
+    private final ExecutorService mQueryExecutor = Executors.newCachedThreadPool();
+    private final ExecutorService mMutateExecutor = Executors.newFixedThreadPool(1);
     /**
      * Sets the schema being used by documents provided to the #putDocuments method.
      *
@@ -97,7 +100,7 @@
      */
     // TODO(b/143789408): Linkify #putDocuments after that API is made public
     @NonNull
-    public ListenableFuture<AppSearchResult<Void>> setSchema(@NonNull AppSearchSchema... schemas) {
+    public Future<AppSearchResult<Void>> setSchema(@NonNull AppSearchSchema... schemas) {
         return setSchema(Arrays.asList(schemas), /*forceOverride=*/false);
     }
 
@@ -118,21 +121,22 @@
      * @return @return a Future representing the pending result of performing this operation.
      */
     @NonNull
-    public ListenableFuture<AppSearchResult<Void>> setSchema(
+    public Future<AppSearchResult<Void>> setSchema(
             @NonNull List<AppSearchSchema> schemas, boolean forceOverride) {
         // Prepare the merged schema for transmission.
-        ResolvableFuture<AppSearchResult<Void>> future = ResolvableFuture.create();
-        SchemaProto.Builder schemaProtoBuilder = SchemaProto.newBuilder();
-        for (AppSearchSchema schema : schemas) {
-            schemaProtoBuilder.addTypes(schema.getProto());
-        }
-        try {
-            mAppSearchImpl.setSchema(schemaProtoBuilder.build(), forceOverride);
-            future.set(AppSearchResult.newSuccessfulResult(/*value=*/ null));
-        } catch (Throwable t) {
-            future.set(throwableToFailedResult(t));
-        }
-        return future;
+        Callable<AppSearchResult<Void>> callableTask = () -> {
+            SchemaProto.Builder schemaProtoBuilder = SchemaProto.newBuilder();
+            for (AppSearchSchema schema : schemas) {
+                schemaProtoBuilder.addTypes(schema.getProto());
+            }
+            try {
+                mAppSearchImpl.setSchema(schemaProtoBuilder.build(), forceOverride);
+                return AppSearchResult.newSuccessfulResult(/*value=*/ null);
+            } catch (Throwable t) {
+                return throwableToFailedResult(t);
+            }
+        };
+        return mMutateExecutor.submit(callableTask);
     }
 
     /**
@@ -145,30 +149,31 @@
      * schema type previously registered via the {@link #setSchema} method.
      *
      * @param documents {@link AppSearchDocument}s that need to be indexed.
-     * @return A {@link ListenableFuture}&lt;{@link AppSearchBatchResult}&lt;{@link String},
+     * @return A {@link Future}&lt;{@link AppSearchBatchResult}&lt;{@link String},
      *     {@code Void}&gt;&gt;. Where mapping the document URIs to {@link Void} if they were
      *     successfully indexed, or a {@link Throwable} describing the failure if they could not
      *     be indexed.
      */
     @NonNull
-    public ListenableFuture<AppSearchBatchResult<String, Void>> putDocuments(
+    public Future<AppSearchBatchResult<String, Void>> putDocuments(
             @NonNull List<AppSearchDocument> documents) {
         // TODO(b/146386470): Transmit these documents as a RemoteStream instead of sending them in
         // one big list.
-        ResolvableFuture<AppSearchBatchResult<String, Void>> future = ResolvableFuture.create();
-        AppSearchBatchResult.Builder<String, Void> resultBuilder =
-                new AppSearchBatchResult.Builder<>();
-        for (int i = 0; i < documents.size(); i++) {
-            AppSearchDocument document = documents.get(i);
-            try {
-                mAppSearchImpl.putDocument(document.getProto());
-                resultBuilder.setSuccess(document.getUri(), /*value=*/ null);
-            } catch (Throwable t) {
-                resultBuilder.setResult(document.getUri(), throwableToFailedResult(t));
+        Callable<AppSearchBatchResult<String, Void>> callableTask = () -> {
+            AppSearchBatchResult.Builder<String, Void> resultBuilder =
+                    new AppSearchBatchResult.Builder<>();
+            for (int i = 0; i < documents.size(); i++) {
+                AppSearchDocument document = documents.get(i);
+                try {
+                    mAppSearchImpl.putDocument(document.getProto());
+                    resultBuilder.setSuccess(document.getUri(), /*value=*/ null);
+                } catch (Throwable t) {
+                    resultBuilder.setResult(document.getUri(), throwableToFailedResult(t));
+                }
             }
-        }
-        future.set(resultBuilder.build());
-        return future;
+            return resultBuilder.build();
+        };
+        return mMutateExecutor.submit(callableTask);
     }
 
     /**
@@ -178,50 +183,49 @@
      * {@code AppSearch#getDocuments()} API provided by JetPack.
      *
      * @param uris URIs of the documents to look up.
-     * @return A {@link ListenableFuture}&lt;{@link AppSearchBatchResult}&lt;{@link String},
+     * @return A {@link Future}&lt;{@link AppSearchBatchResult}&lt;{@link String},
      *     {@link AppSearchDocument}&gt;&gt;.
-     *     If the call fails to start, {@link ResolvableFuture} will be completed exceptionally.
-     *     Otherwise, {@link ResolvableFuture} will be completed with an
+     *     If the call fails to start, {@link Future} will be completed exceptionally.
+     *     Otherwise, {@link Future} will be completed with an
      *     {@link AppSearchBatchResult}&lt;{@link String}, {@link AppSearchDocument}&gt;
      *     mapping the document URIs to
      *     {@link AppSearchDocument} values if they were successfully retrieved, a {@code null}
-     *     failure if they were not found, or a {@link Throwable} failure describing the problem if
-     *     an error occurred.
+     *     failure if they were not found, or a {@link Throwable} failure describing the problem
+     *     if an error occurred.
      */
     @NonNull
-    public ListenableFuture<AppSearchBatchResult<String, AppSearchDocument>> getDocuments(
+    public Future<AppSearchBatchResult<String, AppSearchDocument>> getDocuments(
             @NonNull List<String> uris) {
         // TODO(b/146386470): Transmit the result documents as a RemoteStream instead of sending
         //     them in one big list.
-        ResolvableFuture<AppSearchBatchResult<String, AppSearchDocument>> future =
-                 ResolvableFuture.create();
-        AppSearchBatchResult.Builder<String, AppSearchDocument> resultBuilder =
-                new AppSearchBatchResult.Builder<>();
-        for (int i = 0; i < uris.size(); i++) {
-            String uri = uris.get(i);
-            try {
-                DocumentProto documentProto = mAppSearchImpl.getDocument(uri);
-                if (documentProto == null) {
-                    resultBuilder.setFailure(
-                            uri, AppSearchResult.RESULT_NOT_FOUND, /*errorMessage=*/ null);
-                } else {
-                    AppSearchDocument document;
-                    try {
-                        document = new AppSearchDocument(documentProto);
-                        resultBuilder.setSuccess(uri, document);
-                    } catch (Throwable t) {
-                        // These documents went through validation, so how could this fail? We
-                        // must have done something wrong.
+        Callable<AppSearchBatchResult<String, AppSearchDocument>> callableTask = () -> {
+            AppSearchBatchResult.Builder<String, AppSearchDocument> resultBuilder =
+                    new AppSearchBatchResult.Builder<>();
+            for (int i = 0; i < uris.size(); i++) {
+                String uri = uris.get(i);
+                try {
+                    DocumentProto documentProto = mAppSearchImpl.getDocument(uri);
+                    if (documentProto == null) {
                         resultBuilder.setFailure(
-                                uri, AppSearchResult.RESULT_INTERNAL_ERROR, t.getMessage());
+                                uri, AppSearchResult.RESULT_NOT_FOUND, /*errorMessage=*/ null);
+                    } else {
+                        try {
+                            AppSearchDocument document = new AppSearchDocument(documentProto);
+                            resultBuilder.setSuccess(uri, document);
+                        } catch (Throwable t) {
+                            // These documents went through validation, so how could this fail? We
+                            // must have done something wrong.
+                            resultBuilder.setFailure(
+                                    uri, AppSearchResult.RESULT_INTERNAL_ERROR, t.getMessage());
+                        }
                     }
+                } catch (Throwable t) {
+                    resultBuilder.setResult(uri, throwableToFailedResult(t));
                 }
-            } catch (Throwable t) {
-                resultBuilder.setResult(uri, throwableToFailedResult(t));
             }
-        }
-        future.set(resultBuilder.build());
-        return future;
+            return resultBuilder.build();
+        };
+        return mQueryExecutor.submit(callableTask);
     }
 
     /**
@@ -266,39 +270,40 @@
      *
      * @param queryExpression Query String to search.
      * @param searchSpec Spec for setting filters, raw query etc.
-     * @return  A {@link ListenableFuture}&lt;{@link AppSearchBatchResult}&lt;{@link String},
+     * @return  A {@link Future}&lt;{@link AppSearchBatchResult}&lt;{@link String},
      *     {@link SearchResults}&gt;&gt;.
-     *     If the call fails to start, {@link ResolvableFuture} will be completed exceptionally.
-     *     Otherwise, {@link ResolvableFuture} will be completed with an
+     *     If the call fails to start, {@link Future} will be completed exceptionally.
+     *     Otherwise, {@link Future} will be completed with an
      *     {@link AppSearchBatchResult}&lt;{@link String}, {@link SearchResults}&gt;
      *     where the keys are document URIs, and the values are serialized Document protos.
      */
     @NonNull
-    public ListenableFuture<AppSearchResult<SearchResults>> query(
+    public Future<AppSearchResult<SearchResults>> query(
             @NonNull String queryExpression,
             @NonNull SearchSpec searchSpec) {
         // TODO(b/146386470): Transmit the result documents as a RemoteStream instead of sending
         //     them in one big list.
-        ResolvableFuture<AppSearchResult<SearchResults>> future = ResolvableFuture.create();
-        try {
-            SearchSpecProto searchSpecProto = searchSpec.getSearchSpecProto();
-            searchSpecProto = searchSpecProto.toBuilder().setQuery(queryExpression).build();
-            SearchResultProto searchResultProto = mAppSearchImpl.query(searchSpecProto,
-                    searchSpec.getResultSpecProto(), searchSpec.getScoringSpecProto());
-            // TODO(sidchhabra): Translate SearchResultProto errors into error codes. This might
-            //     better be done in AppSearchImpl by throwing an AppSearchException.
-            if (searchResultProto.getStatus().getCode() != StatusProto.Code.OK) {
-                future.set(AppSearchResult.newFailedResult(
-                                AppSearchResult.RESULT_INTERNAL_ERROR,
-                                searchResultProto.getStatus().getMessage()));
-            } else {
-                future.set(
-                        AppSearchResult.newSuccessfulResult(new SearchResults(searchResultProto)));
+        Callable<AppSearchResult<SearchResults>> callableTask = () -> {
+            try {
+                SearchSpecProto searchSpecProto = searchSpec.getSearchSpecProto();
+                searchSpecProto = searchSpecProto.toBuilder().setQuery(queryExpression).build();
+                SearchResultProto searchResultProto = mAppSearchImpl.query(searchSpecProto,
+                        searchSpec.getResultSpecProto(), searchSpec.getScoringSpecProto());
+                // TODO(sidchhabra): Translate SearchResultProto errors into error codes. This might
+                //     better be done in AppSearchImpl by throwing an AppSearchException.
+                if (searchResultProto.getStatus().getCode() != StatusProto.Code.OK) {
+                    return AppSearchResult.newFailedResult(
+                            AppSearchResult.RESULT_INTERNAL_ERROR,
+                            searchResultProto.getStatus().getMessage());
+                } else {
+                    return AppSearchResult.newSuccessfulResult(
+                            new SearchResults(searchResultProto));
+                }
+            } catch (Throwable t) {
+                return throwableToFailedResult(t);
             }
-        } catch (Throwable t) {
-            future.set(throwableToFailedResult(t));
-        }
-        return future;
+        };
+        return mQueryExecutor.submit(callableTask);
     }
 
     /**
@@ -308,33 +313,34 @@
      * provided by JetPack.
      *
      * @param uris URIs of the documents to delete
-     * @return A {@link ListenableFuture}&lt;{@link AppSearchBatchResult}&lt;{@link String},
-     *     {@link Void}&gt;&gt;. If the call fails to start, {@link ResolvableFuture} will be
-     *     completed exceptionally.Otherwise, {@link ResolvableFuture} will be completed with an
+     * @return A {@link Future}&lt;{@link AppSearchBatchResult}&lt;{@link String},
+     *     {@link Void}&gt;&gt;. If the call fails to start, {@link Future} will be
+     *     completed exceptionally.Otherwise, {@link Future} will be completed with an
      *     {@link AppSearchBatchResult}&lt;{@link String}, {@link Void}&gt;
      *     where the keys are schema types. If a schema type doesn't exist, it will be reported as a
      *     failure where the {@code throwable} is {@code null}..
      */
     @NonNull
-    public ListenableFuture<AppSearchBatchResult<String, Void>> delete(@NonNull List<String> uris) {
-        ResolvableFuture<AppSearchBatchResult<String, Void>> future = ResolvableFuture.create();
-        AppSearchBatchResult.Builder<String, Void> resultBuilder =
-                new AppSearchBatchResult.Builder<>();
-        for (int i = 0; i < uris.size(); i++) {
-            String uri = uris.get(i);
-            try {
-                if (!mAppSearchImpl.delete(uri)) {
-                    resultBuilder.setFailure(
-                            uri, AppSearchResult.RESULT_NOT_FOUND, /*errorMessage=*/ null);
-                } else {
-                    resultBuilder.setSuccess(uri, /*value= */null);
+    public Future<AppSearchBatchResult<String, Void>> delete(@NonNull List<String> uris) {
+        Callable<AppSearchBatchResult<String, Void>> callableTask = () -> {
+            AppSearchBatchResult.Builder<String, Void> resultBuilder =
+                    new AppSearchBatchResult.Builder<>();
+            for (int i = 0; i < uris.size(); i++) {
+                String uri = uris.get(i);
+                try {
+                    if (!mAppSearchImpl.delete(uri)) {
+                        resultBuilder.setFailure(
+                                uri, AppSearchResult.RESULT_NOT_FOUND, /*errorMessage=*/ null);
+                    } else {
+                        resultBuilder.setSuccess(uri, /*value= */null);
+                    }
+                } catch (Throwable t) {
+                    resultBuilder.setResult(uri, throwableToFailedResult(t));
                 }
-            } catch (Throwable t) {
-                resultBuilder.setResult(uri, throwableToFailedResult(t));
             }
-        }
-        future.set(resultBuilder.build());
-        return future;
+            return resultBuilder.build();
+        };
+        return mMutateExecutor.submit(callableTask);
     }
 
     /**
@@ -344,55 +350,57 @@
      * {@code AppSearch#deleteByType()} API provided by JetPack.
      *
      * @param schemaTypes Schema types whose documents to delete.
-     * @return A {@link ListenableFuture}&lt;{@link AppSearchBatchResult}&lt;{@link String},
+     * @return A {@link Future}&lt;{@link AppSearchBatchResult}&lt;{@link String},
      *     {@link Void}&gt;&gt;.
-     *     If the call fails to start, {@link ResolvableFuture} will be completed exceptionally.
-     *     Otherwise, {@link ResolvableFuture} will be completed with an
+     *     If the call fails to start, {@link Future} will be completed exceptionally.
+     *     Otherwise, {@link Future} will be completed with an
      *     {@link AppSearchBatchResult}&lt;{@link String}, {@link Void}&gt;
      *     where the keys are schema types. If a schema type doesn't exist, it will be reported as a
      *     failure where the {@code throwable} is {@code null}.
      */
     @NonNull
-    public ListenableFuture<AppSearchBatchResult<String, Void>> deleteByTypes(
+    public Future<AppSearchBatchResult<String, Void>> deleteByTypes(
             @NonNull List<String> schemaTypes) {
-        ResolvableFuture<AppSearchBatchResult<String, Void>> future = ResolvableFuture.create();
-        AppSearchBatchResult.Builder<String, Void> resultBuilder =
-                new AppSearchBatchResult.Builder<>();
-        for (int i = 0; i < schemaTypes.size(); i++) {
-            String schemaType = schemaTypes.get(i);
-            try {
-                if (!mAppSearchImpl.deleteByType(schemaType)) {
-                    resultBuilder.setFailure(
-                            schemaType,
-                            AppSearchResult.RESULT_NOT_FOUND,
-                            /*errorMessage=*/ null);
-                } else {
-                    resultBuilder.setSuccess(schemaType, /*value=*/ null);
+        Callable<AppSearchBatchResult<String, Void>> callableTask = () -> {
+            AppSearchBatchResult.Builder<String, Void> resultBuilder =
+                    new AppSearchBatchResult.Builder<>();
+            for (int i = 0; i < schemaTypes.size(); i++) {
+                String schemaType = schemaTypes.get(i);
+                try {
+                    if (!mAppSearchImpl.deleteByType(schemaType)) {
+                        resultBuilder.setFailure(
+                                schemaType,
+                                AppSearchResult.RESULT_NOT_FOUND,
+                                /*errorMessage=*/ null);
+                    } else {
+                        resultBuilder.setSuccess(schemaType, /*value=*/ null);
+                    }
+                } catch (Throwable t) {
+                    resultBuilder.setResult(schemaType, throwableToFailedResult(t));
                 }
-            } catch (Throwable t) {
-                resultBuilder.setResult(schemaType, throwableToFailedResult(t));
             }
-        }
-        future.set(resultBuilder.build());
-        return future;
+            return resultBuilder.build();
+        };
+        return mMutateExecutor.submit(callableTask);
     }
 
     /**
      * Deletes all documents owned by the calling app.
      *
-     * @return A {@link ListenableFuture}&lt;{@link AppSearchResult}&lt;{@link Void}&gt;&gt;.
+     * @return A {@link Future}&lt;{@link AppSearchResult}&lt;{@link Void}&gt;&gt;.
      *     Will be completed with the result of the call.
      */
     @NonNull
-    public <ValueType> ListenableFuture<AppSearchResult<ValueType>> deleteAll() {
-        ResolvableFuture<AppSearchResult<ValueType>> future = ResolvableFuture.create();
-        try {
-            mAppSearchImpl.deleteAll();
-            future.set(AppSearchResult.newSuccessfulResult(null));
-        } catch (Throwable t) {
-            future.set(throwableToFailedResult(t));
-        }
-        return future;
+    public <ValueType> Future<AppSearchResult<ValueType>> deleteAll() {
+        Callable<AppSearchResult<ValueType>> callableTask = () -> {
+            try {
+                mAppSearchImpl.deleteAll();
+                return AppSearchResult.newSuccessfulResult(null);
+            } catch (Throwable t) {
+                return throwableToFailedResult(t);
+            }
+        };
+        return mMutateExecutor.submit(callableTask);
     }
 
     private <ValueType> AppSearchResult<ValueType> throwableToFailedResult(
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/impl/FakeIcing.java b/appsearch/appsearch/src/main/java/androidx/appsearch/impl/FakeIcing.java
index a8b259a..4d600cd 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/impl/FakeIcing.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/impl/FakeIcing.java
@@ -46,7 +46,8 @@
     private final SparseArray<DocumentProto> mDocStore = new SparseArray<>();
     /** Map of term to posting-list (the set of DocIds containing that term). */
     private final Map<String, Set<Integer>> mIndex = new ArrayMap<>();
-
+    /** Lock object for synchronized. */
+    private final Object mLock = new Object();
     /**
      * Inserts a document into the index.
      *
@@ -55,22 +56,24 @@
     public void put(@NonNull DocumentProto document) {
         String uri = document.getUri();
 
-        // Update mDocIdMap
-        Integer docId = mUriToDocIdMap.get(uri);
-        if (docId != null) {
-            // Delete the old doc
-            mDocStore.remove(docId);
+        synchronized (mLock) {
+            // Update mDocIdMap
+            Integer docId = mUriToDocIdMap.get(uri);
+            if (docId != null) {
+                // Delete the old doc
+                mDocStore.remove(docId);
+            }
+
+            // Allocate a new docId
+            docId = mNextDocId.getAndIncrement();
+            mUriToDocIdMap.put(uri, docId);
+
+            // Update mDocStore
+            mDocStore.put(docId, document);
+
+            // Update mIndex
+            indexDocument(docId, document);
         }
-
-        // Allocate a new docId
-        docId = mNextDocId.getAndIncrement();
-        mUriToDocIdMap.put(uri, docId);
-
-        // Update mDocStore
-        mDocStore.put(docId, document);
-
-        // Update mIndex
-        indexDocument(docId, document);
     }
 
     /**
@@ -81,11 +84,13 @@
      */
     @Nullable
     public DocumentProto get(@NonNull String uri) {
-        Integer docId = mUriToDocIdMap.get(uri);
-        if (docId == null) {
-            return null;
+        synchronized (mLock) {
+            Integer docId = mUriToDocIdMap.get(uri);
+            if (docId == null) {
+                return null;
+            }
+            return mDocStore.get(docId);
         }
-        return mDocStore.get(docId);
     }
 
     /**
@@ -104,25 +109,27 @@
         if (terms.length == 0) {
             return results.build();
         }
-        Set<Integer> docIds = mIndex.get(terms[0]);
-        if (docIds == null || docIds.isEmpty()) {
-            return results.build();
-        }
-        for (int i = 1; i < terms.length; i++) {
-            Set<Integer> termDocIds = mIndex.get(terms[i]);
-            if (termDocIds == null) {
+        synchronized (mLock) {
+            Set<Integer> docIds = mIndex.get(terms[0]);
+            if (docIds == null || docIds.isEmpty()) {
                 return results.build();
             }
-            docIds.retainAll(termDocIds);
-            if (docIds.isEmpty()) {
-                return results.build();
+            for (int i = 1; i < terms.length; i++) {
+                Set<Integer> termDocIds = mIndex.get(terms[i]);
+                if (termDocIds == null) {
+                    return results.build();
+                }
+                docIds.retainAll(termDocIds);
+                if (docIds.isEmpty()) {
+                    return results.build();
+                }
             }
-        }
-        for (int docId : docIds) {
-            DocumentProto document = mDocStore.get(docId);
-            if (document != null) {
-                results.addResults(
-                        SearchResultProto.ResultProto.newBuilder().setDocument(document));
+            for (int docId : docIds) {
+                DocumentProto document = mDocStore.get(docId);
+                if (document != null) {
+                    results.addResults(
+                            SearchResultProto.ResultProto.newBuilder().setDocument(document));
+                }
             }
         }
         return results.build();
@@ -136,34 +143,26 @@
      */
     public boolean delete(@NonNull String uri) {
         // Update mDocIdMap
-        Integer docId = mUriToDocIdMap.get(uri);
-        if (docId != null) {
-            // Delete the old doc
-            mDocStore.remove(docId);
-            mUriToDocIdMap.remove(uri);
-            return true;
+        synchronized (mLock) {
+            Integer docId = mUriToDocIdMap.get(uri);
+            if (docId != null) {
+                // Delete the old doc
+                mDocStore.remove(docId);
+                mUriToDocIdMap.remove(uri);
+                return true;
+            }
         }
         return false;
     }
 
-    /** Deletes all documents having the given namespace. */
-    public void deleteByNamespace(@NonNull String namespace) {
-        for (int i = 0; i < mDocStore.size(); i++) {
-            DocumentProto document = mDocStore.valueAt(i);
-            if (namespace.equals(document.getNamespace())) {
-                mDocStore.removeAt(i);
-                mUriToDocIdMap.remove(document.getUri());
-                i--;
-            }
-        }
-    }
-
     /** Deletes all document. */
     public void deleteAll() {
-        mDocStore.clear();
-        mUriToDocIdMap.clear();
-        mIndex.clear();
-        mNextDocId.set(0);
+        synchronized (mLock) {
+            mDocStore.clear();
+            mUriToDocIdMap.clear();
+            mIndex.clear();
+            mNextDocId.set(0);
+        }
     }
 
     /**
@@ -173,13 +172,15 @@
      */
     public boolean deleteByType(@NonNull String type) {
         boolean deletedAny = false;
-        for (int i = 0; i < mDocStore.size(); i++) {
-            DocumentProto document = mDocStore.valueAt(i);
-            if (type.equals(document.getSchema())) {
-                mDocStore.removeAt(i);
-                mUriToDocIdMap.remove(document.getUri());
-                i--;
-                deletedAny = true;
+        synchronized (mLock) {
+            for (int i = 0; i < mDocStore.size(); i++) {
+                DocumentProto document = mDocStore.valueAt(i);
+                if (type.equals(document.getSchema())) {
+                    mDocStore.removeAt(i);
+                    mUriToDocIdMap.remove(document.getUri());
+                    i--;
+                    deletedAny = true;
+                }
             }
         }
         return deletedAny;
@@ -210,12 +211,14 @@
     }
 
     private void indexTerm(int docId, String term) {
-        Set<Integer> postingList = mIndex.get(term);
-        if (postingList == null) {
-            postingList = new ArraySet<>();
-            mIndex.put(term, postingList);
+        synchronized (mLock) {
+            Set<Integer> postingList = mIndex.get(term);
+            if (postingList == null) {
+                postingList = new ArraySet<>();
+                mIndex.put(term, postingList);
+            }
+            postingList.add(docId);
         }
-        postingList.add(docId);
     }
 
     /** Strips out punctuation and converts to lowercase. */
diff --git a/build.gradle b/build.gradle
index 2ba5b07..caa680e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -30,6 +30,7 @@
         classpath build_libs.kotlin.gradle_plugin
         classpath build_libs.dokka_gradle
         classpath HILT_ANDROID_GRADLE_PLUGIN
+        classpath SHADOW_PLUGIN
     }
 }
 
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/AffectedModuleDetectorImplTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/AffectedModuleDetectorImplTest.kt
index 57ebafe..b4f688a 100644
--- a/buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/AffectedModuleDetectorImplTest.kt
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/AffectedModuleDetectorImplTest.kt
@@ -1054,6 +1054,96 @@
         ))
     }
 
+    @Test
+    fun projectSubset_changed() {
+        val detector = AffectedModuleDetectorImpl(
+            rootProject = root,
+            logger = logger,
+            ignoreUnknownProjects = false,
+            projectSubset = ProjectSubset.CHANGED_PROJECTS,
+            injectedGitClient = MockGitClient(
+                lastMergeSha = "foo",
+                changedFiles = listOf(convertToFilePath("p1", "foo.java"))
+            )
+        )
+        // Verify expectations on affected projects
+        MatcherAssert.assertThat(detector.affectedProjects, CoreMatchers.`is`(
+            setOf(p1, p11)
+        ))
+        // Test changed
+        MatcherAssert.assertThat(detector.getSubset(p1), CoreMatchers.`is`(
+            ProjectSubset.CHANGED_PROJECTS
+        ))
+        // Test dependent
+        MatcherAssert.assertThat(detector.getSubset(p3), CoreMatchers.`is`(
+            ProjectSubset.DEPENDENT_PROJECTS
+        ))
+        // Random unrelated project should return none
+        MatcherAssert.assertThat(detector.getSubset(p12), CoreMatchers.`is`(
+            ProjectSubset.NONE
+        ))
+    }
+
+    @Test
+    fun projectSubset_dependent() {
+        val detector = AffectedModuleDetectorImpl(
+            rootProject = root,
+            logger = logger,
+            ignoreUnknownProjects = false,
+            projectSubset = ProjectSubset.DEPENDENT_PROJECTS,
+            injectedGitClient = MockGitClient(
+                lastMergeSha = "foo",
+                changedFiles = listOf(convertToFilePath("p1", "foo.java"))
+            )
+        )
+        // Verify expectations on affected projects
+        MatcherAssert.assertThat(detector.affectedProjects, CoreMatchers.`is`(
+            setOf(p3, p4, p5, p11)
+        ))
+        // Test changed
+        MatcherAssert.assertThat(detector.getSubset(p1), CoreMatchers.`is`(
+            ProjectSubset.CHANGED_PROJECTS
+        ))
+        // Test dependent
+        MatcherAssert.assertThat(detector.getSubset(p3), CoreMatchers.`is`(
+            ProjectSubset.DEPENDENT_PROJECTS
+        ))
+        // Random unrelated project should return none
+        MatcherAssert.assertThat(detector.getSubset(p12), CoreMatchers.`is`(
+            ProjectSubset.NONE
+        ))
+    }
+
+    @Test
+    fun projectSubset_all() {
+        val detector = AffectedModuleDetectorImpl(
+            rootProject = root,
+            logger = logger,
+            ignoreUnknownProjects = false,
+            projectSubset = ProjectSubset.ALL_AFFECTED_PROJECTS,
+            injectedGitClient = MockGitClient(
+                lastMergeSha = "foo",
+                changedFiles = listOf(convertToFilePath("p1", "foo.java"))
+            )
+        )
+        // Verify expectations on affected projects
+        MatcherAssert.assertThat(detector.affectedProjects, CoreMatchers.`is`(
+            setOf(p1, p3, p4, p5, p11)
+        ))
+        // Test changed
+        MatcherAssert.assertThat(detector.getSubset(p1), CoreMatchers.`is`(
+            ProjectSubset.CHANGED_PROJECTS
+        ))
+        // Test dependent
+        MatcherAssert.assertThat(detector.getSubset(p3), CoreMatchers.`is`(
+            ProjectSubset.DEPENDENT_PROJECTS
+        ))
+        // Random unrelated project should return none
+        MatcherAssert.assertThat(detector.getSubset(p12), CoreMatchers.`is`(
+            ProjectSubset.NONE
+        ))
+    }
+
     // For both Linux/Windows
     fun convertToFilePath(vararg list: String): String {
         return list.toList().joinToString(File.separator)
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt
new file mode 100644
index 0000000..566bbd8
--- /dev/null
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt
@@ -0,0 +1,29 @@
+/*
+ * 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.build
+
+/**
+ * Setting this property makes Test tasks succeed even if there
+ * are some failing tests. Useful when running tests in CI where build
+ * passes test results as XML to test reporter.
+ */
+const val TEST_FAILURES_DO_NOT_FAIL_TEST_TASK = "androidx.ignoreTestFailures"
+
+/**
+ * Setting this property turns javac and kotlinc warnings into errors that fail the build.
+ */
+const val ALL_WARNINGS_AS_ERRORS = "androidx.allWarningsAsErrors"
\ No newline at end of file
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
index 667beb6..df4a38b 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
@@ -41,8 +41,8 @@
 import androidx.build.metalava.MetalavaTasks.configureJavaProjectForMetalava
 import androidx.build.metalava.UpdateApiTask
 import androidx.build.studio.StudioTask.Companion.registerStudioTask
-import androidx.build.uptodatedness.cacheEvenIfNoOutputs
 import androidx.build.uptodatedness.TaskUpToDateValidator
+import androidx.build.uptodatedness.cacheEvenIfNoOutputs
 import com.android.build.gradle.AppExtension
 import com.android.build.gradle.AppPlugin
 import com.android.build.gradle.LibraryExtension
@@ -54,7 +54,6 @@
 import org.gradle.api.Plugin
 import org.gradle.api.Project
 import org.gradle.api.Task
-import org.gradle.api.logging.configuration.ShowStacktrace
 import org.gradle.api.plugins.ExtraPropertiesExtension
 import org.gradle.api.plugins.JavaPlugin
 import org.gradle.api.plugins.JavaPluginConvention
@@ -239,7 +238,7 @@
                     it.destinationDirectory.set(project.getHostTestResultDirectory())
                     it.archiveFileName.set("${project.asFilenamePrefix()}_${task.name}.zip")
                 }
-                if (isRunningOnBuildServer()) {
+                if (project.hasProperty(TEST_FAILURES_DO_NOT_FAIL_TEST_TASK)) {
                     task.ignoreFailures = true
                 }
                 task.finalizedBy(zipTask)
@@ -265,9 +264,6 @@
         configureKtlintCheckFile()
         configureCheckInvalidSuppress()
 
-        if (isRunningOnBuildServer()) {
-            gradle.startParameter.showStacktrace = ShowStacktrace.ALWAYS
-        }
         val buildOnServerTask = tasks.create(BUILD_ON_SERVER_TASK, BuildOnServer::class.java)
         buildOnServerTask.dependsOn(
             tasks.register(
@@ -366,14 +362,6 @@
                 }
             }
         }
-        // If we are running buildOnServer, run all actions in buildOnServerDependentActions after
-        // the task graph has been resolved, before we are in the execution phase.
-        project.gradle.taskGraph.whenReady { taskExecutionGraph ->
-            // hasTask requires the task path, so we are looking for the root :buildOnServer task
-            if (taskExecutionGraph.hasTask(":$BUILD_ON_SERVER_TASK")) {
-                buildOnServerDependentActions.forEach { it() }
-            }
-        }
 
         registerStudioTask()
 
@@ -777,41 +765,16 @@
     return File(buildDir, "intermediates/public_res/release/public.txt")
 }
 
-/**
- * Delays execution of the given [action] until the task graph is ready, and we know whether
- * we are running buildOnServer
- */
-private fun Project.runIfPartOfBuildOnServer(action: () -> Unit) {
-    buildOnServerDependentActions.add(action)
-}
-
-/**
- * A list of configuration actions that will only be applied if buildOnServer is part of
- * the task graph, essentially when we are running ./gradlew buildOnServer
- */
-private val Project.buildOnServerDependentActions: MutableList<() -> Unit> get() {
-    val extraProperties = rootProject.extensions.extraProperties
-    if (!extraProperties.has(BUILD_ON_SERVER_DEPENDENT_ACTIONS)) {
-        extraProperties.set(BUILD_ON_SERVER_DEPENDENT_ACTIONS, mutableListOf<() -> Unit>())
-    }
-    @Suppress("UNCHECKED_CAST")
-    return extraProperties.get(BUILD_ON_SERVER_DEPENDENT_ACTIONS) as MutableList<() -> Unit>
-}
-
 private fun Project.configureCompilationWarnings(task: JavaCompile) {
-    if (!project.rootProject.hasProperty(USE_MAX_DEP_VERSIONS)) {
-        runIfPartOfBuildOnServer {
+    if (hasProperty(ALL_WARNINGS_AS_ERRORS)) {
             task.options.compilerArgs.add("-Werror")
             task.options.compilerArgs.add("-Xlint:unchecked")
-        }
     }
 }
 
 private fun Project.configureCompilationWarnings(task: KotlinCompile) {
-    if (!project.rootProject.hasProperty(USE_MAX_DEP_VERSIONS)) {
-        runIfPartOfBuildOnServer {
-            task.kotlinOptions.allWarningsAsErrors = true
-        }
+    if (hasProperty(ALL_WARNINGS_AS_ERRORS)) {
+        task.kotlinOptions.allWarningsAsErrors = true
     }
 }
 
diff --git a/buildSrc/src/main/kotlin/androidx/build/BuildServerConfiguration.kt b/buildSrc/src/main/kotlin/androidx/build/BuildServerConfiguration.kt
index f29f5a8..8a29918 100644
--- a/buildSrc/src/main/kotlin/androidx/build/BuildServerConfiguration.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/BuildServerConfiguration.kt
@@ -20,8 +20,6 @@
 import org.gradle.api.Project
 import java.io.File
 
-fun isRunningOnBuildServer() = System.getenv("DIST_DIR") != null
-
 /**
  * @return build id string for current build
  *
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt
index 57722a2..31dac2e 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt
@@ -56,6 +56,7 @@
     val FRAGMENT = LibraryGroup("androidx.fragment", LibraryVersions.FRAGMENT)
     val GRIDLAYOUT = LibraryGroup("androidx.gridlayout", LibraryVersions.GRIDLAYOUT)
     val HEIFWRITER = LibraryGroup("androidx.heifwriter", LibraryVersions.HEIFWRITER)
+    val HILT = LibraryGroup("androidx.hilt", null)
     val INSPECTION = LibraryGroup("androidx.inspection", LibraryVersions.INSPECTION)
     val INSPECTION_EXTENSIONS = LibraryGroup("androidx.inspection.extensions",
         LibraryVersions.SQLITE_INSPECTOR)
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
index 164a029..0323def 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -34,9 +34,9 @@
     val BENCHMARK = Version("1.1.0-alpha01")
     val BIOMETRIC = Version("1.1.0-alpha01")
     val BROWSER = Version("1.3.0-alpha03")
-    val CAMERA = Version("1.0.0-beta02")
-    val CAMERA_EXTENSIONS = Version("1.0.0-alpha09")
-    val CAMERA_VIEW = Version("1.0.0-alpha09")
+    val CAMERA = Version("1.0.0-beta04")
+    val CAMERA_EXTENSIONS = Version("1.0.0-alpha11")
+    val CAMERA_VIEW = Version("1.0.0-alpha011")
     val CAR = Version("1.0.0-alpha8")
     val CAR_MODERATOR = Version("1.0.0-alpha1")
     val CARDVIEW = Version("1.1.0-alpha01")
@@ -45,7 +45,7 @@
     val COMPOSE = Version("0.1.0-dev09")
     val CONTENTACCESS = Version("1.0.0-alpha01")
     val COORDINATORLAYOUT = Version("1.2.0-alpha01")
-    val CORE = Version("1.3.0-rc01")
+    val CORE = Version("1.4.0-alpha01")
     val CORE_ANIMATION = Version("1.0.0-alpha01")
     val CORE_ANIMATION_TESTING = Version("1.0.0-alpha01")
     val CORE_ROLE = Version("1.1.0-alpha01")
@@ -63,6 +63,7 @@
     val FUTURES = Version("1.1.0-beta01")
     val GRIDLAYOUT = Version("1.1.0-alpha01")
     val HEIFWRITER = Version("1.1.0-alpha01")
+    val HILT = Version("1.0.0-alpha01")
     val INSPECTION = Version("1.0.0-alpha01")
     val INTERPOLATOR = Version("1.1.0-alpha01")
     val JETIFIER = Version("1.0.0-beta09")
@@ -77,7 +78,7 @@
     val MEDIA2 = Version("1.1.0-alpha01")
     val MEDIAROUTER = Version("1.2.0-alpha01")
     val MESSAGEBROWSER_BROWSER = Version("1.0.0-alpha01")
-    val NAVIGATION = Version("2.3.0-alpha04")
+    val NAVIGATION = Version("2.3.0-alpha05")
     val PAGING = Version("3.0.0-alpha01")
     val PALETTE = Version("1.1.0-alpha01")
     val PRINT = Version("1.1.0-alpha01")
@@ -89,7 +90,7 @@
     val REMOTECALLBACK = Version("1.0.0-alpha02")
     val ROOM = Version("2.3.0-alpha01")
     val SAVEDSTATE = Version("1.1.0-alpha01")
-    val SECURITY = Version("1.0.0-beta01")
+    val SECURITY = Version("1.1.0-alpha01")
     val SECURITY_BIOMETRIC = Version("1.0.0-alpha01")
     val SECURITY_IDENTITY_CREDENTIAL = Version("1.0.0-alpha01")
     val SERIALIZATION = Version("1.0.0-alpha01")
diff --git a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
index 04046ca..a4c3b2e 100644
--- a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
@@ -84,9 +84,6 @@
     ignore(LibraryGroups.LIFECYCLE.group, "lifecycle-runtime-ktx-lint")
     prebuilts(LibraryGroups.LIFECYCLE, "lifecycle-extensions", "2.2.0") // No longer published
     ignore(LibraryGroups.LIFECYCLE.group, "lifecycle-runtime-testing")
-    ignore(LibraryGroups.LIFECYCLE.group, "lifecycle-viewmodel-hilt") // Not yet published
-    ignore(LibraryGroups.LIFECYCLE.group, "lifecycle-viewmodel-hilt-common") // Not yet published
-    ignore(LibraryGroups.LIFECYCLE.group, "lifecycle-viewmodel-hilt-compiler") // Not yet published
     prebuilts(LibraryGroups.LIFECYCLE, "2.3.0-alpha01")
     ignore(LibraryGroups.LOADER.group, "loader-ktx")
     prebuilts(LibraryGroups.LOADER, "1.1.0")
diff --git a/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt b/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
index f48355d..cfc66ab 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
@@ -87,6 +87,8 @@
 
 const val ROBOLECTRIC = "org.robolectric:robolectric:4.3.1"
 
+const val SHADOW_PLUGIN = "com.github.jengelman.gradle.plugins:shadow:5.2.0"
+
 const val PROTOBUF = "com.google.protobuf:protobuf-java:3.4.0"
 
 const val FLOGGER = "com.google.flogger:flogger:0.4"
diff --git a/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt b/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
index b9b764a..de1bfc5 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
@@ -23,14 +23,13 @@
 import androidx.build.gitclient.GitClient
 import androidx.build.gitclient.GitClientImpl
 import androidx.build.gradle.isRoot
-import androidx.build.isRunningOnBuildServer
-import java.io.File
 import org.gradle.BuildAdapter
 import org.gradle.api.GradleException
 import org.gradle.api.Project
 import org.gradle.api.Task
 import org.gradle.api.invocation.Gradle
 import org.gradle.api.logging.Logger
+import java.io.File
 
 /**
  * The subsets we allow the projects to be partitioned into.
@@ -49,8 +48,10 @@
  *
  *  ALL_AFFECTED_PROJECTS -- The union of CHANGED_PROJECTS and DEPENDENT_PROJECTS,
  *      which encompasses all projects that could possibly break due to the changes.
+ *
+ *  NONE -- A status to return for a project when it is not supposed to be built.
  */
-enum class ProjectSubset { DEPENDENT_PROJECTS, CHANGED_PROJECTS, ALL_AFFECTED_PROJECTS }
+enum class ProjectSubset { DEPENDENT_PROJECTS, CHANGED_PROJECTS, ALL_AFFECTED_PROJECTS, NONE }
 
 /**
  * A utility class that can discover which files are changed based on git history.
@@ -61,7 +62,7 @@
  * Passing [DEPENDENT_PROJECTS_ARG] will result in only DEPENDENT_PROJECTS being returned (see enum)
  * Passing [CHANGED_PROJECTS_ARG] will behave likewise.
  *
- * If neither of those are passed, [ALL_AFFECTED_PROJECTS] is returned.
+ * If neither of those are passed, ALL_AFFECTED_PROJECTS is returned.
  *
  * Currently, it checks git logs to find last merge CL to discover where the anchor CL is.
  *
@@ -76,6 +77,12 @@
      */
     abstract fun shouldInclude(project: Project): Boolean
 
+    /**
+     * Returns the set that the project belongs to. The set is one of the ProjectSubset above.
+     * This is used by the test config generator.
+     */
+    abstract fun getSubset(project: Project): ProjectSubset
+
     companion object {
         private const val ROOT_PROP_NAME = "affectedModuleDetector"
         private const val LOG_FILE_NAME = "affected_module_detector_log.txt"
@@ -91,8 +98,7 @@
                     -> ProjectSubset.CHANGED_PROJECTS
                 else -> ProjectSubset.ALL_AFFECTED_PROJECTS
             }
-            val inBuildServer = isRunningOnBuildServer()
-            if (!enabled && !inBuildServer) {
+            if (!enabled) {
                 setInstance(rootProject, AcceptAll())
                 return
             }
@@ -104,7 +110,7 @@
                     println("wrote dependency log to ${outputFile.absolutePath}")
                 }
             }
-            logger.info("setup: enabled: $enabled, inBuildServer: $inBuildServer")
+            logger.info("setup: enabled: $enabled")
             gradle.addBuildListener(object : BuildAdapter() {
                 override fun projectsEvaluated(gradle: Gradle?) {
                     logger.lifecycle("projects evaluated")
@@ -156,11 +162,17 @@
          */
         @Throws(GradleException::class)
         @JvmStatic
-        fun configureTaskGuard(task: Task) {
+        internal fun configureTaskGuard(task: Task) {
             task.onlyIf {
                 getOrThrow(task.project).shouldInclude(task.project)
             }
         }
+
+        @Throws(GradleException::class)
+        @JvmStatic
+        internal fun getProjectSubset(project: Project): ProjectSubset {
+            return getOrThrow(project).getSubset(project)
+        }
     }
 }
 
@@ -173,9 +185,14 @@
 ) : AffectedModuleDetector() {
     override fun shouldInclude(project: Project): Boolean {
         val wrappedResult = wrapped?.shouldInclude(project)
-        logger?.info("[AcceptAll] wrapper returned $wrappedResult but i'll return true")
+        logger?.info("[AcceptAll] wrapper returned $wrappedResult but I'll return true")
         return true
     }
+    override fun getSubset(project: Project): ProjectSubset {
+        val wrappedResult = wrapped?.getSubset(project)
+        logger?.info("[AcceptAll] wrapper returned $wrappedResult but I'll return CHANGED_PROJECTS")
+        return ProjectSubset.CHANGED_PROJECTS
+    }
 }
 
 /**
@@ -211,15 +228,95 @@
     }
 
     val affectedProjects by lazy {
-        findLocallyAffectedProjects()
+        findAffectedProjects()
+    }
+
+    private val changedProjects by lazy {
+        findChangedProjects()
+    }
+
+    private val dependentProjects by lazy {
+        findDependentProjects()
+    }
+
+    private var unknownFiles: MutableSet<String> = mutableSetOf()
+
+    private val cobuiltTestProjects by lazy {
+        lookupProjectSetsFromPaths(cobuiltTestPaths)
+    }
+
+    private val alwaysBuild by lazy {
+        ALWAYS_BUILD.map { path -> rootProject.project(path) }
     }
 
     override fun shouldInclude(project: Project): Boolean {
         return (project.isRoot || affectedProjects.contains(project)).also {
-            logger?.info("checking whether I should include ${project.path} and my answer is $it")
+            logger?.info(
+                "checking whether I should include ${project.path} and my answer is $it"
+            )
         }
     }
 
+    override fun getSubset(project: Project): ProjectSubset {
+        return when {
+            changedProjects.contains(project) -> {
+                ProjectSubset.CHANGED_PROJECTS
+            }
+            dependentProjects.contains(project) -> {
+                ProjectSubset.DEPENDENT_PROJECTS
+            }
+            else -> {
+                ProjectSubset.NONE
+            }
+        }
+    }
+
+    /**
+     * Finds only the set of projects that were directly changed in the commit. This includes
+     * dumb-tests and any modules that need to be co-built.
+     *
+     * Also populates the unknownFiles var which is used in findAffectedProjects
+     *
+     * Returns allProjects if there are no previous merge CLs, which shouldn't happen.
+     */
+    private fun findChangedProjects(): Set<Project> {
+        val lastMergeSha = git.findPreviousMergeCL() ?: return allProjects
+        val changedFiles = git.findChangedFilesSince(
+            sha = lastMergeSha,
+            includeUncommitted = true
+        )
+
+        val changedProjects: MutableSet<Project> = alwaysBuild.toMutableSet()
+
+        for (filePath in changedFiles) {
+            val containingProject = findContainingProject(filePath)
+            if (containingProject == null) {
+                unknownFiles.add(filePath)
+                logger?.info("Couldn't find containing project for file$filePath. " +
+                        "Adding to unknownFiles.")
+            } else {
+                changedProjects.add(containingProject)
+                logger?.info("For file $filePath containing project is $containingProject. " +
+                        "Adding to changedProjects.")
+            }
+        }
+
+        return changedProjects + getAffectedCobuiltProjects(
+            changedProjects, cobuiltTestProjects)
+    }
+
+    /**
+     * Gets all dependent projects from the set of changedProjects. This doesn't include the
+     * original changedProjects. Always build is still here to ensure at least 1 thing is built
+     */
+    private fun findDependentProjects(): Set<Project> {
+        val dependentProjects = changedProjects.flatMap {
+            dependencyTracker.findAllDependents(it)
+        }.toSet()
+        return dependentProjects + getAffectedCobuiltProjects(dependentProjects,
+            cobuiltTestProjects) + alwaysBuild
+    }
+
     /**
      * By default, finds all modules that are affected by current changes
      *
@@ -236,48 +333,30 @@
      *
      * Also detects modules whose tests are codependent at runtime.
      */
-    private fun findLocallyAffectedProjects(): Set<Project> {
-        val lastMergeSha = git.findPreviousMergeCL() ?: return allProjects
-        val changedFiles = git.findChangedFilesSince(
-            sha = lastMergeSha,
-            includeUncommitted = true
-        )
-
-        val alwaysBuild = ALWAYS_BUILD.map { path ->
-            rootProject.project(path)
-        }
-
-        val unknownFiles: MutableList<String> = mutableListOf()
-        val changedProjects: MutableSet<Project> = alwaysBuild.toMutableSet()
-        for (file in changedFiles) {
-            val containingProject = findContainingProject(file)
-            if (containingProject == null) {
-                unknownFiles.add(file)
-                logger?.info("Couldn't find containing project for file $file. " +
-                        "Adding to unknownFiles.")
-            } else {
-                changedProjects.add(containingProject)
-                logger?.info("For file $file containing project is $containingProject. " +
-                        "Adding to containingProjects.")
-            }
-        }
-        val cobuiltTestProjects = lookupProjectSetsFromPaths(cobuiltTestPaths)
-
+    private fun findAffectedProjects(): Set<Project> {
+        // In this case we don't care about any of the logic below, we're only concerned with
+        // running the changed projects in this test runner
         if (projectSubset == ProjectSubset.CHANGED_PROJECTS) {
-            return changedProjects +
-                    getAffectedCobuiltProjects(changedProjects, cobuiltTestProjects)
+            return changedProjects
         }
+
         var buildAll = false
 
+        // Should only trigger if there are no changedFiles
+        if (changedProjects.size == alwaysBuild.size && unknownFiles.isEmpty()) buildAll =
+        true
         unknownFiles.forEach {
             if (affectsAllOfThisBuild(it) || affectsAllOfBothBuilds(it)) {
                 buildAll = true
             }
         }
-        if (unknownFiles.isEmpty() && changedProjects.size == alwaysBuild.size) buildAll = true
-        logger?.info("unknownFiles: $unknownFiles, changedProjects: $changedProjects, buildAll: " +
-                "$buildAll")
+        logger?.info(
+            "unknownFiles: $unknownFiles, changedProjects: $changedProjects, buildAll: " +
+                "$buildAll"
+        )
 
+        // If we're in a buildAll state, we return allProjects unless it's the changed target,
+        // Since the changed target runs all tests and we don't want 3+ hour presubmit runs
         if (buildAll) {
             logger?.info("Building all projects")
             if (unknownFiles.isEmpty()) {
@@ -286,12 +365,11 @@
                 logger?.info("because one of the unknown files affects everything in the build")
                 logger?.info(
                     """
-                        The modules detected as affected by changed files are
-                        ${expandToDependents(changedProjects)}
-                    """.trimIndent()
+                    The modules detected as affected by changed files are
+                    ${changedProjects + dependentProjects}
+                """.trimIndent()
                 )
             }
-
             when (projectSubset) {
                 ProjectSubset.DEPENDENT_PROJECTS -> return allProjects
                 ProjectSubset.ALL_AFFECTED_PROJECTS -> return allProjects
@@ -299,14 +377,13 @@
             }
         }
 
-        val affectedProjects = when (projectSubset) {
-            ProjectSubset.ALL_AFFECTED_PROJECTS -> expandToDependents(changedProjects)
+        return when (projectSubset) {
+            ProjectSubset.ALL_AFFECTED_PROJECTS -> changedProjects + dependentProjects
             ProjectSubset.CHANGED_PROJECTS -> changedProjects
-            else -> expandToDependents(changedProjects) - changedProjects + alwaysBuild
+            else -> dependentProjects
         }
-
-        return affectedProjects + getAffectedCobuiltProjects(affectedProjects, cobuiltTestProjects)
     }
+
     // TODO: simplify when resolving b/132901339 when there are no longer two builds
     private val ROOT_FILES_OR_FOLDERS_AFFECTING_ALL_OF_BOTH_BUILDS = listOf(
         "buildSrc", "busytown", "development", "frameworks", "gradlew" // paths from root
@@ -361,12 +438,6 @@
         return cobuilts
     }
 
-    private fun expandToDependents(containingProjects: Set<Project>): Set<Project> {
-        return containingProjects.flatMapTo(mutableSetOf()) {
-            dependencyTracker.findAllDependents(it)
-        }
-    }
-
     private fun findContainingProject(filePath: String): Project? {
         return projectGraph.findContainingProject(filePath).also {
             logger?.info("search result for $filePath resulted in ${it?.path}")
@@ -377,6 +448,7 @@
         // dummy test to ensure no failure due to "no instrumentation. We can eventually remove
         // if we resolve b/127819369
         private val ALWAYS_BUILD = setOf(":dumb-tests")
+
         // Some tests are codependent even if their modules are not. Enable manual bundling of tests
         private val COBUILT_TEST_PATHS = setOf(
             // Install media tests together per b/128577735
diff --git a/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/DependencyTracker.kt b/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/DependencyTracker.kt
index baec3ce..1f1cb38 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/DependencyTracker.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/DependencyTracker.kt
@@ -61,6 +61,7 @@
         logger?.info("dependents of ${project.path} is ${result.map {
             it.path
         }}")
-        return result
+        // the project isn't a dependent of itself
+        return result.minus(project)
     }
 }
\ No newline at end of file
diff --git a/buildSrc/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt b/buildSrc/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
index 086c477..f71f23b 100644
--- a/buildSrc/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
@@ -91,6 +91,11 @@
     "publishPluginMavenPublicationToMavenRepository",
     "publishSafeargsJavaPluginMarkerMavenPublicationToMavenRepository",
     "publishSafeargsKotlinPluginMarkerMavenPublicationToMavenRepository",
+    /**
+     * relocateShadowJar is used to configure the ShadowJar hence it does not have any outputs.
+     * https://github.com/johnrengelman/shadow/issues/561
+     */
+    "relocateShadowJar",
     "reportLibraryMetrics",
     "stripArchiveForPartialDejetification",
     "transformClassesWithDexBuilderForPublicDebug",
diff --git a/busytown/androidx-studio-integration.sh b/busytown/androidx-studio-integration.sh
index 14e7a9e..745d941 100755
--- a/busytown/androidx-studio-integration.sh
+++ b/busytown/androidx-studio-integration.sh
@@ -14,7 +14,7 @@
 export OUT_DIR=out
 export DIST_DIR="$DIST_DIR"
 
-JAVA_HOME="$(pwd)/prebuilts/studio/jdk/linux" tools/gradlew -p tools/ publishLocal
+JAVA_HOME="$(pwd)/prebuilts/studio/jdk/linux" tools/gradlew -p tools/ publishLocal --stacktrace
 
 export GRADLE_PLUGIN_VERSION=`grep -oP "(?<=buildVersion = ).*" tools/buildSrc/base/version.properties`
 export GRADLE_PLUGIN_REPO="$(pwd)/out/repo"
@@ -22,5 +22,5 @@
 export JAVA_TOOLS_JAR="$PWD/prebuilts/jdk/jdk11/linux-x86/lib/tools.jar"
 export LINT_PRINT_STACKTRACE=true
 
-tools/gradlew -p frameworks/support --no-daemon bOS
-DIST_SUBDIR="/ui" tools/gradlew -p frameworks/support/ui --no-daemon bOS
+tools/gradlew -p frameworks/support --no-daemon bOS --stacktrace -Pandroidx.allWarningsAsErrors
+DIST_SUBDIR="/ui" tools/gradlew -p frameworks/support/ui --no-daemon bOS --stacktrace -Pandroidx.allWarningsAsErrors
diff --git a/busytown/androidx.sh b/busytown/androidx.sh
index b958850..0fe2edcb 100755
--- a/busytown/androidx.sh
+++ b/busytown/androidx.sh
@@ -5,7 +5,9 @@
 
 # Run Gradle
 impl/build.sh --no-daemon listTaskOutputs "$@"
-impl/build.sh --no-daemon buildOnServer -PverifyUpToDate --profile "$@"
+impl/build.sh --no-daemon buildOnServer \
+    -PverifyUpToDate \
+    -Pandroidx.allWarningsAsErrors --profile "$@"
 
 # Merge some output files
 python3 impl/merge_outputs.py "mergeBuildInfo" "mergeLibraryMetrics"
diff --git a/busytown/androidx_host_tests.sh b/busytown/androidx_host_tests.sh
index 140db99..3c0f0cf 100755
--- a/busytown/androidx_host_tests.sh
+++ b/busytown/androidx_host_tests.sh
@@ -3,7 +3,10 @@
 
 cd "$(dirname $0)"
 
-impl/build.sh --no-daemon test jacocoTestReport zipEcFiles --info --offline -Pandroidx.enableAffectedModuleDetection "$@"
+impl/build.sh --no-daemon test jacocoTestReport zipEcFiles --info --offline \
+    -Pandroidx.enableAffectedModuleDetection \
+    -Pandroidx.ignoreTestFailures \
+    -Pandroidx.allWarningsAsErrors "$@"
 
 # TODO: un-comment this when AMD is fixed (b/147824472)
 #python3 ./merge_outputs.py mergeExecutionData
diff --git a/busytown/androidx_host_tests_max_dep_versions.sh b/busytown/androidx_host_tests_max_dep_versions.sh
index 5554a38..64f092d 100755
--- a/busytown/androidx_host_tests_max_dep_versions.sh
+++ b/busytown/androidx_host_tests_max_dep_versions.sh
@@ -3,4 +3,4 @@
 
 cd "$(dirname $0)"
 
-impl/build.sh --no-daemon test --info -PuseMaxDepVersions --offline -Pandroidx.enableAffectedModuleDetection "$@"
+impl/build.sh --no-daemon test --info -PuseMaxDepVersions --offline -Pandroidx.enableAffectedModuleDetection -Pandroidx.ignoreTestFailures "$@"
diff --git a/busytown/androidx_snapshot.sh b/busytown/androidx_snapshot.sh
index f02df74..f0d9f40 100755
--- a/busytown/androidx_snapshot.sh
+++ b/busytown/androidx_snapshot.sh
@@ -3,4 +3,4 @@
 
 cd "$(dirname $0)"
 
-SNAPSHOT=true impl/build.sh --no-daemon createArchive --offline "$@"
+SNAPSHOT=true impl/build.sh --no-daemon createArchive -Pandroidx.allWarningsAsErrors --offline "$@"
diff --git a/busytown/androidx_test_changed_apks.sh b/busytown/androidx_test_changed_apks.sh
index a218fc3..7c03b90 100755
--- a/busytown/androidx_test_changed_apks.sh
+++ b/busytown/androidx_test_changed_apks.sh
@@ -3,4 +3,7 @@
 
 cd "$(dirname $0)"
 
-impl/build.sh --no-daemon buildTestApks -Pandroidx.enableAffectedModuleDetection -Pandroidx.changedProjects --offline "$@"
+impl/build.sh --no-daemon buildTestApks \
+    -Pandroidx.enableAffectedModuleDetection \
+    -Pandroidx.changedProjects \
+    -Pandroidx.allWarningsAsErrors --offline "$@"
diff --git a/busytown/androidx_test_dependent_apks.sh b/busytown/androidx_test_dependent_apks.sh
index 298c50c..407e335 100755
--- a/busytown/androidx_test_dependent_apks.sh
+++ b/busytown/androidx_test_dependent_apks.sh
@@ -3,4 +3,7 @@
 
 cd "$(dirname $0)"
 
-impl/build.sh --no-daemon buildTestApks -Pandroidx.enableAffectedModuleDetection -Pandroidx.dependentProjects --offline "$@"
+impl/build.sh --no-daemon buildTestApks \
+    -Pandroidx.enableAffectedModuleDetection \
+    -Pandroidx.dependentProjects \
+    -Pandroidx.allWarningsAsErrors --offline "$@"
diff --git a/busytown/impl/build.sh b/busytown/impl/build.sh
index 727ae68..e430321 100755
--- a/busytown/impl/build.sh
+++ b/busytown/impl/build.sh
@@ -30,5 +30,5 @@
 echoAndDo "ls -la out"
 
 # run gradle
-echoAndDo OUT_DIR=out/ui DIST_DIR=$DIST_DIR/ui ANDROID_HOME=./prebuilts/fullsdk-linux frameworks/support/ui/gradlew -p frameworks/support/ui "$@"
-echoAndDo OUT_DIR=out    DIST_DIR=$DIST_DIR    ANDROID_HOME=./prebuilts/fullsdk-linux frameworks/support/gradlew    -p frameworks/support    "$@"
+echoAndDo OUT_DIR=out/ui DIST_DIR=$DIST_DIR/ui ANDROID_HOME=./prebuilts/fullsdk-linux frameworks/support/ui/gradlew -p frameworks/support/ui --stacktrace "$@"
+echoAndDo OUT_DIR=out    DIST_DIR=$DIST_DIR    ANDROID_HOME=./prebuilts/fullsdk-linux frameworks/support/gradlew    -p frameworks/support    --stacktrace "$@"
diff --git a/camera/camera-camera2/api/1.0.0-beta03.txt b/camera/camera-camera2/api/1.0.0-beta03.txt
new file mode 100644
index 0000000..c4e0698
--- /dev/null
+++ b/camera/camera-camera2/api/1.0.0-beta03.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.camera.camera2 {
+
+  public final class Camera2Config {
+    method public static androidx.camera.core.CameraXConfig defaultConfig();
+  }
+
+}
+
diff --git a/camera/camera-camera2/api/1.0.0-beta04.txt b/camera/camera-camera2/api/1.0.0-beta04.txt
new file mode 100644
index 0000000..c4e0698
--- /dev/null
+++ b/camera/camera-camera2/api/1.0.0-beta04.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.camera.camera2 {
+
+  public final class Camera2Config {
+    method public static androidx.camera.core.CameraXConfig defaultConfig();
+  }
+
+}
+
diff --git a/camera/camera-camera2/api/public_plus_experimental_1.0.0-beta03.txt b/camera/camera-camera2/api/public_plus_experimental_1.0.0-beta03.txt
new file mode 100644
index 0000000..a6359b6
--- /dev/null
+++ b/camera/camera-camera2/api/public_plus_experimental_1.0.0-beta03.txt
@@ -0,0 +1,31 @@
+// Signature format: 3.0
+package androidx.camera.camera2 {
+
+  public final class Camera2Config {
+    method public static androidx.camera.core.CameraXConfig defaultConfig();
+  }
+
+}
+
+package androidx.camera.camera2.interop {
+
+  @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2CameraInfo {
+    method public static String extractCameraId(androidx.camera.core.CameraInfo);
+  }
+
+  @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2Interop {
+  }
+
+  public static final class Camera2Interop.Extender<T> {
+    ctor public Camera2Interop.Extender(androidx.camera.core.ExtendableBuilder<T!>);
+    method public <ValueT> androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>, ValueT);
+    method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setDeviceStateCallback(android.hardware.camera2.CameraDevice.StateCallback);
+    method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setSessionCaptureCallback(android.hardware.camera2.CameraCaptureSession.CaptureCallback);
+    method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setSessionStateCallback(android.hardware.camera2.CameraCaptureSession.StateCallback);
+  }
+
+  @experimental.Experimental @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalCamera2Interop {
+  }
+
+}
+
diff --git a/camera/camera-camera2/api/public_plus_experimental_1.0.0-beta04.txt b/camera/camera-camera2/api/public_plus_experimental_1.0.0-beta04.txt
new file mode 100644
index 0000000..a6359b6
--- /dev/null
+++ b/camera/camera-camera2/api/public_plus_experimental_1.0.0-beta04.txt
@@ -0,0 +1,31 @@
+// Signature format: 3.0
+package androidx.camera.camera2 {
+
+  public final class Camera2Config {
+    method public static androidx.camera.core.CameraXConfig defaultConfig();
+  }
+
+}
+
+package androidx.camera.camera2.interop {
+
+  @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2CameraInfo {
+    method public static String extractCameraId(androidx.camera.core.CameraInfo);
+  }
+
+  @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2Interop {
+  }
+
+  public static final class Camera2Interop.Extender<T> {
+    ctor public Camera2Interop.Extender(androidx.camera.core.ExtendableBuilder<T!>);
+    method public <ValueT> androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>, ValueT);
+    method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setDeviceStateCallback(android.hardware.camera2.CameraDevice.StateCallback);
+    method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setSessionCaptureCallback(android.hardware.camera2.CameraCaptureSession.CaptureCallback);
+    method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setSessionStateCallback(android.hardware.camera2.CameraCaptureSession.StateCallback);
+  }
+
+  @experimental.Experimental @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalCamera2Interop {
+  }
+
+}
+
diff --git a/ui/ui-android-text/api/res-0.1.0-dev03.txt b/camera/camera-camera2/api/res-1.0.0-beta03.txt
similarity index 100%
copy from ui/ui-android-text/api/res-0.1.0-dev03.txt
copy to camera/camera-camera2/api/res-1.0.0-beta03.txt
diff --git a/ui/ui-android-text/api/res-0.1.0-dev04.txt b/camera/camera-camera2/api/res-1.0.0-beta04.txt
similarity index 100%
copy from ui/ui-android-text/api/res-0.1.0-dev04.txt
copy to camera/camera-camera2/api/res-1.0.0-beta04.txt
diff --git a/camera/camera-camera2/api/restricted_1.0.0-beta03.txt b/camera/camera-camera2/api/restricted_1.0.0-beta03.txt
new file mode 100644
index 0000000..c4e0698
--- /dev/null
+++ b/camera/camera-camera2/api/restricted_1.0.0-beta03.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.camera.camera2 {
+
+  public final class Camera2Config {
+    method public static androidx.camera.core.CameraXConfig defaultConfig();
+  }
+
+}
+
diff --git a/camera/camera-camera2/api/restricted_1.0.0-beta04.txt b/camera/camera-camera2/api/restricted_1.0.0-beta04.txt
new file mode 100644
index 0000000..c4e0698
--- /dev/null
+++ b/camera/camera-camera2/api/restricted_1.0.0-beta04.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.camera.camera2 {
+
+  public final class Camera2Config {
+    method public static androidx.camera.core.CameraXConfig defaultConfig();
+  }
+
+}
+
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageAnalysisTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageAnalysisTest.java
index 9819f64..c9ae4cb 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageAnalysisTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageAnalysisTest.java
@@ -18,8 +18,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeTrue;
 
 import android.Manifest;
@@ -154,13 +152,14 @@
                 useCase.setAnalyzer(CameraXExecutors.newHandlerExecutor(mHandler), mAnalyzer);
             });
 
-            assertTrue(mAnalysisResultsSemaphore.tryAcquire(5, TimeUnit.SECONDS));
+            assertThat(mAnalysisResultsSemaphore.tryAcquire(5, TimeUnit.SECONDS)).isTrue();
 
             synchronized (mAnalysisResultLock) {
                 // Check the analyzed image exactly matches 640x480 size. This test can also check
                 // whether the guaranteed resolution 640x480 is really supported for YUV_420_888
                 // format on the devices when running the test.
-                assertEquals(GUARANTEED_RESOLUTION, mAnalysisResults.iterator().next().mResolution);
+                assertThat(GUARANTEED_RESOLUTION).isEqualTo(
+                        mAnalysisResults.iterator().next().mResolution);
             }
 
             // Reset the environment to run test for the other lens facing camera device.
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java
index 27212af..ccc15be 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java
@@ -53,9 +53,11 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.experimental.UseExperimental;
 import androidx.camera.camera2.internal.util.FakeRepeatingUseCase;
+import androidx.camera.camera2.interop.Camera2CameraInfo;
 import androidx.camera.camera2.interop.Camera2Interop;
 import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
 import androidx.camera.core.AspectRatio;
+import androidx.camera.core.Camera;
 import androidx.camera.core.CameraInfoUnavailableException;
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.CameraX;
@@ -66,7 +68,6 @@
 import androidx.camera.core.ImageCapture.OnImageSavedCallback;
 import androidx.camera.core.ImageCaptureException;
 import androidx.camera.core.ImageProxy;
-import androidx.camera.core.impl.CameraFactory;
 import androidx.camera.core.impl.CaptureBundle;
 import androidx.camera.core.impl.CaptureConfig;
 import androidx.camera.core.impl.CaptureProcessor;
@@ -80,7 +81,6 @@
 import androidx.camera.testing.fakes.FakeUseCaseConfig;
 import androidx.concurrent.futures.ResolvableFuture;
 import androidx.core.content.ContextCompat;
-import androidx.core.util.Preconditions;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
@@ -165,30 +165,28 @@
     }
 
     @Before
+    @UseExperimental(markerClass = ExperimentalCamera2Interop.class)
     public void setUp() throws ExecutionException, InterruptedException {
         assumeTrue(CameraUtil.deviceHasCamera());
 
         createDefaultPictureFolderIfNotExist();
         Context context = ApplicationProvider.getApplicationContext();
         CameraXConfig cameraXConfig = Camera2Config.defaultConfig();
-        CameraFactory cameraFactory = Preconditions.checkNotNull(
-                cameraXConfig.getCameraFactoryProvider(null)).newInstance(context);
 
         CameraX.initialize(context, cameraXConfig).get();
-        try {
-            mCameraId = cameraFactory.cameraIdForLensFacing(BACK_LENS_FACING);
-        } catch (Exception e) {
-            throw new IllegalArgumentException(
-                    "Unable to attach to camera with LensFacing " + BACK_LENS_FACING, e);
-        }
         mDefaultBuilder = new ImageCapture.Builder();
 
         mFakeUseCaseConfig = new FakeUseCaseConfig.Builder().getUseCaseConfig();
         mRepeatingUseCase = new FakeRepeatingUseCase(mFakeUseCaseConfig);
         mLifecycleOwner = new FakeLifecycleOwner();
-
         mMainExecutor = ContextCompat.getMainExecutor(context);
         mContentResolver = ApplicationProvider.getApplicationContext().getContentResolver();
+
+        // Get the camera ID
+        mInstrumentation.runOnMainSync(() -> {
+            Camera camera = CameraX.bindToLifecycle(mLifecycleOwner, BACK_SELECTOR);
+            mCameraId = Camera2CameraInfo.extractCameraId(camera.getCameraInfo());
+        });
     }
 
     @After
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlTest.java
index d959300..c917bfd 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlTest.java
@@ -107,9 +107,8 @@
         Context context = ApplicationProvider.getApplicationContext();
         CameraManager cameraManager = (CameraManager) context.getSystemService(
                 Context.CAMERA_SERVICE);
-        Camera2CameraFactory camera2CameraFactory = new Camera2CameraFactory(context);
-        mCameraCharacteristics = cameraManager.getCameraCharacteristics(
-                camera2CameraFactory.cameraIdForLensFacing(CameraSelector.LENS_FACING_BACK));
+        mCameraCharacteristics = CameraUtil.getCameraCharacteristics(
+                CameraSelector.LENS_FACING_BACK);
         Boolean hasFlashUnit =
                 mCameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
         mHasFlashUnit = hasFlashUnit != null && hasFlashUnit.booleanValue();
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplTest.java
index 11e878a..f58c8b1 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplTest.java
@@ -55,6 +55,7 @@
 import androidx.camera.core.impl.CameraFactory;
 import androidx.camera.core.impl.CameraInternal;
 import androidx.camera.core.impl.CameraStateRegistry;
+import androidx.camera.core.impl.CameraThreadConfig;
 import androidx.camera.core.impl.CaptureConfig;
 import androidx.camera.core.impl.DeferrableSurface;
 import androidx.camera.core.impl.ImmediateSurface;
@@ -68,6 +69,7 @@
 import androidx.camera.testing.fakes.FakeCameraInfoInternal;
 import androidx.camera.testing.fakes.FakeUseCase;
 import androidx.camera.testing.fakes.FakeUseCaseConfig;
+import androidx.core.os.HandlerCompat;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
@@ -76,6 +78,7 @@
 import com.google.common.util.concurrent.ListenableFuture;
 
 import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Rule;
@@ -90,6 +93,7 @@
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -112,6 +116,7 @@
             CameraInternal.State.RELEASED));
 
     private static CameraFactory sCameraFactory;
+    static ExecutorService sCameraExecutor;
 
     @Rule
     public GrantPermissionRule mRuntimePermissionRule = GrantPermissionRule.grant(
@@ -119,8 +124,8 @@
 
     private ArrayList<FakeUseCase> mFakeUseCases = new ArrayList<>();
     private Camera2CameraImpl mCamera2CameraImpl;
-    private HandlerThread mCameraHandlerThread;
-    private Handler mCameraHandler;
+    private static HandlerThread sCameraHandlerThread;
+    private static Handler sCameraHandler;
     private CameraStateRegistry mCameraStateRegistry;
     Semaphore mSemaphore;
     OnImageAvailableListener mMockOnImageAvailableListener;
@@ -139,7 +144,17 @@
 
     @BeforeClass
     public static void classSetup() {
-        sCameraFactory = new Camera2CameraFactory(ApplicationProvider.getApplicationContext());
+        sCameraHandlerThread = new HandlerThread("cameraThread");
+        sCameraHandlerThread.start();
+        sCameraHandler = HandlerCompat.createAsync(sCameraHandlerThread.getLooper());
+        sCameraExecutor = CameraXExecutors.newHandlerExecutor(sCameraHandler);
+        sCameraFactory = new Camera2CameraFactory(ApplicationProvider.getApplicationContext(),
+                CameraThreadConfig.create(sCameraExecutor, sCameraHandler));
+    }
+
+    @AfterClass
+    public static void classTeardown() {
+        sCameraHandlerThread.quitSafely();
     }
 
     @Before
@@ -149,14 +164,11 @@
         mSessionStateCallback = new SemaphoreReleasingCamera2Callbacks.SessionStateCallback();
 
         mCameraId = getCameraIdForLensFacingUnchecked(DEFAULT_LENS_FACING);
-        mCameraHandlerThread = new HandlerThread("cameraThread");
-        mCameraHandlerThread.start();
-        mCameraHandler = new Handler(mCameraHandlerThread.getLooper());
         mSemaphore = new Semaphore(0);
         mCameraStateRegistry = new CameraStateRegistry(DEFAULT_AVAILABLE_CAMERA_COUNT);
         mCamera2CameraImpl = new Camera2CameraImpl(
                 CameraManagerCompat.from(ApplicationProvider.getApplicationContext()), mCameraId,
-                mCameraStateRegistry, mCameraHandler, mCameraHandler);
+                mCameraStateRegistry, sCameraExecutor, sCameraHandler);
     }
 
     @After
@@ -177,10 +189,6 @@
         for (FakeUseCase fakeUseCase : mFakeUseCases) {
             fakeUseCase.clear();
         }
-
-        if (mCameraHandlerThread != null) {
-            mCameraHandlerThread.quitSafely();
-        }
     }
 
     @Test
@@ -364,7 +372,7 @@
         DeferrableSurface surface1 = useCase1.getSessionConfig().getSurfaces().get(0);
 
         unblockHandler();
-        HandlerUtil.waitForLooperToIdle(mCameraHandler);
+        HandlerUtil.waitForLooperToIdle(sCameraHandler);
 
         changeUseCaseSurface(useCase1);
         mCamera2CameraImpl.onUseCaseReset(useCase1);
@@ -411,7 +419,7 @@
         // To make the single request not able to run in 1st capture session.  and verify if it can
         // be carried over to the new capture session and run successfully.
         unblockHandler();
-        HandlerUtil.waitForLooperToIdle(mCameraHandler);
+        HandlerUtil.waitForLooperToIdle(sCameraHandler);
 
         // CameraCaptureCallback.onCaptureCompleted() should be called to signal a capture attempt.
         verify(captureCallback, timeout(3000).times(1))
@@ -446,7 +454,7 @@
         // To make the single request not able to run in 1st capture session.  and verify if it can
         // be carried to the new capture session and run successfully.
         unblockHandler();
-        HandlerUtil.waitForLooperToIdle(mCameraHandler);
+        HandlerUtil.waitForLooperToIdle(sCameraHandler);
 
         // TODO: b/133710422 should provide a way to detect if request is cancelled.
         Thread.sleep(1000);
@@ -530,7 +538,6 @@
                 });
         mCameraStateRegistry.tryOpenCamera(mockCamera);
 
-
         mCamera2CameraImpl.getCameraState().addObserver(CameraXExecutors.directExecutor(),
                 mockObserver);
 
@@ -592,9 +599,25 @@
         verify(mockObserver, timeout(4000).times(1)).onNewData(CameraInternal.State.CLOSED);
     }
 
+    @Test
+    public void closeCaptureSessionImmediateAfterCreateCaptureSession()
+            throws InterruptedException {
+        mCamera2CameraImpl.open();
+        UseCase useCase = createUseCase();
+        mCamera2CameraImpl.addOnlineUseCase(Arrays.asList(useCase));
+        mCamera2CameraImpl.onUseCaseActive(useCase);
+
+        // Wait a little bit for the camera to open.
+        assertTrue(mSessionStateCallback.waitForOnConfigured(1));
+
+        // Remove the useCase and trigger the CaptureSession#close().
+        mCamera2CameraImpl.removeOnlineUseCase(Arrays.asList(useCase));
+        assertTrue(mSessionStateCallback.waitForOnClosed(1));
+    }
+
     // Blocks the camera thread handler.
     private void blockHandler() {
-        mCameraHandler.post(new Runnable() {
+        sCameraHandler.post(new Runnable() {
             @Override
             public void run() {
                 try {
@@ -633,7 +656,7 @@
         mCamera2CameraImpl.addOnlineUseCase(Collections.singletonList(useCase1));
         mCamera2CameraImpl.addOnlineUseCase(Arrays.asList(useCase1, useCase2));
 
-        HandlerUtil.waitForLooperToIdle(mCameraHandler);
+        HandlerUtil.waitForLooperToIdle(sCameraHandler);
 
         Handler uiThreadHandler = new Handler(Looper.getMainLooper());
         HandlerUtil.waitForLooperToIdle(uiThreadHandler);
@@ -654,7 +677,7 @@
 
         mCamera2CameraImpl.removeOnlineUseCase(Arrays.asList(useCase1, useCase2, useCase3));
 
-        HandlerUtil.waitForLooperToIdle(mCameraHandler);
+        HandlerUtil.waitForLooperToIdle(sCameraHandler);
 
         Handler uiThreadHandler = new Handler(Looper.getMainLooper());
         HandlerUtil.waitForLooperToIdle(uiThreadHandler);
@@ -688,7 +711,7 @@
         UseCase useCase1 = createUseCase();
 
         mCamera2CameraImpl.addOnlineUseCase(Collections.singletonList(useCase1));
-        HandlerUtil.waitForLooperToIdle(mCameraHandler);
+        HandlerUtil.waitForLooperToIdle(sCameraHandler);
 
         assertThat(isCameraControlActive(camera2CameraControl)).isTrue();
 
@@ -702,11 +725,11 @@
         UseCase useCase1 = createUseCase();
 
         mCamera2CameraImpl.addOnlineUseCase(Arrays.asList(useCase1));
-        HandlerUtil.waitForLooperToIdle(mCameraHandler);
+        HandlerUtil.waitForLooperToIdle(sCameraHandler);
         assertThat(isCameraControlActive(camera2CameraControl)).isTrue();
 
         mCamera2CameraImpl.removeOnlineUseCase(Arrays.asList(useCase1));
-        HandlerUtil.waitForLooperToIdle(mCameraHandler);
+        HandlerUtil.waitForLooperToIdle(sCameraHandler);
 
         assertThat(isCameraControlActive(camera2CameraControl)).isFalse();
     }
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureSessionTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureSessionTest.java
index fb0210d..1963490 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureSessionTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureSessionTest.java
@@ -64,6 +64,7 @@
 import androidx.camera.core.impl.utils.futures.FutureCallback;
 import androidx.camera.core.impl.utils.futures.Futures;
 import androidx.camera.testing.CameraUtil;
+import androidx.core.os.HandlerCompat;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
 import androidx.test.rule.GrantPermissionRule;
@@ -494,6 +495,23 @@
     }
 
     @Test
+    public void startStreamingAfterOpenCaptureSession()
+            throws InterruptedException, ExecutionException {
+        CaptureSession captureSession = createCaptureSession(mTestParameters0);
+        captureSession.setSessionConfig(mTestParameters0.mSessionConfig);
+        captureSession.open(mTestParameters0.mSessionConfig, mCameraDeviceHolder.get());
+
+        assertTrue(mTestParameters0.waitForData());
+        assertThat(captureSession.getState()).isEqualTo(State.OPENED);
+        assertFutureCompletes(captureSession.getStartStreamingFuture(), 5,
+                TimeUnit.SECONDS);
+
+        verify(mTestParameters0.mCamera2CaptureCallback, timeout(3000).atLeastOnce())
+                .onCaptureStarted(any(CameraCaptureSession.class), any(CaptureRequest.class),
+                        any(Long.class), any(Long.class));
+    }
+
+    @Test
     public void surfaceTerminationFutureIsCalledWhenSessionIsClose()
             throws InterruptedException, ExecutionException {
         mTestParameters0.setCloseSurfaceOnSessionClose(true);
@@ -632,7 +650,7 @@
 
         captureSession.open(mTestParameters0.mSessionConfig, mCameraDeviceHolder.get());
         Future<Void> releaseFuture = captureSession.release(false);
-        assertFutureCompletes(releaseFuture, 5 , TimeUnit.SECONDS);
+        assertFutureCompletes(releaseFuture, 5, TimeUnit.SECONDS);
 
         // The captureSession state should change to RELEASED state
         assertThat(captureSession.getState()).isEqualTo(State.RELEASED);
@@ -802,6 +820,8 @@
                 Mockito.mock(CameraCaptureCallback.class);
         private final CameraCaptureCallback mCameraCaptureCallback =
                 Mockito.mock(CameraCaptureCallback.class);
+        private final CameraCaptureSession.CaptureCallback mCamera2CaptureCallback =
+                Mockito.mock(CameraCaptureSession.CaptureCallback.class);
 
         private final DeferrableSurface mDeferrableSurface;
         /**
@@ -822,7 +842,7 @@
         CaptureSessionTestParameters(String name) {
             mHandlerThread = new HandlerThread(name);
             mHandlerThread.start();
-            mHandler = new Handler(mHandlerThread.getLooper());
+            mHandler = HandlerCompat.createAsync(mHandlerThread.getLooper());
 
             mExecutor = CameraXExecutors.newHandlerExecutor(mHandler);
             mScheduledExecutor = CameraXExecutors.newHandlerExecutor(mHandler);
@@ -837,6 +857,8 @@
             builder.addSurface(mDeferrableSurface);
             builder.addSessionStateCallback(mSessionStateCallback);
             builder.addRepeatingCameraCaptureCallback(mSessionCameraCaptureCallback);
+            builder.addRepeatingCameraCaptureCallback(
+                    CaptureCallbackContainer.create(mCamera2CaptureCallback));
 
             MutableOptionsBundle testCallbackConfig = MutableOptionsBundle.create();
             testCallbackConfig.insertOption(Camera2ImplConfig.CAMERA_EVENT_CALLBACK_OPTION,
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraFactory.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraFactory.java
index e1cb26f..9ecbb96 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraFactory.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraFactory.java
@@ -20,19 +20,16 @@
 import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CameraMetadata;
-import android.os.Handler;
-import android.os.HandlerThread;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.camera.camera2.internal.compat.CameraManagerCompat;
 import androidx.camera.core.CameraInfoUnavailableException;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.CameraXThreads;
 import androidx.camera.core.impl.CameraFactory;
 import androidx.camera.core.impl.CameraInternal;
 import androidx.camera.core.impl.CameraStateRegistry;
-import androidx.core.os.HandlerCompat;
+import androidx.camera.core.impl.CameraThreadConfig;
 
 import java.util.Arrays;
 import java.util.LinkedHashSet;
@@ -44,21 +41,17 @@
  */
 public final class Camera2CameraFactory implements CameraFactory {
     private static final int DEFAULT_ALLOWED_CONCURRENT_OPEN_CAMERAS = 1;
+    private final CameraThreadConfig mThreadConfig;
 
-    private static final HandlerThread sHandlerThread = new HandlerThread(CameraXThreads.TAG);
-    private static final Handler sHandler;
     private final CameraStateRegistry mCameraStateRegistry;
     private final CameraManagerCompat mCameraManager;
 
-    static {
-        sHandlerThread.start();
-        sHandler = HandlerCompat.createAsync(sHandlerThread.getLooper());
-    }
-
     /** Creates a Camera2 implementation of CameraFactory */
-    public Camera2CameraFactory(@NonNull Context context) {
+    public Camera2CameraFactory(@NonNull Context context,
+            @NonNull CameraThreadConfig threadConfig) {
+        mThreadConfig = threadConfig;
         mCameraStateRegistry = new CameraStateRegistry(DEFAULT_ALLOWED_CONCURRENT_OPEN_CAMERAS);
-        mCameraManager = CameraManagerCompat.from(context);
+        mCameraManager = CameraManagerCompat.from(context, mThreadConfig.getSchedulerHandler());
     }
 
     @Override
@@ -69,9 +62,8 @@
             throw new IllegalArgumentException(
                     "The given camera id is not on the available camera id list.");
         }
-        Camera2CameraImpl camera2CameraImpl = new Camera2CameraImpl(mCameraManager, cameraId,
-                mCameraStateRegistry, sHandler, sHandler);
-        return camera2CameraImpl;
+        return new Camera2CameraImpl(mCameraManager, cameraId, mCameraStateRegistry,
+                mThreadConfig.getCameraExecutor(), mThreadConfig.getSchedulerHandler());
     }
 
     @Override
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraImpl.java
index 65c7f69..63c50e1 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraImpl.java
@@ -55,6 +55,7 @@
 import androidx.camera.core.impl.annotation.ExecutedBy;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.core.impl.utils.futures.FutureCallback;
+import androidx.camera.core.impl.utils.futures.FutureChain;
 import androidx.camera.core.impl.utils.futures.Futures;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.core.util.Preconditions;
@@ -159,25 +160,24 @@
     /**
      * Constructor for a camera.
      *
-     * @param cameraManager              the camera service used to retrieve a camera
-     * @param cameraId                   the name of the camera as defined by the camera service
-     * @param cameraStateRegistry        An registry used to track the state of multiple cameras.
-     *                                   Used as a fence to ensure the number of simultaneously
-     *                                   opened cameras is limited.
-     * @param handler                    the handler for the thread on which all camera
-     *                                   operations run
+     * @param cameraManager       the camera service used to retrieve a camera
+     * @param cameraId            the name of the camera as defined by the camera service
+     * @param cameraStateRegistry An registry used to track the state of multiple cameras.
+     *                            Used as a fence to ensure the number of simultaneously
+     *                            opened cameras is limited.
+     * @param executor            the executor for on which all camera operations run
      * @throws IllegalStateException if the {@link CameraCharacteristics} is unavailable. This
      *                               could occur if the camera was disconnected.
      */
     Camera2CameraImpl(CameraManagerCompat cameraManager, String cameraId,
             @NonNull CameraStateRegistry cameraStateRegistry,
-            @NonNull Handler handler,
+            @NonNull Executor executor,
             @NonNull Handler schedulerHandler) {
         mCameraManager = cameraManager;
         mCameraStateRegistry = cameraStateRegistry;
         ScheduledExecutorService executorScheduler =
                 CameraXExecutors.newHandlerExecutor(schedulerHandler);
-        mExecutor = CameraXExecutors.newHandlerExecutor(handler);
+        mExecutor = CameraXExecutors.newSequentialExecutor(executor);
         mUseCaseAttachState = new UseCaseAttachState(cameraId);
         mObservableState.postValue(State.CLOSED);
 
@@ -383,15 +383,11 @@
                         + "error) state. Current state: "
                         + mState + " (error: " + getErrorMessage(mCameraDeviceError) + ")");
 
-        Camera2CameraInfoImpl camera2CameraInfo = (Camera2CameraInfoImpl) getCameraInfoInternal();
-        boolean isLegacyDevice = camera2CameraInfo.getSupportedHardwareLevel()
-                == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY;
-
         // TODO: Check if any sessions have been previously configured. We can probably skip
         // configAndClose if there haven't been any sessions configured yet.
         if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M
                 && Build.VERSION.SDK_INT < 29
-                && isLegacyDevice
+                && isLegacyDevice()
                 && mCameraDeviceError == ERROR_NONE) { // Cannot open session on device in error
             // To configure surface again before close camera. This step would
             // disconnect previous connected surface in some legacy device to prevent exception.
@@ -601,6 +597,7 @@
      *
      * <p>This method should only be used by tests. This will post to the Camera's thread and
      * block until completion.
+     *
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.TESTS)
@@ -834,8 +831,38 @@
         }
 
         CaptureSession captureSession = mCaptureSession;
-        ListenableFuture<Void> openCaptureSession = captureSession.open(validatingBuilder.build(),
-                mCameraDevice);
+        ListenableFuture<Void> openCaptureSession;
+
+        if (!isLegacyDevice()) {
+            openCaptureSession = captureSession.open(validatingBuilder.build(), mCameraDevice);
+        } else {
+            // Opening and releasing the capture session quickly and constantly is a problem for
+            // LEGACY devices. See: b/146773463. It needs to check all the releasing capture
+            // sessions are ready for opening next capture session.
+            List<ListenableFuture<Void>> futureList = new ArrayList<>();
+            for (CaptureSession releasedSession : mReleasedCaptureSessions.keySet()) {
+                futureList.add(releasedSession.getStartStreamingFuture());
+            }
+
+            openCaptureSession = FutureChain.from(
+                    Futures.successfulAsList(futureList)).transformAsync(v -> {
+                        // To close the camera, create the new CaptureSession or receive camera
+                        // error will release the previous CaptureSession. If the state of
+                        // CaptureSession is released, it is mean there are multiple CaptureSession
+                        // actions while waiting for a list of futures to complete. Then only the
+                        // last CaptureSession that we create should actually open a CaptureSession.
+                        if (captureSession.getState() == CaptureSession.State.RELEASED) {
+                            return Futures.immediateFailedFuture(new CancellationException(
+                                    "The capture session has been released before."));
+                        } else {
+                            // The camera state should be opened. Otherwise, this CaptureSession
+                            // should be released.
+                            Preconditions.checkState(mState == InternalState.OPENED);
+                            return captureSession.open(validatingBuilder.build(), mCameraDevice);
+                        }
+                    }, mExecutor);
+        }
+
         Futures.addCallback(openCaptureSession, new FutureCallback<Void>() {
             @Override
             @ExecutedBy("mExecutor")
@@ -872,6 +899,12 @@
         }, mExecutor);
     }
 
+    private boolean isLegacyDevice() {
+        Camera2CameraInfoImpl camera2CameraInfo = (Camera2CameraInfoImpl) getCameraInfoInternal();
+        return camera2CameraInfo.getSupportedHardwareLevel()
+                == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY;
+    }
+
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     @ExecutedBy("mExecutor")
     void closeStaleCaptureSessions(CaptureSession captureSession) {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSession.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSession.java
index 01d90f7..7dac4a08 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSession.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSession.java
@@ -22,7 +22,6 @@
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CaptureRequest;
-import android.hardware.camera2.TotalCaptureResult;
 import android.os.Build;
 import android.os.Handler;
 import android.util.Log;
@@ -89,10 +88,26 @@
     private final CameraCaptureSession.CaptureCallback mCaptureCallback =
             new CaptureCallback() {
                 @Override
-                public void onCaptureCompleted(
-                        @NonNull CameraCaptureSession session,
-                        @NonNull CaptureRequest request,
-                        @NonNull TotalCaptureResult result) {
+                public void onCaptureStarted(
+                        @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+                        long timestamp, long frameNumber) {
+                    synchronized (mStateLock) {
+                        if (mStartStreamingCompleter != null) {
+                            mStartStreamingCompleter.set(null);
+                            mStartStreamingCompleter = null;
+                        }
+                    }
+                }
+
+                @Override
+                public void onCaptureSequenceAborted(
+                        @NonNull CameraCaptureSession session, int sequenceId) {
+                    synchronized (mStateLock) {
+                        if (mStartStreamingCompleter != null) {
+                            mStartStreamingCompleter.setCancelled();
+                            mStartStreamingCompleter = null;
+                        }
+                    }
                 }
             };
     private final StateCallback mCaptureSessionStateCallback;
@@ -134,6 +149,15 @@
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     @GuardedBy("mStateLock")
     CallbackToFutureAdapter.Completer<Void> mOpenCaptureSessionCompleter;
+    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    final ListenableFuture<Void> mStartStreamingFuture;
+    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    @GuardedBy("mStateLock")
+    CallbackToFutureAdapter.Completer<Void> mStartStreamingCompleter;
+
+    /** Whether the capture session has submitted the repeating request. */
+    @GuardedBy("mStateLock")
+    private boolean mHasSubmittedRepeating;
 
     /**
      * Constructor for CaptureSession.
@@ -153,6 +177,14 @@
         mScheduleExecutor = scheduledExecutorService;
         mIsLegacyDevice = isLegacyDevice;
         mCaptureSessionStateCallback = new StateCallback(compatHandler);
+        mStartStreamingFuture = CallbackToFutureAdapter.getFuture(
+                completer -> {
+                    synchronized (mStateLock) {
+                        mStartStreamingCompleter = completer;
+                        return "StartStreamingFuture[session="
+                                + CaptureSession.this + "]";
+                    }
+                });
     }
 
     /**
@@ -466,23 +498,26 @@
      */
     ListenableFuture<Void> release(boolean abortInFlightCaptures) {
         synchronized (mStateLock) {
+            if (!mHasSubmittedRepeating) {
+                // If the release() is called before any repeating requests have been issued,
+                // then the startStreamingFuture should be cancelled.
+                mStartStreamingFuture.cancel(true);
+            }
             switch (mState) {
                 case UNINITIALIZED:
                     throw new IllegalStateException(
                             "release() should not be possible in state: " + mState);
                 case OPENED:
                 case CLOSED:
-                    if (mCaptureSessionCompat != null) {
-                        if (abortInFlightCaptures) {
-                            try {
-                                mCaptureSessionCompat.toCameraCaptureSession().abortCaptures();
-                            } catch (CameraAccessException e) {
-                                // We couldn't abort the captures, but we should continue on to
-                                // release the session.
-                                Log.e(TAG, "Unable to abort captures.", e);
+                    if (mIsLegacyDevice && mHasSubmittedRepeating) {
+                        // Checks the capture session is ready before closing. See: b/146773463.
+                        mStartStreamingFuture.addListener(() -> {
+                            synchronized (mStateLock) {
+                                closeCameraCaptureSession(abortInFlightCaptures);
                             }
-                        }
-                        mCaptureSessionCompat.toCameraCaptureSession().close();
+                        }, mExecutor);
+                    } else {
+                        closeCameraCaptureSession(abortInFlightCaptures);
                     }
                     // Fall through
                 case OPENING:
@@ -523,6 +558,21 @@
         return Futures.immediateFuture(null);
     }
 
+    private void closeCameraCaptureSession(boolean abortInFlightCaptures) {
+        if (mCaptureSessionCompat != null) {
+            if (abortInFlightCaptures) {
+                try {
+                    mCaptureSessionCompat.toCameraCaptureSession().abortCaptures();
+                } catch (CameraAccessException e) {
+                    // We couldn't abort the captures, but we should continue on to
+                    // release the session.
+                    Log.e(TAG, "Unable to abort captures.", e);
+                }
+            }
+            mCaptureSessionCompat.toCameraCaptureSession().close();
+        }
+    }
+
     // Force the onClosed() callback to be made. This is necessary because the onClosed()
     // callback never gets called if CameraDevice.StateCallback.onDisconnected() is called. See
     // TODO(b/140955560) If the issue is fixed then on OS releases with the fix this should not
@@ -587,12 +637,18 @@
         }
     }
 
+    /** Returns the future which is completed once the session starts streaming frames */
+    ListenableFuture<Void> getStartStreamingFuture() {
+        return mStartStreamingFuture;
+    }
+
     /**
      * Sets the {@link CaptureRequest} so that the camera will start producing data.
      *
      * <p>Will skip setting requests if there are no surfaces since it is illegal to do so.
      */
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    @GuardedBy("mStateLock")
     void issueRepeatingCaptureRequests() {
         if (mSessionConfig == null) {
             Log.d(TAG, "Skipping issueRepeatingCaptureRequests for no configuration case.");
@@ -633,6 +689,7 @@
                             captureConfig.getCameraCaptureCallbacks(),
                             mCaptureCallback);
 
+            mHasSubmittedRepeating = true;
             mCaptureSessionCompat.setSingleRepeatingRequest(captureRequest, mExecutor,
                     comboCaptureCallback);
         } catch (CameraAccessException e) {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompat.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompat.java
index cf295ea..e4594e0 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompat.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompat.java
@@ -23,6 +23,7 @@
 import android.os.Build;
 import android.os.Handler;
 
+import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RequiresPermission;
@@ -177,6 +178,9 @@
 
         private final Executor mExecutor;
         final CameraManager.AvailabilityCallback mWrappedCallback;
+        private final Object mLock = new Object();
+        @GuardedBy("mLock")
+        private boolean mDisabled = false;
 
         AvailabilityCallbackExecutorWrapper(@NonNull Executor executor,
                 @NonNull CameraManager.AvailabilityCallback wrappedCallback) {
@@ -184,35 +188,55 @@
             mWrappedCallback = wrappedCallback;
         }
 
+        // Used to ensure that callbacks do not run after "unregisterAvailabilityCallback" has
+        // returned. Once disabled, the wrapper can no longer be used.
+        void setDisabled() {
+            synchronized (mLock) {
+                mDisabled = true;
+            }
+        }
+
         @RequiresApi(29)
         @Override
         public void onCameraAccessPrioritiesChanged() {
-            mExecutor.execute(new Runnable() {
-                @Override
-                public void run() {
-                    mWrappedCallback.onCameraAccessPrioritiesChanged();
+            synchronized (mLock) {
+                if (!mDisabled) {
+                    mExecutor.execute(new Runnable() {
+                        @Override
+                        public void run() {
+                            mWrappedCallback.onCameraAccessPrioritiesChanged();
+                        }
+                    });
                 }
-            });
+            }
         }
 
         @Override
         public void onCameraAvailable(@NonNull final String cameraId) {
-            mExecutor.execute(new Runnable() {
-                @Override
-                public void run() {
-                    mWrappedCallback.onCameraAvailable(cameraId);
+            synchronized (mLock) {
+                if (!mDisabled) {
+                    mExecutor.execute(new Runnable() {
+                        @Override
+                        public void run() {
+                            mWrappedCallback.onCameraAvailable(cameraId);
+                        }
+                    });
                 }
-            });
+            }
         }
 
         @Override
         public void onCameraUnavailable(@NonNull final String cameraId) {
-            mExecutor.execute(new Runnable() {
-                @Override
-                public void run() {
-                    mWrappedCallback.onCameraUnavailable(cameraId);
+            synchronized (mLock) {
+                if (!mDisabled) {
+                    mExecutor.execute(new Runnable() {
+                        @Override
+                        public void run() {
+                            mWrappedCallback.onCameraUnavailable(cameraId);
+                        }
+                    });
                 }
-            });
+            }
         }
     }
 }
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompatBaseImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompatBaseImpl.java
index c91aa5f..19eab64 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompatBaseImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompatBaseImpl.java
@@ -84,6 +84,9 @@
             }
         }
 
+        if (wrapper != null) {
+            wrapper.setDisabled();
+        }
         mCameraManager.unregisterAvailabilityCallback(wrapper);
     }
 
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2DeviceSurfaceManagerTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2DeviceSurfaceManagerTest.java
index 5c45083..e6ebccd 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2DeviceSurfaceManagerTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2DeviceSurfaceManagerTest.java
@@ -607,7 +607,7 @@
 
         CameraXConfig.Builder appConfigBuilder =
                 new CameraXConfig.Builder()
-                        .setCameraFactoryProvider(ignored -> mCameraFactory)
+                        .setCameraFactoryProvider((ignored0, ignored1) -> mCameraFactory)
                         .setDeviceSurfaceManagerProvider(surfaceManagerProvider)
                         .setUseCaseConfigFactoryProvider(factoryProvider);
 
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/DisplayOrientedMeteringPointFactoryTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/DisplayOrientedMeteringPointFactoryTest.java
index 65967e2..4528e7a 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/DisplayOrientedMeteringPointFactoryTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/DisplayOrientedMeteringPointFactoryTest.java
@@ -94,7 +94,7 @@
 
         CameraXConfig cameraXConfig =
                 new CameraXConfig.Builder()
-                        .setCameraFactoryProvider(ignored -> fakeCameraFactory)
+                        .setCameraFactoryProvider((ignored0, ignored1) -> fakeCameraFactory)
                         .setDeviceSurfaceManagerProvider(surfaceManagerProvider)
                         .setUseCaseConfigFactoryProvider(configFactoryProvider)
                         .build();
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSurfaceCombinationTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSurfaceCombinationTest.java
index 05d7cd1..50f50ac 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSurfaceCombinationTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSurfaceCombinationTest.java
@@ -1796,7 +1796,7 @@
     private void initCameraX() {
         CameraXConfig cameraXConfig = CameraXConfig.Builder.fromConfig(
                 Camera2Config.defaultConfig())
-                .setCameraFactoryProvider(ignored -> mCameraFactory)
+                .setCameraFactoryProvider((ignored0, ignored1) -> mCameraFactory)
                 .build();
         CameraX.initialize(mContext, cameraXConfig);
     }
diff --git a/camera/camera-core/api/1.0.0-beta03.txt b/camera/camera-core/api/1.0.0-beta03.txt
new file mode 100644
index 0000000..4e20a67
--- /dev/null
+++ b/camera/camera-core/api/1.0.0-beta03.txt
@@ -0,0 +1,285 @@
+// Signature format: 3.0
+package androidx.camera.core {
+
+  public class AspectRatio {
+    field public static final int RATIO_16_9 = 1; // 0x1
+    field public static final int RATIO_4_3 = 0; // 0x0
+  }
+
+  public interface Camera {
+    method public androidx.camera.core.CameraControl getCameraControl();
+    method public androidx.camera.core.CameraInfo getCameraInfo();
+  }
+
+  public interface CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+  }
+
+  public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+  }
+
+  public interface CameraInfo {
+    method public int getSensorRotationDegrees();
+    method public int getSensorRotationDegrees(int);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.ZoomState!> getZoomState();
+    method public boolean hasFlashUnit();
+  }
+
+  public final class CameraInfoUnavailableException extends java.lang.Exception {
+  }
+
+  public final class CameraSelector {
+    field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
+    field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
+    field public static final int LENS_FACING_BACK = 1; // 0x1
+    field public static final int LENS_FACING_FRONT = 0; // 0x0
+  }
+
+  public static final class CameraSelector.Builder {
+    ctor public CameraSelector.Builder();
+    method public androidx.camera.core.CameraSelector build();
+    method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
+  }
+
+  public final class CameraXConfig {
+  }
+
+  public static final class CameraXConfig.Builder {
+    method public androidx.camera.core.CameraXConfig build();
+    method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
+    method public androidx.camera.core.CameraXConfig.Builder setCameraExecutor(java.util.concurrent.Executor);
+  }
+
+  public static interface CameraXConfig.Provider {
+    method public androidx.camera.core.CameraXConfig getCameraXConfig();
+  }
+
+  public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraSelector, float, float);
+  }
+
+  public interface ExtendableBuilder<T> {
+    method public T build();
+  }
+
+  public final class FocusMeteringAction {
+    method public long getAutoCancelDurationInMillis();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAwb();
+    method public boolean isAutoCancelEnabled();
+    field public static final int FLAG_AE = 2; // 0x2
+    field public static final int FLAG_AF = 1; // 0x1
+    field public static final int FLAG_AWB = 4; // 0x4
+  }
+
+  public static class FocusMeteringAction.Builder {
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint);
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction build();
+    method public androidx.camera.core.FocusMeteringAction.Builder disableAutoCancel();
+    method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
+  }
+
+  public final class FocusMeteringResult {
+    method public boolean isFocusSuccessful();
+  }
+
+  public final class ImageAnalysis extends androidx.camera.core.UseCase {
+    method public void clearAnalyzer();
+    method public int getBackpressureStrategy();
+    method public int getImageQueueDepth();
+    method public int getTargetRotation();
+    method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method public void setTargetRotation(int);
+    field public static final int STRATEGY_BLOCK_PRODUCER = 1; // 0x1
+    field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
+  }
+
+  public static interface ImageAnalysis.Analyzer {
+    method public void analyze(androidx.camera.core.ImageProxy);
+  }
+
+  public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+    ctor public ImageAnalysis.Builder();
+    method public androidx.camera.core.ImageAnalysis build();
+    method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
+  }
+
+  public final class ImageCapture extends androidx.camera.core.UseCase {
+    method public int getCaptureMode();
+    method public int getFlashMode();
+    method public int getTargetRotation();
+    method public void setCropAspectRatio(android.util.Rational);
+    method public void setFlashMode(int);
+    method public void setTargetRotation(int);
+    method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    method public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    field public static final int CAPTURE_MODE_MAXIMIZE_QUALITY = 0; // 0x0
+    field public static final int CAPTURE_MODE_MINIMIZE_LATENCY = 1; // 0x1
+    field public static final int ERROR_CAMERA_CLOSED = 3; // 0x3
+    field public static final int ERROR_CAPTURE_FAILED = 2; // 0x2
+    field public static final int ERROR_FILE_IO = 1; // 0x1
+    field public static final int ERROR_INVALID_CAMERA = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int FLASH_MODE_AUTO = 0; // 0x0
+    field public static final int FLASH_MODE_OFF = 2; // 0x2
+    field public static final int FLASH_MODE_ON = 1; // 0x1
+  }
+
+  public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+    ctor public ImageCapture.Builder();
+    method public androidx.camera.core.ImageCapture build();
+    method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setFlashMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
+    method public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
+  }
+
+  public static final class ImageCapture.Metadata {
+    ctor public ImageCapture.Metadata();
+    method public android.location.Location? getLocation();
+    method public boolean isReversedHorizontal();
+    method public boolean isReversedVertical();
+    method public void setLocation(android.location.Location?);
+    method public void setReversedHorizontal(boolean);
+    method public void setReversedVertical(boolean);
+  }
+
+  public abstract static class ImageCapture.OnImageCapturedCallback {
+    ctor public ImageCapture.OnImageCapturedCallback();
+    method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
+    method public void onError(androidx.camera.core.ImageCaptureException);
+  }
+
+  public static interface ImageCapture.OnImageSavedCallback {
+    method public void onError(androidx.camera.core.ImageCaptureException);
+    method public void onImageSaved(androidx.camera.core.ImageCapture.OutputFileResults);
+  }
+
+  public static final class ImageCapture.OutputFileOptions {
+  }
+
+  public static final class ImageCapture.OutputFileOptions.Builder {
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.File);
+    ctor public ImageCapture.OutputFileOptions.Builder(android.content.ContentResolver, android.net.Uri, android.content.ContentValues);
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.OutputStream);
+    method public androidx.camera.core.ImageCapture.OutputFileOptions build();
+    method public androidx.camera.core.ImageCapture.OutputFileOptions.Builder setMetadata(androidx.camera.core.ImageCapture.Metadata);
+  }
+
+  public static class ImageCapture.OutputFileResults {
+    method public android.net.Uri? getSavedUri();
+  }
+
+  public class ImageCaptureException extends java.lang.Exception {
+    ctor public ImageCaptureException(int, String, Throwable?);
+    method public int getImageCaptureError();
+  }
+
+  public interface ImageInfo {
+    method public int getRotationDegrees();
+    method public long getTimestamp();
+  }
+
+  public interface ImageProxy extends java.lang.AutoCloseable {
+    method public void close();
+    method public android.graphics.Rect getCropRect();
+    method public int getFormat();
+    method public int getHeight();
+    method public androidx.camera.core.ImageInfo getImageInfo();
+    method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
+    method public int getWidth();
+    method public void setCropRect(android.graphics.Rect?);
+  }
+
+  public static interface ImageProxy.PlaneProxy {
+    method public java.nio.ByteBuffer getBuffer();
+    method public int getPixelStride();
+    method public int getRowStride();
+  }
+
+  public class MeteringPoint {
+    method public float getSize();
+  }
+
+  public abstract class MeteringPointFactory {
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
+    method public static float getDefaultPointSize();
+  }
+
+  public final class Preview extends androidx.camera.core.UseCase {
+    method public int getTargetRotation();
+    method @UiThread public void setSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.SurfaceProvider?);
+    method @UiThread public void setSurfaceProvider(androidx.camera.core.Preview.SurfaceProvider?);
+  }
+
+  public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+    ctor public Preview.Builder();
+    method public androidx.camera.core.Preview build();
+    method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.Preview.Builder setTargetName(String);
+    method public androidx.camera.core.Preview.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.Preview.Builder setTargetRotation(int);
+  }
+
+  public static interface Preview.SurfaceProvider {
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+  }
+
+  public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public SurfaceOrientedMeteringPointFactory(float, float);
+    ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
+  }
+
+  public final class SurfaceRequest {
+    method public void addRequestCancellationListener(java.util.concurrent.Executor, Runnable);
+    method public android.util.Size getResolution();
+    method public void provideSurface(android.view.Surface, java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.core.SurfaceRequest.Result!>);
+    method public boolean willNotProvideSurface();
+  }
+
+  public abstract static class SurfaceRequest.Result {
+    method public abstract int getResultCode();
+    method public abstract android.view.Surface getSurface();
+    field public static final int RESULT_INVALID_SURFACE = 2; // 0x2
+    field public static final int RESULT_REQUEST_CANCELLED = 1; // 0x1
+    field public static final int RESULT_SURFACE_ALREADY_PROVIDED = 3; // 0x3
+    field public static final int RESULT_SURFACE_USED_SUCCESSFULLY = 0; // 0x0
+    field public static final int RESULT_WILL_NOT_PROVIDE_SURFACE = 4; // 0x4
+  }
+
+  public class TorchState {
+    field public static final int OFF = 0; // 0x0
+    field public static final int ON = 1; // 0x1
+  }
+
+  public abstract class UseCase {
+  }
+
+  public interface ZoomState {
+    method public float getLinearZoom();
+    method public float getMaxZoomRatio();
+    method public float getMinZoomRatio();
+    method public float getZoomRatio();
+  }
+
+}
+
diff --git a/camera/camera-core/api/1.0.0-beta04.txt b/camera/camera-core/api/1.0.0-beta04.txt
new file mode 100644
index 0000000..4e20a67
--- /dev/null
+++ b/camera/camera-core/api/1.0.0-beta04.txt
@@ -0,0 +1,285 @@
+// Signature format: 3.0
+package androidx.camera.core {
+
+  public class AspectRatio {
+    field public static final int RATIO_16_9 = 1; // 0x1
+    field public static final int RATIO_4_3 = 0; // 0x0
+  }
+
+  public interface Camera {
+    method public androidx.camera.core.CameraControl getCameraControl();
+    method public androidx.camera.core.CameraInfo getCameraInfo();
+  }
+
+  public interface CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+  }
+
+  public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+  }
+
+  public interface CameraInfo {
+    method public int getSensorRotationDegrees();
+    method public int getSensorRotationDegrees(int);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.ZoomState!> getZoomState();
+    method public boolean hasFlashUnit();
+  }
+
+  public final class CameraInfoUnavailableException extends java.lang.Exception {
+  }
+
+  public final class CameraSelector {
+    field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
+    field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
+    field public static final int LENS_FACING_BACK = 1; // 0x1
+    field public static final int LENS_FACING_FRONT = 0; // 0x0
+  }
+
+  public static final class CameraSelector.Builder {
+    ctor public CameraSelector.Builder();
+    method public androidx.camera.core.CameraSelector build();
+    method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
+  }
+
+  public final class CameraXConfig {
+  }
+
+  public static final class CameraXConfig.Builder {
+    method public androidx.camera.core.CameraXConfig build();
+    method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
+    method public androidx.camera.core.CameraXConfig.Builder setCameraExecutor(java.util.concurrent.Executor);
+  }
+
+  public static interface CameraXConfig.Provider {
+    method public androidx.camera.core.CameraXConfig getCameraXConfig();
+  }
+
+  public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraSelector, float, float);
+  }
+
+  public interface ExtendableBuilder<T> {
+    method public T build();
+  }
+
+  public final class FocusMeteringAction {
+    method public long getAutoCancelDurationInMillis();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAwb();
+    method public boolean isAutoCancelEnabled();
+    field public static final int FLAG_AE = 2; // 0x2
+    field public static final int FLAG_AF = 1; // 0x1
+    field public static final int FLAG_AWB = 4; // 0x4
+  }
+
+  public static class FocusMeteringAction.Builder {
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint);
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction build();
+    method public androidx.camera.core.FocusMeteringAction.Builder disableAutoCancel();
+    method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
+  }
+
+  public final class FocusMeteringResult {
+    method public boolean isFocusSuccessful();
+  }
+
+  public final class ImageAnalysis extends androidx.camera.core.UseCase {
+    method public void clearAnalyzer();
+    method public int getBackpressureStrategy();
+    method public int getImageQueueDepth();
+    method public int getTargetRotation();
+    method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method public void setTargetRotation(int);
+    field public static final int STRATEGY_BLOCK_PRODUCER = 1; // 0x1
+    field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
+  }
+
+  public static interface ImageAnalysis.Analyzer {
+    method public void analyze(androidx.camera.core.ImageProxy);
+  }
+
+  public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+    ctor public ImageAnalysis.Builder();
+    method public androidx.camera.core.ImageAnalysis build();
+    method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
+  }
+
+  public final class ImageCapture extends androidx.camera.core.UseCase {
+    method public int getCaptureMode();
+    method public int getFlashMode();
+    method public int getTargetRotation();
+    method public void setCropAspectRatio(android.util.Rational);
+    method public void setFlashMode(int);
+    method public void setTargetRotation(int);
+    method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    method public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    field public static final int CAPTURE_MODE_MAXIMIZE_QUALITY = 0; // 0x0
+    field public static final int CAPTURE_MODE_MINIMIZE_LATENCY = 1; // 0x1
+    field public static final int ERROR_CAMERA_CLOSED = 3; // 0x3
+    field public static final int ERROR_CAPTURE_FAILED = 2; // 0x2
+    field public static final int ERROR_FILE_IO = 1; // 0x1
+    field public static final int ERROR_INVALID_CAMERA = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int FLASH_MODE_AUTO = 0; // 0x0
+    field public static final int FLASH_MODE_OFF = 2; // 0x2
+    field public static final int FLASH_MODE_ON = 1; // 0x1
+  }
+
+  public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+    ctor public ImageCapture.Builder();
+    method public androidx.camera.core.ImageCapture build();
+    method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setFlashMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
+    method public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
+  }
+
+  public static final class ImageCapture.Metadata {
+    ctor public ImageCapture.Metadata();
+    method public android.location.Location? getLocation();
+    method public boolean isReversedHorizontal();
+    method public boolean isReversedVertical();
+    method public void setLocation(android.location.Location?);
+    method public void setReversedHorizontal(boolean);
+    method public void setReversedVertical(boolean);
+  }
+
+  public abstract static class ImageCapture.OnImageCapturedCallback {
+    ctor public ImageCapture.OnImageCapturedCallback();
+    method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
+    method public void onError(androidx.camera.core.ImageCaptureException);
+  }
+
+  public static interface ImageCapture.OnImageSavedCallback {
+    method public void onError(androidx.camera.core.ImageCaptureException);
+    method public void onImageSaved(androidx.camera.core.ImageCapture.OutputFileResults);
+  }
+
+  public static final class ImageCapture.OutputFileOptions {
+  }
+
+  public static final class ImageCapture.OutputFileOptions.Builder {
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.File);
+    ctor public ImageCapture.OutputFileOptions.Builder(android.content.ContentResolver, android.net.Uri, android.content.ContentValues);
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.OutputStream);
+    method public androidx.camera.core.ImageCapture.OutputFileOptions build();
+    method public androidx.camera.core.ImageCapture.OutputFileOptions.Builder setMetadata(androidx.camera.core.ImageCapture.Metadata);
+  }
+
+  public static class ImageCapture.OutputFileResults {
+    method public android.net.Uri? getSavedUri();
+  }
+
+  public class ImageCaptureException extends java.lang.Exception {
+    ctor public ImageCaptureException(int, String, Throwable?);
+    method public int getImageCaptureError();
+  }
+
+  public interface ImageInfo {
+    method public int getRotationDegrees();
+    method public long getTimestamp();
+  }
+
+  public interface ImageProxy extends java.lang.AutoCloseable {
+    method public void close();
+    method public android.graphics.Rect getCropRect();
+    method public int getFormat();
+    method public int getHeight();
+    method public androidx.camera.core.ImageInfo getImageInfo();
+    method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
+    method public int getWidth();
+    method public void setCropRect(android.graphics.Rect?);
+  }
+
+  public static interface ImageProxy.PlaneProxy {
+    method public java.nio.ByteBuffer getBuffer();
+    method public int getPixelStride();
+    method public int getRowStride();
+  }
+
+  public class MeteringPoint {
+    method public float getSize();
+  }
+
+  public abstract class MeteringPointFactory {
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
+    method public static float getDefaultPointSize();
+  }
+
+  public final class Preview extends androidx.camera.core.UseCase {
+    method public int getTargetRotation();
+    method @UiThread public void setSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.SurfaceProvider?);
+    method @UiThread public void setSurfaceProvider(androidx.camera.core.Preview.SurfaceProvider?);
+  }
+
+  public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+    ctor public Preview.Builder();
+    method public androidx.camera.core.Preview build();
+    method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.Preview.Builder setTargetName(String);
+    method public androidx.camera.core.Preview.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.Preview.Builder setTargetRotation(int);
+  }
+
+  public static interface Preview.SurfaceProvider {
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+  }
+
+  public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public SurfaceOrientedMeteringPointFactory(float, float);
+    ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
+  }
+
+  public final class SurfaceRequest {
+    method public void addRequestCancellationListener(java.util.concurrent.Executor, Runnable);
+    method public android.util.Size getResolution();
+    method public void provideSurface(android.view.Surface, java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.core.SurfaceRequest.Result!>);
+    method public boolean willNotProvideSurface();
+  }
+
+  public abstract static class SurfaceRequest.Result {
+    method public abstract int getResultCode();
+    method public abstract android.view.Surface getSurface();
+    field public static final int RESULT_INVALID_SURFACE = 2; // 0x2
+    field public static final int RESULT_REQUEST_CANCELLED = 1; // 0x1
+    field public static final int RESULT_SURFACE_ALREADY_PROVIDED = 3; // 0x3
+    field public static final int RESULT_SURFACE_USED_SUCCESSFULLY = 0; // 0x0
+    field public static final int RESULT_WILL_NOT_PROVIDE_SURFACE = 4; // 0x4
+  }
+
+  public class TorchState {
+    field public static final int OFF = 0; // 0x0
+    field public static final int ON = 1; // 0x1
+  }
+
+  public abstract class UseCase {
+  }
+
+  public interface ZoomState {
+    method public float getLinearZoom();
+    method public float getMaxZoomRatio();
+    method public float getMinZoomRatio();
+    method public float getZoomRatio();
+  }
+
+}
+
diff --git a/camera/camera-core/api/public_plus_experimental_1.0.0-beta03.txt b/camera/camera-core/api/public_plus_experimental_1.0.0-beta03.txt
new file mode 100644
index 0000000..a18430b
--- /dev/null
+++ b/camera/camera-core/api/public_plus_experimental_1.0.0-beta03.txt
@@ -0,0 +1,289 @@
+// Signature format: 3.0
+package androidx.camera.core {
+
+  public class AspectRatio {
+    field public static final int RATIO_16_9 = 1; // 0x1
+    field public static final int RATIO_4_3 = 0; // 0x0
+  }
+
+  public interface Camera {
+    method public androidx.camera.core.CameraControl getCameraControl();
+    method public androidx.camera.core.CameraInfo getCameraInfo();
+  }
+
+  public interface CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+  }
+
+  public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+  }
+
+  public interface CameraInfo {
+    method public int getSensorRotationDegrees();
+    method public int getSensorRotationDegrees(int);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.ZoomState!> getZoomState();
+    method public boolean hasFlashUnit();
+  }
+
+  public final class CameraInfoUnavailableException extends java.lang.Exception {
+  }
+
+  public final class CameraSelector {
+    field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
+    field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
+    field public static final int LENS_FACING_BACK = 1; // 0x1
+    field public static final int LENS_FACING_FRONT = 0; // 0x0
+  }
+
+  public static final class CameraSelector.Builder {
+    ctor public CameraSelector.Builder();
+    method public androidx.camera.core.CameraSelector build();
+    method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
+  }
+
+  public final class CameraXConfig {
+  }
+
+  public static final class CameraXConfig.Builder {
+    method public androidx.camera.core.CameraXConfig build();
+    method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
+    method public androidx.camera.core.CameraXConfig.Builder setCameraExecutor(java.util.concurrent.Executor);
+  }
+
+  public static interface CameraXConfig.Provider {
+    method public androidx.camera.core.CameraXConfig getCameraXConfig();
+  }
+
+  public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraSelector, float, float);
+  }
+
+  @experimental.Experimental @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalGetImage {
+  }
+
+  public interface ExtendableBuilder<T> {
+    method public T build();
+  }
+
+  public final class FocusMeteringAction {
+    method public long getAutoCancelDurationInMillis();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAwb();
+    method public boolean isAutoCancelEnabled();
+    field public static final int FLAG_AE = 2; // 0x2
+    field public static final int FLAG_AF = 1; // 0x1
+    field public static final int FLAG_AWB = 4; // 0x4
+  }
+
+  public static class FocusMeteringAction.Builder {
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint);
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction build();
+    method public androidx.camera.core.FocusMeteringAction.Builder disableAutoCancel();
+    method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
+  }
+
+  public final class FocusMeteringResult {
+    method public boolean isFocusSuccessful();
+  }
+
+  public final class ImageAnalysis extends androidx.camera.core.UseCase {
+    method public void clearAnalyzer();
+    method public int getBackpressureStrategy();
+    method public int getImageQueueDepth();
+    method public int getTargetRotation();
+    method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method public void setTargetRotation(int);
+    field public static final int STRATEGY_BLOCK_PRODUCER = 1; // 0x1
+    field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
+  }
+
+  public static interface ImageAnalysis.Analyzer {
+    method public void analyze(androidx.camera.core.ImageProxy);
+  }
+
+  public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+    ctor public ImageAnalysis.Builder();
+    method public androidx.camera.core.ImageAnalysis build();
+    method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
+  }
+
+  public final class ImageCapture extends androidx.camera.core.UseCase {
+    method public int getCaptureMode();
+    method public int getFlashMode();
+    method public int getTargetRotation();
+    method public void setCropAspectRatio(android.util.Rational);
+    method public void setFlashMode(int);
+    method public void setTargetRotation(int);
+    method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    method public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    field public static final int CAPTURE_MODE_MAXIMIZE_QUALITY = 0; // 0x0
+    field public static final int CAPTURE_MODE_MINIMIZE_LATENCY = 1; // 0x1
+    field public static final int ERROR_CAMERA_CLOSED = 3; // 0x3
+    field public static final int ERROR_CAPTURE_FAILED = 2; // 0x2
+    field public static final int ERROR_FILE_IO = 1; // 0x1
+    field public static final int ERROR_INVALID_CAMERA = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int FLASH_MODE_AUTO = 0; // 0x0
+    field public static final int FLASH_MODE_OFF = 2; // 0x2
+    field public static final int FLASH_MODE_ON = 1; // 0x1
+  }
+
+  public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+    ctor public ImageCapture.Builder();
+    method public androidx.camera.core.ImageCapture build();
+    method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setFlashMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
+    method public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
+  }
+
+  public static final class ImageCapture.Metadata {
+    ctor public ImageCapture.Metadata();
+    method public android.location.Location? getLocation();
+    method public boolean isReversedHorizontal();
+    method public boolean isReversedVertical();
+    method public void setLocation(android.location.Location?);
+    method public void setReversedHorizontal(boolean);
+    method public void setReversedVertical(boolean);
+  }
+
+  public abstract static class ImageCapture.OnImageCapturedCallback {
+    ctor public ImageCapture.OnImageCapturedCallback();
+    method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
+    method public void onError(androidx.camera.core.ImageCaptureException);
+  }
+
+  public static interface ImageCapture.OnImageSavedCallback {
+    method public void onError(androidx.camera.core.ImageCaptureException);
+    method public void onImageSaved(androidx.camera.core.ImageCapture.OutputFileResults);
+  }
+
+  public static final class ImageCapture.OutputFileOptions {
+  }
+
+  public static final class ImageCapture.OutputFileOptions.Builder {
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.File);
+    ctor public ImageCapture.OutputFileOptions.Builder(android.content.ContentResolver, android.net.Uri, android.content.ContentValues);
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.OutputStream);
+    method public androidx.camera.core.ImageCapture.OutputFileOptions build();
+    method public androidx.camera.core.ImageCapture.OutputFileOptions.Builder setMetadata(androidx.camera.core.ImageCapture.Metadata);
+  }
+
+  public static class ImageCapture.OutputFileResults {
+    method public android.net.Uri? getSavedUri();
+  }
+
+  public class ImageCaptureException extends java.lang.Exception {
+    ctor public ImageCaptureException(int, String, Throwable?);
+    method public int getImageCaptureError();
+  }
+
+  public interface ImageInfo {
+    method public int getRotationDegrees();
+    method public long getTimestamp();
+  }
+
+  public interface ImageProxy extends java.lang.AutoCloseable {
+    method public void close();
+    method public android.graphics.Rect getCropRect();
+    method public int getFormat();
+    method public int getHeight();
+    method @androidx.camera.core.ExperimentalGetImage public android.media.Image? getImage();
+    method public androidx.camera.core.ImageInfo getImageInfo();
+    method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
+    method public int getWidth();
+    method public void setCropRect(android.graphics.Rect?);
+  }
+
+  public static interface ImageProxy.PlaneProxy {
+    method public java.nio.ByteBuffer getBuffer();
+    method public int getPixelStride();
+    method public int getRowStride();
+  }
+
+  public class MeteringPoint {
+    method public float getSize();
+  }
+
+  public abstract class MeteringPointFactory {
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
+    method public static float getDefaultPointSize();
+  }
+
+  public final class Preview extends androidx.camera.core.UseCase {
+    method public int getTargetRotation();
+    method @UiThread public void setSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.SurfaceProvider?);
+    method @UiThread public void setSurfaceProvider(androidx.camera.core.Preview.SurfaceProvider?);
+  }
+
+  public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+    ctor public Preview.Builder();
+    method public androidx.camera.core.Preview build();
+    method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.Preview.Builder setTargetName(String);
+    method public androidx.camera.core.Preview.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.Preview.Builder setTargetRotation(int);
+  }
+
+  public static interface Preview.SurfaceProvider {
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+  }
+
+  public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public SurfaceOrientedMeteringPointFactory(float, float);
+    ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
+  }
+
+  public final class SurfaceRequest {
+    method public void addRequestCancellationListener(java.util.concurrent.Executor, Runnable);
+    method public android.util.Size getResolution();
+    method public void provideSurface(android.view.Surface, java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.core.SurfaceRequest.Result!>);
+    method public boolean willNotProvideSurface();
+  }
+
+  public abstract static class SurfaceRequest.Result {
+    method public abstract int getResultCode();
+    method public abstract android.view.Surface getSurface();
+    field public static final int RESULT_INVALID_SURFACE = 2; // 0x2
+    field public static final int RESULT_REQUEST_CANCELLED = 1; // 0x1
+    field public static final int RESULT_SURFACE_ALREADY_PROVIDED = 3; // 0x3
+    field public static final int RESULT_SURFACE_USED_SUCCESSFULLY = 0; // 0x0
+    field public static final int RESULT_WILL_NOT_PROVIDE_SURFACE = 4; // 0x4
+  }
+
+  public class TorchState {
+    field public static final int OFF = 0; // 0x0
+    field public static final int ON = 1; // 0x1
+  }
+
+  public abstract class UseCase {
+  }
+
+  public interface ZoomState {
+    method public float getLinearZoom();
+    method public float getMaxZoomRatio();
+    method public float getMinZoomRatio();
+    method public float getZoomRatio();
+  }
+
+}
+
diff --git a/camera/camera-core/api/public_plus_experimental_1.0.0-beta04.txt b/camera/camera-core/api/public_plus_experimental_1.0.0-beta04.txt
new file mode 100644
index 0000000..a18430b
--- /dev/null
+++ b/camera/camera-core/api/public_plus_experimental_1.0.0-beta04.txt
@@ -0,0 +1,289 @@
+// Signature format: 3.0
+package androidx.camera.core {
+
+  public class AspectRatio {
+    field public static final int RATIO_16_9 = 1; // 0x1
+    field public static final int RATIO_4_3 = 0; // 0x0
+  }
+
+  public interface Camera {
+    method public androidx.camera.core.CameraControl getCameraControl();
+    method public androidx.camera.core.CameraInfo getCameraInfo();
+  }
+
+  public interface CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+  }
+
+  public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+  }
+
+  public interface CameraInfo {
+    method public int getSensorRotationDegrees();
+    method public int getSensorRotationDegrees(int);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.ZoomState!> getZoomState();
+    method public boolean hasFlashUnit();
+  }
+
+  public final class CameraInfoUnavailableException extends java.lang.Exception {
+  }
+
+  public final class CameraSelector {
+    field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
+    field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
+    field public static final int LENS_FACING_BACK = 1; // 0x1
+    field public static final int LENS_FACING_FRONT = 0; // 0x0
+  }
+
+  public static final class CameraSelector.Builder {
+    ctor public CameraSelector.Builder();
+    method public androidx.camera.core.CameraSelector build();
+    method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
+  }
+
+  public final class CameraXConfig {
+  }
+
+  public static final class CameraXConfig.Builder {
+    method public androidx.camera.core.CameraXConfig build();
+    method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
+    method public androidx.camera.core.CameraXConfig.Builder setCameraExecutor(java.util.concurrent.Executor);
+  }
+
+  public static interface CameraXConfig.Provider {
+    method public androidx.camera.core.CameraXConfig getCameraXConfig();
+  }
+
+  public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraSelector, float, float);
+  }
+
+  @experimental.Experimental @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalGetImage {
+  }
+
+  public interface ExtendableBuilder<T> {
+    method public T build();
+  }
+
+  public final class FocusMeteringAction {
+    method public long getAutoCancelDurationInMillis();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAwb();
+    method public boolean isAutoCancelEnabled();
+    field public static final int FLAG_AE = 2; // 0x2
+    field public static final int FLAG_AF = 1; // 0x1
+    field public static final int FLAG_AWB = 4; // 0x4
+  }
+
+  public static class FocusMeteringAction.Builder {
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint);
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction build();
+    method public androidx.camera.core.FocusMeteringAction.Builder disableAutoCancel();
+    method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
+  }
+
+  public final class FocusMeteringResult {
+    method public boolean isFocusSuccessful();
+  }
+
+  public final class ImageAnalysis extends androidx.camera.core.UseCase {
+    method public void clearAnalyzer();
+    method public int getBackpressureStrategy();
+    method public int getImageQueueDepth();
+    method public int getTargetRotation();
+    method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method public void setTargetRotation(int);
+    field public static final int STRATEGY_BLOCK_PRODUCER = 1; // 0x1
+    field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
+  }
+
+  public static interface ImageAnalysis.Analyzer {
+    method public void analyze(androidx.camera.core.ImageProxy);
+  }
+
+  public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+    ctor public ImageAnalysis.Builder();
+    method public androidx.camera.core.ImageAnalysis build();
+    method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
+  }
+
+  public final class ImageCapture extends androidx.camera.core.UseCase {
+    method public int getCaptureMode();
+    method public int getFlashMode();
+    method public int getTargetRotation();
+    method public void setCropAspectRatio(android.util.Rational);
+    method public void setFlashMode(int);
+    method public void setTargetRotation(int);
+    method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    method public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    field public static final int CAPTURE_MODE_MAXIMIZE_QUALITY = 0; // 0x0
+    field public static final int CAPTURE_MODE_MINIMIZE_LATENCY = 1; // 0x1
+    field public static final int ERROR_CAMERA_CLOSED = 3; // 0x3
+    field public static final int ERROR_CAPTURE_FAILED = 2; // 0x2
+    field public static final int ERROR_FILE_IO = 1; // 0x1
+    field public static final int ERROR_INVALID_CAMERA = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int FLASH_MODE_AUTO = 0; // 0x0
+    field public static final int FLASH_MODE_OFF = 2; // 0x2
+    field public static final int FLASH_MODE_ON = 1; // 0x1
+  }
+
+  public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+    ctor public ImageCapture.Builder();
+    method public androidx.camera.core.ImageCapture build();
+    method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setFlashMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
+    method public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
+  }
+
+  public static final class ImageCapture.Metadata {
+    ctor public ImageCapture.Metadata();
+    method public android.location.Location? getLocation();
+    method public boolean isReversedHorizontal();
+    method public boolean isReversedVertical();
+    method public void setLocation(android.location.Location?);
+    method public void setReversedHorizontal(boolean);
+    method public void setReversedVertical(boolean);
+  }
+
+  public abstract static class ImageCapture.OnImageCapturedCallback {
+    ctor public ImageCapture.OnImageCapturedCallback();
+    method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
+    method public void onError(androidx.camera.core.ImageCaptureException);
+  }
+
+  public static interface ImageCapture.OnImageSavedCallback {
+    method public void onError(androidx.camera.core.ImageCaptureException);
+    method public void onImageSaved(androidx.camera.core.ImageCapture.OutputFileResults);
+  }
+
+  public static final class ImageCapture.OutputFileOptions {
+  }
+
+  public static final class ImageCapture.OutputFileOptions.Builder {
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.File);
+    ctor public ImageCapture.OutputFileOptions.Builder(android.content.ContentResolver, android.net.Uri, android.content.ContentValues);
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.OutputStream);
+    method public androidx.camera.core.ImageCapture.OutputFileOptions build();
+    method public androidx.camera.core.ImageCapture.OutputFileOptions.Builder setMetadata(androidx.camera.core.ImageCapture.Metadata);
+  }
+
+  public static class ImageCapture.OutputFileResults {
+    method public android.net.Uri? getSavedUri();
+  }
+
+  public class ImageCaptureException extends java.lang.Exception {
+    ctor public ImageCaptureException(int, String, Throwable?);
+    method public int getImageCaptureError();
+  }
+
+  public interface ImageInfo {
+    method public int getRotationDegrees();
+    method public long getTimestamp();
+  }
+
+  public interface ImageProxy extends java.lang.AutoCloseable {
+    method public void close();
+    method public android.graphics.Rect getCropRect();
+    method public int getFormat();
+    method public int getHeight();
+    method @androidx.camera.core.ExperimentalGetImage public android.media.Image? getImage();
+    method public androidx.camera.core.ImageInfo getImageInfo();
+    method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
+    method public int getWidth();
+    method public void setCropRect(android.graphics.Rect?);
+  }
+
+  public static interface ImageProxy.PlaneProxy {
+    method public java.nio.ByteBuffer getBuffer();
+    method public int getPixelStride();
+    method public int getRowStride();
+  }
+
+  public class MeteringPoint {
+    method public float getSize();
+  }
+
+  public abstract class MeteringPointFactory {
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
+    method public static float getDefaultPointSize();
+  }
+
+  public final class Preview extends androidx.camera.core.UseCase {
+    method public int getTargetRotation();
+    method @UiThread public void setSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.SurfaceProvider?);
+    method @UiThread public void setSurfaceProvider(androidx.camera.core.Preview.SurfaceProvider?);
+  }
+
+  public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+    ctor public Preview.Builder();
+    method public androidx.camera.core.Preview build();
+    method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.Preview.Builder setTargetName(String);
+    method public androidx.camera.core.Preview.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.Preview.Builder setTargetRotation(int);
+  }
+
+  public static interface Preview.SurfaceProvider {
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+  }
+
+  public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public SurfaceOrientedMeteringPointFactory(float, float);
+    ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
+  }
+
+  public final class SurfaceRequest {
+    method public void addRequestCancellationListener(java.util.concurrent.Executor, Runnable);
+    method public android.util.Size getResolution();
+    method public void provideSurface(android.view.Surface, java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.core.SurfaceRequest.Result!>);
+    method public boolean willNotProvideSurface();
+  }
+
+  public abstract static class SurfaceRequest.Result {
+    method public abstract int getResultCode();
+    method public abstract android.view.Surface getSurface();
+    field public static final int RESULT_INVALID_SURFACE = 2; // 0x2
+    field public static final int RESULT_REQUEST_CANCELLED = 1; // 0x1
+    field public static final int RESULT_SURFACE_ALREADY_PROVIDED = 3; // 0x3
+    field public static final int RESULT_SURFACE_USED_SUCCESSFULLY = 0; // 0x0
+    field public static final int RESULT_WILL_NOT_PROVIDE_SURFACE = 4; // 0x4
+  }
+
+  public class TorchState {
+    field public static final int OFF = 0; // 0x0
+    field public static final int ON = 1; // 0x1
+  }
+
+  public abstract class UseCase {
+  }
+
+  public interface ZoomState {
+    method public float getLinearZoom();
+    method public float getMaxZoomRatio();
+    method public float getMinZoomRatio();
+    method public float getZoomRatio();
+  }
+
+}
+
diff --git a/ui/ui-android-text/api/res-0.1.0-dev03.txt b/camera/camera-core/api/res-1.0.0-beta03.txt
similarity index 100%
rename from ui/ui-android-text/api/res-0.1.0-dev03.txt
rename to camera/camera-core/api/res-1.0.0-beta03.txt
diff --git a/ui/ui-android-text/api/res-0.1.0-dev04.txt b/camera/camera-core/api/res-1.0.0-beta04.txt
similarity index 100%
rename from ui/ui-android-text/api/res-0.1.0-dev04.txt
rename to camera/camera-core/api/res-1.0.0-beta04.txt
diff --git a/camera/camera-core/api/restricted_1.0.0-beta03.txt b/camera/camera-core/api/restricted_1.0.0-beta03.txt
new file mode 100644
index 0000000..4e20a67
--- /dev/null
+++ b/camera/camera-core/api/restricted_1.0.0-beta03.txt
@@ -0,0 +1,285 @@
+// Signature format: 3.0
+package androidx.camera.core {
+
+  public class AspectRatio {
+    field public static final int RATIO_16_9 = 1; // 0x1
+    field public static final int RATIO_4_3 = 0; // 0x0
+  }
+
+  public interface Camera {
+    method public androidx.camera.core.CameraControl getCameraControl();
+    method public androidx.camera.core.CameraInfo getCameraInfo();
+  }
+
+  public interface CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+  }
+
+  public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+  }
+
+  public interface CameraInfo {
+    method public int getSensorRotationDegrees();
+    method public int getSensorRotationDegrees(int);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.ZoomState!> getZoomState();
+    method public boolean hasFlashUnit();
+  }
+
+  public final class CameraInfoUnavailableException extends java.lang.Exception {
+  }
+
+  public final class CameraSelector {
+    field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
+    field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
+    field public static final int LENS_FACING_BACK = 1; // 0x1
+    field public static final int LENS_FACING_FRONT = 0; // 0x0
+  }
+
+  public static final class CameraSelector.Builder {
+    ctor public CameraSelector.Builder();
+    method public androidx.camera.core.CameraSelector build();
+    method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
+  }
+
+  public final class CameraXConfig {
+  }
+
+  public static final class CameraXConfig.Builder {
+    method public androidx.camera.core.CameraXConfig build();
+    method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
+    method public androidx.camera.core.CameraXConfig.Builder setCameraExecutor(java.util.concurrent.Executor);
+  }
+
+  public static interface CameraXConfig.Provider {
+    method public androidx.camera.core.CameraXConfig getCameraXConfig();
+  }
+
+  public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraSelector, float, float);
+  }
+
+  public interface ExtendableBuilder<T> {
+    method public T build();
+  }
+
+  public final class FocusMeteringAction {
+    method public long getAutoCancelDurationInMillis();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAwb();
+    method public boolean isAutoCancelEnabled();
+    field public static final int FLAG_AE = 2; // 0x2
+    field public static final int FLAG_AF = 1; // 0x1
+    field public static final int FLAG_AWB = 4; // 0x4
+  }
+
+  public static class FocusMeteringAction.Builder {
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint);
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction build();
+    method public androidx.camera.core.FocusMeteringAction.Builder disableAutoCancel();
+    method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
+  }
+
+  public final class FocusMeteringResult {
+    method public boolean isFocusSuccessful();
+  }
+
+  public final class ImageAnalysis extends androidx.camera.core.UseCase {
+    method public void clearAnalyzer();
+    method public int getBackpressureStrategy();
+    method public int getImageQueueDepth();
+    method public int getTargetRotation();
+    method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method public void setTargetRotation(int);
+    field public static final int STRATEGY_BLOCK_PRODUCER = 1; // 0x1
+    field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
+  }
+
+  public static interface ImageAnalysis.Analyzer {
+    method public void analyze(androidx.camera.core.ImageProxy);
+  }
+
+  public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+    ctor public ImageAnalysis.Builder();
+    method public androidx.camera.core.ImageAnalysis build();
+    method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
+  }
+
+  public final class ImageCapture extends androidx.camera.core.UseCase {
+    method public int getCaptureMode();
+    method public int getFlashMode();
+    method public int getTargetRotation();
+    method public void setCropAspectRatio(android.util.Rational);
+    method public void setFlashMode(int);
+    method public void setTargetRotation(int);
+    method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    method public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    field public static final int CAPTURE_MODE_MAXIMIZE_QUALITY = 0; // 0x0
+    field public static final int CAPTURE_MODE_MINIMIZE_LATENCY = 1; // 0x1
+    field public static final int ERROR_CAMERA_CLOSED = 3; // 0x3
+    field public static final int ERROR_CAPTURE_FAILED = 2; // 0x2
+    field public static final int ERROR_FILE_IO = 1; // 0x1
+    field public static final int ERROR_INVALID_CAMERA = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int FLASH_MODE_AUTO = 0; // 0x0
+    field public static final int FLASH_MODE_OFF = 2; // 0x2
+    field public static final int FLASH_MODE_ON = 1; // 0x1
+  }
+
+  public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+    ctor public ImageCapture.Builder();
+    method public androidx.camera.core.ImageCapture build();
+    method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setFlashMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
+    method public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
+  }
+
+  public static final class ImageCapture.Metadata {
+    ctor public ImageCapture.Metadata();
+    method public android.location.Location? getLocation();
+    method public boolean isReversedHorizontal();
+    method public boolean isReversedVertical();
+    method public void setLocation(android.location.Location?);
+    method public void setReversedHorizontal(boolean);
+    method public void setReversedVertical(boolean);
+  }
+
+  public abstract static class ImageCapture.OnImageCapturedCallback {
+    ctor public ImageCapture.OnImageCapturedCallback();
+    method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
+    method public void onError(androidx.camera.core.ImageCaptureException);
+  }
+
+  public static interface ImageCapture.OnImageSavedCallback {
+    method public void onError(androidx.camera.core.ImageCaptureException);
+    method public void onImageSaved(androidx.camera.core.ImageCapture.OutputFileResults);
+  }
+
+  public static final class ImageCapture.OutputFileOptions {
+  }
+
+  public static final class ImageCapture.OutputFileOptions.Builder {
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.File);
+    ctor public ImageCapture.OutputFileOptions.Builder(android.content.ContentResolver, android.net.Uri, android.content.ContentValues);
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.OutputStream);
+    method public androidx.camera.core.ImageCapture.OutputFileOptions build();
+    method public androidx.camera.core.ImageCapture.OutputFileOptions.Builder setMetadata(androidx.camera.core.ImageCapture.Metadata);
+  }
+
+  public static class ImageCapture.OutputFileResults {
+    method public android.net.Uri? getSavedUri();
+  }
+
+  public class ImageCaptureException extends java.lang.Exception {
+    ctor public ImageCaptureException(int, String, Throwable?);
+    method public int getImageCaptureError();
+  }
+
+  public interface ImageInfo {
+    method public int getRotationDegrees();
+    method public long getTimestamp();
+  }
+
+  public interface ImageProxy extends java.lang.AutoCloseable {
+    method public void close();
+    method public android.graphics.Rect getCropRect();
+    method public int getFormat();
+    method public int getHeight();
+    method public androidx.camera.core.ImageInfo getImageInfo();
+    method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
+    method public int getWidth();
+    method public void setCropRect(android.graphics.Rect?);
+  }
+
+  public static interface ImageProxy.PlaneProxy {
+    method public java.nio.ByteBuffer getBuffer();
+    method public int getPixelStride();
+    method public int getRowStride();
+  }
+
+  public class MeteringPoint {
+    method public float getSize();
+  }
+
+  public abstract class MeteringPointFactory {
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
+    method public static float getDefaultPointSize();
+  }
+
+  public final class Preview extends androidx.camera.core.UseCase {
+    method public int getTargetRotation();
+    method @UiThread public void setSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.SurfaceProvider?);
+    method @UiThread public void setSurfaceProvider(androidx.camera.core.Preview.SurfaceProvider?);
+  }
+
+  public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+    ctor public Preview.Builder();
+    method public androidx.camera.core.Preview build();
+    method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.Preview.Builder setTargetName(String);
+    method public androidx.camera.core.Preview.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.Preview.Builder setTargetRotation(int);
+  }
+
+  public static interface Preview.SurfaceProvider {
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+  }
+
+  public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public SurfaceOrientedMeteringPointFactory(float, float);
+    ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
+  }
+
+  public final class SurfaceRequest {
+    method public void addRequestCancellationListener(java.util.concurrent.Executor, Runnable);
+    method public android.util.Size getResolution();
+    method public void provideSurface(android.view.Surface, java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.core.SurfaceRequest.Result!>);
+    method public boolean willNotProvideSurface();
+  }
+
+  public abstract static class SurfaceRequest.Result {
+    method public abstract int getResultCode();
+    method public abstract android.view.Surface getSurface();
+    field public static final int RESULT_INVALID_SURFACE = 2; // 0x2
+    field public static final int RESULT_REQUEST_CANCELLED = 1; // 0x1
+    field public static final int RESULT_SURFACE_ALREADY_PROVIDED = 3; // 0x3
+    field public static final int RESULT_SURFACE_USED_SUCCESSFULLY = 0; // 0x0
+    field public static final int RESULT_WILL_NOT_PROVIDE_SURFACE = 4; // 0x4
+  }
+
+  public class TorchState {
+    field public static final int OFF = 0; // 0x0
+    field public static final int ON = 1; // 0x1
+  }
+
+  public abstract class UseCase {
+  }
+
+  public interface ZoomState {
+    method public float getLinearZoom();
+    method public float getMaxZoomRatio();
+    method public float getMinZoomRatio();
+    method public float getZoomRatio();
+  }
+
+}
+
diff --git a/camera/camera-core/api/restricted_1.0.0-beta04.txt b/camera/camera-core/api/restricted_1.0.0-beta04.txt
new file mode 100644
index 0000000..4e20a67
--- /dev/null
+++ b/camera/camera-core/api/restricted_1.0.0-beta04.txt
@@ -0,0 +1,285 @@
+// Signature format: 3.0
+package androidx.camera.core {
+
+  public class AspectRatio {
+    field public static final int RATIO_16_9 = 1; // 0x1
+    field public static final int RATIO_4_3 = 0; // 0x0
+  }
+
+  public interface Camera {
+    method public androidx.camera.core.CameraControl getCameraControl();
+    method public androidx.camera.core.CameraInfo getCameraInfo();
+  }
+
+  public interface CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+  }
+
+  public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+  }
+
+  public interface CameraInfo {
+    method public int getSensorRotationDegrees();
+    method public int getSensorRotationDegrees(int);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.ZoomState!> getZoomState();
+    method public boolean hasFlashUnit();
+  }
+
+  public final class CameraInfoUnavailableException extends java.lang.Exception {
+  }
+
+  public final class CameraSelector {
+    field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
+    field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
+    field public static final int LENS_FACING_BACK = 1; // 0x1
+    field public static final int LENS_FACING_FRONT = 0; // 0x0
+  }
+
+  public static final class CameraSelector.Builder {
+    ctor public CameraSelector.Builder();
+    method public androidx.camera.core.CameraSelector build();
+    method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
+  }
+
+  public final class CameraXConfig {
+  }
+
+  public static final class CameraXConfig.Builder {
+    method public androidx.camera.core.CameraXConfig build();
+    method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
+    method public androidx.camera.core.CameraXConfig.Builder setCameraExecutor(java.util.concurrent.Executor);
+  }
+
+  public static interface CameraXConfig.Provider {
+    method public androidx.camera.core.CameraXConfig getCameraXConfig();
+  }
+
+  public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraSelector, float, float);
+  }
+
+  public interface ExtendableBuilder<T> {
+    method public T build();
+  }
+
+  public final class FocusMeteringAction {
+    method public long getAutoCancelDurationInMillis();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAwb();
+    method public boolean isAutoCancelEnabled();
+    field public static final int FLAG_AE = 2; // 0x2
+    field public static final int FLAG_AF = 1; // 0x1
+    field public static final int FLAG_AWB = 4; // 0x4
+  }
+
+  public static class FocusMeteringAction.Builder {
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint);
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction build();
+    method public androidx.camera.core.FocusMeteringAction.Builder disableAutoCancel();
+    method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
+  }
+
+  public final class FocusMeteringResult {
+    method public boolean isFocusSuccessful();
+  }
+
+  public final class ImageAnalysis extends androidx.camera.core.UseCase {
+    method public void clearAnalyzer();
+    method public int getBackpressureStrategy();
+    method public int getImageQueueDepth();
+    method public int getTargetRotation();
+    method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method public void setTargetRotation(int);
+    field public static final int STRATEGY_BLOCK_PRODUCER = 1; // 0x1
+    field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
+  }
+
+  public static interface ImageAnalysis.Analyzer {
+    method public void analyze(androidx.camera.core.ImageProxy);
+  }
+
+  public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+    ctor public ImageAnalysis.Builder();
+    method public androidx.camera.core.ImageAnalysis build();
+    method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
+  }
+
+  public final class ImageCapture extends androidx.camera.core.UseCase {
+    method public int getCaptureMode();
+    method public int getFlashMode();
+    method public int getTargetRotation();
+    method public void setCropAspectRatio(android.util.Rational);
+    method public void setFlashMode(int);
+    method public void setTargetRotation(int);
+    method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    method public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    field public static final int CAPTURE_MODE_MAXIMIZE_QUALITY = 0; // 0x0
+    field public static final int CAPTURE_MODE_MINIMIZE_LATENCY = 1; // 0x1
+    field public static final int ERROR_CAMERA_CLOSED = 3; // 0x3
+    field public static final int ERROR_CAPTURE_FAILED = 2; // 0x2
+    field public static final int ERROR_FILE_IO = 1; // 0x1
+    field public static final int ERROR_INVALID_CAMERA = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int FLASH_MODE_AUTO = 0; // 0x0
+    field public static final int FLASH_MODE_OFF = 2; // 0x2
+    field public static final int FLASH_MODE_ON = 1; // 0x1
+  }
+
+  public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+    ctor public ImageCapture.Builder();
+    method public androidx.camera.core.ImageCapture build();
+    method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setFlashMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
+    method public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
+  }
+
+  public static final class ImageCapture.Metadata {
+    ctor public ImageCapture.Metadata();
+    method public android.location.Location? getLocation();
+    method public boolean isReversedHorizontal();
+    method public boolean isReversedVertical();
+    method public void setLocation(android.location.Location?);
+    method public void setReversedHorizontal(boolean);
+    method public void setReversedVertical(boolean);
+  }
+
+  public abstract static class ImageCapture.OnImageCapturedCallback {
+    ctor public ImageCapture.OnImageCapturedCallback();
+    method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
+    method public void onError(androidx.camera.core.ImageCaptureException);
+  }
+
+  public static interface ImageCapture.OnImageSavedCallback {
+    method public void onError(androidx.camera.core.ImageCaptureException);
+    method public void onImageSaved(androidx.camera.core.ImageCapture.OutputFileResults);
+  }
+
+  public static final class ImageCapture.OutputFileOptions {
+  }
+
+  public static final class ImageCapture.OutputFileOptions.Builder {
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.File);
+    ctor public ImageCapture.OutputFileOptions.Builder(android.content.ContentResolver, android.net.Uri, android.content.ContentValues);
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.OutputStream);
+    method public androidx.camera.core.ImageCapture.OutputFileOptions build();
+    method public androidx.camera.core.ImageCapture.OutputFileOptions.Builder setMetadata(androidx.camera.core.ImageCapture.Metadata);
+  }
+
+  public static class ImageCapture.OutputFileResults {
+    method public android.net.Uri? getSavedUri();
+  }
+
+  public class ImageCaptureException extends java.lang.Exception {
+    ctor public ImageCaptureException(int, String, Throwable?);
+    method public int getImageCaptureError();
+  }
+
+  public interface ImageInfo {
+    method public int getRotationDegrees();
+    method public long getTimestamp();
+  }
+
+  public interface ImageProxy extends java.lang.AutoCloseable {
+    method public void close();
+    method public android.graphics.Rect getCropRect();
+    method public int getFormat();
+    method public int getHeight();
+    method public androidx.camera.core.ImageInfo getImageInfo();
+    method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
+    method public int getWidth();
+    method public void setCropRect(android.graphics.Rect?);
+  }
+
+  public static interface ImageProxy.PlaneProxy {
+    method public java.nio.ByteBuffer getBuffer();
+    method public int getPixelStride();
+    method public int getRowStride();
+  }
+
+  public class MeteringPoint {
+    method public float getSize();
+  }
+
+  public abstract class MeteringPointFactory {
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
+    method public static float getDefaultPointSize();
+  }
+
+  public final class Preview extends androidx.camera.core.UseCase {
+    method public int getTargetRotation();
+    method @UiThread public void setSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.SurfaceProvider?);
+    method @UiThread public void setSurfaceProvider(androidx.camera.core.Preview.SurfaceProvider?);
+  }
+
+  public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+    ctor public Preview.Builder();
+    method public androidx.camera.core.Preview build();
+    method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.Preview.Builder setTargetName(String);
+    method public androidx.camera.core.Preview.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.Preview.Builder setTargetRotation(int);
+  }
+
+  public static interface Preview.SurfaceProvider {
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+  }
+
+  public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public SurfaceOrientedMeteringPointFactory(float, float);
+    ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
+  }
+
+  public final class SurfaceRequest {
+    method public void addRequestCancellationListener(java.util.concurrent.Executor, Runnable);
+    method public android.util.Size getResolution();
+    method public void provideSurface(android.view.Surface, java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.core.SurfaceRequest.Result!>);
+    method public boolean willNotProvideSurface();
+  }
+
+  public abstract static class SurfaceRequest.Result {
+    method public abstract int getResultCode();
+    method public abstract android.view.Surface getSurface();
+    field public static final int RESULT_INVALID_SURFACE = 2; // 0x2
+    field public static final int RESULT_REQUEST_CANCELLED = 1; // 0x1
+    field public static final int RESULT_SURFACE_ALREADY_PROVIDED = 3; // 0x3
+    field public static final int RESULT_SURFACE_USED_SUCCESSFULLY = 0; // 0x0
+    field public static final int RESULT_WILL_NOT_PROVIDE_SURFACE = 4; // 0x4
+  }
+
+  public class TorchState {
+    field public static final int OFF = 0; // 0x0
+    field public static final int ON = 1; // 0x1
+  }
+
+  public abstract class UseCase {
+  }
+
+  public interface ZoomState {
+    method public float getLinearZoom();
+    method public float getMaxZoomRatio();
+    method public float getMinZoomRatio();
+    method public float getZoomRatio();
+  }
+
+}
+
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java
index 54e0877..b1bc254 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java
@@ -98,7 +98,7 @@
         mFakeCameraFactory.setDefaultCameraIdForLensFacing(CAMERA_LENS_FACING, CAMERA_ID);
         mConfigBuilder =
                 new CameraXConfig.Builder()
-                        .setCameraFactoryProvider(ignored -> mFakeCameraFactory)
+                        .setCameraFactoryProvider((ignored0, ignored1) -> mFakeCameraFactory)
                         .setDeviceSurfaceManagerProvider(ignored ->
                                 new FakeCameraDeviceSurfaceManager())
                         .setUseCaseConfigFactoryProvider(ignored -> mUseCaseConfigFactory);
@@ -198,9 +198,9 @@
     @Test
     public void init_withDifferentCameraXConfig() {
         CameraFactory cameraFactory0 = new FakeCameraFactory();
-        CameraFactory.Provider cameraFactoryProvider0 = ignored -> cameraFactory0;
+        CameraFactory.Provider cameraFactoryProvider0 = (ignored0, ignored1) -> cameraFactory0;
         CameraFactory cameraFactory1 = new FakeCameraFactory();
-        CameraFactory.Provider cameraFactoryProvider1 = ignored -> cameraFactory1;
+        CameraFactory.Provider cameraFactoryProvider1 = (ignored0, ignored1) -> cameraFactory1;
 
         mConfigBuilder.setCameraFactoryProvider(cameraFactoryProvider0);
         CameraX.initialize(mContext, mConfigBuilder.build());
@@ -301,7 +301,7 @@
                 () -> cameraInternalFront);
         CameraXConfig.Builder appConfigBuilder =
                 new CameraXConfig.Builder()
-                        .setCameraFactoryProvider(ignored -> mFakeCameraFactory)
+                        .setCameraFactoryProvider((ignored0, ignored1) -> mFakeCameraFactory)
                         .setDeviceSurfaceManagerProvider(ignored ->
                                 new FakeCameraDeviceSurfaceManager())
                         .setUseCaseConfigFactoryProvider(ignored -> mUseCaseConfigFactory);
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/UseCaseAttachStateTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/UseCaseAttachStateTest.java
index 3c6610e..77140ee 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/UseCaseAttachStateTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/UseCaseAttachStateTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -45,7 +46,6 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mockito;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -54,9 +54,9 @@
 @LargeTest
 @RunWith(AndroidJUnit4.class)
 public class UseCaseAttachStateTest {
-    private final CameraDevice mMockCameraDevice = Mockito.mock(CameraDevice.class);
+    private final CameraDevice mMockCameraDevice = mock(CameraDevice.class);
     private final CameraCaptureSession mMockCameraCaptureSession =
-            Mockito.mock(CameraCaptureSession.class);
+            mock(CameraCaptureSession.class);
 
     private String mCameraId;
     private List<TestUseCase> mTestUseCases = new ArrayList<>();
@@ -65,9 +65,10 @@
     public void setUp() throws ExecutionException, InterruptedException {
         CameraXConfig cameraXConfig = FakeAppConfig.create();
         Context context = ApplicationProvider.getApplicationContext();
+        CameraThreadConfig mockThreadConfig = mock(CameraThreadConfig.class);
         CameraFactory cameraFactory = Preconditions.checkNotNull(
                 cameraXConfig.getCameraFactoryProvider(/*valueIfMissing=*/ null))
-                .newInstance(context);
+                .newInstance(context, mockThreadConfig);
         CameraX.initialize(context, cameraXConfig).get();
         try {
             mCameraId = cameraFactory.cameraIdForLensFacing(CameraSelector.LENS_FACING_BACK);
@@ -352,13 +353,13 @@
     }
 
     private static class TestUseCase extends FakeUseCase {
-        private final Surface mSurface = Mockito.mock(Surface.class);
+        private final Surface mSurface = mock(Surface.class);
         private final CameraDevice.StateCallback mDeviceStateCallback =
-                Mockito.mock(CameraDevice.StateCallback.class);
+                mock(CameraDevice.StateCallback.class);
         private final CameraCaptureSession.StateCallback mSessionStateCallback =
-                Mockito.mock(CameraCaptureSession.StateCallback.class);
+                mock(CameraCaptureSession.StateCallback.class);
         private final CameraCaptureCallback mCameraCaptureCallback =
-                Mockito.mock(CameraCaptureCallback.class);
+                mock(CameraCaptureCallback.class);
         private DeferrableSurface mDeferrableSurface;
 
         TestUseCase(FakeUseCaseConfig config, CameraSelector selector, String cameraId) {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraExecutor.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraExecutor.java
index 452951a..1813d25 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraExecutor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraExecutor.java
@@ -111,8 +111,6 @@
         Preconditions.checkNotNull(runnable);
 
         synchronized (mExecutorLock) {
-            Preconditions.checkState(!mThreadPoolExecutor.isShutdown(),
-                    "CameraExecutor is deinit");
             mThreadPoolExecutor.execute(runnable);
         }
     }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java
index 553195a..d435334 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java
@@ -20,6 +20,8 @@
 import android.content.Context;
 import android.content.res.Resources;
 import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Process;
 import android.util.Log;
 import android.util.Size;
 
@@ -35,6 +37,7 @@
 import androidx.camera.core.impl.CameraInfoInternal;
 import androidx.camera.core.impl.CameraInternal;
 import androidx.camera.core.impl.CameraRepository;
+import androidx.camera.core.impl.CameraThreadConfig;
 import androidx.camera.core.impl.SurfaceConfig;
 import androidx.camera.core.impl.UseCaseConfig;
 import androidx.camera.core.impl.UseCaseConfigFactory;
@@ -46,6 +49,7 @@
 import androidx.camera.core.impl.utils.futures.Futures;
 import androidx.camera.core.internal.UseCaseOccupancy;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
+import androidx.core.os.HandlerCompat;
 import androidx.core.util.Preconditions;
 import androidx.lifecycle.Lifecycle;
 import androidx.lifecycle.LifecycleOwner;
@@ -170,19 +174,30 @@
     private final Object mInitializeLock = new Object();
     private final UseCaseGroupRepository mUseCaseGroupRepository = new UseCaseGroupRepository();
     private final Executor mCameraExecutor;
+    private final Handler mSchedulerHandler;
+    @Nullable
+    private final HandlerThread mSchedulerThread;
     private CameraFactory mCameraFactory;
     private CameraDeviceSurfaceManager mSurfaceManager;
     private UseCaseConfigFactory mDefaultConfigFactory;
-    private Context mContext;
+    private Application mContext;
     @GuardedBy("mInitializeLock")
     private InternalInitState mInitState = InternalInitState.UNINITIALIZED;
     @GuardedBy("mInitializeLock")
     private ListenableFuture<Void> mShutdownInternalFuture = Futures.immediateFuture(null);
 
     /** Prevents construction. */
-    CameraX(@NonNull Executor executor) {
-        Preconditions.checkNotNull(executor);
-        mCameraExecutor = executor;
+    CameraX(@Nullable Executor executor, @Nullable Handler schedulerHandler) {
+        mCameraExecutor = executor == null ? new CameraExecutor() : executor;
+        if (schedulerHandler == null) {
+            mSchedulerThread = new HandlerThread(CameraXThreads.TAG + "scheduler",
+                    Process.THREAD_PRIORITY_BACKGROUND);
+            mSchedulerThread.start();
+            mSchedulerHandler = HandlerCompat.createAsync(mSchedulerThread.getLooper());
+        } else {
+            mSchedulerThread = null;
+            mSchedulerHandler = schedulerHandler;
+        }
     }
 
     /**
@@ -284,6 +299,10 @@
         // if the camera not found.
         CameraInternal camera = CameraX.getCameraWithCameraSelector(selectorBuilder.build());
 
+        if (useCases.length == 0) {
+            return camera;
+        }
+
         List<UseCase> originalUseCases = new ArrayList<>();
 
         // Collect original use cases bound to the camera
@@ -296,6 +315,7 @@
             }
         }
 
+        // Only do resolution calculation if UseCases were bound
         if (!UseCaseOccupancy.checkUseCaseLimitNotExceeded(originalUseCases,
                 Arrays.asList(useCases))) {
             throw new IllegalArgumentException("Attempting to bind too many ImageCapture or "
@@ -461,7 +481,6 @@
      * @param cameraSelector the camera selector
      * @return the camera id if camera exists or {@code null} if no camera can be resolved with
      * the camera selector
-     *
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
@@ -514,7 +533,7 @@
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
     @NonNull
-    public static CameraInfoInternal getCameraInfo(String cameraId) {
+    public static CameraInfoInternal getCameraInfo(@NonNull String cameraId) {
         CameraX cameraX = checkInitialized();
 
         return cameraX.getCameraRepository().getCamera(cameraId).getCameraInfoInternal();
@@ -549,7 +568,8 @@
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
     @Nullable
-    public static <C extends UseCaseConfig<?>> C getDefaultUseCaseConfig(Class<C> configType,
+    public static <C extends UseCaseConfig<?>> C getDefaultUseCaseConfig(
+            @NonNull Class<C> configType,
             @Nullable CameraInfo cameraInfo) {
         CameraX cameraX = checkInitialized();
 
@@ -583,13 +603,8 @@
         Preconditions.checkState(!sTargetInitialized, "Must call CameraX.shutdown() first.");
         sTargetInitialized = true;
 
-        Executor executor = cameraXConfig.getCameraExecutor(null);
-        // Set a default camera executor if not set.
-        if (executor == null) {
-            executor = new CameraExecutor();
-        }
-
-        CameraX cameraX = new CameraX(executor);
+        CameraX cameraX = new CameraX(cameraXConfig.getCameraExecutor(null),
+                cameraXConfig.getSchedulerHandler(null));
         sInstance = cameraX;
 
         sInitializeFuture = CallbackToFutureAdapter.getFuture(completer -> {
@@ -649,7 +664,7 @@
         }
         sTargetInitialized = false;
 
-        CameraX cameraX = sInstance;
+        CameraX cameraX = Preconditions.checkNotNull(sInstance);
         sInstance = null;
 
         // Do not use FutureChain to chain the initFuture, because FutureChain.transformAsync()
@@ -856,15 +871,10 @@
         ListenableFuture<CameraX> future = getInstance();
         try {
             return future.get(WAIT_INITIALIZED_TIMEOUT, TimeUnit.SECONDS);
-        } catch (ExecutionException e) {
-            throw new IllegalStateException(e);
-        } catch (TimeoutException e) {
-            throw new IllegalStateException(e);
-        } catch (InterruptedException e) {
-            // Throw exception when get interrupted because the initialization could not be
-            // finished yet.
+        } catch (ExecutionException | InterruptedException | TimeoutException e) {
             throw new IllegalStateException(e);
         }
+
     }
 
     private static Map<UseCase, Size> calculateSuggestedResolutions(
@@ -928,18 +938,20 @@
         return mDefaultConfigFactory;
     }
 
-    private ListenableFuture<Void> initInternal(Context context, CameraXConfig cameraXConfig) {
+    private ListenableFuture<Void> initInternal(@NonNull Context context,
+            @NonNull CameraXConfig cameraXConfig) {
         synchronized (mInitializeLock) {
             Preconditions.checkState(mInitState == InternalInitState.UNINITIALIZED,
                     "CameraX.initInternal() should only be called once per instance");
             mInitState = InternalInitState.INITIALIZING;
 
+            final Executor cameraExecutor = mCameraExecutor;
             return CallbackToFutureAdapter.getFuture(
                     completer -> {
-                        mCameraExecutor.execute(() -> {
+                        cameraExecutor.execute(() -> {
                             Exception e = null;
                             try {
-                                mContext = context.getApplicationContext();
+                                mContext = (Application) context.getApplicationContext();
                                 CameraFactory.Provider cameraFactoryProvider =
                                         cameraXConfig.getCameraFactoryProvider(null);
                                 if (cameraFactoryProvider == null) {
@@ -948,7 +960,13 @@
                                                     + "CameraFactory.");
                                     return;
                                 }
-                                mCameraFactory = cameraFactoryProvider.newInstance(context);
+
+                                CameraThreadConfig cameraThreadConfig =
+                                        CameraThreadConfig.create(mCameraExecutor,
+                                                mSchedulerHandler);
+
+                                mCameraFactory = cameraFactoryProvider.newInstance(context,
+                                        cameraThreadConfig);
 
                                 CameraDeviceSurfaceManager.Provider surfaceManagerProvider =
                                         cameraXConfig.getDeviceSurfaceManagerProvider(null);
@@ -970,8 +988,8 @@
                                 }
                                 mDefaultConfigFactory = configFactoryProvider.newInstance(context);
 
-                                if (mCameraExecutor instanceof CameraExecutor) {
-                                    CameraExecutor executor = (CameraExecutor) mCameraExecutor;
+                                if (cameraExecutor instanceof CameraExecutor) {
+                                    CameraExecutor executor = (CameraExecutor) cameraExecutor;
                                     executor.init(mCameraFactory);
                                 }
 
@@ -1013,11 +1031,17 @@
 
                                 // Deinit camera executor at last to avoid RejectExecutionException.
                                 future.addListener(() -> {
-                                    if (mCameraExecutor instanceof CameraExecutor) {
-                                        CameraExecutor executor = (CameraExecutor) mCameraExecutor;
-                                        executor.deinit();
+                                    if (mSchedulerThread != null) {
+                                        // Ensure we shutdown the camera executor before
+                                        // exiting the scheduler thread
+                                        if (mCameraExecutor instanceof CameraExecutor) {
+                                            CameraExecutor executor =
+                                                    (CameraExecutor) mCameraExecutor;
+                                            executor.deinit();
+                                        }
+                                        mSchedulerThread.quit();
+                                        completer.set(null);
                                     }
-                                    completer.set(null);
                                 }, mCameraExecutor);
                                 return "CameraX shutdownInternal";
                             }
@@ -1039,12 +1063,7 @@
 
     private UseCaseGroupLifecycleController getOrCreateUseCaseGroup(LifecycleOwner lifecycleOwner) {
         return mUseCaseGroupRepository.getOrCreateUseCaseGroup(
-                lifecycleOwner, new UseCaseGroupRepository.UseCaseGroupSetup() {
-                    @Override
-                    public void setup(UseCaseGroup useCaseGroup) {
-                        useCaseGroup.setListener(mCameraRepository);
-                    }
-                });
+                lifecycleOwner, useCaseGroup -> useCaseGroup.setListener(mCameraRepository));
     }
 
     private CameraRepository getCameraRepository() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraXConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraXConfig.java
index 942c0bf..c313920 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraXConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraXConfig.java
@@ -17,6 +17,7 @@
 package androidx.camera.core;
 
 import android.app.Application;
+import android.os.Handler;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -89,6 +90,10 @@
             Option.create(
                     "camerax.core.appConfig.cameraExecutor",
                     Executor.class);
+    static final Option<Handler> OPTION_SCHEDULER_HANDLER =
+            Option.create(
+                    "camerax.core.appConfig.schedulerHandler",
+                    Handler.class);
 
     // *********************************************************************************************
 
@@ -147,6 +152,17 @@
         return mConfig.retrieveOption(OPTION_CAMERA_EXECUTOR, valueIfMissing);
     }
 
+    /**
+     * Returns the scheduling handler.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    public Handler getSchedulerHandler(@Nullable Handler valueIfMissing) {
+        return mConfig.retrieveOption(OPTION_SCHEDULER_HANDLER, valueIfMissing);
+    }
+
     // Start of the default implementation of Config
     // *********************************************************************************************
 
@@ -324,10 +340,14 @@
         }
 
         /**
-         * Sets an executor which CameraX will use to initialize and shutdown.
+         * Sets an executor which CameraX will use to drive the camera stack.
          *
-         * <p>It is not necessary to set an executor for normal use.  If not set, CameraX will
-         * create and use a default internal executor.
+         * <p>This option can be used to override the default internal executor created by
+         * CameraX, and will be used by the implementation to drive all cameras.
+         *
+         * <p>It is not necessary to set an executor for normal use, and should only be used in
+         * applications with very specific threading requirements. If not set, CameraX will
+         * create and use an optimized default internal executor.
          */
         @NonNull
         public Builder setCameraExecutor(@NonNull Executor executor) {
@@ -335,6 +355,27 @@
             return this;
         }
 
+        /**
+         * Sets a handler that CameraX will use internally for scheduling future tasks.
+         *
+         * <p>This scheduler may also be used for legacy APIs which require a {@link Handler}. Tasks
+         * that are scheduled with this handler will always be executed by the camera executor. No
+         * business logic will be executed directly by this handler.
+         *
+         * <p>It is not necessary to set a scheduler handler for normal use, and should only be
+         * used in applications with very specific threading requirements. If not set, CameraX
+         * will create and use an optimized default internal handler.
+         *
+         * @see #setCameraExecutor(Executor)
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        public Builder setSchedulerHandler(@NonNull Handler handler) {
+            getMutableConfig().insertOption(OPTION_SCHEDULER_HANDLER, handler);
+            return this;
+        }
+
         @NonNull
         private MutableConfig getMutableConfig() {
             return mMutableConfig;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFactory.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFactory.java
index a83a434..30a3db5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFactory.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFactory.java
@@ -35,7 +35,8 @@
      */
     interface Provider {
         /** Creates a new, initialized instance of a CameraFactory. */
-        @NonNull CameraFactory newInstance(@NonNull Context context);
+        @NonNull CameraFactory newInstance(@NonNull Context context,
+                @NonNull CameraThreadConfig threadConfig);
     }
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraThreadConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraThreadConfig.java
new file mode 100644
index 0000000..72f263f
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraThreadConfig.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.core.impl;
+
+import android.os.Handler;
+
+import androidx.annotation.NonNull;
+
+import com.google.auto.value.AutoValue;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Configuration options for threads used by the camera stack implementation.
+ */
+@AutoValue
+public abstract class CameraThreadConfig {
+
+    /**
+     * Creates a thread configuration given an executor and a scheduling handler.
+     * @param cameraExecutor Executor used to run all camera-related tasks.
+     * @param schedulerHandler Handler used for scheduling future tasks (such as with a delay)
+     *                          and for legacy APIs that require a handler. Tasks that are
+     *                          scheduled with this handler should always be executed by
+     *                          cameraExecutor. No business logic should be executed directly by
+     *                          this handler.
+     * @return the camera thread configuration.
+     */
+    @NonNull
+    public static CameraThreadConfig create(@NonNull Executor cameraExecutor,
+            @NonNull Handler schedulerHandler) {
+        return new AutoValue_CameraThreadConfig(cameraExecutor, schedulerHandler);
+    }
+
+    /**
+     * Returns the executor used to run all camera-related tasks.
+     */
+    @NonNull
+    public abstract Executor getCameraExecutor();
+
+    /**
+     * Returns the handler used for scheduling future tasks (such as with a delay).
+     *
+     * <p>This scheduler may also be used for legacy APIs which require a {@link Handler}. Tasks
+     * that are scheduled with this handler should always be executed by cameraExecutor. No
+     * business logic should be executed directly by this handler.
+     */
+    @NonNull
+    public abstract Handler getSchedulerHandler();
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/LiveDataObservable.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/LiveDataObservable.java
index c120c40..780dc69 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/LiveDataObservable.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/LiveDataObservable.java
@@ -210,6 +210,13 @@
         public Throwable getError() {
             return mError;
         }
+
+        @Override
+        @NonNull
+        public String toString() {
+            return "[Result: <" + (completedSuccessfully() ? "Value: " + mValue :
+                    "Error: " + mError) + ">]";
+        }
     }
 
     private static final class LiveDataObserverAdapter<T> implements
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/ThreadConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/ThreadConfig.java
index 7879917..05aaa5f 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/ThreadConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/ThreadConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * 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.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/UseCaseOccupancy.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/UseCaseOccupancy.java
index c25f413..73bc504 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/UseCaseOccupancy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/UseCaseOccupancy.java
@@ -46,10 +46,6 @@
         int imageCaptureCount = 0;
         int videoCaptureCount = 0;
 
-        if (newUseCases.isEmpty()) {
-            throw new IllegalArgumentException("No new use cases to be bound.");
-        }
-
         for (UseCase useCase : originalUseCases) {
             if (useCase instanceof ImageCapture) {
                 imageCaptureCount++;
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/CameraExecutorTest.java b/camera/camera-core/src/test/java/androidx/camera/core/CameraExecutorTest.java
index 239c9ae..99775c1 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/CameraExecutorTest.java
+++ b/camera/camera-core/src/test/java/androidx/camera/core/CameraExecutorTest.java
@@ -36,6 +36,8 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.internal.DoNotInstrument;
 
+import java.util.concurrent.RejectedExecutionException;
+
 @SmallTest
 @RunWith(RobolectricTestRunner.class)
 @DoNotInstrument
@@ -88,7 +90,7 @@
         blockRun1.unblock();
     }
 
-    @Test(expected = IllegalStateException.class)
+    @Test(expected = RejectedExecutionException.class)
     public void canNotExecuteAfterDeinit() {
         mCameraExecutor.deinit();
         mCameraExecutor.execute(mock(Runnable.class));
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.java b/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.java
index ba77088..5771a77 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.java
+++ b/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.java
@@ -88,7 +88,7 @@
         cameraFactory.setDefaultCameraIdForLensFacing(CameraSelector.LENS_FACING_FRONT, FRONT_ID);
         CameraXConfig.Builder appConfigBuilder =
                 new CameraXConfig.Builder()
-                        .setCameraFactoryProvider(ignored -> cameraFactory)
+                        .setCameraFactoryProvider((ignored1, ignored2) -> cameraFactory)
                         .setDeviceSurfaceManagerProvider(surfaceManagerProvider)
                         .setUseCaseConfigFactoryProvider(configFactoryProvider);
         CameraX.initialize(context, appConfigBuilder.build()).get();
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/ImageAnalysisTest.java b/camera/camera-core/src/test/java/androidx/camera/core/ImageAnalysisTest.java
index 75a545c..4fe0146 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/ImageAnalysisTest.java
+++ b/camera/camera-core/src/test/java/androidx/camera/core/ImageAnalysisTest.java
@@ -90,7 +90,7 @@
 
         ShadowImageReader.clear();
 
-        CameraFactory.Provider cameraFactoryProvider = ignored -> {
+        CameraFactory.Provider cameraFactoryProvider = (ignored1, ignored2) -> {
             FakeCameraFactory cameraFactory = new FakeCameraFactory();
             cameraFactory.insertDefaultBackCamera(ShadowCameraX.DEFAULT_CAMERA_ID,
                     () -> new FakeCamera(ShadowCameraX.DEFAULT_CAMERA_ID));
diff --git a/camera/camera-lifecycle/api/1.0.0-beta03.txt b/camera/camera-lifecycle/api/1.0.0-beta03.txt
new file mode 100644
index 0000000..88187bc6
--- /dev/null
+++ b/camera/camera-lifecycle/api/1.0.0-beta03.txt
@@ -0,0 +1,14 @@
+// Signature format: 3.0
+package androidx.camera.lifecycle {
+
+  public final class ProcessCameraProvider {
+    method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method @MainThread public void unbind(androidx.camera.core.UseCase!...);
+    method @MainThread public void unbindAll();
+  }
+
+}
+
diff --git a/camera/camera-lifecycle/api/1.0.0-beta04.txt b/camera/camera-lifecycle/api/1.0.0-beta04.txt
new file mode 100644
index 0000000..88187bc6
--- /dev/null
+++ b/camera/camera-lifecycle/api/1.0.0-beta04.txt
@@ -0,0 +1,14 @@
+// Signature format: 3.0
+package androidx.camera.lifecycle {
+
+  public final class ProcessCameraProvider {
+    method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method @MainThread public void unbind(androidx.camera.core.UseCase!...);
+    method @MainThread public void unbindAll();
+  }
+
+}
+
diff --git a/camera/camera-lifecycle/api/public_plus_experimental_1.0.0-beta03.txt b/camera/camera-lifecycle/api/public_plus_experimental_1.0.0-beta03.txt
new file mode 100644
index 0000000..88187bc6
--- /dev/null
+++ b/camera/camera-lifecycle/api/public_plus_experimental_1.0.0-beta03.txt
@@ -0,0 +1,14 @@
+// Signature format: 3.0
+package androidx.camera.lifecycle {
+
+  public final class ProcessCameraProvider {
+    method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method @MainThread public void unbind(androidx.camera.core.UseCase!...);
+    method @MainThread public void unbindAll();
+  }
+
+}
+
diff --git a/camera/camera-lifecycle/api/public_plus_experimental_1.0.0-beta04.txt b/camera/camera-lifecycle/api/public_plus_experimental_1.0.0-beta04.txt
new file mode 100644
index 0000000..88187bc6
--- /dev/null
+++ b/camera/camera-lifecycle/api/public_plus_experimental_1.0.0-beta04.txt
@@ -0,0 +1,14 @@
+// Signature format: 3.0
+package androidx.camera.lifecycle {
+
+  public final class ProcessCameraProvider {
+    method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method @MainThread public void unbind(androidx.camera.core.UseCase!...);
+    method @MainThread public void unbindAll();
+  }
+
+}
+
diff --git a/ui/ui-android-text/api/res-0.1.0-dev03.txt b/camera/camera-lifecycle/api/res-1.0.0-beta03.txt
similarity index 100%
copy from ui/ui-android-text/api/res-0.1.0-dev03.txt
copy to camera/camera-lifecycle/api/res-1.0.0-beta03.txt
diff --git a/ui/ui-android-text/api/res-0.1.0-dev04.txt b/camera/camera-lifecycle/api/res-1.0.0-beta04.txt
similarity index 100%
copy from ui/ui-android-text/api/res-0.1.0-dev04.txt
copy to camera/camera-lifecycle/api/res-1.0.0-beta04.txt
diff --git a/camera/camera-lifecycle/api/restricted_1.0.0-beta03.txt b/camera/camera-lifecycle/api/restricted_1.0.0-beta03.txt
new file mode 100644
index 0000000..88187bc6
--- /dev/null
+++ b/camera/camera-lifecycle/api/restricted_1.0.0-beta03.txt
@@ -0,0 +1,14 @@
+// Signature format: 3.0
+package androidx.camera.lifecycle {
+
+  public final class ProcessCameraProvider {
+    method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method @MainThread public void unbind(androidx.camera.core.UseCase!...);
+    method @MainThread public void unbindAll();
+  }
+
+}
+
diff --git a/camera/camera-lifecycle/api/restricted_1.0.0-beta04.txt b/camera/camera-lifecycle/api/restricted_1.0.0-beta04.txt
new file mode 100644
index 0000000..88187bc6
--- /dev/null
+++ b/camera/camera-lifecycle/api/restricted_1.0.0-beta04.txt
@@ -0,0 +1,14 @@
+// Signature format: 3.0
+package androidx.camera.lifecycle {
+
+  public final class ProcessCameraProvider {
+    method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method @MainThread public void unbind(androidx.camera.core.UseCase!...);
+    method @MainThread public void unbindAll();
+  }
+
+}
+
diff --git a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
index 3414d7f..d9fd6fe 100644
--- a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
+++ b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
@@ -16,12 +16,15 @@
 
 package androidx.camera.lifecycle
 
+import androidx.camera.core.CameraSelector
 import androidx.camera.testing.fakes.FakeAppConfig
+import androidx.camera.testing.fakes.FakeLifecycleOwner
 import androidx.concurrent.futures.await
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.filters.SmallTest
 import androidx.testutils.assertThrows
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.MainScope
 import kotlinx.coroutines.runBlocking
 import org.junit.Test
 
@@ -29,6 +32,7 @@
 class ProcessCameraProviderTest {
 
     private val context = ApplicationProvider.getApplicationContext() as android.content.Context
+    private val lifecycleOwner = FakeLifecycleOwner()
 
     @Test
     fun uninitializedGetInstance_throwsISE() {
@@ -48,4 +52,16 @@
             provider.shutdown().await()
         }
     }
+
+    @Test
+    fun canRetrieveCamera_withZeroUseCases() {
+        ProcessCameraProvider.initializeInstance(context, FakeAppConfig.create())
+        runBlocking(MainScope().coroutineContext) {
+            val provider = ProcessCameraProvider.getInstance(context).await()
+            val camera =
+                provider.bindToLifecycle(lifecycleOwner, CameraSelector.DEFAULT_BACK_CAMERA)
+            assertThat(camera).isNotNull()
+            provider.shutdown().await()
+        }
+    }
 }
\ No newline at end of file
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java
index 06d699a..f0a9de3 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java
@@ -274,16 +274,7 @@
      * @throws IllegalStateException if the CAMERA permission is not currently granted.
      */
     public static boolean hasCameraWithLensFacing(@CameraSelector.LensFacing int lensFacing) {
-        @SupportedLensFacingInt
-        int lensFacingInteger = getLensFacingIntFromEnum(lensFacing);
-        for (String cameraId : getCameraIdListOrThrow()) {
-            CameraCharacteristics characteristics = getCameraCharacteristicsOrThrow(cameraId);
-            Integer cameraLensFacing = characteristics.get(CameraCharacteristics.LENS_FACING);
-            if (cameraLensFacing != null && cameraLensFacing.intValue() == lensFacingInteger) {
-                return true;
-            }
-        }
-        return false;
+        return getCameraCharacteristics(lensFacing) != null;
     }
 
     /**
@@ -311,6 +302,27 @@
     }
 
     /**
+     * Gets the {@link CameraCharacteristics} by specified lens facing if possible.
+     *
+     * @return the camera characteristics for the given lens facing or {@code null} if it can't
+     * be retrieved.
+     */
+    @Nullable
+    public static CameraCharacteristics getCameraCharacteristics(
+            @CameraSelector.LensFacing int lensFacing) {
+        @SupportedLensFacingInt
+        int lensFacingInteger = getLensFacingIntFromEnum(lensFacing);
+        for (String cameraId : getCameraIdListOrThrow()) {
+            CameraCharacteristics characteristics = getCameraCharacteristicsOrThrow(cameraId);
+            Integer cameraLensFacing = characteristics.get(CameraCharacteristics.LENS_FACING);
+            if (cameraLensFacing != null && cameraLensFacing.intValue() == lensFacingInteger) {
+                return characteristics;
+            }
+        }
+        return null;
+    }
+
+    /**
      * The current lens facing directions supported by CameraX, as defined the
      * {@link CameraMetadata}.
      */
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeAppConfig.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeAppConfig.java
index 3be2a2f..96be3b1f 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeAppConfig.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeAppConfig.java
@@ -38,7 +38,7 @@
     /** Generates a fake {@link CameraXConfig}. */
     @NonNull
     public static CameraXConfig create() {
-        CameraFactory.Provider cameraFactoryProvider = ignored -> {
+        CameraFactory.Provider cameraFactoryProvider = (ignored1, ignored2) -> {
             FakeCameraFactory cameraFactory = new FakeCameraFactory();
             cameraFactory.insertCamera(CameraSelector.LENS_FACING_BACK, CAMERA_ID_0,
                     () -> new FakeCamera(CAMERA_ID_0, null,
diff --git a/camera/camera-view/src/test/java/androidx/camera/view/PreviewViewMeteringPointFactoryTest.java b/camera/camera-view/src/test/java/androidx/camera/view/PreviewViewMeteringPointFactoryTest.java
index 385afa2..af68e0d 100644
--- a/camera/camera-view/src/test/java/androidx/camera/view/PreviewViewMeteringPointFactoryTest.java
+++ b/camera/camera-view/src/test/java/androidx/camera/view/PreviewViewMeteringPointFactoryTest.java
@@ -49,8 +49,6 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mockito;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
 import org.robolectric.ParameterizedRobolectricTestRunner;
 import org.robolectric.annotation.internal.DoNotInstrument;
 
@@ -114,7 +112,7 @@
 
         CameraXConfig cameraXConfig =
                 new CameraXConfig.Builder()
-                        .setCameraFactoryProvider(ignored -> fakeCameraFactory)
+                        .setCameraFactoryProvider((ignored0, ignored1) -> fakeCameraFactory)
                         .setDeviceSurfaceManagerProvider(surfaceManagerProvider)
                         .setUseCaseConfigFactoryProvider(configFactoryProvider)
                         .build();
@@ -472,14 +470,11 @@
 
     private void mockDisplay(int rotation, int displayWidth, int displayHeight) {
         when(mDisplay.getRotation()).thenReturn(rotation);
-        doAnswer(new Answer() {
-            @Override
-            public Void answer(InvocationOnMock invocation) throws Throwable {
-                Point point = invocation.getArgument(0);
-                point.x = displayWidth;
-                point.y = displayHeight;
-                return null;
-            }
+        doAnswer(invocation -> {
+            Point point = invocation.getArgument(0);
+            point.x = displayWidth;
+            point.y = displayHeight;
+            return null;
         }).when(mDisplay).getRealSize(any(Point.class));
     }
 
diff --git a/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/PreviewViewFragmentTest.java b/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/PreviewViewFragmentTest.java
index d0cde36..6fc3bda 100644
--- a/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/PreviewViewFragmentTest.java
+++ b/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/PreviewViewFragmentTest.java
@@ -28,6 +28,7 @@
 import androidx.camera.core.CameraSelector;
 import androidx.camera.testing.CameraUtil;
 import androidx.camera.testing.CoreAppTestUtil;
+import androidx.camera.view.PreviewView;
 import androidx.fragment.app.testing.FragmentScenario;
 import androidx.lifecycle.Lifecycle;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -70,8 +71,7 @@
 
     @Test
     public void checkPreviewUpdatedAfterDestroyRecreate() {
-        final FragmentScenario<PreviewViewFragment> scenario = FragmentScenario.launchInContainer(
-                PreviewViewFragment.class, null, R.style.AppTheme, null);
+        final FragmentScenario<PreviewViewFragment> scenario = createScenario();
         assertPreviewUpdating(scenario);
 
         // Recreate fragment
@@ -81,8 +81,7 @@
 
     @Test
     public void checkPreviewUpdatedAfterStopResume_3Times() {
-        final FragmentScenario<PreviewViewFragment> scenario = FragmentScenario.launchInContainer(
-                PreviewViewFragment.class, null, R.style.AppTheme, null);
+        final FragmentScenario<PreviewViewFragment> scenario = createScenario();
         assertPreviewUpdating(scenario);
 
         // Stop the fragment
@@ -109,8 +108,7 @@
         assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_FRONT));
         assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK));
 
-        final FragmentScenario<PreviewViewFragment> scenario = FragmentScenario.launchInContainer(
-                PreviewViewFragment.class, null, R.style.AppTheme, null);
+        final FragmentScenario<PreviewViewFragment> scenario = createScenario();
         assertPreviewUpdating(scenario);
 
         // Toggle camera
@@ -123,11 +121,79 @@
         assertPreviewUpdating(scenario);
     }
 
-    /**
-     * Waits for the preview to update at least {@link #PREVIEW_UPDATE_COUNT} times, if it does,
-     * the assertion succeeds, otherwise it fails after the timeout {@link #WAIT_TIMEOUT}.
-     */
+    @Test
+    public void checkPreviewNotUpdatedAfterPreviewUnbound() {
+        final FragmentScenario<PreviewViewFragment> scenario = createScenario();
+        assertPreviewUpdating(scenario);
+
+        // Toggle visibility to unbind preview
+        onView(withId(R.id.toggle_visibility)).perform(click());
+        assertPreviewNotUpdating(scenario);
+    }
+
+    @Test
+    public void checkPreviewUpdatedWhenSamePreviewViewAttachedToMultiplePreviewUseCases() {
+        final FragmentScenario<PreviewViewFragment> scenario = createScenario();
+        assertPreviewUpdating(scenario);
+
+        // Toggle visibility to unbind preview
+        onView(withId(R.id.toggle_visibility)).perform(click());
+        // Toggle visibility to bind new preview
+        onView(withId(R.id.toggle_visibility)).perform(click());
+        assertPreviewUpdating(scenario);
+    }
+
+    @Test
+    public void checkSameScaleTypeAfterStopResume() {
+        final FragmentScenario<PreviewViewFragment> scenario = createScenario();
+        assertPreviewUpdating(scenario);
+
+        getPreviewView(scenario).setScaleType(PreviewView.ScaleType.FIT_END);
+
+        // Stop the fragment
+        scenario.moveToState(Lifecycle.State.CREATED);
+        // Resume the fragment
+        scenario.moveToState(Lifecycle.State.RESUMED);
+        assertThat(getPreviewView(scenario).getScaleType()).isEqualTo(
+                PreviewView.ScaleType.FIT_END);
+    }
+
+    @Test
+    public void checkSameImplementationModeAfterStopResume() {
+        final FragmentScenario<PreviewViewFragment> scenario = createScenario();
+        assertPreviewUpdating(scenario);
+
+        getPreviewView(scenario).setPreferredImplementationMode(
+                PreviewView.ImplementationMode.TEXTURE_VIEW);
+
+        // Stop the fragment
+        scenario.moveToState(Lifecycle.State.CREATED);
+        // Resume the fragment
+        scenario.moveToState(Lifecycle.State.RESUMED);
+        assertThat(getPreviewView(scenario).getPreferredImplementationMode()).isEqualTo(
+                PreviewView.ImplementationMode.TEXTURE_VIEW);
+    }
+
+    @NonNull
+    private FragmentScenario<PreviewViewFragment> createScenario() {
+        return FragmentScenario.launchInContainer(PreviewViewFragment.class, null, R.style.AppTheme,
+                null);
+    }
+
     private void assertPreviewUpdating(@NonNull FragmentScenario<PreviewViewFragment> scenario) {
+        assertPreviewUpdateState(scenario, true);
+    }
+
+    private void assertPreviewNotUpdating(@NonNull FragmentScenario<PreviewViewFragment> scenario) {
+        assertPreviewUpdateState(scenario, false);
+    }
+
+    /**
+     * Waits at most for the duration {@link #WAIT_TIMEOUT} for the preview to update at least
+     * {@link #PREVIEW_UPDATE_COUNT} times.
+     */
+    private void assertPreviewUpdateState(@NonNull FragmentScenario<PreviewViewFragment> scenario,
+            boolean shouldPreviewUpdate) {
         AtomicReference<PreviewViewFragment> fragment = new AtomicReference<>();
         scenario.onFragment(fragment::set);
 
@@ -140,6 +206,21 @@
         } catch (InterruptedException e) {
             isPreviewUpdating = false;
         }
-        assertThat(isPreviewUpdating).isTrue();
+
+        if (shouldPreviewUpdate) {
+            assertThat(isPreviewUpdating).isTrue();
+        } else {
+            assertThat(isPreviewUpdating).isFalse();
+        }
+    }
+
+    @NonNull
+    private PreviewView getPreviewView(@NonNull FragmentScenario<PreviewViewFragment> scenario) {
+        final AtomicReference<PreviewView> previewView = new AtomicReference<>();
+        scenario.onFragment(fragment -> {
+            previewView.set(
+                    (PreviewView) fragment.requireActivity().findViewById(R.id.preview_view));
+        });
+        return previewView.get();
     }
 }
diff --git a/cardview/cardview/build.gradle b/cardview/cardview/build.gradle
index 8a40ae5..e190825 100644
--- a/cardview/cardview/build.gradle
+++ b/cardview/cardview/build.gradle
@@ -9,7 +9,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    implementation(project(":core:core"))
+    implementation("androidx.core:core:1.3.0-beta01")
 }
 
 androidx {
diff --git a/collection/collection/src/main/java/androidx/collection/ArraySet.java b/collection/collection/src/main/java/androidx/collection/ArraySet.java
index 08b7413..541bd0a 100644
--- a/collection/collection/src/main/java/androidx/collection/ArraySet.java
+++ b/collection/collection/src/main/java/androidx/collection/ArraySet.java
@@ -50,8 +50,6 @@
 public final class ArraySet<E> implements Collection<E>, Set<E> {
     private static final boolean DEBUG = false;
     private static final String TAG = "ArraySet";
-    private static final int[] INT = new int[0];
-    private static final Object[] OBJECT = new Object[0];
 
     /**
      * The minimum amount by which the capacity of a ArraySet will increase.
@@ -88,15 +86,14 @@
     int mSize;
     private MapCollections<E, E> mCollections;
 
-    private int binarySearch(int[] hashes, int hash) {
+    private int binarySearch(int hash) {
         try {
-            return ContainerHelpers.binarySearch(hashes, mSize, hash);
+            return ContainerHelpers.binarySearch(mHashes, mSize, hash);
         } catch (ArrayIndexOutOfBoundsException e) {
             throw new ConcurrentModificationException();
         }
     }
 
-
     private int indexOf(Object key, int hash) {
         final int N = mSize;
 
@@ -105,7 +102,7 @@
             return ~0;
         }
 
-        int index = binarySearch(mHashes, hash);
+        int index = binarySearch(hash);
 
         // If the hash code wasn't found, then we have no entry for this key.
         if (index < 0) {
@@ -143,7 +140,7 @@
             return ~0;
         }
 
-        int index = binarySearch(mHashes, 0);
+        int index = binarySearch(0);
 
         // If the hash code wasn't found, then we have no entry for this key.
         if (index < 0) {
@@ -290,8 +287,8 @@
     @SuppressWarnings("NullAway") // allocArrays initializes mHashes and mArray.
     public ArraySet(int capacity) {
         if (capacity == 0) {
-            mHashes = INT;
-            mArray = OBJECT;
+            mHashes = ContainerHelpers.EMPTY_INTS;
+            mArray = ContainerHelpers.EMPTY_OBJECTS;
         } else {
             allocArrays(capacity);
         }
@@ -327,8 +324,8 @@
             final int[] ohashes = mHashes;
             final Object[] oarray = mArray;
             final int osize = mSize;
-            mHashes = INT;
-            mArray = OBJECT;
+            mHashes = ContainerHelpers.EMPTY_INTS;
+            mArray = ContainerHelpers.EMPTY_OBJECTS;
             mSize = 0;
             freeArrays(ohashes, oarray, osize);
         }
diff --git a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/plugins/kotlin/AbstractLoweringTests.kt b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/plugins/kotlin/AbstractLoweringTests.kt
index eabfe47..7b8dd9f 100644
--- a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/plugins/kotlin/AbstractLoweringTests.kt
+++ b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/plugins/kotlin/AbstractLoweringTests.kt
@@ -105,7 +105,7 @@
 
         return compose {
             val values = valuesFactory()
-            val arguments = values.map { it.value as Any }.toTypedArray()
+            val arguments = values.map { it.value }.toTypedArray()
             testMethod.invoke(instanceOfClass, *arguments, it)
         }
     }
diff --git a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/plugins/kotlin/KtxCrossModuleTests.kt b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/plugins/kotlin/KtxCrossModuleTests.kt
index 99f35e2..ec2c295 100644
--- a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/plugins/kotlin/KtxCrossModuleTests.kt
+++ b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/plugins/kotlin/KtxCrossModuleTests.kt
@@ -42,7 +42,7 @@
     @Test
     fun testCrossinlineEmittable(): Unit = ensureSetup {
         compile(
-            "TestG", mapOf(
+            mapOf(
                 "library module" to mapOf(
                     "x/A.kt" to """
                     package x
@@ -76,7 +76,7 @@
     @Test
     fun testConstCrossModule(): Unit = ensureSetup {
         compile(
-            "TestG", mapOf(
+            mapOf(
                 "library module" to mapOf(
                     "x/A.kt" to """
                     package x
@@ -105,7 +105,7 @@
     @Test
     fun testNonCrossinlineComposable(): Unit = ensureSetup {
         compile(
-            "TestG", mapOf(
+            mapOf(
                 "library module" to mapOf(
                     "x/A.kt" to """
                     package x
@@ -138,7 +138,7 @@
     @Test
     fun testNonCrossinlineComposableNoGenerics(): Unit = ensureSetup {
         compile(
-            "TestG", mapOf(
+            mapOf(
                 "library module" to mapOf(
                     "x/A.kt" to """
                     package x
@@ -174,7 +174,7 @@
     @Test
     fun testRemappedTypes(): Unit = ensureSetup {
         compile(
-            "TestG", mapOf(
+            mapOf(
                 "library module" to mapOf(
                     "x/A.kt" to """
                     package x
@@ -210,7 +210,7 @@
     @Test
     fun testInlineIssue(): Unit = ensureSetup {
         compile(
-            "TestG", mapOf(
+            mapOf(
                 "library module" to mapOf(
                     "x/C.kt" to """
                     fun ghi() {
@@ -239,7 +239,7 @@
     @Test
     fun testInlineComposableProperty(): Unit = ensureSetup {
         compile(
-            "TestG", mapOf(
+            mapOf(
                 "library module" to mapOf(
                     "x/A.kt" to """
                     package x
@@ -272,7 +272,7 @@
     @Test
     fun testNestedInlineIssue(): Unit = ensureSetup {
         compile(
-            "TestG", mapOf(
+            mapOf(
                 "library module" to mapOf(
                     "x/C.kt" to """
                     fun ghi() {
@@ -309,7 +309,7 @@
     @Test
     fun testComposerIntrinsicInline(): Unit = ensureSetup {
         compile(
-            "TestG", mapOf(
+            mapOf(
                 "library module" to mapOf(
                     "x/C.kt" to """
                     import androidx.compose.Composable
@@ -350,7 +350,7 @@
     @Test
     fun testComposableOrderIssue(): Unit = ensureSetup {
         compile(
-            "TestG", mapOf(
+            mapOf(
                 "library module" to mapOf(
                     "C.kt" to """
                     import androidx.compose.*
@@ -389,7 +389,7 @@
     @Test
     fun testSimpleXModuleCall(): Unit = ensureSetup {
         compile(
-            "TestG", mapOf(
+            mapOf(
                 "library module" to mapOf(
                     "a/A.kt" to """
                     package a
@@ -420,7 +420,7 @@
     @Test
     fun testJvmFieldIssue(): Unit = ensureSetup {
         compile(
-            "TestG", mapOf(
+            mapOf(
                 "library module" to mapOf(
                     "x/C.kt" to """
                     fun Test2() {
@@ -449,7 +449,7 @@
     @Test
     fun testInstanceXModuleCall(): Unit = ensureSetup {
         compile(
-            "TestH", mapOf(
+            mapOf(
                 "library module" to mapOf(
                     "a/Foo.kt" to """
                     package a
@@ -480,7 +480,7 @@
     @Test
     fun testXModuleProperty(): Unit = ensureSetup {
         compile(
-            "TestI", mapOf(
+            mapOf(
                 "library module" to mapOf(
                     "a/Foo.kt" to """
                     package a
@@ -508,7 +508,7 @@
     @Test
     fun testXModuleInterface(): Unit = ensureSetup {
         compile(
-            "TestJ", mapOf(
+            mapOf(
                 "library module" to mapOf(
                     "a/Foo.kt" to """
                     package a
@@ -542,7 +542,7 @@
     @Test
     fun testXModuleCtorComposableParam(): Unit = ensureSetup {
         compile(
-            "TestJ", mapOf(
+            mapOf(
                 "library module" to mapOf(
                     "a/Foo.kt" to """
                     package a
@@ -772,7 +772,6 @@
     }
 
     fun compile(
-        mainClassName: String,
         modules: Map<String, Map<String, String>>,
         dumpClasses: Boolean = false,
         validate: ((String) -> Unit)? = null
@@ -816,7 +815,7 @@
         modules: Map<String, Map<String, String>>,
         dumpClasses: Boolean = false
     ): RobolectricComposeTester {
-        val allClasses = compile(mainClassName, modules, dumpClasses)
+        val allClasses = compile(modules, dumpClasses)
         val loader = URLClassLoader(emptyArray(), this.javaClass.classLoader)
         val instanceClass = run {
             var instanceClass: Class<*>? = null
diff --git a/compose/compose-runtime/compose-runtime-benchmark/build.gradle b/compose/compose-runtime/compose-runtime-benchmark/build.gradle
index 44d34fe..03cc3cf 100644
--- a/compose/compose-runtime/compose-runtime-benchmark/build.gradle
+++ b/compose/compose-runtime/compose-runtime-benchmark/build.gradle
@@ -49,7 +49,7 @@
 
     androidTestImplementation(project(":compose:compose-runtime"))
     androidTestImplementation(project(":ui:ui-core"))
-    androidTestImplementation(project(":ui:ui-text"))
+    androidTestImplementation(project(":ui:ui-text-core"))
     androidTestImplementation(project(":ui:ui-framework"))
     androidTestImplementation(project(":ui:ui-layout"))
     androidTestImplementation(project(":ui:ui-material"))
@@ -64,6 +64,7 @@
     androidTestImplementation(KOTLIN_STDLIB)
     androidTestImplementation(KOTLIN_REFLECT)
     androidTestImplementation(project(":benchmark:benchmark-junit4"))
+    androidTestImplementation "androidx.activity:activity:1.2.0-alpha02"
 }
 
 tasks.withType(KotlinCompile).configureEach {
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/HotReloadIntegrationTests.kt b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/HotReloadIntegrationTests.kt
index e4fd951..5703f77 100644
--- a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/HotReloadIntegrationTests.kt
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/HotReloadIntegrationTests.kt
@@ -17,7 +17,7 @@
 package androidx.compose
 
 import android.app.Activity
-import androidx.compose.benchmark.ComposeActivity
+import androidx.activity.ComponentActivity
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.rule.ActivityTestRule
@@ -47,7 +47,7 @@
 @LargeTest
 class HotReloadIntegrationTests {
     @get:Rule
-    val activityRule = ActivityTestRule(ComposeActivity::class.java)
+    val activityRule = ActivityTestRule(ComponentActivity::class.java)
 
     @Test
     fun testSubComposition() {
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeActivity.kt b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeActivity.kt
index e8e83b05..3111aee 100644
--- a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeActivity.kt
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeActivity.kt
@@ -16,10 +16,10 @@
 
 package androidx.compose.benchmark
 
-import android.app.Activity
 import android.os.Bundle
+import androidx.activity.ComponentActivity
 
-class ComposeActivity : Activity() {
+class ComposeActivity : ComponentActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
     }
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeBenchmark.kt b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeBenchmark.kt
index 721c467..24f23d8 100644
--- a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeBenchmark.kt
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeBenchmark.kt
@@ -155,7 +155,7 @@
 }
 
 private fun background(paint: Paint) =
-    Modifier.drawBehind { canvas, size -> canvas.drawRect(size.toRect(), paint) }
+    Modifier.drawBehind { drawRect(size.toRect(), paint) }
 
 private val redBackground = background(Paint().also { it.color = Color.Red })
 private val blackBackground = background(Paint().also { it.color = Color.Black })
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/deeptree/DeepTree.kt b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/deeptree/DeepTree.kt
index eab0cf5..f83bd27 100644
--- a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/deeptree/DeepTree.kt
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/deeptree/DeepTree.kt
@@ -30,7 +30,7 @@
 import androidx.ui.unit.toRect
 
 private fun background(paint: Paint) =
-    Modifier.drawBehind { canvas, size -> canvas.drawRect(size.toRect(), paint) }
+    Modifier.drawBehind { drawRect(size.toRect(), paint) }
 
 val blueBackground = background(Paint().also { it.color = Color.Blue })
 val magentaBackground = background(Paint().also { it.color = Color.Magenta })
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_Widgets.kt b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_Widgets.kt
index 733fe15..901ead7 100644
--- a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_Widgets.kt
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_Widgets.kt
@@ -96,7 +96,7 @@
 fun RealWorld4_FancyWidget_001(
     s1: String,
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_01,
     children: @Composable() () -> Unit
 ) {
@@ -151,7 +151,7 @@
 @Composable
 fun RealWorld4_FancyWidget_002(
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_02
 ) {
     val tmp0 =
@@ -236,7 +236,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_003(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_03,
     number: Int,
     s1: String,
@@ -344,7 +344,7 @@
 @Composable
 fun RealWorld4_FancyWidget_004(
     number: Int,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_04,
     s1: String,
     children: @Composable() () -> Unit
@@ -428,7 +428,7 @@
 fun RealWorld4_FancyWidget_005(
     number: Int,
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_05,
     s2: String,
     children: @Composable() () -> Unit
@@ -548,7 +548,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_006(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_06,
     s1: String,
     children: @Composable() () -> Unit
@@ -616,7 +616,7 @@
 @Composable
 fun RealWorld4_FancyWidget_007(
     number: Int,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_07,
     children: @Composable() () -> Unit
 ) {
@@ -696,7 +696,7 @@
 @Composable
 fun RealWorld4_FancyWidget_008(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08,
     children: @Composable() () -> Unit
 ) {
@@ -742,7 +742,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_009(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     number: Int,
     children: @Composable() () -> Unit
@@ -791,7 +791,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_010(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s2: String,
     s1: String,
@@ -836,7 +836,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_011(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     number: Int
 ) {
@@ -872,7 +872,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_012(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     s1: String,
     children: @Composable() () -> Unit
@@ -935,7 +935,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_013(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s2: String,
     children: @Composable() () -> Unit
@@ -975,7 +975,7 @@
 @Composable
 fun RealWorld4_FancyWidget_014(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -1014,7 +1014,7 @@
 @Composable
 fun RealWorld4_FancyWidget_015(
     number: Int,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08,
     s1: String,
     children: @Composable() () -> Unit
@@ -1078,7 +1078,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_016(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     s2: String,
     children: @Composable() () -> Unit
@@ -1144,7 +1144,7 @@
 @Composable
 fun RealWorld4_FancyWidget_017(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     number: Int
 ) {
@@ -1187,7 +1187,7 @@
 fun RealWorld4_FancyWidget_018(
     number: Int,
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     s1: String,
     b: Boolean
@@ -1265,7 +1265,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_019(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -1301,7 +1301,7 @@
     color: Color,
     s1: String,
     b: Boolean,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -1349,7 +1349,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_021(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -1382,7 +1382,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_022(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_07,
     s1: String,
     number: Int,
@@ -1472,7 +1472,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_023(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08,
     obj: RealWorld4_UnmemoizablePojo_14,
     children: @Composable() () -> Unit
@@ -1526,7 +1526,7 @@
 @Composable
 fun RealWorld4_FancyWidget_024(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     s2: String,
     children: @Composable() () -> Unit
@@ -1579,7 +1579,7 @@
 @Composable
 fun RealWorld4_FancyWidget_025(
     b: Boolean,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     children: @Composable() () -> Unit
 ) {
@@ -1635,7 +1635,7 @@
 fun RealWorld4_FancyWidget_026(
     s2: String,
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -1679,7 +1679,7 @@
 @Composable
 fun RealWorld4_FancyWidget_027(
     color: Color,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -1720,7 +1720,7 @@
     s2: String,
     b: Boolean,
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10
 ) {
     val tmp0 = "jaleiurhgsei48" + model.f0 + model.f1 + model.f2 + model.f3
@@ -1766,7 +1766,7 @@
 @Composable
 fun RealWorld4_FancyWidget_029(
     b: Boolean,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08,
     s2: String,
     children: @Composable() () -> Unit
@@ -1819,7 +1819,7 @@
 @Composable
 fun RealWorld4_FancyWidget_030(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     children: @Composable() () -> Unit
 ) {
@@ -1867,7 +1867,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_031(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s2: String
 ) {
@@ -1904,7 +1904,7 @@
 @Composable
 fun RealWorld4_FancyWidget_032(
     obj: RealWorld4_UnmemoizablePojo_5,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -1946,7 +1946,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_033(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     s1: String,
     children: @Composable() () -> Unit
@@ -1995,7 +1995,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_034(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     b: Boolean,
     s2: String,
@@ -2042,7 +2042,7 @@
 fun RealWorld4_FancyWidget_035(
     s2: String,
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -2086,7 +2086,7 @@
 @Composable
 fun RealWorld4_FancyWidget_036(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -2125,7 +2125,7 @@
 @Composable
 fun RealWorld4_FancyWidget_037(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_06,
     s2: String,
     number: Int
@@ -2221,7 +2221,7 @@
 @Composable
 fun RealWorld4_FancyWidget_038(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_07,
     obj: RealWorld4_UnmemoizablePojo_8,
     s2: String,
@@ -2282,7 +2282,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_039(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08,
     s1: String,
     b: Boolean,
@@ -2347,7 +2347,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_040(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     s2: String,
     children: @Composable() () -> Unit
@@ -2394,7 +2394,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_041(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     s2: String,
     children: @Composable() () -> Unit
@@ -2462,7 +2462,7 @@
 fun RealWorld4_FancyWidget_042(
     s2: String,
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -2506,7 +2506,7 @@
 @Composable
 fun RealWorld4_FancyWidget_043(
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_07,
     obj: RealWorld4_UnmemoizablePojo_13,
     s1: String,
@@ -2574,7 +2574,7 @@
 @Composable
 fun RealWorld4_FancyWidget_044(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08,
     obj: RealWorld4_UnmemoizablePojo_3,
     number: Int,
@@ -2662,7 +2662,7 @@
     obj: RealWorld4_UnmemoizablePojo_6,
     s2: String,
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08,
     children: @Composable() () -> Unit
 ) {
@@ -2724,7 +2724,7 @@
 @Composable
 fun RealWorld4_FancyWidget_046(
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     children: @Composable() () -> Unit
 ) {
@@ -2770,7 +2770,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_047(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -2803,7 +2803,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_048(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     b: Boolean,
     children: @Composable() () -> Unit
@@ -2843,7 +2843,7 @@
 @Composable
 fun RealWorld4_FancyWidget_049(
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     children: @Composable() () -> Unit
 ) {
@@ -2903,7 +2903,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_050(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s2: String,
     children: @Composable() () -> Unit
@@ -2943,7 +2943,7 @@
 @Composable
 fun RealWorld4_FancyWidget_051(
     number: Int,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -2981,7 +2981,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_052(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s1: String,
     children: @Composable() () -> Unit
@@ -3021,7 +3021,7 @@
 @Composable
 fun RealWorld4_FancyWidget_053(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10
 ) {
     val tmp0 = "jaleiurhgsei48" + model.f0 + model.f1 + model.f2 + model.f3
@@ -3056,7 +3056,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_054(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08
 ) {
     val tmp0 = "jaleiurhgsei48" + model.f1 + model.f2 + model.f3 + model.f5
@@ -3124,7 +3124,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_055(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     s2: String,
     children: @Composable() () -> Unit
@@ -3175,7 +3175,7 @@
 fun RealWorld4_FancyWidget_056(
     s2: String,
     number: Int,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     children: @Composable() () -> Unit
 ) {
@@ -3228,7 +3228,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_057(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     obj: RealWorld4_UnmemoizablePojo_11,
     s1: String,
@@ -3279,7 +3279,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_058(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     children: @Composable() () -> Unit
 ) {
@@ -3325,7 +3325,7 @@
 @Composable
 fun RealWorld4_FancyWidget_059(
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     number: Int,
     children: @Composable() () -> Unit
@@ -3370,7 +3370,7 @@
 @Composable
 fun RealWorld4_FancyWidget_060(
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10
 ) {
     val tmp0 = "jaleiurhgsei48" + model.f0 + model.f1 + model.f2 + model.f3
@@ -3406,7 +3406,7 @@
 @Composable
 fun RealWorld4_FancyWidget_061(
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10
 ) {
     val tmp0 = "jaleiurhgsei48" + model.f0 + model.f1 + model.f2 + model.f3
@@ -3441,7 +3441,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_062(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     s2: String,
     children: @Composable() () -> Unit
@@ -3496,7 +3496,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_063(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s1: String,
     s2: String,
@@ -3542,7 +3542,7 @@
 @Composable
 fun RealWorld4_FancyWidget_064(
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -3582,7 +3582,7 @@
 fun RealWorld4_FancyWidget_065(
     number: Int,
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10
 ) {
     val tmp0 = "jaleiurhgsei48" + model.f0 + model.f1 + model.f2 + model.f3
@@ -3623,7 +3623,7 @@
 @Composable
 fun RealWorld4_FancyWidget_066(
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s1: String,
     children: @Composable() () -> Unit
@@ -3668,7 +3668,7 @@
 @Composable
 fun RealWorld4_FancyWidget_067(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s2: String,
     b: Boolean,
@@ -3718,7 +3718,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_068(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_05,
     obj: RealWorld4_UnmemoizablePojo_2,
     s2: String,
@@ -3786,7 +3786,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_069(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_06,
     s2: String,
     s1: String,
@@ -3851,7 +3851,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_070(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_07,
     s1: String,
     number: Int,
@@ -3920,7 +3920,7 @@
 @Composable
 fun RealWorld4_FancyWidget_071(
     color: Color,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08,
     obj: RealWorld4_UnmemoizablePojo_0,
     children: @Composable() () -> Unit
@@ -3999,7 +3999,7 @@
 @Composable
 fun RealWorld4_FancyWidget_072(
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     children: @Composable() () -> Unit
 ) {
@@ -4046,7 +4046,7 @@
 @Composable
 fun RealWorld4_FancyWidget_073(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     children: @Composable() () -> Unit
 ) {
@@ -4092,7 +4092,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_074(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s2: String
 ) {
@@ -4129,7 +4129,7 @@
 @Composable
 fun RealWorld4_FancyWidget_075(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_06,
     children: @Composable() () -> Unit
 ) {
@@ -4181,7 +4181,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_076(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_07,
     s2: String
 ) {
@@ -4284,7 +4284,7 @@
 fun RealWorld4_FancyWidget_077(
     s2: String,
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08,
     children: @Composable() () -> Unit
 ) {
@@ -4341,7 +4341,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_078(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     b: Boolean
 ) {
@@ -4398,7 +4398,7 @@
 @Composable
 fun RealWorld4_FancyWidget_079(
     number: Int,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -4436,7 +4436,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_080(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_07,
     s1: String,
     children: @Composable() () -> Unit
@@ -4497,7 +4497,7 @@
     number: Int,
     b: Boolean,
     obj: RealWorld4_UnmemoizablePojo_7,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08,
     s1: String,
     children: @Composable() () -> Unit
@@ -4588,7 +4588,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_082(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     s2: String,
     children: @Composable() () -> Unit
@@ -4639,7 +4639,7 @@
 fun RealWorld4_FancyWidget_083(
     s1: String,
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     children: @Composable() () -> Unit
 ) {
@@ -4692,7 +4692,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_084(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -4725,7 +4725,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_085(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08,
     children: @Composable() () -> Unit
 ) {
@@ -4779,7 +4779,7 @@
 @Composable
 fun RealWorld4_FancyWidget_086(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09
 ) {
     val tmp0 = "jaleiurhgsei48" + model.f0 + model.f1 + model.f3 + model.f4
@@ -4834,7 +4834,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_087(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     color: Color
 ) {
@@ -4871,7 +4871,7 @@
 @Composable
 fun RealWorld4_FancyWidget_088(
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     children: @Composable() () -> Unit
 ) {
@@ -4917,7 +4917,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_089(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s2: String,
     children: @Composable() () -> Unit
@@ -4956,7 +4956,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_090(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s1: String,
     s2: String
@@ -4998,7 +4998,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_091(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s1: String,
     children: @Composable() () -> Unit
@@ -5038,7 +5038,7 @@
 @Composable
 fun RealWorld4_FancyWidget_092(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_07,
     children: @Composable() () -> Unit
 ) {
@@ -5098,7 +5098,7 @@
 @Composable
 fun RealWorld4_FancyWidget_093(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08
 ) {
     val tmp0 = "jaleiurhgsei48" + model.f1 + model.f2 + model.f3 + model.f5
@@ -5165,7 +5165,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_094(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     obj: RealWorld4_UnmemoizablePojo_9,
     children: @Composable() () -> Unit
@@ -5228,7 +5228,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_095(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -5262,7 +5262,7 @@
 @Composable
 fun RealWorld4_FancyWidget_096(
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     s1: String,
     children: @Composable() () -> Unit
@@ -5323,7 +5323,7 @@
 @Composable
 fun RealWorld4_FancyWidget_097(
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08,
     s1: String,
     children: @Composable() () -> Unit
@@ -5390,7 +5390,7 @@
 @Composable
 fun RealWorld4_FancyWidget_098(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     s2: String
 ) {
@@ -5453,7 +5453,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_099(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -5486,7 +5486,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_100(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08,
     s2: String,
     s1: String,
@@ -5552,7 +5552,7 @@
 @Composable
 fun RealWorld4_FancyWidget_101(
     number: Int,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     s1: String,
     children: @Composable() () -> Unit
@@ -5614,7 +5614,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_102(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s1: String,
     s2: String,
@@ -5659,7 +5659,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_103(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s2: String
 ) {
@@ -5695,7 +5695,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_104(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s1: String,
     s2: String,
@@ -5740,7 +5740,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_105(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     number: Int,
     children: @Composable() () -> Unit
@@ -5802,7 +5802,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_106(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -5836,7 +5836,7 @@
 @Composable
 fun RealWorld4_FancyWidget_107(
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s1: String,
     children: @Composable() () -> Unit
@@ -5880,7 +5880,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_108(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s1: String,
     children: @Composable() () -> Unit
@@ -5919,7 +5919,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_109(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -5955,7 +5955,7 @@
     s2: String,
     s1: String,
     color: Color,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -6003,7 +6003,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_111(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     obj: RealWorld4_UnmemoizablePojo_10,
     children: @Composable() () -> Unit
@@ -6046,7 +6046,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_112(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08,
     children: @Composable() () -> Unit
 ) {
@@ -6100,7 +6100,7 @@
 @Composable
 fun RealWorld4_FancyWidget_113(
     number: Int,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     children: @Composable() () -> Unit
 ) {
@@ -6164,7 +6164,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_114(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s1: String,
     color: Color,
@@ -6211,7 +6211,7 @@
 fun RealWorld4_FancyWidget_115(
     s2: String,
     color: Color,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s1: String,
     children: @Composable() () -> Unit
@@ -6260,7 +6260,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_116(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     number: Int,
     children: @Composable() () -> Unit
@@ -6307,7 +6307,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_117(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     number: Int,
     children: @Composable() () -> Unit
@@ -6346,7 +6346,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_118(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     color: Color,
     children: @Composable() () -> Unit
@@ -6386,7 +6386,7 @@
 @Composable
 fun RealWorld4_FancyWidget_119(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     children: @Composable() () -> Unit
 ) {
@@ -6434,7 +6434,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_120(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -6469,7 +6469,7 @@
 fun RealWorld4_FancyWidget_121(
     s2: String,
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -6515,7 +6515,7 @@
     number: Int,
     obj: RealWorld4_UnmemoizablePojo_12,
     b: Boolean,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -6569,7 +6569,7 @@
 fun RealWorld4_FancyWidget_123(
     s2: String,
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -6613,7 +6613,7 @@
 @Composable
 fun RealWorld4_FancyWidget_124(
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     b: Boolean,
     children: @Composable() () -> Unit
@@ -6666,7 +6666,7 @@
 @Composable
 fun RealWorld4_FancyWidget_125(
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -6705,7 +6705,7 @@
 @Composable
 fun RealWorld4_FancyWidget_126(
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -6743,7 +6743,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_127(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -6776,7 +6776,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_128(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s2: String,
     s1: String,
@@ -6821,7 +6821,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_129(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s2: String,
     children: @Composable() () -> Unit
@@ -6860,7 +6860,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_130(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -6895,7 +6895,7 @@
 fun RealWorld4_FancyWidget_131(
     s1: String,
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_04,
     children: @Composable() () -> Unit
 ) {
@@ -6977,7 +6977,7 @@
 @Composable
 fun RealWorld4_FancyWidget_132(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_05,
     children: @Composable() () -> Unit
 ) {
@@ -7104,7 +7104,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_133(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_06,
     s1: String,
     s2: String,
@@ -7175,7 +7175,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_134(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_07,
     children: @Composable() () -> Unit
 ) {
@@ -7239,7 +7239,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_135(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08,
     children: @Composable() () -> Unit
 ) {
@@ -7281,7 +7281,7 @@
 @Composable
 fun RealWorld4_FancyWidget_136(
     s2: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     children: @Composable() () -> Unit
 ) {
@@ -7343,7 +7343,7 @@
 fun RealWorld4_FancyWidget_137(
     s2: String,
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -7386,7 +7386,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_138(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     children: @Composable() () -> Unit
 ) {
@@ -7419,7 +7419,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_139(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_05,
     children: @Composable() () -> Unit
 ) {
@@ -7473,7 +7473,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_140(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_06,
     s2: String,
     children: @Composable() () -> Unit
@@ -7550,7 +7550,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_141(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_06,
     s2: String,
     children: @Composable() () -> Unit
@@ -7609,7 +7609,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_142(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_07,
     number: Int,
     s2: String
@@ -7702,7 +7702,7 @@
 fun RealWorld4_FancyWidget_143(
     s2: String,
     number: Int,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_07,
     children: @Composable() () -> Unit
 ) {
@@ -7788,7 +7788,7 @@
 fun RealWorld4_FancyWidget_144(
     s1: String,
     obj: RealWorld4_UnmemoizablePojo_4,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08,
     number: Int,
     children: @Composable() () -> Unit
@@ -7858,7 +7858,7 @@
 @Composable
 fun RealWorld4_FancyWidget_145(
     s1: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     s2: String,
     number: Int,
@@ -7938,7 +7938,7 @@
     s2: String,
     number: Int,
     b: Boolean,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     children: @Composable() () -> Unit
 ) {
@@ -8013,7 +8013,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_147(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_10,
     s1: String,
     obj: RealWorld4_UnmemoizablePojo_1,
@@ -8074,7 +8074,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_148(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_08,
     s1: String
 ) {
@@ -8140,7 +8140,7 @@
 
 @Composable
 fun RealWorld4_FancyWidget_149(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     model: RealWorld4_DataModel_09,
     s1: String,
     children: @Composable() () -> Unit
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/siblings/SiblingManagement.kt b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/siblings/SiblingManagement.kt
index 003cdfb..5ccb7ab 100644
--- a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/siblings/SiblingManagement.kt
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/siblings/SiblingManagement.kt
@@ -35,7 +35,7 @@
 import kotlin.random.Random
 
 private fun background(paint: Paint) =
-    Modifier.drawBehind { canvas, size -> canvas.drawRect(size.toRect(), paint) }
+    Modifier.drawBehind { drawRect(size.toRect(), paint) }
 
 val blackBackground = background(Paint().also { it.color = Color.Black })
 val blueBackground = background(Paint().also { it.color = Color.Black })
diff --git a/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/Composer.kt b/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/Composer.kt
index c9f98ef..7158c4b 100644
--- a/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/Composer.kt
+++ b/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/Composer.kt
@@ -1154,7 +1154,7 @@
             // doesn't exist in this set, it needs to be removed.
             val usedKeys = current.toSet()
 
-            val movedKeys = mutableSetOf<KeyInfo>()
+            val placedKeys = mutableSetOf<KeyInfo>()
             var currentIndex = 0
             val currentEnd = current.size
             var previousIndex = 0
@@ -1188,8 +1188,8 @@
                     continue
                 }
 
-                if (previousInfo in movedKeys) {
-                    // If the group was already moved to the correct location, skip it.
+                if (previousInfo in placedKeys) {
+                    // If the group was already placed in the correct location, skip it.
                     previousIndex++
                     continue
                 }
@@ -1200,6 +1200,7 @@
                     val currentInfo = current[currentIndex]
                     if (currentInfo !== previousInfo) {
                         val nodePosition = pending.nodePositionOf(currentInfo)
+                        placedKeys.add(currentInfo)
                         if (nodePosition != nodeOffset) {
                             val updatedCount = pending.updatedNodeCountOf(currentInfo)
                             recordMoveNode(
@@ -1207,7 +1208,6 @@
                                 nodeOffset + pending.startIndex, updatedCount
                             )
                             pending.registerMoveNode(nodePosition, nodeOffset, updatedCount)
-                            movedKeys.add(currentInfo)
                         } // else the nodes are already in the correct position
                     } else {
                         // The correct nodes are in the right location
diff --git a/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/internal/RestartableFunction.kt b/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/internal/RestartableFunction.kt
index 6114d9e..bd45f9b 100644
--- a/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/internal/RestartableFunction.kt
+++ b/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/internal/RestartableFunction.kt
@@ -1179,7 +1179,7 @@
 
 @Suppress("unused")
 fun restartableFunction(composer: Composer<*>, key: Int, tracked: Boolean, block: Any): RFunction {
-    composer.startReplaceableGroup(0)
+    composer.startReplaceableGroup(key)
     val slot = composer.nextValue()
     val result = if (slot === SlotTable.EMPTY) {
         val value = RFunction(key, tracked)
diff --git a/compose/compose-runtime/src/jvmMain/kotlin/androidx/compose/internal/RestartableFunctionN.kt b/compose/compose-runtime/src/jvmMain/kotlin/androidx/compose/internal/RestartableFunctionN.kt
index af442aa..accfab4 100644
--- a/compose/compose-runtime/src/jvmMain/kotlin/androidx/compose/internal/RestartableFunctionN.kt
+++ b/compose/compose-runtime/src/jvmMain/kotlin/androidx/compose/internal/RestartableFunctionN.kt
@@ -63,7 +63,7 @@
     arity: Int,
     block: Any
 ): RestartableFunctionN<*> {
-    composer.startReplaceableGroup(0)
+    composer.startReplaceableGroup(key)
     val slot = composer.nextValue()
     val result = if (slot === SlotTable.EMPTY) {
         val value = RestartableFunctionN<Any>(key, tracked, arity)
diff --git a/compose/compose-runtime/src/unitTest/kotlin/androidx/compose/CompositionTests.kt b/compose/compose-runtime/src/unitTest/kotlin/androidx/compose/CompositionTests.kt
index ec97d23c..bbb073d 100644
--- a/compose/compose-runtime/src/unitTest/kotlin/androidx/compose/CompositionTests.kt
+++ b/compose/compose-runtime/src/unitTest/kotlin/androidx/compose/CompositionTests.kt
@@ -1872,6 +1872,36 @@
             assertEquals(outerKeys[0], it)
         }
     }
+
+    @Test // b/152753046
+    fun testSwappingGroups() {
+        val items = mutableListOf(0, 1, 2, 3, 4)
+        var invalidateComposition = {}
+
+        @Composable
+        fun MockComposeScope.noNodes() { }
+
+        @Composable
+        fun MockComposeScope.test() {
+            invalidateComposition = invalidate
+            for (item in items) {
+                key(item) {
+                    noNodes()
+                }
+            }
+        }
+
+        val myComposer = compose {
+            test()
+        }
+
+        // Swap 2 and 3
+        items[2] = 3
+        items[3] = 2
+        invalidateComposition()
+
+        myComposer.expectChanges()
+    }
 }
 
 private fun <T> assertArrayEquals(message: String, expected: Array<T>, received: Array<T>) {
diff --git a/concurrent/futures-ktx/build.gradle b/concurrent/futures-ktx/build.gradle
index 9635af1..29766ca 100644
--- a/concurrent/futures-ktx/build.gradle
+++ b/concurrent/futures-ktx/build.gradle
@@ -19,6 +19,7 @@
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 import static androidx.build.dependencies.DependenciesKt.*
 
@@ -47,3 +48,10 @@
     description = "Kotlin Extensions for Androidx implementation of Guava's ListenableFuture"
     url = AndroidXExtension.ARCHITECTURE_URL
 }
+
+// Allow usage of Kotlin's @OptIn.
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn"]
+    }
+}
diff --git a/concurrent/futures-ktx/src/test/java/androidx/concurrent/futures/ListenableFutureTest.kt b/concurrent/futures-ktx/src/test/java/androidx/concurrent/futures/ListenableFutureTest.kt
index 11147a0..562b8a0 100644
--- a/concurrent/futures-ktx/src/test/java/androidx/concurrent/futures/ListenableFutureTest.kt
+++ b/concurrent/futures-ktx/src/test/java/androidx/concurrent/futures/ListenableFutureTest.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
+
 package androidx.concurrent.futures
 
 import kotlinx.coroutines.CancellationException
diff --git a/coordinatorlayout/coordinatorlayout/build.gradle b/coordinatorlayout/coordinatorlayout/build.gradle
index 47e5e83..202d484 100644
--- a/coordinatorlayout/coordinatorlayout/build.gradle
+++ b/coordinatorlayout/coordinatorlayout/build.gradle
@@ -10,7 +10,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    api(project(":core:core"))
+    api("androidx.core:core:1.3.0-beta01")
     implementation("androidx.collection:collection:1.0.0")
     api("androidx.customview:customview:1.0.0")
 
diff --git a/core/core-animation-testing/api/1.0.0-alpha01.txt b/core/core-animation-testing/api/1.0.0-alpha01.txt
index be788e4..173dd84 100644
--- a/core/core-animation-testing/api/1.0.0-alpha01.txt
+++ b/core/core-animation-testing/api/1.0.0-alpha01.txt
@@ -1,7 +1,7 @@
 // Signature format: 3.0
 package androidx.core.animation {
 
-  public class AnimatorTestRule implements org.junit.rules.TestRule {
+  public final class AnimatorTestRule implements org.junit.rules.TestRule {
     ctor public AnimatorTestRule();
     method public void advanceTimeBy(long);
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement, org.junit.runner.Description);
diff --git a/core/core-animation-testing/api/current.txt b/core/core-animation-testing/api/current.txt
index be788e4..173dd84 100644
--- a/core/core-animation-testing/api/current.txt
+++ b/core/core-animation-testing/api/current.txt
@@ -1,7 +1,7 @@
 // Signature format: 3.0
 package androidx.core.animation {
 
-  public class AnimatorTestRule implements org.junit.rules.TestRule {
+  public final class AnimatorTestRule implements org.junit.rules.TestRule {
     ctor public AnimatorTestRule();
     method public void advanceTimeBy(long);
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement, org.junit.runner.Description);
diff --git a/core/core-animation-testing/api/public_plus_experimental_1.0.0-alpha01.txt b/core/core-animation-testing/api/public_plus_experimental_1.0.0-alpha01.txt
index be788e4..173dd84 100644
--- a/core/core-animation-testing/api/public_plus_experimental_1.0.0-alpha01.txt
+++ b/core/core-animation-testing/api/public_plus_experimental_1.0.0-alpha01.txt
@@ -1,7 +1,7 @@
 // Signature format: 3.0
 package androidx.core.animation {
 
-  public class AnimatorTestRule implements org.junit.rules.TestRule {
+  public final class AnimatorTestRule implements org.junit.rules.TestRule {
     ctor public AnimatorTestRule();
     method public void advanceTimeBy(long);
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement, org.junit.runner.Description);
diff --git a/core/core-animation-testing/api/public_plus_experimental_current.txt b/core/core-animation-testing/api/public_plus_experimental_current.txt
index be788e4..173dd84 100644
--- a/core/core-animation-testing/api/public_plus_experimental_current.txt
+++ b/core/core-animation-testing/api/public_plus_experimental_current.txt
@@ -1,7 +1,7 @@
 // Signature format: 3.0
 package androidx.core.animation {
 
-  public class AnimatorTestRule implements org.junit.rules.TestRule {
+  public final class AnimatorTestRule implements org.junit.rules.TestRule {
     ctor public AnimatorTestRule();
     method public void advanceTimeBy(long);
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement, org.junit.runner.Description);
diff --git a/core/core-animation-testing/api/restricted_1.0.0-alpha01.txt b/core/core-animation-testing/api/restricted_1.0.0-alpha01.txt
index be788e4..173dd84 100644
--- a/core/core-animation-testing/api/restricted_1.0.0-alpha01.txt
+++ b/core/core-animation-testing/api/restricted_1.0.0-alpha01.txt
@@ -1,7 +1,7 @@
 // Signature format: 3.0
 package androidx.core.animation {
 
-  public class AnimatorTestRule implements org.junit.rules.TestRule {
+  public final class AnimatorTestRule implements org.junit.rules.TestRule {
     ctor public AnimatorTestRule();
     method public void advanceTimeBy(long);
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement, org.junit.runner.Description);
diff --git a/core/core-animation-testing/api/restricted_current.txt b/core/core-animation-testing/api/restricted_current.txt
index be788e4..173dd84 100644
--- a/core/core-animation-testing/api/restricted_current.txt
+++ b/core/core-animation-testing/api/restricted_current.txt
@@ -1,7 +1,7 @@
 // Signature format: 3.0
 package androidx.core.animation {
 
-  public class AnimatorTestRule implements org.junit.rules.TestRule {
+  public final class AnimatorTestRule implements org.junit.rules.TestRule {
     ctor public AnimatorTestRule();
     method public void advanceTimeBy(long);
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement, org.junit.runner.Description);
diff --git a/core/core-animation-testing/build.gradle b/core/core-animation-testing/build.gradle
index 79a359e..a05706d 100644
--- a/core/core-animation-testing/build.gradle
+++ b/core/core-animation-testing/build.gradle
@@ -34,7 +34,7 @@
 
 androidx {
     name = "Android Support Animator Testing"
-    publish = Publish.NONE
+    publish = Publish.SNAPSHOT_AND_RELEASE
     mavenVersion = LibraryVersions.CORE_ANIMATION_TESTING
     mavenGroup = LibraryGroups.CORE
     inceptionYear = "2018"
diff --git a/core/core-animation-testing/src/main/java/androidx/core/animation/AnimatorTestRule.java b/core/core-animation-testing/src/main/java/androidx/core/animation/AnimatorTestRule.java
index 26ff94c..3ea4843 100644
--- a/core/core-animation-testing/src/main/java/androidx/core/animation/AnimatorTestRule.java
+++ b/core/core-animation-testing/src/main/java/androidx/core/animation/AnimatorTestRule.java
@@ -56,7 +56,7 @@
  * }
  * </pre>
  */
-public class AnimatorTestRule implements TestRule {
+public final class AnimatorTestRule implements TestRule {
 
     final AnimationHandler mTestHandler;
     final long mStartTime;
diff --git a/core/core-animation/build.gradle b/core/core-animation/build.gradle
index 1ee2265..46f360f 100644
--- a/core/core-animation/build.gradle
+++ b/core/core-animation/build.gradle
@@ -35,7 +35,7 @@
 
 androidx {
     name = "Android Support Animation"
-    publish = Publish.NONE
+    publish = Publish.SNAPSHOT_AND_RELEASE
     mavenVersion = LibraryVersions.CORE_ANIMATION
     mavenGroup = LibraryGroups.CORE
     inceptionYear = "2018"
diff --git a/core/core-ktx/api/1.4.0-alpha01.txt b/core/core-ktx/api/1.4.0-alpha01.txt
new file mode 100644
index 0000000..b310061
--- /dev/null
+++ b/core/core-ktx/api/1.4.0-alpha01.txt
@@ -0,0 +1,599 @@
+// Signature format: 3.0
+package androidx.core.animation {
+
+  public final class AnimatorKt {
+    method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat = {});
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause = {});
+    method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentValuesKt {
+    method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ContextKt {
+    method public static inline <reified T> T! getSystemService(android.content.Context);
+    method public static inline void withStyledAttributes(android.content.Context, android.util.AttributeSet? set = null, int[] attrs, @AttrRes int defStyleAttr = 0, @StyleRes int defStyleRes = 0, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+    method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+
+  public final class SharedPreferencesKt {
+    method public static inline void edit(android.content.SharedPreferences, boolean commit = false, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class TypedArrayKt {
+    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorKt {
+    method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+    method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+    method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+    method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+    method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+    method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+    method public static inline String? getStringOrNull(android.database.Cursor, int index);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteDatabaseKt {
+    method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, boolean exclusive = true, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapKt {
+    method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+    method public static inline android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = android.graphics.Bitmap.Config.ARGB_8888);
+    method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = android.graphics.Bitmap.Config.ARGB_8888, boolean hasAlpha = true, android.graphics.ColorSpace colorSpace = ColorSpace.get(ColorSpace.Named.SRGB));
+    method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+    method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, boolean filter = true);
+    method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+  }
+
+  public final class CanvasKt {
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withMatrix(android.graphics.Canvas, android.graphics.Matrix matrix = android.graphics.Matrix(), kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withRotation(android.graphics.Canvas, float degrees = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withScale(android.graphics.Canvas, float x = 1.0f, float y = 1.0f, float pivotX = 0.0f, float pivotY = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSkew(android.graphics.Canvas, float x = 0.0f, float y = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withTranslation(android.graphics.Canvas, float x = 0.0f, float y = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class ColorKt {
+    method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+    method public static inline operator int component1(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+    method public static inline operator int component2(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+    method public static inline operator int component3(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+    method public static inline operator int component4(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+    method public static inline int getAlpha(@ColorInt int);
+    method @RequiresApi(26) public static inline float getAlpha(@ColorLong long);
+    method public static inline int getBlue(@ColorInt int);
+    method @RequiresApi(26) public static inline float getBlue(@ColorLong long);
+    method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(@ColorLong long);
+    method public static inline int getGreen(@ColorInt int);
+    method @RequiresApi(26) public static inline float getGreen(@ColorLong long);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorInt int);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorLong long);
+    method public static inline int getRed(@ColorInt int);
+    method @RequiresApi(26) public static inline float getRed(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isSrgb(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isWideGamut(@ColorLong long);
+    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
+    method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
+    method @ColorInt public static inline int toColorInt(String);
+    method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
+  }
+
+  public final class ImageDecoderKt {
+    method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+    method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+  }
+
+  public final class MatrixKt {
+    method public static android.graphics.Matrix rotationMatrix(float degrees, float px = 0.0f, float py = 0.0f);
+    method public static android.graphics.Matrix scaleMatrix(float sx = 1.0f, float sy = 1.0f);
+    method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+    method public static android.graphics.Matrix translationMatrix(float tx = 0.0f, float ty = 0.0f);
+    method public static inline float[] values(android.graphics.Matrix);
+  }
+
+  public final class PaintKt {
+    method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
+  }
+
+  public final class PathKt {
+    method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, float error = 0.5f);
+    method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+  }
+
+  public final class PictureKt {
+    method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class PointKt {
+    method public static inline operator int component1(android.graphics.Point);
+    method public static inline operator float component1(android.graphics.PointF);
+    method public static inline operator int component2(android.graphics.Point);
+    method public static inline operator float component2(android.graphics.PointF);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+    method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+    method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+    method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+    method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+  }
+
+  public final class PorterDuffKt {
+    method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+    method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class RectKt {
+    method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator int component1(android.graphics.Rect);
+    method public static inline operator float component1(android.graphics.RectF);
+    method public static inline operator int component2(android.graphics.Rect);
+    method public static inline operator float component2(android.graphics.RectF);
+    method public static inline operator int component3(android.graphics.Rect);
+    method public static inline operator float component3(android.graphics.RectF);
+    method public static inline operator int component4(android.graphics.Rect);
+    method public static inline operator float component4(android.graphics.RectF);
+    method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
+    method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+    method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+    method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+    method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+  }
+
+  public final class RegionKt {
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+    method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region not(android.graphics.Region);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+  }
+
+  public final class ShaderKt {
+    method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class BitmapDrawableKt {
+    method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+  }
+
+  public final class ColorDrawableKt {
+    method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+  }
+
+  public final class DrawableKt {
+    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, @Px int width = intrinsicWidth, @Px int height = intrinsicHeight, android.graphics.Bitmap.Config? config = null);
+    method public static void updateBounds(android.graphics.drawable.Drawable, @Px int left = android.graphics.Rect.left, @Px int top = android.graphics.Rect.top, @Px int right = android.graphics.Rect.right, @Px int bottom = android.graphics.Rect.bottom);
+  }
+
+  public final class IconKt {
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+  }
+
+}
+
+package androidx.core.location {
+
+  public final class LocationKt {
+    method public static inline operator double component1(android.location.Location);
+    method public static inline operator double component2(android.location.Location);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class UriKt {
+    method public static java.io.File toFile(android.net.Uri);
+    method public static inline android.net.Uri toUri(String);
+    method public static inline android.net.Uri toUri(java.io.File);
+  }
+
+}
+
+package androidx.core.os {
+
+  public final class BundleKt {
+    method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class HandlerKt {
+    method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, Object? token = null, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, Object? token = null, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+  }
+
+  public final class PersistableBundleKt {
+    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class TraceKt {
+    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class CharSequenceKt {
+    method public static inline boolean isDigitsOnly(CharSequence);
+    method public static inline int trimmedLength(CharSequence);
+  }
+
+  public final class HtmlKt {
+    method public static inline android.text.Spanned parseAsHtml(String, int flags = 0, android.text.Html.ImageGetter? imageGetter = null, android.text.Html.TagHandler? tagHandler = null);
+    method public static inline String toHtml(android.text.Spanned, int option = 0);
+  }
+
+  public final class LocaleKt {
+    method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+  }
+
+  public final class SpannableStringBuilderKt {
+    method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+  }
+
+  public final class SpannableStringKt {
+    method public static inline void clearSpans(android.text.Spannable);
+    method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+    method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+    method public static inline android.text.Spannable toSpannable(CharSequence);
+  }
+
+  public final class SpannedStringKt {
+    method public static inline <reified T> T![] getSpans(android.text.Spanned, int start = 0, int end = length);
+    method public static inline android.text.Spanned toSpanned(CharSequence);
+  }
+
+  public final class StringKt {
+    method public static inline String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.transition {
+
+  public final class TransitionKt {
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause = {});
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.util {
+
+  public final class AtomicFileKt {
+    method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+    method @RequiresApi(17) public static String readText(android.util.AtomicFile, java.nio.charset.Charset charset = Charsets.UTF_8);
+    method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, java.nio.charset.Charset charset = Charsets.UTF_8);
+  }
+
+  public final class HalfKt {
+    method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+  }
+
+  public final class LongSparseArrayKt {
+    method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
+    method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+    method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
+    method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+  }
+
+  public final class LruCacheKt {
+    method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf = { _, _ -> 1 }, kotlin.jvm.functions.Function1<? super K,? extends V> create = { (V)null }, kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved = { _, _, _, _ ->  });
+  }
+
+  public final class PairKt {
+    method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+    method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+  }
+
+  public final class RangeKt {
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+  }
+
+  public final class SizeKt {
+    method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+    method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+  }
+
+  public final class SparseArrayKt {
+    method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
+    method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
+    method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public static inline <T> int getSize(android.util.SparseArray<T>);
+    method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+    method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
+    method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
+    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+  }
+
+  public final class SparseBooleanArrayKt {
+    method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+    method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+    method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+    method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+    method public static inline int getSize(android.util.SparseBooleanArray);
+    method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+    method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+    method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+  }
+
+  public final class SparseIntArrayKt {
+    method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+    method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+    method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+    method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+    method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+    method public static inline int getSize(android.util.SparseIntArray);
+    method public static inline boolean isEmpty(android.util.SparseIntArray);
+    method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static boolean remove(android.util.SparseIntArray, int key, int value);
+    method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+  }
+
+  public final class SparseLongArrayKt {
+    method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+    method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+    method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+    method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+    method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+  }
+
+}
+
+package androidx.core.view {
+
+  public final class MenuKt {
+    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+    method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+    method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+    method public static inline int getSize(android.view.Menu);
+    method public static inline boolean isEmpty(android.view.Menu);
+    method public static inline boolean isNotEmpty(android.view.Menu);
+    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+    method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+  }
+
+  public final class ViewGroupKt {
+    method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+    method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+    method public static operator android.view.View get(android.view.ViewGroup, int index);
+    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+    method public static inline int getSize(android.view.ViewGroup);
+    method public static inline boolean isEmpty(android.view.ViewGroup);
+    method public static inline boolean isNotEmpty(android.view.ViewGroup);
+    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+    method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+    method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, @Px int left = android.view.ViewGroup.MarginLayoutParams.leftMargin, @Px int top = android.view.ViewGroup.MarginLayoutParams.topMargin, @Px int right = android.view.ViewGroup.MarginLayoutParams.rightMargin, @Px int bottom = android.view.ViewGroup.MarginLayoutParams.bottomMargin);
+    method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, @Px int start = marginStart, @Px int top = android.view.ViewGroup.MarginLayoutParams.topMargin, @Px int end = marginEnd, @Px int bottom = android.view.ViewGroup.MarginLayoutParams.bottomMargin);
+  }
+
+  public final class ViewKt {
+    method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static android.graphics.Bitmap drawToBitmap(android.view.View, android.graphics.Bitmap.Config config = android.graphics.Bitmap.Config.ARGB_8888);
+    method public static inline int getMarginBottom(android.view.View);
+    method public static inline int getMarginEnd(android.view.View);
+    method public static inline int getMarginLeft(android.view.View);
+    method public static inline int getMarginRight(android.view.View);
+    method public static inline int getMarginStart(android.view.View);
+    method public static inline int getMarginTop(android.view.View);
+    method public static inline boolean isGone(android.view.View);
+    method public static inline boolean isInvisible(android.view.View);
+    method public static inline boolean isVisible(android.view.View);
+    method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(16) public static inline Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline void setGone(android.view.View, boolean value);
+    method public static inline void setInvisible(android.view.View, boolean value);
+    method public static inline void setPadding(android.view.View, @Px int size);
+    method public static inline void setVisible(android.view.View, boolean value);
+    method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+    method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParamsTyped(android.view.View, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public static inline void updatePadding(android.view.View, @Px int left = paddingLeft, @Px int top = paddingTop, @Px int right = paddingRight, @Px int bottom = paddingBottom);
+    method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, @Px int start = paddingStart, @Px int top = paddingTop, @Px int end = paddingEnd, @Px int bottom = paddingBottom);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public final class TextViewKt {
+    method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged = { _, _, _, _ ->  }, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged = { _, _, _, _ ->  }, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged = {});
+    method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+  }
+
+}
+
diff --git a/core/core-ktx/api/current.txt b/core/core-ktx/api/current.txt
index cb5c321..b310061 100644
--- a/core/core-ktx/api/current.txt
+++ b/core/core-ktx/api/current.txt
@@ -321,7 +321,7 @@
   }
 
   public final class TraceKt {
-    method public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
   }
 
 }
diff --git a/core/core-ktx/api/public_plus_experimental_1.4.0-alpha01.txt b/core/core-ktx/api/public_plus_experimental_1.4.0-alpha01.txt
new file mode 100644
index 0000000..b310061
--- /dev/null
+++ b/core/core-ktx/api/public_plus_experimental_1.4.0-alpha01.txt
@@ -0,0 +1,599 @@
+// Signature format: 3.0
+package androidx.core.animation {
+
+  public final class AnimatorKt {
+    method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat = {});
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause = {});
+    method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentValuesKt {
+    method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ContextKt {
+    method public static inline <reified T> T! getSystemService(android.content.Context);
+    method public static inline void withStyledAttributes(android.content.Context, android.util.AttributeSet? set = null, int[] attrs, @AttrRes int defStyleAttr = 0, @StyleRes int defStyleRes = 0, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+    method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+
+  public final class SharedPreferencesKt {
+    method public static inline void edit(android.content.SharedPreferences, boolean commit = false, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class TypedArrayKt {
+    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorKt {
+    method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+    method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+    method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+    method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+    method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+    method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+    method public static inline String? getStringOrNull(android.database.Cursor, int index);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteDatabaseKt {
+    method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, boolean exclusive = true, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapKt {
+    method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+    method public static inline android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = android.graphics.Bitmap.Config.ARGB_8888);
+    method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = android.graphics.Bitmap.Config.ARGB_8888, boolean hasAlpha = true, android.graphics.ColorSpace colorSpace = ColorSpace.get(ColorSpace.Named.SRGB));
+    method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+    method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, boolean filter = true);
+    method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+  }
+
+  public final class CanvasKt {
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withMatrix(android.graphics.Canvas, android.graphics.Matrix matrix = android.graphics.Matrix(), kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withRotation(android.graphics.Canvas, float degrees = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withScale(android.graphics.Canvas, float x = 1.0f, float y = 1.0f, float pivotX = 0.0f, float pivotY = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSkew(android.graphics.Canvas, float x = 0.0f, float y = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withTranslation(android.graphics.Canvas, float x = 0.0f, float y = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class ColorKt {
+    method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+    method public static inline operator int component1(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+    method public static inline operator int component2(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+    method public static inline operator int component3(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+    method public static inline operator int component4(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+    method public static inline int getAlpha(@ColorInt int);
+    method @RequiresApi(26) public static inline float getAlpha(@ColorLong long);
+    method public static inline int getBlue(@ColorInt int);
+    method @RequiresApi(26) public static inline float getBlue(@ColorLong long);
+    method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(@ColorLong long);
+    method public static inline int getGreen(@ColorInt int);
+    method @RequiresApi(26) public static inline float getGreen(@ColorLong long);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorInt int);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorLong long);
+    method public static inline int getRed(@ColorInt int);
+    method @RequiresApi(26) public static inline float getRed(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isSrgb(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isWideGamut(@ColorLong long);
+    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
+    method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
+    method @ColorInt public static inline int toColorInt(String);
+    method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
+  }
+
+  public final class ImageDecoderKt {
+    method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+    method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+  }
+
+  public final class MatrixKt {
+    method public static android.graphics.Matrix rotationMatrix(float degrees, float px = 0.0f, float py = 0.0f);
+    method public static android.graphics.Matrix scaleMatrix(float sx = 1.0f, float sy = 1.0f);
+    method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+    method public static android.graphics.Matrix translationMatrix(float tx = 0.0f, float ty = 0.0f);
+    method public static inline float[] values(android.graphics.Matrix);
+  }
+
+  public final class PaintKt {
+    method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
+  }
+
+  public final class PathKt {
+    method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, float error = 0.5f);
+    method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+  }
+
+  public final class PictureKt {
+    method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class PointKt {
+    method public static inline operator int component1(android.graphics.Point);
+    method public static inline operator float component1(android.graphics.PointF);
+    method public static inline operator int component2(android.graphics.Point);
+    method public static inline operator float component2(android.graphics.PointF);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+    method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+    method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+    method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+    method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+  }
+
+  public final class PorterDuffKt {
+    method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+    method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class RectKt {
+    method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator int component1(android.graphics.Rect);
+    method public static inline operator float component1(android.graphics.RectF);
+    method public static inline operator int component2(android.graphics.Rect);
+    method public static inline operator float component2(android.graphics.RectF);
+    method public static inline operator int component3(android.graphics.Rect);
+    method public static inline operator float component3(android.graphics.RectF);
+    method public static inline operator int component4(android.graphics.Rect);
+    method public static inline operator float component4(android.graphics.RectF);
+    method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
+    method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+    method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+    method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+    method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+  }
+
+  public final class RegionKt {
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+    method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region not(android.graphics.Region);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+  }
+
+  public final class ShaderKt {
+    method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class BitmapDrawableKt {
+    method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+  }
+
+  public final class ColorDrawableKt {
+    method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+  }
+
+  public final class DrawableKt {
+    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, @Px int width = intrinsicWidth, @Px int height = intrinsicHeight, android.graphics.Bitmap.Config? config = null);
+    method public static void updateBounds(android.graphics.drawable.Drawable, @Px int left = android.graphics.Rect.left, @Px int top = android.graphics.Rect.top, @Px int right = android.graphics.Rect.right, @Px int bottom = android.graphics.Rect.bottom);
+  }
+
+  public final class IconKt {
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+  }
+
+}
+
+package androidx.core.location {
+
+  public final class LocationKt {
+    method public static inline operator double component1(android.location.Location);
+    method public static inline operator double component2(android.location.Location);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class UriKt {
+    method public static java.io.File toFile(android.net.Uri);
+    method public static inline android.net.Uri toUri(String);
+    method public static inline android.net.Uri toUri(java.io.File);
+  }
+
+}
+
+package androidx.core.os {
+
+  public final class BundleKt {
+    method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class HandlerKt {
+    method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, Object? token = null, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, Object? token = null, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+  }
+
+  public final class PersistableBundleKt {
+    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class TraceKt {
+    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class CharSequenceKt {
+    method public static inline boolean isDigitsOnly(CharSequence);
+    method public static inline int trimmedLength(CharSequence);
+  }
+
+  public final class HtmlKt {
+    method public static inline android.text.Spanned parseAsHtml(String, int flags = 0, android.text.Html.ImageGetter? imageGetter = null, android.text.Html.TagHandler? tagHandler = null);
+    method public static inline String toHtml(android.text.Spanned, int option = 0);
+  }
+
+  public final class LocaleKt {
+    method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+  }
+
+  public final class SpannableStringBuilderKt {
+    method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+  }
+
+  public final class SpannableStringKt {
+    method public static inline void clearSpans(android.text.Spannable);
+    method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+    method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+    method public static inline android.text.Spannable toSpannable(CharSequence);
+  }
+
+  public final class SpannedStringKt {
+    method public static inline <reified T> T![] getSpans(android.text.Spanned, int start = 0, int end = length);
+    method public static inline android.text.Spanned toSpanned(CharSequence);
+  }
+
+  public final class StringKt {
+    method public static inline String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.transition {
+
+  public final class TransitionKt {
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause = {});
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.util {
+
+  public final class AtomicFileKt {
+    method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+    method @RequiresApi(17) public static String readText(android.util.AtomicFile, java.nio.charset.Charset charset = Charsets.UTF_8);
+    method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, java.nio.charset.Charset charset = Charsets.UTF_8);
+  }
+
+  public final class HalfKt {
+    method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+  }
+
+  public final class LongSparseArrayKt {
+    method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
+    method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+    method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
+    method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+  }
+
+  public final class LruCacheKt {
+    method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf = { _, _ -> 1 }, kotlin.jvm.functions.Function1<? super K,? extends V> create = { (V)null }, kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved = { _, _, _, _ ->  });
+  }
+
+  public final class PairKt {
+    method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+    method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+  }
+
+  public final class RangeKt {
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+  }
+
+  public final class SizeKt {
+    method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+    method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+  }
+
+  public final class SparseArrayKt {
+    method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
+    method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
+    method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public static inline <T> int getSize(android.util.SparseArray<T>);
+    method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+    method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
+    method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
+    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+  }
+
+  public final class SparseBooleanArrayKt {
+    method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+    method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+    method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+    method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+    method public static inline int getSize(android.util.SparseBooleanArray);
+    method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+    method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+    method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+  }
+
+  public final class SparseIntArrayKt {
+    method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+    method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+    method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+    method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+    method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+    method public static inline int getSize(android.util.SparseIntArray);
+    method public static inline boolean isEmpty(android.util.SparseIntArray);
+    method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static boolean remove(android.util.SparseIntArray, int key, int value);
+    method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+  }
+
+  public final class SparseLongArrayKt {
+    method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+    method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+    method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+    method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+    method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+  }
+
+}
+
+package androidx.core.view {
+
+  public final class MenuKt {
+    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+    method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+    method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+    method public static inline int getSize(android.view.Menu);
+    method public static inline boolean isEmpty(android.view.Menu);
+    method public static inline boolean isNotEmpty(android.view.Menu);
+    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+    method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+  }
+
+  public final class ViewGroupKt {
+    method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+    method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+    method public static operator android.view.View get(android.view.ViewGroup, int index);
+    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+    method public static inline int getSize(android.view.ViewGroup);
+    method public static inline boolean isEmpty(android.view.ViewGroup);
+    method public static inline boolean isNotEmpty(android.view.ViewGroup);
+    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+    method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+    method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, @Px int left = android.view.ViewGroup.MarginLayoutParams.leftMargin, @Px int top = android.view.ViewGroup.MarginLayoutParams.topMargin, @Px int right = android.view.ViewGroup.MarginLayoutParams.rightMargin, @Px int bottom = android.view.ViewGroup.MarginLayoutParams.bottomMargin);
+    method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, @Px int start = marginStart, @Px int top = android.view.ViewGroup.MarginLayoutParams.topMargin, @Px int end = marginEnd, @Px int bottom = android.view.ViewGroup.MarginLayoutParams.bottomMargin);
+  }
+
+  public final class ViewKt {
+    method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static android.graphics.Bitmap drawToBitmap(android.view.View, android.graphics.Bitmap.Config config = android.graphics.Bitmap.Config.ARGB_8888);
+    method public static inline int getMarginBottom(android.view.View);
+    method public static inline int getMarginEnd(android.view.View);
+    method public static inline int getMarginLeft(android.view.View);
+    method public static inline int getMarginRight(android.view.View);
+    method public static inline int getMarginStart(android.view.View);
+    method public static inline int getMarginTop(android.view.View);
+    method public static inline boolean isGone(android.view.View);
+    method public static inline boolean isInvisible(android.view.View);
+    method public static inline boolean isVisible(android.view.View);
+    method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(16) public static inline Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline void setGone(android.view.View, boolean value);
+    method public static inline void setInvisible(android.view.View, boolean value);
+    method public static inline void setPadding(android.view.View, @Px int size);
+    method public static inline void setVisible(android.view.View, boolean value);
+    method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+    method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParamsTyped(android.view.View, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public static inline void updatePadding(android.view.View, @Px int left = paddingLeft, @Px int top = paddingTop, @Px int right = paddingRight, @Px int bottom = paddingBottom);
+    method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, @Px int start = paddingStart, @Px int top = paddingTop, @Px int end = paddingEnd, @Px int bottom = paddingBottom);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public final class TextViewKt {
+    method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged = { _, _, _, _ ->  }, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged = { _, _, _, _ ->  }, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged = {});
+    method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+  }
+
+}
+
diff --git a/core/core-ktx/api/public_plus_experimental_current.txt b/core/core-ktx/api/public_plus_experimental_current.txt
index cb5c321..b310061 100644
--- a/core/core-ktx/api/public_plus_experimental_current.txt
+++ b/core/core-ktx/api/public_plus_experimental_current.txt
@@ -321,7 +321,7 @@
   }
 
   public final class TraceKt {
-    method public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
   }
 
 }
diff --git a/ui/ui-text/api/res-0.1.0-dev01.txt b/core/core-ktx/api/res-1.4.0-alpha01.txt
similarity index 100%
copy from ui/ui-text/api/res-0.1.0-dev01.txt
copy to core/core-ktx/api/res-1.4.0-alpha01.txt
diff --git a/core/core-ktx/api/restricted_1.4.0-alpha01.txt b/core/core-ktx/api/restricted_1.4.0-alpha01.txt
new file mode 100644
index 0000000..b310061
--- /dev/null
+++ b/core/core-ktx/api/restricted_1.4.0-alpha01.txt
@@ -0,0 +1,599 @@
+// Signature format: 3.0
+package androidx.core.animation {
+
+  public final class AnimatorKt {
+    method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat = {});
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause = {});
+    method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentValuesKt {
+    method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ContextKt {
+    method public static inline <reified T> T! getSystemService(android.content.Context);
+    method public static inline void withStyledAttributes(android.content.Context, android.util.AttributeSet? set = null, int[] attrs, @AttrRes int defStyleAttr = 0, @StyleRes int defStyleRes = 0, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+    method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+
+  public final class SharedPreferencesKt {
+    method public static inline void edit(android.content.SharedPreferences, boolean commit = false, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class TypedArrayKt {
+    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorKt {
+    method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+    method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+    method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+    method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+    method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+    method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+    method public static inline String? getStringOrNull(android.database.Cursor, int index);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteDatabaseKt {
+    method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, boolean exclusive = true, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapKt {
+    method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+    method public static inline android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = android.graphics.Bitmap.Config.ARGB_8888);
+    method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = android.graphics.Bitmap.Config.ARGB_8888, boolean hasAlpha = true, android.graphics.ColorSpace colorSpace = ColorSpace.get(ColorSpace.Named.SRGB));
+    method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+    method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, boolean filter = true);
+    method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+  }
+
+  public final class CanvasKt {
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withMatrix(android.graphics.Canvas, android.graphics.Matrix matrix = android.graphics.Matrix(), kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withRotation(android.graphics.Canvas, float degrees = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withScale(android.graphics.Canvas, float x = 1.0f, float y = 1.0f, float pivotX = 0.0f, float pivotY = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSkew(android.graphics.Canvas, float x = 0.0f, float y = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withTranslation(android.graphics.Canvas, float x = 0.0f, float y = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class ColorKt {
+    method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+    method public static inline operator int component1(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+    method public static inline operator int component2(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+    method public static inline operator int component3(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+    method public static inline operator int component4(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+    method public static inline int getAlpha(@ColorInt int);
+    method @RequiresApi(26) public static inline float getAlpha(@ColorLong long);
+    method public static inline int getBlue(@ColorInt int);
+    method @RequiresApi(26) public static inline float getBlue(@ColorLong long);
+    method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(@ColorLong long);
+    method public static inline int getGreen(@ColorInt int);
+    method @RequiresApi(26) public static inline float getGreen(@ColorLong long);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorInt int);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorLong long);
+    method public static inline int getRed(@ColorInt int);
+    method @RequiresApi(26) public static inline float getRed(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isSrgb(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isWideGamut(@ColorLong long);
+    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
+    method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
+    method @ColorInt public static inline int toColorInt(String);
+    method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
+  }
+
+  public final class ImageDecoderKt {
+    method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+    method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+  }
+
+  public final class MatrixKt {
+    method public static android.graphics.Matrix rotationMatrix(float degrees, float px = 0.0f, float py = 0.0f);
+    method public static android.graphics.Matrix scaleMatrix(float sx = 1.0f, float sy = 1.0f);
+    method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+    method public static android.graphics.Matrix translationMatrix(float tx = 0.0f, float ty = 0.0f);
+    method public static inline float[] values(android.graphics.Matrix);
+  }
+
+  public final class PaintKt {
+    method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
+  }
+
+  public final class PathKt {
+    method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, float error = 0.5f);
+    method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+  }
+
+  public final class PictureKt {
+    method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class PointKt {
+    method public static inline operator int component1(android.graphics.Point);
+    method public static inline operator float component1(android.graphics.PointF);
+    method public static inline operator int component2(android.graphics.Point);
+    method public static inline operator float component2(android.graphics.PointF);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+    method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+    method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+    method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+    method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+  }
+
+  public final class PorterDuffKt {
+    method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+    method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class RectKt {
+    method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator int component1(android.graphics.Rect);
+    method public static inline operator float component1(android.graphics.RectF);
+    method public static inline operator int component2(android.graphics.Rect);
+    method public static inline operator float component2(android.graphics.RectF);
+    method public static inline operator int component3(android.graphics.Rect);
+    method public static inline operator float component3(android.graphics.RectF);
+    method public static inline operator int component4(android.graphics.Rect);
+    method public static inline operator float component4(android.graphics.RectF);
+    method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
+    method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+    method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+    method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+    method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+  }
+
+  public final class RegionKt {
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+    method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region not(android.graphics.Region);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+  }
+
+  public final class ShaderKt {
+    method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class BitmapDrawableKt {
+    method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+  }
+
+  public final class ColorDrawableKt {
+    method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+  }
+
+  public final class DrawableKt {
+    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, @Px int width = intrinsicWidth, @Px int height = intrinsicHeight, android.graphics.Bitmap.Config? config = null);
+    method public static void updateBounds(android.graphics.drawable.Drawable, @Px int left = android.graphics.Rect.left, @Px int top = android.graphics.Rect.top, @Px int right = android.graphics.Rect.right, @Px int bottom = android.graphics.Rect.bottom);
+  }
+
+  public final class IconKt {
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+  }
+
+}
+
+package androidx.core.location {
+
+  public final class LocationKt {
+    method public static inline operator double component1(android.location.Location);
+    method public static inline operator double component2(android.location.Location);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class UriKt {
+    method public static java.io.File toFile(android.net.Uri);
+    method public static inline android.net.Uri toUri(String);
+    method public static inline android.net.Uri toUri(java.io.File);
+  }
+
+}
+
+package androidx.core.os {
+
+  public final class BundleKt {
+    method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class HandlerKt {
+    method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, Object? token = null, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, Object? token = null, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+  }
+
+  public final class PersistableBundleKt {
+    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class TraceKt {
+    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class CharSequenceKt {
+    method public static inline boolean isDigitsOnly(CharSequence);
+    method public static inline int trimmedLength(CharSequence);
+  }
+
+  public final class HtmlKt {
+    method public static inline android.text.Spanned parseAsHtml(String, int flags = 0, android.text.Html.ImageGetter? imageGetter = null, android.text.Html.TagHandler? tagHandler = null);
+    method public static inline String toHtml(android.text.Spanned, int option = 0);
+  }
+
+  public final class LocaleKt {
+    method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+  }
+
+  public final class SpannableStringBuilderKt {
+    method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+  }
+
+  public final class SpannableStringKt {
+    method public static inline void clearSpans(android.text.Spannable);
+    method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+    method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+    method public static inline android.text.Spannable toSpannable(CharSequence);
+  }
+
+  public final class SpannedStringKt {
+    method public static inline <reified T> T![] getSpans(android.text.Spanned, int start = 0, int end = length);
+    method public static inline android.text.Spanned toSpanned(CharSequence);
+  }
+
+  public final class StringKt {
+    method public static inline String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.transition {
+
+  public final class TransitionKt {
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause = {});
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.util {
+
+  public final class AtomicFileKt {
+    method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+    method @RequiresApi(17) public static String readText(android.util.AtomicFile, java.nio.charset.Charset charset = Charsets.UTF_8);
+    method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, java.nio.charset.Charset charset = Charsets.UTF_8);
+  }
+
+  public final class HalfKt {
+    method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+  }
+
+  public final class LongSparseArrayKt {
+    method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
+    method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+    method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
+    method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+  }
+
+  public final class LruCacheKt {
+    method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf = { _, _ -> 1 }, kotlin.jvm.functions.Function1<? super K,? extends V> create = { (V)null }, kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved = { _, _, _, _ ->  });
+  }
+
+  public final class PairKt {
+    method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+    method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+  }
+
+  public final class RangeKt {
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+  }
+
+  public final class SizeKt {
+    method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+    method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+  }
+
+  public final class SparseArrayKt {
+    method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
+    method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
+    method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public static inline <T> int getSize(android.util.SparseArray<T>);
+    method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+    method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
+    method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
+    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+  }
+
+  public final class SparseBooleanArrayKt {
+    method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+    method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+    method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+    method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+    method public static inline int getSize(android.util.SparseBooleanArray);
+    method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+    method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+    method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+  }
+
+  public final class SparseIntArrayKt {
+    method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+    method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+    method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+    method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+    method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+    method public static inline int getSize(android.util.SparseIntArray);
+    method public static inline boolean isEmpty(android.util.SparseIntArray);
+    method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static boolean remove(android.util.SparseIntArray, int key, int value);
+    method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+  }
+
+  public final class SparseLongArrayKt {
+    method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+    method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+    method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+    method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+    method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+  }
+
+}
+
+package androidx.core.view {
+
+  public final class MenuKt {
+    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+    method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+    method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+    method public static inline int getSize(android.view.Menu);
+    method public static inline boolean isEmpty(android.view.Menu);
+    method public static inline boolean isNotEmpty(android.view.Menu);
+    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+    method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+  }
+
+  public final class ViewGroupKt {
+    method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+    method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+    method public static operator android.view.View get(android.view.ViewGroup, int index);
+    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+    method public static inline int getSize(android.view.ViewGroup);
+    method public static inline boolean isEmpty(android.view.ViewGroup);
+    method public static inline boolean isNotEmpty(android.view.ViewGroup);
+    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+    method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+    method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, @Px int left = android.view.ViewGroup.MarginLayoutParams.leftMargin, @Px int top = android.view.ViewGroup.MarginLayoutParams.topMargin, @Px int right = android.view.ViewGroup.MarginLayoutParams.rightMargin, @Px int bottom = android.view.ViewGroup.MarginLayoutParams.bottomMargin);
+    method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, @Px int start = marginStart, @Px int top = android.view.ViewGroup.MarginLayoutParams.topMargin, @Px int end = marginEnd, @Px int bottom = android.view.ViewGroup.MarginLayoutParams.bottomMargin);
+  }
+
+  public final class ViewKt {
+    method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static android.graphics.Bitmap drawToBitmap(android.view.View, android.graphics.Bitmap.Config config = android.graphics.Bitmap.Config.ARGB_8888);
+    method public static inline int getMarginBottom(android.view.View);
+    method public static inline int getMarginEnd(android.view.View);
+    method public static inline int getMarginLeft(android.view.View);
+    method public static inline int getMarginRight(android.view.View);
+    method public static inline int getMarginStart(android.view.View);
+    method public static inline int getMarginTop(android.view.View);
+    method public static inline boolean isGone(android.view.View);
+    method public static inline boolean isInvisible(android.view.View);
+    method public static inline boolean isVisible(android.view.View);
+    method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(16) public static inline Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline void setGone(android.view.View, boolean value);
+    method public static inline void setInvisible(android.view.View, boolean value);
+    method public static inline void setPadding(android.view.View, @Px int size);
+    method public static inline void setVisible(android.view.View, boolean value);
+    method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+    method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParamsTyped(android.view.View, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public static inline void updatePadding(android.view.View, @Px int left = paddingLeft, @Px int top = paddingTop, @Px int right = paddingRight, @Px int bottom = paddingBottom);
+    method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, @Px int start = paddingStart, @Px int top = paddingTop, @Px int end = paddingEnd, @Px int bottom = paddingBottom);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public final class TextViewKt {
+    method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged = { _, _, _, _ ->  }, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged = { _, _, _, _ ->  }, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged = {});
+    method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+  }
+
+}
+
diff --git a/core/core-ktx/api/restricted_current.txt b/core/core-ktx/api/restricted_current.txt
index cb5c321..b310061 100644
--- a/core/core-ktx/api/restricted_current.txt
+++ b/core/core-ktx/api/restricted_current.txt
@@ -321,7 +321,7 @@
   }
 
   public final class TraceKt {
-    method public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
   }
 
 }
diff --git a/core/core-ktx/src/main/java/androidx/core/os/Trace.kt b/core/core-ktx/src/main/java/androidx/core/os/Trace.kt
index 43bf85e..cb381ee 100644
--- a/core/core-ktx/src/main/java/androidx/core/os/Trace.kt
+++ b/core/core-ktx/src/main/java/androidx/core/os/Trace.kt
@@ -22,6 +22,14 @@
  * Wrap the specified [block] in calls to [Trace.beginSection] (with the supplied [sectionName])
  * and [Trace.endSection].
  */
+@Deprecated(
+    "Use androidx.tracing.Trace instead",
+    replaceWith = ReplaceWith(
+        "trace(sectionName)",
+        imports = arrayOf("androidx.tracing.trace")
+    )
+)
+@Suppress("DEPRECATION")
 inline fun <T> trace(sectionName: String, block: () -> T): T {
     TraceCompat.beginSection(sectionName)
     try {
diff --git a/core/core/api/1.4.0-alpha01.txt b/core/core/api/1.4.0-alpha01.txt
new file mode 100644
index 0000000..dcc9798
--- /dev/null
+++ b/core/core/api/1.4.0-alpha01.txt
@@ -0,0 +1,3126 @@
+// Signature format: 3.0
+package androidx.core.accessibilityservice {
+
+  public final class AccessibilityServiceInfoCompat {
+    method public static String capabilityToString(int);
+    method public static String feedbackTypeToString(int);
+    method public static String? flagToString(int);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+  }
+
+}
+
+package androidx.core.app {
+
+  public class ActivityCompat extends androidx.core.content.ContextCompat {
+    ctor protected ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method public static android.net.Uri? getReferrer(android.app.Activity);
+    method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+    method public static void postponeEnterTransition(android.app.Activity);
+    method public static void recreate(android.app.Activity);
+    method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity!, android.view.DragEvent!);
+    method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+    method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+    method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public static void startPostponedEnterTransition(android.app.Activity);
+  }
+
+  public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+    method public void onRequestPermissionsResult(int, String![], int[]);
+  }
+
+  public static interface ActivityCompat.PermissionCompatDelegate {
+    method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+    method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public android.graphics.Rect? getLaunchBounds();
+    method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+    method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
+    method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+    method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+    method public android.os.Bundle? toBundle();
+    method public void update(androidx.core.app.ActivityOptionsCompat);
+    field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public final class AlarmManagerCompat {
+    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+  }
+
+  @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+    ctor public AppComponentFactory();
+    method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+  }
+
+  public class AppLaunchChecker {
+    ctor @Deprecated public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public final class AppOpsManagerCompat {
+    method public static int noteOp(android.content.Context, String, int, String);
+    method public static int noteOpNoThrow(android.content.Context, String, int, String);
+    method public static int noteProxyOp(android.content.Context, String, String);
+    method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+    method public static String? permissionToOp(String);
+    field public static final int MODE_ALLOWED = 0; // 0x0
+    field public static final int MODE_DEFAULT = 3; // 0x3
+    field public static final int MODE_ERRORED = 2; // 0x2
+    field public static final int MODE_IGNORED = 1; // 0x1
+  }
+
+  public final class BundleCompat {
+    method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+    method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+  }
+
+  public class DialogCompat {
+    method public static android.view.View requireViewById(android.app.Dialog, int);
+  }
+
+  public class FrameMetricsAggregator {
+    ctor public FrameMetricsAggregator();
+    ctor public FrameMetricsAggregator(int);
+    method public void add(android.app.Activity);
+    method public android.util.SparseIntArray![]? getMetrics();
+    method public android.util.SparseIntArray![]? remove(android.app.Activity);
+    method public android.util.SparseIntArray![]? reset();
+    method public android.util.SparseIntArray![]? stop();
+    field public static final int ANIMATION_DURATION = 256; // 0x100
+    field public static final int ANIMATION_INDEX = 8; // 0x8
+    field public static final int COMMAND_DURATION = 32; // 0x20
+    field public static final int COMMAND_INDEX = 5; // 0x5
+    field public static final int DELAY_DURATION = 128; // 0x80
+    field public static final int DELAY_INDEX = 7; // 0x7
+    field public static final int DRAW_DURATION = 8; // 0x8
+    field public static final int DRAW_INDEX = 3; // 0x3
+    field public static final int EVERY_DURATION = 511; // 0x1ff
+    field public static final int INPUT_DURATION = 2; // 0x2
+    field public static final int INPUT_INDEX = 1; // 0x1
+    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+    field public static final int SWAP_DURATION = 64; // 0x40
+    field public static final int SWAP_INDEX = 6; // 0x6
+    field public static final int SYNC_DURATION = 16; // 0x10
+    field public static final int SYNC_INDEX = 4; // 0x4
+    field public static final int TOTAL_DURATION = 1; // 0x1
+    field public static final int TOTAL_INDEX = 0; // 0x0
+  }
+
+  public abstract class JobIntentService extends android.app.Service {
+    ctor public JobIntentService();
+    method public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
+    method public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+    method public boolean isStopped();
+    method public android.os.IBinder! onBind(android.content.Intent);
+    method protected abstract void onHandleWork(android.content.Intent);
+    method public boolean onStopCurrentWork();
+    method public void setInterruptIfStopped(boolean);
+  }
+
+  public final class NavUtils {
+    method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static String? getParentActivityName(android.app.Activity);
+    method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void navigateUpFromSameTask(android.app.Activity);
+    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+    field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+  }
+
+  public class NotificationCompat {
+    ctor @Deprecated public NotificationCompat();
+    method public static androidx.core.app.NotificationCompat.Action! getAction(android.app.Notification!, int);
+    method public static int getActionCount(android.app.Notification!);
+    method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification!);
+    method public static int getBadgeIconType(android.app.Notification!);
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
+    method public static String! getCategory(android.app.Notification!);
+    method public static String! getChannelId(android.app.Notification!);
+    method @RequiresApi(19) public static CharSequence! getContentTitle(android.app.Notification!);
+    method public static android.os.Bundle? getExtras(android.app.Notification!);
+    method public static String! getGroup(android.app.Notification!);
+    method public static int getGroupAlertBehavior(android.app.Notification!);
+    method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!>! getInvisibleActions(android.app.Notification!);
+    method public static boolean getLocalOnly(android.app.Notification!);
+    method public static String! getShortcutId(android.app.Notification!);
+    method public static String! getSortKey(android.app.Notification!);
+    method public static long getTimeoutAfter(android.app.Notification!);
+    method public static boolean isGroupSummary(android.app.Notification!);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
+    field public static final String CATEGORY_ALARM = "alarm";
+    field public static final String CATEGORY_CALL = "call";
+    field public static final String CATEGORY_EMAIL = "email";
+    field public static final String CATEGORY_ERROR = "err";
+    field public static final String CATEGORY_EVENT = "event";
+    field public static final String CATEGORY_MESSAGE = "msg";
+    field public static final String CATEGORY_NAVIGATION = "navigation";
+    field public static final String CATEGORY_PROGRESS = "progress";
+    field public static final String CATEGORY_PROMO = "promo";
+    field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+    field public static final String CATEGORY_REMINDER = "reminder";
+    field public static final String CATEGORY_SERVICE = "service";
+    field public static final String CATEGORY_SOCIAL = "social";
+    field public static final String CATEGORY_STATUS = "status";
+    field public static final String CATEGORY_SYSTEM = "sys";
+    field public static final String CATEGORY_TRANSPORT = "transport";
+    field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+    field public static final int DEFAULT_ALL = -1; // 0xffffffff
+    field public static final int DEFAULT_LIGHTS = 4; // 0x4
+    field public static final int DEFAULT_SOUND = 1; // 0x1
+    field public static final int DEFAULT_VIBRATE = 2; // 0x2
+    field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+    field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+    field public static final String EXTRA_BIG_TEXT = "android.bigText";
+    field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+    field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+    field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+    field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+    field public static final String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+    field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+    field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+    field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+    field public static final String EXTRA_MESSAGES = "android.messages";
+    field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+    field public static final String EXTRA_PEOPLE = "android.people";
+    field public static final String EXTRA_PICTURE = "android.picture";
+    field public static final String EXTRA_PROGRESS = "android.progress";
+    field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+    field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+    field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+    field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+    field public static final String EXTRA_SMALL_ICON = "android.icon";
+    field public static final String EXTRA_SUB_TEXT = "android.subText";
+    field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+    field public static final String EXTRA_TEMPLATE = "android.template";
+    field public static final String EXTRA_TEXT = "android.text";
+    field public static final String EXTRA_TEXT_LINES = "android.textLines";
+    field public static final String EXTRA_TITLE = "android.title";
+    field public static final String EXTRA_TITLE_BIG = "android.title.big";
+    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+    field public static final int FLAG_BUBBLE = 4096; // 0x1000
+    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+    field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+    field public static final int FLAG_INSISTENT = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+    field public static final int FLAG_NO_CLEAR = 32; // 0x20
+    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+    field public static final int GROUP_ALERT_ALL = 0; // 0x0
+    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+    field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+    field public static final String GROUP_KEY_SILENT = "silent";
+    field public static final int PRIORITY_DEFAULT = 0; // 0x0
+    field public static final int PRIORITY_HIGH = 1; // 0x1
+    field public static final int PRIORITY_LOW = -1; // 0xffffffff
+    field public static final int PRIORITY_MAX = 2; // 0x2
+    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+  }
+
+  public static class NotificationCompat.Action {
+    ctor public NotificationCompat.Action(int, CharSequence!, android.app.PendingIntent!);
+    ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    method public android.app.PendingIntent! getActionIntent();
+    method public boolean getAllowGeneratedReplies();
+    method public androidx.core.app.RemoteInput![]! getDataOnlyRemoteInputs();
+    method public android.os.Bundle! getExtras();
+    method @Deprecated public int getIcon();
+    method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
+    method public androidx.core.app.RemoteInput![]! getRemoteInputs();
+    method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+    method public boolean getShowsUserInterface();
+    method public CharSequence! getTitle();
+    method public boolean isContextual();
+    field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+    field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
+    field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+    field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+    field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+    field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+    field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+    field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+    field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+    field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+    field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+    field public android.app.PendingIntent! actionIntent;
+    field @Deprecated public int icon;
+    field public CharSequence! title;
+  }
+
+  public static final class NotificationCompat.Action.Builder {
+    ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(int, CharSequence!, android.app.PendingIntent!);
+    ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action!);
+    method public androidx.core.app.NotificationCompat.Action.Builder! addExtras(android.os.Bundle!);
+    method public androidx.core.app.NotificationCompat.Action.Builder! addRemoteInput(androidx.core.app.RemoteInput!);
+    method public androidx.core.app.NotificationCompat.Action! build();
+    method public androidx.core.app.NotificationCompat.Action.Builder! extend(androidx.core.app.NotificationCompat.Action.Extender!);
+    method public android.os.Bundle! getExtras();
+    method public androidx.core.app.NotificationCompat.Action.Builder! setAllowGeneratedReplies(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder! setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+    method public androidx.core.app.NotificationCompat.Action.Builder! setShowsUserInterface(boolean);
+  }
+
+  public static interface NotificationCompat.Action.Extender {
+    method public androidx.core.app.NotificationCompat.Action.Builder! extend(androidx.core.app.NotificationCompat.Action.Builder!);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+  }
+
+  public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+    ctor public NotificationCompat.Action.WearableExtender();
+    ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action!);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender! clone();
+    method public androidx.core.app.NotificationCompat.Action.Builder! extend(androidx.core.app.NotificationCompat.Action.Builder!);
+    method @Deprecated public CharSequence! getCancelLabel();
+    method @Deprecated public CharSequence! getConfirmLabel();
+    method public boolean getHintDisplayActionInline();
+    method public boolean getHintLaunchesActivity();
+    method @Deprecated public CharSequence! getInProgressLabel();
+    method public boolean isAvailableOffline();
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender! setAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender! setCancelLabel(CharSequence!);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender! setConfirmLabel(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender! setHintDisplayActionInline(boolean);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender! setHintLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender! setInProgressLabel(CharSequence!);
+  }
+
+  public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigPictureStyle();
+    ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder!);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle! bigLargeIcon(android.graphics.Bitmap!);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle! bigPicture(android.graphics.Bitmap!);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle! setBigContentTitle(CharSequence!);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle! setSummaryText(CharSequence!);
+  }
+
+  public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigTextStyle();
+    ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder!);
+    method public androidx.core.app.NotificationCompat.BigTextStyle! bigText(CharSequence!);
+    method public androidx.core.app.NotificationCompat.BigTextStyle! setBigContentTitle(CharSequence!);
+    method public androidx.core.app.NotificationCompat.BigTextStyle! setSummaryText(CharSequence!);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata {
+    method @RequiresApi(29) public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
+    method public boolean getAutoExpandBubble();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
+    method @DimenRes public int getDesiredHeightResId();
+    method public androidx.core.graphics.drawable.IconCompat getIcon();
+    method public android.app.PendingIntent getIntent();
+    method public boolean isNotificationSuppressed();
+    method @RequiresApi(29) public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata.Builder {
+    ctor public NotificationCompat.BubbleMetadata.Builder();
+    method public androidx.core.app.NotificationCompat.BubbleMetadata build();
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
+  }
+
+  public static class NotificationCompat.Builder {
+    ctor public NotificationCompat.Builder(android.content.Context, String);
+    ctor @Deprecated public NotificationCompat.Builder(android.content.Context!);
+    method public androidx.core.app.NotificationCompat.Builder! addAction(int, CharSequence!, android.app.PendingIntent!);
+    method public androidx.core.app.NotificationCompat.Builder! addAction(androidx.core.app.NotificationCompat.Action!);
+    method public androidx.core.app.NotificationCompat.Builder! addExtras(android.os.Bundle!);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder! addInvisibleAction(int, CharSequence!, android.app.PendingIntent!);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder! addInvisibleAction(androidx.core.app.NotificationCompat.Action!);
+    method public androidx.core.app.NotificationCompat.Builder! addPerson(String!);
+    method public android.app.Notification! build();
+    method public androidx.core.app.NotificationCompat.Builder! extend(androidx.core.app.NotificationCompat.Extender!);
+    method public android.os.Bundle! getExtras();
+    method @Deprecated public android.app.Notification! getNotification();
+    method protected static CharSequence! limitCharSequenceLength(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setAutoCancel(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setBadgeIconType(int);
+    method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
+    method public androidx.core.app.NotificationCompat.Builder! setCategory(String!);
+    method public androidx.core.app.NotificationCompat.Builder! setChannelId(String);
+    method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.Builder! setColorized(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setContent(android.widget.RemoteViews!);
+    method public androidx.core.app.NotificationCompat.Builder! setContentInfo(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Builder! setContentIntent(android.app.PendingIntent!);
+    method public androidx.core.app.NotificationCompat.Builder! setContentText(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Builder! setContentTitle(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Builder! setCustomBigContentView(android.widget.RemoteViews!);
+    method public androidx.core.app.NotificationCompat.Builder! setCustomContentView(android.widget.RemoteViews!);
+    method public androidx.core.app.NotificationCompat.Builder! setCustomHeadsUpContentView(android.widget.RemoteViews!);
+    method public androidx.core.app.NotificationCompat.Builder! setDefaults(int);
+    method public androidx.core.app.NotificationCompat.Builder! setDeleteIntent(android.app.PendingIntent!);
+    method public androidx.core.app.NotificationCompat.Builder! setExtras(android.os.Bundle!);
+    method public androidx.core.app.NotificationCompat.Builder! setFullScreenIntent(android.app.PendingIntent!, boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setGroup(String!);
+    method public androidx.core.app.NotificationCompat.Builder! setGroupAlertBehavior(int);
+    method public androidx.core.app.NotificationCompat.Builder! setGroupSummary(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setLargeIcon(android.graphics.Bitmap!);
+    method public androidx.core.app.NotificationCompat.Builder! setLights(@ColorInt int, int, int);
+    method public androidx.core.app.NotificationCompat.Builder! setLocalOnly(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
+    method public androidx.core.app.NotificationCompat.Builder! setNumber(int);
+    method public androidx.core.app.NotificationCompat.Builder! setOngoing(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setOnlyAlertOnce(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setPriority(int);
+    method public androidx.core.app.NotificationCompat.Builder! setProgress(int, int, boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setPublicVersion(android.app.Notification!);
+    method public androidx.core.app.NotificationCompat.Builder! setRemoteInputHistory(CharSequence![]!);
+    method public androidx.core.app.NotificationCompat.Builder! setShortcutId(String!);
+    method public androidx.core.app.NotificationCompat.Builder! setShowWhen(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setSmallIcon(int);
+    method public androidx.core.app.NotificationCompat.Builder! setSmallIcon(int, int);
+    method public androidx.core.app.NotificationCompat.Builder! setSortKey(String!);
+    method public androidx.core.app.NotificationCompat.Builder! setSound(android.net.Uri!);
+    method public androidx.core.app.NotificationCompat.Builder! setSound(android.net.Uri!, int);
+    method public androidx.core.app.NotificationCompat.Builder! setStyle(androidx.core.app.NotificationCompat.Style!);
+    method public androidx.core.app.NotificationCompat.Builder! setSubText(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Builder! setTicker(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Builder! setTicker(CharSequence!, android.widget.RemoteViews!);
+    method public androidx.core.app.NotificationCompat.Builder! setTimeoutAfter(long);
+    method public androidx.core.app.NotificationCompat.Builder! setUsesChronometer(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setVibrate(long[]!);
+    method public androidx.core.app.NotificationCompat.Builder! setVisibility(int);
+    method public androidx.core.app.NotificationCompat.Builder! setWhen(long);
+    field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
+  }
+
+  public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.CarExtender();
+    ctor public NotificationCompat.CarExtender(android.app.Notification!);
+    method public androidx.core.app.NotificationCompat.Builder! extend(androidx.core.app.NotificationCompat.Builder!);
+    method @ColorInt public int getColor();
+    method public android.graphics.Bitmap! getLargeIcon();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation! getUnreadConversation();
+    method public androidx.core.app.NotificationCompat.CarExtender! setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CarExtender! setLargeIcon(android.graphics.Bitmap!);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender! setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation!);
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
+    method @Deprecated public long getLatestTimestamp();
+    method @Deprecated public String![]! getMessages();
+    method @Deprecated public String! getParticipant();
+    method @Deprecated public String![]! getParticipants();
+    method @Deprecated public android.app.PendingIntent! getReadPendingIntent();
+    method @Deprecated public androidx.core.app.RemoteInput! getRemoteInput();
+    method @Deprecated public android.app.PendingIntent! getReplyPendingIntent();
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+    ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String!);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder! addMessage(String!);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation! build();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder! setLatestTimestamp(long);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder! setReadPendingIntent(android.app.PendingIntent!);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder! setReplyAction(android.app.PendingIntent!, androidx.core.app.RemoteInput!);
+  }
+
+  public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  public static interface NotificationCompat.Extender {
+    method public androidx.core.app.NotificationCompat.Builder! extend(androidx.core.app.NotificationCompat.Builder!);
+  }
+
+  public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.InboxStyle();
+    ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder!);
+    method public androidx.core.app.NotificationCompat.InboxStyle! addLine(CharSequence!);
+    method public androidx.core.app.NotificationCompat.InboxStyle! setBigContentTitle(CharSequence!);
+    method public androidx.core.app.NotificationCompat.InboxStyle! setSummaryText(CharSequence!);
+  }
+
+  public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+    ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+    method public void addCompatExtras(android.os.Bundle!);
+    method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle! addMessage(CharSequence!, long, CharSequence!);
+    method public androidx.core.app.NotificationCompat.MessagingStyle! addMessage(CharSequence!, long, androidx.core.app.Person!);
+    method public androidx.core.app.NotificationCompat.MessagingStyle! addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message!);
+    method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification!);
+    method public CharSequence? getConversationTitle();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!>! getMessages();
+    method public androidx.core.app.Person! getUser();
+    method @Deprecated public CharSequence! getUserDisplayName();
+    method public boolean isGroupConversation();
+    method public androidx.core.app.NotificationCompat.MessagingStyle! setConversationTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle! setGroupConversation(boolean);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(CharSequence!, long, androidx.core.app.Person?);
+    ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence!, long, CharSequence!);
+    method public String? getDataMimeType();
+    method public android.net.Uri? getDataUri();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.Person? getPerson();
+    method @Deprecated public CharSequence? getSender();
+    method public CharSequence getText();
+    method public long getTimestamp();
+    method public androidx.core.app.NotificationCompat.MessagingStyle.Message! setData(String!, android.net.Uri!);
+  }
+
+  public abstract static class NotificationCompat.Style {
+    ctor public NotificationCompat.Style();
+    method public android.app.Notification! build();
+    method public void setBuilder(androidx.core.app.NotificationCompat.Builder!);
+  }
+
+  public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.WearableExtender();
+    ctor public NotificationCompat.WearableExtender(android.app.Notification!);
+    method public androidx.core.app.NotificationCompat.WearableExtender! addAction(androidx.core.app.NotificationCompat.Action!);
+    method public androidx.core.app.NotificationCompat.WearableExtender! addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>!);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! addPage(android.app.Notification!);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! addPages(java.util.List<android.app.Notification!>!);
+    method public androidx.core.app.NotificationCompat.WearableExtender! clearActions();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! clearPages();
+    method public androidx.core.app.NotificationCompat.WearableExtender! clone();
+    method public androidx.core.app.NotificationCompat.Builder! extend(androidx.core.app.NotificationCompat.Builder!);
+    method public java.util.List<androidx.core.app.NotificationCompat.Action!>! getActions();
+    method @Deprecated public android.graphics.Bitmap! getBackground();
+    method public String! getBridgeTag();
+    method public int getContentAction();
+    method @Deprecated public int getContentIcon();
+    method @Deprecated public int getContentIconGravity();
+    method public boolean getContentIntentAvailableOffline();
+    method @Deprecated public int getCustomContentHeight();
+    method @Deprecated public int getCustomSizePreset();
+    method public String! getDismissalId();
+    method @Deprecated public android.app.PendingIntent! getDisplayIntent();
+    method @Deprecated public int getGravity();
+    method @Deprecated public boolean getHintAmbientBigPicture();
+    method @Deprecated public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    method @Deprecated public boolean getHintHideIcon();
+    method @Deprecated public int getHintScreenTimeout();
+    method @Deprecated public boolean getHintShowBackgroundOnly();
+    method @Deprecated public java.util.List<android.app.Notification!>! getPages();
+    method public boolean getStartScrollBottom();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setBackground(android.graphics.Bitmap!);
+    method public androidx.core.app.NotificationCompat.WearableExtender! setBridgeTag(String!);
+    method public androidx.core.app.NotificationCompat.WearableExtender! setContentAction(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setContentIcon(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setContentIconGravity(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender! setContentIntentAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setCustomContentHeight(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setCustomSizePreset(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender! setDismissalId(String!);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setDisplayIntent(android.app.PendingIntent!);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setGravity(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintAmbientBigPicture(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintAvoidBackgroundClipping(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender! setHintContentIntentLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintHideIcon(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintScreenTimeout(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintShowBackgroundOnly(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender! setStartScrollBottom(boolean);
+    field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+    field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+    field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+    field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+    field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+    field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+    field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+    field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+  }
+
+  public final class NotificationCompatExtras {
+    field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+    field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+    field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+    field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+    field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+    field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+  }
+
+  public abstract class NotificationCompatSideChannelService extends android.app.Service {
+    ctor public NotificationCompatSideChannelService();
+    method public abstract void cancel(String!, int, String!);
+    method public abstract void cancelAll(String!);
+    method public abstract void notify(String!, int, String!, android.app.Notification!);
+    method public android.os.IBinder! onBind(android.content.Intent!);
+  }
+
+  public final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(android.app.NotificationChannel);
+    method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+    method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
+    method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public android.app.NotificationChannel? getNotificationChannel(String);
+    method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+    method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
+    method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
+    method public void notify(int, android.app.Notification);
+    method public void notify(String?, int, android.app.Notification);
+    field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+    field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public class Person {
+    method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public String? getKey();
+    method public CharSequence? getName();
+    method public String? getUri();
+    method public boolean isBot();
+    method public boolean isImportant();
+    method public androidx.core.app.Person.Builder toBuilder();
+    method public android.os.Bundle toBundle();
+  }
+
+  public static class Person.Builder {
+    ctor public Person.Builder();
+    method public androidx.core.app.Person build();
+    method public androidx.core.app.Person.Builder setBot(boolean);
+    method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+    method public androidx.core.app.Person.Builder setImportant(boolean);
+    method public androidx.core.app.Person.Builder setKey(String?);
+    method public androidx.core.app.Person.Builder setName(CharSequence?);
+    method public androidx.core.app.Person.Builder setUri(String?);
+  }
+
+  public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
+    ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+    ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+    method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+    method public android.app.PendingIntent getActionIntent();
+    method public CharSequence getContentDescription();
+    method public androidx.core.graphics.drawable.IconCompat getIcon();
+    method public CharSequence getTitle();
+    method public boolean isEnabled();
+    method public void setEnabled(boolean);
+    method public void setShouldShowIcon(boolean);
+    method public boolean shouldShowIcon();
+    method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+  }
+
+  public final class RemoteInput {
+    method public static void addDataResultToIntent(androidx.core.app.RemoteInput!, android.content.Intent!, java.util.Map<java.lang.String!,android.net.Uri!>!);
+    method public static void addResultsToIntent(androidx.core.app.RemoteInput![]!, android.content.Intent!, android.os.Bundle!);
+    method public boolean getAllowFreeFormInput();
+    method public java.util.Set<java.lang.String!>! getAllowedDataTypes();
+    method public CharSequence![]! getChoices();
+    method public static java.util.Map<java.lang.String!,android.net.Uri!>! getDataResultsFromIntent(android.content.Intent!, String!);
+    method public int getEditChoicesBeforeSending();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence! getLabel();
+    method public String! getResultKey();
+    method public static android.os.Bundle! getResultsFromIntent(android.content.Intent!);
+    method public static int getResultsSource(android.content.Intent);
+    method public boolean isDataOnly();
+    method public static void setResultsSource(android.content.Intent, int);
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
+    field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+    field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+    field public static final int SOURCE_CHOICE = 1; // 0x1
+    field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+  }
+
+  public static final class RemoteInput.Builder {
+    ctor public RemoteInput.Builder(String);
+    method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+    method public androidx.core.app.RemoteInput build();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+    method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+    method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
+    method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(int);
+    method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+  }
+
+  public final class ServiceCompat {
+    method public static void stopForeground(android.app.Service, int);
+    field public static final int START_STICKY = 1; // 0x1
+    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+  }
+
+  public final class ShareCompat {
+    method public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
+    field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+    field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+  }
+
+  public static class ShareCompat.IntentBuilder {
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
+    method public void startChooser();
+  }
+
+  public static class ShareCompat.IntentReader {
+    method public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
+    method public int getStreamCount();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
+    method public boolean isMultipleShare();
+    method public boolean isShareIntent();
+    method public boolean isSingleShare();
+  }
+
+  public abstract class SharedElementCallback {
+    ctor public SharedElementCallback();
+    method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+    method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+    method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
+    method public void onRejectSharedElements(java.util.List<android.view.View!>!);
+    method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+  }
+
+  public static interface SharedElementCallback.OnSharedElementsReadyListener {
+    method public void onSharedElementsReady();
+  }
+
+  public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+    method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+    method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+    method public androidx.core.app.TaskStackBuilder! addParentStack(android.content.ComponentName!);
+    method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+    method public android.content.Intent? editIntentAt(int);
+    method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+    method @Deprecated public android.content.Intent! getIntent(int);
+    method public int getIntentCount();
+    method public android.content.Intent![] getIntents();
+    method public android.app.PendingIntent? getPendingIntent(int, int);
+    method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+    method @Deprecated public java.util.Iterator<android.content.Intent!>! iterator();
+    method public void startActivities();
+    method public void startActivities(android.os.Bundle?);
+  }
+
+  public static interface TaskStackBuilder.SupportParentable {
+    method public android.content.Intent? getSupportParentActivityIntent();
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentProviderCompat {
+    method public static android.content.Context requireContext(android.content.ContentProvider);
+  }
+
+  public final class ContentResolverCompat {
+    method public static android.database.Cursor! query(android.content.ContentResolver!, android.net.Uri!, String![]!, String!, String![]!, String!, androidx.core.os.CancellationSignal!);
+  }
+
+  public class ContextCompat {
+    ctor protected ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, String);
+    method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+    method public static java.io.File! getCodeCacheDir(android.content.Context);
+    method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+    method public static java.io.File? getDataDir(android.content.Context);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+    method public static java.io.File![] getExternalCacheDirs(android.content.Context);
+    method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
+    method public static java.util.concurrent.Executor! getMainExecutor(android.content.Context!);
+    method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File![] getObbDirs(android.content.Context);
+    method public static <T> T? getSystemService(android.content.Context, Class<T!>);
+    method public static String? getSystemServiceName(android.content.Context, Class<?>);
+    method public static boolean isDeviceProtectedStorage(android.content.Context);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![]);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
+    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
+  }
+
+  public class FileProvider extends android.content.ContentProvider {
+    ctor public FileProvider();
+    method public int delete(android.net.Uri, String?, String![]?);
+    method public String! getType(android.net.Uri);
+    method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+    method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues!);
+    method public boolean onCreate();
+    method public android.database.Cursor! query(android.net.Uri, String![]?, String?, String![]?, String?);
+    method public int update(android.net.Uri, android.content.ContentValues!, String?, String![]?);
+  }
+
+  public final class IntentCompat {
+    method public static android.content.Intent makeMainSelectorActivity(String, String);
+    field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+  }
+
+  public final class MimeTypeFilter {
+    method public static boolean matches(String?, String);
+    method public static String? matches(String?, String![]);
+    method public static String? matches(String![]?, String);
+    method public static String![] matchesMany(String![]?, String);
+  }
+
+  public final class PermissionChecker {
+    method public static int checkCallingOrSelfPermission(android.content.Context, String);
+    method public static int checkCallingPermission(android.content.Context, String, String?);
+    method public static int checkPermission(android.content.Context, String, int, int, String?);
+    method public static int checkSelfPermission(android.content.Context, String);
+    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+    field public static final int PERMISSION_GRANTED = 0; // 0x0
+  }
+
+  @Deprecated public final class SharedPreferencesCompat {
+  }
+
+  @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+    method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+    method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+  }
+
+}
+
+package androidx.core.content.pm {
+
+  @Deprecated public final class ActivityInfoCompat {
+    field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+  public final class PackageInfoCompat {
+    method public static long getLongVersionCode(android.content.pm.PackageInfo);
+  }
+
+  public final class PermissionInfoCompat {
+    method public static int getProtection(android.content.pm.PermissionInfo);
+    method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+  }
+
+  public class ShortcutInfoCompat {
+    method public android.content.ComponentName? getActivity();
+    method public java.util.Set<java.lang.String!>? getCategories();
+    method public CharSequence? getDisabledMessage();
+    method public String getId();
+    method public android.content.Intent getIntent();
+    method public android.content.Intent![] getIntents();
+    method public CharSequence? getLongLabel();
+    method public int getRank();
+    method public CharSequence getShortLabel();
+    method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+  }
+
+  public static class ShortcutInfoCompat.Builder {
+    ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+    method public androidx.core.content.pm.ShortcutInfoCompat build();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
+  }
+
+  public class ShortcutManagerCompat {
+    method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
+    method public static int getMaxShortcutCountPerActivity(android.content.Context);
+    method public static boolean isRequestPinShortcutSupported(android.content.Context);
+    method public static void removeAllDynamicShortcuts(android.content.Context);
+    method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+    method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+  }
+
+  public final class ResourcesCompat {
+    method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static float getFloat(android.content.res.Resources, @DimenRes int);
+    method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+    field @AnyRes public static final int ID_NULL = 0; // 0x0
+  }
+
+  public abstract static class ResourcesCompat.FontCallback {
+    ctor public ResourcesCompat.FontCallback();
+    method public abstract void onFontRetrievalFailed(int);
+    method public abstract void onFontRetrieved(android.graphics.Typeface);
+  }
+
+  public static final class ResourcesCompat.ThemeCompat {
+    method public static void rebase(android.content.res.Resources.Theme);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorWindowCompat {
+    method public static android.database.CursorWindow create(String?, long);
+  }
+
+  @Deprecated public final class DatabaseUtilsCompat {
+    method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
+    method @Deprecated public static String! concatenateWhere(String!, String!);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteCursorCompat {
+    method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapCompat {
+    method public static int getAllocationByteCount(android.graphics.Bitmap);
+    method public static boolean hasMipMap(android.graphics.Bitmap);
+    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+  }
+
+  public class BlendModeColorFilterCompat {
+    method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
+  }
+
+  public enum BlendModeCompat {
+    enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
+  }
+
+  public final class ColorUtils {
+    method @ColorInt public static int HSLToColor(float[]);
+    method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+    method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+    method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+    method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_X) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Y) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Z) double);
+    method public static void XYZToLAB(@FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_X) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Y) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Z) double, double[]);
+    method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+    method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+    method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+    method public static double calculateContrast(@ColorInt int, @ColorInt int);
+    method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+    method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+    method public static void colorToHSL(@ColorInt int, float[]);
+    method public static void colorToLAB(@ColorInt int, double[]);
+    method public static void colorToXYZ(@ColorInt int, double[]);
+    method public static int compositeColors(@ColorInt int, @ColorInt int);
+    method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+    method public static double distanceEuclidean(double[], double[]);
+    method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+  }
+
+  public final class Insets {
+    method public static androidx.core.graphics.Insets of(int, int, int, int);
+    method public static androidx.core.graphics.Insets of(android.graphics.Rect);
+    method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
+    method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+    field public static final androidx.core.graphics.Insets NONE;
+    field public final int bottom;
+    field public final int left;
+    field public final int right;
+    field public final int top;
+  }
+
+  public final class PaintCompat {
+    method public static boolean hasGlyph(android.graphics.Paint, String);
+    method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
+  }
+
+  public final class PathSegment {
+    ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+    method public android.graphics.PointF getEnd();
+    method public float getEndFraction();
+    method public android.graphics.PointF getStart();
+    method public float getStartFraction();
+  }
+
+  public final class PathUtils {
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
+  }
+
+  public class TypefaceCompat {
+    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+    method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+    method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
+    method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+  }
+
+  public class IconCompat implements androidx.versionedparcelable.VersionedParcelable {
+    method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+    method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+    method @IdRes public int getResId();
+    method public String getResPackage();
+    method public int getType();
+    method public android.net.Uri getUri();
+    method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
+    method public void onPostParceling();
+    method public void onPreParceling(boolean);
+    method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
+    method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+    method public android.os.Bundle! toBundle();
+    method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
+    method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
+    field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
+    field public static final int TYPE_BITMAP = 1; // 0x1
+    field public static final int TYPE_DATA = 3; // 0x3
+    field public static final int TYPE_RESOURCE = 2; // 0x2
+    field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+    field public static final int TYPE_URI = 4; // 0x4
+    field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
+  }
+
+  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.Bitmap? getBitmap();
+    method public float getCornerRadius();
+    method public int getGravity();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public boolean hasAntiAlias();
+    method public boolean hasMipMap();
+    method public boolean isCircular();
+    method public void setAlpha(int);
+    method public void setAntiAlias(boolean);
+    method public void setCircular(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setCornerRadius(float);
+    method public void setDither(boolean);
+    method public void setGravity(int);
+    method public void setMipMap(boolean);
+    method public void setTargetDensity(android.graphics.Canvas);
+    method public void setTargetDensity(android.util.DisplayMetrics);
+    method public void setTargetDensity(int);
+  }
+
+  public final class RoundedBitmapDrawableFactory {
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+  }
+
+}
+
+package androidx.core.hardware.display {
+
+  public final class DisplayManagerCompat {
+    method public android.view.Display? getDisplay(int);
+    method public android.view.Display![] getDisplays();
+    method public android.view.Display![] getDisplays(String?);
+    method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+    field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+  }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+  @Deprecated public class FingerprintManagerCompat {
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+    method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+  }
+
+  @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+    method @Deprecated public void onAuthenticationError(int, CharSequence!);
+    method @Deprecated public void onAuthenticationFailed();
+    method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+    method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+  }
+
+  @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+    method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+  }
+
+  @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+    method @Deprecated public javax.crypto.Cipher? getCipher();
+    method @Deprecated public javax.crypto.Mac? getMac();
+    method @Deprecated public java.security.Signature? getSignature();
+  }
+
+}
+
+package androidx.core.location {
+
+  public final class LocationManagerCompat {
+    method public static boolean isLocationEnabled(android.location.LocationManager);
+  }
+
+}
+
+package androidx.core.math {
+
+  public class MathUtils {
+    method public static float clamp(float, float, float);
+    method public static double clamp(double, double, double);
+    method public static int clamp(int, int, int);
+    method public static long clamp(long, long, long);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class ConnectivityManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+  }
+
+  public final class TrafficStatsCompat {
+    method @Deprecated public static void clearThreadStatsTag();
+    method @Deprecated public static int getThreadStatsTag();
+    method @Deprecated public static void incrementOperationCount(int);
+    method @Deprecated public static void incrementOperationCount(int, int);
+    method @Deprecated public static void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+  }
+
+  public final class UriCompat {
+    method public static String toSafeString(android.net.Uri);
+  }
+
+}
+
+package androidx.core.os {
+
+  public class BuildCompat {
+    method @Deprecated public static boolean isAtLeastN();
+    method @Deprecated public static boolean isAtLeastNMR1();
+    method @Deprecated public static boolean isAtLeastO();
+    method @Deprecated public static boolean isAtLeastOMR1();
+    method @Deprecated public static boolean isAtLeastP();
+    method @Deprecated public static boolean isAtLeastQ();
+    method public static boolean isAtLeastR();
+  }
+
+  public final class CancellationSignal {
+    ctor public CancellationSignal();
+    method public void cancel();
+    method public Object? getCancellationSignalObject();
+    method public boolean isCanceled();
+    method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+    method public void throwIfCanceled();
+  }
+
+  public static interface CancellationSignal.OnCancelListener {
+    method public void onCancel();
+  }
+
+  public final class ConfigurationCompat {
+    method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+  }
+
+  public final class EnvironmentCompat {
+    method public static String getStorageState(java.io.File);
+    field public static final String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public final class HandlerCompat {
+    method public static android.os.Handler createAsync(android.os.Looper);
+    method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+    method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+  }
+
+  public final class LocaleListCompat {
+    method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
+    method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+    method public java.util.Locale! get(int);
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+    method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+    method public java.util.Locale? getFirstMatch(String![]);
+    method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale!);
+    method public boolean isEmpty();
+    method @IntRange(from=0) public int size();
+    method public String toLanguageTags();
+    method public Object? unwrap();
+    method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+    method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+  }
+
+  public final class MessageCompat {
+    method public static boolean isAsynchronous(android.os.Message);
+    method public static void setAsynchronous(android.os.Message, boolean);
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(String?);
+  }
+
+  public final class ParcelCompat {
+    method public static boolean readBoolean(android.os.Parcel);
+    method public static void writeBoolean(android.os.Parcel, boolean);
+  }
+
+  @Deprecated public final class ParcelableCompat {
+    method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
+  }
+
+  @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+    method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+    method @Deprecated public T![]! newArray(int);
+  }
+
+  @Deprecated public final class TraceCompat {
+    method @Deprecated public static void beginAsyncSection(String, int);
+    method @Deprecated public static void beginSection(String);
+    method @Deprecated public static void endAsyncSection(String, int);
+    method @Deprecated public static void endSection();
+    method @Deprecated public static boolean isEnabled();
+    method @Deprecated public static void setCounter(String, int);
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package androidx.core.provider {
+
+  public final class FontRequest {
+    ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
+    ctor public FontRequest(String, String, String, @ArrayRes int);
+    method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
+    method @ArrayRes public int getCertificatesArrayResId();
+    method public String getProviderAuthority();
+    method public String getProviderPackage();
+    method public String getQuery();
+  }
+
+  public class FontsContractCompat {
+    method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
+    method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+  }
+
+  public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+    ctor public FontsContractCompat.Columns();
+    field public static final String FILE_ID = "file_id";
+    field public static final String ITALIC = "font_italic";
+    field public static final String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final String TTC_INDEX = "font_ttc_index";
+    field public static final String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final String WEIGHT = "font_weight";
+  }
+
+  public static class FontsContractCompat.FontFamilyResult {
+    method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
+    method public int getStatusCode();
+    field public static final int STATUS_OK = 0; // 0x0
+    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+  }
+
+  public static class FontsContractCompat.FontInfo {
+    method public int getResultCode();
+    method @IntRange(from=0) public int getTtcIndex();
+    method public android.net.Uri getUri();
+    method @IntRange(from=1, to=1000) public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static class FontsContractCompat.FontRequestCallback {
+    ctor public FontsContractCompat.FontRequestCallback();
+    method public void onTypefaceRequestFailed(int);
+    method public void onTypefaceRetrieved(android.graphics.Typeface!);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+  }
+
+}
+
+package androidx.core.telephony.mbms {
+
+  public final class MbmsHelper {
+    method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class BidiFormatter {
+    method public static androidx.core.text.BidiFormatter! getInstance();
+    method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+    method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+    method public boolean getStereoReset();
+    method public boolean isRtl(String!);
+    method public boolean isRtl(CharSequence!);
+    method public boolean isRtlContext();
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public String! unicodeWrap(String!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, boolean);
+    method public String! unicodeWrap(String!);
+    method public CharSequence! unicodeWrap(CharSequence!);
+  }
+
+  public static final class BidiFormatter.Builder {
+    ctor public BidiFormatter.Builder();
+    ctor public BidiFormatter.Builder(boolean);
+    ctor public BidiFormatter.Builder(java.util.Locale!);
+    method public androidx.core.text.BidiFormatter! build();
+    method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+    method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+  }
+
+  public final class HtmlCompat {
+    method public static android.text.Spanned fromHtml(String, int);
+    method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+    method public static String toHtml(android.text.Spanned, int);
+    field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+    field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+    field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+    field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+    field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+  }
+
+  public final class ICUCompat {
+    method public static String? maximizeAndGetScript(java.util.Locale!);
+  }
+
+  public class PrecomputedTextCompat implements android.text.Spannable {
+    method public char charAt(int);
+    method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+    method @IntRange(from=0) public int getParagraphCount();
+    method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+    method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+    method public int getSpanEnd(Object!);
+    method public int getSpanFlags(Object!);
+    method public int getSpanStart(Object!);
+    method public <T> T![]! getSpans(int, int, Class<T!>!);
+    method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+    method public int length();
+    method public int nextSpanTransition(int, int, Class!);
+    method public void removeSpan(Object!);
+    method public void setSpan(Object!, int, int, int);
+    method public CharSequence! subSequence(int, int);
+  }
+
+  public static final class PrecomputedTextCompat.Params {
+    ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+    method @RequiresApi(23) public int getBreakStrategy();
+    method @RequiresApi(23) public int getHyphenationFrequency();
+    method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+    method public android.text.TextPaint getTextPaint();
+  }
+
+  public static class PrecomputedTextCompat.Params.Builder {
+    ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+    method public androidx.core.text.PrecomputedTextCompat.Params build();
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+    method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+  }
+
+  public interface TextDirectionHeuristicCompat {
+    method public boolean isRtl(char[]!, int, int);
+    method public boolean isRtl(CharSequence!, int, int);
+  }
+
+  public final class TextDirectionHeuristicsCompat {
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+  }
+
+  public final class TextUtilsCompat {
+    method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+    method public static String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.text.util {
+
+  public final class LinkifyCompat {
+    method public static boolean addLinks(android.text.Spannable, int);
+    method public static boolean addLinks(android.widget.TextView, int);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+  }
+
+}
+
+package androidx.core.util {
+
+  public class AtomicFile {
+    ctor public AtomicFile(java.io.File);
+    method public void delete();
+    method public void failWrite(java.io.FileOutputStream?);
+    method public void finishWrite(java.io.FileOutputStream?);
+    method public java.io.File getBaseFile();
+    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+    method public byte[] readFully() throws java.io.IOException;
+    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+  }
+
+  public interface Consumer<T> {
+    method public void accept(T!);
+  }
+
+  public class ObjectsCompat {
+    method public static boolean equals(Object?, Object?);
+    method public static int hash(java.lang.Object!...);
+    method public static int hashCode(Object?);
+  }
+
+  public class Pair<F, S> {
+    ctor public Pair(F?, S?);
+    method public static <A, B> androidx.core.util.Pair<A!,B!> create(A?, B?);
+    field public final F? first;
+    field public final S? second;
+  }
+
+  public final class PatternsCompat {
+    field public static final java.util.regex.Pattern! DOMAIN_NAME;
+    field public static final java.util.regex.Pattern! EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern! IP_ADDRESS;
+    field public static final java.util.regex.Pattern! WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static interface Pools.Pool<T> {
+    method public T? acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+    ctor public Pools.SimplePool(int);
+    method public T! acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  public interface Predicate<T> {
+    method public boolean test(T!);
+  }
+
+  public interface Supplier<T> {
+    method public T! get();
+  }
+
+}
+
+package androidx.core.view {
+
+  public class AccessibilityDelegateCompat {
+    ctor public AccessibilityDelegateCompat();
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View!);
+    method public void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public void onInitializeAccessibilityNodeInfo(android.view.View!, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean performAccessibilityAction(android.view.View!, int, android.os.Bundle!);
+    method public void sendAccessibilityEvent(android.view.View!, int);
+    method public void sendAccessibilityEventUnchecked(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public abstract class ActionProvider {
+    ctor public ActionProvider(android.content.Context!);
+    method public android.content.Context! getContext();
+    method public boolean hasSubMenu();
+    method public boolean isVisible();
+    method public abstract android.view.View! onCreateActionView();
+    method public android.view.View! onCreateActionView(android.view.MenuItem!);
+    method public boolean onPerformDefaultAction();
+    method public void onPrepareSubMenu(android.view.SubMenu!);
+    method public boolean overridesItemVisibility();
+    method public void refreshVisibility();
+    method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener!);
+  }
+
+  public static interface ActionProvider.VisibilityListener {
+    method public void onActionProviderVisibilityChanged(boolean);
+  }
+
+  public final class DisplayCompat {
+    method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
+  }
+
+  public static final class DisplayCompat.ModeCompat {
+    method public int getPhysicalHeight();
+    method public int getPhysicalWidth();
+    method public boolean isNative();
+    method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
+  }
+
+  public final class DisplayCutoutCompat {
+    ctor public DisplayCutoutCompat(android.graphics.Rect!, java.util.List<android.graphics.Rect!>!);
+    method public java.util.List<android.graphics.Rect!>! getBoundingRects();
+    method public int getSafeInsetBottom();
+    method public int getSafeInsetLeft();
+    method public int getSafeInsetRight();
+    method public int getSafeInsetTop();
+  }
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View!, androidx.core.view.DragStartHelper.OnDragStartListener!);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point!);
+    method public boolean onLongClick(android.view.View!);
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+  }
+
+  public static interface DragStartHelper.OnDragStartListener {
+    method public boolean onDragStart(android.view.View!, androidx.core.view.DragStartHelper!);
+  }
+
+  public final class GestureDetectorCompat {
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!);
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!, android.os.Handler!);
+    method public boolean isLongpressEnabled();
+    method public boolean onTouchEvent(android.view.MotionEvent!);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener!);
+  }
+
+  public final class GravityCompat {
+    method public static void apply(int, int, int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static void apply(int, int, int, android.graphics.Rect!, int, int, android.graphics.Rect!, int);
+    method public static void applyDisplay(int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static int getAbsoluteGravity(int, int);
+    field public static final int END = 8388613; // 0x800005
+    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+    field public static final int START = 8388611; // 0x800003
+  }
+
+  public final class InputDeviceCompat {
+    field public static final int SOURCE_ANY = -256; // 0xffffff00
+    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+    field public static final int SOURCE_DPAD = 513; // 0x201
+    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+    field public static final int SOURCE_KEYBOARD = 257; // 0x101
+    field public static final int SOURCE_MOUSE = 8194; // 0x2002
+    field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+    field public static final int SOURCE_STYLUS = 16386; // 0x4002
+    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  public final class LayoutInflaterCompat {
+    method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+    method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+  }
+
+  @Deprecated public interface LayoutInflaterFactory {
+    method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+  }
+
+  public final class MarginLayoutParamsCompat {
+    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams!);
+    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams!);
+    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams!, int);
+  }
+
+  public final class MenuCompat {
+    method public static void setGroupDividerEnabled(android.view.Menu!, boolean);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+  }
+
+  public final class MenuItemCompat {
+    method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+    method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+    method public static androidx.core.view.ActionProvider! getActionProvider(android.view.MenuItem!);
+    method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+    method public static int getAlphabeticModifiers(android.view.MenuItem!);
+    method public static CharSequence! getContentDescription(android.view.MenuItem!);
+    method public static android.content.res.ColorStateList! getIconTintList(android.view.MenuItem!);
+    method public static android.graphics.PorterDuff.Mode! getIconTintMode(android.view.MenuItem!);
+    method public static int getNumericModifiers(android.view.MenuItem!);
+    method public static CharSequence! getTooltipText(android.view.MenuItem!);
+    method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+    method public static android.view.MenuItem! setActionProvider(android.view.MenuItem!, androidx.core.view.ActionProvider!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+    method public static void setAlphabeticShortcut(android.view.MenuItem!, char, int);
+    method public static void setContentDescription(android.view.MenuItem!, CharSequence!);
+    method public static void setIconTintList(android.view.MenuItem!, android.content.res.ColorStateList!);
+    method public static void setIconTintMode(android.view.MenuItem!, android.graphics.PorterDuff.Mode!);
+    method public static void setNumericShortcut(android.view.MenuItem!, char, int);
+    method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+    method public static void setShortcut(android.view.MenuItem!, char, char, int, int);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+    method public static void setTooltipText(android.view.MenuItem!, CharSequence!);
+    field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+    method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+    method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+  }
+
+  public final class MotionEventCompat {
+    method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+    method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+    method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+    method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+    method @Deprecated public static int getSource(android.view.MotionEvent!);
+    method @Deprecated public static float getX(android.view.MotionEvent!, int);
+    method @Deprecated public static float getY(android.view.MotionEvent!, int);
+    method public static boolean isFromSource(android.view.MotionEvent!, int);
+    field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+    field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+    field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+    field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+    field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+    field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+    field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+    field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+    field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+    field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+    field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+    field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+    field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+    field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+    field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+    field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+    field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+    field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+    field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+    field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+    field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+    field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+    field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+    field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+    field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+    field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+    field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+    field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+    field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+    field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+    field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+    field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+    field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+    field @Deprecated public static final int AXIS_RX = 12; // 0xc
+    field @Deprecated public static final int AXIS_RY = 13; // 0xd
+    field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SCROLL = 26; // 0x1a
+    field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+    field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+    field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+    field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+    field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+    field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+    field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+    field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+    field @Deprecated public static final int AXIS_X = 0; // 0x0
+    field @Deprecated public static final int AXIS_Y = 1; // 0x1
+    field @Deprecated public static final int AXIS_Z = 11; // 0xb
+    field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  public interface NestedScrollingChild {
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean isNestedScrollingEnabled();
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public void stopNestedScroll();
+  }
+
+  public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+  }
+
+  public class NestedScrollingChildHelper {
+    ctor public NestedScrollingChildHelper(android.view.View);
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isNestedScrollingEnabled();
+    method public void onDetachedFromWindow();
+    method public void onStopNestedScroll(android.view.View);
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll();
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingParent {
+    method public int getNestedScrollAxes();
+    method public boolean onNestedFling(android.view.View, float, float, boolean);
+    method public boolean onNestedPreFling(android.view.View, float, float);
+    method public void onNestedPreScroll(android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int);
+    method public void onStopNestedScroll(android.view.View);
+  }
+
+  public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+  }
+
+  public class NestedScrollingParentHelper {
+    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+    method public int getNestedScrollAxes();
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface OnApplyWindowInsetsListener {
+    method public androidx.core.view.WindowInsetsCompat! onApplyWindowInsets(android.view.View!, androidx.core.view.WindowInsetsCompat!);
+  }
+
+  public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+    method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+    method public boolean onPreDraw();
+    method public void onViewAttachedToWindow(android.view.View!);
+    method public void onViewDetachedFromWindow(android.view.View!);
+    method public void removeListener();
+  }
+
+  public final class PointerIconCompat {
+    method public static androidx.core.view.PointerIconCompat! create(android.graphics.Bitmap!, float, float);
+    method public static androidx.core.view.PointerIconCompat! getSystemIcon(android.content.Context!, int);
+    method public static androidx.core.view.PointerIconCompat! load(android.content.res.Resources!, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector!);
+    method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector!, boolean);
+  }
+
+  public interface ScrollingView {
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+  }
+
+  public interface TintableBackgroundView {
+    method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @Deprecated public final class VelocityTrackerCompat {
+    method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+    method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+  }
+
+  public class ViewCompat {
+    ctor protected ViewCompat();
+    method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
+    method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+    method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+    method public static void cancelDragAndDrop(android.view.View);
+    method @Deprecated public static int combineMeasuredStates(int, int);
+    method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
+    method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method public static void dispatchFinishTemporaryDetach(android.view.View);
+    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, int);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+    method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int, int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int);
+    method public static void dispatchStartTemporaryDetach(android.view.View);
+    method public static void enableAccessibleClickableSpanSupport(android.view.View!);
+    method public static int generateViewId();
+    method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+    method public static int getAccessibilityLiveRegion(android.view.View);
+    method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View);
+    method @UiThread public static CharSequence! getAccessibilityPaneTitle(android.view.View!);
+    method @Deprecated public static float getAlpha(android.view.View!);
+    method public static android.content.res.ColorStateList! getBackgroundTintList(android.view.View);
+    method public static android.graphics.PorterDuff.Mode! getBackgroundTintMode(android.view.View);
+    method public static android.graphics.Rect? getClipBounds(android.view.View);
+    method public static android.view.Display? getDisplay(android.view.View);
+    method public static float getElevation(android.view.View);
+    method public static boolean getFitsSystemWindows(android.view.View);
+    method public static int getImportantForAccessibility(android.view.View);
+    method public static int getImportantForAutofill(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method @Deprecated public static int getLayerType(android.view.View!);
+    method public static int getLayoutDirection(android.view.View);
+    method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+    method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+    method @Deprecated public static int getMeasuredState(android.view.View!);
+    method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+    method public static int getMinimumHeight(android.view.View);
+    method public static int getMinimumWidth(android.view.View);
+    method public static int getNextClusterForwardId(android.view.View);
+    method @Deprecated public static int getOverScrollMode(android.view.View!);
+    method @Px public static int getPaddingEnd(android.view.View);
+    method @Px public static int getPaddingStart(android.view.View);
+    method public static android.view.ViewParent! getParentForAccessibility(android.view.View);
+    method @Deprecated public static float getPivotX(android.view.View!);
+    method @Deprecated public static float getPivotY(android.view.View!);
+    method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
+    method @Deprecated public static float getRotation(android.view.View!);
+    method @Deprecated public static float getRotationX(android.view.View!);
+    method @Deprecated public static float getRotationY(android.view.View!);
+    method @Deprecated public static float getScaleX(android.view.View!);
+    method @Deprecated public static float getScaleY(android.view.View!);
+    method public static int getScrollIndicators(android.view.View);
+    method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
+    method public static String? getTransitionName(android.view.View);
+    method @Deprecated public static float getTranslationX(android.view.View!);
+    method @Deprecated public static float getTranslationY(android.view.View!);
+    method public static float getTranslationZ(android.view.View);
+    method public static int getWindowSystemUiVisibility(android.view.View);
+    method @Deprecated public static float getX(android.view.View!);
+    method @Deprecated public static float getY(android.view.View!);
+    method public static float getZ(android.view.View);
+    method public static boolean hasAccessibilityDelegate(android.view.View);
+    method public static boolean hasExplicitFocusable(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View, int);
+    method public static boolean hasOnClickListeners(android.view.View);
+    method public static boolean hasOverlappingRendering(android.view.View);
+    method public static boolean hasTransientState(android.view.View);
+    method @UiThread public static boolean isAccessibilityHeading(android.view.View!);
+    method public static boolean isAttachedToWindow(android.view.View);
+    method public static boolean isFocusedByDefault(android.view.View);
+    method public static boolean isImportantForAccessibility(android.view.View);
+    method public static boolean isImportantForAutofill(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method @Deprecated public static boolean isOpaque(android.view.View!);
+    method public static boolean isPaddingRelative(android.view.View);
+    method @UiThread public static boolean isScreenReaderFocusable(android.view.View!);
+    method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+    method public static android.view.View! keyboardNavigationClusterSearch(android.view.View, android.view.View!, int);
+    method public static void offsetLeftAndRight(android.view.View, int);
+    method public static void offsetTopAndBottom(android.view.View, int);
+    method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle!);
+    method public static void postInvalidateOnAnimation(android.view.View);
+    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+    method public static void postOnAnimation(android.view.View, Runnable!);
+    method public static void postOnAnimationDelayed(android.view.View, Runnable!, long);
+    method public static void removeAccessibilityAction(android.view.View, int);
+    method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+    method public static void requestApplyInsets(android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+    method @Deprecated public static int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
+    method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
+    method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat!);
+    method @UiThread public static void setAccessibilityHeading(android.view.View!, boolean);
+    method public static void setAccessibilityLiveRegion(android.view.View, int);
+    method @UiThread public static void setAccessibilityPaneTitle(android.view.View!, CharSequence!);
+    method @Deprecated public static void setActivated(android.view.View!, boolean);
+    method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+    method public static void setAutofillHints(android.view.View, java.lang.String!...);
+    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList!);
+    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode!);
+    method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+    method public static void setClipBounds(android.view.View, android.graphics.Rect!);
+    method public static void setElevation(android.view.View, float);
+    method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+    method public static void setFocusedByDefault(android.view.View, boolean);
+    method public static void setHasTransientState(android.view.View, boolean);
+    method public static void setImportantForAccessibility(android.view.View, int);
+    method public static void setImportantForAutofill(android.view.View, int);
+    method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+    method public static void setLabelFor(android.view.View, @IdRes int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint!);
+    method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+    method public static void setLayoutDirection(android.view.View, int);
+    method public static void setNestedScrollingEnabled(android.view.View, boolean);
+    method public static void setNextClusterForwardId(android.view.View, int);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
+    method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+    method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+    method @Deprecated public static void setPivotX(android.view.View!, float);
+    method @Deprecated public static void setPivotY(android.view.View!, float);
+    method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat!);
+    method @Deprecated public static void setRotation(android.view.View!, float);
+    method @Deprecated public static void setRotationX(android.view.View!, float);
+    method @Deprecated public static void setRotationY(android.view.View!, float);
+    method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+    method @Deprecated public static void setScaleX(android.view.View!, float);
+    method @Deprecated public static void setScaleY(android.view.View!, float);
+    method @UiThread public static void setScreenReaderFocusable(android.view.View!, boolean);
+    method public static void setScrollIndicators(android.view.View, int);
+    method public static void setScrollIndicators(android.view.View, int, int);
+    method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
+    method public static void setTooltipText(android.view.View, CharSequence?);
+    method public static void setTransitionName(android.view.View, String!);
+    method @Deprecated public static void setTranslationX(android.view.View!, float);
+    method @Deprecated public static void setTranslationY(android.view.View!, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method @Deprecated public static void setX(android.view.View!, float);
+    method @Deprecated public static void setY(android.view.View!, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData!, android.view.View.DragShadowBuilder!, Object!, int);
+    method public static boolean startNestedScroll(android.view.View, int);
+    method public static boolean startNestedScroll(android.view.View, int, int);
+    method public static void stopNestedScroll(android.view.View);
+    method public static void stopNestedScroll(android.view.View, int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder!);
+    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+    field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+    field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+    field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+    field public static final int TYPE_NON_TOUCH = 1; // 0x1
+    field public static final int TYPE_TOUCH = 0; // 0x0
+  }
+
+  public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+    method public boolean onUnhandledKeyEvent(android.view.View!, android.view.KeyEvent!);
+  }
+
+  public final class ViewConfigurationCompat {
+    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static int getScaledHoverSlop(android.view.ViewConfiguration!);
+    method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+    method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration!, android.content.Context);
+  }
+
+  public final class ViewGroupCompat {
+    method public static int getLayoutMode(android.view.ViewGroup);
+    method public static int getNestedScrollAxes(android.view.ViewGroup);
+    method public static boolean isTransitionGroup(android.view.ViewGroup);
+    method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+  }
+
+  public final class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onNestedFling(android.view.ViewParent!, android.view.View!, float, float, boolean);
+    method public static boolean onNestedPreFling(android.view.ViewParent!, android.view.View!, float, float);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int, int[]);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!, int);
+    method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public final class ViewPropertyAnimatorCompat {
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alpha(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public android.view.animation.Interpolator! getInterpolator();
+    method public long getStartDelay();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotation(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setDuration(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setInterpolator(android.view.animation.Interpolator!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setStartDelay(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener!);
+    method public void start();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZ(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withEndAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withLayer();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withStartAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! x(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! xBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! y(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! yBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! z(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! zBy(float);
+  }
+
+  public interface ViewPropertyAnimatorListener {
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+    ctor public ViewPropertyAnimatorListenerAdapter();
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public interface ViewPropertyAnimatorUpdateListener {
+    method public void onAnimationUpdate(android.view.View!);
+  }
+
+  public final class WindowCompat {
+    method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
+    method public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
+    method public androidx.core.view.WindowInsetsCompat consumeStableInsets();
+    method public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
+    method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+    method public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
+    method public int getStableInsetBottom();
+    method public int getStableInsetLeft();
+    method public int getStableInsetRight();
+    method public int getStableInsetTop();
+    method public androidx.core.graphics.Insets getStableInsets();
+    method public androidx.core.graphics.Insets getSystemGestureInsets();
+    method public int getSystemWindowInsetBottom();
+    method public int getSystemWindowInsetLeft();
+    method public int getSystemWindowInsetRight();
+    method public int getSystemWindowInsetTop();
+    method public androidx.core.graphics.Insets getSystemWindowInsets();
+    method public androidx.core.graphics.Insets getTappableElementInsets();
+    method public boolean hasInsets();
+    method public boolean hasStableInsets();
+    method public boolean hasSystemWindowInsets();
+    method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method public boolean isConsumed();
+    method public boolean isRound();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+    method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
+  }
+
+  public static final class WindowInsetsCompat.Builder {
+    ctor public WindowInsetsCompat.Builder();
+    ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
+    method public androidx.core.view.WindowInsetsCompat build();
+    method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
+    method public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
+  }
+
+}
+
+package androidx.core.view.accessibility {
+
+  public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+    method public void onClick(android.view.View);
+  }
+
+  public final class AccessibilityEventCompat {
+    method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+    method public static int getAction(android.view.accessibility.AccessibilityEvent!);
+    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent!);
+    method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+    method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+    method public static void setAction(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent!, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+    field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+    field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+    field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+    field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+    field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+    field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+    field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  public final class AccessibilityManagerCompat {
+    method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+  }
+
+  @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method @Deprecated public void onAccessibilityStateChanged(boolean);
+  }
+
+  @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
+  public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+    method public void onTouchExplorationStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+    method public void addAction(int);
+    method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public void addChild(android.view.View!);
+    method public void addChild(android.view.View!, int);
+    method public boolean canOpenPopup();
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
+    method public int getActions();
+    method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public CharSequence! getClassName();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+    method public CharSequence! getContentDescription();
+    method public int getDrawingOrder();
+    method public CharSequence! getError();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence? getHintText();
+    method @Deprecated public Object! getInfo();
+    method public int getInputType();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+    method public int getLiveRegion();
+    method public int getMaxTextLength();
+    method public int getMovementGranularities();
+    method public CharSequence! getPackageName();
+    method public CharSequence? getPaneTitle();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+    method public CharSequence? getRoleDescription();
+    method public CharSequence! getText();
+    method public int getTextSelectionEnd();
+    method public int getTextSelectionStart();
+    method public CharSequence? getTooltipText();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+    method public String! getViewIdResourceName();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+    method public int getWindowId();
+    method public boolean isAccessibilityFocused();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isClickable();
+    method public boolean isContentInvalid();
+    method public boolean isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isHeading();
+    method public boolean isImportantForAccessibility();
+    method public boolean isLongClickable();
+    method public boolean isMultiLine();
+    method public boolean isPassword();
+    method public boolean isScreenReaderFocusable();
+    method public boolean isScrollable();
+    method public boolean isSelected();
+    method public boolean isShowingHintText();
+    method public boolean isTextEntryKey();
+    method public boolean isVisibleToUser();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public boolean performAction(int);
+    method public boolean performAction(int, android.os.Bundle!);
+    method public void recycle();
+    method public boolean refresh();
+    method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public boolean removeChild(android.view.View!);
+    method public boolean removeChild(android.view.View!, int);
+    method public void setAccessibilityFocused(boolean);
+    method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
+    method public void setBoundsInScreen(android.graphics.Rect!);
+    method public void setCanOpenPopup(boolean);
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setClassName(CharSequence!);
+    method public void setClickable(boolean);
+    method public void setCollectionInfo(Object!);
+    method public void setCollectionItemInfo(Object!);
+    method public void setContentDescription(CharSequence!);
+    method public void setContentInvalid(boolean);
+    method public void setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    method public void setEditable(boolean);
+    method public void setEnabled(boolean);
+    method public void setError(CharSequence!);
+    method public void setFocusable(boolean);
+    method public void setFocused(boolean);
+    method public void setHeading(boolean);
+    method public void setHintText(CharSequence?);
+    method public void setImportantForAccessibility(boolean);
+    method public void setInputType(int);
+    method public void setLabelFor(android.view.View!);
+    method public void setLabelFor(android.view.View!, int);
+    method public void setLabeledBy(android.view.View!);
+    method public void setLabeledBy(android.view.View!, int);
+    method public void setLiveRegion(int);
+    method public void setLongClickable(boolean);
+    method public void setMaxTextLength(int);
+    method public void setMovementGranularities(int);
+    method public void setMultiLine(boolean);
+    method public void setPackageName(CharSequence!);
+    method public void setPaneTitle(CharSequence?);
+    method public void setParent(android.view.View!);
+    method public void setParent(android.view.View!, int);
+    method public void setPassword(boolean);
+    method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+    method public void setRoleDescription(CharSequence?);
+    method public void setScreenReaderFocusable(boolean);
+    method public void setScrollable(boolean);
+    method public void setSelected(boolean);
+    method public void setShowingHintText(boolean);
+    method public void setSource(android.view.View!);
+    method public void setSource(android.view.View!, int);
+    method public void setText(CharSequence!);
+    method public void setTextEntryKey(boolean);
+    method public void setTextSelection(int, int);
+    method public void setTooltipText(CharSequence?);
+    method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
+    method public void setTraversalAfter(android.view.View!);
+    method public void setTraversalAfter(android.view.View!, int);
+    method public void setTraversalBefore(android.view.View!);
+    method public void setTraversalBefore(android.view.View!, int);
+    method public void setViewIdResourceName(String!);
+    method public void setVisibleToUser(boolean);
+    method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+    field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+    field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+    field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+    field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+    field public static final int ACTION_CLICK = 16; // 0x10
+    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+    field public static final int ACTION_COPY = 16384; // 0x4000
+    field public static final int ACTION_CUT = 65536; // 0x10000
+    field public static final int ACTION_DISMISS = 1048576; // 0x100000
+    field public static final int ACTION_EXPAND = 262144; // 0x40000
+    field public static final int ACTION_FOCUS = 1; // 0x1
+    field public static final int ACTION_LONG_CLICK = 32; // 0x20
+    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+    field public static final int ACTION_PASTE = 32768; // 0x8000
+    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+    field public static final int ACTION_SELECT = 4; // 0x4
+    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+    field public static final int FOCUS_INPUT = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+  }
+
+  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+    method public int getId();
+    method public CharSequence! getLabel();
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+    field public static final int SELECTION_MODE_NONE = 0; // 0x0
+    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    method @Deprecated public boolean isHeading();
+    method public boolean isSelected();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+    field public static final int RANGE_TYPE_INT = 0; // 0x0
+    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+  }
+
+  public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
+    ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
+    method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getRegionCount();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
+  }
+
+  public class AccessibilityNodeProviderCompat {
+    ctor public AccessibilityNodeProviderCompat();
+    ctor public AccessibilityNodeProviderCompat(Object!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String!, int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+    method public Object! getProvider();
+    method public boolean performAction(int, int, android.os.Bundle!);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor @Deprecated public AccessibilityRecordCompat(Object!);
+    method @Deprecated public boolean equals(Object?);
+    method @Deprecated public int getAddedCount();
+    method @Deprecated public CharSequence! getBeforeText();
+    method @Deprecated public CharSequence! getClassName();
+    method @Deprecated public CharSequence! getContentDescription();
+    method @Deprecated public int getCurrentItemIndex();
+    method @Deprecated public int getFromIndex();
+    method @Deprecated public Object! getImpl();
+    method @Deprecated public int getItemCount();
+    method @Deprecated public int getMaxScrollX();
+    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public int getMaxScrollY();
+    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public android.os.Parcelable! getParcelableData();
+    method @Deprecated public int getRemovedCount();
+    method @Deprecated public int getScrollX();
+    method @Deprecated public int getScrollY();
+    method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+    method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
+    method @Deprecated public int getToIndex();
+    method @Deprecated public int getWindowId();
+    method @Deprecated public int hashCode();
+    method @Deprecated public boolean isChecked();
+    method @Deprecated public boolean isEnabled();
+    method @Deprecated public boolean isFullScreen();
+    method @Deprecated public boolean isPassword();
+    method @Deprecated public boolean isScrollable();
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+    method @Deprecated public void recycle();
+    method @Deprecated public void setAddedCount(int);
+    method @Deprecated public void setBeforeText(CharSequence!);
+    method @Deprecated public void setChecked(boolean);
+    method @Deprecated public void setClassName(CharSequence!);
+    method @Deprecated public void setContentDescription(CharSequence!);
+    method @Deprecated public void setCurrentItemIndex(int);
+    method @Deprecated public void setEnabled(boolean);
+    method @Deprecated public void setFromIndex(int);
+    method @Deprecated public void setFullScreen(boolean);
+    method @Deprecated public void setItemCount(int);
+    method @Deprecated public void setMaxScrollX(int);
+    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setMaxScrollY(int);
+    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setParcelableData(android.os.Parcelable!);
+    method @Deprecated public void setPassword(boolean);
+    method @Deprecated public void setRemovedCount(int);
+    method @Deprecated public void setScrollX(int);
+    method @Deprecated public void setScrollY(int);
+    method @Deprecated public void setScrollable(boolean);
+    method @Deprecated public void setSource(android.view.View!);
+    method @Deprecated public void setSource(android.view.View!, int);
+    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View!, int);
+    method @Deprecated public void setToIndex(int);
+  }
+
+  public interface AccessibilityViewCommand {
+    method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+  }
+
+  public abstract static class AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.CommandArguments();
+  }
+
+  public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+    method public boolean getExtendSelection();
+    method public int getGranularity();
+  }
+
+  public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveHtmlArguments();
+    method public String! getHTMLElement();
+  }
+
+  public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveWindowArguments();
+    method public int getX();
+    method public int getY();
+  }
+
+  public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+    method public int getColumn();
+    method public int getRow();
+  }
+
+  public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetProgressArguments();
+    method public float getProgress();
+  }
+
+  public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetSelectionArguments();
+    method public int getEnd();
+    method public int getStart();
+  }
+
+  public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetTextArguments();
+    method public CharSequence! getText();
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getAnchor();
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public int getId();
+    method public int getLayer();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getRoot();
+    method public CharSequence! getTitle();
+    method public int getType();
+    method public boolean isAccessibilityFocused();
+    method public boolean isActive();
+    method public boolean isFocused();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat!);
+    method public void recycle();
+    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+    field public static final int TYPE_APPLICATION = 1; // 0x1
+    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+    field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package androidx.core.view.animation {
+
+  public final class PathInterpolatorCompat {
+    method public static android.view.animation.Interpolator! create(android.graphics.Path!);
+    method public static android.view.animation.Interpolator! create(float, float);
+    method public static android.view.animation.Interpolator! create(float, float, float, float);
+  }
+
+}
+
+package androidx.core.view.inputmethod {
+
+  public final class EditorInfoCompat {
+    ctor @Deprecated public EditorInfoCompat();
+    method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo!);
+    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
+    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+  }
+
+  public final class InputConnectionCompat {
+    ctor @Deprecated public InputConnectionCompat();
+    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+    method public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+    field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+  }
+
+  public static interface InputConnectionCompat.OnCommitContentListener {
+    method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat!, int, android.os.Bundle!);
+  }
+
+  public final class InputContentInfoCompat {
+    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+    method public android.net.Uri getContentUri();
+    method public android.content.ClipDescription getDescription();
+    method public android.net.Uri? getLinkUri();
+    method public void releasePermission();
+    method public void requestPermission();
+    method public Object? unwrap();
+    method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+    ctor public AutoScrollHelper(android.view.View);
+    method public abstract boolean canTargetScrollHorizontally(int);
+    method public abstract boolean canTargetScrollVertically(int);
+    method public boolean isEnabled();
+    method public boolean isExclusive();
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+    method public abstract void scrollTargetBy(int, int);
+    method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+    method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+    method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+    method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+    method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+    field public static final float NO_MAX = 3.4028235E38f;
+    field public static final float NO_MIN = 0.0f;
+    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+  }
+
+  public final class CompoundButtonCompat {
+    method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+    method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+    method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+  }
+
+  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+    ctor public ContentLoadingProgressBar(android.content.Context);
+    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+    method public void hide();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void show();
+  }
+
+  public final class EdgeEffectCompat {
+    ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+    method @Deprecated public boolean draw(android.graphics.Canvas!);
+    method @Deprecated public void finish();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean onAbsorb(int);
+    method @Deprecated public boolean onPull(float);
+    method @Deprecated public boolean onPull(float, float);
+    method public static void onPull(android.widget.EdgeEffect, float, float);
+    method @Deprecated public boolean onRelease();
+    method @Deprecated public void setSize(int, int);
+  }
+
+  public class ImageViewCompat {
+    method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+    method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class ListPopupWindowCompat {
+    method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+    method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+  }
+
+  public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+    ctor public ListViewAutoScrollHelper(android.widget.ListView);
+    method public boolean canTargetScrollHorizontally(int);
+    method public boolean canTargetScrollVertically(int);
+    method public void scrollTargetBy(int, int);
+  }
+
+  public final class ListViewCompat {
+    method public static boolean canScrollList(android.widget.ListView, int);
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
+    method public boolean arrowScroll(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isFillViewport();
+    method public boolean isSmoothScrollingEnabled();
+    method public void onAttachedToWindow();
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+    method public boolean pageScroll(int);
+    method public void setFillViewport(boolean);
+    method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
+    method public void setSmoothScrollingEnabled(boolean);
+    method public final void smoothScrollBy(int, int);
+    method public final void smoothScrollBy(int, int, int);
+    method public final void smoothScrollTo(int, int);
+    method public final void smoothScrollTo(int, int, int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public static interface NestedScrollView.OnScrollChangeListener {
+    method public void onScrollChange(androidx.core.widget.NestedScrollView!, int, int, int, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+  }
+
+  public final class PopupWindowCompat {
+    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+    method public static int getWindowLayoutType(android.widget.PopupWindow);
+    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  @Deprecated public final class ScrollerCompat {
+    method @Deprecated public void abortAnimation();
+    method @Deprecated public boolean computeScrollOffset();
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+    method @Deprecated public float getCurrVelocity();
+    method @Deprecated public int getCurrX();
+    method @Deprecated public int getCurrY();
+    method @Deprecated public int getFinalX();
+    method @Deprecated public int getFinalY();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean isOverScrolled();
+    method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+    method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+    method @Deprecated public boolean springBack(int, int, int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int, int);
+  }
+
+  public final class TextViewCompat {
+    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+    method public static int getAutoSizeMinTextSize(android.widget.TextView);
+    method public static int getAutoSizeStepGranularity(android.widget.TextView);
+    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+    method public static int getAutoSizeTextType(android.widget.TextView);
+    method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+    method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+    method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
+    method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+    method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+    method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+    method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+    method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+    method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+    method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+    method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+  }
+
+  public interface TintableCompoundButton {
+    method public android.content.res.ColorStateList? getSupportButtonTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundDrawablesView {
+    method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+}
+
diff --git a/core/core/api/current.txt b/core/core/api/current.txt
index 727e60a..dcc9798 100644
--- a/core/core/api/current.txt
+++ b/core/core/api/current.txt
@@ -1381,13 +1381,13 @@
     method @Deprecated public T![]! newArray(int);
   }
 
-  public final class TraceCompat {
-    method public static void beginAsyncSection(String, int);
-    method public static void beginSection(String);
-    method public static void endAsyncSection(String, int);
-    method public static void endSection();
-    method public static boolean isEnabled();
-    method public static void setCounter(String, int);
+  @Deprecated public final class TraceCompat {
+    method @Deprecated public static void beginAsyncSection(String, int);
+    method @Deprecated public static void beginSection(String);
+    method @Deprecated public static void endAsyncSection(String, int);
+    method @Deprecated public static void endSection();
+    method @Deprecated public static boolean isEnabled();
+    method @Deprecated public static void setCounter(String, int);
   }
 
   public class UserManagerCompat {
diff --git a/core/core/api/public_plus_experimental_1.4.0-alpha01.txt b/core/core/api/public_plus_experimental_1.4.0-alpha01.txt
new file mode 100644
index 0000000..7a61bb2
--- /dev/null
+++ b/core/core/api/public_plus_experimental_1.4.0-alpha01.txt
@@ -0,0 +1,3124 @@
+// Signature format: 3.0
+package androidx.core.accessibilityservice {
+
+  public final class AccessibilityServiceInfoCompat {
+    method public static String capabilityToString(int);
+    method public static String feedbackTypeToString(int);
+    method public static String? flagToString(int);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+  }
+
+}
+
+package androidx.core.app {
+
+  public class ActivityCompat extends androidx.core.content.ContextCompat {
+    ctor protected ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method public static android.net.Uri? getReferrer(android.app.Activity);
+    method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+    method public static void postponeEnterTransition(android.app.Activity);
+    method public static void recreate(android.app.Activity);
+    method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity!, android.view.DragEvent!);
+    method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+    method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+    method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public static void startPostponedEnterTransition(android.app.Activity);
+  }
+
+  public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+    method public void onRequestPermissionsResult(int, String![], int[]);
+  }
+
+  public static interface ActivityCompat.PermissionCompatDelegate {
+    method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+    method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public android.graphics.Rect? getLaunchBounds();
+    method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+    method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
+    method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+    method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+    method public android.os.Bundle? toBundle();
+    method public void update(androidx.core.app.ActivityOptionsCompat);
+    field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public final class AlarmManagerCompat {
+    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+  }
+
+  @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+    ctor public AppComponentFactory();
+    method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+  }
+
+  public class AppLaunchChecker {
+    ctor @Deprecated public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public final class AppOpsManagerCompat {
+    method public static int noteOp(android.content.Context, String, int, String);
+    method public static int noteOpNoThrow(android.content.Context, String, int, String);
+    method public static int noteProxyOp(android.content.Context, String, String);
+    method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+    method public static String? permissionToOp(String);
+    field public static final int MODE_ALLOWED = 0; // 0x0
+    field public static final int MODE_DEFAULT = 3; // 0x3
+    field public static final int MODE_ERRORED = 2; // 0x2
+    field public static final int MODE_IGNORED = 1; // 0x1
+  }
+
+  public final class BundleCompat {
+    method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+    method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+  }
+
+  public class DialogCompat {
+    method public static android.view.View requireViewById(android.app.Dialog, int);
+  }
+
+  public class FrameMetricsAggregator {
+    ctor public FrameMetricsAggregator();
+    ctor public FrameMetricsAggregator(int);
+    method public void add(android.app.Activity);
+    method public android.util.SparseIntArray![]? getMetrics();
+    method public android.util.SparseIntArray![]? remove(android.app.Activity);
+    method public android.util.SparseIntArray![]? reset();
+    method public android.util.SparseIntArray![]? stop();
+    field public static final int ANIMATION_DURATION = 256; // 0x100
+    field public static final int ANIMATION_INDEX = 8; // 0x8
+    field public static final int COMMAND_DURATION = 32; // 0x20
+    field public static final int COMMAND_INDEX = 5; // 0x5
+    field public static final int DELAY_DURATION = 128; // 0x80
+    field public static final int DELAY_INDEX = 7; // 0x7
+    field public static final int DRAW_DURATION = 8; // 0x8
+    field public static final int DRAW_INDEX = 3; // 0x3
+    field public static final int EVERY_DURATION = 511; // 0x1ff
+    field public static final int INPUT_DURATION = 2; // 0x2
+    field public static final int INPUT_INDEX = 1; // 0x1
+    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+    field public static final int SWAP_DURATION = 64; // 0x40
+    field public static final int SWAP_INDEX = 6; // 0x6
+    field public static final int SYNC_DURATION = 16; // 0x10
+    field public static final int SYNC_INDEX = 4; // 0x4
+    field public static final int TOTAL_DURATION = 1; // 0x1
+    field public static final int TOTAL_INDEX = 0; // 0x0
+  }
+
+  public abstract class JobIntentService extends android.app.Service {
+    ctor public JobIntentService();
+    method public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
+    method public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+    method public boolean isStopped();
+    method public android.os.IBinder! onBind(android.content.Intent);
+    method protected abstract void onHandleWork(android.content.Intent);
+    method public boolean onStopCurrentWork();
+    method public void setInterruptIfStopped(boolean);
+  }
+
+  public final class NavUtils {
+    method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static String? getParentActivityName(android.app.Activity);
+    method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void navigateUpFromSameTask(android.app.Activity);
+    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+    field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+  }
+
+  public class NotificationCompat {
+    ctor @Deprecated public NotificationCompat();
+    method public static androidx.core.app.NotificationCompat.Action! getAction(android.app.Notification!, int);
+    method public static int getActionCount(android.app.Notification!);
+    method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification!);
+    method public static int getBadgeIconType(android.app.Notification!);
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
+    method public static String! getCategory(android.app.Notification!);
+    method public static String! getChannelId(android.app.Notification!);
+    method @RequiresApi(19) public static CharSequence! getContentTitle(android.app.Notification!);
+    method public static android.os.Bundle? getExtras(android.app.Notification!);
+    method public static String! getGroup(android.app.Notification!);
+    method public static int getGroupAlertBehavior(android.app.Notification!);
+    method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!>! getInvisibleActions(android.app.Notification!);
+    method public static boolean getLocalOnly(android.app.Notification!);
+    method public static String! getShortcutId(android.app.Notification!);
+    method public static String! getSortKey(android.app.Notification!);
+    method public static long getTimeoutAfter(android.app.Notification!);
+    method public static boolean isGroupSummary(android.app.Notification!);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
+    field public static final String CATEGORY_ALARM = "alarm";
+    field public static final String CATEGORY_CALL = "call";
+    field public static final String CATEGORY_EMAIL = "email";
+    field public static final String CATEGORY_ERROR = "err";
+    field public static final String CATEGORY_EVENT = "event";
+    field public static final String CATEGORY_MESSAGE = "msg";
+    field public static final String CATEGORY_NAVIGATION = "navigation";
+    field public static final String CATEGORY_PROGRESS = "progress";
+    field public static final String CATEGORY_PROMO = "promo";
+    field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+    field public static final String CATEGORY_REMINDER = "reminder";
+    field public static final String CATEGORY_SERVICE = "service";
+    field public static final String CATEGORY_SOCIAL = "social";
+    field public static final String CATEGORY_STATUS = "status";
+    field public static final String CATEGORY_SYSTEM = "sys";
+    field public static final String CATEGORY_TRANSPORT = "transport";
+    field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+    field public static final int DEFAULT_ALL = -1; // 0xffffffff
+    field public static final int DEFAULT_LIGHTS = 4; // 0x4
+    field public static final int DEFAULT_SOUND = 1; // 0x1
+    field public static final int DEFAULT_VIBRATE = 2; // 0x2
+    field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+    field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+    field public static final String EXTRA_BIG_TEXT = "android.bigText";
+    field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+    field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+    field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+    field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+    field public static final String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+    field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+    field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+    field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+    field public static final String EXTRA_MESSAGES = "android.messages";
+    field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+    field public static final String EXTRA_PEOPLE = "android.people";
+    field public static final String EXTRA_PICTURE = "android.picture";
+    field public static final String EXTRA_PROGRESS = "android.progress";
+    field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+    field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+    field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+    field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+    field public static final String EXTRA_SMALL_ICON = "android.icon";
+    field public static final String EXTRA_SUB_TEXT = "android.subText";
+    field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+    field public static final String EXTRA_TEMPLATE = "android.template";
+    field public static final String EXTRA_TEXT = "android.text";
+    field public static final String EXTRA_TEXT_LINES = "android.textLines";
+    field public static final String EXTRA_TITLE = "android.title";
+    field public static final String EXTRA_TITLE_BIG = "android.title.big";
+    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+    field public static final int FLAG_BUBBLE = 4096; // 0x1000
+    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+    field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+    field public static final int FLAG_INSISTENT = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+    field public static final int FLAG_NO_CLEAR = 32; // 0x20
+    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+    field public static final int GROUP_ALERT_ALL = 0; // 0x0
+    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+    field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+    field public static final String GROUP_KEY_SILENT = "silent";
+    field public static final int PRIORITY_DEFAULT = 0; // 0x0
+    field public static final int PRIORITY_HIGH = 1; // 0x1
+    field public static final int PRIORITY_LOW = -1; // 0xffffffff
+    field public static final int PRIORITY_MAX = 2; // 0x2
+    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+  }
+
+  public static class NotificationCompat.Action {
+    ctor public NotificationCompat.Action(int, CharSequence!, android.app.PendingIntent!);
+    ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    method public android.app.PendingIntent! getActionIntent();
+    method public boolean getAllowGeneratedReplies();
+    method public androidx.core.app.RemoteInput![]! getDataOnlyRemoteInputs();
+    method public android.os.Bundle! getExtras();
+    method @Deprecated public int getIcon();
+    method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
+    method public androidx.core.app.RemoteInput![]! getRemoteInputs();
+    method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+    method public boolean getShowsUserInterface();
+    method public CharSequence! getTitle();
+    method public boolean isContextual();
+    field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+    field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
+    field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+    field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+    field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+    field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+    field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+    field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+    field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+    field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+    field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+    field public android.app.PendingIntent! actionIntent;
+    field @Deprecated public int icon;
+    field public CharSequence! title;
+  }
+
+  public static final class NotificationCompat.Action.Builder {
+    ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(int, CharSequence!, android.app.PendingIntent!);
+    ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action!);
+    method public androidx.core.app.NotificationCompat.Action.Builder! addExtras(android.os.Bundle!);
+    method public androidx.core.app.NotificationCompat.Action.Builder! addRemoteInput(androidx.core.app.RemoteInput!);
+    method public androidx.core.app.NotificationCompat.Action! build();
+    method public androidx.core.app.NotificationCompat.Action.Builder! extend(androidx.core.app.NotificationCompat.Action.Extender!);
+    method public android.os.Bundle! getExtras();
+    method public androidx.core.app.NotificationCompat.Action.Builder! setAllowGeneratedReplies(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder! setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+    method public androidx.core.app.NotificationCompat.Action.Builder! setShowsUserInterface(boolean);
+  }
+
+  public static interface NotificationCompat.Action.Extender {
+    method public androidx.core.app.NotificationCompat.Action.Builder! extend(androidx.core.app.NotificationCompat.Action.Builder!);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+  }
+
+  public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+    ctor public NotificationCompat.Action.WearableExtender();
+    ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action!);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender! clone();
+    method public androidx.core.app.NotificationCompat.Action.Builder! extend(androidx.core.app.NotificationCompat.Action.Builder!);
+    method @Deprecated public CharSequence! getCancelLabel();
+    method @Deprecated public CharSequence! getConfirmLabel();
+    method public boolean getHintDisplayActionInline();
+    method public boolean getHintLaunchesActivity();
+    method @Deprecated public CharSequence! getInProgressLabel();
+    method public boolean isAvailableOffline();
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender! setAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender! setCancelLabel(CharSequence!);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender! setConfirmLabel(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender! setHintDisplayActionInline(boolean);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender! setHintLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender! setInProgressLabel(CharSequence!);
+  }
+
+  public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigPictureStyle();
+    ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder!);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle! bigLargeIcon(android.graphics.Bitmap!);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle! bigPicture(android.graphics.Bitmap!);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle! setBigContentTitle(CharSequence!);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle! setSummaryText(CharSequence!);
+  }
+
+  public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigTextStyle();
+    ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder!);
+    method public androidx.core.app.NotificationCompat.BigTextStyle! bigText(CharSequence!);
+    method public androidx.core.app.NotificationCompat.BigTextStyle! setBigContentTitle(CharSequence!);
+    method public androidx.core.app.NotificationCompat.BigTextStyle! setSummaryText(CharSequence!);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata {
+    method @RequiresApi(29) public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
+    method public boolean getAutoExpandBubble();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
+    method @DimenRes public int getDesiredHeightResId();
+    method public androidx.core.graphics.drawable.IconCompat getIcon();
+    method public android.app.PendingIntent getIntent();
+    method public boolean isNotificationSuppressed();
+    method @RequiresApi(29) public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata.Builder {
+    ctor public NotificationCompat.BubbleMetadata.Builder();
+    method public androidx.core.app.NotificationCompat.BubbleMetadata build();
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
+  }
+
+  public static class NotificationCompat.Builder {
+    ctor public NotificationCompat.Builder(android.content.Context, String);
+    ctor @Deprecated public NotificationCompat.Builder(android.content.Context!);
+    method public androidx.core.app.NotificationCompat.Builder! addAction(int, CharSequence!, android.app.PendingIntent!);
+    method public androidx.core.app.NotificationCompat.Builder! addAction(androidx.core.app.NotificationCompat.Action!);
+    method public androidx.core.app.NotificationCompat.Builder! addExtras(android.os.Bundle!);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder! addInvisibleAction(int, CharSequence!, android.app.PendingIntent!);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder! addInvisibleAction(androidx.core.app.NotificationCompat.Action!);
+    method public androidx.core.app.NotificationCompat.Builder! addPerson(String!);
+    method public android.app.Notification! build();
+    method public androidx.core.app.NotificationCompat.Builder! extend(androidx.core.app.NotificationCompat.Extender!);
+    method public android.os.Bundle! getExtras();
+    method @Deprecated public android.app.Notification! getNotification();
+    method protected static CharSequence! limitCharSequenceLength(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setAutoCancel(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setBadgeIconType(int);
+    method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
+    method public androidx.core.app.NotificationCompat.Builder! setCategory(String!);
+    method public androidx.core.app.NotificationCompat.Builder! setChannelId(String);
+    method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.Builder! setColorized(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setContent(android.widget.RemoteViews!);
+    method public androidx.core.app.NotificationCompat.Builder! setContentInfo(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Builder! setContentIntent(android.app.PendingIntent!);
+    method public androidx.core.app.NotificationCompat.Builder! setContentText(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Builder! setContentTitle(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Builder! setCustomBigContentView(android.widget.RemoteViews!);
+    method public androidx.core.app.NotificationCompat.Builder! setCustomContentView(android.widget.RemoteViews!);
+    method public androidx.core.app.NotificationCompat.Builder! setCustomHeadsUpContentView(android.widget.RemoteViews!);
+    method public androidx.core.app.NotificationCompat.Builder! setDefaults(int);
+    method public androidx.core.app.NotificationCompat.Builder! setDeleteIntent(android.app.PendingIntent!);
+    method public androidx.core.app.NotificationCompat.Builder! setExtras(android.os.Bundle!);
+    method public androidx.core.app.NotificationCompat.Builder! setFullScreenIntent(android.app.PendingIntent!, boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setGroup(String!);
+    method public androidx.core.app.NotificationCompat.Builder! setGroupAlertBehavior(int);
+    method public androidx.core.app.NotificationCompat.Builder! setGroupSummary(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setLargeIcon(android.graphics.Bitmap!);
+    method public androidx.core.app.NotificationCompat.Builder! setLights(@ColorInt int, int, int);
+    method public androidx.core.app.NotificationCompat.Builder! setLocalOnly(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
+    method public androidx.core.app.NotificationCompat.Builder! setNumber(int);
+    method public androidx.core.app.NotificationCompat.Builder! setOngoing(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setOnlyAlertOnce(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setPriority(int);
+    method public androidx.core.app.NotificationCompat.Builder! setProgress(int, int, boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setPublicVersion(android.app.Notification!);
+    method public androidx.core.app.NotificationCompat.Builder! setRemoteInputHistory(CharSequence![]!);
+    method public androidx.core.app.NotificationCompat.Builder! setShortcutId(String!);
+    method public androidx.core.app.NotificationCompat.Builder! setShowWhen(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setSmallIcon(int);
+    method public androidx.core.app.NotificationCompat.Builder! setSmallIcon(int, int);
+    method public androidx.core.app.NotificationCompat.Builder! setSortKey(String!);
+    method public androidx.core.app.NotificationCompat.Builder! setSound(android.net.Uri!);
+    method public androidx.core.app.NotificationCompat.Builder! setSound(android.net.Uri!, int);
+    method public androidx.core.app.NotificationCompat.Builder! setStyle(androidx.core.app.NotificationCompat.Style!);
+    method public androidx.core.app.NotificationCompat.Builder! setSubText(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Builder! setTicker(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Builder! setTicker(CharSequence!, android.widget.RemoteViews!);
+    method public androidx.core.app.NotificationCompat.Builder! setTimeoutAfter(long);
+    method public androidx.core.app.NotificationCompat.Builder! setUsesChronometer(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setVibrate(long[]!);
+    method public androidx.core.app.NotificationCompat.Builder! setVisibility(int);
+    method public androidx.core.app.NotificationCompat.Builder! setWhen(long);
+    field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
+  }
+
+  public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.CarExtender();
+    ctor public NotificationCompat.CarExtender(android.app.Notification!);
+    method public androidx.core.app.NotificationCompat.Builder! extend(androidx.core.app.NotificationCompat.Builder!);
+    method @ColorInt public int getColor();
+    method public android.graphics.Bitmap! getLargeIcon();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation! getUnreadConversation();
+    method public androidx.core.app.NotificationCompat.CarExtender! setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CarExtender! setLargeIcon(android.graphics.Bitmap!);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender! setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation!);
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
+    method @Deprecated public long getLatestTimestamp();
+    method @Deprecated public String![]! getMessages();
+    method @Deprecated public String! getParticipant();
+    method @Deprecated public String![]! getParticipants();
+    method @Deprecated public android.app.PendingIntent! getReadPendingIntent();
+    method @Deprecated public androidx.core.app.RemoteInput! getRemoteInput();
+    method @Deprecated public android.app.PendingIntent! getReplyPendingIntent();
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+    ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String!);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder! addMessage(String!);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation! build();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder! setLatestTimestamp(long);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder! setReadPendingIntent(android.app.PendingIntent!);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder! setReplyAction(android.app.PendingIntent!, androidx.core.app.RemoteInput!);
+  }
+
+  public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  public static interface NotificationCompat.Extender {
+    method public androidx.core.app.NotificationCompat.Builder! extend(androidx.core.app.NotificationCompat.Builder!);
+  }
+
+  public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.InboxStyle();
+    ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder!);
+    method public androidx.core.app.NotificationCompat.InboxStyle! addLine(CharSequence!);
+    method public androidx.core.app.NotificationCompat.InboxStyle! setBigContentTitle(CharSequence!);
+    method public androidx.core.app.NotificationCompat.InboxStyle! setSummaryText(CharSequence!);
+  }
+
+  public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+    ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+    method public void addCompatExtras(android.os.Bundle!);
+    method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle! addMessage(CharSequence!, long, CharSequence!);
+    method public androidx.core.app.NotificationCompat.MessagingStyle! addMessage(CharSequence!, long, androidx.core.app.Person!);
+    method public androidx.core.app.NotificationCompat.MessagingStyle! addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message!);
+    method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification!);
+    method public CharSequence? getConversationTitle();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!>! getMessages();
+    method public androidx.core.app.Person! getUser();
+    method @Deprecated public CharSequence! getUserDisplayName();
+    method public boolean isGroupConversation();
+    method public androidx.core.app.NotificationCompat.MessagingStyle! setConversationTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle! setGroupConversation(boolean);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(CharSequence!, long, androidx.core.app.Person?);
+    ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence!, long, CharSequence!);
+    method public String? getDataMimeType();
+    method public android.net.Uri? getDataUri();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.Person? getPerson();
+    method @Deprecated public CharSequence? getSender();
+    method public CharSequence getText();
+    method public long getTimestamp();
+    method public androidx.core.app.NotificationCompat.MessagingStyle.Message! setData(String!, android.net.Uri!);
+  }
+
+  public abstract static class NotificationCompat.Style {
+    ctor public NotificationCompat.Style();
+    method public android.app.Notification! build();
+    method public void setBuilder(androidx.core.app.NotificationCompat.Builder!);
+  }
+
+  public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.WearableExtender();
+    ctor public NotificationCompat.WearableExtender(android.app.Notification!);
+    method public androidx.core.app.NotificationCompat.WearableExtender! addAction(androidx.core.app.NotificationCompat.Action!);
+    method public androidx.core.app.NotificationCompat.WearableExtender! addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>!);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! addPage(android.app.Notification!);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! addPages(java.util.List<android.app.Notification!>!);
+    method public androidx.core.app.NotificationCompat.WearableExtender! clearActions();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! clearPages();
+    method public androidx.core.app.NotificationCompat.WearableExtender! clone();
+    method public androidx.core.app.NotificationCompat.Builder! extend(androidx.core.app.NotificationCompat.Builder!);
+    method public java.util.List<androidx.core.app.NotificationCompat.Action!>! getActions();
+    method @Deprecated public android.graphics.Bitmap! getBackground();
+    method public String! getBridgeTag();
+    method public int getContentAction();
+    method @Deprecated public int getContentIcon();
+    method @Deprecated public int getContentIconGravity();
+    method public boolean getContentIntentAvailableOffline();
+    method @Deprecated public int getCustomContentHeight();
+    method @Deprecated public int getCustomSizePreset();
+    method public String! getDismissalId();
+    method @Deprecated public android.app.PendingIntent! getDisplayIntent();
+    method @Deprecated public int getGravity();
+    method @Deprecated public boolean getHintAmbientBigPicture();
+    method @Deprecated public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    method @Deprecated public boolean getHintHideIcon();
+    method @Deprecated public int getHintScreenTimeout();
+    method @Deprecated public boolean getHintShowBackgroundOnly();
+    method @Deprecated public java.util.List<android.app.Notification!>! getPages();
+    method public boolean getStartScrollBottom();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setBackground(android.graphics.Bitmap!);
+    method public androidx.core.app.NotificationCompat.WearableExtender! setBridgeTag(String!);
+    method public androidx.core.app.NotificationCompat.WearableExtender! setContentAction(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setContentIcon(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setContentIconGravity(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender! setContentIntentAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setCustomContentHeight(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setCustomSizePreset(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender! setDismissalId(String!);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setDisplayIntent(android.app.PendingIntent!);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setGravity(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintAmbientBigPicture(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintAvoidBackgroundClipping(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender! setHintContentIntentLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintHideIcon(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintScreenTimeout(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintShowBackgroundOnly(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender! setStartScrollBottom(boolean);
+    field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+    field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+    field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+    field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+    field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+    field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+    field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+    field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+  }
+
+  public final class NotificationCompatExtras {
+    field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+    field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+    field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+    field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+    field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+    field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+  }
+
+  public abstract class NotificationCompatSideChannelService extends android.app.Service {
+    ctor public NotificationCompatSideChannelService();
+    method public abstract void cancel(String!, int, String!);
+    method public abstract void cancelAll(String!);
+    method public abstract void notify(String!, int, String!, android.app.Notification!);
+    method public android.os.IBinder! onBind(android.content.Intent!);
+  }
+
+  public final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(android.app.NotificationChannel);
+    method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+    method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
+    method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public android.app.NotificationChannel? getNotificationChannel(String);
+    method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+    method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
+    method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
+    method public void notify(int, android.app.Notification);
+    method public void notify(String?, int, android.app.Notification);
+    field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+    field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public class Person {
+    method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public String? getKey();
+    method public CharSequence? getName();
+    method public String? getUri();
+    method public boolean isBot();
+    method public boolean isImportant();
+    method public androidx.core.app.Person.Builder toBuilder();
+    method public android.os.Bundle toBundle();
+  }
+
+  public static class Person.Builder {
+    ctor public Person.Builder();
+    method public androidx.core.app.Person build();
+    method public androidx.core.app.Person.Builder setBot(boolean);
+    method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+    method public androidx.core.app.Person.Builder setImportant(boolean);
+    method public androidx.core.app.Person.Builder setKey(String?);
+    method public androidx.core.app.Person.Builder setName(CharSequence?);
+    method public androidx.core.app.Person.Builder setUri(String?);
+  }
+
+  public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
+    ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+    ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+    method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+    method public android.app.PendingIntent getActionIntent();
+    method public CharSequence getContentDescription();
+    method public androidx.core.graphics.drawable.IconCompat getIcon();
+    method public CharSequence getTitle();
+    method public boolean isEnabled();
+    method public void setEnabled(boolean);
+    method public void setShouldShowIcon(boolean);
+    method public boolean shouldShowIcon();
+    method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+  }
+
+  public final class RemoteInput {
+    method public static void addDataResultToIntent(androidx.core.app.RemoteInput!, android.content.Intent!, java.util.Map<java.lang.String!,android.net.Uri!>!);
+    method public static void addResultsToIntent(androidx.core.app.RemoteInput![]!, android.content.Intent!, android.os.Bundle!);
+    method public boolean getAllowFreeFormInput();
+    method public java.util.Set<java.lang.String!>! getAllowedDataTypes();
+    method public CharSequence![]! getChoices();
+    method public static java.util.Map<java.lang.String!,android.net.Uri!>! getDataResultsFromIntent(android.content.Intent!, String!);
+    method public int getEditChoicesBeforeSending();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence! getLabel();
+    method public String! getResultKey();
+    method public static android.os.Bundle! getResultsFromIntent(android.content.Intent!);
+    method public static int getResultsSource(android.content.Intent);
+    method public boolean isDataOnly();
+    method public static void setResultsSource(android.content.Intent, int);
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
+    field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+    field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+    field public static final int SOURCE_CHOICE = 1; // 0x1
+    field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+  }
+
+  public static final class RemoteInput.Builder {
+    ctor public RemoteInput.Builder(String);
+    method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+    method public androidx.core.app.RemoteInput build();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+    method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+    method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
+    method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(int);
+    method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+  }
+
+  public final class ServiceCompat {
+    method public static void stopForeground(android.app.Service, int);
+    field public static final int START_STICKY = 1; // 0x1
+    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+  }
+
+  public final class ShareCompat {
+    method public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
+    field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+    field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+  }
+
+  public static class ShareCompat.IntentBuilder {
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
+    method public void startChooser();
+  }
+
+  public static class ShareCompat.IntentReader {
+    method public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
+    method public int getStreamCount();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
+    method public boolean isMultipleShare();
+    method public boolean isShareIntent();
+    method public boolean isSingleShare();
+  }
+
+  public abstract class SharedElementCallback {
+    ctor public SharedElementCallback();
+    method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+    method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+    method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
+    method public void onRejectSharedElements(java.util.List<android.view.View!>!);
+    method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+  }
+
+  public static interface SharedElementCallback.OnSharedElementsReadyListener {
+    method public void onSharedElementsReady();
+  }
+
+  public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+    method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+    method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+    method public androidx.core.app.TaskStackBuilder! addParentStack(android.content.ComponentName!);
+    method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+    method public android.content.Intent? editIntentAt(int);
+    method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+    method @Deprecated public android.content.Intent! getIntent(int);
+    method public int getIntentCount();
+    method public android.content.Intent![] getIntents();
+    method public android.app.PendingIntent? getPendingIntent(int, int);
+    method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+    method @Deprecated public java.util.Iterator<android.content.Intent!>! iterator();
+    method public void startActivities();
+    method public void startActivities(android.os.Bundle?);
+  }
+
+  public static interface TaskStackBuilder.SupportParentable {
+    method public android.content.Intent? getSupportParentActivityIntent();
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentProviderCompat {
+    method public static android.content.Context requireContext(android.content.ContentProvider);
+  }
+
+  public final class ContentResolverCompat {
+    method public static android.database.Cursor! query(android.content.ContentResolver!, android.net.Uri!, String![]!, String!, String![]!, String!, androidx.core.os.CancellationSignal!);
+  }
+
+  public class ContextCompat {
+    ctor protected ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, String);
+    method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+    method public static java.io.File! getCodeCacheDir(android.content.Context);
+    method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+    method public static java.io.File? getDataDir(android.content.Context);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+    method public static java.io.File![] getExternalCacheDirs(android.content.Context);
+    method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
+    method public static java.util.concurrent.Executor! getMainExecutor(android.content.Context!);
+    method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File![] getObbDirs(android.content.Context);
+    method public static <T> T? getSystemService(android.content.Context, Class<T!>);
+    method public static String? getSystemServiceName(android.content.Context, Class<?>);
+    method public static boolean isDeviceProtectedStorage(android.content.Context);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![]);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
+    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
+  }
+
+  public class FileProvider extends android.content.ContentProvider {
+    ctor public FileProvider();
+    method public int delete(android.net.Uri, String?, String![]?);
+    method public String! getType(android.net.Uri);
+    method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+    method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues!);
+    method public boolean onCreate();
+    method public android.database.Cursor! query(android.net.Uri, String![]?, String?, String![]?, String?);
+    method public int update(android.net.Uri, android.content.ContentValues!, String?, String![]?);
+  }
+
+  public final class IntentCompat {
+    method public static android.content.Intent makeMainSelectorActivity(String, String);
+    field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+  }
+
+  public final class MimeTypeFilter {
+    method public static boolean matches(String?, String);
+    method public static String? matches(String?, String![]);
+    method public static String? matches(String![]?, String);
+    method public static String![] matchesMany(String![]?, String);
+  }
+
+  public final class PermissionChecker {
+    method public static int checkCallingOrSelfPermission(android.content.Context, String);
+    method public static int checkCallingPermission(android.content.Context, String, String?);
+    method public static int checkPermission(android.content.Context, String, int, int, String?);
+    method public static int checkSelfPermission(android.content.Context, String);
+    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+    field public static final int PERMISSION_GRANTED = 0; // 0x0
+  }
+
+  @Deprecated public final class SharedPreferencesCompat {
+  }
+
+  @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+    method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+    method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+  }
+
+}
+
+package androidx.core.content.pm {
+
+  @Deprecated public final class ActivityInfoCompat {
+    field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+  public final class PackageInfoCompat {
+    method public static long getLongVersionCode(android.content.pm.PackageInfo);
+  }
+
+  public final class PermissionInfoCompat {
+    method public static int getProtection(android.content.pm.PermissionInfo);
+    method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+  }
+
+  public class ShortcutInfoCompat {
+    method public android.content.ComponentName? getActivity();
+    method public java.util.Set<java.lang.String!>? getCategories();
+    method public CharSequence? getDisabledMessage();
+    method public String getId();
+    method public android.content.Intent getIntent();
+    method public android.content.Intent![] getIntents();
+    method public CharSequence? getLongLabel();
+    method public int getRank();
+    method public CharSequence getShortLabel();
+    method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+  }
+
+  public static class ShortcutInfoCompat.Builder {
+    ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+    method public androidx.core.content.pm.ShortcutInfoCompat build();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
+  }
+
+  public class ShortcutManagerCompat {
+    method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
+    method public static int getMaxShortcutCountPerActivity(android.content.Context);
+    method public static boolean isRequestPinShortcutSupported(android.content.Context);
+    method public static void removeAllDynamicShortcuts(android.content.Context);
+    method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+    method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+  }
+
+  public final class ResourcesCompat {
+    method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static float getFloat(android.content.res.Resources, @DimenRes int);
+    method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+    field @AnyRes public static final int ID_NULL = 0; // 0x0
+  }
+
+  public abstract static class ResourcesCompat.FontCallback {
+    ctor public ResourcesCompat.FontCallback();
+    method public abstract void onFontRetrievalFailed(int);
+    method public abstract void onFontRetrieved(android.graphics.Typeface);
+  }
+
+  public static final class ResourcesCompat.ThemeCompat {
+    method public static void rebase(android.content.res.Resources.Theme);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorWindowCompat {
+    method public static android.database.CursorWindow create(String?, long);
+  }
+
+  @Deprecated public final class DatabaseUtilsCompat {
+    method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
+    method @Deprecated public static String! concatenateWhere(String!, String!);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteCursorCompat {
+    method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapCompat {
+    method public static int getAllocationByteCount(android.graphics.Bitmap);
+    method public static boolean hasMipMap(android.graphics.Bitmap);
+    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+  }
+
+  public class BlendModeColorFilterCompat {
+    method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
+  }
+
+  public enum BlendModeCompat {
+    enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
+  }
+
+  public final class ColorUtils {
+    method @ColorInt public static int HSLToColor(float[]);
+    method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+    method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+    method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+    method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_X) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Y) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Z) double);
+    method public static void XYZToLAB(@FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_X) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Y) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Z) double, double[]);
+    method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+    method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+    method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+    method public static double calculateContrast(@ColorInt int, @ColorInt int);
+    method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+    method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+    method public static void colorToHSL(@ColorInt int, float[]);
+    method public static void colorToLAB(@ColorInt int, double[]);
+    method public static void colorToXYZ(@ColorInt int, double[]);
+    method public static int compositeColors(@ColorInt int, @ColorInt int);
+    method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+    method public static double distanceEuclidean(double[], double[]);
+    method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+  }
+
+  public final class Insets {
+    method public static androidx.core.graphics.Insets of(int, int, int, int);
+    method public static androidx.core.graphics.Insets of(android.graphics.Rect);
+    method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
+    method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+    field public static final androidx.core.graphics.Insets NONE;
+    field public final int bottom;
+    field public final int left;
+    field public final int right;
+    field public final int top;
+  }
+
+  public final class PaintCompat {
+    method public static boolean hasGlyph(android.graphics.Paint, String);
+    method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
+  }
+
+  public final class PathSegment {
+    ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+    method public android.graphics.PointF getEnd();
+    method public float getEndFraction();
+    method public android.graphics.PointF getStart();
+    method public float getStartFraction();
+  }
+
+  public final class PathUtils {
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
+  }
+
+  public class TypefaceCompat {
+    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+    method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+    method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
+    method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+  }
+
+  public class IconCompat extends androidx.versionedparcelable.CustomVersionedParcelable {
+    method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+    method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+    method @IdRes public int getResId();
+    method public String getResPackage();
+    method public int getType();
+    method public android.net.Uri getUri();
+    method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
+    method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
+    method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+    method public android.os.Bundle! toBundle();
+    method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
+    method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
+    field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
+    field public static final int TYPE_BITMAP = 1; // 0x1
+    field public static final int TYPE_DATA = 3; // 0x3
+    field public static final int TYPE_RESOURCE = 2; // 0x2
+    field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+    field public static final int TYPE_URI = 4; // 0x4
+    field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
+  }
+
+  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.Bitmap? getBitmap();
+    method public float getCornerRadius();
+    method public int getGravity();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public boolean hasAntiAlias();
+    method public boolean hasMipMap();
+    method public boolean isCircular();
+    method public void setAlpha(int);
+    method public void setAntiAlias(boolean);
+    method public void setCircular(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setCornerRadius(float);
+    method public void setDither(boolean);
+    method public void setGravity(int);
+    method public void setMipMap(boolean);
+    method public void setTargetDensity(android.graphics.Canvas);
+    method public void setTargetDensity(android.util.DisplayMetrics);
+    method public void setTargetDensity(int);
+  }
+
+  public final class RoundedBitmapDrawableFactory {
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+  }
+
+}
+
+package androidx.core.hardware.display {
+
+  public final class DisplayManagerCompat {
+    method public android.view.Display? getDisplay(int);
+    method public android.view.Display![] getDisplays();
+    method public android.view.Display![] getDisplays(String?);
+    method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+    field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+  }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+  @Deprecated public class FingerprintManagerCompat {
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+    method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+  }
+
+  @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+    method @Deprecated public void onAuthenticationError(int, CharSequence!);
+    method @Deprecated public void onAuthenticationFailed();
+    method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+    method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+  }
+
+  @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+    method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+  }
+
+  @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+    method @Deprecated public javax.crypto.Cipher? getCipher();
+    method @Deprecated public javax.crypto.Mac? getMac();
+    method @Deprecated public java.security.Signature? getSignature();
+  }
+
+}
+
+package androidx.core.location {
+
+  public final class LocationManagerCompat {
+    method public static boolean isLocationEnabled(android.location.LocationManager);
+  }
+
+}
+
+package androidx.core.math {
+
+  public class MathUtils {
+    method public static float clamp(float, float, float);
+    method public static double clamp(double, double, double);
+    method public static int clamp(int, int, int);
+    method public static long clamp(long, long, long);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class ConnectivityManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+  }
+
+  public final class TrafficStatsCompat {
+    method @Deprecated public static void clearThreadStatsTag();
+    method @Deprecated public static int getThreadStatsTag();
+    method @Deprecated public static void incrementOperationCount(int);
+    method @Deprecated public static void incrementOperationCount(int, int);
+    method @Deprecated public static void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+  }
+
+  public final class UriCompat {
+    method public static String toSafeString(android.net.Uri);
+  }
+
+}
+
+package androidx.core.os {
+
+  public class BuildCompat {
+    method @Deprecated public static boolean isAtLeastN();
+    method @Deprecated public static boolean isAtLeastNMR1();
+    method @Deprecated public static boolean isAtLeastO();
+    method @Deprecated public static boolean isAtLeastOMR1();
+    method @Deprecated public static boolean isAtLeastP();
+    method @Deprecated public static boolean isAtLeastQ();
+    method public static boolean isAtLeastR();
+  }
+
+  public final class CancellationSignal {
+    ctor public CancellationSignal();
+    method public void cancel();
+    method public Object? getCancellationSignalObject();
+    method public boolean isCanceled();
+    method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+    method public void throwIfCanceled();
+  }
+
+  public static interface CancellationSignal.OnCancelListener {
+    method public void onCancel();
+  }
+
+  public final class ConfigurationCompat {
+    method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+  }
+
+  public final class EnvironmentCompat {
+    method public static String getStorageState(java.io.File);
+    field public static final String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public final class HandlerCompat {
+    method public static android.os.Handler createAsync(android.os.Looper);
+    method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+    method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+  }
+
+  public final class LocaleListCompat {
+    method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
+    method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+    method public java.util.Locale! get(int);
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+    method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+    method public java.util.Locale? getFirstMatch(String![]);
+    method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale!);
+    method public boolean isEmpty();
+    method @IntRange(from=0) public int size();
+    method public String toLanguageTags();
+    method public Object? unwrap();
+    method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+    method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+  }
+
+  public final class MessageCompat {
+    method public static boolean isAsynchronous(android.os.Message);
+    method public static void setAsynchronous(android.os.Message, boolean);
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(String?);
+  }
+
+  public final class ParcelCompat {
+    method public static boolean readBoolean(android.os.Parcel);
+    method public static void writeBoolean(android.os.Parcel, boolean);
+  }
+
+  @Deprecated public final class ParcelableCompat {
+    method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
+  }
+
+  @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+    method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+    method @Deprecated public T![]! newArray(int);
+  }
+
+  @Deprecated public final class TraceCompat {
+    method @Deprecated public static void beginAsyncSection(String, int);
+    method @Deprecated public static void beginSection(String);
+    method @Deprecated public static void endAsyncSection(String, int);
+    method @Deprecated public static void endSection();
+    method @Deprecated public static boolean isEnabled();
+    method @Deprecated public static void setCounter(String, int);
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package androidx.core.provider {
+
+  public final class FontRequest {
+    ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
+    ctor public FontRequest(String, String, String, @ArrayRes int);
+    method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
+    method @ArrayRes public int getCertificatesArrayResId();
+    method public String getProviderAuthority();
+    method public String getProviderPackage();
+    method public String getQuery();
+  }
+
+  public class FontsContractCompat {
+    method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
+    method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+  }
+
+  public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+    ctor public FontsContractCompat.Columns();
+    field public static final String FILE_ID = "file_id";
+    field public static final String ITALIC = "font_italic";
+    field public static final String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final String TTC_INDEX = "font_ttc_index";
+    field public static final String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final String WEIGHT = "font_weight";
+  }
+
+  public static class FontsContractCompat.FontFamilyResult {
+    method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
+    method public int getStatusCode();
+    field public static final int STATUS_OK = 0; // 0x0
+    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+  }
+
+  public static class FontsContractCompat.FontInfo {
+    method public int getResultCode();
+    method @IntRange(from=0) public int getTtcIndex();
+    method public android.net.Uri getUri();
+    method @IntRange(from=1, to=1000) public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static class FontsContractCompat.FontRequestCallback {
+    ctor public FontsContractCompat.FontRequestCallback();
+    method public void onTypefaceRequestFailed(int);
+    method public void onTypefaceRetrieved(android.graphics.Typeface!);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+  }
+
+}
+
+package androidx.core.telephony.mbms {
+
+  public final class MbmsHelper {
+    method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class BidiFormatter {
+    method public static androidx.core.text.BidiFormatter! getInstance();
+    method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+    method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+    method public boolean getStereoReset();
+    method public boolean isRtl(String!);
+    method public boolean isRtl(CharSequence!);
+    method public boolean isRtlContext();
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public String! unicodeWrap(String!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, boolean);
+    method public String! unicodeWrap(String!);
+    method public CharSequence! unicodeWrap(CharSequence!);
+  }
+
+  public static final class BidiFormatter.Builder {
+    ctor public BidiFormatter.Builder();
+    ctor public BidiFormatter.Builder(boolean);
+    ctor public BidiFormatter.Builder(java.util.Locale!);
+    method public androidx.core.text.BidiFormatter! build();
+    method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+    method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+  }
+
+  public final class HtmlCompat {
+    method public static android.text.Spanned fromHtml(String, int);
+    method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+    method public static String toHtml(android.text.Spanned, int);
+    field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+    field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+    field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+    field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+    field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+  }
+
+  public final class ICUCompat {
+    method public static String? maximizeAndGetScript(java.util.Locale!);
+  }
+
+  public class PrecomputedTextCompat implements android.text.Spannable {
+    method public char charAt(int);
+    method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+    method @IntRange(from=0) public int getParagraphCount();
+    method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+    method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+    method public int getSpanEnd(Object!);
+    method public int getSpanFlags(Object!);
+    method public int getSpanStart(Object!);
+    method public <T> T![]! getSpans(int, int, Class<T!>!);
+    method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+    method public int length();
+    method public int nextSpanTransition(int, int, Class!);
+    method public void removeSpan(Object!);
+    method public void setSpan(Object!, int, int, int);
+    method public CharSequence! subSequence(int, int);
+  }
+
+  public static final class PrecomputedTextCompat.Params {
+    ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+    method @RequiresApi(23) public int getBreakStrategy();
+    method @RequiresApi(23) public int getHyphenationFrequency();
+    method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+    method public android.text.TextPaint getTextPaint();
+  }
+
+  public static class PrecomputedTextCompat.Params.Builder {
+    ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+    method public androidx.core.text.PrecomputedTextCompat.Params build();
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+    method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+  }
+
+  public interface TextDirectionHeuristicCompat {
+    method public boolean isRtl(char[]!, int, int);
+    method public boolean isRtl(CharSequence!, int, int);
+  }
+
+  public final class TextDirectionHeuristicsCompat {
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+  }
+
+  public final class TextUtilsCompat {
+    method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+    method public static String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.text.util {
+
+  public final class LinkifyCompat {
+    method public static boolean addLinks(android.text.Spannable, int);
+    method public static boolean addLinks(android.widget.TextView, int);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+  }
+
+}
+
+package androidx.core.util {
+
+  public class AtomicFile {
+    ctor public AtomicFile(java.io.File);
+    method public void delete();
+    method public void failWrite(java.io.FileOutputStream?);
+    method public void finishWrite(java.io.FileOutputStream?);
+    method public java.io.File getBaseFile();
+    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+    method public byte[] readFully() throws java.io.IOException;
+    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+  }
+
+  public interface Consumer<T> {
+    method public void accept(T!);
+  }
+
+  public class ObjectsCompat {
+    method public static boolean equals(Object?, Object?);
+    method public static int hash(java.lang.Object!...);
+    method public static int hashCode(Object?);
+  }
+
+  public class Pair<F, S> {
+    ctor public Pair(F?, S?);
+    method public static <A, B> androidx.core.util.Pair<A!,B!> create(A?, B?);
+    field public final F? first;
+    field public final S? second;
+  }
+
+  public final class PatternsCompat {
+    field public static final java.util.regex.Pattern! DOMAIN_NAME;
+    field public static final java.util.regex.Pattern! EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern! IP_ADDRESS;
+    field public static final java.util.regex.Pattern! WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static interface Pools.Pool<T> {
+    method public T? acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+    ctor public Pools.SimplePool(int);
+    method public T! acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  public interface Predicate<T> {
+    method public boolean test(T!);
+  }
+
+  public interface Supplier<T> {
+    method public T! get();
+  }
+
+}
+
+package androidx.core.view {
+
+  public class AccessibilityDelegateCompat {
+    ctor public AccessibilityDelegateCompat();
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View!);
+    method public void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public void onInitializeAccessibilityNodeInfo(android.view.View!, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean performAccessibilityAction(android.view.View!, int, android.os.Bundle!);
+    method public void sendAccessibilityEvent(android.view.View!, int);
+    method public void sendAccessibilityEventUnchecked(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public abstract class ActionProvider {
+    ctor public ActionProvider(android.content.Context!);
+    method public android.content.Context! getContext();
+    method public boolean hasSubMenu();
+    method public boolean isVisible();
+    method public abstract android.view.View! onCreateActionView();
+    method public android.view.View! onCreateActionView(android.view.MenuItem!);
+    method public boolean onPerformDefaultAction();
+    method public void onPrepareSubMenu(android.view.SubMenu!);
+    method public boolean overridesItemVisibility();
+    method public void refreshVisibility();
+    method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener!);
+  }
+
+  public static interface ActionProvider.VisibilityListener {
+    method public void onActionProviderVisibilityChanged(boolean);
+  }
+
+  public final class DisplayCompat {
+    method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
+  }
+
+  public static final class DisplayCompat.ModeCompat {
+    method public int getPhysicalHeight();
+    method public int getPhysicalWidth();
+    method public boolean isNative();
+    method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
+  }
+
+  public final class DisplayCutoutCompat {
+    ctor public DisplayCutoutCompat(android.graphics.Rect!, java.util.List<android.graphics.Rect!>!);
+    method public java.util.List<android.graphics.Rect!>! getBoundingRects();
+    method public int getSafeInsetBottom();
+    method public int getSafeInsetLeft();
+    method public int getSafeInsetRight();
+    method public int getSafeInsetTop();
+  }
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View!, androidx.core.view.DragStartHelper.OnDragStartListener!);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point!);
+    method public boolean onLongClick(android.view.View!);
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+  }
+
+  public static interface DragStartHelper.OnDragStartListener {
+    method public boolean onDragStart(android.view.View!, androidx.core.view.DragStartHelper!);
+  }
+
+  public final class GestureDetectorCompat {
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!);
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!, android.os.Handler!);
+    method public boolean isLongpressEnabled();
+    method public boolean onTouchEvent(android.view.MotionEvent!);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener!);
+  }
+
+  public final class GravityCompat {
+    method public static void apply(int, int, int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static void apply(int, int, int, android.graphics.Rect!, int, int, android.graphics.Rect!, int);
+    method public static void applyDisplay(int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static int getAbsoluteGravity(int, int);
+    field public static final int END = 8388613; // 0x800005
+    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+    field public static final int START = 8388611; // 0x800003
+  }
+
+  public final class InputDeviceCompat {
+    field public static final int SOURCE_ANY = -256; // 0xffffff00
+    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+    field public static final int SOURCE_DPAD = 513; // 0x201
+    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+    field public static final int SOURCE_KEYBOARD = 257; // 0x101
+    field public static final int SOURCE_MOUSE = 8194; // 0x2002
+    field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+    field public static final int SOURCE_STYLUS = 16386; // 0x4002
+    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  public final class LayoutInflaterCompat {
+    method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+    method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+  }
+
+  @Deprecated public interface LayoutInflaterFactory {
+    method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+  }
+
+  public final class MarginLayoutParamsCompat {
+    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams!);
+    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams!);
+    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams!, int);
+  }
+
+  public final class MenuCompat {
+    method public static void setGroupDividerEnabled(android.view.Menu!, boolean);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+  }
+
+  public final class MenuItemCompat {
+    method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+    method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+    method public static androidx.core.view.ActionProvider! getActionProvider(android.view.MenuItem!);
+    method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+    method public static int getAlphabeticModifiers(android.view.MenuItem!);
+    method public static CharSequence! getContentDescription(android.view.MenuItem!);
+    method public static android.content.res.ColorStateList! getIconTintList(android.view.MenuItem!);
+    method public static android.graphics.PorterDuff.Mode! getIconTintMode(android.view.MenuItem!);
+    method public static int getNumericModifiers(android.view.MenuItem!);
+    method public static CharSequence! getTooltipText(android.view.MenuItem!);
+    method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+    method public static android.view.MenuItem! setActionProvider(android.view.MenuItem!, androidx.core.view.ActionProvider!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+    method public static void setAlphabeticShortcut(android.view.MenuItem!, char, int);
+    method public static void setContentDescription(android.view.MenuItem!, CharSequence!);
+    method public static void setIconTintList(android.view.MenuItem!, android.content.res.ColorStateList!);
+    method public static void setIconTintMode(android.view.MenuItem!, android.graphics.PorterDuff.Mode!);
+    method public static void setNumericShortcut(android.view.MenuItem!, char, int);
+    method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+    method public static void setShortcut(android.view.MenuItem!, char, char, int, int);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+    method public static void setTooltipText(android.view.MenuItem!, CharSequence!);
+    field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+    method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+    method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+  }
+
+  public final class MotionEventCompat {
+    method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+    method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+    method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+    method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+    method @Deprecated public static int getSource(android.view.MotionEvent!);
+    method @Deprecated public static float getX(android.view.MotionEvent!, int);
+    method @Deprecated public static float getY(android.view.MotionEvent!, int);
+    method public static boolean isFromSource(android.view.MotionEvent!, int);
+    field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+    field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+    field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+    field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+    field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+    field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+    field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+    field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+    field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+    field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+    field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+    field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+    field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+    field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+    field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+    field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+    field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+    field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+    field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+    field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+    field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+    field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+    field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+    field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+    field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+    field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+    field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+    field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+    field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+    field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+    field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+    field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+    field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+    field @Deprecated public static final int AXIS_RX = 12; // 0xc
+    field @Deprecated public static final int AXIS_RY = 13; // 0xd
+    field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SCROLL = 26; // 0x1a
+    field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+    field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+    field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+    field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+    field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+    field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+    field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+    field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+    field @Deprecated public static final int AXIS_X = 0; // 0x0
+    field @Deprecated public static final int AXIS_Y = 1; // 0x1
+    field @Deprecated public static final int AXIS_Z = 11; // 0xb
+    field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  public interface NestedScrollingChild {
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean isNestedScrollingEnabled();
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public void stopNestedScroll();
+  }
+
+  public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+  }
+
+  public class NestedScrollingChildHelper {
+    ctor public NestedScrollingChildHelper(android.view.View);
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isNestedScrollingEnabled();
+    method public void onDetachedFromWindow();
+    method public void onStopNestedScroll(android.view.View);
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll();
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingParent {
+    method public int getNestedScrollAxes();
+    method public boolean onNestedFling(android.view.View, float, float, boolean);
+    method public boolean onNestedPreFling(android.view.View, float, float);
+    method public void onNestedPreScroll(android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int);
+    method public void onStopNestedScroll(android.view.View);
+  }
+
+  public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+  }
+
+  public class NestedScrollingParentHelper {
+    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+    method public int getNestedScrollAxes();
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface OnApplyWindowInsetsListener {
+    method public androidx.core.view.WindowInsetsCompat! onApplyWindowInsets(android.view.View!, androidx.core.view.WindowInsetsCompat!);
+  }
+
+  public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+    method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+    method public boolean onPreDraw();
+    method public void onViewAttachedToWindow(android.view.View!);
+    method public void onViewDetachedFromWindow(android.view.View!);
+    method public void removeListener();
+  }
+
+  public final class PointerIconCompat {
+    method public static androidx.core.view.PointerIconCompat! create(android.graphics.Bitmap!, float, float);
+    method public static androidx.core.view.PointerIconCompat! getSystemIcon(android.content.Context!, int);
+    method public static androidx.core.view.PointerIconCompat! load(android.content.res.Resources!, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector!);
+    method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector!, boolean);
+  }
+
+  public interface ScrollingView {
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+  }
+
+  public interface TintableBackgroundView {
+    method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @Deprecated public final class VelocityTrackerCompat {
+    method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+    method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+  }
+
+  public class ViewCompat {
+    ctor protected ViewCompat();
+    method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
+    method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+    method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+    method public static void cancelDragAndDrop(android.view.View);
+    method @Deprecated public static int combineMeasuredStates(int, int);
+    method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
+    method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method public static void dispatchFinishTemporaryDetach(android.view.View);
+    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, int);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+    method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int, int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int);
+    method public static void dispatchStartTemporaryDetach(android.view.View);
+    method public static void enableAccessibleClickableSpanSupport(android.view.View!);
+    method public static int generateViewId();
+    method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+    method public static int getAccessibilityLiveRegion(android.view.View);
+    method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View);
+    method @UiThread public static CharSequence! getAccessibilityPaneTitle(android.view.View!);
+    method @Deprecated public static float getAlpha(android.view.View!);
+    method public static android.content.res.ColorStateList! getBackgroundTintList(android.view.View);
+    method public static android.graphics.PorterDuff.Mode! getBackgroundTintMode(android.view.View);
+    method public static android.graphics.Rect? getClipBounds(android.view.View);
+    method public static android.view.Display? getDisplay(android.view.View);
+    method public static float getElevation(android.view.View);
+    method public static boolean getFitsSystemWindows(android.view.View);
+    method public static int getImportantForAccessibility(android.view.View);
+    method public static int getImportantForAutofill(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method @Deprecated public static int getLayerType(android.view.View!);
+    method public static int getLayoutDirection(android.view.View);
+    method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+    method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+    method @Deprecated public static int getMeasuredState(android.view.View!);
+    method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+    method public static int getMinimumHeight(android.view.View);
+    method public static int getMinimumWidth(android.view.View);
+    method public static int getNextClusterForwardId(android.view.View);
+    method @Deprecated public static int getOverScrollMode(android.view.View!);
+    method @Px public static int getPaddingEnd(android.view.View);
+    method @Px public static int getPaddingStart(android.view.View);
+    method public static android.view.ViewParent! getParentForAccessibility(android.view.View);
+    method @Deprecated public static float getPivotX(android.view.View!);
+    method @Deprecated public static float getPivotY(android.view.View!);
+    method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
+    method @Deprecated public static float getRotation(android.view.View!);
+    method @Deprecated public static float getRotationX(android.view.View!);
+    method @Deprecated public static float getRotationY(android.view.View!);
+    method @Deprecated public static float getScaleX(android.view.View!);
+    method @Deprecated public static float getScaleY(android.view.View!);
+    method public static int getScrollIndicators(android.view.View);
+    method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
+    method public static String? getTransitionName(android.view.View);
+    method @Deprecated public static float getTranslationX(android.view.View!);
+    method @Deprecated public static float getTranslationY(android.view.View!);
+    method public static float getTranslationZ(android.view.View);
+    method public static int getWindowSystemUiVisibility(android.view.View);
+    method @Deprecated public static float getX(android.view.View!);
+    method @Deprecated public static float getY(android.view.View!);
+    method public static float getZ(android.view.View);
+    method public static boolean hasAccessibilityDelegate(android.view.View);
+    method public static boolean hasExplicitFocusable(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View, int);
+    method public static boolean hasOnClickListeners(android.view.View);
+    method public static boolean hasOverlappingRendering(android.view.View);
+    method public static boolean hasTransientState(android.view.View);
+    method @UiThread public static boolean isAccessibilityHeading(android.view.View!);
+    method public static boolean isAttachedToWindow(android.view.View);
+    method public static boolean isFocusedByDefault(android.view.View);
+    method public static boolean isImportantForAccessibility(android.view.View);
+    method public static boolean isImportantForAutofill(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method @Deprecated public static boolean isOpaque(android.view.View!);
+    method public static boolean isPaddingRelative(android.view.View);
+    method @UiThread public static boolean isScreenReaderFocusable(android.view.View!);
+    method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+    method public static android.view.View! keyboardNavigationClusterSearch(android.view.View, android.view.View!, int);
+    method public static void offsetLeftAndRight(android.view.View, int);
+    method public static void offsetTopAndBottom(android.view.View, int);
+    method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle!);
+    method public static void postInvalidateOnAnimation(android.view.View);
+    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+    method public static void postOnAnimation(android.view.View, Runnable!);
+    method public static void postOnAnimationDelayed(android.view.View, Runnable!, long);
+    method public static void removeAccessibilityAction(android.view.View, int);
+    method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+    method public static void requestApplyInsets(android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+    method @Deprecated public static int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
+    method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
+    method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat!);
+    method @UiThread public static void setAccessibilityHeading(android.view.View!, boolean);
+    method public static void setAccessibilityLiveRegion(android.view.View, int);
+    method @UiThread public static void setAccessibilityPaneTitle(android.view.View!, CharSequence!);
+    method @Deprecated public static void setActivated(android.view.View!, boolean);
+    method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+    method public static void setAutofillHints(android.view.View, java.lang.String!...);
+    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList!);
+    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode!);
+    method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+    method public static void setClipBounds(android.view.View, android.graphics.Rect!);
+    method public static void setElevation(android.view.View, float);
+    method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+    method public static void setFocusedByDefault(android.view.View, boolean);
+    method public static void setHasTransientState(android.view.View, boolean);
+    method public static void setImportantForAccessibility(android.view.View, int);
+    method public static void setImportantForAutofill(android.view.View, int);
+    method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+    method public static void setLabelFor(android.view.View, @IdRes int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint!);
+    method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+    method public static void setLayoutDirection(android.view.View, int);
+    method public static void setNestedScrollingEnabled(android.view.View, boolean);
+    method public static void setNextClusterForwardId(android.view.View, int);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
+    method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+    method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+    method @Deprecated public static void setPivotX(android.view.View!, float);
+    method @Deprecated public static void setPivotY(android.view.View!, float);
+    method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat!);
+    method @Deprecated public static void setRotation(android.view.View!, float);
+    method @Deprecated public static void setRotationX(android.view.View!, float);
+    method @Deprecated public static void setRotationY(android.view.View!, float);
+    method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+    method @Deprecated public static void setScaleX(android.view.View!, float);
+    method @Deprecated public static void setScaleY(android.view.View!, float);
+    method @UiThread public static void setScreenReaderFocusable(android.view.View!, boolean);
+    method public static void setScrollIndicators(android.view.View, int);
+    method public static void setScrollIndicators(android.view.View, int, int);
+    method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
+    method public static void setTooltipText(android.view.View, CharSequence?);
+    method public static void setTransitionName(android.view.View, String!);
+    method @Deprecated public static void setTranslationX(android.view.View!, float);
+    method @Deprecated public static void setTranslationY(android.view.View!, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method @Deprecated public static void setX(android.view.View!, float);
+    method @Deprecated public static void setY(android.view.View!, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData!, android.view.View.DragShadowBuilder!, Object!, int);
+    method public static boolean startNestedScroll(android.view.View, int);
+    method public static boolean startNestedScroll(android.view.View, int, int);
+    method public static void stopNestedScroll(android.view.View);
+    method public static void stopNestedScroll(android.view.View, int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder!);
+    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+    field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+    field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+    field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+    field public static final int TYPE_NON_TOUCH = 1; // 0x1
+    field public static final int TYPE_TOUCH = 0; // 0x0
+  }
+
+  public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+    method public boolean onUnhandledKeyEvent(android.view.View!, android.view.KeyEvent!);
+  }
+
+  public final class ViewConfigurationCompat {
+    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static int getScaledHoverSlop(android.view.ViewConfiguration!);
+    method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+    method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration!, android.content.Context);
+  }
+
+  public final class ViewGroupCompat {
+    method public static int getLayoutMode(android.view.ViewGroup);
+    method public static int getNestedScrollAxes(android.view.ViewGroup);
+    method public static boolean isTransitionGroup(android.view.ViewGroup);
+    method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+  }
+
+  public final class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onNestedFling(android.view.ViewParent!, android.view.View!, float, float, boolean);
+    method public static boolean onNestedPreFling(android.view.ViewParent!, android.view.View!, float, float);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int, int[]);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!, int);
+    method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public final class ViewPropertyAnimatorCompat {
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alpha(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public android.view.animation.Interpolator! getInterpolator();
+    method public long getStartDelay();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotation(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setDuration(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setInterpolator(android.view.animation.Interpolator!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setStartDelay(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener!);
+    method public void start();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZ(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withEndAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withLayer();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withStartAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! x(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! xBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! y(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! yBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! z(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! zBy(float);
+  }
+
+  public interface ViewPropertyAnimatorListener {
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+    ctor public ViewPropertyAnimatorListenerAdapter();
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public interface ViewPropertyAnimatorUpdateListener {
+    method public void onAnimationUpdate(android.view.View!);
+  }
+
+  public final class WindowCompat {
+    method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
+    method public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
+    method public androidx.core.view.WindowInsetsCompat consumeStableInsets();
+    method public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
+    method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+    method public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
+    method public int getStableInsetBottom();
+    method public int getStableInsetLeft();
+    method public int getStableInsetRight();
+    method public int getStableInsetTop();
+    method public androidx.core.graphics.Insets getStableInsets();
+    method public androidx.core.graphics.Insets getSystemGestureInsets();
+    method public int getSystemWindowInsetBottom();
+    method public int getSystemWindowInsetLeft();
+    method public int getSystemWindowInsetRight();
+    method public int getSystemWindowInsetTop();
+    method public androidx.core.graphics.Insets getSystemWindowInsets();
+    method public androidx.core.graphics.Insets getTappableElementInsets();
+    method public boolean hasInsets();
+    method public boolean hasStableInsets();
+    method public boolean hasSystemWindowInsets();
+    method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method public boolean isConsumed();
+    method public boolean isRound();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+    method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
+  }
+
+  public static final class WindowInsetsCompat.Builder {
+    ctor public WindowInsetsCompat.Builder();
+    ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
+    method public androidx.core.view.WindowInsetsCompat build();
+    method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
+    method public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
+  }
+
+}
+
+package androidx.core.view.accessibility {
+
+  public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+    method public void onClick(android.view.View);
+  }
+
+  public final class AccessibilityEventCompat {
+    method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+    method public static int getAction(android.view.accessibility.AccessibilityEvent!);
+    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent!);
+    method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+    method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+    method public static void setAction(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent!, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+    field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+    field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+    field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+    field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+    field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+    field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+    field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  public final class AccessibilityManagerCompat {
+    method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+  }
+
+  @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method @Deprecated public void onAccessibilityStateChanged(boolean);
+  }
+
+  @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
+  public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+    method public void onTouchExplorationStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+    method public void addAction(int);
+    method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public void addChild(android.view.View!);
+    method public void addChild(android.view.View!, int);
+    method public boolean canOpenPopup();
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
+    method public int getActions();
+    method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public CharSequence! getClassName();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+    method public CharSequence! getContentDescription();
+    method public int getDrawingOrder();
+    method public CharSequence! getError();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence? getHintText();
+    method @Deprecated public Object! getInfo();
+    method public int getInputType();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+    method public int getLiveRegion();
+    method public int getMaxTextLength();
+    method public int getMovementGranularities();
+    method public CharSequence! getPackageName();
+    method public CharSequence? getPaneTitle();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+    method public CharSequence? getRoleDescription();
+    method public CharSequence! getText();
+    method public int getTextSelectionEnd();
+    method public int getTextSelectionStart();
+    method public CharSequence? getTooltipText();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+    method public String! getViewIdResourceName();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+    method public int getWindowId();
+    method public boolean isAccessibilityFocused();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isClickable();
+    method public boolean isContentInvalid();
+    method public boolean isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isHeading();
+    method public boolean isImportantForAccessibility();
+    method public boolean isLongClickable();
+    method public boolean isMultiLine();
+    method public boolean isPassword();
+    method public boolean isScreenReaderFocusable();
+    method public boolean isScrollable();
+    method public boolean isSelected();
+    method public boolean isShowingHintText();
+    method public boolean isTextEntryKey();
+    method public boolean isVisibleToUser();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public boolean performAction(int);
+    method public boolean performAction(int, android.os.Bundle!);
+    method public void recycle();
+    method public boolean refresh();
+    method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public boolean removeChild(android.view.View!);
+    method public boolean removeChild(android.view.View!, int);
+    method public void setAccessibilityFocused(boolean);
+    method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
+    method public void setBoundsInScreen(android.graphics.Rect!);
+    method public void setCanOpenPopup(boolean);
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setClassName(CharSequence!);
+    method public void setClickable(boolean);
+    method public void setCollectionInfo(Object!);
+    method public void setCollectionItemInfo(Object!);
+    method public void setContentDescription(CharSequence!);
+    method public void setContentInvalid(boolean);
+    method public void setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    method public void setEditable(boolean);
+    method public void setEnabled(boolean);
+    method public void setError(CharSequence!);
+    method public void setFocusable(boolean);
+    method public void setFocused(boolean);
+    method public void setHeading(boolean);
+    method public void setHintText(CharSequence?);
+    method public void setImportantForAccessibility(boolean);
+    method public void setInputType(int);
+    method public void setLabelFor(android.view.View!);
+    method public void setLabelFor(android.view.View!, int);
+    method public void setLabeledBy(android.view.View!);
+    method public void setLabeledBy(android.view.View!, int);
+    method public void setLiveRegion(int);
+    method public void setLongClickable(boolean);
+    method public void setMaxTextLength(int);
+    method public void setMovementGranularities(int);
+    method public void setMultiLine(boolean);
+    method public void setPackageName(CharSequence!);
+    method public void setPaneTitle(CharSequence?);
+    method public void setParent(android.view.View!);
+    method public void setParent(android.view.View!, int);
+    method public void setPassword(boolean);
+    method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+    method public void setRoleDescription(CharSequence?);
+    method public void setScreenReaderFocusable(boolean);
+    method public void setScrollable(boolean);
+    method public void setSelected(boolean);
+    method public void setShowingHintText(boolean);
+    method public void setSource(android.view.View!);
+    method public void setSource(android.view.View!, int);
+    method public void setText(CharSequence!);
+    method public void setTextEntryKey(boolean);
+    method public void setTextSelection(int, int);
+    method public void setTooltipText(CharSequence?);
+    method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
+    method public void setTraversalAfter(android.view.View!);
+    method public void setTraversalAfter(android.view.View!, int);
+    method public void setTraversalBefore(android.view.View!);
+    method public void setTraversalBefore(android.view.View!, int);
+    method public void setViewIdResourceName(String!);
+    method public void setVisibleToUser(boolean);
+    method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+    field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+    field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+    field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+    field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+    field public static final int ACTION_CLICK = 16; // 0x10
+    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+    field public static final int ACTION_COPY = 16384; // 0x4000
+    field public static final int ACTION_CUT = 65536; // 0x10000
+    field public static final int ACTION_DISMISS = 1048576; // 0x100000
+    field public static final int ACTION_EXPAND = 262144; // 0x40000
+    field public static final int ACTION_FOCUS = 1; // 0x1
+    field public static final int ACTION_LONG_CLICK = 32; // 0x20
+    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+    field public static final int ACTION_PASTE = 32768; // 0x8000
+    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+    field public static final int ACTION_SELECT = 4; // 0x4
+    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+    field public static final int FOCUS_INPUT = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+  }
+
+  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+    method public int getId();
+    method public CharSequence! getLabel();
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+    field public static final int SELECTION_MODE_NONE = 0; // 0x0
+    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    method @Deprecated public boolean isHeading();
+    method public boolean isSelected();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+    field public static final int RANGE_TYPE_INT = 0; // 0x0
+    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+  }
+
+  public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
+    ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
+    method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getRegionCount();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
+  }
+
+  public class AccessibilityNodeProviderCompat {
+    ctor public AccessibilityNodeProviderCompat();
+    ctor public AccessibilityNodeProviderCompat(Object!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String!, int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+    method public Object! getProvider();
+    method public boolean performAction(int, int, android.os.Bundle!);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor @Deprecated public AccessibilityRecordCompat(Object!);
+    method @Deprecated public boolean equals(Object?);
+    method @Deprecated public int getAddedCount();
+    method @Deprecated public CharSequence! getBeforeText();
+    method @Deprecated public CharSequence! getClassName();
+    method @Deprecated public CharSequence! getContentDescription();
+    method @Deprecated public int getCurrentItemIndex();
+    method @Deprecated public int getFromIndex();
+    method @Deprecated public Object! getImpl();
+    method @Deprecated public int getItemCount();
+    method @Deprecated public int getMaxScrollX();
+    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public int getMaxScrollY();
+    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public android.os.Parcelable! getParcelableData();
+    method @Deprecated public int getRemovedCount();
+    method @Deprecated public int getScrollX();
+    method @Deprecated public int getScrollY();
+    method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+    method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
+    method @Deprecated public int getToIndex();
+    method @Deprecated public int getWindowId();
+    method @Deprecated public int hashCode();
+    method @Deprecated public boolean isChecked();
+    method @Deprecated public boolean isEnabled();
+    method @Deprecated public boolean isFullScreen();
+    method @Deprecated public boolean isPassword();
+    method @Deprecated public boolean isScrollable();
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+    method @Deprecated public void recycle();
+    method @Deprecated public void setAddedCount(int);
+    method @Deprecated public void setBeforeText(CharSequence!);
+    method @Deprecated public void setChecked(boolean);
+    method @Deprecated public void setClassName(CharSequence!);
+    method @Deprecated public void setContentDescription(CharSequence!);
+    method @Deprecated public void setCurrentItemIndex(int);
+    method @Deprecated public void setEnabled(boolean);
+    method @Deprecated public void setFromIndex(int);
+    method @Deprecated public void setFullScreen(boolean);
+    method @Deprecated public void setItemCount(int);
+    method @Deprecated public void setMaxScrollX(int);
+    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setMaxScrollY(int);
+    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setParcelableData(android.os.Parcelable!);
+    method @Deprecated public void setPassword(boolean);
+    method @Deprecated public void setRemovedCount(int);
+    method @Deprecated public void setScrollX(int);
+    method @Deprecated public void setScrollY(int);
+    method @Deprecated public void setScrollable(boolean);
+    method @Deprecated public void setSource(android.view.View!);
+    method @Deprecated public void setSource(android.view.View!, int);
+    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View!, int);
+    method @Deprecated public void setToIndex(int);
+  }
+
+  public interface AccessibilityViewCommand {
+    method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+  }
+
+  public abstract static class AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.CommandArguments();
+  }
+
+  public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+    method public boolean getExtendSelection();
+    method public int getGranularity();
+  }
+
+  public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveHtmlArguments();
+    method public String! getHTMLElement();
+  }
+
+  public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveWindowArguments();
+    method public int getX();
+    method public int getY();
+  }
+
+  public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+    method public int getColumn();
+    method public int getRow();
+  }
+
+  public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetProgressArguments();
+    method public float getProgress();
+  }
+
+  public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetSelectionArguments();
+    method public int getEnd();
+    method public int getStart();
+  }
+
+  public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetTextArguments();
+    method public CharSequence! getText();
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getAnchor();
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public int getId();
+    method public int getLayer();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getRoot();
+    method public CharSequence! getTitle();
+    method public int getType();
+    method public boolean isAccessibilityFocused();
+    method public boolean isActive();
+    method public boolean isFocused();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat!);
+    method public void recycle();
+    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+    field public static final int TYPE_APPLICATION = 1; // 0x1
+    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+    field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package androidx.core.view.animation {
+
+  public final class PathInterpolatorCompat {
+    method public static android.view.animation.Interpolator! create(android.graphics.Path!);
+    method public static android.view.animation.Interpolator! create(float, float);
+    method public static android.view.animation.Interpolator! create(float, float, float, float);
+  }
+
+}
+
+package androidx.core.view.inputmethod {
+
+  public final class EditorInfoCompat {
+    ctor @Deprecated public EditorInfoCompat();
+    method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo!);
+    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
+    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+  }
+
+  public final class InputConnectionCompat {
+    ctor @Deprecated public InputConnectionCompat();
+    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+    method public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+    field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+  }
+
+  public static interface InputConnectionCompat.OnCommitContentListener {
+    method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat!, int, android.os.Bundle!);
+  }
+
+  public final class InputContentInfoCompat {
+    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+    method public android.net.Uri getContentUri();
+    method public android.content.ClipDescription getDescription();
+    method public android.net.Uri? getLinkUri();
+    method public void releasePermission();
+    method public void requestPermission();
+    method public Object? unwrap();
+    method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+    ctor public AutoScrollHelper(android.view.View);
+    method public abstract boolean canTargetScrollHorizontally(int);
+    method public abstract boolean canTargetScrollVertically(int);
+    method public boolean isEnabled();
+    method public boolean isExclusive();
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+    method public abstract void scrollTargetBy(int, int);
+    method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+    method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+    method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+    method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+    method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+    field public static final float NO_MAX = 3.4028235E38f;
+    field public static final float NO_MIN = 0.0f;
+    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+  }
+
+  public final class CompoundButtonCompat {
+    method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+    method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+    method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+  }
+
+  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+    ctor public ContentLoadingProgressBar(android.content.Context);
+    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+    method public void hide();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void show();
+  }
+
+  public final class EdgeEffectCompat {
+    ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+    method @Deprecated public boolean draw(android.graphics.Canvas!);
+    method @Deprecated public void finish();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean onAbsorb(int);
+    method @Deprecated public boolean onPull(float);
+    method @Deprecated public boolean onPull(float, float);
+    method public static void onPull(android.widget.EdgeEffect, float, float);
+    method @Deprecated public boolean onRelease();
+    method @Deprecated public void setSize(int, int);
+  }
+
+  public class ImageViewCompat {
+    method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+    method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class ListPopupWindowCompat {
+    method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+    method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+  }
+
+  public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+    ctor public ListViewAutoScrollHelper(android.widget.ListView);
+    method public boolean canTargetScrollHorizontally(int);
+    method public boolean canTargetScrollVertically(int);
+    method public void scrollTargetBy(int, int);
+  }
+
+  public final class ListViewCompat {
+    method public static boolean canScrollList(android.widget.ListView, int);
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
+    method public boolean arrowScroll(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isFillViewport();
+    method public boolean isSmoothScrollingEnabled();
+    method public void onAttachedToWindow();
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+    method public boolean pageScroll(int);
+    method public void setFillViewport(boolean);
+    method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
+    method public void setSmoothScrollingEnabled(boolean);
+    method public final void smoothScrollBy(int, int);
+    method public final void smoothScrollBy(int, int, int);
+    method public final void smoothScrollTo(int, int);
+    method public final void smoothScrollTo(int, int, int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public static interface NestedScrollView.OnScrollChangeListener {
+    method public void onScrollChange(androidx.core.widget.NestedScrollView!, int, int, int, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+  }
+
+  public final class PopupWindowCompat {
+    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+    method public static int getWindowLayoutType(android.widget.PopupWindow);
+    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  @Deprecated public final class ScrollerCompat {
+    method @Deprecated public void abortAnimation();
+    method @Deprecated public boolean computeScrollOffset();
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+    method @Deprecated public float getCurrVelocity();
+    method @Deprecated public int getCurrX();
+    method @Deprecated public int getCurrY();
+    method @Deprecated public int getFinalX();
+    method @Deprecated public int getFinalY();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean isOverScrolled();
+    method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+    method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+    method @Deprecated public boolean springBack(int, int, int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int, int);
+  }
+
+  public final class TextViewCompat {
+    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+    method public static int getAutoSizeMinTextSize(android.widget.TextView);
+    method public static int getAutoSizeStepGranularity(android.widget.TextView);
+    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+    method public static int getAutoSizeTextType(android.widget.TextView);
+    method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+    method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+    method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
+    method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+    method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+    method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+    method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+    method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+    method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+    method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+    method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+  }
+
+  public interface TintableCompoundButton {
+    method public android.content.res.ColorStateList? getSupportButtonTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundDrawablesView {
+    method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+}
+
diff --git a/core/core/api/public_plus_experimental_current.txt b/core/core/api/public_plus_experimental_current.txt
index 92e48b4..7a61bb2 100644
--- a/core/core/api/public_plus_experimental_current.txt
+++ b/core/core/api/public_plus_experimental_current.txt
@@ -1379,13 +1379,13 @@
     method @Deprecated public T![]! newArray(int);
   }
 
-  public final class TraceCompat {
-    method public static void beginAsyncSection(String, int);
-    method public static void beginSection(String);
-    method public static void endAsyncSection(String, int);
-    method public static void endSection();
-    method public static boolean isEnabled();
-    method public static void setCounter(String, int);
+  @Deprecated public final class TraceCompat {
+    method @Deprecated public static void beginAsyncSection(String, int);
+    method @Deprecated public static void beginSection(String);
+    method @Deprecated public static void endAsyncSection(String, int);
+    method @Deprecated public static void endSection();
+    method @Deprecated public static boolean isEnabled();
+    method @Deprecated public static void setCounter(String, int);
   }
 
   public class UserManagerCompat {
diff --git a/core/core/api/res-1.4.0-alpha01.txt b/core/core/api/res-1.4.0-alpha01.txt
new file mode 100644
index 0000000..a609e0a
--- /dev/null
+++ b/core/core/api/res-1.4.0-alpha01.txt
@@ -0,0 +1,17 @@
+attr alpha
+attr font
+attr fontProviderAuthority
+attr fontProviderCerts
+attr fontProviderFetchStrategy
+attr fontProviderFetchTimeout
+attr fontProviderPackage
+attr fontProviderQuery
+attr fontStyle
+attr fontVariationSettings
+attr fontWeight
+attr ttcIndex
+style TextAppearance_Compat_Notification
+style TextAppearance_Compat_Notification_Info
+style TextAppearance_Compat_Notification_Line2
+style TextAppearance_Compat_Notification_Time
+style TextAppearance_Compat_Notification_Title
diff --git a/core/core/api/restricted_1.4.0-alpha01.txt b/core/core/api/restricted_1.4.0-alpha01.txt
new file mode 100644
index 0000000..61ac7fa
--- /dev/null
+++ b/core/core/api/restricted_1.4.0-alpha01.txt
@@ -0,0 +1,3556 @@
+// Signature format: 3.0
+package android.support.v4.os {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ResultReceiver implements android.os.Parcelable {
+    ctor public ResultReceiver(android.os.Handler!);
+    method public int describeContents();
+    method protected void onReceiveResult(int, android.os.Bundle!);
+    method public void send(int, android.os.Bundle!);
+    method public void writeToParcel(android.os.Parcel!, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.os.ResultReceiver!>! CREATOR;
+  }
+
+}
+
+package androidx.core.accessibilityservice {
+
+  public final class AccessibilityServiceInfoCompat {
+    method public static String capabilityToString(int);
+    method public static String feedbackTypeToString(int);
+    method public static String? flagToString(int);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+  }
+
+}
+
+package androidx.core.app {
+
+  public class ActivityCompat extends androidx.core.content.ContextCompat {
+    ctor protected ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.ActivityCompat.PermissionCompatDelegate! getPermissionCompatDelegate();
+    method public static android.net.Uri? getReferrer(android.app.Activity);
+    method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+    method public static void postponeEnterTransition(android.app.Activity);
+    method public static void recreate(android.app.Activity);
+    method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity!, android.view.DragEvent!);
+    method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+    method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+    method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public static void startPostponedEnterTransition(android.app.Activity);
+  }
+
+  public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+    method public void onRequestPermissionsResult(int, String![], int[]);
+  }
+
+  public static interface ActivityCompat.PermissionCompatDelegate {
+    method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+    method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ActivityCompat.RequestPermissionsRequestCodeValidator {
+    method public void validateRequestPermissionsRequestCode(int);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public android.graphics.Rect? getLaunchBounds();
+    method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+    method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
+    method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+    method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+    method public android.os.Bundle? toBundle();
+    method public void update(androidx.core.app.ActivityOptionsCompat);
+    field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public final class AlarmManagerCompat {
+    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+  }
+
+  @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+    ctor public AppComponentFactory();
+    method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+  }
+
+  public class AppLaunchChecker {
+    ctor @Deprecated public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public final class AppOpsManagerCompat {
+    method public static int noteOp(android.content.Context, String, int, String);
+    method public static int noteOpNoThrow(android.content.Context, String, int, String);
+    method public static int noteProxyOp(android.content.Context, String, String);
+    method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+    method public static String? permissionToOp(String);
+    field public static final int MODE_ALLOWED = 0; // 0x0
+    field public static final int MODE_DEFAULT = 3; // 0x3
+    field public static final int MODE_ERRORED = 2; // 0x2
+    field public static final int MODE_IGNORED = 1; // 0x1
+  }
+
+  public final class BundleCompat {
+    method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+    method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ComponentActivity extends android.app.Activity implements androidx.core.view.KeyEventDispatcher.Component androidx.lifecycle.LifecycleOwner {
+    ctor public ComponentActivity();
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public <T extends androidx.core.app.ComponentActivity.ExtraData> T! getExtraData(Class<T!>!);
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void putExtraData(androidx.core.app.ComponentActivity.ExtraData!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean superDispatchKeyEvent(android.view.KeyEvent!);
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class ComponentActivity.ExtraData {
+    ctor @Deprecated public ComponentActivity.ExtraData();
+  }
+
+  @RequiresApi(api=28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class CoreComponentFactory extends android.app.AppComponentFactory {
+    ctor public CoreComponentFactory();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface CoreComponentFactory.CompatWrapped {
+    method public Object! getWrapper();
+  }
+
+  public class DialogCompat {
+    method public static android.view.View requireViewById(android.app.Dialog, int);
+  }
+
+  public class FrameMetricsAggregator {
+    ctor public FrameMetricsAggregator();
+    ctor public FrameMetricsAggregator(@androidx.core.app.FrameMetricsAggregator.MetricType int);
+    method public void add(android.app.Activity);
+    method public android.util.SparseIntArray![]? getMetrics();
+    method public android.util.SparseIntArray![]? remove(android.app.Activity);
+    method public android.util.SparseIntArray![]? reset();
+    method public android.util.SparseIntArray![]? stop();
+    field public static final int ANIMATION_DURATION = 256; // 0x100
+    field public static final int ANIMATION_INDEX = 8; // 0x8
+    field public static final int COMMAND_DURATION = 32; // 0x20
+    field public static final int COMMAND_INDEX = 5; // 0x5
+    field public static final int DELAY_DURATION = 128; // 0x80
+    field public static final int DELAY_INDEX = 7; // 0x7
+    field public static final int DRAW_DURATION = 8; // 0x8
+    field public static final int DRAW_INDEX = 3; // 0x3
+    field public static final int EVERY_DURATION = 511; // 0x1ff
+    field public static final int INPUT_DURATION = 2; // 0x2
+    field public static final int INPUT_INDEX = 1; // 0x1
+    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+    field public static final int SWAP_DURATION = 64; // 0x40
+    field public static final int SWAP_INDEX = 6; // 0x6
+    field public static final int SYNC_DURATION = 16; // 0x10
+    field public static final int SYNC_INDEX = 4; // 0x4
+    field public static final int TOTAL_DURATION = 1; // 0x1
+    field public static final int TOTAL_INDEX = 0; // 0x0
+  }
+
+  @IntDef(flag=true, value={androidx.core.app.FrameMetricsAggregator.TOTAL_DURATION, androidx.core.app.FrameMetricsAggregator.INPUT_DURATION, androidx.core.app.FrameMetricsAggregator.LAYOUT_MEASURE_DURATION, androidx.core.app.FrameMetricsAggregator.DRAW_DURATION, androidx.core.app.FrameMetricsAggregator.SYNC_DURATION, androidx.core.app.FrameMetricsAggregator.COMMAND_DURATION, androidx.core.app.FrameMetricsAggregator.SWAP_DURATION, androidx.core.app.FrameMetricsAggregator.DELAY_DURATION, androidx.core.app.FrameMetricsAggregator.ANIMATION_DURATION, androidx.core.app.FrameMetricsAggregator.EVERY_DURATION}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FrameMetricsAggregator.MetricType {
+  }
+
+  public abstract class JobIntentService extends android.app.Service {
+    ctor public JobIntentService();
+    method public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
+    method public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+    method public boolean isStopped();
+    method public android.os.IBinder! onBind(android.content.Intent);
+    method protected abstract void onHandleWork(android.content.Intent);
+    method public boolean onStopCurrentWork();
+    method public void setInterruptIfStopped(boolean);
+  }
+
+  public final class NavUtils {
+    method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static String? getParentActivityName(android.app.Activity);
+    method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void navigateUpFromSameTask(android.app.Activity);
+    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+    field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface NotificationBuilderWithBuilderAccessor {
+    method public android.app.Notification.Builder! getBuilder();
+  }
+
+  public class NotificationCompat {
+    ctor @Deprecated public NotificationCompat();
+    method public static androidx.core.app.NotificationCompat.Action! getAction(android.app.Notification!, int);
+    method public static int getActionCount(android.app.Notification!);
+    method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification!);
+    method public static int getBadgeIconType(android.app.Notification!);
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
+    method public static String! getCategory(android.app.Notification!);
+    method public static String! getChannelId(android.app.Notification!);
+    method @RequiresApi(19) public static CharSequence! getContentTitle(android.app.Notification!);
+    method public static android.os.Bundle? getExtras(android.app.Notification!);
+    method public static String! getGroup(android.app.Notification!);
+    method @androidx.core.app.NotificationCompat.GroupAlertBehavior public static int getGroupAlertBehavior(android.app.Notification!);
+    method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!>! getInvisibleActions(android.app.Notification!);
+    method public static boolean getLocalOnly(android.app.Notification!);
+    method public static String! getShortcutId(android.app.Notification!);
+    method public static String! getSortKey(android.app.Notification!);
+    method public static long getTimeoutAfter(android.app.Notification!);
+    method public static boolean isGroupSummary(android.app.Notification!);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
+    field public static final String CATEGORY_ALARM = "alarm";
+    field public static final String CATEGORY_CALL = "call";
+    field public static final String CATEGORY_EMAIL = "email";
+    field public static final String CATEGORY_ERROR = "err";
+    field public static final String CATEGORY_EVENT = "event";
+    field public static final String CATEGORY_MESSAGE = "msg";
+    field public static final String CATEGORY_NAVIGATION = "navigation";
+    field public static final String CATEGORY_PROGRESS = "progress";
+    field public static final String CATEGORY_PROMO = "promo";
+    field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+    field public static final String CATEGORY_REMINDER = "reminder";
+    field public static final String CATEGORY_SERVICE = "service";
+    field public static final String CATEGORY_SOCIAL = "social";
+    field public static final String CATEGORY_STATUS = "status";
+    field public static final String CATEGORY_SYSTEM = "sys";
+    field public static final String CATEGORY_TRANSPORT = "transport";
+    field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+    field public static final int DEFAULT_ALL = -1; // 0xffffffff
+    field public static final int DEFAULT_LIGHTS = 4; // 0x4
+    field public static final int DEFAULT_SOUND = 1; // 0x1
+    field public static final int DEFAULT_VIBRATE = 2; // 0x2
+    field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+    field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+    field public static final String EXTRA_BIG_TEXT = "android.bigText";
+    field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+    field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+    field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+    field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+    field public static final String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+    field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+    field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+    field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+    field public static final String EXTRA_MESSAGES = "android.messages";
+    field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+    field public static final String EXTRA_PEOPLE = "android.people";
+    field public static final String EXTRA_PICTURE = "android.picture";
+    field public static final String EXTRA_PROGRESS = "android.progress";
+    field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+    field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+    field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+    field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+    field public static final String EXTRA_SMALL_ICON = "android.icon";
+    field public static final String EXTRA_SUB_TEXT = "android.subText";
+    field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+    field public static final String EXTRA_TEMPLATE = "android.template";
+    field public static final String EXTRA_TEXT = "android.text";
+    field public static final String EXTRA_TEXT_LINES = "android.textLines";
+    field public static final String EXTRA_TITLE = "android.title";
+    field public static final String EXTRA_TITLE_BIG = "android.title.big";
+    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+    field public static final int FLAG_BUBBLE = 4096; // 0x1000
+    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+    field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+    field public static final int FLAG_INSISTENT = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+    field public static final int FLAG_NO_CLEAR = 32; // 0x20
+    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+    field public static final int GROUP_ALERT_ALL = 0; // 0x0
+    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+    field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+    field public static final String GROUP_KEY_SILENT = "silent";
+    field public static final int PRIORITY_DEFAULT = 0; // 0x0
+    field public static final int PRIORITY_HIGH = 1; // 0x1
+    field public static final int PRIORITY_LOW = -1; // 0xffffffff
+    field public static final int PRIORITY_MAX = 2; // 0x2
+    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+  }
+
+  public static class NotificationCompat.Action {
+    ctor public NotificationCompat.Action(int, CharSequence!, android.app.PendingIntent!);
+    ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    method public android.app.PendingIntent! getActionIntent();
+    method public boolean getAllowGeneratedReplies();
+    method public androidx.core.app.RemoteInput![]! getDataOnlyRemoteInputs();
+    method public android.os.Bundle! getExtras();
+    method @Deprecated public int getIcon();
+    method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
+    method public androidx.core.app.RemoteInput![]! getRemoteInputs();
+    method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+    method public boolean getShowsUserInterface();
+    method public CharSequence! getTitle();
+    method public boolean isContextual();
+    field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+    field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
+    field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+    field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+    field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+    field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+    field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+    field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+    field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+    field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+    field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+    field public android.app.PendingIntent! actionIntent;
+    field @Deprecated public int icon;
+    field public CharSequence! title;
+  }
+
+  public static final class NotificationCompat.Action.Builder {
+    ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(int, CharSequence!, android.app.PendingIntent!);
+    ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action!);
+    method public androidx.core.app.NotificationCompat.Action.Builder! addExtras(android.os.Bundle!);
+    method public androidx.core.app.NotificationCompat.Action.Builder! addRemoteInput(androidx.core.app.RemoteInput!);
+    method public androidx.core.app.NotificationCompat.Action! build();
+    method public androidx.core.app.NotificationCompat.Action.Builder! extend(androidx.core.app.NotificationCompat.Action.Extender!);
+    method public android.os.Bundle! getExtras();
+    method public androidx.core.app.NotificationCompat.Action.Builder! setAllowGeneratedReplies(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder! setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+    method public androidx.core.app.NotificationCompat.Action.Builder! setShowsUserInterface(boolean);
+  }
+
+  public static interface NotificationCompat.Action.Extender {
+    method public androidx.core.app.NotificationCompat.Action.Builder! extend(androidx.core.app.NotificationCompat.Action.Builder!);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+  }
+
+  public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+    ctor public NotificationCompat.Action.WearableExtender();
+    ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action!);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender! clone();
+    method public androidx.core.app.NotificationCompat.Action.Builder! extend(androidx.core.app.NotificationCompat.Action.Builder!);
+    method @Deprecated public CharSequence! getCancelLabel();
+    method @Deprecated public CharSequence! getConfirmLabel();
+    method public boolean getHintDisplayActionInline();
+    method public boolean getHintLaunchesActivity();
+    method @Deprecated public CharSequence! getInProgressLabel();
+    method public boolean isAvailableOffline();
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender! setAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender! setCancelLabel(CharSequence!);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender! setConfirmLabel(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender! setHintDisplayActionInline(boolean);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender! setHintLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender! setInProgressLabel(CharSequence!);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.BADGE_ICON_NONE, androidx.core.app.NotificationCompat.BADGE_ICON_SMALL, androidx.core.app.NotificationCompat.BADGE_ICON_LARGE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.BadgeIconType {
+  }
+
+  public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigPictureStyle();
+    ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder!);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle! bigLargeIcon(android.graphics.Bitmap!);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle! bigPicture(android.graphics.Bitmap!);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle! setBigContentTitle(CharSequence!);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle! setSummaryText(CharSequence!);
+  }
+
+  public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigTextStyle();
+    ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder!);
+    method public androidx.core.app.NotificationCompat.BigTextStyle! bigText(CharSequence!);
+    method public androidx.core.app.NotificationCompat.BigTextStyle! setBigContentTitle(CharSequence!);
+    method public androidx.core.app.NotificationCompat.BigTextStyle! setSummaryText(CharSequence!);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata {
+    method @RequiresApi(29) public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
+    method public boolean getAutoExpandBubble();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
+    method @DimenRes public int getDesiredHeightResId();
+    method public androidx.core.graphics.drawable.IconCompat getIcon();
+    method public android.app.PendingIntent getIntent();
+    method public boolean isNotificationSuppressed();
+    method @RequiresApi(29) public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata.Builder {
+    ctor public NotificationCompat.BubbleMetadata.Builder();
+    method public androidx.core.app.NotificationCompat.BubbleMetadata build();
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
+  }
+
+  public static class NotificationCompat.Builder {
+    ctor public NotificationCompat.Builder(android.content.Context, String);
+    ctor @Deprecated public NotificationCompat.Builder(android.content.Context!);
+    method public androidx.core.app.NotificationCompat.Builder! addAction(int, CharSequence!, android.app.PendingIntent!);
+    method public androidx.core.app.NotificationCompat.Builder! addAction(androidx.core.app.NotificationCompat.Action!);
+    method public androidx.core.app.NotificationCompat.Builder! addExtras(android.os.Bundle!);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder! addInvisibleAction(int, CharSequence!, android.app.PendingIntent!);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder! addInvisibleAction(androidx.core.app.NotificationCompat.Action!);
+    method public androidx.core.app.NotificationCompat.Builder! addPerson(String!);
+    method public android.app.Notification! build();
+    method public androidx.core.app.NotificationCompat.Builder! extend(androidx.core.app.NotificationCompat.Extender!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! getBigContentView();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getColor();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! getContentView();
+    method public android.os.Bundle! getExtras();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! getHeadsUpContentView();
+    method @Deprecated public android.app.Notification! getNotification();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getPriority();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public long getWhenIfShowing();
+    method protected static CharSequence! limitCharSequenceLength(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setAutoCancel(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setBadgeIconType(@androidx.core.app.NotificationCompat.BadgeIconType int);
+    method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
+    method public androidx.core.app.NotificationCompat.Builder! setCategory(String!);
+    method public androidx.core.app.NotificationCompat.Builder! setChannelId(String);
+    method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.Builder! setColorized(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setContent(android.widget.RemoteViews!);
+    method public androidx.core.app.NotificationCompat.Builder! setContentInfo(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Builder! setContentIntent(android.app.PendingIntent!);
+    method public androidx.core.app.NotificationCompat.Builder! setContentText(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Builder! setContentTitle(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Builder! setCustomBigContentView(android.widget.RemoteViews!);
+    method public androidx.core.app.NotificationCompat.Builder! setCustomContentView(android.widget.RemoteViews!);
+    method public androidx.core.app.NotificationCompat.Builder! setCustomHeadsUpContentView(android.widget.RemoteViews!);
+    method public androidx.core.app.NotificationCompat.Builder! setDefaults(int);
+    method public androidx.core.app.NotificationCompat.Builder! setDeleteIntent(android.app.PendingIntent!);
+    method public androidx.core.app.NotificationCompat.Builder! setExtras(android.os.Bundle!);
+    method public androidx.core.app.NotificationCompat.Builder! setFullScreenIntent(android.app.PendingIntent!, boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setGroup(String!);
+    method public androidx.core.app.NotificationCompat.Builder! setGroupAlertBehavior(@androidx.core.app.NotificationCompat.GroupAlertBehavior int);
+    method public androidx.core.app.NotificationCompat.Builder! setGroupSummary(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setLargeIcon(android.graphics.Bitmap!);
+    method public androidx.core.app.NotificationCompat.Builder! setLights(@ColorInt int, int, int);
+    method public androidx.core.app.NotificationCompat.Builder! setLocalOnly(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
+    method public androidx.core.app.NotificationCompat.Builder! setNumber(int);
+    method public androidx.core.app.NotificationCompat.Builder! setOngoing(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setOnlyAlertOnce(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setPriority(int);
+    method public androidx.core.app.NotificationCompat.Builder! setProgress(int, int, boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setPublicVersion(android.app.Notification!);
+    method public androidx.core.app.NotificationCompat.Builder! setRemoteInputHistory(CharSequence![]!);
+    method public androidx.core.app.NotificationCompat.Builder! setShortcutId(String!);
+    method public androidx.core.app.NotificationCompat.Builder! setShowWhen(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setSmallIcon(int);
+    method public androidx.core.app.NotificationCompat.Builder! setSmallIcon(int, int);
+    method public androidx.core.app.NotificationCompat.Builder! setSortKey(String!);
+    method public androidx.core.app.NotificationCompat.Builder! setSound(android.net.Uri!);
+    method public androidx.core.app.NotificationCompat.Builder! setSound(android.net.Uri!, @androidx.core.app.NotificationCompat.StreamType int);
+    method public androidx.core.app.NotificationCompat.Builder! setStyle(androidx.core.app.NotificationCompat.Style!);
+    method public androidx.core.app.NotificationCompat.Builder! setSubText(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Builder! setTicker(CharSequence!);
+    method public androidx.core.app.NotificationCompat.Builder! setTicker(CharSequence!, android.widget.RemoteViews!);
+    method public androidx.core.app.NotificationCompat.Builder! setTimeoutAfter(long);
+    method public androidx.core.app.NotificationCompat.Builder! setUsesChronometer(boolean);
+    method public androidx.core.app.NotificationCompat.Builder! setVibrate(long[]!);
+    method public androidx.core.app.NotificationCompat.Builder! setVisibility(@androidx.core.app.NotificationCompat.NotificationVisibility int);
+    method public androidx.core.app.NotificationCompat.Builder! setWhen(long);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public java.util.ArrayList<androidx.core.app.NotificationCompat.Action!>! mActions;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.Context! mContext;
+    field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
+  }
+
+  public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.CarExtender();
+    ctor public NotificationCompat.CarExtender(android.app.Notification!);
+    method public androidx.core.app.NotificationCompat.Builder! extend(androidx.core.app.NotificationCompat.Builder!);
+    method @ColorInt public int getColor();
+    method public android.graphics.Bitmap! getLargeIcon();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation! getUnreadConversation();
+    method public androidx.core.app.NotificationCompat.CarExtender! setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CarExtender! setLargeIcon(android.graphics.Bitmap!);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender! setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation!);
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
+    method @Deprecated public long getLatestTimestamp();
+    method @Deprecated public String![]! getMessages();
+    method @Deprecated public String! getParticipant();
+    method @Deprecated public String![]! getParticipants();
+    method @Deprecated public android.app.PendingIntent! getReadPendingIntent();
+    method @Deprecated public androidx.core.app.RemoteInput! getRemoteInput();
+    method @Deprecated public android.app.PendingIntent! getReplyPendingIntent();
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+    ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String!);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder! addMessage(String!);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation! build();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder! setLatestTimestamp(long);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder! setReadPendingIntent(android.app.PendingIntent!);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder! setReplyAction(android.app.PendingIntent!, androidx.core.app.RemoteInput!);
+  }
+
+  public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  public static interface NotificationCompat.Extender {
+    method public androidx.core.app.NotificationCompat.Builder! extend(androidx.core.app.NotificationCompat.Builder!);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.GROUP_ALERT_ALL, androidx.core.app.NotificationCompat.GROUP_ALERT_SUMMARY, androidx.core.app.NotificationCompat.GROUP_ALERT_CHILDREN}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.GroupAlertBehavior {
+  }
+
+  public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.InboxStyle();
+    ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder!);
+    method public androidx.core.app.NotificationCompat.InboxStyle! addLine(CharSequence!);
+    method public androidx.core.app.NotificationCompat.InboxStyle! setBigContentTitle(CharSequence!);
+    method public androidx.core.app.NotificationCompat.InboxStyle! setSummaryText(CharSequence!);
+  }
+
+  public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+    ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+    method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle! addMessage(CharSequence!, long, CharSequence!);
+    method public androidx.core.app.NotificationCompat.MessagingStyle! addMessage(CharSequence!, long, androidx.core.app.Person!);
+    method public androidx.core.app.NotificationCompat.MessagingStyle! addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message!);
+    method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification!);
+    method public CharSequence? getConversationTitle();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!>! getMessages();
+    method public androidx.core.app.Person! getUser();
+    method @Deprecated public CharSequence! getUserDisplayName();
+    method public boolean isGroupConversation();
+    method public androidx.core.app.NotificationCompat.MessagingStyle! setConversationTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle! setGroupConversation(boolean);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(CharSequence!, long, androidx.core.app.Person?);
+    ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence!, long, CharSequence!);
+    method public String? getDataMimeType();
+    method public android.net.Uri? getDataUri();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.Person? getPerson();
+    method @Deprecated public CharSequence? getSender();
+    method public CharSequence getText();
+    method public long getTimestamp();
+    method public androidx.core.app.NotificationCompat.MessagingStyle.Message! setData(String!, android.net.Uri!);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.VISIBILITY_PUBLIC, androidx.core.app.NotificationCompat.VISIBILITY_PRIVATE, androidx.core.app.NotificationCompat.VISIBILITY_SECRET}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.NotificationVisibility {
+  }
+
+  @IntDef({android.media.AudioManager.STREAM_VOICE_CALL, android.media.AudioManager.STREAM_SYSTEM, android.media.AudioManager.STREAM_RING, android.media.AudioManager.STREAM_MUSIC, android.media.AudioManager.STREAM_ALARM, android.media.AudioManager.STREAM_NOTIFICATION, android.media.AudioManager.STREAM_DTMF, android.media.AudioManager.STREAM_ACCESSIBILITY}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.StreamType {
+  }
+
+  public abstract static class NotificationCompat.Style {
+    ctor public NotificationCompat.Style();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addCompatExtras(android.os.Bundle!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void apply(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! applyStandardTemplate(boolean, int, boolean);
+    method public android.app.Notification! build();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void buildIntoRemoteViews(android.widget.RemoteViews!, android.widget.RemoteViews!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.Bitmap! createColoredBitmap(int, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! makeBigContentView(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! makeContentView(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! makeHeadsUpContentView(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void restoreFromCompatExtras(android.os.Bundle!);
+    method public void setBuilder(androidx.core.app.NotificationCompat.Builder!);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected androidx.core.app.NotificationCompat.Builder! mBuilder;
+  }
+
+  public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.WearableExtender();
+    ctor public NotificationCompat.WearableExtender(android.app.Notification!);
+    method public androidx.core.app.NotificationCompat.WearableExtender! addAction(androidx.core.app.NotificationCompat.Action!);
+    method public androidx.core.app.NotificationCompat.WearableExtender! addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>!);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! addPage(android.app.Notification!);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! addPages(java.util.List<android.app.Notification!>!);
+    method public androidx.core.app.NotificationCompat.WearableExtender! clearActions();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! clearPages();
+    method public androidx.core.app.NotificationCompat.WearableExtender! clone();
+    method public androidx.core.app.NotificationCompat.Builder! extend(androidx.core.app.NotificationCompat.Builder!);
+    method public java.util.List<androidx.core.app.NotificationCompat.Action!>! getActions();
+    method @Deprecated public android.graphics.Bitmap! getBackground();
+    method public String! getBridgeTag();
+    method public int getContentAction();
+    method @Deprecated public int getContentIcon();
+    method @Deprecated public int getContentIconGravity();
+    method public boolean getContentIntentAvailableOffline();
+    method @Deprecated public int getCustomContentHeight();
+    method @Deprecated public int getCustomSizePreset();
+    method public String! getDismissalId();
+    method @Deprecated public android.app.PendingIntent! getDisplayIntent();
+    method @Deprecated public int getGravity();
+    method @Deprecated public boolean getHintAmbientBigPicture();
+    method @Deprecated public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    method @Deprecated public boolean getHintHideIcon();
+    method @Deprecated public int getHintScreenTimeout();
+    method @Deprecated public boolean getHintShowBackgroundOnly();
+    method @Deprecated public java.util.List<android.app.Notification!>! getPages();
+    method public boolean getStartScrollBottom();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setBackground(android.graphics.Bitmap!);
+    method public androidx.core.app.NotificationCompat.WearableExtender! setBridgeTag(String!);
+    method public androidx.core.app.NotificationCompat.WearableExtender! setContentAction(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setContentIcon(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setContentIconGravity(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender! setContentIntentAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setCustomContentHeight(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setCustomSizePreset(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender! setDismissalId(String!);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setDisplayIntent(android.app.PendingIntent!);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setGravity(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintAmbientBigPicture(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintAvoidBackgroundClipping(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender! setHintContentIntentLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintHideIcon(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintScreenTimeout(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintShowBackgroundOnly(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender! setStartScrollBottom(boolean);
+    field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+    field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+    field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+    field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+    field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+    field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+    field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+    field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+  }
+
+  public final class NotificationCompatExtras {
+    field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+    field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+    field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+    field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+    field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+    field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+  }
+
+  public abstract class NotificationCompatSideChannelService extends android.app.Service {
+    ctor public NotificationCompatSideChannelService();
+    method public abstract void cancel(String!, int, String!);
+    method public abstract void cancelAll(String!);
+    method public abstract void notify(String!, int, String!, android.app.Notification!);
+    method public android.os.IBinder! onBind(android.content.Intent!);
+  }
+
+  public final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(android.app.NotificationChannel);
+    method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+    method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
+    method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public android.app.NotificationChannel? getNotificationChannel(String);
+    method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+    method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
+    method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
+    method public void notify(int, android.app.Notification);
+    method public void notify(String?, int, android.app.Notification);
+    field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+    field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public class Person {
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.Person fromAndroidPerson(android.app.Person);
+    method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+    method @RequiresApi(22) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.Person fromPersistableBundle(android.os.PersistableBundle);
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public String? getKey();
+    method public CharSequence? getName();
+    method public String? getUri();
+    method public boolean isBot();
+    method public boolean isImportant();
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.app.Person toAndroidPerson();
+    method public androidx.core.app.Person.Builder toBuilder();
+    method public android.os.Bundle toBundle();
+    method @RequiresApi(22) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.os.PersistableBundle toPersistableBundle();
+  }
+
+  public static class Person.Builder {
+    ctor public Person.Builder();
+    method public androidx.core.app.Person build();
+    method public androidx.core.app.Person.Builder setBot(boolean);
+    method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+    method public androidx.core.app.Person.Builder setImportant(boolean);
+    method public androidx.core.app.Person.Builder setKey(String?);
+    method public androidx.core.app.Person.Builder setName(CharSequence?);
+    method public androidx.core.app.Person.Builder setUri(String?);
+  }
+
+  public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
+    ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public RemoteActionCompat();
+    ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+    method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+    method public android.app.PendingIntent getActionIntent();
+    method public CharSequence getContentDescription();
+    method public androidx.core.graphics.drawable.IconCompat getIcon();
+    method public CharSequence getTitle();
+    method public boolean isEnabled();
+    method public void setEnabled(boolean);
+    method public void setShouldShowIcon(boolean);
+    method public boolean shouldShowIcon();
+    method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.app.PendingIntent! mActionIntent;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public CharSequence! mContentDescription;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean mEnabled;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.core.graphics.drawable.IconCompat! mIcon;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean mShouldShowIcon;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public CharSequence! mTitle;
+  }
+
+  public final class RemoteInput {
+    method public static void addDataResultToIntent(androidx.core.app.RemoteInput!, android.content.Intent!, java.util.Map<java.lang.String!,android.net.Uri!>!);
+    method public static void addResultsToIntent(androidx.core.app.RemoteInput![]!, android.content.Intent!, android.os.Bundle!);
+    method public boolean getAllowFreeFormInput();
+    method public java.util.Set<java.lang.String!>! getAllowedDataTypes();
+    method public CharSequence![]! getChoices();
+    method public static java.util.Map<java.lang.String!,android.net.Uri!>! getDataResultsFromIntent(android.content.Intent!, String!);
+    method @androidx.core.app.RemoteInput.EditChoicesBeforeSending public int getEditChoicesBeforeSending();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence! getLabel();
+    method public String! getResultKey();
+    method public static android.os.Bundle! getResultsFromIntent(android.content.Intent!);
+    method @androidx.core.app.RemoteInput.Source public static int getResultsSource(android.content.Intent);
+    method public boolean isDataOnly();
+    method public static void setResultsSource(android.content.Intent, @androidx.core.app.RemoteInput.Source int);
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
+    field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+    field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+    field public static final int SOURCE_CHOICE = 1; // 0x1
+    field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+  }
+
+  public static final class RemoteInput.Builder {
+    ctor public RemoteInput.Builder(String);
+    method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+    method public androidx.core.app.RemoteInput build();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+    method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+    method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
+    method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(@androidx.core.app.RemoteInput.EditChoicesBeforeSending int);
+    method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+  }
+
+  @IntDef({androidx.core.app.RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO, androidx.core.app.RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED, androidx.core.app.RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RemoteInput.EditChoicesBeforeSending {
+  }
+
+  @IntDef({androidx.core.app.RemoteInput.SOURCE_FREE_FORM_INPUT, androidx.core.app.RemoteInput.SOURCE_CHOICE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RemoteInput.Source {
+  }
+
+  public final class ServiceCompat {
+    method public static void stopForeground(android.app.Service, @androidx.core.app.ServiceCompat.StopForegroundFlags int);
+    field public static final int START_STICKY = 1; // 0x1
+    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+  }
+
+  @IntDef(flag=true, value={androidx.core.app.ServiceCompat.STOP_FOREGROUND_REMOVE, androidx.core.app.ServiceCompat.STOP_FOREGROUND_DETACH}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ServiceCompat.StopForegroundFlags {
+  }
+
+  public final class ShareCompat {
+    method public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
+    field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+    field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+  }
+
+  public static class ShareCompat.IntentBuilder {
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
+    method public void startChooser();
+  }
+
+  public static class ShareCompat.IntentReader {
+    method public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
+    method public int getStreamCount();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
+    method public boolean isMultipleShare();
+    method public boolean isShareIntent();
+    method public boolean isSingleShare();
+  }
+
+  public abstract class SharedElementCallback {
+    ctor public SharedElementCallback();
+    method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+    method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+    method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
+    method public void onRejectSharedElements(java.util.List<android.view.View!>!);
+    method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+  }
+
+  public static interface SharedElementCallback.OnSharedElementsReadyListener {
+    method public void onSharedElementsReady();
+  }
+
+  public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+    method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+    method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+    method public androidx.core.app.TaskStackBuilder! addParentStack(android.content.ComponentName!);
+    method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+    method public android.content.Intent? editIntentAt(int);
+    method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+    method @Deprecated public android.content.Intent! getIntent(int);
+    method public int getIntentCount();
+    method public android.content.Intent![] getIntents();
+    method public android.app.PendingIntent? getPendingIntent(int, int);
+    method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+    method @Deprecated public java.util.Iterator<android.content.Intent!>! iterator();
+    method public void startActivities();
+    method public void startActivities(android.os.Bundle?);
+  }
+
+  public static interface TaskStackBuilder.SupportParentable {
+    method public android.content.Intent? getSupportParentActivityIntent();
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentProviderCompat {
+    method public static android.content.Context requireContext(android.content.ContentProvider);
+  }
+
+  public final class ContentResolverCompat {
+    method public static android.database.Cursor! query(android.content.ContentResolver!, android.net.Uri!, String![]!, String!, String![]!, String!, androidx.core.os.CancellationSignal!);
+  }
+
+  public class ContextCompat {
+    ctor protected ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, String);
+    method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+    method public static java.io.File! getCodeCacheDir(android.content.Context);
+    method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+    method public static java.io.File? getDataDir(android.content.Context);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+    method public static java.io.File![] getExternalCacheDirs(android.content.Context);
+    method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
+    method public static java.util.concurrent.Executor! getMainExecutor(android.content.Context!);
+    method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File![] getObbDirs(android.content.Context);
+    method public static <T> T? getSystemService(android.content.Context, Class<T!>);
+    method public static String? getSystemServiceName(android.content.Context, Class<?>);
+    method public static boolean isDeviceProtectedStorage(android.content.Context);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![]);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
+    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
+  }
+
+  public class FileProvider extends android.content.ContentProvider {
+    ctor public FileProvider();
+    method public int delete(android.net.Uri, String?, String![]?);
+    method public String! getType(android.net.Uri);
+    method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+    method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues!);
+    method public boolean onCreate();
+    method public android.database.Cursor! query(android.net.Uri, String![]?, String?, String![]?, String?);
+    method public int update(android.net.Uri, android.content.ContentValues!, String?, String![]?);
+  }
+
+  public final class IntentCompat {
+    method public static android.content.Intent makeMainSelectorActivity(String, String);
+    field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+  }
+
+  public final class MimeTypeFilter {
+    method public static boolean matches(String?, String);
+    method public static String? matches(String?, String![]);
+    method public static String? matches(String![]?, String);
+    method public static String![] matchesMany(String![]?, String);
+  }
+
+  public final class PermissionChecker {
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkCallingOrSelfPermission(android.content.Context, String);
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkCallingPermission(android.content.Context, String, String?);
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkPermission(android.content.Context, String, int, int, String?);
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkSelfPermission(android.content.Context, String);
+    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+    field public static final int PERMISSION_GRANTED = 0; // 0x0
+  }
+
+  @IntDef({androidx.core.content.PermissionChecker.PERMISSION_GRANTED, androidx.core.content.PermissionChecker.PERMISSION_DENIED, androidx.core.content.PermissionChecker.PERMISSION_DENIED_APP_OP}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface PermissionChecker.PermissionResult {
+  }
+
+  @Deprecated public final class SharedPreferencesCompat {
+  }
+
+  @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+    method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+    method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+  }
+
+}
+
+package androidx.core.content.pm {
+
+  @Deprecated public final class ActivityInfoCompat {
+    field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+  public final class PackageInfoCompat {
+    method public static long getLongVersionCode(android.content.pm.PackageInfo);
+  }
+
+  public final class PermissionInfoCompat {
+    method public static int getProtection(android.content.pm.PermissionInfo);
+    method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+  }
+
+  public class ShortcutInfoCompat {
+    method public android.content.ComponentName? getActivity();
+    method public java.util.Set<java.lang.String!>? getCategories();
+    method public CharSequence? getDisabledMessage();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.graphics.drawable.IconCompat! getIcon();
+    method public String getId();
+    method public android.content.Intent getIntent();
+    method public android.content.Intent![] getIntents();
+    method public CharSequence? getLongLabel();
+    method public int getRank();
+    method public CharSequence getShortLabel();
+    method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+  }
+
+  public static class ShortcutInfoCompat.Builder {
+    ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public ShortcutInfoCompat.Builder(androidx.core.content.pm.ShortcutInfoCompat);
+    ctor @RequiresApi(25) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public ShortcutInfoCompat.Builder(android.content.Context, android.content.pm.ShortcutInfo);
+    method public androidx.core.content.pm.ShortcutInfoCompat build();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class ShortcutInfoCompatSaver<T> {
+    ctor public ShortcutInfoCompatSaver();
+    method @AnyThread public abstract T! addShortcuts(java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>!);
+    method @WorkerThread public java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>! getShortcuts() throws java.lang.Exception;
+    method @AnyThread public abstract T! removeAllShortcuts();
+    method @AnyThread public abstract T! removeShortcuts(java.util.List<java.lang.String!>!);
+  }
+
+  public class ShortcutManagerCompat {
+    method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
+    method public static int getMaxShortcutCountPerActivity(android.content.Context);
+    method public static boolean isRequestPinShortcutSupported(android.content.Context);
+    method public static void removeAllDynamicShortcuts(android.content.Context);
+    method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+    method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+  }
+
+}
+
+package androidx.core.content.res {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ColorStateListInflaterCompat {
+    method public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static android.content.res.ColorStateList createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static android.content.res.ColorStateList? inflate(android.content.res.Resources, @XmlRes int, android.content.res.Resources.Theme?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ComplexColorCompat {
+    method @ColorInt public int getColor();
+    method public android.graphics.Shader? getShader();
+    method public static androidx.core.content.res.ComplexColorCompat? inflate(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?);
+    method public boolean isGradient();
+    method public boolean isStateful();
+    method public boolean onStateChanged(int[]!);
+    method public void setColor(@ColorInt int);
+    method public boolean willDraw();
+  }
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FontResourcesParserCompat {
+    method public static androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry? parse(org.xmlpull.v1.XmlPullParser!, android.content.res.Resources!) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static java.util.List<java.util.List<byte[]!>!>! readCerts(android.content.res.Resources!, @ArrayRes int);
+    field public static final int FETCH_STRATEGY_ASYNC = 1; // 0x1
+    field public static final int FETCH_STRATEGY_BLOCKING = 0; // 0x0
+    field public static final int INFINITE_TIMEOUT_VALUE = -1; // 0xffffffff
+  }
+
+  public static interface FontResourcesParserCompat.FamilyResourceEntry {
+  }
+
+  @IntDef({androidx.core.content.res.FontResourcesParserCompat.FETCH_STRATEGY_BLOCKING, androidx.core.content.res.FontResourcesParserCompat.FETCH_STRATEGY_ASYNC}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FontResourcesParserCompat.FetchStrategy {
+  }
+
+  public static final class FontResourcesParserCompat.FontFamilyFilesResourceEntry implements androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry {
+    ctor public FontResourcesParserCompat.FontFamilyFilesResourceEntry(androidx.core.content.res.FontResourcesParserCompat.FontFileResourceEntry![]);
+    method public androidx.core.content.res.FontResourcesParserCompat.FontFileResourceEntry![] getEntries();
+  }
+
+  public static final class FontResourcesParserCompat.FontFileResourceEntry {
+    ctor public FontResourcesParserCompat.FontFileResourceEntry(String, int, boolean, String?, int, int);
+    method public String getFileName();
+    method public int getResourceId();
+    method public int getTtcIndex();
+    method public String? getVariationSettings();
+    method public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static final class FontResourcesParserCompat.ProviderResourceEntry implements androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry {
+    ctor public FontResourcesParserCompat.ProviderResourceEntry(androidx.core.provider.FontRequest, @androidx.core.content.res.FontResourcesParserCompat.FetchStrategy int, int);
+    method @androidx.core.content.res.FontResourcesParserCompat.FetchStrategy public int getFetchStrategy();
+    method public androidx.core.provider.FontRequest getRequest();
+    method public int getTimeout();
+  }
+
+  public final class ResourcesCompat {
+    method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static float getFloat(android.content.res.Resources, @DimenRes int);
+    method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface! getFont(android.content.Context, @FontRes int, android.util.TypedValue!, int, androidx.core.content.res.ResourcesCompat.FontCallback?) throws android.content.res.Resources.NotFoundException;
+    field @AnyRes public static final int ID_NULL = 0; // 0x0
+  }
+
+  public abstract static class ResourcesCompat.FontCallback {
+    ctor public ResourcesCompat.FontCallback();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final void callbackFailAsync(@androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason int, android.os.Handler?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final void callbackSuccessAsync(android.graphics.Typeface!, android.os.Handler?);
+    method public abstract void onFontRetrievalFailed(@androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason int);
+    method public abstract void onFontRetrieved(android.graphics.Typeface);
+  }
+
+  public static final class ResourcesCompat.ThemeCompat {
+    method public static void rebase(android.content.res.Resources.Theme);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypedArrayUtils {
+    method public static int getAttr(android.content.Context, int, int);
+    method public static boolean getBoolean(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int, boolean);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static int getInt(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int, int);
+    method public static boolean getNamedBoolean(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, boolean);
+    method @ColorInt public static int getNamedColor(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, @ColorInt int);
+    method public static android.content.res.ColorStateList? getNamedColorStateList(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme?, String, @StyleableRes int);
+    method public static androidx.core.content.res.ComplexColorCompat! getNamedComplexColor(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme?, String, @StyleableRes int, @ColorInt int);
+    method public static float getNamedFloat(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, float);
+    method public static int getNamedInt(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, int);
+    method @AnyRes public static int getNamedResourceId(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, @AnyRes int);
+    method public static String? getNamedString(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int);
+    method @AnyRes public static int getResourceId(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int, @AnyRes int);
+    method public static String? getString(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static CharSequence? getText(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static CharSequence![]? getTextArray(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static boolean hasAttribute(org.xmlpull.v1.XmlPullParser, String);
+    method public static android.content.res.TypedArray obtainAttributes(android.content.res.Resources, android.content.res.Resources.Theme?, android.util.AttributeSet, int[]);
+    method public static android.util.TypedValue? peekNamedValue(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, int);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorWindowCompat {
+    method public static android.database.CursorWindow create(String?, long);
+  }
+
+  @Deprecated public final class DatabaseUtilsCompat {
+    method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
+    method @Deprecated public static String! concatenateWhere(String!, String!);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteCursorCompat {
+    method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapCompat {
+    method public static int getAllocationByteCount(android.graphics.Bitmap);
+    method public static boolean hasMipMap(android.graphics.Bitmap);
+    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+  }
+
+  public class BlendModeColorFilterCompat {
+    method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
+  }
+
+  public enum BlendModeCompat {
+    enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
+  }
+
+  public final class ColorUtils {
+    method @ColorInt public static int HSLToColor(float[]);
+    method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+    method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+    method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+    method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_X) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Y) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Z) double);
+    method public static void XYZToLAB(@FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_X) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Y) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Z) double, double[]);
+    method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+    method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+    method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+    method public static double calculateContrast(@ColorInt int, @ColorInt int);
+    method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+    method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+    method public static void colorToHSL(@ColorInt int, float[]);
+    method public static void colorToLAB(@ColorInt int, double[]);
+    method public static void colorToXYZ(@ColorInt int, double[]);
+    method public static int compositeColors(@ColorInt int, @ColorInt int);
+    method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+    method public static double distanceEuclidean(double[], double[]);
+    method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+  }
+
+  public final class Insets {
+    method public static androidx.core.graphics.Insets of(int, int, int, int);
+    method public static androidx.core.graphics.Insets of(android.graphics.Rect);
+    method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
+    method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+    method @Deprecated @RequiresApi(api=29) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.Insets wrap(android.graphics.Insets);
+    field public static final androidx.core.graphics.Insets NONE;
+    field public final int bottom;
+    field public final int left;
+    field public final int right;
+    field public final int top;
+  }
+
+  public final class PaintCompat {
+    method public static boolean hasGlyph(android.graphics.Paint, String);
+    method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
+  }
+
+  public final class PathSegment {
+    ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+    method public android.graphics.PointF getEnd();
+    method public float getEndFraction();
+    method public android.graphics.PointF getStart();
+    method public float getStartFraction();
+  }
+
+  public final class PathUtils {
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
+  }
+
+  public class TypefaceCompat {
+    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? createFromFontInfo(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![], int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? createFromResourcesFamilyXml(android.content.Context, androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry, android.content.res.Resources, int, int, androidx.core.content.res.ResourcesCompat.FontCallback?, android.os.Handler?, boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? createFromResourcesFontFile(android.content.Context, android.content.res.Resources, int, String!, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? findFromCache(android.content.res.Resources, int, int);
+  }
+
+  @RequiresApi(26) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatApi26Impl {
+    ctor public TypefaceCompatApi26Impl();
+    method protected android.graphics.Typeface? createFromFamiliesWithDefault(Object!);
+    method public android.graphics.Typeface? createFromFontFamilyFilesResourceEntry(android.content.Context!, androidx.core.content.res.FontResourcesParserCompat.FontFamilyFilesResourceEntry!, android.content.res.Resources!, int);
+    method public android.graphics.Typeface? createFromFontInfo(android.content.Context!, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![], int);
+    method public android.graphics.Typeface? createFromResourcesFontFile(android.content.Context!, android.content.res.Resources!, int, String!, int);
+    method protected java.lang.reflect.Method! obtainAbortCreationMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainAddFontFromAssetManagerMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainAddFontFromBufferMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainCreateFromFamiliesWithDefaultMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected Class<?>! obtainFontFamily() throws java.lang.ClassNotFoundException;
+    method protected java.lang.reflect.Constructor<?>! obtainFontFamilyCtor(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainFreezeMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    field protected final java.lang.reflect.Method! mAbortCreation;
+    field protected final java.lang.reflect.Method! mAddFontFromAssetManager;
+    field protected final java.lang.reflect.Method! mAddFontFromBuffer;
+    field protected final java.lang.reflect.Method! mCreateFromFamiliesWithDefault;
+    field protected final Class<?>! mFontFamily;
+    field protected final java.lang.reflect.Constructor<?>! mFontFamilyCtor;
+    field protected final java.lang.reflect.Method! mFreeze;
+  }
+
+  @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatApi28Impl extends androidx.core.graphics.TypefaceCompatApi26Impl {
+    ctor public TypefaceCompatApi28Impl();
+  }
+
+  @RequiresApi(29) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class TypefaceCompatApi29Impl {
+    ctor public TypefaceCompatApi29Impl();
+    method public android.graphics.Typeface? createFromFontFamilyFilesResourceEntry(android.content.Context!, androidx.core.content.res.FontResourcesParserCompat.FontFamilyFilesResourceEntry!, android.content.res.Resources!, int);
+    method public android.graphics.Typeface? createFromFontInfo(android.content.Context!, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![], int);
+    method protected android.graphics.Typeface! createFromInputStream(android.content.Context!, java.io.InputStream!);
+    method public android.graphics.Typeface? createFromResourcesFontFile(android.content.Context!, android.content.res.Resources!, int, String!, int);
+    method protected androidx.core.provider.FontsContractCompat.FontInfo! findBestInfo(androidx.core.provider.FontsContractCompat.FontInfo![]!, int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatUtil {
+    method public static void closeQuietly(java.io.Closeable!);
+    method @RequiresApi(19) public static java.nio.ByteBuffer? copyToDirectBuffer(android.content.Context!, android.content.res.Resources!, int);
+    method public static boolean copyToFile(java.io.File!, java.io.InputStream!);
+    method public static boolean copyToFile(java.io.File!, android.content.res.Resources!, int);
+    method public static java.io.File? getTempFile(android.content.Context!);
+    method @RequiresApi(19) public static java.nio.ByteBuffer? mmap(android.content.Context!, android.os.CancellationSignal!, android.net.Uri!);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+    method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+    method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
+    method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+  }
+
+  public class IconCompat extends androidx.versionedparcelable.CustomVersionedParcelable {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addToShortcutIntent(android.content.Intent, android.graphics.drawable.Drawable?, android.content.Context);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void checkResource(android.content.Context);
+    method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+    method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+    method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.graphics.drawable.Icon);
+    method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat? createFromIconOrNullIfZeroResId(android.graphics.drawable.Icon);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.res.Resources!, String!, @DrawableRes int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.Bitmap? getBitmap();
+    method @IdRes public int getResId();
+    method public String getResPackage();
+    method public int getType();
+    method public android.net.Uri getUri();
+    method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
+    method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
+    method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+    method public android.os.Bundle! toBundle();
+    method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
+    method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
+    field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
+    field public static final int TYPE_BITMAP = 1; // 0x1
+    field public static final int TYPE_DATA = 3; // 0x3
+    field public static final int TYPE_RESOURCE = 2; // 0x2
+    field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+    field public static final int TYPE_URI = 4; // 0x4
+    field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int mType;
+  }
+
+  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.Bitmap? getBitmap();
+    method public float getCornerRadius();
+    method public int getGravity();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public boolean hasAntiAlias();
+    method public boolean hasMipMap();
+    method public boolean isCircular();
+    method public void setAlpha(int);
+    method public void setAntiAlias(boolean);
+    method public void setCircular(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setCornerRadius(float);
+    method public void setDither(boolean);
+    method public void setGravity(int);
+    method public void setMipMap(boolean);
+    method public void setTargetDensity(android.graphics.Canvas);
+    method public void setTargetDensity(android.util.DisplayMetrics);
+    method public void setTargetDensity(int);
+  }
+
+  public final class RoundedBitmapDrawableFactory {
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TintAwareDrawable {
+    method public void setTint(@ColorInt int);
+    method public void setTintList(android.content.res.ColorStateList!);
+    method public void setTintMode(android.graphics.PorterDuff.Mode!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface WrappedDrawable {
+    method public android.graphics.drawable.Drawable! getWrappedDrawable();
+    method public void setWrappedDrawable(android.graphics.drawable.Drawable!);
+  }
+
+}
+
+package androidx.core.hardware.display {
+
+  public final class DisplayManagerCompat {
+    method public android.view.Display? getDisplay(int);
+    method public android.view.Display![] getDisplays();
+    method public android.view.Display![] getDisplays(String?);
+    method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+    field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+  }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+  @Deprecated public class FingerprintManagerCompat {
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+    method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+  }
+
+  @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+    method @Deprecated public void onAuthenticationError(int, CharSequence!);
+    method @Deprecated public void onAuthenticationFailed();
+    method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+    method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+  }
+
+  @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+    method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+  }
+
+  @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+    method @Deprecated public javax.crypto.Cipher? getCipher();
+    method @Deprecated public javax.crypto.Mac? getMac();
+    method @Deprecated public java.security.Signature? getSignature();
+  }
+
+}
+
+package androidx.core.internal.view {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SupportMenu extends android.view.Menu {
+    method public void setGroupDividerEnabled(boolean);
+    field public static final int CATEGORY_MASK = -65536; // 0xffff0000
+    field public static final int CATEGORY_SHIFT = 16; // 0x10
+    field public static final int FLAG_KEEP_OPEN_ON_SUBMENU_OPENED = 4; // 0x4
+    field public static final int SUPPORTED_MODIFIERS_MASK = 69647; // 0x1100f
+    field public static final int USER_MASK = 65535; // 0xffff
+    field public static final int USER_SHIFT = 0; // 0x0
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SupportMenuItem extends android.view.MenuItem {
+    method public int getAlphabeticModifiers();
+    method public CharSequence! getContentDescription();
+    method public android.content.res.ColorStateList! getIconTintList();
+    method public android.graphics.PorterDuff.Mode! getIconTintMode();
+    method public int getNumericModifiers();
+    method public androidx.core.view.ActionProvider! getSupportActionProvider();
+    method public CharSequence! getTooltipText();
+    method public boolean requiresActionButton();
+    method public boolean requiresOverflow();
+    method public android.view.MenuItem! setAlphabeticShortcut(char, int);
+    method public androidx.core.internal.view.SupportMenuItem! setContentDescription(CharSequence!);
+    method public android.view.MenuItem! setIconTintList(android.content.res.ColorStateList!);
+    method public android.view.MenuItem! setIconTintMode(android.graphics.PorterDuff.Mode!);
+    method public android.view.MenuItem! setNumericShortcut(char, int);
+    method public android.view.MenuItem! setShortcut(char, char, int, int);
+    method public androidx.core.internal.view.SupportMenuItem! setSupportActionProvider(androidx.core.view.ActionProvider!);
+    method public androidx.core.internal.view.SupportMenuItem! setTooltipText(CharSequence!);
+    field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SupportSubMenu extends androidx.core.internal.view.SupportMenu android.view.SubMenu {
+  }
+
+}
+
+package androidx.core.location {
+
+  public final class LocationManagerCompat {
+    method public static boolean isLocationEnabled(android.location.LocationManager);
+  }
+
+}
+
+package androidx.core.math {
+
+  public class MathUtils {
+    method public static float clamp(float, float, float);
+    method public static double clamp(double, double, double);
+    method public static int clamp(int, int, int);
+    method public static long clamp(long, long, long);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class ConnectivityManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method @androidx.core.net.ConnectivityManagerCompat.RestrictBackgroundStatus public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+  }
+
+  @IntDef({androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_DISABLED, androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_WHITELISTED, androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_ENABLED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ConnectivityManagerCompat.RestrictBackgroundStatus {
+  }
+
+  public final class TrafficStatsCompat {
+    method @Deprecated public static void clearThreadStatsTag();
+    method @Deprecated public static int getThreadStatsTag();
+    method @Deprecated public static void incrementOperationCount(int);
+    method @Deprecated public static void incrementOperationCount(int, int);
+    method @Deprecated public static void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+  }
+
+  public final class UriCompat {
+    method public static String toSafeString(android.net.Uri);
+  }
+
+}
+
+package androidx.core.os {
+
+  public class BuildCompat {
+    method @Deprecated public static boolean isAtLeastN();
+    method @Deprecated public static boolean isAtLeastNMR1();
+    method @Deprecated public static boolean isAtLeastO();
+    method @Deprecated public static boolean isAtLeastOMR1();
+    method @Deprecated public static boolean isAtLeastP();
+    method @Deprecated public static boolean isAtLeastQ();
+    method public static boolean isAtLeastR();
+  }
+
+  public final class CancellationSignal {
+    ctor public CancellationSignal();
+    method public void cancel();
+    method public Object? getCancellationSignalObject();
+    method public boolean isCanceled();
+    method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+    method public void throwIfCanceled();
+  }
+
+  public static interface CancellationSignal.OnCancelListener {
+    method public void onCancel();
+  }
+
+  public final class ConfigurationCompat {
+    method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+  }
+
+  public final class EnvironmentCompat {
+    method public static String getStorageState(java.io.File);
+    field public static final String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public final class HandlerCompat {
+    method public static android.os.Handler createAsync(android.os.Looper);
+    method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+    method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+  }
+
+  public final class LocaleListCompat {
+    method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
+    method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+    method public java.util.Locale! get(int);
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+    method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+    method public java.util.Locale? getFirstMatch(String![]);
+    method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale!);
+    method public boolean isEmpty();
+    method @IntRange(from=0) public int size();
+    method public String toLanguageTags();
+    method public Object? unwrap();
+    method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+    method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+  }
+
+  public final class MessageCompat {
+    method public static boolean isAsynchronous(android.os.Message);
+    method public static void setAsynchronous(android.os.Message, boolean);
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(String?);
+  }
+
+  public final class ParcelCompat {
+    method public static boolean readBoolean(android.os.Parcel);
+    method public static void writeBoolean(android.os.Parcel, boolean);
+  }
+
+  @Deprecated public final class ParcelableCompat {
+    method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
+  }
+
+  @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+    method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+    method @Deprecated public T![]! newArray(int);
+  }
+
+  @Deprecated public final class TraceCompat {
+    method @Deprecated public static void beginAsyncSection(String, int);
+    method @Deprecated public static void beginSection(String);
+    method @Deprecated public static void endAsyncSection(String, int);
+    method @Deprecated public static void endSection();
+    method @Deprecated public static boolean isEnabled();
+    method @Deprecated public static void setCounter(String, int);
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package androidx.core.provider {
+
+  public final class FontRequest {
+    ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
+    ctor public FontRequest(String, String, String, @ArrayRes int);
+    method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
+    method @ArrayRes public int getCertificatesArrayResId();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public String! getIdentifier();
+    method public String getProviderAuthority();
+    method public String getProviderPackage();
+    method public String getQuery();
+  }
+
+  public class FontsContractCompat {
+    method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
+    method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface! getFontSync(android.content.Context!, androidx.core.provider.FontRequest!, androidx.core.content.res.ResourcesCompat.FontCallback?, android.os.Handler?, boolean, int, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @VisibleForTesting public static android.content.pm.ProviderInfo? getProvider(android.content.pm.PackageManager, androidx.core.provider.FontRequest, android.content.res.Resources?) throws android.content.pm.PackageManager.NameNotFoundException;
+    method @RequiresApi(19) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static java.util.Map<android.net.Uri!,java.nio.ByteBuffer!>! prepareFontData(android.content.Context!, androidx.core.provider.FontsContractCompat.FontInfo![]!, android.os.CancellationSignal!);
+    method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void resetCache();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String PARCEL_FONT_RESULTS = "font_results";
+  }
+
+  public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+    ctor public FontsContractCompat.Columns();
+    field public static final String FILE_ID = "file_id";
+    field public static final String ITALIC = "font_italic";
+    field public static final String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final String TTC_INDEX = "font_ttc_index";
+    field public static final String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final String WEIGHT = "font_weight";
+  }
+
+  public static class FontsContractCompat.FontFamilyResult {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public FontsContractCompat.FontFamilyResult(int, androidx.core.provider.FontsContractCompat.FontInfo![]?);
+    method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
+    method public int getStatusCode();
+    field public static final int STATUS_OK = 0; // 0x0
+    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+  }
+
+  public static class FontsContractCompat.FontInfo {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public FontsContractCompat.FontInfo(android.net.Uri, @IntRange(from=0) int, @IntRange(from=1, to=1000) int, boolean, int);
+    method public int getResultCode();
+    method @IntRange(from=0) public int getTtcIndex();
+    method public android.net.Uri getUri();
+    method @IntRange(from=1, to=1000) public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static class FontsContractCompat.FontRequestCallback {
+    ctor public FontsContractCompat.FontRequestCallback();
+    method public void onTypefaceRequestFailed(@androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason int);
+    method public void onTypefaceRetrieved(android.graphics.Typeface!);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int RESULT_OK = 0; // 0x0
+  }
+
+  @IntDef({androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_PROVIDER_NOT_FOUND, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_UNAVAILABLE, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_MALFORMED_QUERY, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_WRONG_CERTIFICATES, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_SECURITY_VIOLATION, androidx.core.provider.FontsContractCompat.FontRequestCallback.RESULT_OK}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FontsContractCompat.FontRequestCallback.FontRequestFailReason {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SelfDestructiveThread {
+    ctor public SelfDestructiveThread(String!, int, int);
+    method @VisibleForTesting public int getGeneration();
+    method @VisibleForTesting public boolean isRunning();
+    method public <T> void postAndReply(java.util.concurrent.Callable<T!>!, androidx.core.provider.SelfDestructiveThread.ReplyCallback<T!>!);
+    method public <T> T! postAndWait(java.util.concurrent.Callable<T!>!, int) throws java.lang.InterruptedException;
+  }
+
+  public static interface SelfDestructiveThread.ReplyCallback<T> {
+    method public void onReply(T!);
+  }
+
+}
+
+package androidx.core.telephony.mbms {
+
+  public final class MbmsHelper {
+    method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class BidiFormatter {
+    method public static androidx.core.text.BidiFormatter! getInstance();
+    method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+    method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+    method public boolean getStereoReset();
+    method public boolean isRtl(String!);
+    method public boolean isRtl(CharSequence!);
+    method public boolean isRtlContext();
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public String! unicodeWrap(String!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, boolean);
+    method public String! unicodeWrap(String!);
+    method public CharSequence! unicodeWrap(CharSequence!);
+  }
+
+  public static final class BidiFormatter.Builder {
+    ctor public BidiFormatter.Builder();
+    ctor public BidiFormatter.Builder(boolean);
+    ctor public BidiFormatter.Builder(java.util.Locale!);
+    method public androidx.core.text.BidiFormatter! build();
+    method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+    method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+  }
+
+  public final class HtmlCompat {
+    method public static android.text.Spanned fromHtml(String, int);
+    method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+    method public static String toHtml(android.text.Spanned, int);
+    field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+    field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+    field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+    field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+    field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+  }
+
+  public final class ICUCompat {
+    method public static String? maximizeAndGetScript(java.util.Locale!);
+  }
+
+  public class PrecomputedTextCompat implements android.text.Spannable {
+    method public char charAt(int);
+    method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+    method @IntRange(from=0) public int getParagraphCount();
+    method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+    method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.text.PrecomputedText? getPrecomputedText();
+    method public int getSpanEnd(Object!);
+    method public int getSpanFlags(Object!);
+    method public int getSpanStart(Object!);
+    method public <T> T![]! getSpans(int, int, Class<T!>!);
+    method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+    method public int length();
+    method public int nextSpanTransition(int, int, Class!);
+    method public void removeSpan(Object!);
+    method public void setSpan(Object!, int, int, int);
+    method public CharSequence! subSequence(int, int);
+  }
+
+  public static final class PrecomputedTextCompat.Params {
+    ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean equalsWithoutTextDirection(androidx.core.text.PrecomputedTextCompat.Params);
+    method @RequiresApi(23) public int getBreakStrategy();
+    method @RequiresApi(23) public int getHyphenationFrequency();
+    method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+    method public android.text.TextPaint getTextPaint();
+  }
+
+  public static class PrecomputedTextCompat.Params.Builder {
+    ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+    method public androidx.core.text.PrecomputedTextCompat.Params build();
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+    method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+  }
+
+  public interface TextDirectionHeuristicCompat {
+    method public boolean isRtl(char[]!, int, int);
+    method public boolean isRtl(CharSequence!, int, int);
+  }
+
+  public final class TextDirectionHeuristicsCompat {
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+  }
+
+  public final class TextUtilsCompat {
+    method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+    method public static String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.text.util {
+
+  public final class LinkifyCompat {
+    method public static boolean addLinks(android.text.Spannable, @androidx.core.text.util.LinkifyCompat.LinkifyMask int);
+    method public static boolean addLinks(android.widget.TextView, @androidx.core.text.util.LinkifyCompat.LinkifyMask int);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+  }
+
+  @IntDef(flag=true, value={android.text.util.Linkify.WEB_URLS, android.text.util.Linkify.EMAIL_ADDRESSES, android.text.util.Linkify.PHONE_NUMBERS, android.text.util.Linkify.MAP_ADDRESSES, android.text.util.Linkify.ALL}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface LinkifyCompat.LinkifyMask {
+  }
+
+}
+
+package androidx.core.util {
+
+  public class AtomicFile {
+    ctor public AtomicFile(java.io.File);
+    method public void delete();
+    method public void failWrite(java.io.FileOutputStream?);
+    method public void finishWrite(java.io.FileOutputStream?);
+    method public java.io.File getBaseFile();
+    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+    method public byte[] readFully() throws java.io.IOException;
+    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+  }
+
+  public interface Consumer<T> {
+    method public void accept(T!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DebugUtils {
+    method public static void buildShortClassTag(Object!, StringBuilder!);
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class LogWriter extends java.io.Writer {
+    ctor @Deprecated public LogWriter(String!);
+    method @Deprecated public void close();
+    method @Deprecated public void flush();
+    method @Deprecated public void write(char[]!, int, int);
+  }
+
+  public class ObjectsCompat {
+    method public static boolean equals(Object?, Object?);
+    method public static int hash(java.lang.Object!...);
+    method public static int hashCode(Object?);
+  }
+
+  public class Pair<F, S> {
+    ctor public Pair(F?, S?);
+    method public static <A, B> androidx.core.util.Pair<A!,B!> create(A?, B?);
+    field public final F? first;
+    field public final S? second;
+  }
+
+  public final class PatternsCompat {
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final java.util.regex.Pattern! AUTOLINK_EMAIL_ADDRESS;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final java.util.regex.Pattern! AUTOLINK_WEB_URL;
+    field public static final java.util.regex.Pattern! DOMAIN_NAME;
+    field public static final java.util.regex.Pattern! EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern! IP_ADDRESS;
+    field public static final java.util.regex.Pattern! WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static interface Pools.Pool<T> {
+    method public T? acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+    ctor public Pools.SimplePool(int);
+    method public T! acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class Preconditions {
+    method public static void checkArgument(boolean);
+    method public static void checkArgument(boolean, Object);
+    method public static int checkArgumentInRange(int, int, int, String);
+    method @IntRange(from=0) public static int checkArgumentNonnegative(int, String?);
+    method @IntRange(from=0) public static int checkArgumentNonnegative(int);
+    method public static <T> T checkNotNull(T?);
+    method public static <T> T checkNotNull(T?, Object);
+    method public static void checkState(boolean, String?);
+    method public static void checkState(boolean);
+  }
+
+  public interface Predicate<T> {
+    method public boolean test(T!);
+  }
+
+  public interface Supplier<T> {
+    method public T! get();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class TimeUtils {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, StringBuilder!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, java.io.PrintWriter!, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, java.io.PrintWriter!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, long, java.io.PrintWriter!);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int HUNDRED_DAY_FIELD_LEN = 19; // 0x13
+  }
+
+}
+
+package androidx.core.view {
+
+  public class AccessibilityDelegateCompat {
+    ctor public AccessibilityDelegateCompat();
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public AccessibilityDelegateCompat(android.view.View.AccessibilityDelegate!);
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View!);
+    method public void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public void onInitializeAccessibilityNodeInfo(android.view.View!, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean performAccessibilityAction(android.view.View!, int, android.os.Bundle!);
+    method public void sendAccessibilityEvent(android.view.View!, int);
+    method public void sendAccessibilityEventUnchecked(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public abstract class ActionProvider {
+    ctor public ActionProvider(android.content.Context!);
+    method public android.content.Context! getContext();
+    method public boolean hasSubMenu();
+    method public boolean isVisible();
+    method public abstract android.view.View! onCreateActionView();
+    method public android.view.View! onCreateActionView(android.view.MenuItem!);
+    method public boolean onPerformDefaultAction();
+    method public void onPrepareSubMenu(android.view.SubMenu!);
+    method public boolean overridesItemVisibility();
+    method public void refreshVisibility();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void reset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSubUiVisibilityListener(androidx.core.view.ActionProvider.SubUiVisibilityListener!);
+    method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void subUiVisibilityChanged(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ActionProvider.SubUiVisibilityListener {
+    method public void onSubUiVisibilityChanged(boolean);
+  }
+
+  public static interface ActionProvider.VisibilityListener {
+    method public void onActionProviderVisibilityChanged(boolean);
+  }
+
+  public final class DisplayCompat {
+    method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
+  }
+
+  public static final class DisplayCompat.ModeCompat {
+    method public int getPhysicalHeight();
+    method public int getPhysicalWidth();
+    method public boolean isNative();
+    method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
+  }
+
+  public final class DisplayCutoutCompat {
+    ctor public DisplayCutoutCompat(android.graphics.Rect!, java.util.List<android.graphics.Rect!>!);
+    method public java.util.List<android.graphics.Rect!>! getBoundingRects();
+    method public int getSafeInsetBottom();
+    method public int getSafeInsetLeft();
+    method public int getSafeInsetRight();
+    method public int getSafeInsetTop();
+  }
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.view.DragAndDropPermissionsCompat? request(android.app.Activity!, android.view.DragEvent!);
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View!, androidx.core.view.DragStartHelper.OnDragStartListener!);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point!);
+    method public boolean onLongClick(android.view.View!);
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+  }
+
+  public static interface DragStartHelper.OnDragStartListener {
+    method public boolean onDragStart(android.view.View!, androidx.core.view.DragStartHelper!);
+  }
+
+  public final class GestureDetectorCompat {
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!);
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!, android.os.Handler!);
+    method public boolean isLongpressEnabled();
+    method public boolean onTouchEvent(android.view.MotionEvent!);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener!);
+  }
+
+  public final class GravityCompat {
+    method public static void apply(int, int, int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static void apply(int, int, int, android.graphics.Rect!, int, int, android.graphics.Rect!, int);
+    method public static void applyDisplay(int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static int getAbsoluteGravity(int, int);
+    field public static final int END = 8388613; // 0x800005
+    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+    field public static final int START = 8388611; // 0x800003
+  }
+
+  public final class InputDeviceCompat {
+    field public static final int SOURCE_ANY = -256; // 0xffffff00
+    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+    field public static final int SOURCE_DPAD = 513; // 0x201
+    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+    field public static final int SOURCE_KEYBOARD = 257; // 0x101
+    field public static final int SOURCE_MOUSE = 8194; // 0x2002
+    field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+    field public static final int SOURCE_STYLUS = 16386; // 0x4002
+    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class KeyEventDispatcher {
+    method public static boolean dispatchBeforeHierarchy(android.view.View, android.view.KeyEvent);
+    method public static boolean dispatchKeyEvent(androidx.core.view.KeyEventDispatcher.Component, android.view.View?, android.view.Window.Callback?, android.view.KeyEvent);
+  }
+
+  public static interface KeyEventDispatcher.Component {
+    method public boolean superDispatchKeyEvent(android.view.KeyEvent!);
+  }
+
+  public final class LayoutInflaterCompat {
+    method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+    method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+  }
+
+  @Deprecated public interface LayoutInflaterFactory {
+    method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+  }
+
+  public final class MarginLayoutParamsCompat {
+    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams!);
+    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams!);
+    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams!, int);
+  }
+
+  public final class MenuCompat {
+    method public static void setGroupDividerEnabled(android.view.Menu!, boolean);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+  }
+
+  public final class MenuItemCompat {
+    method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+    method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+    method public static androidx.core.view.ActionProvider! getActionProvider(android.view.MenuItem!);
+    method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+    method public static int getAlphabeticModifiers(android.view.MenuItem!);
+    method public static CharSequence! getContentDescription(android.view.MenuItem!);
+    method public static android.content.res.ColorStateList! getIconTintList(android.view.MenuItem!);
+    method public static android.graphics.PorterDuff.Mode! getIconTintMode(android.view.MenuItem!);
+    method public static int getNumericModifiers(android.view.MenuItem!);
+    method public static CharSequence! getTooltipText(android.view.MenuItem!);
+    method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+    method public static android.view.MenuItem! setActionProvider(android.view.MenuItem!, androidx.core.view.ActionProvider!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+    method public static void setAlphabeticShortcut(android.view.MenuItem!, char, int);
+    method public static void setContentDescription(android.view.MenuItem!, CharSequence!);
+    method public static void setIconTintList(android.view.MenuItem!, android.content.res.ColorStateList!);
+    method public static void setIconTintMode(android.view.MenuItem!, android.graphics.PorterDuff.Mode!);
+    method public static void setNumericShortcut(android.view.MenuItem!, char, int);
+    method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+    method public static void setShortcut(android.view.MenuItem!, char, char, int, int);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+    method public static void setTooltipText(android.view.MenuItem!, CharSequence!);
+    field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+    method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+    method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+  }
+
+  public final class MotionEventCompat {
+    method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+    method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+    method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+    method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+    method @Deprecated public static int getSource(android.view.MotionEvent!);
+    method @Deprecated public static float getX(android.view.MotionEvent!, int);
+    method @Deprecated public static float getY(android.view.MotionEvent!, int);
+    method public static boolean isFromSource(android.view.MotionEvent!, int);
+    field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+    field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+    field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+    field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+    field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+    field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+    field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+    field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+    field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+    field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+    field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+    field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+    field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+    field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+    field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+    field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+    field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+    field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+    field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+    field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+    field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+    field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+    field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+    field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+    field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+    field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+    field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+    field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+    field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+    field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+    field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+    field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+    field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+    field @Deprecated public static final int AXIS_RX = 12; // 0xc
+    field @Deprecated public static final int AXIS_RY = 13; // 0xd
+    field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SCROLL = 26; // 0x1a
+    field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+    field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+    field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+    field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+    field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+    field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+    field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+    field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+    field @Deprecated public static final int AXIS_X = 0; // 0x0
+    field @Deprecated public static final int AXIS_Y = 1; // 0x1
+    field @Deprecated public static final int AXIS_Z = 11; // 0xb
+    field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  public interface NestedScrollingChild {
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean isNestedScrollingEnabled();
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int);
+    method public void stopNestedScroll();
+  }
+
+  public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean hasNestedScrollingParent(@androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void stopNestedScroll(@androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int, int[]);
+  }
+
+  public class NestedScrollingChildHelper {
+    ctor public NestedScrollingChildHelper(android.view.View);
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean hasNestedScrollingParent(@androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean isNestedScrollingEnabled();
+    method public void onDetachedFromWindow();
+    method public void onStopNestedScroll(android.view.View);
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void stopNestedScroll();
+    method public void stopNestedScroll(@androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface NestedScrollingParent {
+    method @androidx.core.view.ViewCompat.ScrollAxis public int getNestedScrollAxes();
+    method public boolean onNestedFling(android.view.View, float, float, boolean);
+    method public boolean onNestedPreFling(android.view.View, float, float);
+    method public void onNestedPreScroll(android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public void onStopNestedScroll(android.view.View);
+  }
+
+  public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+    method public void onNestedPreScroll(android.view.View, int, int, int[], @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onStopNestedScroll(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+    method public void onNestedScroll(android.view.View, int, int, int, int, @androidx.core.view.ViewCompat.NestedScrollType int, int[]);
+  }
+
+  public class NestedScrollingParentHelper {
+    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+    method @androidx.core.view.ViewCompat.ScrollAxis public int getNestedScrollAxes();
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onStopNestedScroll(android.view.View);
+    method public void onStopNestedScroll(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface OnApplyWindowInsetsListener {
+    method public androidx.core.view.WindowInsetsCompat! onApplyWindowInsets(android.view.View!, androidx.core.view.WindowInsetsCompat!);
+  }
+
+  public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+    method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+    method public boolean onPreDraw();
+    method public void onViewAttachedToWindow(android.view.View!);
+    method public void onViewDetachedFromWindow(android.view.View!);
+    method public void removeListener();
+  }
+
+  public final class PointerIconCompat {
+    method public static androidx.core.view.PointerIconCompat! create(android.graphics.Bitmap!, float, float);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public Object! getPointerIcon();
+    method public static androidx.core.view.PointerIconCompat! getSystemIcon(android.content.Context!, int);
+    method public static androidx.core.view.PointerIconCompat! load(android.content.res.Resources!, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector!);
+    method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector!, boolean);
+  }
+
+  public interface ScrollingView {
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+  }
+
+  public interface TintableBackgroundView {
+    method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @Deprecated public final class VelocityTrackerCompat {
+    method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+    method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+  }
+
+  public class ViewCompat {
+    ctor protected ViewCompat();
+    method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
+    method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+    method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+    method public static void cancelDragAndDrop(android.view.View);
+    method @Deprecated public static int combineMeasuredStates(int, int);
+    method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
+    method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method public static void dispatchFinishTemporaryDetach(android.view.View);
+    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+    method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int, int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static void dispatchStartTemporaryDetach(android.view.View);
+    method public static void enableAccessibleClickableSpanSupport(android.view.View!);
+    method public static int generateViewId();
+    method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+    method public static int getAccessibilityLiveRegion(android.view.View);
+    method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View);
+    method @UiThread public static CharSequence! getAccessibilityPaneTitle(android.view.View!);
+    method @Deprecated public static float getAlpha(android.view.View!);
+    method public static android.content.res.ColorStateList! getBackgroundTintList(android.view.View);
+    method public static android.graphics.PorterDuff.Mode! getBackgroundTintMode(android.view.View);
+    method public static android.graphics.Rect? getClipBounds(android.view.View);
+    method public static android.view.Display? getDisplay(android.view.View);
+    method public static float getElevation(android.view.View);
+    method public static boolean getFitsSystemWindows(android.view.View);
+    method public static int getImportantForAccessibility(android.view.View);
+    method public static int getImportantForAutofill(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method @Deprecated public static int getLayerType(android.view.View!);
+    method public static int getLayoutDirection(android.view.View);
+    method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+    method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+    method @Deprecated public static int getMeasuredState(android.view.View!);
+    method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+    method public static int getMinimumHeight(android.view.View);
+    method public static int getMinimumWidth(android.view.View);
+    method public static int getNextClusterForwardId(android.view.View);
+    method @Deprecated public static int getOverScrollMode(android.view.View!);
+    method @Px public static int getPaddingEnd(android.view.View);
+    method @Px public static int getPaddingStart(android.view.View);
+    method public static android.view.ViewParent! getParentForAccessibility(android.view.View);
+    method @Deprecated public static float getPivotX(android.view.View!);
+    method @Deprecated public static float getPivotY(android.view.View!);
+    method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
+    method @Deprecated public static float getRotation(android.view.View!);
+    method @Deprecated public static float getRotationX(android.view.View!);
+    method @Deprecated public static float getRotationY(android.view.View!);
+    method @Deprecated public static float getScaleX(android.view.View!);
+    method @Deprecated public static float getScaleY(android.view.View!);
+    method public static int getScrollIndicators(android.view.View);
+    method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
+    method public static String? getTransitionName(android.view.View);
+    method @Deprecated public static float getTranslationX(android.view.View!);
+    method @Deprecated public static float getTranslationY(android.view.View!);
+    method public static float getTranslationZ(android.view.View);
+    method public static int getWindowSystemUiVisibility(android.view.View);
+    method @Deprecated public static float getX(android.view.View!);
+    method @Deprecated public static float getY(android.view.View!);
+    method public static float getZ(android.view.View);
+    method public static boolean hasAccessibilityDelegate(android.view.View);
+    method public static boolean hasExplicitFocusable(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static boolean hasOnClickListeners(android.view.View);
+    method public static boolean hasOverlappingRendering(android.view.View);
+    method public static boolean hasTransientState(android.view.View);
+    method @UiThread public static boolean isAccessibilityHeading(android.view.View!);
+    method public static boolean isAttachedToWindow(android.view.View);
+    method public static boolean isFocusedByDefault(android.view.View);
+    method public static boolean isImportantForAccessibility(android.view.View);
+    method public static boolean isImportantForAutofill(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method @Deprecated public static boolean isOpaque(android.view.View!);
+    method public static boolean isPaddingRelative(android.view.View);
+    method @UiThread public static boolean isScreenReaderFocusable(android.view.View!);
+    method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+    method public static android.view.View! keyboardNavigationClusterSearch(android.view.View, android.view.View!, @androidx.core.view.ViewCompat.FocusDirection int);
+    method public static void offsetLeftAndRight(android.view.View, int);
+    method public static void offsetTopAndBottom(android.view.View, int);
+    method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle!);
+    method public static void postInvalidateOnAnimation(android.view.View);
+    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+    method public static void postOnAnimation(android.view.View, Runnable!);
+    method public static void postOnAnimationDelayed(android.view.View, Runnable!, long);
+    method public static void removeAccessibilityAction(android.view.View, int);
+    method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+    method public static void requestApplyInsets(android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+    method @Deprecated public static int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
+    method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
+    method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat!);
+    method @UiThread public static void setAccessibilityHeading(android.view.View!, boolean);
+    method public static void setAccessibilityLiveRegion(android.view.View, int);
+    method @UiThread public static void setAccessibilityPaneTitle(android.view.View!, CharSequence!);
+    method @Deprecated public static void setActivated(android.view.View!, boolean);
+    method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+    method public static void setAutofillHints(android.view.View, java.lang.String!...);
+    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList!);
+    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode!);
+    method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+    method public static void setClipBounds(android.view.View, android.graphics.Rect!);
+    method public static void setElevation(android.view.View, float);
+    method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+    method public static void setFocusedByDefault(android.view.View, boolean);
+    method public static void setHasTransientState(android.view.View, boolean);
+    method public static void setImportantForAccessibility(android.view.View, int);
+    method public static void setImportantForAutofill(android.view.View, int);
+    method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+    method public static void setLabelFor(android.view.View, @IdRes int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint!);
+    method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+    method public static void setLayoutDirection(android.view.View, int);
+    method public static void setNestedScrollingEnabled(android.view.View, boolean);
+    method public static void setNextClusterForwardId(android.view.View, int);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
+    method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+    method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+    method @Deprecated public static void setPivotX(android.view.View!, float);
+    method @Deprecated public static void setPivotY(android.view.View!, float);
+    method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat!);
+    method @Deprecated public static void setRotation(android.view.View!, float);
+    method @Deprecated public static void setRotationX(android.view.View!, float);
+    method @Deprecated public static void setRotationY(android.view.View!, float);
+    method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+    method @Deprecated public static void setScaleX(android.view.View!, float);
+    method @Deprecated public static void setScaleY(android.view.View!, float);
+    method @UiThread public static void setScreenReaderFocusable(android.view.View!, boolean);
+    method public static void setScrollIndicators(android.view.View, @androidx.core.view.ViewCompat.ScrollIndicators int);
+    method public static void setScrollIndicators(android.view.View, @androidx.core.view.ViewCompat.ScrollIndicators int, @androidx.core.view.ViewCompat.ScrollIndicators int);
+    method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
+    method public static void setTooltipText(android.view.View, CharSequence?);
+    method public static void setTransitionName(android.view.View, String!);
+    method @Deprecated public static void setTranslationX(android.view.View!, float);
+    method @Deprecated public static void setTranslationY(android.view.View!, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method @Deprecated public static void setX(android.view.View!, float);
+    method @Deprecated public static void setY(android.view.View!, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData!, android.view.View.DragShadowBuilder!, Object!, int);
+    method public static boolean startNestedScroll(android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public static boolean startNestedScroll(android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static void stopNestedScroll(android.view.View);
+    method public static void stopNestedScroll(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder!);
+    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+    field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+    field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+    field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+    field public static final int TYPE_NON_TOUCH = 1; // 0x1
+    field public static final int TYPE_TOUCH = 0; // 0x0
+  }
+
+  @IntDef({android.view.View.FOCUS_LEFT, android.view.View.FOCUS_UP, android.view.View.FOCUS_RIGHT, android.view.View.FOCUS_DOWN, android.view.View.FOCUS_FORWARD, android.view.View.FOCUS_BACKWARD}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.FocusDirection {
+  }
+
+  @IntDef({android.view.View.FOCUS_LEFT, android.view.View.FOCUS_UP, android.view.View.FOCUS_RIGHT, android.view.View.FOCUS_DOWN}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.FocusRealDirection {
+  }
+
+  @IntDef({android.view.View.FOCUS_FORWARD, android.view.View.FOCUS_BACKWARD}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.FocusRelativeDirection {
+  }
+
+  @IntDef({androidx.core.view.ViewCompat.TYPE_TOUCH, androidx.core.view.ViewCompat.TYPE_NON_TOUCH}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.NestedScrollType {
+  }
+
+  public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+    method public boolean onUnhandledKeyEvent(android.view.View!, android.view.KeyEvent!);
+  }
+
+  @IntDef(value={androidx.core.view.ViewCompat.SCROLL_AXIS_NONE, androidx.core.view.ViewCompat.SCROLL_AXIS_HORIZONTAL, androidx.core.view.ViewCompat.SCROLL_AXIS_VERTICAL}, flag=true) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.ScrollAxis {
+  }
+
+  @IntDef(flag=true, value={androidx.core.view.ViewCompat.SCROLL_INDICATOR_TOP, androidx.core.view.ViewCompat.SCROLL_INDICATOR_BOTTOM, androidx.core.view.ViewCompat.SCROLL_INDICATOR_LEFT, androidx.core.view.ViewCompat.SCROLL_INDICATOR_RIGHT, androidx.core.view.ViewCompat.SCROLL_INDICATOR_START, androidx.core.view.ViewCompat.SCROLL_INDICATOR_END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.ScrollIndicators {
+  }
+
+  public final class ViewConfigurationCompat {
+    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static int getScaledHoverSlop(android.view.ViewConfiguration!);
+    method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+    method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration!, android.content.Context);
+  }
+
+  public final class ViewGroupCompat {
+    method public static int getLayoutMode(android.view.ViewGroup);
+    method @androidx.core.view.ViewCompat.ScrollAxis public static int getNestedScrollAxes(android.view.ViewGroup);
+    method public static boolean isTransitionGroup(android.view.ViewGroup);
+    method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+  }
+
+  public final class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onNestedFling(android.view.ViewParent!, android.view.View!, float, float, boolean);
+    method public static boolean onNestedPreFling(android.view.ViewParent!, android.view.View!, float, float);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int, int[]);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!, int);
+    method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public final class ViewPropertyAnimatorCompat {
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alpha(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public android.view.animation.Interpolator! getInterpolator();
+    method public long getStartDelay();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotation(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setDuration(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setInterpolator(android.view.animation.Interpolator!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setStartDelay(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener!);
+    method public void start();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZ(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withEndAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withLayer();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withStartAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! x(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! xBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! y(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! yBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! z(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! zBy(float);
+  }
+
+  public interface ViewPropertyAnimatorListener {
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+    ctor public ViewPropertyAnimatorListenerAdapter();
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public interface ViewPropertyAnimatorUpdateListener {
+    method public void onAnimationUpdate(android.view.View!);
+  }
+
+  public final class WindowCompat {
+    method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
+    method public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
+    method public androidx.core.view.WindowInsetsCompat consumeStableInsets();
+    method public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
+    method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+    method public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
+    method public int getStableInsetBottom();
+    method public int getStableInsetLeft();
+    method public int getStableInsetRight();
+    method public int getStableInsetTop();
+    method public androidx.core.graphics.Insets getStableInsets();
+    method public androidx.core.graphics.Insets getSystemGestureInsets();
+    method public int getSystemWindowInsetBottom();
+    method public int getSystemWindowInsetLeft();
+    method public int getSystemWindowInsetRight();
+    method public int getSystemWindowInsetTop();
+    method public androidx.core.graphics.Insets getSystemWindowInsets();
+    method public androidx.core.graphics.Insets getTappableElementInsets();
+    method public boolean hasInsets();
+    method public boolean hasStableInsets();
+    method public boolean hasSystemWindowInsets();
+    method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method public boolean isConsumed();
+    method public boolean isRound();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+    method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final androidx.core.view.WindowInsetsCompat! CONSUMED;
+  }
+
+  public static final class WindowInsetsCompat.Builder {
+    ctor public WindowInsetsCompat.Builder();
+    ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
+    method public androidx.core.view.WindowInsetsCompat build();
+    method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
+    method public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
+  }
+
+}
+
+package androidx.core.view.accessibility {
+
+  public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public AccessibilityClickableSpanCompat(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!, int);
+    method public void onClick(android.view.View);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String SPAN_ID = "ACCESSIBILITY_CLICKABLE_SPAN_ID";
+  }
+
+  public final class AccessibilityEventCompat {
+    method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+    method public static int getAction(android.view.accessibility.AccessibilityEvent!);
+    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent!);
+    method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+    method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+    method public static void setAction(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent!, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+    field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+    field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+    field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+    field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+    field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+    field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+    field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  public final class AccessibilityManagerCompat {
+    method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+  }
+
+  @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method @Deprecated public void onAccessibilityStateChanged(boolean);
+  }
+
+  @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
+  public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+    method public void onTouchExplorationStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+    method public void addAction(int);
+    method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public void addChild(android.view.View!);
+    method public void addChild(android.view.View!, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addSpansToExtras(CharSequence!, android.view.View!);
+    method public boolean canOpenPopup();
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
+    method public int getActions();
+    method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public CharSequence! getClassName();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.text.style.ClickableSpan![]! getClickableSpans(CharSequence!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+    method public CharSequence! getContentDescription();
+    method public int getDrawingOrder();
+    method public CharSequence! getError();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence? getHintText();
+    method @Deprecated public Object! getInfo();
+    method public int getInputType();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+    method public int getLiveRegion();
+    method public int getMaxTextLength();
+    method public int getMovementGranularities();
+    method public CharSequence! getPackageName();
+    method public CharSequence? getPaneTitle();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+    method public CharSequence? getRoleDescription();
+    method public CharSequence! getText();
+    method public int getTextSelectionEnd();
+    method public int getTextSelectionStart();
+    method public CharSequence? getTooltipText();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+    method public String! getViewIdResourceName();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+    method public int getWindowId();
+    method public boolean isAccessibilityFocused();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isClickable();
+    method public boolean isContentInvalid();
+    method public boolean isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isHeading();
+    method public boolean isImportantForAccessibility();
+    method public boolean isLongClickable();
+    method public boolean isMultiLine();
+    method public boolean isPassword();
+    method public boolean isScreenReaderFocusable();
+    method public boolean isScrollable();
+    method public boolean isSelected();
+    method public boolean isShowingHintText();
+    method public boolean isTextEntryKey();
+    method public boolean isVisibleToUser();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public boolean performAction(int);
+    method public boolean performAction(int, android.os.Bundle!);
+    method public void recycle();
+    method public boolean refresh();
+    method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public boolean removeChild(android.view.View!);
+    method public boolean removeChild(android.view.View!, int);
+    method public void setAccessibilityFocused(boolean);
+    method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
+    method public void setBoundsInScreen(android.graphics.Rect!);
+    method public void setCanOpenPopup(boolean);
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setClassName(CharSequence!);
+    method public void setClickable(boolean);
+    method public void setCollectionInfo(Object!);
+    method public void setCollectionItemInfo(Object!);
+    method public void setContentDescription(CharSequence!);
+    method public void setContentInvalid(boolean);
+    method public void setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    method public void setEditable(boolean);
+    method public void setEnabled(boolean);
+    method public void setError(CharSequence!);
+    method public void setFocusable(boolean);
+    method public void setFocused(boolean);
+    method public void setHeading(boolean);
+    method public void setHintText(CharSequence?);
+    method public void setImportantForAccessibility(boolean);
+    method public void setInputType(int);
+    method public void setLabelFor(android.view.View!);
+    method public void setLabelFor(android.view.View!, int);
+    method public void setLabeledBy(android.view.View!);
+    method public void setLabeledBy(android.view.View!, int);
+    method public void setLiveRegion(int);
+    method public void setLongClickable(boolean);
+    method public void setMaxTextLength(int);
+    method public void setMovementGranularities(int);
+    method public void setMultiLine(boolean);
+    method public void setPackageName(CharSequence!);
+    method public void setPaneTitle(CharSequence?);
+    method public void setParent(android.view.View!);
+    method public void setParent(android.view.View!, int);
+    method public void setPassword(boolean);
+    method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+    method public void setRoleDescription(CharSequence?);
+    method public void setScreenReaderFocusable(boolean);
+    method public void setScrollable(boolean);
+    method public void setSelected(boolean);
+    method public void setShowingHintText(boolean);
+    method public void setSource(android.view.View!);
+    method public void setSource(android.view.View!, int);
+    method public void setText(CharSequence!);
+    method public void setTextEntryKey(boolean);
+    method public void setTextSelection(int, int);
+    method public void setTooltipText(CharSequence?);
+    method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
+    method public void setTraversalAfter(android.view.View!);
+    method public void setTraversalAfter(android.view.View!, int);
+    method public void setTraversalBefore(android.view.View!);
+    method public void setTraversalBefore(android.view.View!, int);
+    method public void setViewIdResourceName(String!);
+    method public void setVisibleToUser(boolean);
+    method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+    field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+    field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+    field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+    field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+    field public static final int ACTION_CLICK = 16; // 0x10
+    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+    field public static final int ACTION_COPY = 16384; // 0x4000
+    field public static final int ACTION_CUT = 65536; // 0x10000
+    field public static final int ACTION_DISMISS = 1048576; // 0x100000
+    field public static final int ACTION_EXPAND = 262144; // 0x40000
+    field public static final int ACTION_FOCUS = 1; // 0x1
+    field public static final int ACTION_LONG_CLICK = 32; // 0x20
+    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+    field public static final int ACTION_PASTE = 32768; // 0x8000
+    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+    field public static final int ACTION_SELECT = 4; // 0x4
+    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+    field public static final int FOCUS_INPUT = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int mParentVirtualDescendantId;
+  }
+
+  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!, androidx.core.view.accessibility.AccessibilityViewCommand!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! createReplacementAction(CharSequence!, androidx.core.view.accessibility.AccessibilityViewCommand!);
+    method public int getId();
+    method public CharSequence! getLabel();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean perform(android.view.View!, android.os.Bundle!);
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected final androidx.core.view.accessibility.AccessibilityViewCommand! mCommand;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+    field public static final int SELECTION_MODE_NONE = 0; // 0x0
+    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    method @Deprecated public boolean isHeading();
+    method public boolean isSelected();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+    field public static final int RANGE_TYPE_INT = 0; // 0x0
+    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+  }
+
+  public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
+    ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
+    method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getRegionCount();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
+  }
+
+  public class AccessibilityNodeProviderCompat {
+    ctor public AccessibilityNodeProviderCompat();
+    ctor public AccessibilityNodeProviderCompat(Object!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String!, int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+    method public Object! getProvider();
+    method public boolean performAction(int, int, android.os.Bundle!);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor @Deprecated public AccessibilityRecordCompat(Object!);
+    method @Deprecated public boolean equals(Object?);
+    method @Deprecated public int getAddedCount();
+    method @Deprecated public CharSequence! getBeforeText();
+    method @Deprecated public CharSequence! getClassName();
+    method @Deprecated public CharSequence! getContentDescription();
+    method @Deprecated public int getCurrentItemIndex();
+    method @Deprecated public int getFromIndex();
+    method @Deprecated public Object! getImpl();
+    method @Deprecated public int getItemCount();
+    method @Deprecated public int getMaxScrollX();
+    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public int getMaxScrollY();
+    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public android.os.Parcelable! getParcelableData();
+    method @Deprecated public int getRemovedCount();
+    method @Deprecated public int getScrollX();
+    method @Deprecated public int getScrollY();
+    method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+    method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
+    method @Deprecated public int getToIndex();
+    method @Deprecated public int getWindowId();
+    method @Deprecated public int hashCode();
+    method @Deprecated public boolean isChecked();
+    method @Deprecated public boolean isEnabled();
+    method @Deprecated public boolean isFullScreen();
+    method @Deprecated public boolean isPassword();
+    method @Deprecated public boolean isScrollable();
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+    method @Deprecated public void recycle();
+    method @Deprecated public void setAddedCount(int);
+    method @Deprecated public void setBeforeText(CharSequence!);
+    method @Deprecated public void setChecked(boolean);
+    method @Deprecated public void setClassName(CharSequence!);
+    method @Deprecated public void setContentDescription(CharSequence!);
+    method @Deprecated public void setCurrentItemIndex(int);
+    method @Deprecated public void setEnabled(boolean);
+    method @Deprecated public void setFromIndex(int);
+    method @Deprecated public void setFullScreen(boolean);
+    method @Deprecated public void setItemCount(int);
+    method @Deprecated public void setMaxScrollX(int);
+    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setMaxScrollY(int);
+    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setParcelableData(android.os.Parcelable!);
+    method @Deprecated public void setPassword(boolean);
+    method @Deprecated public void setRemovedCount(int);
+    method @Deprecated public void setScrollX(int);
+    method @Deprecated public void setScrollY(int);
+    method @Deprecated public void setScrollable(boolean);
+    method @Deprecated public void setSource(android.view.View!);
+    method @Deprecated public void setSource(android.view.View!, int);
+    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View!, int);
+    method @Deprecated public void setToIndex(int);
+  }
+
+  public interface AccessibilityViewCommand {
+    method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+  }
+
+  public abstract static class AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.CommandArguments();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setBundle(android.os.Bundle!);
+  }
+
+  public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+    method public boolean getExtendSelection();
+    method public int getGranularity();
+  }
+
+  public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveHtmlArguments();
+    method public String! getHTMLElement();
+  }
+
+  public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveWindowArguments();
+    method public int getX();
+    method public int getY();
+  }
+
+  public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+    method public int getColumn();
+    method public int getRow();
+  }
+
+  public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetProgressArguments();
+    method public float getProgress();
+  }
+
+  public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetSelectionArguments();
+    method public int getEnd();
+    method public int getStart();
+  }
+
+  public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetTextArguments();
+    method public CharSequence! getText();
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getAnchor();
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public int getId();
+    method public int getLayer();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getRoot();
+    method public CharSequence! getTitle();
+    method public int getType();
+    method public boolean isAccessibilityFocused();
+    method public boolean isActive();
+    method public boolean isFocused();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat!);
+    method public void recycle();
+    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+    field public static final int TYPE_APPLICATION = 1; // 0x1
+    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+    field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package androidx.core.view.animation {
+
+  public final class PathInterpolatorCompat {
+    method public static android.view.animation.Interpolator! create(android.graphics.Path!);
+    method public static android.view.animation.Interpolator! create(float, float);
+    method public static android.view.animation.Interpolator! create(float, float, float, float);
+  }
+
+}
+
+package androidx.core.view.inputmethod {
+
+  public final class EditorInfoCompat {
+    ctor @Deprecated public EditorInfoCompat();
+    method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo!);
+    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
+    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+  }
+
+  public final class InputConnectionCompat {
+    ctor @Deprecated public InputConnectionCompat();
+    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+    method public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+    field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+  }
+
+  public static interface InputConnectionCompat.OnCommitContentListener {
+    method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat!, int, android.os.Bundle!);
+  }
+
+  public final class InputContentInfoCompat {
+    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+    method public android.net.Uri getContentUri();
+    method public android.content.ClipDescription getDescription();
+    method public android.net.Uri? getLinkUri();
+    method public void releasePermission();
+    method public void requestPermission();
+    method public Object? unwrap();
+    method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+    ctor public AutoScrollHelper(android.view.View);
+    method public abstract boolean canTargetScrollHorizontally(int);
+    method public abstract boolean canTargetScrollVertically(int);
+    method public boolean isEnabled();
+    method public boolean isExclusive();
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+    method public abstract void scrollTargetBy(int, int);
+    method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+    method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+    method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+    method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+    method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+    field public static final float NO_MAX = 3.4028235E38f;
+    field public static final float NO_MIN = 0.0f;
+    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface AutoSizeableTextView {
+    method public int getAutoSizeMaxTextSize();
+    method public int getAutoSizeMinTextSize();
+    method public int getAutoSizeStepGranularity();
+    method public int[]! getAutoSizeTextAvailableSizes();
+    method @androidx.core.widget.TextViewCompat.AutoSizeTextType public int getAutoSizeTextType();
+    method public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setAutoSizeTextTypeWithDefaults(@androidx.core.widget.TextViewCompat.AutoSizeTextType int);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final boolean PLATFORM_SUPPORTS_AUTOSIZE;
+  }
+
+  public final class CompoundButtonCompat {
+    method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+    method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+    method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+  }
+
+  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+    ctor public ContentLoadingProgressBar(android.content.Context);
+    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+    method public void hide();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void show();
+  }
+
+  public final class EdgeEffectCompat {
+    ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+    method @Deprecated public boolean draw(android.graphics.Canvas!);
+    method @Deprecated public void finish();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean onAbsorb(int);
+    method @Deprecated public boolean onPull(float);
+    method @Deprecated public boolean onPull(float, float);
+    method public static void onPull(android.widget.EdgeEffect, float, float);
+    method @Deprecated public boolean onRelease();
+    method @Deprecated public void setSize(int, int);
+  }
+
+  public class ImageViewCompat {
+    method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+    method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class ListPopupWindowCompat {
+    method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+    method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+  }
+
+  public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+    ctor public ListViewAutoScrollHelper(android.widget.ListView);
+    method public boolean canTargetScrollHorizontally(int);
+    method public boolean canTargetScrollVertically(int);
+    method public void scrollTargetBy(int, int);
+  }
+
+  public final class ListViewCompat {
+    method public static boolean canScrollList(android.widget.ListView, int);
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
+    method public boolean arrowScroll(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isFillViewport();
+    method public boolean isSmoothScrollingEnabled();
+    method public void onAttachedToWindow();
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+    method public boolean pageScroll(int);
+    method public void setFillViewport(boolean);
+    method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
+    method public void setSmoothScrollingEnabled(boolean);
+    method public final void smoothScrollBy(int, int);
+    method public final void smoothScrollBy(int, int, int);
+    method public final void smoothScrollTo(int, int);
+    method public final void smoothScrollTo(int, int, int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public static interface NestedScrollView.OnScrollChangeListener {
+    method public void onScrollChange(androidx.core.widget.NestedScrollView!, int, int, int, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+  }
+
+  public final class PopupWindowCompat {
+    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+    method public static int getWindowLayoutType(android.widget.PopupWindow);
+    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  @Deprecated public final class ScrollerCompat {
+    method @Deprecated public void abortAnimation();
+    method @Deprecated public boolean computeScrollOffset();
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+    method @Deprecated public float getCurrVelocity();
+    method @Deprecated public int getCurrX();
+    method @Deprecated public int getCurrY();
+    method @Deprecated public int getFinalX();
+    method @Deprecated public int getFinalY();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean isOverScrolled();
+    method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+    method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+    method @Deprecated public boolean springBack(int, int, int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int, int);
+  }
+
+  public final class TextViewCompat {
+    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+    method public static int getAutoSizeMinTextSize(android.widget.TextView);
+    method public static int getAutoSizeStepGranularity(android.widget.TextView);
+    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+    method public static int getAutoSizeTextType(android.widget.TextView);
+    method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+    method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+    method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
+    method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+    method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+    method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+    method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+    method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+    method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+    method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+    method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.view.ActionMode.Callback wrapCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+  }
+
+  @IntDef({androidx.core.widget.TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE, androidx.core.widget.TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface TextViewCompat.AutoSizeTextType {
+  }
+
+  public interface TintableCompoundButton {
+    method public android.content.res.ColorStateList? getSupportButtonTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundDrawablesView {
+    method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TintableImageSourceView {
+    method public android.content.res.ColorStateList? getSupportImageTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+    method public void setSupportImageTintList(android.content.res.ColorStateList?);
+    method public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+}
+
diff --git a/core/core/api/restricted_current.txt b/core/core/api/restricted_current.txt
index 935828e..61ac7fa 100644
--- a/core/core/api/restricted_current.txt
+++ b/core/core/api/restricted_current.txt
@@ -1678,13 +1678,13 @@
     method @Deprecated public T![]! newArray(int);
   }
 
-  public final class TraceCompat {
-    method public static void beginAsyncSection(String, int);
-    method public static void beginSection(String);
-    method public static void endAsyncSection(String, int);
-    method public static void endSection();
-    method public static boolean isEnabled();
-    method public static void setCounter(String, int);
+  @Deprecated public final class TraceCompat {
+    method @Deprecated public static void beginAsyncSection(String, int);
+    method @Deprecated public static void beginSection(String);
+    method @Deprecated public static void endAsyncSection(String, int);
+    method @Deprecated public static void endSection();
+    method @Deprecated public static boolean isEnabled();
+    method @Deprecated public static void setCounter(String, int);
   }
 
   public class UserManagerCompat {
diff --git a/core/core/src/androidTest/java/androidx/core/view/WindowInsetsCompatTest.java b/core/core/src/androidTest/java/androidx/core/view/WindowInsetsCompatTest.java
index 023ddac..05aad94 100644
--- a/core/core/src/androidTest/java/androidx/core/view/WindowInsetsCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/view/WindowInsetsCompatTest.java
@@ -150,4 +150,34 @@
         assertNotNull(WindowInsetsCompat.CONSUMED.toWindowInsets());
         assertTrue(WindowInsetsCompat.CONSUMED.isConsumed());
     }
+
+    @Test
+    public void test_equals() {
+        WindowInsetsCompat result = new WindowInsetsCompat.Builder()
+                .setSystemWindowInsets(Insets.of(1, 2, 3, 4))
+                .setStableInsets(Insets.of(11, 12, 13, 14))
+                .build();
+
+        WindowInsetsCompat result2 = new WindowInsetsCompat.Builder()
+                .setSystemWindowInsets(Insets.of(1, 2, 3, 4))
+                .setStableInsets(Insets.of(11, 12, 13, 14))
+                .build();
+
+        assertEquals(result, result2);
+    }
+
+    @Test
+    public void test_hashCode() {
+        WindowInsetsCompat result = new WindowInsetsCompat.Builder()
+                .setSystemWindowInsets(Insets.of(1, 2, 3, 4))
+                .setStableInsets(Insets.of(11, 12, 13, 14))
+                .build();
+
+        WindowInsetsCompat result2 = new WindowInsetsCompat.Builder()
+                .setSystemWindowInsets(Insets.of(1, 2, 3, 4))
+                .setStableInsets(Insets.of(11, 12, 13, 14))
+                .build();
+
+        assertEquals(result.hashCode(), result2.hashCode());
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/os/BuildCompat.java b/core/core/src/main/java/androidx/core/os/BuildCompat.java
index 8de2514..972d204 100644
--- a/core/core/src/main/java/androidx/core/os/BuildCompat.java
+++ b/core/core/src/main/java/androidx/core/os/BuildCompat.java
@@ -53,7 +53,7 @@
     }
 
     /**
-     * Checks if the device is running on a pre-release version of Android O or newer.
+     * Checks if the device is running on a release version of Android O or newer.
      * <p>
      * @return {@code true} if O APIs are available for use, {@code false} otherwise
      * @deprecated Android O is a finalized release and this method is no longer necessary. It will
@@ -66,7 +66,7 @@
     }
 
     /**
-     * Checks if the device is running on a pre-release version of Android O MR1 or newer.
+     * Checks if the device is running on a release version of Android O MR1 or newer.
      * <p>
      * @return {@code true} if O MR1 APIs are available for use, {@code false} otherwise
      * @deprecated Android O MR1 is a finalized release and this method is no longer necessary. It
@@ -79,7 +79,7 @@
     }
 
     /**
-     * Checks if the device is running on a pre-release version of Android P or newer.
+     * Checks if the device is running on a release version of Android P or newer.
      * <p>
      * @return {@code true} if P APIs are available for use, {@code false} otherwise
      * @deprecated Android P is a finalized release and this method is no longer necessary. It
@@ -92,7 +92,7 @@
     }
 
     /**
-     * Checks if the device is running on a pre-release version of Android Q or newer.
+     * Checks if the device is running on release version of Android Q or newer.
      * <p>
      * @return {@code true} if Q APIs are available for use, {@code false} otherwise
      * @deprecated Android Q is a finalized release and this method is no longer necessary. It
@@ -105,17 +105,16 @@
     }
 
     /**
-     * Checks if the device is running on a pre-release version of Android R or newer.
+     * Checks if the device is running on a pre-release version of Android R or a release
+     * version of Android R or newer.
      * <p>
-     * <strong>Note:</strong> This method will return {@code false} on devices running release
-     * versions of Android. When Android R is finalized for release, this method will be deprecated
-     * and all calls should be replaced with {@code Build.VERSION.SDK_INT >= Build.VERSION_CODES.R}.
+     * <strong>Note:</strong> When Android R is finalized for release, this method will be
+     * deprecated and all calls should be replaced with
+     * {@code Build.VERSION.SDK_INT >= Build.VERSION_CODES.R}.
      *
      * @return {@code true} if R APIs are available for use, {@code false} otherwise
      */
     public static boolean isAtLeastR() {
-        return VERSION.CODENAME.length() == 1
-                && VERSION.CODENAME.charAt(0) >= 'R'
-                && VERSION.CODENAME.charAt(0) <= 'Z';
+        return VERSION.SDK_INT >= 30 || VERSION.CODENAME.equals("R");
     }
 }
diff --git a/core/core/src/main/java/androidx/core/os/TraceCompat.java b/core/core/src/main/java/androidx/core/os/TraceCompat.java
index 024385d..42043f6 100644
--- a/core/core/src/main/java/androidx/core/os/TraceCompat.java
+++ b/core/core/src/main/java/androidx/core/os/TraceCompat.java
@@ -31,7 +31,10 @@
  * tracing of events that occur across multiple processes.
  * <p>For information about using the Systrace tool, read <a
  * href="{@docRoot}studio/profile/systrace/">Overview of system tracing</a>.
+ *
+ * @deprecated TraceCompat is deprecated in favor of androidx.trace.Trace. Please use that instead.
  */
+@Deprecated
 public final class TraceCompat {
 
     private static final String TAG = "TraceCompat";
diff --git a/core/core/src/main/java/androidx/core/view/WindowInsetsCompat.java b/core/core/src/main/java/androidx/core/view/WindowInsetsCompat.java
index 0fb4792..0c16067 100644
--- a/core/core/src/main/java/androidx/core/view/WindowInsetsCompat.java
+++ b/core/core/src/main/java/androidx/core/view/WindowInsetsCompat.java
@@ -636,6 +636,26 @@
         WindowInsetsCompat inset(int left, int top, int right, int bottom) {
             return CONSUMED;
         }
+
+        @Override
+        public boolean equals(Object o) {
+            // On API < 28 we can not rely on WindowInsets.equals(), so we handle it manually
+            if (this == o) return true;
+            if (!(o instanceof Impl)) return false;
+            final Impl impl = (Impl) o;
+            return isRound() == impl.isRound()
+                    && isConsumed() == impl.isConsumed()
+                    && ObjectsCompat.equals(getSystemWindowInsets(), impl.getSystemWindowInsets())
+                    && ObjectsCompat.equals(getStableInsets(), impl.getStableInsets())
+                    && ObjectsCompat.equals(getDisplayCutout(), impl.getDisplayCutout());
+        }
+
+        @Override
+        public int hashCode() {
+            // On API < 28 we can not rely on WindowInsets.hashCode(), so we handle it manually
+            return ObjectsCompat.hash(isRound(), isConsumed(), getSystemWindowInsets(),
+                    getStableInsets(), getDisplayCutout());
+        }
     }
 
     @RequiresApi(20)
@@ -681,20 +701,6 @@
             b.setStableInsets(insetInsets(getStableInsets(), left, top, right, bottom));
             return b.build();
         }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) return true;
-            if (!(o instanceof Impl20)) return false;
-            if (!super.equals(o)) return false;
-            Impl20 impl20 = (Impl20) o;
-            return mPlatformInsets.equals(impl20.mPlatformInsets);
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(mPlatformInsets);
-        }
     }
 
     @RequiresApi(21)
@@ -761,6 +767,20 @@
         WindowInsetsCompat consumeDisplayCutout() {
             return toWindowInsetsCompat(mPlatformInsets.consumeDisplayCutout());
         }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (!(o instanceof Impl28)) return false;
+            Impl28 otherImpl28 = (Impl28) o;
+            // On API 28+ we can rely on WindowInsets.equals()
+            return Objects.equals(mPlatformInsets, otherImpl28.mPlatformInsets);
+        }
+
+        @Override
+        public int hashCode() {
+            return mPlatformInsets.hashCode();
+        }
     }
 
     @RequiresApi(29)
diff --git a/customview/customview/build.gradle b/customview/customview/build.gradle
index 1dc5989..474e25e 100644
--- a/customview/customview/build.gradle
+++ b/customview/customview/build.gradle
@@ -17,7 +17,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    api(project(":core:core"))
+    api("androidx.core:core:1.3.0-beta01")
     implementation("androidx.collection:collection:1.1.0")
 
     androidTestImplementation(JUNIT)
diff --git a/development/diagnose-build-failure/diagnose-build-failure.sh b/development/diagnose-build-failure/diagnose-build-failure.sh
index 1b3d64ea..5012dce 100755
--- a/development/diagnose-build-failure/diagnose-build-failure.sh
+++ b/development/diagnose-build-failure/diagnose-build-failure.sh
@@ -38,7 +38,7 @@
 scriptPath="$(cd $(dirname $0) && pwd)"
 supportRoot="$(cd $scriptPath/../.. && pwd)"
 checkoutRoot="$(cd $supportRoot/../.. && pwd)"
-tempDir="/tmp/diagnose-build-failure"
+tempDir="$checkoutRoot/diagnose-build-failure/"
 if [ "${GRADLE_USER_HOME:-}" == "" ]; then
   GRADLE_USER_HOME="$(cd ~ && pwd)/.gradle"
 fi
@@ -149,6 +149,7 @@
   echo "The clean build also failed."
   echo "This may mean that the build is failing for everyone"
   echo "This may mean that something about your checkout is different from others'"
+  echo "You may be interested in running development/simplify-build-failure/simplify-build-failure.sh to identify the minimal set of source files required to reproduce this error"
   echo "Checking the status of your checkout:"
   checkStatus
   exit 1
@@ -191,7 +192,7 @@
 echo "Binary-searching the contents of the two output directories until the relevant differences are identified."
 echo "This may take a while."
 echo
-if runBuild "$supportRoot/development/file-utils/diff-filterer.py --assume-no-side-effects --assume-input-states-are-correct $successState $tempDir/prev \"$scriptPath/impl/restore-state.sh . $workingDir && cd $supportRoot && ./gradlew --no-daemon $gradleArgs\""; then
+if runBuild "$supportRoot/development/file-utils/diff-filterer.py --assume-input-states-are-correct --work-path $tempDir $successState $tempDir/prev \"$scriptPath/impl/restore-state.sh . $workingDir && cd $supportRoot && ./gradlew --no-daemon $gradleArgs\""; then
   echo
   echo "There should be something wrong with the above file state"
   echo "Hopefully the output from diff-filterer.py above is enough information for you to figure out what is wrong"
diff --git a/development/file-utils/diff-filterer.py b/development/file-utils/diff-filterer.py
index 12000d8..7412163 100755
--- a/development/file-utils/diff-filterer.py
+++ b/development/file-utils/diff-filterer.py
@@ -352,7 +352,7 @@
       children = children[0].groupByDirs(False)
     if len(children) > maxNumChildren:
       # If there are lots of child directories, we still want to test a smaller number of larger groups before testing smaller groups
-      # So we arbitarily recombine child directories to make a smaller number of children
+      # So we arbitrarily recombine child directories to make a smaller number of children
       minIndex = 0
       mergedChildren = []
       for i in range(maxNumChildren):
@@ -643,13 +643,12 @@
     try:
       succeeded = self.run()
     finally:
-      print("Child " + str(self.pipe.identifier) + " completed")
-      print("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^")
+      print("^" * 100)
       self.pipe.writerQueue.put((self.pipe.identifier, succeeded))
 
   def run(self):
-    print("##############################################################################################################################################################################################")
-    print("Checking candidateState id " + str(self.pipe.identifier) + " in " + str(self.workPath) + " at " + str(datetime.datetime.now()))
+    print("#" * 100)
+    print("Checking " + self.candidateBox.summarize() + " (job " + str(self.pipe.identifier) + ") in " + str(self.workPath) + " at " + str(datetime.datetime.now()))
     # set file state
     if not self.assumeNoSideEffects:
       fileIo.removePath(self.workPath)
@@ -666,10 +665,10 @@
 
     # report results
     if returnCode == 0:
-      print("shell command for job " + str(self.pipe.identifier) + " succeeded in " + str(duration) + " at " + str(now))
+      print("Passed: " + self.candidateBox.summarize() + " (job " + str(self.pipe.identifier) + ") at " + str(datetime.datetime.now()) + " in " + str(duration))
       return True
     else:
-      print("shell command for job " + str(self.pipe.identifier) + " failed in " + str(duration) + " at " + str(now))
+      print("Failed: " + self.candidateBox.summarize() + " (job " + str(self.pipe.identifier) + ") at " + str(datetime.datetime.now()) + " in " + str(duration))
       return False
 
 
@@ -679,6 +678,7 @@
     # some simple params
     self.workPath = os.path.abspath(workPath)
     self.bestState_path = fileIo.join(self.workPath, "bestResults")
+    self.sampleFailure_path = fileIo.join(self.workPath, "sampleFailure")
     self.testScript_path = fileIo.join(self.workPath, "test.sh")
     fileIo.ensureDirExists(os.path.dirname(self.testScript_path))
     fileIo.writeScript(self.testScript_path, shellCommand)
@@ -734,7 +734,7 @@
       return (False, duration)
 
   def onSuccess(self, testState):
-    print("Runner received success of testState: " + str(testState.summarize()))
+    #print("Runner received success of testState: " + str(testState.summarize()))
     if debug:
       if not filesStateFromTree(self.bestState_path).checkSameKeys(self.full_resetTo_state.withoutEmptyEntries()):
         print("Contents of " + self.bestState_path + " don't match self.full_resetTo_state at beginning of onSuccess")
@@ -775,7 +775,8 @@
     self.full_resetTo_state.apply(self.bestState_path)
 
     print("Starting")
-    print("(You can inspect " + self.bestState_path + " while this process runs, to observe the best state discovered so far)")
+    print("You can inspect " + self.bestState_path + " while this process runs, to observe the best state discovered so far")
+    print("You can inspect " + self.sampleFailure_path + " while this process runs, to observe a state for which the test failed. If you delete this filepath, then it will be updated later to contain a new failing state")
     print("")
     # Now we search over groups of inodes (files or dirs) in the tree
     # Every time we encounter a group of inodes, we try replacing them and seeing if the replacement passes our test
@@ -807,7 +808,7 @@
         if didAcceptState:
           numConsecutiveFailures = 0
           acceptedState = box #.getAllFiles()
-          print("Runner received successful response from job " + str(identifier) + " : " + str(acceptedState.summarize()) + " at " + str(datetime.datetime.now()))
+          #print("Succeeded : " + acceptedState.summarize() + " (job " + str(identifier) + ") at " + str(datetime.datetime.now()))
           maxRunningSize = max([state.size() for state in boxesById.values()])
           maxRelevantSize = maxRunningSize / self.maxNumJobsAtOnce
           if acceptedState.size() < maxRelevantSize:
@@ -832,13 +833,32 @@
                 if i != identifier:
                   invalidatedIds.add(i)
         else:
-          print("Received termination response from job " + str(identifier) + " at " + str(datetime.datetime.now()))
+          if not os.path.isdir(self.sampleFailure_path):
+            # save sample failure path where user can see it
+            print("Saving sample failed state to " + str(self.sampleFailure_path))
+            fileIo.ensureDirExists(self.sampleFailure_path)
+            self.full_resetTo_state.expandedWithEmptyEntriesFor(box).withConflictsFrom(box, True).apply(self.sampleFailure_path)
+          #print("Failed : " + box.summarize() + " (job " + str(identifier) + ") at " + str(datetime.datetime.now()))
           # count failures
           numConsecutiveFailures += 1
           # find any children that failed and queue a re-test of those children
           updatedChild = box.withoutDuplicatesFrom(box.withConflictsFrom(self.resetTo_state))
           if updatedChild.size() > 0:
-            split = updatedChild.splitOnce()
+            if numConsecutiveFailures >= 4:
+              # Suppose we are trying to identify n single-file changes that cause failures
+              # Suppose we have tried c changes of size s, each one of which failed
+              # We conclude that n >= c
+              # A mostly unbiased estimate of c as a function of n is that c = n / 2
+              # Similarly, a mostly unbiased estimate of n is that n = c * 2
+              # We want to choose a new number of changes to test, c2, such that running c2 tests results in efficiently identifying the relevant n changes
+              # Let's set c2 = 2 * n = 2 * 2 * c
+              splitFactor = 4
+            else:
+              # After we reach a sufficiently small change size such that some changes start passing,
+              # Then we assume that we've probably narrowed down to each individual failing change,
+              # And we can increase block sizes more slowly
+              splitFactor = 2
+            split = updatedChild.splitOnce(splitFactor)
             #print("Split box " + str(updatedChild.summarize()) + " into " + str(len(split)) + " children")
             pendingBoxes += split
         # clear invalidation status
@@ -850,7 +870,7 @@
       # if we haven't checked everything yet, then try to queue more jobs
       if numConsecutiveFailures < self.resetTo_state.size():
         # if probablyAcceptableStates has become large enough, then retest its contents too
-        if len(probablyAcceptableStates) > 0 and (len(probablyAcceptableStates) >= self.maxNumJobsAtOnce - 1 or numConsecutiveFailures >= self.maxNumJobsAtOnce or len(activeJobs) < 1):
+        if len(probablyAcceptableStates) > 0 and (len(probablyAcceptableStates) >= self.maxNumJobsAtOnce + 1 or numConsecutiveFailures >= self.maxNumJobsAtOnce or len(activeJobs) < 1):
           numConsecutiveFailures = 0
           probablyAcceptableState = FilesState()
           for state in probablyAcceptableStates:
@@ -872,7 +892,7 @@
           while jobId in activeJobs:
             jobId += 1
           # start job
-          print("Starting process " + str(jobId) + " testing " + str(box.summarize()) + " at " + str(datetime.datetime.now()))
+          #print("Starting process " + str(jobId) + " testing " + str(box.summarize()) + " at " + str(datetime.datetime.now()))
           workingDir = self.getWorkPath(jobId)
           activeJobs[jobId] = runJobInOtherProcess(self.testScript_path, workingDir, self.full_resetTo_state, self.assumeNoSideEffects, box, queue, jobId)
           boxesById[jobId] = box
diff --git a/development/simplify-build-failure/impl/explode.py b/development/simplify-build-failure/impl/explode.py
new file mode 100755
index 0000000..a21e9c2
--- /dev/null
+++ b/development/simplify-build-failure/impl/explode.py
@@ -0,0 +1,200 @@
+#!/usr/bin/python
+#
+#  Copyright (C) 2020 The Android Open Source Project
+#
+#  Licensed under the Apache License, Version 2.0 (the "License");
+#  you may not use this file except in compliance with the License.
+#  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+#
+
+import os, sys
+
+def usage():
+  print("Usage: explode.py [--consolidate-leaves] [--remove-leaves] <inputFile> <outputPath>")
+  sys.exit(1)
+
+# Miscellaneous file utilities
+class FileIo(object):
+  def __init__(self):
+    return
+
+  def ensureDirExists(self, filePath):
+    if not os.path.isdir(filePath):
+      if os.path.isfile(filePath) or os.path.islink(filePath):
+        os.remove(filePath)
+      os.makedirs(filePath)
+
+  def copyFile(self, fromPath, toPath):
+    self.ensureDirExists(os.path.dirname(toPath))
+    self.removePath(toPath)
+    if os.path.islink(fromPath):
+      linkText = os.readlink(fromPath)
+      os.symlink(linkText, toPath)
+    else:
+      shutil.copy2(fromPath, toPath)
+
+  def writeFile(self, path, text):
+    f = open(path, "w+")
+    f.write(text)
+    f.close()
+
+  def writeScript(self, path, text):
+    self.writeFile(path, text)
+    os.chmod(path, 0755)
+
+fileIo = FileIo()
+
+def countStartingSpaces(text):
+  for i in range(len(text)):
+    if text[i] not in (" ", "\t", "\n"):
+      return i
+  return len(text)
+
+# A Block represents some section of text from a source file and stores it as a file on disk
+# The text of each child block is expected to have text starting with <numSpaces> * " "
+class Block(object):
+  def __init__(self, numSpaces, fileName):
+    self.numSpaces = numSpaces
+    self.children = []
+    self.fileName = fileName
+
+  # Adds more text into this section
+  def addChild(self, newChild):
+    self.children.append(newChild)
+
+  # Displays the text represented by this Block
+  def display(self):
+    prefix = " " * (self.numSpaces + 1)
+    for i in range(len(self.children)):
+      print(prefix + str(i) + ":")
+      child = self.children[i]
+      child.display()
+
+  # Generates files at <filePath> representing this Block
+  def apply(self, filePath):
+    if not os.path.isdir(filePath):
+      os.mkdir(filePath)
+    for child in self.children:
+      child.apply(os.path.join(filePath, child.fileName))
+
+  def hasChildren(self):
+    return len(self.children) > 0
+
+  def startsFunction(self):
+    if len(self.children) < 1:
+      return False
+    return self.children[0].startsFunction()
+
+  # Removes any nodes that seem to be function bodies
+  def consolidateFunctionBodies(self, emitOptionalFunctionBodies):
+    consolidated = False
+    for i in range(1, len(self.children)):
+      prev = self.children[i - 1]
+      if (not prev.hasChildren()) and prev.startsFunction():
+        child = self.children[i]
+        if child.hasChildren():
+          child.consolidateSelf(emitOptionalFunctionBodies)
+          consolidated = True
+    for child in self.children:
+      if child.hasChildren():
+        child.consolidateFunctionBodies(emitOptionalFunctionBodies)
+
+  def consolidateSelf(self, emitOptionalFunctionBodies):
+    text = self.getText()
+    if emitOptionalFunctionBodies or " return " in text:
+      self.children = [TextBlock(text, "0")]
+    else:
+      self.children = []
+
+  def getText(self):
+    texts = [child.getText() for child in self.children]
+    return "".join(texts)
+
+# A TextBlock stores text for inclusion in a parent Block
+# Together, they store the result of parsing text from a file
+class TextBlock(object):
+  def __init__(self, text, fileName):
+    self.text = text
+    self.fileName = fileName
+
+  def getText(self):
+    return self.text
+
+  def display(self):
+    print(self.text)
+
+  def apply(self, filePath):
+    fileIo.writeFile(filePath, self.text)
+
+  def hasChildren(self):
+    return False
+
+  def startsFunction(self):
+    if "}" in self.text:
+      return False
+    if "class " in self.text:
+      return False
+    parenIndex = self.text.find(")")
+    curlyIndex = self.text.find("{")
+    if parenIndex >= 0 and curlyIndex >= parenIndex:
+      return True
+    return False
+
+def getLineName(lineNumber, numLines):
+  longestLineNumber = len(str(numLines - 1))
+  thisLineNumber = len(str(lineNumber))
+  extraZeros = "0" * (longestLineNumber - thisLineNumber)
+  return extraZeros + str(lineNumber)
+
+def main(args):
+  if len(args) < 2:
+    usage()
+  consolidateLeaves = False
+  emitLeaves = True
+  if args[0] == "--remove-leaves":
+    consolidateLeaves = True
+    emitLeaves = False
+    args = args[1:]
+  if args[0] == "--consolidate-leaves":
+    consolidateLeaves = True
+    args = args[1:]
+  if len(args) != 2:
+    usage()
+  stack = [Block(0, -1)]
+  inputPath = args[0]
+  outputPath = args[1]
+  lines = open(inputPath).readlines()
+  numLines = len(lines)
+  for i in range(numLines):
+    lineName = getLineName(i, numLines)
+    line = lines[i]
+    numSpaces = countStartingSpaces(line)
+    if line.strip() == "*/" and line.startswith(" "):
+      numSpaces -= 1
+    ignore = (numSpaces == len(line))
+    if not ignore:
+      # pop back to a previous scope
+      while numSpaces < stack[-1].numSpaces:
+        stack = stack[:-1]
+      if numSpaces > stack[-1].numSpaces:
+        newChild = Block(numSpaces, lineName)
+        stack[-1].addChild(newChild)
+        stack.append(newChild)
+    stack[-1].addChild(TextBlock(line, lineName))
+  if consolidateLeaves:
+    # Remove the nodes that the user considers to be leaf nodes
+    stack[0].consolidateFunctionBodies(emitLeaves)
+  #stack[0].display()
+  stack[0].apply(outputPath)
+
+
+if __name__ == "__main__":
+  main(sys.argv[1:])
diff --git a/development/simplify-build-failure/impl/join.sh b/development/simplify-build-failure/impl/join.sh
new file mode 100755
index 0000000..b821aa2
--- /dev/null
+++ b/development/simplify-build-failure/impl/join.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+#
+#  Copyright (C) 2020 The Android Open Source Project
+#
+#  Licensed under the Apache License, Version 2.0 (the "License");
+#  you may not use this file except in compliance with the License.
+#  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+#
+
+set -e
+
+function usage() {
+  echo "usage: $0 <exploded dir> <source dir>"
+  echo "This script concatenates files in <exploded dir> and puts the results in <source dir>"
+  exit 1
+}
+
+explodedDir="$1"
+sourceDir="$2"
+
+if [ "$sourceDir" == "" ]; then
+  usage
+fi
+mkdir -p "$sourceDir"
+sourceDir="$(cd $sourceDir && pwd)"
+
+if [ "$explodedDir" == "" ]; then
+  usage
+fi
+mkdir -p "$explodedDir"
+explodedDir="$(cd $explodedDir && pwd)"
+
+function joinPath() {
+  explodedPath="$1"
+  sourcePath="$2"
+
+  mkdir -p "$(dirname $sourcePath)"
+
+  cd $explodedPath
+  find -type f | sort | xargs cat > "$sourcePath"
+}
+
+
+function main() {
+  rm "$sourceDir" -rf
+  mkdir -p "$sourceDir"
+
+  cd $explodedDir
+  echo finding everything in $explodedDir
+  filePaths="$(find -type f -name file | sed 's|/[^/]*$||' | sort | uniq)"
+  echo joining all file paths under $explodedDir into $sourceDir
+  for filePath in $filePaths; do
+    joinPath "$explodedDir/$filePath" "$sourceDir/$filePath"
+  done
+  echo done joining all file paths under $explodedDir into $sourceDir
+}
+
+
+main
diff --git a/development/simplify-build-failure/impl/split.sh b/development/simplify-build-failure/impl/split.sh
new file mode 100755
index 0000000..97c8ac9
--- /dev/null
+++ b/development/simplify-build-failure/impl/split.sh
@@ -0,0 +1,76 @@
+#!/bin/bash
+#
+#  Copyright (C) 2020 The Android Open Source Project
+#
+#  Licensed under the Apache License, Version 2.0 (the "License");
+#  you may not use this file except in compliance with the License.
+#  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+#
+
+set -e
+
+function usage() {
+  echo "usage: $0 <source dir> <exploded dir>"
+  echo "This script splits files in <source dir> by line and puts the results in <exploded dir>"
+  exit 1
+}
+
+scriptDir="$(cd $(dirname $0) && pwd)"
+removeLeavesArg=""
+if [ "$1" == "--remove-leaves" ]; then
+  removeLeavesArg="$1"
+  shift
+fi
+if [ "$1" == "--consolidate-leaves" ]; then
+  removeLeavesArg="$1"
+  shift
+fi
+sourceDir="$1"
+explodedDir="$2"
+
+if [ "$sourceDir" == "" ]; then
+  usage
+fi
+sourceDir="$(cd $sourceDir && pwd)"
+
+if [ "$explodedDir" == "" ]; then
+  usage
+fi
+mkdir -p "$explodedDir"
+explodedDir="$(cd $explodedDir && pwd)"
+
+function explodePath() {
+  sourcePath="$1"
+  explodedPath="$2"
+
+  mkdir -p "$explodedPath"
+
+  # split $sourcePath into lines, and put each line into a file named 00001, 00002, 00003, ...
+  cd "$explodedPath"
+  $scriptDir/explode.py $removeLeavesArg "$sourcePath" "$explodedPath"
+  touch "$explodedPath/file"
+}
+
+
+function main() {
+  rm "$explodedDir" -rf
+  mkdir -p "$explodedDir"
+
+  cd $sourceDir
+  echo splitting everything in $(pwd) into $explodedDir
+  for filePath in $(find -type f); do
+    explodePath "$sourceDir/$filePath" "$explodedDir/$filePath"
+  done
+  echo done splitting everything in $(pwd) into $explodedDir
+}
+
+
+main
diff --git a/development/simplify-build-failure/simplify-build-failure.sh b/development/simplify-build-failure/simplify-build-failure.sh
new file mode 100755
index 0000000..283f8d5
--- /dev/null
+++ b/development/simplify-build-failure/simplify-build-failure.sh
@@ -0,0 +1,284 @@
+#!/bin/bash
+#
+#  Copyright (C) 2020 The Android Open Source Project
+#
+#  Licensed under the Apache License, Version 2.0 (the "License");
+#  you may not use this file except in compliance with the License.
+#  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+#
+
+set -e
+
+function usage() {
+  echo 'NAME'
+  echo '  simplify-build-failure.sh'
+  echo
+  echo 'SYNOPSIS'
+  echo "  $0 (--task <gradle task> <error message> | --command <shell command> ) [--continue] [<subfile path>]"
+  echo
+  echo DESCRIPTION
+  echo '  Searches for a minimal set of files and/or lines required to reproduce a given build failure'
+  echo
+  echo OPTIONS
+  echo
+  echo '  --task <gradle task> <error message>`'
+  echo '    Specifies that `./gradlew <gradle task>` must fail with error message <error message>'
+  echo
+  echo '  --command <shell command>'
+  echo '    Specifies that <shell command> must succeed.'
+  echo
+  echo '  --continue'
+  echo '    Attempts to pick up from a previous invocation of simplify-build-failure.sh'
+  echo
+  echo '<subfile path>'
+  echo '  If <subfile path> is specified, then individual lines in files in <subfile path> will be considered for removal, too'
+  exit 1
+}
+
+function notify() {
+  echo simplify-build-failure.sh $1
+  notify-send simplify-build-failure.sh $1
+}
+
+function failed() {
+  notify failed
+  exit 1
+}
+
+gradleTasks=""
+errorMessage=""
+gradleCommand=""
+grepCommand=""
+testCommand=""
+resume=false
+
+export ALLOW_MISSING_PROJECTS=true # so that if we delete entire projects then the AndroidX build doesn't think we made a spelling mistake
+
+while [ "$1" != "" ]; do
+  arg="$1"
+  shift
+  if [ "$arg" == "--continue" ]; then
+    resume=true
+    continue
+  fi
+  if [ "$arg" == "--task" ]; then
+    gradleTasks="$1"
+    shift
+    errorMessage="$1"
+    shift
+    if [ "$gradleTasks" == "" ]; then
+      usage
+    fi
+
+    if [ "$errorMessage" == "" ]; then
+      usage
+    fi
+
+    subfilePath="$1"
+    shift || true
+
+    gradleCommand="OUT_DIR=out ./gradlew $gradleTasks > log 2>&1"
+    grepCommand="grep \"$errorMessage\" log"
+    # Sleep in case Gradle fails very quickly
+    # We don't want to run too many Gradle commands in a row or else the daemons might get confused
+    testCommand="$gradleCommand; sleep 2; $grepCommand"
+    continue
+  fi
+  if [ "$arg" == "--command" ]; then
+    testCommand="$1"
+    shift
+    gradleCommand=""
+    grepCommand=""
+    if [ "$testCommand" == "" ]; then
+      usage
+    fi
+    if echo "$testCommand" | grep -v OUT_DIR 2>/dev/null; then
+      echo "Error: must set OUT_DIR in the test command to prevent concurrent Gradle executions from interfering with each other"
+      exit 1
+    fi
+
+    subfilePath="$1"
+    break
+  fi
+  echo "Unrecognized argument '$arg'"
+  usage
+done
+
+if [ "$testCommand" == "" ]; then
+  usage
+fi
+
+cd "$(dirname $0)"
+scriptPath="$(pwd)"
+cd ../..
+supportRoot="$(pwd)"
+checkoutRoot="$(cd $supportRoot/../.. && pwd)"
+
+tempDir="$checkoutRoot/simplify-tmp"
+if [ "$resume" == "true" ]; then
+  if [ -d "$tempDir" ]; then
+    echo "Not deleting temp dir $tempDir"
+  fi
+else
+  echo "Removing temp dir $tempDir"
+  rm "$tempDir" -rf
+fi
+referencePassingDir="$tempDir/base"
+referenceFailingDir="$tempDir/failing"
+
+rm "$referencePassingDir" -rf
+mkdir -p "$referencePassingDir"
+
+if [ "$subfilePath" != "" ]; then
+  if [ ! -e "$subfilePath" ]; then
+    echo "$subfilePath" does not exist
+    exit 1
+  fi
+fi
+
+filtererStep1Work="$tempDir"
+filtererStep1Output="$filtererStep1Work/bestResults"
+fewestFilesOutputPath="$tempDir/fewestFiles"
+if echo "$resume" | grep "true" >/dev/null && stat "$fewestFilesOutputPath" >/dev/null 2>/dev/null; then
+  echo "Skipping first execution of diff-filterer, $fewestFilesOutputPath already exists"
+else
+  if [ "$resume" == "true" ]; then
+    if stat "$filtererStep1Output" >/dev/null 2>/dev/null; then
+      echo "Reusing $filtererStep1Output to resume first execution of diff-filterer"
+      # Copy the previous results to resume from
+      rm "$referenceFailingDir" -rf
+      cp -rT "$filtererStep1Output" "$referenceFailingDir"
+    else
+      echo "Cannot resume previous execution; neither $fewestFilesOutputPath nor $filtererStep1Output exists"
+      exit 1
+    fi
+  else
+    # make a backup of the code so that the user can still make modifications to the source tree without interfering with diff-filterer.py
+    rm "$referenceFailingDir" -rf
+    cp -rT . "$referenceFailingDir"
+    # remove some unhelpful settings
+    sed -i 's/.*Werror.*//' "$referenceFailingDir/buildSrc/build.gradle"
+  fi
+  echo Running diff-filterer.py once to identify the minimal set of files needed to reproduce the error
+  if ./development/file-utils/diff-filterer.py --assume-no-side-effects --work-path $filtererStep1Work --num-jobs 4 "$referenceFailingDir" "$referencePassingDir" "$testCommand"; then
+    echo diff-filterer completed successfully
+  else
+    failed
+  fi
+fi
+
+
+if [ "$subfilePath" == "" ]; then
+  echo Splitting files into individual lines was not enabled. Done. See results at $filtererStep1Work/bestResults
+else
+  if [ "$subfilePath" == "." ]; then
+    subfilePath=""
+  fi
+  if echo "$resume" | grep true && stat $fewestFilesOutputPath >/dev/null 2>/dev/null; then
+    echo "Skipping recopying $filtererStep1Output to $fewestFilesOutputPath"
+  else
+    echo Copying minimal set of files into $fewestFilesOutputPath
+    rm -rf "$fewestFilesOutputPath"
+    cp -rT "$filtererStep1Output" "$fewestFilesOutputPath"
+  fi
+
+  echo Creating working directory for identifying individually smallest files
+  noFunctionBodies_Passing="$tempDir/noFunctionBodies_Passing"
+  noFunctionBodies_goal="$tempDir/noFunctionBodies_goal"
+  noFunctionBodies_work="work"
+  noFunctionBodies_sandbox="$noFunctionBodies_work/$subfilePath"
+  noFunctionBodies_output="$tempDir/noFunctionBodies_output"
+
+  # set up command for running diff-filterer against diffs within files
+  filtererOptions="--num-jobs 4"
+  if echo $subfilePath | grep -v buildSrc >/dev/null 2>/dev/null; then
+    # If we're not making changes in buildSrc, then we want to keep the gradle caches around for more speed
+    # If we are making changes in buildSrc, then Gradle doesn't necessarily do up-to-date checks correctly, and we want to clear the caches between builds
+    filtererOptions="$filtererOptions --assume-no-side-effects"
+  else
+    if [ "$grepCommand" != "" ]; then
+      filtererOptions="$filtererOptions --assume-no-side-effects"
+      # If we're making changes in buildSrc, then we want to make sure that a clean build passes because Gradle doesn't always do up-to-date checks correctly when we're making strange changes in buildSrc
+      # However, the build runs much more quickly when incremental than when clean
+      # So, we first run an incremental build and then if it passes we run a clean build
+      testCommand="$gradleCommand; $grepCommand && rm log out -rf && $gradleCommand --no-daemon; $grepCommand"
+    fi
+  fi
+
+  if echo "$resume" | grep true && stat "$noFunctionBodies_output" >/dev/null 2>/dev/null; then
+    echo "Skipping asking diff-filterer to remove function bodies because $noFunctionBodies_output already exists"
+  else
+    echo Splitting files into smaller pieces
+    rm -rf "$noFunctionBodies_Passing" "$noFunctionBodies_goal"
+    mkdir -p "$noFunctionBodies_Passing" "$noFunctionBodies_goal"
+    cd "$noFunctionBodies_Passing"
+    cp -rT "$fewestFilesOutputPath" "$noFunctionBodies_work"
+    cp -rT "$noFunctionBodies_Passing" "$noFunctionBodies_goal"
+
+    splitsPath="${subfilePath}.split"
+    "${scriptPath}/impl/split.sh" --consolidate-leaves "$noFunctionBodies_sandbox" "$splitsPath"
+    rm "$noFunctionBodies_sandbox" -rf
+
+    echo Removing deepest lines
+    cd "$noFunctionBodies_goal"
+    #find "$noFunctionBodies_sandbox" -type f | xargs sed -i 's| \*/|\*/|g' # deindent block comments
+    "${scriptPath}/impl/split.sh" --remove-leaves "$noFunctionBodies_sandbox" "$splitsPath"
+    rm "$noFunctionBodies_sandbox" -rf
+
+    # TODO: maybe we should make diff-filterer.py directly support checking individual line differences within files rather than first running split.sh and asking diff-filterer.py to run join.sh
+    # It would be harder to implement in diff-filterer.py though because diff-filterer.py would also need to support comparing against nonempty files too
+    echo Running diff-filterer.py again to identify which function bodies can be removed
+    if "$supportRoot/development/file-utils/diff-filterer.py" --assume-input-states-are-correct $filtererOptions --work-path "$(cd $supportRoot/../.. && pwd)" "$noFunctionBodies_Passing" "$noFunctionBodies_goal" "${scriptPath}/impl/join.sh ${splitsPath} ${noFunctionBodies_sandbox} && cd ${noFunctionBodies_work} && $testCommand"; then
+      echo diff-filterer completed successfully
+    else
+      failed
+    fi
+
+    echo Re-joining the files
+    rm -rf "${noFunctionBodies_output}"
+    cp -rT "$(cd $supportRoot/../../bestResults && pwd)" "${noFunctionBodies_output}"
+    cd "${noFunctionBodies_output}"
+    "${scriptPath}/impl/join.sh" "${splitsPath}" "${noFunctionBodies_sandbox}"
+  fi
+
+  # prepare for another invocation of diff-filterer, to remove other code that is now unused
+  smallestFilesInput="$tempDir/smallestFilesInput"
+  smallestFilesGoal="$tempDir/empty"
+  smallestFilesWork="work"
+  smallestFilesSandbox="$smallestFilesWork/$subfilePath"
+
+  rm -rf "$smallestFilesInput" "$smallestFilesGoal"
+  mkdir -p "$smallestFilesInput" "$smallestFilesGoal"
+  cp -rT "${noFunctionBodies_output}" "$smallestFilesInput"
+
+  echo Splitting files into individual lines
+  cd "$smallestFilesInput"
+  splitsPath="${subfilePath}.split"
+  "${scriptPath}/impl/split.sh" "$smallestFilesSandbox" "$splitsPath"
+  rm "$smallestFilesSandbox" -rf
+
+  echo Running diff-filterer.py again to identify the minimal set of lines needed to reproduce the error
+  if "$supportRoot/development/file-utils/diff-filterer.py" $filtererOptions --work-path "$(cd $supportRoot/../.. && pwd)" "$smallestFilesInput" "$smallestFilesGoal" "${scriptPath}/impl/join.sh ${splitsPath} ${smallestFilesSandbox} && cd ${smallestFilesWork} && $testCommand"; then
+    echo diff-filterer completed successfully
+  else
+    failed
+  fi
+
+  echo Re-joining the files
+  smallestFilesOutput="$tempDir/smallestFilesOutput"
+  rm -rf "$smallestFilesOutput"
+  cp -rT "$(cd $supportRoot/../../bestResults && pwd)" "${smallestFilesOutput}"
+  cd "${smallestFilesOutput}"
+  "${scriptPath}/impl/join.sh" "${splitsPath}" "${smallestFilesSandbox}"
+
+  echo "Done. See simplest discovered reproduction test case at ${smallestFilesOutput}"
+fi
+notify succeeded
diff --git a/emoji/core/build.gradle b/emoji/core/build.gradle
index 13d830b..d77ebbb 100644
--- a/emoji/core/build.gradle
+++ b/emoji/core/build.gradle
@@ -22,7 +22,7 @@
     // treats this as local jar and package it inside the aar.
     api files(configurations.repackage)
 
-    api(project(":core:core"))
+    api("androidx.core:core:1.3.0-beta01")
     implementation("androidx.collection:collection:1.1.0")
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/exifinterface/exifinterface/src/androidTest/java/androidx/exifinterface/media/ExifInterfaceTest.java b/exifinterface/exifinterface/src/androidTest/java/androidx/exifinterface/media/ExifInterfaceTest.java
index eddb3d5..64c60e0 100644
--- a/exifinterface/exifinterface/src/androidTest/java/androidx/exifinterface/media/ExifInterfaceTest.java
+++ b/exifinterface/exifinterface/src/androidTest/java/androidx/exifinterface/media/ExifInterfaceTest.java
@@ -377,16 +377,13 @@
         }
 
         for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
-            String outputPath =
-                    new File(Environment.getExternalStorageDirectory(), IMAGE_FILENAMES[i])
-                            .getAbsolutePath();
-
+            File file = getFileFromExternalDir(IMAGE_FILENAMES[i]);
             InputStream inputStream = null;
             FileOutputStream outputStream = null;
             try {
                 inputStream = getApplicationContext()
                         .getResources().openRawResource(IMAGE_RESOURCES[i]);
-                outputStream = new FileOutputStream(outputPath);
+                outputStream = new FileOutputStream(file);
                 copy(inputStream, outputStream);
             } finally {
                 closeQuietly(inputStream);
@@ -398,10 +395,7 @@
     @After
     public void tearDown() throws Exception {
         for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
-            String imageFilePath =
-                    new File(Environment.getExternalStorageDirectory(), IMAGE_FILENAMES[i])
-                            .getAbsolutePath();
-            File imageFile = new File(imageFilePath);
+            File imageFile = getFileFromExternalDir(IMAGE_FILENAMES[i]);
             if (imageFile.exists()) {
                 imageFile.delete();
             }
@@ -634,8 +628,7 @@
         final String dateTimeValue = "2017:02:02 22:22:22";
         final String dateTimeOriginalValue = "2017:01:01 11:11:11";
 
-        File imageFile = new File(
-                Environment.getExternalStorageDirectory(), JPEG_WITH_EXIF_BYTE_ORDER_II);
+        File imageFile = getFileFromExternalDir(JPEG_WITH_EXIF_BYTE_ORDER_II);
         ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath());
         exif.setAttribute(ExifInterface.TAG_DATETIME, dateTimeValue);
         exif.setAttribute(ExifInterface.TAG_DATETIME_ORIGINAL, dateTimeOriginalValue);
@@ -664,8 +657,7 @@
     @Test
     @LargeTest
     public void testRotation() throws IOException {
-        File imageFile = new File(
-                Environment.getExternalStorageDirectory(), JPEG_WITH_EXIF_BYTE_ORDER_II);
+        File imageFile = getFileFromExternalDir(JPEG_WITH_EXIF_BYTE_ORDER_II);
         ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath());
 
         int num;
@@ -930,7 +922,7 @@
         ExpectedValue expectedValue = new ExpectedValue(
                 getApplicationContext().getResources().obtainTypedArray(typedArrayResourceId));
 
-        File imageFile = new File(Environment.getExternalStorageDirectory(), fileName);
+        File imageFile = getFileFromExternalDir(fileName);
         String verboseTag = imageFile.getName();
 
         FileInputStream fis = new FileInputStream(imageFile);
@@ -949,7 +941,7 @@
 
     private void testExifInterfaceCommon(String fileName, ExpectedValue expectedValue)
             throws IOException {
-        File imageFile = new File(Environment.getExternalStorageDirectory(), fileName);
+        File imageFile = getFileFromExternalDir(fileName);
         String verboseTag = imageFile.getName();
 
         // Creates via file.
@@ -990,7 +982,7 @@
 
     private void testExifInterfaceRange(String fileName, ExpectedValue expectedValue)
             throws IOException {
-        File imageFile = new File(Environment.getExternalStorageDirectory(), fileName);
+        File imageFile = getFileFromExternalDir(fileName);
 
         InputStream in = null;
         try {
@@ -1047,7 +1039,7 @@
         ExpectedValue expectedValue = new ExpectedValue(
                 getApplicationContext().getResources().obtainTypedArray(typedArrayResourceId));
 
-        File imageFile = new File(Environment.getExternalStorageDirectory(), fileName);
+        File imageFile = getFileFromExternalDir(fileName);
         String verboseTag = imageFile.getName();
 
         ExifInterface exifInterface = new ExifInterface(imageFile.getAbsolutePath());
@@ -1090,7 +1082,7 @@
     }
 
     private void writeToFilesWithoutExif(String fileName) throws IOException {
-        File imageFile = new File(Environment.getExternalStorageDirectory(), fileName);
+        File imageFile = getFileFromExternalDir(fileName);
 
         ExifInterface exifInterface = new ExifInterface(imageFile.getAbsolutePath());
         exifInterface.setAttribute(ExifInterface.TAG_MAKE, "abc");
@@ -1190,4 +1182,9 @@
         }
         return (short) ((ch1 << 8) + (ch2));
     }
+
+    private File getFileFromExternalDir(String fileName) {
+        return new File(getApplicationContext().getExternalFilesDir(Environment.DIRECTORY_PICTURES),
+                fileName);
+    }
 }
diff --git a/fragment/fragment-ktx/api/1.3.0-alpha04.txt b/fragment/fragment-ktx/api/1.3.0-alpha04.txt
index c8315cb..2f95225 100644
--- a/fragment/fragment-ktx/api/1.3.0-alpha04.txt
+++ b/fragment/fragment-ktx/api/1.3.0-alpha04.txt
@@ -1,12 +1,21 @@
 // Signature format: 3.0
 package androidx.fragment.app {
 
+  public final class FragmentKt {
+    method public static void setResult(androidx.fragment.app.Fragment, String requestKey, android.os.Bundle? result);
+    method public static void setResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit>? listener);
+  }
+
   public final class FragmentManagerKt {
     method public static inline void commit(androidx.fragment.app.FragmentManager, boolean allowStateLoss = false, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
     method public static inline void commitNow(androidx.fragment.app.FragmentManager, boolean allowStateLoss = false, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
     method @Deprecated public static inline void transaction(androidx.fragment.app.FragmentManager, boolean now = false, boolean allowStateLoss = false, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
   }
 
+  public final class FragmentResultOwnerKt {
+    method public static void setResultListener(androidx.fragment.app.FragmentResultOwner, String requestKey, androidx.lifecycle.LifecycleOwner lifecycleOwner, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit>? listener);
+  }
+
   public final class FragmentTransactionKt {
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag, android.os.Bundle? args = null);
diff --git a/fragment/fragment-ktx/api/current.txt b/fragment/fragment-ktx/api/current.txt
index c8315cb..2f95225 100644
--- a/fragment/fragment-ktx/api/current.txt
+++ b/fragment/fragment-ktx/api/current.txt
@@ -1,12 +1,21 @@
 // Signature format: 3.0
 package androidx.fragment.app {
 
+  public final class FragmentKt {
+    method public static void setResult(androidx.fragment.app.Fragment, String requestKey, android.os.Bundle? result);
+    method public static void setResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit>? listener);
+  }
+
   public final class FragmentManagerKt {
     method public static inline void commit(androidx.fragment.app.FragmentManager, boolean allowStateLoss = false, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
     method public static inline void commitNow(androidx.fragment.app.FragmentManager, boolean allowStateLoss = false, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
     method @Deprecated public static inline void transaction(androidx.fragment.app.FragmentManager, boolean now = false, boolean allowStateLoss = false, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
   }
 
+  public final class FragmentResultOwnerKt {
+    method public static void setResultListener(androidx.fragment.app.FragmentResultOwner, String requestKey, androidx.lifecycle.LifecycleOwner lifecycleOwner, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit>? listener);
+  }
+
   public final class FragmentTransactionKt {
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag, android.os.Bundle? args = null);
diff --git a/fragment/fragment-ktx/api/public_plus_experimental_1.3.0-alpha04.txt b/fragment/fragment-ktx/api/public_plus_experimental_1.3.0-alpha04.txt
index c8315cb..2f95225 100644
--- a/fragment/fragment-ktx/api/public_plus_experimental_1.3.0-alpha04.txt
+++ b/fragment/fragment-ktx/api/public_plus_experimental_1.3.0-alpha04.txt
@@ -1,12 +1,21 @@
 // Signature format: 3.0
 package androidx.fragment.app {
 
+  public final class FragmentKt {
+    method public static void setResult(androidx.fragment.app.Fragment, String requestKey, android.os.Bundle? result);
+    method public static void setResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit>? listener);
+  }
+
   public final class FragmentManagerKt {
     method public static inline void commit(androidx.fragment.app.FragmentManager, boolean allowStateLoss = false, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
     method public static inline void commitNow(androidx.fragment.app.FragmentManager, boolean allowStateLoss = false, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
     method @Deprecated public static inline void transaction(androidx.fragment.app.FragmentManager, boolean now = false, boolean allowStateLoss = false, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
   }
 
+  public final class FragmentResultOwnerKt {
+    method public static void setResultListener(androidx.fragment.app.FragmentResultOwner, String requestKey, androidx.lifecycle.LifecycleOwner lifecycleOwner, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit>? listener);
+  }
+
   public final class FragmentTransactionKt {
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag, android.os.Bundle? args = null);
diff --git a/fragment/fragment-ktx/api/public_plus_experimental_current.txt b/fragment/fragment-ktx/api/public_plus_experimental_current.txt
index c8315cb..2f95225 100644
--- a/fragment/fragment-ktx/api/public_plus_experimental_current.txt
+++ b/fragment/fragment-ktx/api/public_plus_experimental_current.txt
@@ -1,12 +1,21 @@
 // Signature format: 3.0
 package androidx.fragment.app {
 
+  public final class FragmentKt {
+    method public static void setResult(androidx.fragment.app.Fragment, String requestKey, android.os.Bundle? result);
+    method public static void setResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit>? listener);
+  }
+
   public final class FragmentManagerKt {
     method public static inline void commit(androidx.fragment.app.FragmentManager, boolean allowStateLoss = false, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
     method public static inline void commitNow(androidx.fragment.app.FragmentManager, boolean allowStateLoss = false, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
     method @Deprecated public static inline void transaction(androidx.fragment.app.FragmentManager, boolean now = false, boolean allowStateLoss = false, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
   }
 
+  public final class FragmentResultOwnerKt {
+    method public static void setResultListener(androidx.fragment.app.FragmentResultOwner, String requestKey, androidx.lifecycle.LifecycleOwner lifecycleOwner, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit>? listener);
+  }
+
   public final class FragmentTransactionKt {
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag, android.os.Bundle? args = null);
diff --git a/fragment/fragment-ktx/api/restricted_1.3.0-alpha04.txt b/fragment/fragment-ktx/api/restricted_1.3.0-alpha04.txt
index c8315cb..2f95225 100644
--- a/fragment/fragment-ktx/api/restricted_1.3.0-alpha04.txt
+++ b/fragment/fragment-ktx/api/restricted_1.3.0-alpha04.txt
@@ -1,12 +1,21 @@
 // Signature format: 3.0
 package androidx.fragment.app {
 
+  public final class FragmentKt {
+    method public static void setResult(androidx.fragment.app.Fragment, String requestKey, android.os.Bundle? result);
+    method public static void setResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit>? listener);
+  }
+
   public final class FragmentManagerKt {
     method public static inline void commit(androidx.fragment.app.FragmentManager, boolean allowStateLoss = false, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
     method public static inline void commitNow(androidx.fragment.app.FragmentManager, boolean allowStateLoss = false, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
     method @Deprecated public static inline void transaction(androidx.fragment.app.FragmentManager, boolean now = false, boolean allowStateLoss = false, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
   }
 
+  public final class FragmentResultOwnerKt {
+    method public static void setResultListener(androidx.fragment.app.FragmentResultOwner, String requestKey, androidx.lifecycle.LifecycleOwner lifecycleOwner, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit>? listener);
+  }
+
   public final class FragmentTransactionKt {
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag, android.os.Bundle? args = null);
diff --git a/fragment/fragment-ktx/api/restricted_current.txt b/fragment/fragment-ktx/api/restricted_current.txt
index c8315cb..2f95225 100644
--- a/fragment/fragment-ktx/api/restricted_current.txt
+++ b/fragment/fragment-ktx/api/restricted_current.txt
@@ -1,12 +1,21 @@
 // Signature format: 3.0
 package androidx.fragment.app {
 
+  public final class FragmentKt {
+    method public static void setResult(androidx.fragment.app.Fragment, String requestKey, android.os.Bundle? result);
+    method public static void setResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit>? listener);
+  }
+
   public final class FragmentManagerKt {
     method public static inline void commit(androidx.fragment.app.FragmentManager, boolean allowStateLoss = false, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
     method public static inline void commitNow(androidx.fragment.app.FragmentManager, boolean allowStateLoss = false, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
     method @Deprecated public static inline void transaction(androidx.fragment.app.FragmentManager, boolean now = false, boolean allowStateLoss = false, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
   }
 
+  public final class FragmentResultOwnerKt {
+    method public static void setResultListener(androidx.fragment.app.FragmentResultOwner, String requestKey, androidx.lifecycle.LifecycleOwner lifecycleOwner, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit>? listener);
+  }
+
   public final class FragmentTransactionKt {
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag, android.os.Bundle? args = null);
diff --git a/fragment/fragment-ktx/build.gradle b/fragment/fragment-ktx/build.gradle
index 42636e2..8ba9fe8 100644
--- a/fragment/fragment-ktx/build.gradle
+++ b/fragment/fragment-ktx/build.gradle
@@ -55,6 +55,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
+    androidTestImplementation project(':internal-testutils-runtime'), {
+        exclude group: 'androidx.fragment', module: 'fragment'
+    }
 }
 
 androidx {
diff --git a/fragment/fragment-ktx/src/androidTest/java/androidx/fragment/app/FragmentResultOwnerTest.kt b/fragment/fragment-ktx/src/androidTest/java/androidx/fragment/app/FragmentResultOwnerTest.kt
new file mode 100644
index 0000000..b5a3206
--- /dev/null
+++ b/fragment/fragment-ktx/src/androidTest/java/androidx/fragment/app/FragmentResultOwnerTest.kt
@@ -0,0 +1,97 @@
+/*
+ * 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.fragment.app
+
+import android.os.Bundle
+import androidx.core.os.bundleOf
+import androidx.test.core.app.ActivityScenario
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.testutils.withActivity
+import com.google.common.truth.Truth.assertWithMessage
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class FragmentResultOwnerTest {
+
+    @Test
+    fun setFragmentResult() {
+        with(ActivityScenario.launch(TestActivity::class.java)) {
+            val fragment1 = ResultFragment()
+
+            val fm = withActivity {
+                supportFragmentManager
+            }
+
+            withActivity {
+                fm.commitNow {
+                    add(fragment1, null)
+                }
+            }
+
+            val expectedResult = "resultGood"
+            val resultBundle = bundleOf("bundleKey" to expectedResult)
+
+            fm.setResult("requestKey", resultBundle)
+
+            assertWithMessage("The result is incorrect")
+                .that(fragment1.actualResult)
+                .isEqualTo(expectedResult)
+        }
+    }
+
+    @Test
+    fun clearFragmentResultListener() {
+        with(ActivityScenario.launch(TestActivity::class.java)) {
+            val fragment1 = ResultFragment()
+
+            val fm = withActivity {
+                supportFragmentManager
+            }
+
+            withActivity {
+                fm.commitNow {
+                    add(fragment1, null)
+                }
+            }
+
+            val expectedResult = "resultGood"
+            val resultBundle = bundleOf("bundleKey" to expectedResult)
+
+            fm.setResultListener("requestKey", fragment1, null)
+            fm.setResult("requestKey", resultBundle)
+
+            assertWithMessage("The listener was cleared but the result was not null")
+                .that(fragment1.actualResult)
+                .isNull()
+        }
+    }
+
+    class ResultFragment : Fragment() {
+        var actualResult: String? = null
+
+        override fun onCreate(savedInstanceState: Bundle?) {
+            super.onCreate(savedInstanceState)
+
+            parentFragmentManager.setResultListener("requestKey", this) { _, bundle ->
+                actualResult = bundle.getString("bundleKey")
+            }
+        }
+    }
+}
diff --git a/fragment/fragment-ktx/src/androidTest/java/androidx/fragment/app/FragmentTest.kt b/fragment/fragment-ktx/src/androidTest/java/androidx/fragment/app/FragmentTest.kt
new file mode 100644
index 0000000..22b45c1
--- /dev/null
+++ b/fragment/fragment-ktx/src/androidTest/java/androidx/fragment/app/FragmentTest.kt
@@ -0,0 +1,81 @@
+/*
+ * 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.fragment.app
+
+import android.os.Bundle
+import androidx.core.os.bundleOf
+import androidx.test.core.app.ActivityScenario
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.testutils.withActivity
+import com.google.common.truth.Truth.assertWithMessage
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class FragmentTest {
+
+    @Test
+    fun setFragmentResult() {
+        with(ActivityScenario.launch(TestActivity::class.java)) {
+            val fragment1 = ResultFragment()
+
+            val fm = withActivity {
+                supportFragmentManager
+            }
+
+            withActivity {
+                fm.commitNow {
+                    add(fragment1, null)
+                }
+            }
+            val expectedResult = "resultGood"
+            val fragment2 = SetResultFragment(expectedResult)
+
+            withActivity {
+                fm.commitNow {
+                    add(fragment2, null)
+                }
+            }
+
+            assertWithMessage("The result is incorrect")
+                .that(fragment1.actualResult)
+                .isEqualTo(expectedResult)
+        }
+    }
+
+    class ResultFragment : Fragment() {
+        var actualResult: String? = null
+
+        override fun onCreate(savedInstanceState: Bundle?) {
+            super.onCreate(savedInstanceState)
+
+            setResultListener("requestKey") { _, bundle ->
+                actualResult = bundle.getString("bundleKey")
+            }
+        }
+    }
+
+    class SetResultFragment(val resultString: String) : Fragment() {
+        override fun onStart() {
+            super.onStart()
+
+            setResult("requestKey", bundleOf("bundleKey" to resultString))
+        }
+    }
+}
diff --git a/fragment/fragment-ktx/src/main/java/androidx/fragment/app/Fragment.kt b/fragment/fragment-ktx/src/main/java/androidx/fragment/app/Fragment.kt
new file mode 100644
index 0000000..2819660
--- /dev/null
+++ b/fragment/fragment-ktx/src/main/java/androidx/fragment/app/Fragment.kt
@@ -0,0 +1,54 @@
+/*
+ * 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.fragment.app
+
+import android.os.Bundle
+
+/**
+ * Sets the given result for the [requestKey]. This result will be delivered to a
+ * [FragmentResultListener] that is called given to [setResultListener] with the same [requestKey].
+ * If no [FragmentResultListener] with the same key is set or the Lifecycle associated with the
+ * listener is not at least [androidx.lifecycle.Lifecycle.State.STARTED], the result is stored
+ * until one becomes available, or a null result with the same [requestKey] is set.
+ *
+ * @param requestKey key used to identify the result
+ * @param result the result to be passed to another fragment or `null` if you want to
+ *               clear out any pending result.
+ */
+fun Fragment.setResult(
+    requestKey: String,
+    result: Bundle?
+) = parentFragmentManager.setResult(requestKey, result)
+
+/**
+ * Sets the [FragmentResultListener] for a given [requestKey]. Once this Fragment is
+ * at least in the [androidx.lifecycle.Lifecycle.State.STARTED] state, any results set by
+ * [setResult] using the same [requestKey] will be delivered to the
+ * [FragmentResultListener.onFragmentResult] callback. The callback will remain active until this
+ * Fragment reaches the [androidx.lifecycle.Lifecycle.State.DESTROYED] state or a null
+ * [FragmentResultListener] is set for the same [requestKey].
+ *
+ * @param requestKey requestKey used to store the result
+ * @param listener listener for result changes or `null` to remove any previously
+ *                 registered listener.
+ */
+fun Fragment.setResultListener(
+    requestKey: String,
+    listener: ((resultKey: String, bundle: Bundle) -> Unit)?
+) {
+    parentFragmentManager.setResultListener(requestKey, this, listener)
+}
diff --git a/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentResultOwner.kt b/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentResultOwner.kt
new file mode 100644
index 0000000..ce60280
--- /dev/null
+++ b/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentResultOwner.kt
@@ -0,0 +1,42 @@
+/*
+ * 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.fragment.app
+
+import android.os.Bundle
+import androidx.lifecycle.LifecycleOwner
+
+/**
+ * Sets the [FragmentResultListener] for a given requestKey. Once the given [LifecycleOwner] is
+ * at least in the [androidx.lifecycle.Lifecycle.State.STARTED] state, any results set by
+ * [FragmentResultOwner.setResult] using the same requestKey will be delivered to the
+ * [FragmentResultListener.onFragmentResult] callback. The callback will remain active until the
+ * LifecycleOwner reaches the [androidx.lifecycle.Lifecycle.State.DESTROYED] state or a null
+ * [FragmentResultListener] is set for the same requestKey.
+ *
+ * @param requestKey requestKey used to store the result
+ * @param lifecycleOwner lifecycleOwner for handling the result
+ * @param listener listener for result changes or `null` to remove any previously registered
+ * listener.
+ */
+fun FragmentResultOwner.setResultListener(
+    requestKey: String,
+    lifecycleOwner: LifecycleOwner,
+    listener: ((resultKey: String, bundle: Bundle) -> Unit)?
+) {
+    val resultListener = if (listener == null) null else FragmentResultListener(listener)
+    setResultListener(requestKey, lifecycleOwner, resultListener)
+}
diff --git a/fragment/fragment/api/1.3.0-alpha04.txt b/fragment/fragment/api/1.3.0-alpha04.txt
index 10b5c01..c562784 100644
--- a/fragment/fragment/api/1.3.0-alpha04.txt
+++ b/fragment/fragment/api/1.3.0-alpha04.txt
@@ -58,8 +58,8 @@
     method public final String getString(@StringRes int);
     method public final String getString(@StringRes int, java.lang.Object!...);
     method public final String? getTag();
-    method public final androidx.fragment.app.Fragment? getTargetFragment();
-    method public final int getTargetRequestCode();
+    method @Deprecated public final androidx.fragment.app.Fragment? getTargetFragment();
+    method @Deprecated public final int getTargetRequestCode();
     method public final CharSequence getText(@StringRes int);
     method @Deprecated public boolean getUserVisibleHint();
     method public android.view.View? getView();
@@ -115,8 +115,8 @@
     method @CallSuper @MainThread public void onViewStateRestored(android.os.Bundle?);
     method public void postponeEnterTransition();
     method public final void postponeEnterTransition(long, java.util.concurrent.TimeUnit);
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
     method public void registerForContextMenu(android.view.View);
     method public final void requestPermissions(String![], int);
     method public final androidx.fragment.app.FragmentActivity requireActivity();
@@ -141,7 +141,7 @@
     method public void setReturnTransition(Object?);
     method public void setSharedElementEnterTransition(Object?);
     method public void setSharedElementReturnTransition(Object?);
-    method public void setTargetFragment(androidx.fragment.app.Fragment?, int);
+    method @Deprecated public void setTargetFragment(androidx.fragment.app.Fragment?, int);
     method @Deprecated public void setUserVisibleHint(boolean);
     method public boolean shouldShowRequestPermissionRationale(String);
     method public void startActivity(android.content.Intent!);
@@ -267,7 +267,7 @@
     method public void onSupportInvalidateOptionsMenu();
   }
 
-  public abstract class FragmentManager {
+  public abstract class FragmentManager implements androidx.fragment.app.FragmentResultOwner {
     ctor public FragmentManager();
     method public void addOnBackStackChangedListener(androidx.fragment.app.FragmentManager.OnBackStackChangedListener);
     method public androidx.fragment.app.FragmentTransaction beginTransaction();
@@ -296,6 +296,8 @@
     method public void removeOnBackStackChangedListener(androidx.fragment.app.FragmentManager.OnBackStackChangedListener);
     method public androidx.fragment.app.Fragment.SavedState? saveFragmentInstanceState(androidx.fragment.app.Fragment);
     method public void setFragmentFactory(androidx.fragment.app.FragmentFactory);
+    method public final void setResult(String, android.os.Bundle?);
+    method public final void setResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener?);
     method public void unregisterFragmentLifecycleCallbacks(androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks);
     field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
   }
@@ -344,6 +346,15 @@
     field @Deprecated public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0; // 0x0
   }
 
+  public interface FragmentResultListener {
+    method public void onFragmentResult(String, android.os.Bundle);
+  }
+
+  public interface FragmentResultOwner {
+    method public void setResult(String, android.os.Bundle?);
+    method public void setResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener?);
+  }
+
   @Deprecated public abstract class FragmentStatePagerAdapter extends androidx.viewpager.widget.PagerAdapter {
     ctor @Deprecated public FragmentStatePagerAdapter(androidx.fragment.app.FragmentManager);
     ctor @Deprecated public FragmentStatePagerAdapter(androidx.fragment.app.FragmentManager, int);
diff --git a/fragment/fragment/api/current.txt b/fragment/fragment/api/current.txt
index 10b5c01..c562784 100644
--- a/fragment/fragment/api/current.txt
+++ b/fragment/fragment/api/current.txt
@@ -58,8 +58,8 @@
     method public final String getString(@StringRes int);
     method public final String getString(@StringRes int, java.lang.Object!...);
     method public final String? getTag();
-    method public final androidx.fragment.app.Fragment? getTargetFragment();
-    method public final int getTargetRequestCode();
+    method @Deprecated public final androidx.fragment.app.Fragment? getTargetFragment();
+    method @Deprecated public final int getTargetRequestCode();
     method public final CharSequence getText(@StringRes int);
     method @Deprecated public boolean getUserVisibleHint();
     method public android.view.View? getView();
@@ -115,8 +115,8 @@
     method @CallSuper @MainThread public void onViewStateRestored(android.os.Bundle?);
     method public void postponeEnterTransition();
     method public final void postponeEnterTransition(long, java.util.concurrent.TimeUnit);
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
     method public void registerForContextMenu(android.view.View);
     method public final void requestPermissions(String![], int);
     method public final androidx.fragment.app.FragmentActivity requireActivity();
@@ -141,7 +141,7 @@
     method public void setReturnTransition(Object?);
     method public void setSharedElementEnterTransition(Object?);
     method public void setSharedElementReturnTransition(Object?);
-    method public void setTargetFragment(androidx.fragment.app.Fragment?, int);
+    method @Deprecated public void setTargetFragment(androidx.fragment.app.Fragment?, int);
     method @Deprecated public void setUserVisibleHint(boolean);
     method public boolean shouldShowRequestPermissionRationale(String);
     method public void startActivity(android.content.Intent!);
@@ -267,7 +267,7 @@
     method public void onSupportInvalidateOptionsMenu();
   }
 
-  public abstract class FragmentManager {
+  public abstract class FragmentManager implements androidx.fragment.app.FragmentResultOwner {
     ctor public FragmentManager();
     method public void addOnBackStackChangedListener(androidx.fragment.app.FragmentManager.OnBackStackChangedListener);
     method public androidx.fragment.app.FragmentTransaction beginTransaction();
@@ -296,6 +296,8 @@
     method public void removeOnBackStackChangedListener(androidx.fragment.app.FragmentManager.OnBackStackChangedListener);
     method public androidx.fragment.app.Fragment.SavedState? saveFragmentInstanceState(androidx.fragment.app.Fragment);
     method public void setFragmentFactory(androidx.fragment.app.FragmentFactory);
+    method public final void setResult(String, android.os.Bundle?);
+    method public final void setResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener?);
     method public void unregisterFragmentLifecycleCallbacks(androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks);
     field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
   }
@@ -344,6 +346,15 @@
     field @Deprecated public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0; // 0x0
   }
 
+  public interface FragmentResultListener {
+    method public void onFragmentResult(String, android.os.Bundle);
+  }
+
+  public interface FragmentResultOwner {
+    method public void setResult(String, android.os.Bundle?);
+    method public void setResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener?);
+  }
+
   @Deprecated public abstract class FragmentStatePagerAdapter extends androidx.viewpager.widget.PagerAdapter {
     ctor @Deprecated public FragmentStatePagerAdapter(androidx.fragment.app.FragmentManager);
     ctor @Deprecated public FragmentStatePagerAdapter(androidx.fragment.app.FragmentManager, int);
diff --git a/fragment/fragment/api/public_plus_experimental_1.3.0-alpha04.txt b/fragment/fragment/api/public_plus_experimental_1.3.0-alpha04.txt
index 9492d43..fef4778 100644
--- a/fragment/fragment/api/public_plus_experimental_1.3.0-alpha04.txt
+++ b/fragment/fragment/api/public_plus_experimental_1.3.0-alpha04.txt
@@ -58,8 +58,8 @@
     method public final String getString(@StringRes int);
     method public final String getString(@StringRes int, java.lang.Object!...);
     method public final String? getTag();
-    method public final androidx.fragment.app.Fragment? getTargetFragment();
-    method public final int getTargetRequestCode();
+    method @Deprecated public final androidx.fragment.app.Fragment? getTargetFragment();
+    method @Deprecated public final int getTargetRequestCode();
     method public final CharSequence getText(@StringRes int);
     method @Deprecated public boolean getUserVisibleHint();
     method public android.view.View? getView();
@@ -115,8 +115,8 @@
     method @CallSuper @MainThread public void onViewStateRestored(android.os.Bundle?);
     method public void postponeEnterTransition();
     method public final void postponeEnterTransition(long, java.util.concurrent.TimeUnit);
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
     method public void registerForContextMenu(android.view.View);
     method public final void requestPermissions(String![], int);
     method public final androidx.fragment.app.FragmentActivity requireActivity();
@@ -141,7 +141,7 @@
     method public void setReturnTransition(Object?);
     method public void setSharedElementEnterTransition(Object?);
     method public void setSharedElementReturnTransition(Object?);
-    method public void setTargetFragment(androidx.fragment.app.Fragment?, int);
+    method @Deprecated public void setTargetFragment(androidx.fragment.app.Fragment?, int);
     method @Deprecated public void setUserVisibleHint(boolean);
     method public boolean shouldShowRequestPermissionRationale(String);
     method public void startActivity(android.content.Intent!);
@@ -267,7 +267,7 @@
     method public void onSupportInvalidateOptionsMenu();
   }
 
-  public abstract class FragmentManager {
+  public abstract class FragmentManager implements androidx.fragment.app.FragmentResultOwner {
     ctor public FragmentManager();
     method public void addOnBackStackChangedListener(androidx.fragment.app.FragmentManager.OnBackStackChangedListener);
     method public androidx.fragment.app.FragmentTransaction beginTransaction();
@@ -296,6 +296,8 @@
     method public void removeOnBackStackChangedListener(androidx.fragment.app.FragmentManager.OnBackStackChangedListener);
     method public androidx.fragment.app.Fragment.SavedState? saveFragmentInstanceState(androidx.fragment.app.Fragment);
     method public void setFragmentFactory(androidx.fragment.app.FragmentFactory);
+    method public final void setResult(String, android.os.Bundle?);
+    method public final void setResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener?);
     method public void unregisterFragmentLifecycleCallbacks(androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks);
     field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
   }
@@ -344,6 +346,15 @@
     field @Deprecated public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0; // 0x0
   }
 
+  public interface FragmentResultListener {
+    method public void onFragmentResult(String, android.os.Bundle);
+  }
+
+  public interface FragmentResultOwner {
+    method public void setResult(String, android.os.Bundle?);
+    method public void setResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener?);
+  }
+
   @Deprecated public abstract class FragmentStatePagerAdapter extends androidx.viewpager.widget.PagerAdapter {
     ctor @Deprecated public FragmentStatePagerAdapter(androidx.fragment.app.FragmentManager);
     ctor @Deprecated public FragmentStatePagerAdapter(androidx.fragment.app.FragmentManager, int);
diff --git a/fragment/fragment/api/public_plus_experimental_current.txt b/fragment/fragment/api/public_plus_experimental_current.txt
index 9492d43..fef4778 100644
--- a/fragment/fragment/api/public_plus_experimental_current.txt
+++ b/fragment/fragment/api/public_plus_experimental_current.txt
@@ -58,8 +58,8 @@
     method public final String getString(@StringRes int);
     method public final String getString(@StringRes int, java.lang.Object!...);
     method public final String? getTag();
-    method public final androidx.fragment.app.Fragment? getTargetFragment();
-    method public final int getTargetRequestCode();
+    method @Deprecated public final androidx.fragment.app.Fragment? getTargetFragment();
+    method @Deprecated public final int getTargetRequestCode();
     method public final CharSequence getText(@StringRes int);
     method @Deprecated public boolean getUserVisibleHint();
     method public android.view.View? getView();
@@ -115,8 +115,8 @@
     method @CallSuper @MainThread public void onViewStateRestored(android.os.Bundle?);
     method public void postponeEnterTransition();
     method public final void postponeEnterTransition(long, java.util.concurrent.TimeUnit);
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
     method public void registerForContextMenu(android.view.View);
     method public final void requestPermissions(String![], int);
     method public final androidx.fragment.app.FragmentActivity requireActivity();
@@ -141,7 +141,7 @@
     method public void setReturnTransition(Object?);
     method public void setSharedElementEnterTransition(Object?);
     method public void setSharedElementReturnTransition(Object?);
-    method public void setTargetFragment(androidx.fragment.app.Fragment?, int);
+    method @Deprecated public void setTargetFragment(androidx.fragment.app.Fragment?, int);
     method @Deprecated public void setUserVisibleHint(boolean);
     method public boolean shouldShowRequestPermissionRationale(String);
     method public void startActivity(android.content.Intent!);
@@ -267,7 +267,7 @@
     method public void onSupportInvalidateOptionsMenu();
   }
 
-  public abstract class FragmentManager {
+  public abstract class FragmentManager implements androidx.fragment.app.FragmentResultOwner {
     ctor public FragmentManager();
     method public void addOnBackStackChangedListener(androidx.fragment.app.FragmentManager.OnBackStackChangedListener);
     method public androidx.fragment.app.FragmentTransaction beginTransaction();
@@ -296,6 +296,8 @@
     method public void removeOnBackStackChangedListener(androidx.fragment.app.FragmentManager.OnBackStackChangedListener);
     method public androidx.fragment.app.Fragment.SavedState? saveFragmentInstanceState(androidx.fragment.app.Fragment);
     method public void setFragmentFactory(androidx.fragment.app.FragmentFactory);
+    method public final void setResult(String, android.os.Bundle?);
+    method public final void setResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener?);
     method public void unregisterFragmentLifecycleCallbacks(androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks);
     field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
   }
@@ -344,6 +346,15 @@
     field @Deprecated public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0; // 0x0
   }
 
+  public interface FragmentResultListener {
+    method public void onFragmentResult(String, android.os.Bundle);
+  }
+
+  public interface FragmentResultOwner {
+    method public void setResult(String, android.os.Bundle?);
+    method public void setResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener?);
+  }
+
   @Deprecated public abstract class FragmentStatePagerAdapter extends androidx.viewpager.widget.PagerAdapter {
     ctor @Deprecated public FragmentStatePagerAdapter(androidx.fragment.app.FragmentManager);
     ctor @Deprecated public FragmentStatePagerAdapter(androidx.fragment.app.FragmentManager, int);
diff --git a/fragment/fragment/api/restricted_1.3.0-alpha04.txt b/fragment/fragment/api/restricted_1.3.0-alpha04.txt
index 6c22d2d..009c606 100644
--- a/fragment/fragment/api/restricted_1.3.0-alpha04.txt
+++ b/fragment/fragment/api/restricted_1.3.0-alpha04.txt
@@ -60,8 +60,8 @@
     method public final String getString(@StringRes int);
     method public final String getString(@StringRes int, java.lang.Object!...);
     method public final String? getTag();
-    method public final androidx.fragment.app.Fragment? getTargetFragment();
-    method public final int getTargetRequestCode();
+    method @Deprecated public final androidx.fragment.app.Fragment? getTargetFragment();
+    method @Deprecated public final int getTargetRequestCode();
     method public final CharSequence getText(@StringRes int);
     method @Deprecated public boolean getUserVisibleHint();
     method public android.view.View? getView();
@@ -119,8 +119,8 @@
     method @CallSuper @MainThread public void onViewStateRestored(android.os.Bundle?);
     method public void postponeEnterTransition();
     method public final void postponeEnterTransition(long, java.util.concurrent.TimeUnit);
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
     method public void registerForContextMenu(android.view.View);
     method public final void requestPermissions(String![], int);
     method public final androidx.fragment.app.FragmentActivity requireActivity();
@@ -145,7 +145,7 @@
     method public void setReturnTransition(Object?);
     method public void setSharedElementEnterTransition(Object?);
     method public void setSharedElementReturnTransition(Object?);
-    method public void setTargetFragment(androidx.fragment.app.Fragment?, int);
+    method @Deprecated public void setTargetFragment(androidx.fragment.app.Fragment?, int);
     method @Deprecated public void setUserVisibleHint(boolean);
     method public boolean shouldShowRequestPermissionRationale(String);
     method public void startActivity(android.content.Intent!);
@@ -272,7 +272,7 @@
     method public void onSupportInvalidateOptionsMenu();
   }
 
-  public abstract class FragmentManager {
+  public abstract class FragmentManager implements androidx.fragment.app.FragmentResultOwner {
     ctor public FragmentManager();
     method public void addOnBackStackChangedListener(androidx.fragment.app.FragmentManager.OnBackStackChangedListener);
     method public androidx.fragment.app.FragmentTransaction beginTransaction();
@@ -302,6 +302,8 @@
     method public void removeOnBackStackChangedListener(androidx.fragment.app.FragmentManager.OnBackStackChangedListener);
     method public androidx.fragment.app.Fragment.SavedState? saveFragmentInstanceState(androidx.fragment.app.Fragment);
     method public void setFragmentFactory(androidx.fragment.app.FragmentFactory);
+    method public final void setResult(String, android.os.Bundle?);
+    method public final void setResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener?);
     method public void unregisterFragmentLifecycleCallbacks(androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks);
     field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
   }
@@ -350,6 +352,15 @@
     field @Deprecated public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0; // 0x0
   }
 
+  public interface FragmentResultListener {
+    method public void onFragmentResult(String, android.os.Bundle);
+  }
+
+  public interface FragmentResultOwner {
+    method public void setResult(String, android.os.Bundle?);
+    method public void setResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener?);
+  }
+
   @Deprecated public abstract class FragmentStatePagerAdapter extends androidx.viewpager.widget.PagerAdapter {
     ctor @Deprecated public FragmentStatePagerAdapter(androidx.fragment.app.FragmentManager);
     ctor @Deprecated public FragmentStatePagerAdapter(androidx.fragment.app.FragmentManager, int);
diff --git a/fragment/fragment/api/restricted_current.txt b/fragment/fragment/api/restricted_current.txt
index 6c22d2d..009c606 100644
--- a/fragment/fragment/api/restricted_current.txt
+++ b/fragment/fragment/api/restricted_current.txt
@@ -60,8 +60,8 @@
     method public final String getString(@StringRes int);
     method public final String getString(@StringRes int, java.lang.Object!...);
     method public final String? getTag();
-    method public final androidx.fragment.app.Fragment? getTargetFragment();
-    method public final int getTargetRequestCode();
+    method @Deprecated public final androidx.fragment.app.Fragment? getTargetFragment();
+    method @Deprecated public final int getTargetRequestCode();
     method public final CharSequence getText(@StringRes int);
     method @Deprecated public boolean getUserVisibleHint();
     method public android.view.View? getView();
@@ -119,8 +119,8 @@
     method @CallSuper @MainThread public void onViewStateRestored(android.os.Bundle?);
     method public void postponeEnterTransition();
     method public final void postponeEnterTransition(long, java.util.concurrent.TimeUnit);
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
-    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> prepareCall(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
     method public void registerForContextMenu(android.view.View);
     method public final void requestPermissions(String![], int);
     method public final androidx.fragment.app.FragmentActivity requireActivity();
@@ -145,7 +145,7 @@
     method public void setReturnTransition(Object?);
     method public void setSharedElementEnterTransition(Object?);
     method public void setSharedElementReturnTransition(Object?);
-    method public void setTargetFragment(androidx.fragment.app.Fragment?, int);
+    method @Deprecated public void setTargetFragment(androidx.fragment.app.Fragment?, int);
     method @Deprecated public void setUserVisibleHint(boolean);
     method public boolean shouldShowRequestPermissionRationale(String);
     method public void startActivity(android.content.Intent!);
@@ -272,7 +272,7 @@
     method public void onSupportInvalidateOptionsMenu();
   }
 
-  public abstract class FragmentManager {
+  public abstract class FragmentManager implements androidx.fragment.app.FragmentResultOwner {
     ctor public FragmentManager();
     method public void addOnBackStackChangedListener(androidx.fragment.app.FragmentManager.OnBackStackChangedListener);
     method public androidx.fragment.app.FragmentTransaction beginTransaction();
@@ -302,6 +302,8 @@
     method public void removeOnBackStackChangedListener(androidx.fragment.app.FragmentManager.OnBackStackChangedListener);
     method public androidx.fragment.app.Fragment.SavedState? saveFragmentInstanceState(androidx.fragment.app.Fragment);
     method public void setFragmentFactory(androidx.fragment.app.FragmentFactory);
+    method public final void setResult(String, android.os.Bundle?);
+    method public final void setResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener?);
     method public void unregisterFragmentLifecycleCallbacks(androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks);
     field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
   }
@@ -350,6 +352,15 @@
     field @Deprecated public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0; // 0x0
   }
 
+  public interface FragmentResultListener {
+    method public void onFragmentResult(String, android.os.Bundle);
+  }
+
+  public interface FragmentResultOwner {
+    method public void setResult(String, android.os.Bundle?);
+    method public void setResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener?);
+  }
+
   @Deprecated public abstract class FragmentStatePagerAdapter extends androidx.viewpager.widget.PagerAdapter {
     ctor @Deprecated public FragmentStatePagerAdapter(androidx.fragment.app.FragmentManager);
     ctor @Deprecated public FragmentStatePagerAdapter(androidx.fragment.app.FragmentManager, int);
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentResultTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentResultTest.kt
new file mode 100644
index 0000000..13fbf79
--- /dev/null
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentResultTest.kt
@@ -0,0 +1,245 @@
+/*
+ * 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.fragment.app
+
+import android.os.Bundle
+import androidx.fragment.app.test.FragmentTestActivity
+import androidx.fragment.test.R
+import androidx.test.core.app.ActivityScenario
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.testutils.withActivity
+import com.google.common.truth.Truth.assertWithMessage
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@LargeTest
+class FragmentResultTest {
+
+    @Test
+    fun testReplaceResult() {
+        with(ActivityScenario.launch(FragmentTestActivity::class.java)) {
+            val fm = withActivity {
+                setContentView(R.layout.simple_container)
+                supportFragmentManager
+            }
+            val fragment1 = ResultFragment()
+
+            fm.beginTransaction()
+                .add(R.id.fragmentContainer, fragment1)
+                .commit()
+            executePendingTransactions()
+
+            val fragment2 = StrictFragment()
+
+            fm.beginTransaction()
+                .replace(R.id.fragmentContainer, fragment2)
+                .addToBackStack(null)
+                .commit()
+            executePendingTransactions()
+
+            val resultBundle = Bundle()
+            val expectedResult = "resultGood"
+            resultBundle.putString("bundleKey", expectedResult)
+
+            fm.setResult("requestKey", resultBundle)
+
+            assertWithMessage("The result is not set")
+                .that(fragment1.actualResult)
+                .isNull()
+
+            withActivity {
+                fm.popBackStackImmediate()
+            }
+
+            assertWithMessage("The result is incorrect")
+                .that(fragment1.actualResult)
+                .isEqualTo(expectedResult)
+        }
+    }
+
+    @Test
+    fun testSetResultWhileResumed() {
+        with(ActivityScenario.launch(FragmentTestActivity::class.java)) {
+            val fm = withActivity {
+                setContentView(R.layout.simple_container)
+                supportFragmentManager
+            }
+            val fragment1 = ResultFragment()
+
+            fm.beginTransaction()
+                .add(R.id.fragmentContainer, fragment1)
+                .commit()
+            executePendingTransactions()
+
+            val fragment2 = StrictFragment()
+
+            fm.beginTransaction()
+                .add(R.id.fragmentContainer, fragment2)
+                .commit()
+            executePendingTransactions()
+
+            val resultBundle = Bundle()
+            val expectedResult = "resultGood"
+            resultBundle.putString("bundleKey", expectedResult)
+
+            fm.setResult("requestKey", resultBundle)
+
+            assertWithMessage("The result is incorrect")
+                .that(fragment1.actualResult)
+                .isEqualTo(expectedResult)
+        }
+    }
+
+    @Test
+    fun testStoredSetResultWhileResumed() {
+        with(ActivityScenario.launch(FragmentTestActivity::class.java)) {
+            val fm = withActivity {
+                setContentView(R.layout.simple_container)
+                supportFragmentManager
+            }
+            val fragment1 = StrictFragment()
+            var actualResult: String? = null
+
+            fm.beginTransaction()
+                .add(R.id.fragmentContainer, fragment1)
+                .commit()
+            executePendingTransactions()
+
+            val resultBundle = Bundle()
+            val expectedResult = "resultGood"
+            resultBundle.putString("bundleKey", expectedResult)
+
+            fm.setResult("requestKey", resultBundle)
+
+            fm.setResultListener("requestKey", fragment1, FragmentResultListener
+            { _, bundle -> actualResult = bundle.getString("bundleKey") })
+
+            assertWithMessage("The result is incorrect")
+                .that(actualResult)
+                .isEqualTo(expectedResult)
+        }
+    }
+
+    @Test
+    fun testReplaceResultSavedRestore() {
+        with(ActivityScenario.launch(FragmentTestActivity::class.java)) {
+            var fm = withActivity {
+                setContentView(R.layout.simple_container)
+                supportFragmentManager
+            }
+            var fragment1 = ResultFragment()
+
+            fm.beginTransaction()
+                .add(R.id.fragmentContainer, fragment1, "fragment1")
+                .commit()
+            executePendingTransactions()
+
+            val fragment2 = StrictFragment()
+
+            fm.beginTransaction()
+                .replace(R.id.fragmentContainer, fragment2)
+                .addToBackStack(null)
+                .commit()
+            executePendingTransactions()
+
+            val resultBundle = Bundle()
+            val expectedResult = "resultGood"
+            resultBundle.putString("bundleKey", expectedResult)
+
+            fm.setResult("requestKey", resultBundle)
+
+            assertWithMessage("The result is not set")
+                .that(fragment1.actualResult)
+                .isNull()
+
+            recreate()
+
+            fm = withActivity { supportFragmentManager }
+
+            withActivity {
+                fm.popBackStackImmediate()
+            }
+
+            fragment1 = fm.findFragmentByTag("fragment1") as ResultFragment
+
+            assertWithMessage("The result is incorrect")
+                .that(fragment1.actualResult)
+                .isEqualTo(expectedResult)
+        }
+    }
+
+    @Test
+    fun testChildFragmentResult() {
+        with(ActivityScenario.launch(FragmentTestActivity::class.java)) {
+            val fm = withActivity {
+                setContentView(R.layout.simple_container)
+                supportFragmentManager
+            }
+            val parent = ParentResultFragment()
+
+            fm.beginTransaction()
+                .add(R.id.fragmentContainer, parent)
+                .commit()
+            executePendingTransactions()
+
+            val child = ChildResultFragment()
+
+            parent.childFragmentManager.beginTransaction()
+                .add(child, "child")
+                .commit()
+            executePendingTransactions()
+
+            assertWithMessage("The result is incorrect")
+                .that(parent.actualResult)
+                .isEqualTo("resultGood")
+        }
+    }
+}
+
+class ResultFragment : StrictFragment() {
+    var actualResult: String? = null
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        parentFragmentManager.setResultListener("requestKey", this, FragmentResultListener
+        { _, bundle -> actualResult = bundle.getString("bundleKey") })
+    }
+}
+
+class ParentResultFragment : StrictFragment() {
+    var actualResult: String? = null
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        childFragmentManager.setResultListener("requestKey", this, FragmentResultListener
+        { _, bundle -> actualResult = bundle.getString("bundleKey") })
+    }
+}
+
+class ChildResultFragment : StrictFragment() {
+    override fun onStart() {
+        super.onStart()
+        val resultBundle = Bundle().apply {
+            putString("bundleKey", "resultGood")
+        }
+        parentFragmentManager.setResult("requestKey", resultBundle)
+    }
+}
\ No newline at end of file
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.kt
index a942c72..10a644c 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.kt
@@ -204,6 +204,7 @@
 
     // Test that shared elements transition from one fragment to the next
     // and back during pop.
+    @Suppress("DEPRECATION")
     @Test
     fun sharedElementWithTargetFragment() {
         val fragment1 = setupInitialFragment()
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/TargetFragmentLifeCycleTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/TargetFragmentLifeCycleTest.kt
index 43c4770..aef943b 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/TargetFragmentLifeCycleTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/TargetFragmentLifeCycleTest.kt
@@ -30,6 +30,7 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
+@Suppress("DEPRECATION")
 @RunWith(AndroidJUnit4::class)
 @MediumTest
 class TargetFragmentLifeCycleTest {
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java b/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
index 345ca07..d52ccb2 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
@@ -737,8 +737,19 @@
      * @param fragment The fragment that is the target of this one.
      * @param requestCode Optional request code, for convenience if you
      * are going to call back with {@link #onActivityResult(int, int, Intent)}.
+     *
+     * @deprecated Instead of using a target fragment to pass results, the fragment requesting a
+     * result should use
+     * {@link FragmentManager#setResultListener(String, LifecycleOwner, FragmentResultListener)}
+     * to register a {@link FragmentResultListener} with a {@code requestKey} using its
+     * {@link #getParentFragmentManager() parent fragment manager}. The
+     * fragment delivering a result should then call
+     * {@link FragmentManager#setResult(String, Bundle)} using the same {@code requestKey}.
+     * Consider using {@link #setArguments} to pass the {@code requestKey} if you need to support
+     * dynamic request keys.
      */
-    @SuppressWarnings("ReferenceEquality")
+    @SuppressWarnings("ReferenceEquality, deprecation")
+    @Deprecated
     public void setTargetFragment(@Nullable Fragment fragment, int requestCode) {
         // Don't allow a caller to set a target fragment in another FragmentManager,
         // but there's a snag: people do set target fragments before fragments get added.
@@ -754,7 +765,7 @@
 
         // Don't let someone create a cycle.
         for (Fragment check = fragment; check != null; check = check.getTargetFragment()) {
-            if (check == this) {
+            if (check.equals(this)) {
                 throw new IllegalArgumentException("Setting " + fragment + " as the target of "
                         + this + " would create a target cycle");
             }
@@ -776,8 +787,14 @@
 
     /**
      * Return the target fragment set by {@link #setTargetFragment}.
+     *
+     * @deprecated Instead of using a target fragment to pass results, use
+     * {@link FragmentManager#setResult(String, Bundle)} to deliver results to
+     * {@link FragmentResultListener} instances registered by other fragments via
+     * {@link FragmentManager#setResultListener(String, LifecycleOwner, FragmentResultListener)}.
      */
     @Nullable
+    @Deprecated
     final public Fragment getTargetFragment() {
         if (mTarget != null) {
             // Ensure that any Fragment set with setTargetFragment is immediately
@@ -792,7 +809,13 @@
 
     /**
      * Return the target request code set by {@link #setTargetFragment}.
+     *
+     * @deprecated When using the target fragment replacement of
+     * {@link FragmentManager#setResultListener(String, LifecycleOwner, FragmentResultListener)} and
+     * {@link FragmentManager#setResult(String, Bundle)}, consider using {@link #setArguments} to
+     * pass a {@code requestKey} if you need to support dynamic request keys.
      */
+    @Deprecated
     final public int getTargetRequestCode() {
         return mTargetRequestCode;
     }
@@ -3121,7 +3144,7 @@
 
     @NonNull
     @Override
-    public final <I, O> ActivityResultLauncher<I> prepareCall(
+    public final <I, O> ActivityResultLauncher<I> registerForActivityResult(
             @NonNull final ActivityResultContract<I, O> contract,
             @NonNull final ActivityResultCallback<O> callback) {
         return prepareCallInternal(contract, new Function<Void, ActivityResultRegistry>() {
@@ -3134,7 +3157,7 @@
 
     @NonNull
     @Override
-    public final <I, O> ActivityResultLauncher<I> prepareCall(
+    public final <I, O> ActivityResultLauncher<I> registerForActivityResult(
             @NonNull final ActivityResultContract<I, O> contract,
             @NonNull final ActivityResultRegistry registry,
             @NonNull final ActivityResultCallback<O> callback) {
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
index 8841dbf..b48fe37 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
@@ -20,6 +20,7 @@
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.ContextWrapper;
 import android.content.res.Configuration;
@@ -48,6 +49,7 @@
 import androidx.core.os.CancellationSignal;
 import androidx.fragment.R;
 import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleEventObserver;
 import androidx.lifecycle.LifecycleOwner;
 import androidx.lifecycle.ViewModelStore;
 import androidx.lifecycle.ViewModelStoreOwner;
@@ -72,7 +74,7 @@
  * you can acquire the {@link FragmentManager} by calling
  * {@link FragmentActivity#getSupportFragmentManager}.
  */
-public abstract class FragmentManager {
+public abstract class FragmentManager implements FragmentResultOwner {
     private static boolean DEBUG = false;
     static final String TAG = "FragmentManager";
     static boolean USE_STATE_MANAGER = false;
@@ -184,6 +186,30 @@
     }
 
     /**
+     * A {@link FragmentResultListener} that is lifecycle aware so that
+     * the listener can be fired when the lifecycle is {@link Lifecycle.State#STARTED}.
+     */
+    private static class LifecycleAwareResultListener implements FragmentResultListener {
+        private final Lifecycle mLifecycle;
+        private final FragmentResultListener mListener;
+
+        LifecycleAwareResultListener(@NonNull Lifecycle lifecycle,
+                @NonNull FragmentResultListener listener) {
+            mLifecycle = lifecycle;
+            mListener = listener;
+        }
+
+        public boolean isAtLeast(Lifecycle.State state) {
+            return mLifecycle.getCurrentState().isAtLeast(state);
+        }
+
+        @Override
+        public void onFragmentResult(@NonNull String requestKey, @NonNull Bundle result) {
+            mListener.onFragmentResult(requestKey, result);
+        }
+    }
+
+    /**
      * Callback interface for listening to fragment state changes that happen
      * within a given FragmentManager.
      */
@@ -361,6 +387,10 @@
 
     private final AtomicInteger mBackStackIndex = new AtomicInteger();
 
+    private final ConcurrentHashMap<String, Bundle> mResults = new ConcurrentHashMap<>();
+    private final ConcurrentHashMap<String, LifecycleAwareResultListener> mResultListeners =
+            new ConcurrentHashMap<>();
+
     private ArrayList<OnBackStackChangedListener> mBackStackChangeListeners;
     private ConcurrentHashMap<Fragment, HashSet<CancellationSignal>>
             mExitAnimationCancellationSignals = new ConcurrentHashMap<>();
@@ -750,6 +780,65 @@
         }
     }
 
+    @Override
+    public final void setResult(@NonNull String requestKey, @Nullable Bundle result) {
+        if (result == null) {
+            // if the given result is null, remove the result
+            mResults.remove(requestKey);
+            return;
+        }
+
+        // Check if there is a listener waiting for a result with this key
+        LifecycleAwareResultListener resultListener = mResultListeners.get(requestKey);
+        // if there is and it is started, fire the callback
+        if (resultListener != null && resultListener.isAtLeast(Lifecycle.State.STARTED)) {
+            resultListener.onFragmentResult(requestKey, result);
+        } else {
+            // else, save the result for later
+            mResults.put(requestKey, result);
+        }
+    }
+
+    @SuppressLint("SyntheticAccessor")
+    @Override
+    public final void setResultListener(@NonNull final String requestKey,
+            @NonNull final LifecycleOwner lifecycleOwner,
+            @Nullable final FragmentResultListener listener) {
+        if (listener == null) {
+            mResultListeners.remove(requestKey);
+            return;
+        }
+
+        final Lifecycle lifecycle = lifecycleOwner.getLifecycle();
+        if (lifecycle.getCurrentState() == Lifecycle.State.DESTROYED) {
+            return;
+        }
+
+        LifecycleEventObserver observer = new LifecycleEventObserver() {
+            @Override
+            public void onStateChanged(@NonNull LifecycleOwner source,
+                    @NonNull Lifecycle.Event event) {
+                if (event == Lifecycle.Event.ON_START) {
+                    // once we are started, check for any stored results
+                    Bundle storedResult = mResults.get(requestKey);
+                    if (storedResult != null) {
+                        // if there is a result, fire the callback
+                        listener.onFragmentResult(requestKey, storedResult);
+                        // and clear the result
+                        setResult(requestKey, null);
+                    }
+                }
+
+                if (event == Lifecycle.Event.ON_DESTROY) {
+                    lifecycle.removeObserver(this);
+                    mResultListeners.remove(requestKey);
+                }
+            }
+        };
+        lifecycle.addObserver(observer);
+        mResultListeners.put(requestKey, new LifecycleAwareResultListener(lifecycle, listener));
+    }
+
     /**
      * Put a reference to a fragment in a Bundle.  This Bundle can be
      * persisted as saved state, and when later restoring
@@ -2449,6 +2538,8 @@
         if (mPrimaryNav != null) {
             fms.mPrimaryNavActiveWho = mPrimaryNav.mWho;
         }
+        fms.mResultKeys.addAll(mResults.keySet());
+        fms.mResults.addAll(mResults.values());
         return fms;
     }
 
@@ -2550,6 +2641,13 @@
             mPrimaryNav = findActiveFragment(fms.mPrimaryNavActiveWho);
             dispatchParentPrimaryNavigationFragmentChanged(mPrimaryNav);
         }
+
+        ArrayList<String> savedResultKeys = fms.mResultKeys;
+        if (savedResultKeys != null) {
+            for (int i = 0; i < savedResultKeys.size(); i++) {
+                mResults.put(savedResultKeys.get(i), fms.mResults.get(i));
+            }
+        }
     }
 
     @NonNull
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManagerState.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManagerState.java
index a3dbe08..f8a0dea 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManagerState.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManagerState.java
@@ -17,6 +17,7 @@
 package androidx.fragment.app;
 
 import android.annotation.SuppressLint;
+import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -29,6 +30,8 @@
     BackStackState[] mBackStack;
     int mBackStackIndex;
     String mPrimaryNavActiveWho = null;
+    ArrayList<String> mResultKeys = new ArrayList<>();
+    ArrayList<Bundle> mResults = new ArrayList<>();
 
     public FragmentManagerState() {
     }
@@ -39,6 +42,8 @@
         mBackStack = in.createTypedArray(BackStackState.CREATOR);
         mBackStackIndex = in.readInt();
         mPrimaryNavActiveWho = in.readString();
+        mResultKeys = in.createStringArrayList();
+        mResults = in.createTypedArrayList(Bundle.CREATOR);
     }
 
     @Override
@@ -53,6 +58,8 @@
         dest.writeTypedArray(mBackStack, flags);
         dest.writeInt(mBackStackIndex);
         dest.writeString(mPrimaryNavActiveWho);
+        dest.writeStringList(mResultKeys);
+        dest.writeTypedList(mResults);
     }
 
     public static final Parcelable.Creator<FragmentManagerState> CREATOR
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentResultListener.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentResultListener.java
new file mode 100644
index 0000000..a1386ec
--- /dev/null
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentResultListener.java
@@ -0,0 +1,42 @@
+/*
+ * 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.fragment.app;
+
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.LifecycleOwner;
+
+/**
+ * Listener for handling fragment results.
+ *
+ * This object should be passed to
+ * {@link FragmentManager#setResultListener(String, LifecycleOwner, FragmentResultListener)} and
+ * it will listen for results with the same key that are passed into
+ * {@link FragmentManager#setResult(String, Bundle)}.
+ *
+ * @see FragmentResultOwner#setResultListener
+ */
+public interface FragmentResultListener {
+    /**
+     * Callback used to handle results passed between fragments.
+     *
+     * @param requestKey key used to store the result
+     * @param result result passed to the callback
+     */
+    void onFragmentResult(@NonNull String requestKey, @NonNull Bundle result);
+}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentResultOwner.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentResultOwner.java
new file mode 100644
index 0000000..8368a2d
--- /dev/null
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentResultOwner.java
@@ -0,0 +1,62 @@
+/*
+ * 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.fragment.app;
+
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.lifecycle.LifecycleOwner;
+
+/**
+ * A class that manages passing data between fragments.
+ */
+public interface FragmentResultOwner {
+
+    /**
+     * Sets the given result for the requestKey. This result will be delivered to a
+     * {@link FragmentResultListener} that is called given to
+     * {@link #setResultListener(String, LifecycleOwner, FragmentResultListener)} with the same
+     * requestKey. If no {@link FragmentResultListener} with the same key is set or the Lifecycle
+     * associated with the listener is not at least
+     * {@link androidx.lifecycle.Lifecycle.State#STARTED}, the result is stored until one becomes
+     * available, or a null result with the same requestKey is set.
+     *
+     * @param requestKey key used to identify the result
+     * @param result the result to be passed to another fragment or {@code null} if you want to
+     *               clear out any pending result.
+     */
+    void setResult(@NonNull String requestKey, @Nullable Bundle result);
+
+    /**
+     * Sets the {@link FragmentResultListener} for a given requestKey. Once the given
+     * {@link LifecycleOwner} is at least in the {@link androidx.lifecycle.Lifecycle.State#STARTED}
+     * state, any results set by {@link #setResult(String, Bundle)} using the same requestKey
+     * will be delivered to the
+     * {@link FragmentResultListener#onFragmentResult(String, Bundle) callback}. The callback will
+     * remain active until the LifecycleOwner reaches the
+     * {@link androidx.lifecycle.Lifecycle.State#DESTROYED} state or a null
+     * {@link FragmentResultListener} is set for the same requestKey.
+     *
+     * @param requestKey requestKey used to store the result
+     * @param lifecycleOwner lifecycleOwner for handling the result
+     * @param listener listener for result changes or {@code null} to remove any previously
+     *                 registered listener.
+     */
+    void setResultListener(@NonNull String requestKey, @NonNull LifecycleOwner lifecycleOwner,
+            @Nullable FragmentResultListener listener);
+}
diff --git a/fragment/fragment/src/test/java/androidx/fragment/app/FragmentPagerActivity.kt b/fragment/fragment/src/test/java/androidx/fragment/app/FragmentPagerActivity.kt
index 958c7e8..4d3c9cf 100644
--- a/fragment/fragment/src/test/java/androidx/fragment/app/FragmentPagerActivity.kt
+++ b/fragment/fragment/src/test/java/androidx/fragment/app/FragmentPagerActivity.kt
@@ -1,3 +1,5 @@
+@file:Suppress("DEPRECATION")
+
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
diff --git a/gridlayout/gridlayout/build.gradle b/gridlayout/gridlayout/build.gradle
index e7291d7..613a911 100644
--- a/gridlayout/gridlayout/build.gradle
+++ b/gridlayout/gridlayout/build.gradle
@@ -10,7 +10,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    implementation(project(":core:core"))
+    implementation("androidx.core:core:1.3.0-beta01")
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/heifwriter/heifwriter/src/androidTest/java/androidx/heifwriter/HeifWriterTest.java b/heifwriter/heifwriter/src/androidTest/java/androidx/heifwriter/HeifWriterTest.java
index 2a965f3..d1b6cb92 100644
--- a/heifwriter/heifwriter/src/androidTest/java/androidx/heifwriter/HeifWriterTest.java
+++ b/heifwriter/heifwriter/src/androidTest/java/androidx/heifwriter/HeifWriterTest.java
@@ -122,7 +122,7 @@
     @Before
     public void setUp() throws Exception {
         for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
-            String outputPath = new File(Environment.getExternalStorageDirectory(),
+            String outputPath = new File(getApplicationContext().getExternalFilesDir(null),
                     IMAGE_FILENAMES[i]).getAbsolutePath();
 
             InputStream inputStream = null;
@@ -147,9 +147,8 @@
     @After
     public void tearDown() throws Exception {
         for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
-            String imageFilePath =
-                    new File(Environment.getExternalStorageDirectory(), IMAGE_FILENAMES[i])
-                            .getAbsolutePath();
+            String imageFilePath = new File(getApplicationContext().getExternalFilesDir(null),
+                    IMAGE_FILENAMES[i]).getAbsolutePath();
             File imageFile = new File(imageFilePath);
             if (imageFile.exists()) {
                 imageFile.delete();
@@ -236,7 +235,7 @@
 
         TestConfig.Builder builder = new TestConfig.Builder(INPUT_MODE_BITMAP, false, false);
         for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
-            String inputPath = new File(Environment.getExternalStorageDirectory(),
+            String inputPath = new File(getApplicationContext().getExternalFilesDir(null),
                     IMAGE_FILENAMES[i]).getAbsolutePath();
             doTestForVariousNumberImages(builder.setInputPath(inputPath));
         }
@@ -249,7 +248,7 @@
 
         TestConfig.Builder builder = new TestConfig.Builder(INPUT_MODE_BITMAP, true, false);
         for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
-            String inputPath = new File(Environment.getExternalStorageDirectory(),
+            String inputPath = new File(getApplicationContext().getExternalFilesDir(null),
                     IMAGE_FILENAMES[i]).getAbsolutePath();
             doTestForVariousNumberImages(builder.setInputPath(inputPath));
         }
@@ -262,7 +261,7 @@
 
         TestConfig.Builder builder = new TestConfig.Builder(INPUT_MODE_BITMAP, false, true);
         for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
-            String inputPath = new File(Environment.getExternalStorageDirectory(),
+            String inputPath = new File(getApplicationContext().getExternalFilesDir(null),
                     IMAGE_FILENAMES[i]).getAbsolutePath();
             doTestForVariousNumberImages(builder.setInputPath(inputPath));
         }
@@ -275,7 +274,7 @@
 
         TestConfig.Builder builder = new TestConfig.Builder(INPUT_MODE_BITMAP, true, true);
         for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
-            String inputPath = new File(Environment.getExternalStorageDirectory(),
+            String inputPath = new File(getApplicationContext().getExternalFilesDir(null),
                     IMAGE_FILENAMES[i]).getAbsolutePath();
             doTestForVariousNumberImages(builder.setInputPath(inputPath));
         }
@@ -389,7 +388,7 @@
                 mHeight = 1080;
                 mRotation = 0;
                 mQuality = 100;
-                mOutputPath = new File(Environment.getExternalStorageDirectory(),
+                mOutputPath = new File(getApplicationContext().getExternalFilesDir(null),
                         OUTPUT_FILENAME).getAbsolutePath();
             }
 
diff --git a/hilt/OWNERS b/hilt/OWNERS
new file mode 100644
index 0000000..8ffebfc
--- /dev/null
+++ b/hilt/OWNERS
@@ -0,0 +1 @@
+danysantiago@google.com
\ No newline at end of file
diff --git a/lifecycle/lifecycle-viewmodel-hilt-common/build.gradle b/hilt/common/build.gradle
similarity index 81%
rename from lifecycle/lifecycle-viewmodel-hilt-common/build.gradle
rename to hilt/common/build.gradle
index a56c8c8..cd5bbe8 100644
--- a/lifecycle/lifecycle-viewmodel-hilt-common/build.gradle
+++ b/hilt/common/build.gradle
@@ -31,11 +31,11 @@
 }
 
 androidx {
-    name = "Android Lifecycle ViewModel Hilt Extension Annotations"
+    name = "AndroidX Hilt Extension Annotations"
     publish = Publish.NONE
-    mavenVersion = LibraryVersions.LIFECYCLE
-    mavenGroup = LibraryGroups.LIFECYCLE
+    mavenVersion = LibraryVersions.HILT
+    mavenGroup = LibraryGroups.HILT
     inceptionYear = "2020"
-    description = "Android Lifecycle ViewModel Hilt Extension Annotations"
+    description = "AndroidX Hilt Extension Annotations"
     url = AndroidXExtension.ARCHITECTURE_URL
 }
\ No newline at end of file
diff --git a/lifecycle/lifecycle-viewmodel-hilt-common/src/main/java/androidx/lifecycle/hilt/ViewModelInject.java b/hilt/common/src/main/java/androidx/hilt/lifecycle/ViewModelInject.java
similarity index 96%
rename from lifecycle/lifecycle-viewmodel-hilt-common/src/main/java/androidx/lifecycle/hilt/ViewModelInject.java
rename to hilt/common/src/main/java/androidx/hilt/lifecycle/ViewModelInject.java
index db9559c..185aa70 100644
--- a/lifecycle/lifecycle-viewmodel-hilt-common/src/main/java/androidx/lifecycle/hilt/ViewModelInject.java
+++ b/hilt/common/src/main/java/androidx/hilt/lifecycle/ViewModelInject.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.lifecycle.hilt;
+package androidx.hilt.lifecycle;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
diff --git a/lifecycle/lifecycle-viewmodel-hilt-compiler/build.gradle b/hilt/compiler/build.gradle
similarity index 76%
rename from lifecycle/lifecycle-viewmodel-hilt-compiler/build.gradle
rename to hilt/compiler/build.gradle
index 31328c2..11d4a47 100644
--- a/lifecycle/lifecycle-viewmodel-hilt-compiler/build.gradle
+++ b/hilt/compiler/build.gradle
@@ -30,7 +30,7 @@
 }
 
 dependencies {
-    implementation(project(":lifecycle:lifecycle-viewmodel-hilt-common"))
+    implementation(project(":hilt:hilt-common"))
 
     implementation(KOTLIN_STDLIB)
     compileOnly(AUTO_SERVICE_ANNOTATIONS)
@@ -44,20 +44,20 @@
     testImplementation(TRUTH)
     testImplementation(GOOGLE_COMPILE_TESTING)
     testImplementation fileTree(
-            dir: "${new File(project(":lifecycle:lifecycle-viewmodel-hilt").buildDir, "libJar")}",
+            dir: "${new File(project(":hilt:hilt-lifecycle-viewmodel").buildDir, "libJar")}",
             include : "*.jar")
     testImplementation(HILT_ANDROID)
 }
 
-tasks.findByName("compileKotlin").dependsOn(":lifecycle:lifecycle-viewmodel-hilt:jarDebug")
+tasks.findByName("compileKotlin").dependsOn(":hilt:hilt-lifecycle-viewmodel:jarDebug")
 
 androidx {
-    name = "Android Lifecycle ViewModel Hilt Extension Compiler"
+    name = "AndroidX Hilt Extension Compiler"
     publish = Publish.NONE
-    mavenVersion = LibraryVersions.LIFECYCLE
-    mavenGroup = LibraryGroups.LIFECYCLE
+    mavenVersion = LibraryVersions.HILT
+    mavenGroup = LibraryGroups.HILT
     inceptionYear = "2020"
-    description = "Android Lifecycle ViewModel Hilt Extension Compiler"
+    description = "AndroidX Hilt Extension Compiler"
     url = AndroidXExtension.ARCHITECTURE_URL
     compilationTarget = CompilationTarget.HOST
 }
\ No newline at end of file
diff --git a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/main/kotlin/androidx/lifecycle/hilt/ClassNames.kt b/hilt/compiler/src/main/kotlin/androidx/hilt/ClassNames.kt
similarity index 88%
rename from lifecycle/lifecycle-viewmodel-hilt-compiler/src/main/kotlin/androidx/lifecycle/hilt/ClassNames.kt
rename to hilt/compiler/src/main/kotlin/androidx/hilt/ClassNames.kt
index 9310102..2499be3 100644
--- a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/main/kotlin/androidx/lifecycle/hilt/ClassNames.kt
+++ b/hilt/compiler/src/main/kotlin/androidx/hilt/ClassNames.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.lifecycle.hilt
+package androidx.hilt
 
 import com.squareup.javapoet.ClassName
 
@@ -29,8 +29,8 @@
     val MODULE = ClassName.get("dagger", "Module")
     val PROVIDER = ClassName.get("javax.inject", "Provider")
     val VIEW_MODEL_ASSISTED_FACTORY =
-        ClassName.get("androidx.lifecycle.hilt", "ViewModelAssistedFactory")
+        ClassName.get("androidx.hilt.lifecycle", "ViewModelAssistedFactory")
     val VIEW_MODEL = ClassName.get("androidx.lifecycle", "ViewModel")
-    val VIEW_MODEL_KEY = ClassName.get("androidx.lifecycle.hilt", "ViewModelKey")
     val SAVED_STATE_HANDLE = ClassName.get("androidx.lifecycle", "SavedStateHandle")
+    val STRING_KEY = ClassName.get("dagger.multibindings", "StringKey")
 }
diff --git a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/main/kotlin/androidx/lifecycle/hilt/HiltViewModelProcessor.kt b/hilt/compiler/src/main/kotlin/androidx/hilt/HiltViewModelProcessor.kt
similarity index 87%
rename from lifecycle/lifecycle-viewmodel-hilt-compiler/src/main/kotlin/androidx/lifecycle/hilt/HiltViewModelProcessor.kt
rename to hilt/compiler/src/main/kotlin/androidx/hilt/HiltViewModelProcessor.kt
index c8f7069..5157657 100644
--- a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/main/kotlin/androidx/lifecycle/hilt/HiltViewModelProcessor.kt
+++ b/hilt/compiler/src/main/kotlin/androidx/hilt/HiltViewModelProcessor.kt
@@ -14,9 +14,12 @@
  * limitations under the License.
  */
 
-package androidx.lifecycle.hilt
+package androidx.hilt
 
-import androidx.lifecycle.hilt.ext.hasAnnotation
+import androidx.hilt.ext.hasAnnotation
+import androidx.hilt.lifecycle.HiltViewModelElements
+import androidx.hilt.lifecycle.HiltViewModelGenerator
+import androidx.hilt.lifecycle.ViewModelInject
 import com.google.auto.common.BasicAnnotationProcessor
 import com.google.auto.common.MoreElements
 import com.google.auto.service.AutoService
@@ -40,7 +43,11 @@
 @AutoService(Processor::class)
 @IncrementalAnnotationProcessor(ISOLATING)
 class HiltViewModelProcessor : BasicAnnotationProcessor() {
-    override fun initSteps() = listOf(ViewModelInjectStep(processingEnv))
+    override fun initSteps() = listOf(
+        ViewModelInjectStep(
+            processingEnv
+        )
+    )
 
     override fun getSupportedSourceVersion() = SourceVersion.latest()
 }
@@ -64,7 +71,10 @@
             val typeElement = MoreElements.asType(constructorElement.enclosingElement)
             if (parsedElements.add(typeElement)) {
                 parse(typeElement, constructorElement)?.let { viewModel ->
-                    HiltViewModelGenerator(processingEnv, viewModel).generate()
+                    HiltViewModelGenerator(
+                        processingEnv,
+                        viewModel
+                    ).generate()
                 }
             }
         }
@@ -106,7 +116,10 @@
 
         if (!valid) return null
 
-        return HiltViewModelElements(typeElement, constructorElement)
+        return HiltViewModelElements(
+            typeElement,
+            constructorElement
+        )
     }
 
     private fun error(message: String, element: Element? = null) {
diff --git a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/main/kotlin/androidx/lifecycle/hilt/ext/annotationProcessing.kt b/hilt/compiler/src/main/kotlin/androidx/hilt/ext/annotationProcessing.kt
similarity index 96%
rename from lifecycle/lifecycle-viewmodel-hilt-compiler/src/main/kotlin/androidx/lifecycle/hilt/ext/annotationProcessing.kt
rename to hilt/compiler/src/main/kotlin/androidx/hilt/ext/annotationProcessing.kt
index cbddb97..21827d2 100644
--- a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/main/kotlin/androidx/lifecycle/hilt/ext/annotationProcessing.kt
+++ b/hilt/compiler/src/main/kotlin/androidx/hilt/ext/annotationProcessing.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.lifecycle.hilt.ext
+package androidx.hilt.ext
 
 import com.google.auto.common.MoreElements
 import javax.lang.model.element.Element
diff --git a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/main/kotlin/androidx/lifecycle/hilt/ext/javaPoet.kt b/hilt/compiler/src/main/kotlin/androidx/hilt/ext/javaPoet.kt
similarity index 92%
rename from lifecycle/lifecycle-viewmodel-hilt-compiler/src/main/kotlin/androidx/lifecycle/hilt/ext/javaPoet.kt
rename to hilt/compiler/src/main/kotlin/androidx/hilt/ext/javaPoet.kt
index baa0d01..ae93050 100644
--- a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/main/kotlin/androidx/lifecycle/hilt/ext/javaPoet.kt
+++ b/hilt/compiler/src/main/kotlin/androidx/hilt/ext/javaPoet.kt
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
-package androidx.lifecycle.hilt.ext
+package androidx.hilt.ext
 
-import androidx.lifecycle.hilt.HiltViewModelProcessor
+import androidx.hilt.HiltViewModelProcessor
 import com.google.auto.common.GeneratedAnnotationSpecs
 import com.squareup.javapoet.TypeSpec
 import javax.lang.model.SourceVersion
diff --git a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/main/kotlin/androidx/lifecycle/hilt/HiltViewModelElements.kt b/hilt/compiler/src/main/kotlin/androidx/hilt/lifecycle/HiltViewModelElements.kt
similarity index 84%
rename from lifecycle/lifecycle-viewmodel-hilt-compiler/src/main/kotlin/androidx/lifecycle/hilt/HiltViewModelElements.kt
rename to hilt/compiler/src/main/kotlin/androidx/hilt/lifecycle/HiltViewModelElements.kt
index c7c9c7c..1abf3ce 100644
--- a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/main/kotlin/androidx/lifecycle/hilt/HiltViewModelElements.kt
+++ b/hilt/compiler/src/main/kotlin/androidx/hilt/lifecycle/HiltViewModelElements.kt
@@ -14,9 +14,10 @@
  * limitations under the License.
  */
 
-package androidx.lifecycle.hilt
+package androidx.hilt.lifecycle
 
-import androidx.lifecycle.hilt.ext.hasAnnotation
+import androidx.hilt.ClassNames
+import androidx.hilt.ext.hasAnnotation
 import com.google.auto.common.MoreElements
 import com.squareup.javapoet.AnnotationSpec
 import com.squareup.javapoet.ClassName
@@ -74,10 +75,11 @@
     }
 }
 
-internal fun VariableElement.toDependencyRequest() = DependencyRequest(
-    name = simpleName.toString(),
-    type = TypeName.get(asType()),
-    qualifier = annotationMirrors.find {
-        it.annotationType.asElement().hasAnnotation("javax.inject.Qualifier")
-    }?.let { AnnotationSpec.get(it) }
-)
\ No newline at end of file
+internal fun VariableElement.toDependencyRequest() =
+    DependencyRequest(
+        name = simpleName.toString(),
+        type = TypeName.get(asType()),
+        qualifier = annotationMirrors.find {
+            it.annotationType.asElement().hasAnnotation("javax.inject.Qualifier")
+        }?.let { AnnotationSpec.get(it) }
+    )
\ No newline at end of file
diff --git a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/main/kotlin/androidx/lifecycle/hilt/HiltViewModelGenerator.kt b/hilt/compiler/src/main/kotlin/androidx/hilt/lifecycle/HiltViewModelGenerator.kt
similarity index 93%
rename from lifecycle/lifecycle-viewmodel-hilt-compiler/src/main/kotlin/androidx/lifecycle/hilt/HiltViewModelGenerator.kt
rename to hilt/compiler/src/main/kotlin/androidx/hilt/lifecycle/HiltViewModelGenerator.kt
index 6961686..7862afb 100644
--- a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/main/kotlin/androidx/lifecycle/hilt/HiltViewModelGenerator.kt
+++ b/hilt/compiler/src/main/kotlin/androidx/hilt/lifecycle/HiltViewModelGenerator.kt
@@ -14,12 +14,14 @@
  * limitations under the License.
  */
 
-package androidx.lifecycle.hilt
+package androidx.hilt.lifecycle
 
-import androidx.lifecycle.hilt.ext.L
-import androidx.lifecycle.hilt.ext.T
-import androidx.lifecycle.hilt.ext.W
-import androidx.lifecycle.hilt.ext.addGeneratedAnnotation
+import androidx.hilt.ClassNames
+import androidx.hilt.ext.L
+import androidx.hilt.ext.S
+import androidx.hilt.ext.T
+import androidx.hilt.ext.W
+import androidx.hilt.ext.addGeneratedAnnotation
 import com.squareup.javapoet.AnnotationSpec
 import com.squareup.javapoet.CodeBlock
 import com.squareup.javapoet.FieldSpec
@@ -42,7 +44,7 @@
  * public interface $_HiltModule {
  *   @Binds
  *   @IntoMap
- *   @ViewModelKey($.class)
+ *   @StringKey("pkg.$")
  *   ViewModelAssistedFactory<? extends ViewModel> bind($_AssistedFactory factory)
  * }
  * ```
@@ -101,8 +103,8 @@
                     .addAnnotation(ClassNames.BINDS)
                     .addAnnotation(ClassNames.INTO_MAP)
                     .addAnnotation(
-                        AnnotationSpec.builder(ClassNames.VIEW_MODEL_KEY)
-                            .addMember("value", "$T.class", viewModelElements.className)
+                        AnnotationSpec.builder(ClassNames.STRING_KEY)
+                            .addMember("value", S, viewModelElements.className.canonicalName())
                             .build())
                     .addModifiers(Modifier.ABSTRACT, Modifier.PUBLIC)
                     .returns(
diff --git a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/test/data/sources/SavedStateHandle.java b/hilt/compiler/src/test/data/sources/SavedStateHandle.java
similarity index 100%
rename from lifecycle/lifecycle-viewmodel-hilt-compiler/src/test/data/sources/SavedStateHandle.java
rename to hilt/compiler/src/test/data/sources/SavedStateHandle.java
diff --git a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/test/data/sources/ViewModel.java b/hilt/compiler/src/test/data/sources/ViewModel.java
similarity index 100%
rename from lifecycle/lifecycle-viewmodel-hilt-compiler/src/test/data/sources/ViewModel.java
rename to hilt/compiler/src/test/data/sources/ViewModel.java
diff --git a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/test/kotlin/androidx/lifecycle/hilt/HiltViewModelProcessorTest.kt b/hilt/compiler/src/test/kotlin/androidx/hilt/HiltViewModelProcessorTest.kt
similarity index 70%
rename from lifecycle/lifecycle-viewmodel-hilt-compiler/src/test/kotlin/androidx/lifecycle/hilt/HiltViewModelProcessorTest.kt
rename to hilt/compiler/src/test/kotlin/androidx/hilt/HiltViewModelProcessorTest.kt
index da375aa..a22c0f8 100644
--- a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/test/kotlin/androidx/lifecycle/hilt/HiltViewModelProcessorTest.kt
+++ b/hilt/compiler/src/test/kotlin/androidx/hilt/HiltViewModelProcessorTest.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.lifecycle.hilt
+package androidx.hilt
 
 import com.google.testing.compile.CompilationSubject.assertThat
 import org.junit.Test
@@ -27,36 +27,40 @@
     @Test
     fun validViewModel() {
         val myViewModel = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
         import androidx.lifecycle.ViewModel;
-        import androidx.lifecycle.hilt.ViewModelInject;
+        import androidx.hilt.lifecycle.ViewModelInject;
 
         class MyViewModel extends ViewModel {
             @ViewModelInject
             MyViewModel() { }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.MyViewModel")
+        """.toJFO("androidx.hilt.lifecycle.test.MyViewModel")
 
         val compilation = compiler()
-            .compile(myViewModel, Sources.VIEW_MODEL, Sources.SAVED_STATE_HANDLE)
+            .compile(myViewModel,
+                Sources.VIEW_MODEL,
+                Sources.SAVED_STATE_HANDLE
+            )
         assertThat(compilation).succeeded()
     }
 
     @Test
     fun verifyEnclosingElementExtendsViewModel() {
         val myViewModel = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
-        import androidx.lifecycle.hilt.ViewModelInject;
+        import androidx.hilt.lifecycle.ViewModelInject;
 
         class MyViewModel {
             @ViewModelInject
             MyViewModel() { }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.MyViewModel")
+        """.toJFO("androidx.hilt.lifecycle.test.MyViewModel")
 
-        val compilation = compiler().compile(myViewModel, Sources.VIEW_MODEL)
+        val compilation = compiler()
+            .compile(myViewModel, Sources.VIEW_MODEL)
         assertThat(compilation).failed()
         assertThat(compilation).hadErrorCount(1)
         assertThat(compilation)
@@ -67,10 +71,10 @@
     @Test
     fun verifySingleAnnotatedConstructor() {
         val myViewModel = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
         import androidx.lifecycle.ViewModel;
-        import androidx.lifecycle.hilt.ViewModelInject;
+        import androidx.hilt.lifecycle.ViewModelInject;
 
         class MyViewModel extends ViewModel {
             @ViewModelInject
@@ -79,9 +83,10 @@
             @ViewModelInject
             MyViewModel(String s) { }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.MyViewModel")
+        """.toJFO("androidx.hilt.lifecycle.test.MyViewModel")
 
-        val compilation = compiler().compile(myViewModel, Sources.VIEW_MODEL)
+        val compilation = compiler()
+            .compile(myViewModel, Sources.VIEW_MODEL)
         assertThat(compilation).failed()
         assertThat(compilation).hadErrorCount(1)
         assertThat(compilation)
@@ -91,18 +96,19 @@
     @Test
     fun verifyNonPrivateConstructor() {
         val myViewModel = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
         import androidx.lifecycle.ViewModel;
-        import androidx.lifecycle.hilt.ViewModelInject;
+        import androidx.hilt.lifecycle.ViewModelInject;
 
         class MyViewModel extends ViewModel {
             @ViewModelInject
             private MyViewModel() { }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.MyViewModel")
+        """.toJFO("androidx.hilt.lifecycle.test.MyViewModel")
 
-        val compilation = compiler().compile(myViewModel, Sources.VIEW_MODEL)
+        val compilation = compiler()
+            .compile(myViewModel, Sources.VIEW_MODEL)
         assertThat(compilation).failed()
         assertThat(compilation).hadErrorCount(1)
         assertThat(compilation)
@@ -113,10 +119,10 @@
     @Test
     fun verifyInnerClassIsStatic() {
         val myViewModel = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
         import androidx.lifecycle.ViewModel;
-        import androidx.lifecycle.hilt.ViewModelInject;
+        import androidx.hilt.lifecycle.ViewModelInject;
 
         class Outer {
             class MyViewModel extends ViewModel {
@@ -124,9 +130,10 @@
                 MyViewModel() { }
             }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.Outer")
+        """.toJFO("androidx.hilt.lifecycle.test.Outer")
 
-        val compilation = compiler().compile(myViewModel, Sources.VIEW_MODEL)
+        val compilation = compiler()
+            .compile(myViewModel, Sources.VIEW_MODEL)
         assertThat(compilation).failed()
         assertThat(compilation).hadErrorCount(1)
         assertThat(compilation)
diff --git a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/test/kotlin/androidx/lifecycle/hilt/HiltViewModelGeneratorTest.kt b/hilt/compiler/src/test/kotlin/androidx/hilt/lifecycle/HiltViewModelGeneratorTest.kt
similarity index 76%
rename from lifecycle/lifecycle-viewmodel-hilt-compiler/src/test/kotlin/androidx/lifecycle/hilt/HiltViewModelGeneratorTest.kt
rename to hilt/compiler/src/test/kotlin/androidx/hilt/lifecycle/HiltViewModelGeneratorTest.kt
index 851d483..56eb2ae 100644
--- a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/test/kotlin/androidx/lifecycle/hilt/HiltViewModelGeneratorTest.kt
+++ b/hilt/compiler/src/test/kotlin/androidx/hilt/lifecycle/HiltViewModelGeneratorTest.kt
@@ -14,8 +14,11 @@
  * limitations under the License.
  */
 
-package androidx.lifecycle.hilt
+package androidx.hilt.lifecycle
 
+import androidx.hilt.Sources
+import androidx.hilt.compiler
+import androidx.hilt.toJFO
 import com.google.testing.compile.CompilationSubject.assertThat
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -32,28 +35,28 @@
     }
 
     private val GENERATED_ANNOTATION =
-        "@Generated(\"androidx.lifecycle.hilt.HiltViewModelProcessor\")"
+        "@Generated(\"androidx.hilt.HiltViewModelProcessor\")"
 
     @Test
     fun verifyAssistedFactory_noArg() {
         val myViewModel = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
+        import androidx.hilt.lifecycle.ViewModelInject;
         import androidx.lifecycle.ViewModel;
-        import androidx.lifecycle.hilt.ViewModelInject;
 
         class MyViewModel extends ViewModel {
             @ViewModelInject
             MyViewModel() { }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.MyViewModel")
+        """.toJFO("androidx.hilt.lifecycle.test.MyViewModel")
 
         val expected = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
         import androidx.annotation.NonNull;
+        import androidx.hilt.lifecycle.ViewModelAssistedFactory;
         import androidx.lifecycle.SavedStateHandle;
-        import androidx.lifecycle.hilt.ViewModelAssistedFactory;
         import java.lang.Override;
         import $GENERATED_TYPE;
         import javax.inject.Inject;
@@ -71,37 +74,37 @@
                 return new MyViewModel();
             }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.MyViewModel_AssistedFactory")
+        """.toJFO("androidx.hilt.lifecycle.test.MyViewModel_AssistedFactory")
 
         val compilation = compiler()
             .compile(myViewModel, Sources.VIEW_MODEL, Sources.SAVED_STATE_HANDLE)
         assertThat(compilation).succeeded()
         assertThat(compilation)
-            .generatedSourceFile("androidx.lifecycle.hilt.test.MyViewModel_AssistedFactory")
+            .generatedSourceFile("androidx.hilt.lifecycle.test.MyViewModel_AssistedFactory")
             .hasSourceEquivalentTo(expected)
     }
 
     @Test
     fun verifyAssistedFactory_savedStateOnlyArg() {
         val myViewModel = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
+        import androidx.hilt.lifecycle.ViewModelInject;
         import androidx.lifecycle.ViewModel;
         import androidx.lifecycle.SavedStateHandle;
-        import androidx.lifecycle.hilt.ViewModelInject;
 
         class MyViewModel extends ViewModel {
             @ViewModelInject
             MyViewModel(SavedStateHandle savedState) { }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.MyViewModel")
+        """.toJFO("androidx.hilt.lifecycle.test.MyViewModel")
 
         val expected = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
         import androidx.annotation.NonNull;
+        import androidx.hilt.lifecycle.ViewModelAssistedFactory;
         import androidx.lifecycle.SavedStateHandle;
-        import androidx.lifecycle.hilt.ViewModelAssistedFactory;
         import java.lang.Override;
         import $GENERATED_TYPE;
         import javax.inject.Inject;
@@ -119,44 +122,44 @@
                 return new MyViewModel(handle);
             }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.MyViewModel_AssistedFactory")
+        """.toJFO("androidx.hilt.lifecycle.test.MyViewModel_AssistedFactory")
 
         val compilation = compiler()
             .compile(myViewModel, Sources.VIEW_MODEL, Sources.SAVED_STATE_HANDLE)
         assertThat(compilation).succeeded()
         assertThat(compilation)
-            .generatedSourceFile("androidx.lifecycle.hilt.test.MyViewModel_AssistedFactory")
+            .generatedSourceFile("androidx.hilt.lifecycle.test.MyViewModel_AssistedFactory")
             .hasSourceEquivalentTo(expected)
     }
 
     @Test
     fun verifyAssistedFactory_mixedArgs() {
         val foo = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
         public class Foo { }
-        """.toJFO("androidx.lifecycle.hilt.test.Foo")
+        """.toJFO("androidx.hilt.lifecycle.test.Foo")
 
         val myViewModel = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
+        import androidx.hilt.lifecycle.ViewModelInject;
         import androidx.lifecycle.ViewModel;
         import androidx.lifecycle.SavedStateHandle;
-        import androidx.lifecycle.hilt.ViewModelInject;
         import java.lang.String;
 
         class MyViewModel extends ViewModel {
             @ViewModelInject
             MyViewModel(String s, Foo f, SavedStateHandle savedState, long l) { }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.MyViewModel")
+        """.toJFO("androidx.hilt.lifecycle.test.MyViewModel")
 
         val expected = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
         import androidx.annotation.NonNull;
+        import androidx.hilt.lifecycle.ViewModelAssistedFactory;
         import androidx.lifecycle.SavedStateHandle;
-        import androidx.lifecycle.hilt.ViewModelAssistedFactory;
         import java.lang.Long;
         import java.lang.Override;
         import java.lang.String;
@@ -185,30 +188,30 @@
                 return new MyViewModel(s.get(), f.get(), handle, l.get());
             }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.MyViewModel_AssistedFactory")
+        """.toJFO("androidx.hilt.lifecycle.test.MyViewModel_AssistedFactory")
 
         val compilation = compiler()
             .compile(foo, myViewModel, Sources.VIEW_MODEL, Sources.SAVED_STATE_HANDLE)
         assertThat(compilation).succeeded()
         assertThat(compilation)
-            .generatedSourceFile("androidx.lifecycle.hilt.test.MyViewModel_AssistedFactory")
+            .generatedSourceFile("androidx.hilt.lifecycle.test.MyViewModel_AssistedFactory")
             .hasSourceEquivalentTo(expected)
     }
 
     @Test
     fun verifyAssistedFactory_mixedAndProviderArgs() {
         val foo = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
         public class Foo { }
-        """.toJFO("androidx.lifecycle.hilt.test.Foo")
+        """.toJFO("androidx.hilt.lifecycle.test.Foo")
 
         val myViewModel = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
+        import androidx.hilt.lifecycle.ViewModelInject;
         import androidx.lifecycle.ViewModel;
         import androidx.lifecycle.SavedStateHandle;
-        import androidx.lifecycle.hilt.ViewModelInject;
         import java.lang.String;
         import javax.inject.Provider;
 
@@ -216,14 +219,14 @@
             @ViewModelInject
             MyViewModel(String s, Provider<Foo> f, SavedStateHandle savedState) { }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.MyViewModel")
+        """.toJFO("androidx.hilt.lifecycle.test.MyViewModel")
 
         val expected = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
         import androidx.annotation.NonNull;
+        import androidx.hilt.lifecycle.ViewModelAssistedFactory;
         import androidx.lifecycle.SavedStateHandle;
-        import androidx.lifecycle.hilt.ViewModelAssistedFactory;
         import java.lang.Override;
         import java.lang.String;
         import $GENERATED_TYPE;
@@ -249,33 +252,33 @@
                 return new MyViewModel(s.get(), f, handle);
             }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.MyViewModel_AssistedFactory")
+        """.toJFO("androidx.hilt.lifecycle.test.MyViewModel_AssistedFactory")
 
         val compilation = compiler()
             .compile(foo, myViewModel, Sources.VIEW_MODEL, Sources.SAVED_STATE_HANDLE)
         assertThat(compilation).succeeded()
         assertThat(compilation)
-            .generatedSourceFile("androidx.lifecycle.hilt.test.MyViewModel_AssistedFactory")
+            .generatedSourceFile("androidx.hilt.lifecycle.test.MyViewModel_AssistedFactory")
             .hasSourceEquivalentTo(expected)
     }
 
     @Test
     fun verifyAssistedFactory_qualifiedArgs() {
         val myQualifier = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
         import javax.inject.Qualifier;
 
         @Qualifier
         public @interface MyQualifier { }
-        """.toJFO("androidx.lifecycle.hilt.test.MyQualifier")
+        """.toJFO("androidx.hilt.lifecycle.test.MyQualifier")
 
         val myViewModel = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
+        import androidx.hilt.lifecycle.ViewModelInject;
         import androidx.lifecycle.ViewModel;
         import androidx.lifecycle.SavedStateHandle;
-        import androidx.lifecycle.hilt.ViewModelInject;
         import java.lang.Long;
         import java.lang.String;
         import javax.inject.Named;
@@ -287,14 +290,14 @@
                     SavedStateHandle savedState) {
             }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.MyViewModel")
+        """.toJFO("androidx.hilt.lifecycle.test.MyViewModel")
 
         val expected = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
         import androidx.annotation.NonNull;
+        import androidx.hilt.lifecycle.ViewModelAssistedFactory;
         import androidx.lifecycle.SavedStateHandle;
-        import androidx.lifecycle.hilt.ViewModelAssistedFactory;
         import java.lang.Long;
         import java.lang.Override;
         import java.lang.String;
@@ -323,38 +326,38 @@
                 return new MyViewModel(s.get(), l, handle);
             }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.MyViewModel_AssistedFactory")
+        """.toJFO("androidx.hilt.lifecycle.test.MyViewModel_AssistedFactory")
 
         val compilation = compiler()
             .compile(myQualifier, myViewModel, Sources.VIEW_MODEL, Sources.SAVED_STATE_HANDLE)
         assertThat(compilation).succeeded()
         assertThat(compilation)
-            .generatedSourceFile("androidx.lifecycle.hilt.test.MyViewModel_AssistedFactory")
+            .generatedSourceFile("androidx.hilt.lifecycle.test.MyViewModel_AssistedFactory")
             .hasSourceEquivalentTo(expected)
     }
 
     @Test
     fun verifyAssistedFactory_multipleSavedStateArg() {
         val myViewModel = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
+        import androidx.hilt.lifecycle.ViewModelInject;
         import androidx.lifecycle.ViewModel;
         import androidx.lifecycle.SavedStateHandle;
-        import androidx.lifecycle.hilt.ViewModelInject;
         import java.lang.String;
 
         class MyViewModel extends ViewModel {
             @ViewModelInject
             MyViewModel(SavedStateHandle savedState, String s, SavedStateHandle savedState2) { }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.MyViewModel")
+        """.toJFO("androidx.hilt.lifecycle.test.MyViewModel")
 
         val expected = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
         import androidx.annotation.NonNull;
+        import androidx.hilt.lifecycle.ViewModelAssistedFactory;
         import androidx.lifecycle.SavedStateHandle;
-        import androidx.lifecycle.hilt.ViewModelAssistedFactory;
         import java.lang.Override;
         import java.lang.String;
         import $GENERATED_TYPE;
@@ -378,41 +381,41 @@
                 return new MyViewModel(handle, s.get(), handle);
             }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.MyViewModel_AssistedFactory")
+        """.toJFO("androidx.hilt.lifecycle.test.MyViewModel_AssistedFactory")
 
         val compilation = compiler()
             .compile(myViewModel, Sources.VIEW_MODEL, Sources.SAVED_STATE_HANDLE)
         assertThat(compilation).succeeded()
         assertThat(compilation)
-            .generatedSourceFile("androidx.lifecycle.hilt.test.MyViewModel_AssistedFactory")
+            .generatedSourceFile("androidx.hilt.lifecycle.test.MyViewModel_AssistedFactory")
             .hasSourceEquivalentTo(expected)
     }
 
     @Test
     fun verifyMultibindModule() {
         val myViewModel = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
         import androidx.lifecycle.ViewModel;
-        import androidx.lifecycle.hilt.ViewModelInject;
+        import androidx.hilt.lifecycle.ViewModelInject;
 
         class MyViewModel extends ViewModel {
             @ViewModelInject
             MyViewModel() { }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.MyViewModel")
+        """.toJFO("androidx.hilt.lifecycle.test.MyViewModel")
 
         val expected = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
+        import androidx.hilt.lifecycle.ViewModelAssistedFactory;
         import androidx.lifecycle.ViewModel;
-        import androidx.lifecycle.hilt.ViewModelAssistedFactory;
-        import androidx.lifecycle.hilt.ViewModelKey;
         import dagger.Binds;
         import dagger.Module;
         import dagger.hilt.InstallIn;
         import dagger.hilt.android.components.ActivityRetainedComponent;
         import dagger.multibindings.IntoMap;
+        import dagger.multibindings.StringKey;
         import $GENERATED_TYPE;
 
         $GENERATED_ANNOTATION
@@ -421,26 +424,26 @@
         public interface MyViewModel_HiltModule {
             @Binds
             @IntoMap
-            @ViewModelKey(MyViewModel.class)
+            @StringKey("androidx.hilt.lifecycle.test.MyViewModel")
             ViewModelAssistedFactory<? extends ViewModel> bind(MyViewModel_AssistedFactory factory)
         }
-        """.toJFO("androidx.lifecycle.hilt.test.MyViewModel_HiltModule")
+        """.toJFO("androidx.hilt.lifecycle.test.MyViewModel_HiltModule")
 
         val compilation = compiler()
             .compile(myViewModel, Sources.VIEW_MODEL, Sources.SAVED_STATE_HANDLE)
         assertThat(compilation).succeeded()
         assertThat(compilation)
-            .generatedSourceFile("androidx.lifecycle.hilt.test.MyViewModel_HiltModule")
+            .generatedSourceFile("androidx.hilt.lifecycle.test.MyViewModel_HiltModule")
             .hasSourceEquivalentTo(expected)
     }
 
     @Test
     fun verifyInnerClass() {
         val viewModel = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
+        import androidx.hilt.lifecycle.ViewModelInject;
         import androidx.lifecycle.ViewModel;
-        import androidx.lifecycle.hilt.ViewModelInject;
 
         class Outer {
             static class InnerViewModel extends ViewModel {
@@ -448,14 +451,14 @@
                 InnerViewModel() { }
             }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.Outer")
+        """.toJFO("androidx.hilt.lifecycle.test.Outer")
 
         val expectedFactory = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
         import androidx.annotation.NonNull;
+        import androidx.hilt.lifecycle.ViewModelAssistedFactory;
         import androidx.lifecycle.SavedStateHandle;
-        import androidx.lifecycle.hilt.ViewModelAssistedFactory;
         import java.lang.Override;
         import $GENERATED_TYPE;
         import javax.inject.Inject;
@@ -473,19 +476,19 @@
                 return new Outer.InnerViewModel();
             }
         }
-        """.toJFO("androidx.lifecycle.hilt.test.Outer_InnerViewModel_AssistedFactory")
+        """.toJFO("androidx.hilt.lifecycle.test.Outer_InnerViewModel_AssistedFactory")
 
         val expectedModule = """
-        package androidx.lifecycle.hilt.test;
+        package androidx.hilt.lifecycle.test;
 
+        import androidx.hilt.lifecycle.ViewModelAssistedFactory;
         import androidx.lifecycle.ViewModel;
-        import androidx.lifecycle.hilt.ViewModelAssistedFactory;
-        import androidx.lifecycle.hilt.ViewModelKey;
         import dagger.Binds;
         import dagger.Module;
         import dagger.hilt.InstallIn;
         import dagger.hilt.android.components.ActivityRetainedComponent;
         import dagger.multibindings.IntoMap;
+        import dagger.multibindings.StringKey;
         import $GENERATED_TYPE;
 
         $GENERATED_ANNOTATION
@@ -494,21 +497,21 @@
         public interface Outer_InnerViewModel_HiltModule {
             @Binds
             @IntoMap
-            @ViewModelKey(Outer.InnerViewModel.class)
+            @StringKey("androidx.hilt.lifecycle.test.Outer.InnerViewModel")
             ViewModelAssistedFactory<? extends ViewModel> bind(
                     Outer_InnerViewModel_AssistedFactory factory)
         }
-        """.toJFO("androidx.lifecycle.hilt.test.Outer_InnerViewModel_HiltModule")
+        """.toJFO("androidx.hilt.lifecycle.test.Outer_InnerViewModel_HiltModule")
 
         val compilation = compiler()
             .compile(viewModel, Sources.VIEW_MODEL, Sources.SAVED_STATE_HANDLE)
         assertThat(compilation).succeeded()
         assertThat(compilation)
-            .generatedSourceFile("androidx.lifecycle.hilt.test" +
+            .generatedSourceFile("androidx.hilt.lifecycle.test" +
                     ".Outer_InnerViewModel_AssistedFactory")
             .hasSourceEquivalentTo(expectedFactory)
         assertThat(compilation)
-            .generatedSourceFile("androidx.lifecycle.hilt.test" +
+            .generatedSourceFile("androidx.hilt.lifecycle.test" +
                     ".Outer_InnerViewModel_HiltModule")
             .hasSourceEquivalentTo(expectedModule)
     }
diff --git a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/test/kotlin/androidx/lifecycle/hilt/testUtils.kt b/hilt/compiler/src/test/kotlin/androidx/hilt/testUtils.kt
similarity index 83%
rename from lifecycle/lifecycle-viewmodel-hilt-compiler/src/test/kotlin/androidx/lifecycle/hilt/testUtils.kt
rename to hilt/compiler/src/test/kotlin/androidx/hilt/testUtils.kt
index 91720a6..0d135c9 100644
--- a/lifecycle/lifecycle-viewmodel-hilt-compiler/src/test/kotlin/androidx/lifecycle/hilt/testUtils.kt
+++ b/hilt/compiler/src/test/kotlin/androidx/hilt/testUtils.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.lifecycle.hilt
+package androidx.hilt
 
 import com.google.testing.compile.Compiler
 import com.google.testing.compile.Compiler.javac
@@ -24,11 +24,17 @@
 
 object Sources {
     val VIEW_MODEL by lazy {
-        loadJavaSource("ViewModel.java", ClassNames.VIEW_MODEL.toString())
+        loadJavaSource(
+            "ViewModel.java",
+            ClassNames.VIEW_MODEL.toString()
+        )
     }
 
     val SAVED_STATE_HANDLE by lazy {
-        loadJavaSource("SavedStateHandle.java", ClassNames.SAVED_STATE_HANDLE.toString())
+        loadJavaSource(
+            "SavedStateHandle.java",
+            ClassNames.SAVED_STATE_HANDLE.toString()
+        )
     }
 }
 
diff --git a/hilt/integration-tests/viewmodelapp/build.gradle b/hilt/integration-tests/viewmodelapp/build.gradle
index 3319ac1..6036a69 100644
--- a/hilt/integration-tests/viewmodelapp/build.gradle
+++ b/hilt/integration-tests/viewmodelapp/build.gradle
@@ -24,11 +24,20 @@
     id("dagger.hilt.android.plugin")
 }
 
+android {
+    buildTypes {
+        release {
+            minifyEnabled true
+            shrinkResources true
+        }
+    }
+}
+
 dependencies {
     implementation(project(":activity:activity"))
     implementation(project(":fragment:fragment-ktx"))
-    implementation(project(":lifecycle:lifecycle-viewmodel-hilt"))
-    kapt(project(":lifecycle:lifecycle-viewmodel-hilt-compiler"))
+    implementation(project(":hilt:hilt-lifecycle-viewmodel"))
+    kapt(project(":hilt:hilt-compiler"))
     implementation(KOTLIN_STDLIB)
     implementation(DAGGER)
     kapt(DAGGER_COMPILER)
diff --git a/hilt/integration-tests/viewmodelapp/src/main/java/androidx/hilt/integration/viewmodelapp/SimpleActivity.kt b/hilt/integration-tests/viewmodelapp/src/main/java/androidx/hilt/integration/viewmodelapp/SimpleActivity.kt
index 85102af..9d092ff 100644
--- a/hilt/integration-tests/viewmodelapp/src/main/java/androidx/hilt/integration/viewmodelapp/SimpleActivity.kt
+++ b/hilt/integration-tests/viewmodelapp/src/main/java/androidx/hilt/integration/viewmodelapp/SimpleActivity.kt
@@ -20,8 +20,8 @@
 import android.util.Log
 import androidx.activity.viewModels
 import androidx.fragment.app.FragmentActivity
-import androidx.lifecycle.hilt.ActivityViewModelFactory
-import androidx.lifecycle.hilt.ViewModelFactory
+import androidx.hilt.lifecycle.ActivityViewModelFactory
+import androidx.hilt.lifecycle.ViewModelFactory
 import dagger.hilt.android.AndroidEntryPoint
 import javax.inject.Inject
 
diff --git a/hilt/integration-tests/viewmodelapp/src/main/java/androidx/hilt/integration/viewmodelapp/SimpleFragment.kt b/hilt/integration-tests/viewmodelapp/src/main/java/androidx/hilt/integration/viewmodelapp/SimpleFragment.kt
index d71bdc7..9b8df02 100644
--- a/hilt/integration-tests/viewmodelapp/src/main/java/androidx/hilt/integration/viewmodelapp/SimpleFragment.kt
+++ b/hilt/integration-tests/viewmodelapp/src/main/java/androidx/hilt/integration/viewmodelapp/SimpleFragment.kt
@@ -21,8 +21,8 @@
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.activityViewModels
 import androidx.fragment.app.viewModels
-import androidx.lifecycle.hilt.FragmentViewModelFactory
-import androidx.lifecycle.hilt.ViewModelFactory
+import androidx.hilt.lifecycle.FragmentViewModelFactory
+import androidx.hilt.lifecycle.ViewModelFactory
 import dagger.hilt.android.AndroidEntryPoint
 import javax.inject.Inject
 
diff --git a/hilt/integration-tests/viewmodelapp/src/main/java/androidx/hilt/integration/viewmodelapp/SimpleViewModel.kt b/hilt/integration-tests/viewmodelapp/src/main/java/androidx/hilt/integration/viewmodelapp/SimpleViewModel.kt
index 739eace..97ab932 100644
--- a/hilt/integration-tests/viewmodelapp/src/main/java/androidx/hilt/integration/viewmodelapp/SimpleViewModel.kt
+++ b/hilt/integration-tests/viewmodelapp/src/main/java/androidx/hilt/integration/viewmodelapp/SimpleViewModel.kt
@@ -18,7 +18,7 @@
 
 import androidx.lifecycle.SavedStateHandle
 import androidx.lifecycle.ViewModel
-import androidx.lifecycle.hilt.ViewModelInject
+import androidx.hilt.lifecycle.ViewModelInject
 import javax.inject.Inject
 
 @Suppress("UNUSED_PARAMETER")
diff --git a/lifecycle/lifecycle-viewmodel-hilt/build.gradle b/hilt/lifecycle-viewmodel/build.gradle
similarity index 89%
rename from lifecycle/lifecycle-viewmodel-hilt/build.gradle
rename to hilt/lifecycle-viewmodel/build.gradle
index 82aae8e..a76966b 100644
--- a/lifecycle/lifecycle-viewmodel-hilt/build.gradle
+++ b/hilt/lifecycle-viewmodel/build.gradle
@@ -26,9 +26,15 @@
     id("com.android.library")
 }
 
+android {
+    buildTypes.all {
+        consumerProguardFiles 'proguard-rules.pro'
+    }
+}
+
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    api(project(":lifecycle:lifecycle-viewmodel-hilt-common"))
+    api(project(":hilt:hilt-common"))
     api(project(":lifecycle:lifecycle-viewmodel-savedstate"))
     implementation(project(":activity:activity"))
     implementation(DAGGER)
@@ -52,8 +58,8 @@
 androidx {
     name = "Android Lifecycle ViewModel Hilt Extension"
     publish = Publish.NONE
-    mavenVersion = LibraryVersions.LIFECYCLE
-    mavenGroup = LibraryGroups.LIFECYCLE
+    mavenVersion = LibraryVersions.HILT
+    mavenGroup = LibraryGroups.HILT
     inceptionYear = "2020"
     description = "Android Lifecycle ViewModel Hilt Extension"
     url = AndroidXExtension.ARCHITECTURE_URL
diff --git a/hilt/lifecycle-viewmodel/proguard-rules.pro b/hilt/lifecycle-viewmodel/proguard-rules.pro
new file mode 100644
index 0000000..eabb30f
--- /dev/null
+++ b/hilt/lifecycle-viewmodel/proguard-rules.pro
@@ -0,0 +1,5 @@
+# Keep class names of Hilt injected ViewModels since their name are used as a multibinding map key.
+-keepclasseswithmembernames class * extends androidx.lifecycle.ViewModel {
+    @androidx.hilt.lifecycle.ViewModelInject
+    <init>(...);
+}
\ No newline at end of file
diff --git a/lifecycle/lifecycle-viewmodel-hilt/src/main/AndroidManifest.xml b/hilt/lifecycle-viewmodel/src/main/AndroidManifest.xml
similarity index 93%
rename from lifecycle/lifecycle-viewmodel-hilt/src/main/AndroidManifest.xml
rename to hilt/lifecycle-viewmodel/src/main/AndroidManifest.xml
index 572f7d0..9fadc02 100644
--- a/lifecycle/lifecycle-viewmodel-hilt/src/main/AndroidManifest.xml
+++ b/hilt/lifecycle-viewmodel/src/main/AndroidManifest.xml
@@ -15,5 +15,5 @@
   -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="androidx.lifecycle.hilt">
+          package="androidx.hilt.lifecycle">
 </manifest>
diff --git a/lifecycle/lifecycle-viewmodel-hilt/src/main/java/androidx/lifecycle/hilt/ActivityViewModelFactory.java b/hilt/lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/ActivityViewModelFactory.java
similarity index 96%
rename from lifecycle/lifecycle-viewmodel-hilt/src/main/java/androidx/lifecycle/hilt/ActivityViewModelFactory.java
rename to hilt/lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/ActivityViewModelFactory.java
index 4e4e8d2..4979c27 100644
--- a/lifecycle/lifecycle-viewmodel-hilt/src/main/java/androidx/lifecycle/hilt/ActivityViewModelFactory.java
+++ b/hilt/lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/ActivityViewModelFactory.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.lifecycle.hilt;
+package androidx.hilt.lifecycle;
 
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
diff --git a/lifecycle/lifecycle-viewmodel-hilt/src/main/java/androidx/lifecycle/hilt/FragmentViewModelFactory.java b/hilt/lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/FragmentViewModelFactory.java
similarity index 96%
rename from lifecycle/lifecycle-viewmodel-hilt/src/main/java/androidx/lifecycle/hilt/FragmentViewModelFactory.java
rename to hilt/lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/FragmentViewModelFactory.java
index 49dddc3..b28909f 100644
--- a/lifecycle/lifecycle-viewmodel-hilt/src/main/java/androidx/lifecycle/hilt/FragmentViewModelFactory.java
+++ b/hilt/lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/FragmentViewModelFactory.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.lifecycle.hilt;
+package androidx.hilt.lifecycle;
 
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
diff --git a/lifecycle/lifecycle-viewmodel-hilt/src/main/java/androidx/lifecycle/hilt/ViewModelAssistedFactory.java b/hilt/lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/ViewModelAssistedFactory.java
similarity index 96%
rename from lifecycle/lifecycle-viewmodel-hilt/src/main/java/androidx/lifecycle/hilt/ViewModelAssistedFactory.java
rename to hilt/lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/ViewModelAssistedFactory.java
index cf23fa6..a1295d6 100644
--- a/lifecycle/lifecycle-viewmodel-hilt/src/main/java/androidx/lifecycle/hilt/ViewModelAssistedFactory.java
+++ b/hilt/lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/ViewModelAssistedFactory.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.lifecycle.hilt;
+package androidx.hilt.lifecycle;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
diff --git a/lifecycle/lifecycle-viewmodel-hilt/src/main/java/androidx/lifecycle/hilt/ViewModelFactory.java b/hilt/lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/ViewModelFactory.java
similarity index 71%
rename from lifecycle/lifecycle-viewmodel-hilt/src/main/java/androidx/lifecycle/hilt/ViewModelFactory.java
rename to hilt/lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/ViewModelFactory.java
index 6a35805..1c3a071 100644
--- a/lifecycle/lifecycle-viewmodel-hilt/src/main/java/androidx/lifecycle/hilt/ViewModelFactory.java
+++ b/hilt/lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/ViewModelFactory.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.lifecycle.hilt;
+package androidx.hilt.lifecycle;
 
 import android.os.Bundle;
 
@@ -34,14 +34,13 @@
  */
 public final class ViewModelFactory extends AbstractSavedStateViewModelFactory {
 
-    private final Map<
-            Class<? extends ViewModel>,
+    private final Map<String,
             Provider<ViewModelAssistedFactory<? extends ViewModel>>> mViewModelFactories;
 
     ViewModelFactory(
             @NonNull SavedStateRegistryOwner owner,
             @Nullable Bundle defaultArgs,
-            @NonNull Map<Class<? extends ViewModel>,
+            @NonNull Map<String,
                     Provider<ViewModelAssistedFactory<? extends ViewModel>>> viewModelFactories) {
         super(owner, defaultArgs);
         this.mViewModelFactories = viewModelFactories;
@@ -53,7 +52,15 @@
     protected <T extends ViewModel> T create(@NonNull String key, @NonNull Class<T> modelClass,
             @NonNull SavedStateHandle handle) {
         // TODO(danysantiago): What to do with 'key' ???
-        // TODO(danysantiago): Better exception for missing class
-        return (T) mViewModelFactories.get(modelClass).get().create(handle);
+        Provider<ViewModelAssistedFactory<? extends ViewModel>> factoryProvider =
+                mViewModelFactories.get(modelClass.getCanonicalName());
+        if (factoryProvider == null) {
+            // TODO(danysantiago): Consider still creating those ViewModel that have a default
+            //  no-arg constructor.
+            throw new IllegalStateException("Unable to create the ViewModel class "
+                    + modelClass.getCanonicalName() + ". Did you forgot to annotate its "
+                    + "constructor with @ViewModelInject?");
+        }
+        return (T) factoryProvider.get().create(handle);
     }
 }
diff --git a/lifecycle/lifecycle-viewmodel-hilt/src/main/java/androidx/lifecycle/hilt/ViewModelFactoryModules.java b/hilt/lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/ViewModelFactoryModules.java
similarity index 85%
rename from lifecycle/lifecycle-viewmodel-hilt/src/main/java/androidx/lifecycle/hilt/ViewModelFactoryModules.java
rename to hilt/lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/ViewModelFactoryModules.java
index 74da3d7a..fa2c7a8 100644
--- a/lifecycle/lifecycle-viewmodel-hilt/src/main/java/androidx/lifecycle/hilt/ViewModelFactoryModules.java
+++ b/hilt/lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/ViewModelFactoryModules.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.lifecycle.hilt;
+package androidx.hilt.lifecycle;
 
 import android.app.Activity;
 import android.os.Bundle;
@@ -54,16 +54,14 @@
 
         @NonNull
         @Multibinds
-        abstract Map<Class<? extends ViewModel>,
-                ViewModelAssistedFactory<? extends ViewModel>> viewModelFactoriesMap();
+        abstract Map<String, ViewModelAssistedFactory<? extends ViewModel>> viewModelFactoriesMap();
 
         @Provides
         @NonNull
         @ActivityViewModelFactory
         static ViewModelFactory provideFactory(
                 @NonNull Activity activity,
-                @NonNull Map<Class<? extends ViewModel>,
-                        Provider<ViewModelAssistedFactory<? extends ViewModel>>>
+                @NonNull Map<String, Provider<ViewModelAssistedFactory<? extends ViewModel>>>
                         viewModelFactories) {
             // Hilt guarantees concrete activity is a subclass of ComponentActivity.
             SavedStateRegistryOwner owner = (ComponentActivity) activity;
@@ -84,8 +82,7 @@
         @FragmentViewModelFactory
         static ViewModelFactory provideFactory(
                 @NonNull Fragment fragment,
-                @NonNull Map<Class<? extends ViewModel>,
-                        Provider<ViewModelAssistedFactory<? extends ViewModel>>>
+                @NonNull Map<String, Provider<ViewModelAssistedFactory<? extends ViewModel>>>
                         viewModelFactories) {
             Bundle defaultArgs = fragment.getArguments();
             return new ViewModelFactory(fragment, defaultArgs, viewModelFactories);
diff --git a/jetifier/jetifier/migration.config b/jetifier/jetifier/migration.config
index f4bea26..0a17890 100644
--- a/jetifier/jetifier/migration.config
+++ b/jetifier/jetifier/migration.config
@@ -939,6 +939,10 @@
       "to": "androidx/vectordrawable/animated"
     },
     {
+      "from": "androidx/vectordrawable/seekable",
+      "to": "androidx/vectordrawable/seekable"
+    },
+    {
       "from": "androidx/tvprovider",
       "to": "androidx/tvprovider"
     },
@@ -1294,6 +1298,18 @@
     },
     {
       "from": {
+        "groupId": "androidx.vectordrawable",
+        "artifactId": "vectordrawable-seekable",
+        "version": "{newSlVersion}"
+      },
+      "to": {
+        "groupId": "androidx.vectordrawable",
+        "artifactId": "vectordrawable-seekable",
+        "version": "{newSlVersion}"
+      }
+    },
+    {
+      "from": {
         "groupId": "androidx.activity",
         "artifactId": "activity",
         "version": "{newSlVersion}"
diff --git a/lifecycle/integration-tests/kotlintestapp/src/test/java/androidx/lifecycle/LifecycleCoroutineScopeTest.kt b/lifecycle/integration-tests/kotlintestapp/src/test/java/androidx/lifecycle/LifecycleCoroutineScopeTest.kt
index 8eaae40..a2af184 100644
--- a/lifecycle/integration-tests/kotlintestapp/src/test/java/androidx/lifecycle/LifecycleCoroutineScopeTest.kt
+++ b/lifecycle/integration-tests/kotlintestapp/src/test/java/androidx/lifecycle/LifecycleCoroutineScopeTest.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
+
 package androidx.lifecycle
 
 import kotlinx.coroutines.Dispatchers
diff --git a/lifecycle/lifecycle-livedata-core-ktx/build.gradle b/lifecycle/lifecycle-livedata-core-ktx/build.gradle
index 61f7450..6eec55d 100644
--- a/lifecycle/lifecycle-livedata-core-ktx/build.gradle
+++ b/lifecycle/lifecycle-livedata-core-ktx/build.gradle
@@ -14,6 +14,9 @@
  * limitations under the License.
  */
 
+
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
 import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
@@ -52,3 +55,10 @@
     inceptionYear = "2018"
     description = "Kotlin extensions for 'livedata-core' artifact"
 }
+
+// Allow usage of Kotlin's @OptIn.
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn"]
+    }
+}
diff --git a/lifecycle/lifecycle-livedata-core-ktx/src/test/java/androidx/lifecycle/LiveDataTest.kt b/lifecycle/lifecycle-livedata-core-ktx/src/test/java/androidx/lifecycle/LiveDataTest.kt
index c264829..ccc1bee 100644
--- a/lifecycle/lifecycle-livedata-core-ktx/src/test/java/androidx/lifecycle/LiveDataTest.kt
+++ b/lifecycle/lifecycle-livedata-core-ktx/src/test/java/androidx/lifecycle/LiveDataTest.kt
@@ -30,6 +30,7 @@
 
     @Test
     fun observe() {
+        @OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
         val lifecycleOwner = TestLifecycleOwner(coroutineDispatcher = TestCoroutineDispatcher())
 
         val liveData = MutableLiveData<String>()
diff --git a/lifecycle/lifecycle-livedata-core-truth/src/test/java/androidx/lifecycle/truth/LiveDataSubjectTest.kt b/lifecycle/lifecycle-livedata-core-truth/src/test/java/androidx/lifecycle/truth/LiveDataSubjectTest.kt
index a3003f1..854423b 100644
--- a/lifecycle/lifecycle-livedata-core-truth/src/test/java/androidx/lifecycle/truth/LiveDataSubjectTest.kt
+++ b/lifecycle/lifecycle-livedata-core-truth/src/test/java/androidx/lifecycle/truth/LiveDataSubjectTest.kt
@@ -31,6 +31,7 @@
 
     @Test
     fun testHasActiveObservers() {
+        @Suppress("UNCHECKED_CAST")
         val observer = mock(Observer::class.java) as Observer<Any>
         val liveData = MutableLiveData<Any>()
         liveData.observeForever(observer)
diff --git a/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/BuildLiveDataTest.kt b/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/BuildLiveDataTest.kt
index e23b763..1d3e128 100644
--- a/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/BuildLiveDataTest.kt
+++ b/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/BuildLiveDataTest.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
+
 package androidx.lifecycle
 
 import com.google.common.truth.Truth.assertThat
diff --git a/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/FlowAsLiveDataTest.kt b/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/FlowAsLiveDataTest.kt
index d46b44fb..9a6ee18 100644
--- a/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/FlowAsLiveDataTest.kt
+++ b/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/FlowAsLiveDataTest.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
+
 package androidx.lifecycle
 
 import com.google.common.truth.Truth.assertThat
diff --git a/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/LiveDataAsFlowTest.kt b/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/LiveDataAsFlowTest.kt
index 6e2f7c6..51ac28c 100644
--- a/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/LiveDataAsFlowTest.kt
+++ b/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/LiveDataAsFlowTest.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
+
 package androidx.lifecycle
 
 import com.google.common.truth.Truth.assertThat
diff --git a/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/ScopesRule.kt b/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/ScopesRule.kt
index c611d1d..529d3bf 100644
--- a/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/ScopesRule.kt
+++ b/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/ScopesRule.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
+
 package androidx.lifecycle
 
 import androidx.arch.core.executor.ArchTaskExecutor
diff --git a/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/TransformationsTest.kt b/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/TransformationsTest.kt
index b3c6ed6..a90d49f 100644
--- a/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/TransformationsTest.kt
+++ b/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/TransformationsTest.kt
@@ -28,6 +28,7 @@
     @get:Rule
     val mInstantTaskExecutorRule = InstantTaskExecutorRule()
 
+    @OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
     private val lifecycleOwner = TestLifecycleOwner(
         coroutineDispatcher = TestCoroutineDispatcher())
 
diff --git a/lifecycle/lifecycle-reactivestreams-ktx/build.gradle b/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
index 75015d5..4e850f2 100644
--- a/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
+++ b/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
@@ -14,6 +14,9 @@
  * limitations under the License.
  */
 
+
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
 import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
@@ -47,3 +50,10 @@
   description = "Kotlin extensions for Lifecycle ReactiveStreams"
   url = AndroidXExtension.ARCHITECTURE_URL
 }
+
+// Allow usage of Kotlin's @OptIn.
+tasks.withType(KotlinCompile).configureEach {
+  kotlinOptions {
+    freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn"]
+  }
+}
\ No newline at end of file
diff --git a/lifecycle/lifecycle-reactivestreams-ktx/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.kt b/lifecycle/lifecycle-reactivestreams-ktx/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.kt
index d6233a9..9a5f938 100644
--- a/lifecycle/lifecycle-reactivestreams-ktx/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.kt
+++ b/lifecycle/lifecycle-reactivestreams-ktx/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.kt
@@ -32,6 +32,7 @@
     private lateinit var lifecycleOwner: LifecycleOwner
 
     @Before fun init() {
+        @OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
         lifecycleOwner = TestLifecycleOwner(coroutineDispatcher = TestCoroutineDispatcher())
     }
 
diff --git a/lifecycle/lifecycle-runtime-testing/build.gradle b/lifecycle/lifecycle-runtime-testing/build.gradle
index 47224d8..3cc4035 100644
--- a/lifecycle/lifecycle-runtime-testing/build.gradle
+++ b/lifecycle/lifecycle-runtime-testing/build.gradle
@@ -14,6 +14,9 @@
  * limitations under the License.
  */
 
+
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
 import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
@@ -56,3 +59,10 @@
     inceptionYear = "2019"
     description = "Testing utilities for 'lifecycle' artifact"
 }
+
+// Allow usage of Kotlin's @OptIn.
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn"]
+    }
+}
diff --git a/lifecycle/lifecycle-runtime-testing/src/test/java/androidx/lifecycle/testing/LifecycleRegistryTest.kt b/lifecycle/lifecycle-runtime-testing/src/test/java/androidx/lifecycle/testing/LifecycleRegistryTest.kt
index 93a4c78..4fba3da 100644
--- a/lifecycle/lifecycle-runtime-testing/src/test/java/androidx/lifecycle/testing/LifecycleRegistryTest.kt
+++ b/lifecycle/lifecycle-runtime-testing/src/test/java/androidx/lifecycle/testing/LifecycleRegistryTest.kt
@@ -26,8 +26,11 @@
 
 @RunWith(JUnit4::class)
 class LifecycleRegistryTest {
-    private val lifecycleOwner = TestLifecycleOwner(Lifecycle.State.INITIALIZED,
-        TestCoroutineDispatcher())
+    @OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
+    private val lifecycleOwner = TestLifecycleOwner(
+        Lifecycle.State.INITIALIZED,
+        TestCoroutineDispatcher()
+    )
 
     @Test
     fun getCurrentState() {
diff --git a/lifecycle/lifecycle-viewmodel-hilt/src/main/java/androidx/lifecycle/hilt/ViewModelKey.java b/lifecycle/lifecycle-viewmodel-hilt/src/main/java/androidx/lifecycle/hilt/ViewModelKey.java
deleted file mode 100644
index 8f1ad82..0000000
--- a/lifecycle/lifecycle-viewmodel-hilt/src/main/java/androidx/lifecycle/hilt/ViewModelKey.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.lifecycle.hilt;
-
-import androidx.annotation.RestrictTo;
-import androidx.lifecycle.ViewModel;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import dagger.MapKey;
-
-/**
- * Dagger multibinding key for ViewModels
- *
- * @hide
- */
-@MapKey
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-public @interface ViewModelKey {
-    /**
-     * The ViewModel class used as key.
-     * @return the class.
-     */
-    // TODO(danysantiago): Change to use strings and add optimizer rule to avoid class loading.
-    Class<? extends ViewModel> value();
-}
diff --git a/media/media/src/main/java/androidx/media/AudioAttributesCompat.java b/media/media/src/main/java/androidx/media/AudioAttributesCompat.java
index 891a56a..78f0b0d 100644
--- a/media/media/src/main/java/androidx/media/AudioAttributesCompat.java
+++ b/media/media/src/main/java/androidx/media/AudioAttributesCompat.java
@@ -241,6 +241,8 @@
     @ParcelField(1)
     public AudioAttributesImpl mImpl;
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     /** @hide */
     // It should be public to allow Parcelizers which never be de/jetified can access the
     // constructor.
diff --git a/media/media/src/main/java/androidx/media/AudioAttributesImplApi21.java b/media/media/src/main/java/androidx/media/AudioAttributesImplApi21.java
index 1689696..bd9401a 100644
--- a/media/media/src/main/java/androidx/media/AudioAttributesImplApi21.java
+++ b/media/media/src/main/java/androidx/media/AudioAttributesImplApi21.java
@@ -48,6 +48,8 @@
     @ParcelField(2)
     public int mLegacyStreamType = INVALID_STREAM_TYPE;
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     /** @hide */
     // It should be public to allow Parcelizers which never be de/jetified can access the
     // constructor.
diff --git a/media/media/src/main/java/androidx/media/AudioAttributesImplApi26.java b/media/media/src/main/java/androidx/media/AudioAttributesImplApi26.java
index 8f831a6..21c0faf 100644
--- a/media/media/src/main/java/androidx/media/AudioAttributesImplApi26.java
+++ b/media/media/src/main/java/androidx/media/AudioAttributesImplApi26.java
@@ -33,6 +33,8 @@
 public class AudioAttributesImplApi26 extends AudioAttributesImplApi21 {
     private static final String TAG = "AudioAttributesCompat26";
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     /** @hide */
     // It should be public to allow Parcelizers which never be de/jetified can access the
     // constructor.
diff --git a/media/media/src/main/java/androidx/media/AudioAttributesImplBase.java b/media/media/src/main/java/androidx/media/AudioAttributesImplBase.java
index ffb6677..7ac05be 100644
--- a/media/media/src/main/java/androidx/media/AudioAttributesImplBase.java
+++ b/media/media/src/main/java/androidx/media/AudioAttributesImplBase.java
@@ -78,6 +78,8 @@
     @ParcelField(4)
     public int mLegacyStream = INVALID_STREAM_TYPE;
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     /** @hide */
     // It should be public to allow Parcelizers which never be de/jetified can access the
     // constructor.
diff --git a/media2/common/src/main/java/androidx/media2/common/CallbackMediaItem.java b/media2/common/src/main/java/androidx/media2/common/CallbackMediaItem.java
index 7a78ec8..d9d444f 100644
--- a/media2/common/src/main/java/androidx/media2/common/CallbackMediaItem.java
+++ b/media2/common/src/main/java/androidx/media2/common/CallbackMediaItem.java
@@ -19,9 +19,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.core.util.Preconditions;
-import androidx.versionedparcelable.NonParcelField;
 import androidx.versionedparcelable.ParcelUtils;
-import androidx.versionedparcelable.VersionedParcelize;
 
 /**
  * Structure for media item descriptor for {@link DataSourceCallback}.
@@ -33,18 +31,8 @@
  *
  * @see MediaItem
  */
-@VersionedParcelize(isCustom = true)
 public class CallbackMediaItem extends MediaItem {
-    @NonParcelField
-    @SuppressWarnings("WeakerAccess") /* synthetic access */
-    DataSourceCallback mDataSourceCallback;
-
-    /**
-     * Used for VersionedParcelable
-     */
-    CallbackMediaItem() {
-        // no-op
-    }
+    private final DataSourceCallback mDataSourceCallback;
 
     CallbackMediaItem(Builder builder) {
         super(builder);
@@ -68,7 +56,7 @@
     public static final class Builder extends MediaItem.Builder {
 
         @SuppressWarnings("WeakerAccess") /* synthetic access */
-                DataSourceCallback mDataSourceCallback;
+        DataSourceCallback mDataSourceCallback;
 
         /**
          * Creates a new Builder object.
diff --git a/media2/common/src/main/java/androidx/media2/common/FileMediaItem.java b/media2/common/src/main/java/androidx/media2/common/FileMediaItem.java
index eeaa899..448cbee 100644
--- a/media2/common/src/main/java/androidx/media2/common/FileMediaItem.java
+++ b/media2/common/src/main/java/androidx/media2/common/FileMediaItem.java
@@ -26,9 +26,7 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.core.util.Preconditions;
-import androidx.versionedparcelable.NonParcelField;
 import androidx.versionedparcelable.ParcelUtils;
-import androidx.versionedparcelable.VersionedParcelize;
 
 import java.io.IOException;
 
@@ -42,7 +40,6 @@
  *
  * @see MediaItem
  */
-@VersionedParcelize(isCustom = true)
 public class FileMediaItem extends MediaItem {
     private static final String TAG = "FileMediaItem";
     /**
@@ -52,34 +49,18 @@
      */
     public static final long FD_LENGTH_UNKNOWN = LONG_MAX;
 
-    @NonParcelField
-    @SuppressWarnings("WeakerAccess") /* synthetic access */
-    ParcelFileDescriptor mPFD;
-    @NonParcelField
-    @SuppressWarnings("WeakerAccess") /* synthetic access */
-    long mFDOffset = 0;
-    @NonParcelField
-    @SuppressWarnings("WeakerAccess") /* synthetic access */
-    long mFDLength = FD_LENGTH_UNKNOWN;
+    private final ParcelFileDescriptor mPFD;
+    private final long mFDOffset;
+    private final long mFDLength;
 
-    @NonParcelField
     private final Object mLock = new Object();
 
-    @NonParcelField
     @GuardedBy("mLock")
     private int mRefCount;
 
-    @NonParcelField
     @GuardedBy("mLock")
     private boolean mClosed;
 
-    /**
-     * Used for VersionedParcelable
-     */
-    FileMediaItem() {
-        // no-op
-    }
-
     FileMediaItem(Builder builder) {
         super(builder);
         mPFD = builder.mPFD;
diff --git a/media2/common/src/main/java/androidx/media2/common/MediaItem.java b/media2/common/src/main/java/androidx/media2/common/MediaItem.java
index ef46c63..3146805 100644
--- a/media2/common/src/main/java/androidx/media2/common/MediaItem.java
+++ b/media2/common/src/main/java/androidx/media2/common/MediaItem.java
@@ -86,6 +86,8 @@
     @ParcelField(3)
     long mEndPositionMs = POSITION_UNKNOWN;
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     @GuardedBy("mLock")
     @NonParcelField
     private final List<Pair<OnMetadataChangedListener, Executor>> mListeners = new ArrayList<>();
diff --git a/media2/common/src/main/java/androidx/media2/common/MediaMetadata.java b/media2/common/src/main/java/androidx/media2/common/MediaMetadata.java
index a2744ee..0d2100b 100644
--- a/media2/common/src/main/java/androidx/media2/common/MediaMetadata.java
+++ b/media2/common/src/main/java/androidx/media2/common/MediaMetadata.java
@@ -750,6 +750,8 @@
     @ParcelField(2)
     ParcelImplListSlice mBitmapListSlice;
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     /**
      * Used for VersionedParcelable
      */
@@ -1260,6 +1262,8 @@
         @ParcelField(2)
         Bitmap mBitmap;
 
+        // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
         /**
          * Used for VersionedParcelable
          */
diff --git a/media2/common/src/main/java/androidx/media2/common/SessionPlayer.java b/media2/common/src/main/java/androidx/media2/common/SessionPlayer.java
index 16a6002..07bd21a 100644
--- a/media2/common/src/main/java/androidx/media2/common/SessionPlayer.java
+++ b/media2/common/src/main/java/androidx/media2/common/SessionPlayer.java
@@ -1067,6 +1067,8 @@
         @ParcelField(4)
         Bundle mParcelableFormatBundle;
 
+        // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
         /**
          * Used for VersionedParcelable
          */
diff --git a/media2/common/src/main/java/androidx/media2/common/SubtitleData.java b/media2/common/src/main/java/androidx/media2/common/SubtitleData.java
index c3bb7bf..0b33264 100644
--- a/media2/common/src/main/java/androidx/media2/common/SubtitleData.java
+++ b/media2/common/src/main/java/androidx/media2/common/SubtitleData.java
@@ -77,6 +77,8 @@
     @ParcelField(3)
     byte[] mData;
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     /**
      * Used for VersionedParcelable
      */
diff --git a/media2/common/src/main/java/androidx/media2/common/UriMediaItem.java b/media2/common/src/main/java/androidx/media2/common/UriMediaItem.java
index 103e9e0..f8e4f95 100644
--- a/media2/common/src/main/java/androidx/media2/common/UriMediaItem.java
+++ b/media2/common/src/main/java/androidx/media2/common/UriMediaItem.java
@@ -21,9 +21,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.core.util.Preconditions;
-import androidx.versionedparcelable.NonParcelField;
 import androidx.versionedparcelable.ParcelUtils;
-import androidx.versionedparcelable.VersionedParcelize;
 
 import java.net.CookieHandler;
 import java.net.CookieManager;
@@ -43,24 +41,10 @@
  *
  * @see MediaItem
  */
-@VersionedParcelize(isCustom = true)
 public class UriMediaItem extends MediaItem {
-    @NonParcelField
-    @SuppressWarnings("WeakerAccess") /* synthetic access */
-    Uri mUri;
-    @NonParcelField
-    @SuppressWarnings("WeakerAccess") /* synthetic access */
-    Map<String, String> mUriHeader;
-    @NonParcelField
-    @SuppressWarnings("WeakerAccess") /* synthetic access */
-    List<HttpCookie> mUriCookies;
-
-    /**
-     * Used for VersionedParcelable
-     */
-    UriMediaItem() {
-        // no-op
-    }
+    private final Uri mUri;
+    private final Map<String, String> mUriHeader;
+    private final List<HttpCookie> mUriCookies;
 
     UriMediaItem(Builder builder) {
         super(builder);
diff --git a/media2/common/src/main/java/androidx/media2/common/VideoSize.java b/media2/common/src/main/java/androidx/media2/common/VideoSize.java
index 82d23d8..3a6254c 100644
--- a/media2/common/src/main/java/androidx/media2/common/VideoSize.java
+++ b/media2/common/src/main/java/androidx/media2/common/VideoSize.java
@@ -33,6 +33,8 @@
     @ParcelField(2)
     int mHeight;
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     /**
      * Used for VersionedParcelable
      */
diff --git a/media2/integration-tests/testapp/src/main/AndroidManifest.xml b/media2/integration-tests/testapp/src/main/AndroidManifest.xml
index 302d180..b3401c3 100644
--- a/media2/integration-tests/testapp/src/main/AndroidManifest.xml
+++ b/media2/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -25,7 +25,8 @@
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
 
     <application android:label="Video View Test"
-                 android:supportsRtl="true">
+                 android:supportsRtl="true"
+                 android:requestLegacyExternalStorage="true">
 
         <activity android:name=".VideoSelectorActivity"
             android:theme="@style/Theme.AppCompat"
diff --git a/media2/session/src/main/java/androidx/media2/session/HeartRating.java b/media2/session/src/main/java/androidx/media2/session/HeartRating.java
index 431705e..68cdeb7 100644
--- a/media2/session/src/main/java/androidx/media2/session/HeartRating.java
+++ b/media2/session/src/main/java/androidx/media2/session/HeartRating.java
@@ -33,6 +33,8 @@
     @ParcelField(2)
     boolean mHasHeart;
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     /**
      * Creates a unrated HeartRating instance.
      */
diff --git a/media2/session/src/main/java/androidx/media2/session/LibraryResult.java b/media2/session/src/main/java/androidx/media2/session/LibraryResult.java
index be2c22c..6bb1ea5 100644
--- a/media2/session/src/main/java/androidx/media2/session/LibraryResult.java
+++ b/media2/session/src/main/java/androidx/media2/session/LibraryResult.java
@@ -86,6 +86,8 @@
     @ParcelField(5)
     ParcelImplListSlice mItemListSlice;
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     // For versioned parcelable
     LibraryResult() {
         // no-op.
diff --git a/media2/session/src/main/java/androidx/media2/session/MediaController.java b/media2/session/src/main/java/androidx/media2/session/MediaController.java
index c45f521..9f839ee 100644
--- a/media2/session/src/main/java/androidx/media2/session/MediaController.java
+++ b/media2/session/src/main/java/androidx/media2/session/MediaController.java
@@ -2187,6 +2187,8 @@
         @ParcelField(5)
         AudioAttributesCompat mAudioAttrsCompat;
 
+        // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
         /**
          * The session uses local playback.
          */
diff --git a/media2/session/src/main/java/androidx/media2/session/MediaLibraryService.java b/media2/session/src/main/java/androidx/media2/session/MediaLibraryService.java
index 9e5b8041..688aaaa 100644
--- a/media2/session/src/main/java/androidx/media2/session/MediaLibraryService.java
+++ b/media2/session/src/main/java/androidx/media2/session/MediaLibraryService.java
@@ -485,6 +485,8 @@
         @ParcelField(4)
         int mSuggested;
 
+        // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
         // For versioned parcelable.
         LibraryParams() {
             // no-op
diff --git a/media2/session/src/main/java/androidx/media2/session/MediaSession.java b/media2/session/src/main/java/androidx/media2/session/MediaSession.java
index 38f7bfe..d41f6e4 100644
--- a/media2/session/src/main/java/androidx/media2/session/MediaSession.java
+++ b/media2/session/src/main/java/androidx/media2/session/MediaSession.java
@@ -1028,6 +1028,8 @@
         @ParcelField(5)
         boolean mEnabled;
 
+        // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
         /**
          * Used for VersionedParcelable
          */
diff --git a/media2/session/src/main/java/androidx/media2/session/PercentageRating.java b/media2/session/src/main/java/androidx/media2/session/PercentageRating.java
index 78cfc88..33c2655 100644
--- a/media2/session/src/main/java/androidx/media2/session/PercentageRating.java
+++ b/media2/session/src/main/java/androidx/media2/session/PercentageRating.java
@@ -31,6 +31,8 @@
     @ParcelField(1)
     float mPercent;
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     /**
      * Creates a unrated PercentageRating instance.
      */
diff --git a/media2/session/src/main/java/androidx/media2/session/SessionCommand.java b/media2/session/src/main/java/androidx/media2/session/SessionCommand.java
index 30c0074..a8f353d 100644
--- a/media2/session/src/main/java/androidx/media2/session/SessionCommand.java
+++ b/media2/session/src/main/java/androidx/media2/session/SessionCommand.java
@@ -644,6 +644,8 @@
     @ParcelField(3)
     Bundle mCustomExtras;
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     /**
      * Used for VersionedParcelable.
      */
diff --git a/media2/session/src/main/java/androidx/media2/session/SessionCommandGroup.java b/media2/session/src/main/java/androidx/media2/session/SessionCommandGroup.java
index a85b01e..104370c 100644
--- a/media2/session/src/main/java/androidx/media2/session/SessionCommandGroup.java
+++ b/media2/session/src/main/java/androidx/media2/session/SessionCommandGroup.java
@@ -46,6 +46,8 @@
     @ParcelField(1)
     Set<SessionCommand> mCommands = new HashSet<>();
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     /**
      * Default Constructor.
      */
diff --git a/media2/session/src/main/java/androidx/media2/session/SessionResult.java b/media2/session/src/main/java/androidx/media2/session/SessionResult.java
index 0dee279..ae5d495 100644
--- a/media2/session/src/main/java/androidx/media2/session/SessionResult.java
+++ b/media2/session/src/main/java/androidx/media2/session/SessionResult.java
@@ -92,6 +92,8 @@
     @ParcelField(4)
     MediaItem mParcelableItem;
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     /**
      * Constructor to be used by {@link MediaSession.SessionCallback#onCustomCommand(
      * MediaSession, MediaSession.ControllerInfo, SessionCommand, Bundle)}.
diff --git a/media2/session/src/main/java/androidx/media2/session/SessionToken.java b/media2/session/src/main/java/androidx/media2/session/SessionToken.java
index f922e3c..486ec38 100644
--- a/media2/session/src/main/java/androidx/media2/session/SessionToken.java
+++ b/media2/session/src/main/java/androidx/media2/session/SessionToken.java
@@ -109,6 +109,8 @@
     @ParcelField(1)
     SessionTokenImpl mImpl;
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     /**
      * Constructor for the token. You can create token of {@link MediaSessionService},
      * {@link MediaLibraryService} or {@link MediaBrowserServiceCompat} for
diff --git a/media2/session/src/main/java/androidx/media2/session/SessionTokenImplBase.java b/media2/session/src/main/java/androidx/media2/session/SessionTokenImplBase.java
index 3db38e2..46555f6 100644
--- a/media2/session/src/main/java/androidx/media2/session/SessionTokenImplBase.java
+++ b/media2/session/src/main/java/androidx/media2/session/SessionTokenImplBase.java
@@ -51,6 +51,8 @@
     @NonParcelField // TODO(sungsoo): Change to @Parcelfield(8) once VersionedParcelable fixed.
     int mSessionVersion;
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     /**
      * Constructor for the token. You can only create token for session service or library service
      * to use by {@link MediaController} or {@link MediaBrowser}.
diff --git a/media2/session/src/main/java/androidx/media2/session/SessionTokenImplLegacy.java b/media2/session/src/main/java/androidx/media2/session/SessionTokenImplLegacy.java
index d7d383e..b4acee8 100644
--- a/media2/session/src/main/java/androidx/media2/session/SessionTokenImplLegacy.java
+++ b/media2/session/src/main/java/androidx/media2/session/SessionTokenImplLegacy.java
@@ -56,6 +56,8 @@
     @ParcelField(6)
     Bundle mExtras;
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     SessionTokenImplLegacy(MediaSessionCompat.Token token, String packageName, int uid,
             Bundle sessionInfo) {
         if (token == null) {
diff --git a/media2/session/src/main/java/androidx/media2/session/StarRating.java b/media2/session/src/main/java/androidx/media2/session/StarRating.java
index 82843ba8..168a87d 100644
--- a/media2/session/src/main/java/androidx/media2/session/StarRating.java
+++ b/media2/session/src/main/java/androidx/media2/session/StarRating.java
@@ -35,6 +35,8 @@
     @ParcelField(2)
     float mStarRating;
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     /*
      * Used for VersionedParcelable
      */
diff --git a/media2/session/src/main/java/androidx/media2/session/ThumbRating.java b/media2/session/src/main/java/androidx/media2/session/ThumbRating.java
index 2f6d301..40f3099 100644
--- a/media2/session/src/main/java/androidx/media2/session/ThumbRating.java
+++ b/media2/session/src/main/java/androidx/media2/session/ThumbRating.java
@@ -32,6 +32,8 @@
     @ParcelField(2)
     boolean mThumbUp;
 
+    // WARNING: Adding a new ParcelField may break old library users (b/152830728)
+
     /**
      * Creates a unrated ThumbRating instance.
      */
diff --git a/mediarouter/mediarouter/build.gradle b/mediarouter/mediarouter/build.gradle
index f17e537..9b00c81 100644
--- a/mediarouter/mediarouter/build.gradle
+++ b/mediarouter/mediarouter/build.gradle
@@ -10,7 +10,7 @@
 
 dependencies {
     api(project(":media:media"))
-    implementation(project(":core:core"))
+    implementation("androidx.core:core:1.3.0-beta01")
     implementation("androidx.appcompat:appcompat:1.0.2")
     implementation("androidx.palette:palette:1.0.0")
     implementation("androidx.recyclerview:recyclerview:1.0.0")
diff --git a/navigation/navigation-common-ktx/api/2.3.0-alpha04.txt b/navigation/navigation-common-ktx/api/2.3.0-alpha04.txt
index 14135e0..da0ae57 100644
--- a/navigation/navigation-common-ktx/api/2.3.0-alpha04.txt
+++ b/navigation/navigation-common-ktx/api/2.3.0-alpha04.txt
@@ -19,9 +19,11 @@
 
   @androidx.navigation.NavDestinationDsl public final class NavActionBuilder {
     ctor public NavActionBuilder();
+    method public java.util.Map<java.lang.String,java.lang.Object> getDefaultArguments();
     method public int getDestinationId();
     method public void navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
     method public void setDestinationId(int p);
+    property public final java.util.Map<java.lang.String,java.lang.Object> defaultArguments;
     property public final int destinationId;
   }
 
diff --git a/navigation/navigation-common-ktx/api/2.3.0-alpha05.txt b/navigation/navigation-common-ktx/api/2.3.0-alpha05.txt
new file mode 100644
index 0000000..da0ae57
--- /dev/null
+++ b/navigation/navigation-common-ktx/api/2.3.0-alpha05.txt
@@ -0,0 +1,126 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  @androidx.navigation.NavOptionsDsl public final class AnimBuilder {
+    ctor public AnimBuilder();
+    method public int getEnter();
+    method public int getExit();
+    method public int getPopEnter();
+    method public int getPopExit();
+    method public void setEnter(int p);
+    method public void setExit(int p);
+    method public void setPopEnter(int p);
+    method public void setPopExit(int p);
+    property public final int enter;
+    property public final int exit;
+    property public final int popEnter;
+    property public final int popExit;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavActionBuilder {
+    ctor public NavActionBuilder();
+    method public java.util.Map<java.lang.String,java.lang.Object> getDefaultArguments();
+    method public int getDestinationId();
+    method public void navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+    method public void setDestinationId(int p);
+    property public final java.util.Map<java.lang.String,java.lang.Object> defaultArguments;
+    property public final int destinationId;
+  }
+
+  public final class NavArgsLazy<Args extends androidx.navigation.NavArgs> implements kotlin.Lazy<Args> {
+    ctor public NavArgsLazy(kotlin.reflect.KClass<Args> navArgsClass, kotlin.jvm.functions.Function0<android.os.Bundle> argumentProducer);
+    method public Args getValue();
+    method public boolean isInitialized();
+    property public Args value;
+  }
+
+  public final class NavArgsLazyKt {
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavArgumentBuilder {
+    ctor public NavArgumentBuilder();
+    method public androidx.navigation.NavArgument build();
+    method public Object? getDefaultValue();
+    method public boolean getNullable();
+    method public androidx.navigation.NavType<?> getType();
+    method public void setDefaultValue(Object? value);
+    method public void setNullable(boolean value);
+    method public void setType(androidx.navigation.NavType<?> value);
+    property public final Object? defaultValue;
+    property public final boolean nullable;
+    property public final androidx.navigation.NavType<?> type;
+  }
+
+  @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
+    ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
+    method public final void action(int actionId, kotlin.jvm.functions.Function1<? super androidx.navigation.NavActionBuilder,kotlin.Unit> actionBuilder);
+    method public final void argument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> argumentBuilder);
+    method public D build();
+    method public final void deepLink(String uriPattern);
+    method public final int getId();
+    method public final CharSequence? getLabel();
+    method protected final androidx.navigation.Navigator<? extends D> getNavigator();
+    method public final void setLabel(CharSequence? p);
+    property public final CharSequence? label;
+  }
+
+  @kotlin.DslMarker public @interface NavDestinationDsl {
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.NavGraph> {
+    ctor public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    method public void addDestination(androidx.navigation.NavDestination destination);
+    method public androidx.navigation.NavGraph build();
+    method public <D extends androidx.navigation.NavDestination> void destination(androidx.navigation.NavDestinationBuilder<? extends D> navDestination);
+    method public androidx.navigation.NavigatorProvider getProvider();
+    method public operator void unaryPlus(androidx.navigation.NavDestination);
+  }
+
+  public final class NavGraphBuilderKt {
+    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void navigation(androidx.navigation.NavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavGraphKt {
+    method public static operator boolean contains(androidx.navigation.NavGraph, @IdRes int id);
+    method public static inline operator androidx.navigation.NavDestination get(androidx.navigation.NavGraph, @IdRes int id);
+    method public static inline operator void minusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+    method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+    method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavGraph other);
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class NavOptionsBuilder {
+    ctor public NavOptionsBuilder();
+    method public void anim(kotlin.jvm.functions.Function1<? super androidx.navigation.AnimBuilder,kotlin.Unit> animBuilder);
+    method public boolean getLaunchSingleTop();
+    method public int getPopUpTo();
+    method public void popUpTo(@IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
+    method public void setLaunchSingleTop(boolean p);
+    method public void setPopUpTo(int value);
+    property public final boolean launchSingleTop;
+    property public final int popUpTo;
+  }
+
+  public final class NavOptionsBuilderKt {
+    method public static androidx.navigation.NavOptions navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+  }
+
+  @kotlin.DslMarker public @interface NavOptionsDsl {
+  }
+
+  public final class NavigatorProviderKt {
+    method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, String name);
+    method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, kotlin.reflect.KClass<T> clazz);
+    method public static inline operator void plusAssign(androidx.navigation.NavigatorProvider, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+    method public static inline operator androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? set(androidx.navigation.NavigatorProvider, String name, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
+    ctor public PopUpToBuilder();
+    method public boolean getInclusive();
+    method public void setInclusive(boolean p);
+    property public final boolean inclusive;
+  }
+
+}
+
diff --git a/navigation/navigation-common-ktx/api/current.txt b/navigation/navigation-common-ktx/api/current.txt
index 14135e0..da0ae57 100644
--- a/navigation/navigation-common-ktx/api/current.txt
+++ b/navigation/navigation-common-ktx/api/current.txt
@@ -19,9 +19,11 @@
 
   @androidx.navigation.NavDestinationDsl public final class NavActionBuilder {
     ctor public NavActionBuilder();
+    method public java.util.Map<java.lang.String,java.lang.Object> getDefaultArguments();
     method public int getDestinationId();
     method public void navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
     method public void setDestinationId(int p);
+    property public final java.util.Map<java.lang.String,java.lang.Object> defaultArguments;
     property public final int destinationId;
   }
 
diff --git a/navigation/navigation-common-ktx/api/public_plus_experimental_2.3.0-alpha04.txt b/navigation/navigation-common-ktx/api/public_plus_experimental_2.3.0-alpha04.txt
index 14135e0..da0ae57 100644
--- a/navigation/navigation-common-ktx/api/public_plus_experimental_2.3.0-alpha04.txt
+++ b/navigation/navigation-common-ktx/api/public_plus_experimental_2.3.0-alpha04.txt
@@ -19,9 +19,11 @@
 
   @androidx.navigation.NavDestinationDsl public final class NavActionBuilder {
     ctor public NavActionBuilder();
+    method public java.util.Map<java.lang.String,java.lang.Object> getDefaultArguments();
     method public int getDestinationId();
     method public void navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
     method public void setDestinationId(int p);
+    property public final java.util.Map<java.lang.String,java.lang.Object> defaultArguments;
     property public final int destinationId;
   }
 
diff --git a/navigation/navigation-common-ktx/api/public_plus_experimental_2.3.0-alpha05.txt b/navigation/navigation-common-ktx/api/public_plus_experimental_2.3.0-alpha05.txt
new file mode 100644
index 0000000..da0ae57
--- /dev/null
+++ b/navigation/navigation-common-ktx/api/public_plus_experimental_2.3.0-alpha05.txt
@@ -0,0 +1,126 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  @androidx.navigation.NavOptionsDsl public final class AnimBuilder {
+    ctor public AnimBuilder();
+    method public int getEnter();
+    method public int getExit();
+    method public int getPopEnter();
+    method public int getPopExit();
+    method public void setEnter(int p);
+    method public void setExit(int p);
+    method public void setPopEnter(int p);
+    method public void setPopExit(int p);
+    property public final int enter;
+    property public final int exit;
+    property public final int popEnter;
+    property public final int popExit;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavActionBuilder {
+    ctor public NavActionBuilder();
+    method public java.util.Map<java.lang.String,java.lang.Object> getDefaultArguments();
+    method public int getDestinationId();
+    method public void navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+    method public void setDestinationId(int p);
+    property public final java.util.Map<java.lang.String,java.lang.Object> defaultArguments;
+    property public final int destinationId;
+  }
+
+  public final class NavArgsLazy<Args extends androidx.navigation.NavArgs> implements kotlin.Lazy<Args> {
+    ctor public NavArgsLazy(kotlin.reflect.KClass<Args> navArgsClass, kotlin.jvm.functions.Function0<android.os.Bundle> argumentProducer);
+    method public Args getValue();
+    method public boolean isInitialized();
+    property public Args value;
+  }
+
+  public final class NavArgsLazyKt {
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavArgumentBuilder {
+    ctor public NavArgumentBuilder();
+    method public androidx.navigation.NavArgument build();
+    method public Object? getDefaultValue();
+    method public boolean getNullable();
+    method public androidx.navigation.NavType<?> getType();
+    method public void setDefaultValue(Object? value);
+    method public void setNullable(boolean value);
+    method public void setType(androidx.navigation.NavType<?> value);
+    property public final Object? defaultValue;
+    property public final boolean nullable;
+    property public final androidx.navigation.NavType<?> type;
+  }
+
+  @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
+    ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
+    method public final void action(int actionId, kotlin.jvm.functions.Function1<? super androidx.navigation.NavActionBuilder,kotlin.Unit> actionBuilder);
+    method public final void argument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> argumentBuilder);
+    method public D build();
+    method public final void deepLink(String uriPattern);
+    method public final int getId();
+    method public final CharSequence? getLabel();
+    method protected final androidx.navigation.Navigator<? extends D> getNavigator();
+    method public final void setLabel(CharSequence? p);
+    property public final CharSequence? label;
+  }
+
+  @kotlin.DslMarker public @interface NavDestinationDsl {
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.NavGraph> {
+    ctor public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    method public void addDestination(androidx.navigation.NavDestination destination);
+    method public androidx.navigation.NavGraph build();
+    method public <D extends androidx.navigation.NavDestination> void destination(androidx.navigation.NavDestinationBuilder<? extends D> navDestination);
+    method public androidx.navigation.NavigatorProvider getProvider();
+    method public operator void unaryPlus(androidx.navigation.NavDestination);
+  }
+
+  public final class NavGraphBuilderKt {
+    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void navigation(androidx.navigation.NavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavGraphKt {
+    method public static operator boolean contains(androidx.navigation.NavGraph, @IdRes int id);
+    method public static inline operator androidx.navigation.NavDestination get(androidx.navigation.NavGraph, @IdRes int id);
+    method public static inline operator void minusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+    method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+    method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavGraph other);
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class NavOptionsBuilder {
+    ctor public NavOptionsBuilder();
+    method public void anim(kotlin.jvm.functions.Function1<? super androidx.navigation.AnimBuilder,kotlin.Unit> animBuilder);
+    method public boolean getLaunchSingleTop();
+    method public int getPopUpTo();
+    method public void popUpTo(@IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
+    method public void setLaunchSingleTop(boolean p);
+    method public void setPopUpTo(int value);
+    property public final boolean launchSingleTop;
+    property public final int popUpTo;
+  }
+
+  public final class NavOptionsBuilderKt {
+    method public static androidx.navigation.NavOptions navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+  }
+
+  @kotlin.DslMarker public @interface NavOptionsDsl {
+  }
+
+  public final class NavigatorProviderKt {
+    method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, String name);
+    method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, kotlin.reflect.KClass<T> clazz);
+    method public static inline operator void plusAssign(androidx.navigation.NavigatorProvider, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+    method public static inline operator androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? set(androidx.navigation.NavigatorProvider, String name, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
+    ctor public PopUpToBuilder();
+    method public boolean getInclusive();
+    method public void setInclusive(boolean p);
+    property public final boolean inclusive;
+  }
+
+}
+
diff --git a/navigation/navigation-common-ktx/api/public_plus_experimental_current.txt b/navigation/navigation-common-ktx/api/public_plus_experimental_current.txt
index 14135e0..da0ae57 100644
--- a/navigation/navigation-common-ktx/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-common-ktx/api/public_plus_experimental_current.txt
@@ -19,9 +19,11 @@
 
   @androidx.navigation.NavDestinationDsl public final class NavActionBuilder {
     ctor public NavActionBuilder();
+    method public java.util.Map<java.lang.String,java.lang.Object> getDefaultArguments();
     method public int getDestinationId();
     method public void navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
     method public void setDestinationId(int p);
+    property public final java.util.Map<java.lang.String,java.lang.Object> defaultArguments;
     property public final int destinationId;
   }
 
diff --git a/ui/ui-android-text/api/res-0.1.0-dev05.txt b/navigation/navigation-common-ktx/api/res-2.3.0-alpha05.txt
similarity index 100%
copy from ui/ui-android-text/api/res-0.1.0-dev05.txt
copy to navigation/navigation-common-ktx/api/res-2.3.0-alpha05.txt
diff --git a/navigation/navigation-common-ktx/api/restricted_2.3.0-alpha04.txt b/navigation/navigation-common-ktx/api/restricted_2.3.0-alpha04.txt
index 14135e0..da0ae57 100644
--- a/navigation/navigation-common-ktx/api/restricted_2.3.0-alpha04.txt
+++ b/navigation/navigation-common-ktx/api/restricted_2.3.0-alpha04.txt
@@ -19,9 +19,11 @@
 
   @androidx.navigation.NavDestinationDsl public final class NavActionBuilder {
     ctor public NavActionBuilder();
+    method public java.util.Map<java.lang.String,java.lang.Object> getDefaultArguments();
     method public int getDestinationId();
     method public void navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
     method public void setDestinationId(int p);
+    property public final java.util.Map<java.lang.String,java.lang.Object> defaultArguments;
     property public final int destinationId;
   }
 
diff --git a/navigation/navigation-common-ktx/api/restricted_2.3.0-alpha05.txt b/navigation/navigation-common-ktx/api/restricted_2.3.0-alpha05.txt
new file mode 100644
index 0000000..da0ae57
--- /dev/null
+++ b/navigation/navigation-common-ktx/api/restricted_2.3.0-alpha05.txt
@@ -0,0 +1,126 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  @androidx.navigation.NavOptionsDsl public final class AnimBuilder {
+    ctor public AnimBuilder();
+    method public int getEnter();
+    method public int getExit();
+    method public int getPopEnter();
+    method public int getPopExit();
+    method public void setEnter(int p);
+    method public void setExit(int p);
+    method public void setPopEnter(int p);
+    method public void setPopExit(int p);
+    property public final int enter;
+    property public final int exit;
+    property public final int popEnter;
+    property public final int popExit;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavActionBuilder {
+    ctor public NavActionBuilder();
+    method public java.util.Map<java.lang.String,java.lang.Object> getDefaultArguments();
+    method public int getDestinationId();
+    method public void navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+    method public void setDestinationId(int p);
+    property public final java.util.Map<java.lang.String,java.lang.Object> defaultArguments;
+    property public final int destinationId;
+  }
+
+  public final class NavArgsLazy<Args extends androidx.navigation.NavArgs> implements kotlin.Lazy<Args> {
+    ctor public NavArgsLazy(kotlin.reflect.KClass<Args> navArgsClass, kotlin.jvm.functions.Function0<android.os.Bundle> argumentProducer);
+    method public Args getValue();
+    method public boolean isInitialized();
+    property public Args value;
+  }
+
+  public final class NavArgsLazyKt {
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavArgumentBuilder {
+    ctor public NavArgumentBuilder();
+    method public androidx.navigation.NavArgument build();
+    method public Object? getDefaultValue();
+    method public boolean getNullable();
+    method public androidx.navigation.NavType<?> getType();
+    method public void setDefaultValue(Object? value);
+    method public void setNullable(boolean value);
+    method public void setType(androidx.navigation.NavType<?> value);
+    property public final Object? defaultValue;
+    property public final boolean nullable;
+    property public final androidx.navigation.NavType<?> type;
+  }
+
+  @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
+    ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
+    method public final void action(int actionId, kotlin.jvm.functions.Function1<? super androidx.navigation.NavActionBuilder,kotlin.Unit> actionBuilder);
+    method public final void argument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> argumentBuilder);
+    method public D build();
+    method public final void deepLink(String uriPattern);
+    method public final int getId();
+    method public final CharSequence? getLabel();
+    method protected final androidx.navigation.Navigator<? extends D> getNavigator();
+    method public final void setLabel(CharSequence? p);
+    property public final CharSequence? label;
+  }
+
+  @kotlin.DslMarker public @interface NavDestinationDsl {
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.NavGraph> {
+    ctor public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    method public void addDestination(androidx.navigation.NavDestination destination);
+    method public androidx.navigation.NavGraph build();
+    method public <D extends androidx.navigation.NavDestination> void destination(androidx.navigation.NavDestinationBuilder<? extends D> navDestination);
+    method public androidx.navigation.NavigatorProvider getProvider();
+    method public operator void unaryPlus(androidx.navigation.NavDestination);
+  }
+
+  public final class NavGraphBuilderKt {
+    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void navigation(androidx.navigation.NavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavGraphKt {
+    method public static operator boolean contains(androidx.navigation.NavGraph, @IdRes int id);
+    method public static inline operator androidx.navigation.NavDestination get(androidx.navigation.NavGraph, @IdRes int id);
+    method public static inline operator void minusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+    method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+    method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavGraph other);
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class NavOptionsBuilder {
+    ctor public NavOptionsBuilder();
+    method public void anim(kotlin.jvm.functions.Function1<? super androidx.navigation.AnimBuilder,kotlin.Unit> animBuilder);
+    method public boolean getLaunchSingleTop();
+    method public int getPopUpTo();
+    method public void popUpTo(@IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
+    method public void setLaunchSingleTop(boolean p);
+    method public void setPopUpTo(int value);
+    property public final boolean launchSingleTop;
+    property public final int popUpTo;
+  }
+
+  public final class NavOptionsBuilderKt {
+    method public static androidx.navigation.NavOptions navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+  }
+
+  @kotlin.DslMarker public @interface NavOptionsDsl {
+  }
+
+  public final class NavigatorProviderKt {
+    method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, String name);
+    method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, kotlin.reflect.KClass<T> clazz);
+    method public static inline operator void plusAssign(androidx.navigation.NavigatorProvider, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+    method public static inline operator androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? set(androidx.navigation.NavigatorProvider, String name, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
+    ctor public PopUpToBuilder();
+    method public boolean getInclusive();
+    method public void setInclusive(boolean p);
+    property public final boolean inclusive;
+  }
+
+}
+
diff --git a/navigation/navigation-common-ktx/api/restricted_current.txt b/navigation/navigation-common-ktx/api/restricted_current.txt
index 14135e0..da0ae57 100644
--- a/navigation/navigation-common-ktx/api/restricted_current.txt
+++ b/navigation/navigation-common-ktx/api/restricted_current.txt
@@ -19,9 +19,11 @@
 
   @androidx.navigation.NavDestinationDsl public final class NavActionBuilder {
     ctor public NavActionBuilder();
+    method public java.util.Map<java.lang.String,java.lang.Object> getDefaultArguments();
     method public int getDestinationId();
     method public void navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
     method public void setDestinationId(int p);
+    property public final java.util.Map<java.lang.String,java.lang.Object> defaultArguments;
     property public final int destinationId;
   }
 
diff --git a/navigation/navigation-common-ktx/build.gradle b/navigation/navigation-common-ktx/build.gradle
index ff36eda..d3dfab9 100644
--- a/navigation/navigation-common-ktx/build.gradle
+++ b/navigation/navigation-common-ktx/build.gradle
@@ -40,6 +40,7 @@
 
 dependencies {
     api(project(":navigation:navigation-common"))
+    implementation("androidx.core:core-ktx:1.1.0")
     implementation("androidx.collection:collection:1.1.0")
 
     api(KOTLIN_STDLIB)
diff --git a/navigation/navigation-common-ktx/src/androidTest/java/androidx/navigation/NavDestinationBuilderTest.kt b/navigation/navigation-common-ktx/src/androidTest/java/androidx/navigation/NavDestinationBuilderTest.kt
index eea00fe..1616bbb 100644
--- a/navigation/navigation-common-ktx/src/androidTest/java/androidx/navigation/NavDestinationBuilderTest.kt
+++ b/navigation/navigation-common-ktx/src/androidTest/java/androidx/navigation/NavDestinationBuilderTest.kt
@@ -88,6 +88,7 @@
                 navOptions {
                     popUpTo = DESTINATION_ID
                 }
+                defaultArguments[ACTION_ARGUMENT_KEY] = ACTION_ARGUMENT_VALUE
             }
         }
         val action = destination.getAction(ACTION_ID)
@@ -97,12 +98,17 @@
         assertWithMessage("NavAction should have NavOptions set")
             .that(action?.navOptions?.popUpTo)
             .isEqualTo(DESTINATION_ID)
+        assertWithMessage("NavAction should have its default argument set")
+            .that(action?.defaultArguments?.getString(ACTION_ARGUMENT_KEY))
+            .isEqualTo(ACTION_ARGUMENT_VALUE)
     }
 }
 
 private const val DESTINATION_ID = 1
 private const val LABEL = "TEST"
 private const val ACTION_ID = 1
+private const val ACTION_ARGUMENT_KEY = "KEY"
+private const val ACTION_ARGUMENT_VALUE = "VALUE"
 
 /**
  * Instead of constructing a NavGraph from the NavigatorProvider, construct
diff --git a/navigation/navigation-common-ktx/src/main/java/androidx/navigation/NavDestinationBuilder.kt b/navigation/navigation-common-ktx/src/main/java/androidx/navigation/NavDestinationBuilder.kt
index adb4d73..c2ad092 100644
--- a/navigation/navigation-common-ktx/src/main/java/androidx/navigation/NavDestinationBuilder.kt
+++ b/navigation/navigation-common-ktx/src/main/java/androidx/navigation/NavDestinationBuilder.kt
@@ -17,6 +17,7 @@
 package androidx.navigation
 
 import androidx.annotation.IdRes
+import androidx.core.os.bundleOf
 
 @DslMarker
 annotation class NavDestinationDsl
@@ -105,6 +106,17 @@
      */
     var destinationId: Int = 0
 
+    /**
+     * The set of default arguments that should be passed to the destination. The keys
+     * used here should be the same as those used on the [NavDestinationBuilder.argument]
+     * for the destination.
+     *
+     * All values added here should be able to be added to a [android.os.Bundle].
+     *
+     * @see NavAction.getDefaultArguments
+     */
+    val defaultArguments = mutableMapOf<String, Any?>()
+
     private var navOptions: NavOptions? = null
 
     /**
@@ -114,7 +126,11 @@
         navOptions = NavOptionsBuilder().apply(optionsBuilder).build()
     }
 
-    internal fun build() = NavAction(destinationId, navOptions)
+    internal fun build() = NavAction(destinationId, navOptions,
+        if (defaultArguments.isEmpty())
+            null
+        else
+            bundleOf(*defaultArguments.toList().toTypedArray()))
 }
 
 /**
diff --git a/navigation/navigation-common/api/2.3.0-alpha05.txt b/navigation/navigation-common/api/2.3.0-alpha05.txt
new file mode 100644
index 0000000..736fe0f
--- /dev/null
+++ b/navigation/navigation-common/api/2.3.0-alpha05.txt
@@ -0,0 +1,196 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  public final class ActionOnlyNavDirections implements androidx.navigation.NavDirections {
+    ctor public ActionOnlyNavDirections(int);
+    method public int getActionId();
+    method public android.os.Bundle getArguments();
+  }
+
+  public interface FloatingWindow {
+  }
+
+  public final class NavAction {
+    ctor public NavAction(@IdRes int);
+    ctor public NavAction(@IdRes int, androidx.navigation.NavOptions?);
+    ctor public NavAction(@IdRes int, androidx.navigation.NavOptions?, android.os.Bundle?);
+    method public android.os.Bundle? getDefaultArguments();
+    method public int getDestinationId();
+    method public androidx.navigation.NavOptions? getNavOptions();
+    method public void setDefaultArguments(android.os.Bundle?);
+    method public void setNavOptions(androidx.navigation.NavOptions?);
+  }
+
+  public interface NavArgs {
+  }
+
+  public final class NavArgument {
+    method public Object? getDefaultValue();
+    method public androidx.navigation.NavType<?> getType();
+    method public boolean isDefaultValuePresent();
+    method public boolean isNullable();
+  }
+
+  public static final class NavArgument.Builder {
+    ctor public NavArgument.Builder();
+    method public androidx.navigation.NavArgument build();
+    method public androidx.navigation.NavArgument.Builder setDefaultValue(Object?);
+    method public androidx.navigation.NavArgument.Builder setIsNullable(boolean);
+    method public androidx.navigation.NavArgument.Builder setType(androidx.navigation.NavType<?>);
+  }
+
+  public class NavDestination {
+    ctor public NavDestination(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+    ctor public NavDestination(String);
+    method public final void addArgument(String, androidx.navigation.NavArgument);
+    method public final void addDeepLink(String);
+    method public final androidx.navigation.NavAction? getAction(@IdRes int);
+    method public final java.util.Map<java.lang.String!,androidx.navigation.NavArgument!> getArguments();
+    method @IdRes public final int getId();
+    method public final CharSequence? getLabel();
+    method public final String getNavigatorName();
+    method public final androidx.navigation.NavGraph? getParent();
+    method public boolean hasDeepLink(android.net.Uri);
+    method @CallSuper public void onInflate(android.content.Context, android.util.AttributeSet);
+    method protected static <C> Class<? extends C> parseClassFromName(android.content.Context, String, Class<? extends C>);
+    method public final void putAction(@IdRes int, @IdRes int);
+    method public final void putAction(@IdRes int, androidx.navigation.NavAction);
+    method public final void removeAction(@IdRes int);
+    method public final void removeArgument(String);
+    method public final void setId(@IdRes int);
+    method public final void setLabel(CharSequence?);
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface NavDestination.ClassType {
+    method public abstract Class<?> value();
+  }
+
+  public interface NavDirections {
+    method @IdRes public int getActionId();
+    method public android.os.Bundle getArguments();
+  }
+
+  public class NavGraph extends androidx.navigation.NavDestination implements java.lang.Iterable<androidx.navigation.NavDestination> {
+    ctor public NavGraph(androidx.navigation.Navigator<? extends androidx.navigation.NavGraph>);
+    method public final void addAll(androidx.navigation.NavGraph);
+    method public final void addDestination(androidx.navigation.NavDestination);
+    method public final void addDestinations(java.util.Collection<androidx.navigation.NavDestination!>);
+    method public final void addDestinations(androidx.navigation.NavDestination!...);
+    method public final void clear();
+    method public final androidx.navigation.NavDestination? findNode(@IdRes int);
+    method @IdRes public final int getStartDestination();
+    method public final java.util.Iterator<androidx.navigation.NavDestination!> iterator();
+    method public final void remove(androidx.navigation.NavDestination);
+    method public final void setStartDestination(@IdRes int);
+  }
+
+  @androidx.navigation.Navigator.Name("navigation") public class NavGraphNavigator extends androidx.navigation.Navigator<androidx.navigation.NavGraph> {
+    ctor public NavGraphNavigator(androidx.navigation.NavigatorProvider);
+    method public androidx.navigation.NavGraph createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.NavGraph, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  public final class NavOptions {
+    method @AnimRes @AnimatorRes public int getEnterAnim();
+    method @AnimRes @AnimatorRes public int getExitAnim();
+    method @AnimRes @AnimatorRes public int getPopEnterAnim();
+    method @AnimRes @AnimatorRes public int getPopExitAnim();
+    method @IdRes public int getPopUpTo();
+    method public boolean isPopUpToInclusive();
+    method public boolean shouldLaunchSingleTop();
+  }
+
+  public static final class NavOptions.Builder {
+    ctor public NavOptions.Builder();
+    method public androidx.navigation.NavOptions build();
+    method public androidx.navigation.NavOptions.Builder setEnterAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setExitAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setLaunchSingleTop(boolean);
+    method public androidx.navigation.NavOptions.Builder setPopEnterAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setPopExitAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setPopUpTo(@IdRes int, boolean);
+  }
+
+  public abstract class NavType<T> {
+    method public static androidx.navigation.NavType<?> fromArgType(String?, String?);
+    method public abstract T? get(android.os.Bundle, String);
+    method public abstract String getName();
+    method public boolean isNullableAllowed();
+    method public abstract T parseValue(String);
+    method public abstract void put(android.os.Bundle, String, T?);
+    field public static final androidx.navigation.NavType<boolean[]!> BoolArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Boolean!> BoolType;
+    field public static final androidx.navigation.NavType<float[]!> FloatArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Float!> FloatType;
+    field public static final androidx.navigation.NavType<int[]!> IntArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Integer!> IntType;
+    field public static final androidx.navigation.NavType<long[]!> LongArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Long!> LongType;
+    field public static final androidx.navigation.NavType<java.lang.Integer!> ReferenceType;
+    field public static final androidx.navigation.NavType<java.lang.String![]!> StringArrayType;
+    field public static final androidx.navigation.NavType<java.lang.String!> StringType;
+  }
+
+  public static final class NavType.EnumType<D extends java.lang.Enum> extends androidx.navigation.NavType.SerializableType<D> {
+    ctor public NavType.EnumType(Class<D!>);
+  }
+
+  public static final class NavType.ParcelableArrayType<D extends android.os.Parcelable> extends androidx.navigation.NavType<D[]> {
+    ctor public NavType.ParcelableArrayType(Class<D!>);
+    method public D![]? get(android.os.Bundle, String);
+    method public String getName();
+    method public D![] parseValue(String);
+    method public void put(android.os.Bundle, String, D![]?);
+  }
+
+  public static final class NavType.ParcelableType<D> extends androidx.navigation.NavType<D> {
+    ctor public NavType.ParcelableType(Class<D!>);
+    method public D? get(android.os.Bundle, String);
+    method public String getName();
+    method public D parseValue(String);
+    method public void put(android.os.Bundle, String, D?);
+  }
+
+  public static final class NavType.SerializableArrayType<D extends java.io.Serializable> extends androidx.navigation.NavType<D[]> {
+    ctor public NavType.SerializableArrayType(Class<D!>);
+    method public D![]? get(android.os.Bundle, String);
+    method public String getName();
+    method public D![] parseValue(String);
+    method public void put(android.os.Bundle, String, D![]?);
+  }
+
+  public static class NavType.SerializableType<D extends java.io.Serializable> extends androidx.navigation.NavType<D> {
+    ctor public NavType.SerializableType(Class<D!>);
+    method public D? get(android.os.Bundle, String);
+    method public String getName();
+    method public D parseValue(String);
+    method public void put(android.os.Bundle, String, D?);
+  }
+
+  public abstract class Navigator<D extends androidx.navigation.NavDestination> {
+    ctor public Navigator();
+    method public abstract D createDestination();
+    method public abstract androidx.navigation.NavDestination? navigate(D, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public void onRestoreState(android.os.Bundle);
+    method public android.os.Bundle? onSaveState();
+    method public abstract boolean popBackStack();
+  }
+
+  public static interface Navigator.Extras {
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface Navigator.Name {
+    method public abstract String value();
+  }
+
+  public class NavigatorProvider {
+    ctor public NavigatorProvider();
+    method public final androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+    method @CallSuper public androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(String, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+    method public final <T extends androidx.navigation.Navigator<?>> T getNavigator(Class<T!>);
+    method @CallSuper public <T extends androidx.navigation.Navigator<?>> T getNavigator(String);
+  }
+
+}
+
diff --git a/navigation/navigation-common/api/public_plus_experimental_2.3.0-alpha05.txt b/navigation/navigation-common/api/public_plus_experimental_2.3.0-alpha05.txt
new file mode 100644
index 0000000..736fe0f
--- /dev/null
+++ b/navigation/navigation-common/api/public_plus_experimental_2.3.0-alpha05.txt
@@ -0,0 +1,196 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  public final class ActionOnlyNavDirections implements androidx.navigation.NavDirections {
+    ctor public ActionOnlyNavDirections(int);
+    method public int getActionId();
+    method public android.os.Bundle getArguments();
+  }
+
+  public interface FloatingWindow {
+  }
+
+  public final class NavAction {
+    ctor public NavAction(@IdRes int);
+    ctor public NavAction(@IdRes int, androidx.navigation.NavOptions?);
+    ctor public NavAction(@IdRes int, androidx.navigation.NavOptions?, android.os.Bundle?);
+    method public android.os.Bundle? getDefaultArguments();
+    method public int getDestinationId();
+    method public androidx.navigation.NavOptions? getNavOptions();
+    method public void setDefaultArguments(android.os.Bundle?);
+    method public void setNavOptions(androidx.navigation.NavOptions?);
+  }
+
+  public interface NavArgs {
+  }
+
+  public final class NavArgument {
+    method public Object? getDefaultValue();
+    method public androidx.navigation.NavType<?> getType();
+    method public boolean isDefaultValuePresent();
+    method public boolean isNullable();
+  }
+
+  public static final class NavArgument.Builder {
+    ctor public NavArgument.Builder();
+    method public androidx.navigation.NavArgument build();
+    method public androidx.navigation.NavArgument.Builder setDefaultValue(Object?);
+    method public androidx.navigation.NavArgument.Builder setIsNullable(boolean);
+    method public androidx.navigation.NavArgument.Builder setType(androidx.navigation.NavType<?>);
+  }
+
+  public class NavDestination {
+    ctor public NavDestination(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+    ctor public NavDestination(String);
+    method public final void addArgument(String, androidx.navigation.NavArgument);
+    method public final void addDeepLink(String);
+    method public final androidx.navigation.NavAction? getAction(@IdRes int);
+    method public final java.util.Map<java.lang.String!,androidx.navigation.NavArgument!> getArguments();
+    method @IdRes public final int getId();
+    method public final CharSequence? getLabel();
+    method public final String getNavigatorName();
+    method public final androidx.navigation.NavGraph? getParent();
+    method public boolean hasDeepLink(android.net.Uri);
+    method @CallSuper public void onInflate(android.content.Context, android.util.AttributeSet);
+    method protected static <C> Class<? extends C> parseClassFromName(android.content.Context, String, Class<? extends C>);
+    method public final void putAction(@IdRes int, @IdRes int);
+    method public final void putAction(@IdRes int, androidx.navigation.NavAction);
+    method public final void removeAction(@IdRes int);
+    method public final void removeArgument(String);
+    method public final void setId(@IdRes int);
+    method public final void setLabel(CharSequence?);
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface NavDestination.ClassType {
+    method public abstract Class<?> value();
+  }
+
+  public interface NavDirections {
+    method @IdRes public int getActionId();
+    method public android.os.Bundle getArguments();
+  }
+
+  public class NavGraph extends androidx.navigation.NavDestination implements java.lang.Iterable<androidx.navigation.NavDestination> {
+    ctor public NavGraph(androidx.navigation.Navigator<? extends androidx.navigation.NavGraph>);
+    method public final void addAll(androidx.navigation.NavGraph);
+    method public final void addDestination(androidx.navigation.NavDestination);
+    method public final void addDestinations(java.util.Collection<androidx.navigation.NavDestination!>);
+    method public final void addDestinations(androidx.navigation.NavDestination!...);
+    method public final void clear();
+    method public final androidx.navigation.NavDestination? findNode(@IdRes int);
+    method @IdRes public final int getStartDestination();
+    method public final java.util.Iterator<androidx.navigation.NavDestination!> iterator();
+    method public final void remove(androidx.navigation.NavDestination);
+    method public final void setStartDestination(@IdRes int);
+  }
+
+  @androidx.navigation.Navigator.Name("navigation") public class NavGraphNavigator extends androidx.navigation.Navigator<androidx.navigation.NavGraph> {
+    ctor public NavGraphNavigator(androidx.navigation.NavigatorProvider);
+    method public androidx.navigation.NavGraph createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.NavGraph, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  public final class NavOptions {
+    method @AnimRes @AnimatorRes public int getEnterAnim();
+    method @AnimRes @AnimatorRes public int getExitAnim();
+    method @AnimRes @AnimatorRes public int getPopEnterAnim();
+    method @AnimRes @AnimatorRes public int getPopExitAnim();
+    method @IdRes public int getPopUpTo();
+    method public boolean isPopUpToInclusive();
+    method public boolean shouldLaunchSingleTop();
+  }
+
+  public static final class NavOptions.Builder {
+    ctor public NavOptions.Builder();
+    method public androidx.navigation.NavOptions build();
+    method public androidx.navigation.NavOptions.Builder setEnterAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setExitAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setLaunchSingleTop(boolean);
+    method public androidx.navigation.NavOptions.Builder setPopEnterAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setPopExitAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setPopUpTo(@IdRes int, boolean);
+  }
+
+  public abstract class NavType<T> {
+    method public static androidx.navigation.NavType<?> fromArgType(String?, String?);
+    method public abstract T? get(android.os.Bundle, String);
+    method public abstract String getName();
+    method public boolean isNullableAllowed();
+    method public abstract T parseValue(String);
+    method public abstract void put(android.os.Bundle, String, T?);
+    field public static final androidx.navigation.NavType<boolean[]!> BoolArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Boolean!> BoolType;
+    field public static final androidx.navigation.NavType<float[]!> FloatArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Float!> FloatType;
+    field public static final androidx.navigation.NavType<int[]!> IntArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Integer!> IntType;
+    field public static final androidx.navigation.NavType<long[]!> LongArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Long!> LongType;
+    field public static final androidx.navigation.NavType<java.lang.Integer!> ReferenceType;
+    field public static final androidx.navigation.NavType<java.lang.String![]!> StringArrayType;
+    field public static final androidx.navigation.NavType<java.lang.String!> StringType;
+  }
+
+  public static final class NavType.EnumType<D extends java.lang.Enum> extends androidx.navigation.NavType.SerializableType<D> {
+    ctor public NavType.EnumType(Class<D!>);
+  }
+
+  public static final class NavType.ParcelableArrayType<D extends android.os.Parcelable> extends androidx.navigation.NavType<D[]> {
+    ctor public NavType.ParcelableArrayType(Class<D!>);
+    method public D![]? get(android.os.Bundle, String);
+    method public String getName();
+    method public D![] parseValue(String);
+    method public void put(android.os.Bundle, String, D![]?);
+  }
+
+  public static final class NavType.ParcelableType<D> extends androidx.navigation.NavType<D> {
+    ctor public NavType.ParcelableType(Class<D!>);
+    method public D? get(android.os.Bundle, String);
+    method public String getName();
+    method public D parseValue(String);
+    method public void put(android.os.Bundle, String, D?);
+  }
+
+  public static final class NavType.SerializableArrayType<D extends java.io.Serializable> extends androidx.navigation.NavType<D[]> {
+    ctor public NavType.SerializableArrayType(Class<D!>);
+    method public D![]? get(android.os.Bundle, String);
+    method public String getName();
+    method public D![] parseValue(String);
+    method public void put(android.os.Bundle, String, D![]?);
+  }
+
+  public static class NavType.SerializableType<D extends java.io.Serializable> extends androidx.navigation.NavType<D> {
+    ctor public NavType.SerializableType(Class<D!>);
+    method public D? get(android.os.Bundle, String);
+    method public String getName();
+    method public D parseValue(String);
+    method public void put(android.os.Bundle, String, D?);
+  }
+
+  public abstract class Navigator<D extends androidx.navigation.NavDestination> {
+    ctor public Navigator();
+    method public abstract D createDestination();
+    method public abstract androidx.navigation.NavDestination? navigate(D, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public void onRestoreState(android.os.Bundle);
+    method public android.os.Bundle? onSaveState();
+    method public abstract boolean popBackStack();
+  }
+
+  public static interface Navigator.Extras {
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface Navigator.Name {
+    method public abstract String value();
+  }
+
+  public class NavigatorProvider {
+    ctor public NavigatorProvider();
+    method public final androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+    method @CallSuper public androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(String, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+    method public final <T extends androidx.navigation.Navigator<?>> T getNavigator(Class<T!>);
+    method @CallSuper public <T extends androidx.navigation.Navigator<?>> T getNavigator(String);
+  }
+
+}
+
diff --git a/ui/ui-android-text/api/res-0.1.0-dev05.txt b/navigation/navigation-common/api/res-2.3.0-alpha05.txt
similarity index 100%
copy from ui/ui-android-text/api/res-0.1.0-dev05.txt
copy to navigation/navigation-common/api/res-2.3.0-alpha05.txt
diff --git a/navigation/navigation-common/api/restricted_2.3.0-alpha05.txt b/navigation/navigation-common/api/restricted_2.3.0-alpha05.txt
new file mode 100644
index 0000000..736fe0f
--- /dev/null
+++ b/navigation/navigation-common/api/restricted_2.3.0-alpha05.txt
@@ -0,0 +1,196 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  public final class ActionOnlyNavDirections implements androidx.navigation.NavDirections {
+    ctor public ActionOnlyNavDirections(int);
+    method public int getActionId();
+    method public android.os.Bundle getArguments();
+  }
+
+  public interface FloatingWindow {
+  }
+
+  public final class NavAction {
+    ctor public NavAction(@IdRes int);
+    ctor public NavAction(@IdRes int, androidx.navigation.NavOptions?);
+    ctor public NavAction(@IdRes int, androidx.navigation.NavOptions?, android.os.Bundle?);
+    method public android.os.Bundle? getDefaultArguments();
+    method public int getDestinationId();
+    method public androidx.navigation.NavOptions? getNavOptions();
+    method public void setDefaultArguments(android.os.Bundle?);
+    method public void setNavOptions(androidx.navigation.NavOptions?);
+  }
+
+  public interface NavArgs {
+  }
+
+  public final class NavArgument {
+    method public Object? getDefaultValue();
+    method public androidx.navigation.NavType<?> getType();
+    method public boolean isDefaultValuePresent();
+    method public boolean isNullable();
+  }
+
+  public static final class NavArgument.Builder {
+    ctor public NavArgument.Builder();
+    method public androidx.navigation.NavArgument build();
+    method public androidx.navigation.NavArgument.Builder setDefaultValue(Object?);
+    method public androidx.navigation.NavArgument.Builder setIsNullable(boolean);
+    method public androidx.navigation.NavArgument.Builder setType(androidx.navigation.NavType<?>);
+  }
+
+  public class NavDestination {
+    ctor public NavDestination(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+    ctor public NavDestination(String);
+    method public final void addArgument(String, androidx.navigation.NavArgument);
+    method public final void addDeepLink(String);
+    method public final androidx.navigation.NavAction? getAction(@IdRes int);
+    method public final java.util.Map<java.lang.String!,androidx.navigation.NavArgument!> getArguments();
+    method @IdRes public final int getId();
+    method public final CharSequence? getLabel();
+    method public final String getNavigatorName();
+    method public final androidx.navigation.NavGraph? getParent();
+    method public boolean hasDeepLink(android.net.Uri);
+    method @CallSuper public void onInflate(android.content.Context, android.util.AttributeSet);
+    method protected static <C> Class<? extends C> parseClassFromName(android.content.Context, String, Class<? extends C>);
+    method public final void putAction(@IdRes int, @IdRes int);
+    method public final void putAction(@IdRes int, androidx.navigation.NavAction);
+    method public final void removeAction(@IdRes int);
+    method public final void removeArgument(String);
+    method public final void setId(@IdRes int);
+    method public final void setLabel(CharSequence?);
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface NavDestination.ClassType {
+    method public abstract Class<?> value();
+  }
+
+  public interface NavDirections {
+    method @IdRes public int getActionId();
+    method public android.os.Bundle getArguments();
+  }
+
+  public class NavGraph extends androidx.navigation.NavDestination implements java.lang.Iterable<androidx.navigation.NavDestination> {
+    ctor public NavGraph(androidx.navigation.Navigator<? extends androidx.navigation.NavGraph>);
+    method public final void addAll(androidx.navigation.NavGraph);
+    method public final void addDestination(androidx.navigation.NavDestination);
+    method public final void addDestinations(java.util.Collection<androidx.navigation.NavDestination!>);
+    method public final void addDestinations(androidx.navigation.NavDestination!...);
+    method public final void clear();
+    method public final androidx.navigation.NavDestination? findNode(@IdRes int);
+    method @IdRes public final int getStartDestination();
+    method public final java.util.Iterator<androidx.navigation.NavDestination!> iterator();
+    method public final void remove(androidx.navigation.NavDestination);
+    method public final void setStartDestination(@IdRes int);
+  }
+
+  @androidx.navigation.Navigator.Name("navigation") public class NavGraphNavigator extends androidx.navigation.Navigator<androidx.navigation.NavGraph> {
+    ctor public NavGraphNavigator(androidx.navigation.NavigatorProvider);
+    method public androidx.navigation.NavGraph createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.NavGraph, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  public final class NavOptions {
+    method @AnimRes @AnimatorRes public int getEnterAnim();
+    method @AnimRes @AnimatorRes public int getExitAnim();
+    method @AnimRes @AnimatorRes public int getPopEnterAnim();
+    method @AnimRes @AnimatorRes public int getPopExitAnim();
+    method @IdRes public int getPopUpTo();
+    method public boolean isPopUpToInclusive();
+    method public boolean shouldLaunchSingleTop();
+  }
+
+  public static final class NavOptions.Builder {
+    ctor public NavOptions.Builder();
+    method public androidx.navigation.NavOptions build();
+    method public androidx.navigation.NavOptions.Builder setEnterAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setExitAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setLaunchSingleTop(boolean);
+    method public androidx.navigation.NavOptions.Builder setPopEnterAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setPopExitAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setPopUpTo(@IdRes int, boolean);
+  }
+
+  public abstract class NavType<T> {
+    method public static androidx.navigation.NavType<?> fromArgType(String?, String?);
+    method public abstract T? get(android.os.Bundle, String);
+    method public abstract String getName();
+    method public boolean isNullableAllowed();
+    method public abstract T parseValue(String);
+    method public abstract void put(android.os.Bundle, String, T?);
+    field public static final androidx.navigation.NavType<boolean[]!> BoolArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Boolean!> BoolType;
+    field public static final androidx.navigation.NavType<float[]!> FloatArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Float!> FloatType;
+    field public static final androidx.navigation.NavType<int[]!> IntArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Integer!> IntType;
+    field public static final androidx.navigation.NavType<long[]!> LongArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Long!> LongType;
+    field public static final androidx.navigation.NavType<java.lang.Integer!> ReferenceType;
+    field public static final androidx.navigation.NavType<java.lang.String![]!> StringArrayType;
+    field public static final androidx.navigation.NavType<java.lang.String!> StringType;
+  }
+
+  public static final class NavType.EnumType<D extends java.lang.Enum> extends androidx.navigation.NavType.SerializableType<D> {
+    ctor public NavType.EnumType(Class<D!>);
+  }
+
+  public static final class NavType.ParcelableArrayType<D extends android.os.Parcelable> extends androidx.navigation.NavType<D[]> {
+    ctor public NavType.ParcelableArrayType(Class<D!>);
+    method public D![]? get(android.os.Bundle, String);
+    method public String getName();
+    method public D![] parseValue(String);
+    method public void put(android.os.Bundle, String, D![]?);
+  }
+
+  public static final class NavType.ParcelableType<D> extends androidx.navigation.NavType<D> {
+    ctor public NavType.ParcelableType(Class<D!>);
+    method public D? get(android.os.Bundle, String);
+    method public String getName();
+    method public D parseValue(String);
+    method public void put(android.os.Bundle, String, D?);
+  }
+
+  public static final class NavType.SerializableArrayType<D extends java.io.Serializable> extends androidx.navigation.NavType<D[]> {
+    ctor public NavType.SerializableArrayType(Class<D!>);
+    method public D![]? get(android.os.Bundle, String);
+    method public String getName();
+    method public D![] parseValue(String);
+    method public void put(android.os.Bundle, String, D![]?);
+  }
+
+  public static class NavType.SerializableType<D extends java.io.Serializable> extends androidx.navigation.NavType<D> {
+    ctor public NavType.SerializableType(Class<D!>);
+    method public D? get(android.os.Bundle, String);
+    method public String getName();
+    method public D parseValue(String);
+    method public void put(android.os.Bundle, String, D?);
+  }
+
+  public abstract class Navigator<D extends androidx.navigation.NavDestination> {
+    ctor public Navigator();
+    method public abstract D createDestination();
+    method public abstract androidx.navigation.NavDestination? navigate(D, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public void onRestoreState(android.os.Bundle);
+    method public android.os.Bundle? onSaveState();
+    method public abstract boolean popBackStack();
+  }
+
+  public static interface Navigator.Extras {
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface Navigator.Name {
+    method public abstract String value();
+  }
+
+  public class NavigatorProvider {
+    ctor public NavigatorProvider();
+    method public final androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+    method @CallSuper public androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(String, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+    method public final <T extends androidx.navigation.Navigator<?>> T getNavigator(Class<T!>);
+    method @CallSuper public <T extends androidx.navigation.Navigator<?>> T getNavigator(String);
+  }
+
+}
+
diff --git a/navigation/navigation-dynamic-features-fragment/api/2.3.0-alpha05.txt b/navigation/navigation-dynamic-features-fragment/api/2.3.0-alpha05.txt
new file mode 100644
index 0000000..9179532
--- /dev/null
+++ b/navigation/navigation-dynamic-features-fragment/api/2.3.0-alpha05.txt
@@ -0,0 +1,55 @@
+// Signature format: 3.0
+package androidx.navigation.dynamicfeatures.fragment {
+
+  @androidx.navigation.Navigator.Name("fragment") public final class DynamicFragmentNavigator extends androidx.navigation.fragment.FragmentNavigator {
+    ctor public DynamicFragmentNavigator(android.content.Context context, androidx.fragment.app.FragmentManager manager, int containerId, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator.Destination createDestination();
+  }
+
+  public static final class DynamicFragmentNavigator.Destination extends androidx.navigation.fragment.FragmentNavigator.Destination {
+    ctor public DynamicFragmentNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    ctor public DynamicFragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> fragmentNavigator);
+    method public String? getModuleName();
+    method public void setModuleName(String? p);
+    property public final String? moduleName;
+  }
+
+  public final class DynamicFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, @IdRes int id, String fragmentClassName);
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator.Destination build();
+    method public String? getModuleName();
+    method public void setModuleName(String? p);
+    property public final String? moduleName;
+  }
+
+  public final class DynamicFragmentNavigatorDestinationBuilderKt {
+    method public static inline void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public class DynamicNavHostFragment extends androidx.navigation.fragment.NavHostFragment {
+    ctor public DynamicNavHostFragment();
+    method protected com.google.android.play.core.splitinstall.SplitInstallManager createSplitInstallManager();
+  }
+
+}
+
+package androidx.navigation.dynamicfeatures.fragment.ui {
+
+  public abstract class AbstractProgressFragment extends androidx.fragment.app.Fragment {
+    ctor public AbstractProgressFragment();
+    ctor public AbstractProgressFragment(int contentLayoutId);
+    method protected abstract void onCancelled();
+    method protected abstract void onFailed(int errorCode);
+    method protected void onInstalled();
+    method protected abstract void onProgress(int status, long bytesDownloaded, long bytesTotal);
+  }
+
+  public final class DefaultProgressFragment extends androidx.navigation.dynamicfeatures.fragment.ui.AbstractProgressFragment {
+    ctor public DefaultProgressFragment();
+    method protected void onCancelled();
+    method protected void onFailed(int errorCode);
+    method protected void onProgress(int status, long bytesDownloaded, long bytesTotal);
+  }
+
+}
+
diff --git a/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_2.3.0-alpha05.txt b/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_2.3.0-alpha05.txt
new file mode 100644
index 0000000..9179532
--- /dev/null
+++ b/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_2.3.0-alpha05.txt
@@ -0,0 +1,55 @@
+// Signature format: 3.0
+package androidx.navigation.dynamicfeatures.fragment {
+
+  @androidx.navigation.Navigator.Name("fragment") public final class DynamicFragmentNavigator extends androidx.navigation.fragment.FragmentNavigator {
+    ctor public DynamicFragmentNavigator(android.content.Context context, androidx.fragment.app.FragmentManager manager, int containerId, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator.Destination createDestination();
+  }
+
+  public static final class DynamicFragmentNavigator.Destination extends androidx.navigation.fragment.FragmentNavigator.Destination {
+    ctor public DynamicFragmentNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    ctor public DynamicFragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> fragmentNavigator);
+    method public String? getModuleName();
+    method public void setModuleName(String? p);
+    property public final String? moduleName;
+  }
+
+  public final class DynamicFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, @IdRes int id, String fragmentClassName);
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator.Destination build();
+    method public String? getModuleName();
+    method public void setModuleName(String? p);
+    property public final String? moduleName;
+  }
+
+  public final class DynamicFragmentNavigatorDestinationBuilderKt {
+    method public static inline void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public class DynamicNavHostFragment extends androidx.navigation.fragment.NavHostFragment {
+    ctor public DynamicNavHostFragment();
+    method protected com.google.android.play.core.splitinstall.SplitInstallManager createSplitInstallManager();
+  }
+
+}
+
+package androidx.navigation.dynamicfeatures.fragment.ui {
+
+  public abstract class AbstractProgressFragment extends androidx.fragment.app.Fragment {
+    ctor public AbstractProgressFragment();
+    ctor public AbstractProgressFragment(int contentLayoutId);
+    method protected abstract void onCancelled();
+    method protected abstract void onFailed(int errorCode);
+    method protected void onInstalled();
+    method protected abstract void onProgress(int status, long bytesDownloaded, long bytesTotal);
+  }
+
+  public final class DefaultProgressFragment extends androidx.navigation.dynamicfeatures.fragment.ui.AbstractProgressFragment {
+    ctor public DefaultProgressFragment();
+    method protected void onCancelled();
+    method protected void onFailed(int errorCode);
+    method protected void onProgress(int status, long bytesDownloaded, long bytesTotal);
+  }
+
+}
+
diff --git a/ui/ui-android-text/api/res-0.1.0-dev05.txt b/navigation/navigation-dynamic-features-fragment/api/res-2.3.0-alpha05.txt
similarity index 100%
copy from ui/ui-android-text/api/res-0.1.0-dev05.txt
copy to navigation/navigation-dynamic-features-fragment/api/res-2.3.0-alpha05.txt
diff --git a/navigation/navigation-dynamic-features-fragment/api/restricted_2.3.0-alpha05.txt b/navigation/navigation-dynamic-features-fragment/api/restricted_2.3.0-alpha05.txt
new file mode 100644
index 0000000..9179532
--- /dev/null
+++ b/navigation/navigation-dynamic-features-fragment/api/restricted_2.3.0-alpha05.txt
@@ -0,0 +1,55 @@
+// Signature format: 3.0
+package androidx.navigation.dynamicfeatures.fragment {
+
+  @androidx.navigation.Navigator.Name("fragment") public final class DynamicFragmentNavigator extends androidx.navigation.fragment.FragmentNavigator {
+    ctor public DynamicFragmentNavigator(android.content.Context context, androidx.fragment.app.FragmentManager manager, int containerId, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator.Destination createDestination();
+  }
+
+  public static final class DynamicFragmentNavigator.Destination extends androidx.navigation.fragment.FragmentNavigator.Destination {
+    ctor public DynamicFragmentNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    ctor public DynamicFragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> fragmentNavigator);
+    method public String? getModuleName();
+    method public void setModuleName(String? p);
+    property public final String? moduleName;
+  }
+
+  public final class DynamicFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, @IdRes int id, String fragmentClassName);
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator.Destination build();
+    method public String? getModuleName();
+    method public void setModuleName(String? p);
+    property public final String? moduleName;
+  }
+
+  public final class DynamicFragmentNavigatorDestinationBuilderKt {
+    method public static inline void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public class DynamicNavHostFragment extends androidx.navigation.fragment.NavHostFragment {
+    ctor public DynamicNavHostFragment();
+    method protected com.google.android.play.core.splitinstall.SplitInstallManager createSplitInstallManager();
+  }
+
+}
+
+package androidx.navigation.dynamicfeatures.fragment.ui {
+
+  public abstract class AbstractProgressFragment extends androidx.fragment.app.Fragment {
+    ctor public AbstractProgressFragment();
+    ctor public AbstractProgressFragment(int contentLayoutId);
+    method protected abstract void onCancelled();
+    method protected abstract void onFailed(int errorCode);
+    method protected void onInstalled();
+    method protected abstract void onProgress(int status, long bytesDownloaded, long bytesTotal);
+  }
+
+  public final class DefaultProgressFragment extends androidx.navigation.dynamicfeatures.fragment.ui.AbstractProgressFragment {
+    ctor public DefaultProgressFragment();
+    method protected void onCancelled();
+    method protected void onFailed(int errorCode);
+    method protected void onProgress(int status, long bytesDownloaded, long bytesTotal);
+  }
+
+}
+
diff --git a/navigation/navigation-dynamic-features-runtime/api/2.3.0-alpha05.txt b/navigation/navigation-dynamic-features-runtime/api/2.3.0-alpha05.txt
new file mode 100644
index 0000000..1ee26e7
--- /dev/null
+++ b/navigation/navigation-dynamic-features-runtime/api/2.3.0-alpha05.txt
@@ -0,0 +1,105 @@
+// Signature format: 3.0
+package androidx.navigation.dynamicfeatures {
+
+  @androidx.navigation.Navigator.Name("activity") public final class DynamicActivityNavigator extends androidx.navigation.ActivityNavigator {
+    ctor public DynamicActivityNavigator(android.content.Context context, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination createDestination();
+  }
+
+  public static final class DynamicActivityNavigator.Destination extends androidx.navigation.ActivityNavigator.Destination {
+    ctor public DynamicActivityNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    ctor public DynamicActivityNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.ActivityNavigator.Destination> activityNavigator);
+    method public String? getModuleName();
+    method public void setModuleName(String? p);
+    property public final String? moduleName;
+  }
+
+  public final class DynamicActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
+    ctor public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, @IdRes int id);
+    method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination build();
+    method public String? getAction();
+    method public String? getActivityClassName();
+    method public android.net.Uri? getData();
+    method public String? getDataPattern();
+    method public String? getModuleName();
+    method public String? getTargetPackage();
+    method public void setAction(String? p);
+    method public void setActivityClassName(String? p);
+    method public void setData(android.net.Uri? p);
+    method public void setDataPattern(String? p);
+    method public void setModuleName(String? p);
+    method public void setTargetPackage(String? p);
+    property public final String? action;
+    property public final String? activityClassName;
+    property public final android.net.Uri? data;
+    property public final String? dataPattern;
+    property public final String? moduleName;
+    property public final String? targetPackage;
+  }
+
+  public final class DynamicActivityNavigatorDestinationBuilderKt {
+    method public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
+    ctor public DynamicExtras(androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor, androidx.navigation.Navigator.Extras? destinationExtras);
+    ctor public DynamicExtras(androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor);
+    ctor public DynamicExtras();
+    method public androidx.navigation.Navigator.Extras? getDestinationExtras();
+    method public androidx.navigation.dynamicfeatures.DynamicInstallMonitor? getInstallMonitor();
+  }
+
+  @androidx.navigation.Navigator.Name("navigation") public final class DynamicGraphNavigator extends androidx.navigation.NavGraphNavigator {
+    ctor public DynamicGraphNavigator(androidx.navigation.NavigatorProvider navigatorProvider, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.DynamicGraphNavigator.DynamicNavGraph createDestination();
+    method public void installDefaultProgressDestination(kotlin.jvm.functions.Function0<? extends androidx.navigation.NavDestination> progressDestinationSupplier);
+  }
+
+  public static final class DynamicGraphNavigator.DynamicNavGraph extends androidx.navigation.NavGraph {
+    ctor public DynamicGraphNavigator.DynamicNavGraph(internal androidx.navigation.dynamicfeatures.DynamicGraphNavigator navGraphNavigator, internal androidx.navigation.NavigatorProvider navigatorProvider);
+    method public String? getModuleName();
+    method public int getProgressDestination();
+    method public void setModuleName(String? p);
+    method public void setProgressDestination(int p);
+    property public final String? moduleName;
+    property public final int progressDestination;
+  }
+
+  @androidx.navigation.Navigator.Name("include-dynamic") public final class DynamicIncludeGraphNavigator extends androidx.navigation.Navigator<androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph> {
+    ctor public DynamicIncludeGraphNavigator(android.content.Context context, androidx.navigation.NavigatorProvider navigatorProvider, androidx.navigation.NavInflater navInflater, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    method public boolean popBackStack();
+  }
+
+  public static final class DynamicIncludeGraphNavigator.DynamicIncludeNavGraph extends androidx.navigation.NavDestination {
+    method public String? getGraphPackage();
+    method public String? getGraphResourceName();
+    method public String? getModuleName();
+    method public void setGraphPackage(String? p);
+    method public void setGraphResourceName(String? p);
+    method public void setModuleName(String? p);
+    property public final String? graphPackage;
+    property public final String? graphResourceName;
+    property public final String? moduleName;
+  }
+
+  public class DynamicInstallManager {
+    ctor public DynamicInstallManager(android.content.Context context, com.google.android.play.core.splitinstall.SplitInstallManager splitInstallManager);
+  }
+
+  public final class DynamicInstallMonitor {
+    ctor public DynamicInstallMonitor();
+    method public void cancelInstall();
+    method public Exception? getException();
+    method public int getSessionId();
+    method public androidx.lifecycle.LiveData<com.google.android.play.core.splitinstall.SplitInstallSessionState> getStatus();
+    method public boolean isInstallRequired();
+    property public final Exception? exception;
+    property public final boolean isInstallRequired;
+    property public final int sessionId;
+    property public final androidx.lifecycle.LiveData<com.google.android.play.core.splitinstall.SplitInstallSessionState> status;
+  }
+
+}
+
diff --git a/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_2.3.0-alpha05.txt b/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_2.3.0-alpha05.txt
new file mode 100644
index 0000000..1ee26e7
--- /dev/null
+++ b/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_2.3.0-alpha05.txt
@@ -0,0 +1,105 @@
+// Signature format: 3.0
+package androidx.navigation.dynamicfeatures {
+
+  @androidx.navigation.Navigator.Name("activity") public final class DynamicActivityNavigator extends androidx.navigation.ActivityNavigator {
+    ctor public DynamicActivityNavigator(android.content.Context context, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination createDestination();
+  }
+
+  public static final class DynamicActivityNavigator.Destination extends androidx.navigation.ActivityNavigator.Destination {
+    ctor public DynamicActivityNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    ctor public DynamicActivityNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.ActivityNavigator.Destination> activityNavigator);
+    method public String? getModuleName();
+    method public void setModuleName(String? p);
+    property public final String? moduleName;
+  }
+
+  public final class DynamicActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
+    ctor public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, @IdRes int id);
+    method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination build();
+    method public String? getAction();
+    method public String? getActivityClassName();
+    method public android.net.Uri? getData();
+    method public String? getDataPattern();
+    method public String? getModuleName();
+    method public String? getTargetPackage();
+    method public void setAction(String? p);
+    method public void setActivityClassName(String? p);
+    method public void setData(android.net.Uri? p);
+    method public void setDataPattern(String? p);
+    method public void setModuleName(String? p);
+    method public void setTargetPackage(String? p);
+    property public final String? action;
+    property public final String? activityClassName;
+    property public final android.net.Uri? data;
+    property public final String? dataPattern;
+    property public final String? moduleName;
+    property public final String? targetPackage;
+  }
+
+  public final class DynamicActivityNavigatorDestinationBuilderKt {
+    method public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
+    ctor public DynamicExtras(androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor, androidx.navigation.Navigator.Extras? destinationExtras);
+    ctor public DynamicExtras(androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor);
+    ctor public DynamicExtras();
+    method public androidx.navigation.Navigator.Extras? getDestinationExtras();
+    method public androidx.navigation.dynamicfeatures.DynamicInstallMonitor? getInstallMonitor();
+  }
+
+  @androidx.navigation.Navigator.Name("navigation") public final class DynamicGraphNavigator extends androidx.navigation.NavGraphNavigator {
+    ctor public DynamicGraphNavigator(androidx.navigation.NavigatorProvider navigatorProvider, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.DynamicGraphNavigator.DynamicNavGraph createDestination();
+    method public void installDefaultProgressDestination(kotlin.jvm.functions.Function0<? extends androidx.navigation.NavDestination> progressDestinationSupplier);
+  }
+
+  public static final class DynamicGraphNavigator.DynamicNavGraph extends androidx.navigation.NavGraph {
+    ctor public DynamicGraphNavigator.DynamicNavGraph(internal androidx.navigation.dynamicfeatures.DynamicGraphNavigator navGraphNavigator, internal androidx.navigation.NavigatorProvider navigatorProvider);
+    method public String? getModuleName();
+    method public int getProgressDestination();
+    method public void setModuleName(String? p);
+    method public void setProgressDestination(int p);
+    property public final String? moduleName;
+    property public final int progressDestination;
+  }
+
+  @androidx.navigation.Navigator.Name("include-dynamic") public final class DynamicIncludeGraphNavigator extends androidx.navigation.Navigator<androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph> {
+    ctor public DynamicIncludeGraphNavigator(android.content.Context context, androidx.navigation.NavigatorProvider navigatorProvider, androidx.navigation.NavInflater navInflater, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    method public boolean popBackStack();
+  }
+
+  public static final class DynamicIncludeGraphNavigator.DynamicIncludeNavGraph extends androidx.navigation.NavDestination {
+    method public String? getGraphPackage();
+    method public String? getGraphResourceName();
+    method public String? getModuleName();
+    method public void setGraphPackage(String? p);
+    method public void setGraphResourceName(String? p);
+    method public void setModuleName(String? p);
+    property public final String? graphPackage;
+    property public final String? graphResourceName;
+    property public final String? moduleName;
+  }
+
+  public class DynamicInstallManager {
+    ctor public DynamicInstallManager(android.content.Context context, com.google.android.play.core.splitinstall.SplitInstallManager splitInstallManager);
+  }
+
+  public final class DynamicInstallMonitor {
+    ctor public DynamicInstallMonitor();
+    method public void cancelInstall();
+    method public Exception? getException();
+    method public int getSessionId();
+    method public androidx.lifecycle.LiveData<com.google.android.play.core.splitinstall.SplitInstallSessionState> getStatus();
+    method public boolean isInstallRequired();
+    property public final Exception? exception;
+    property public final boolean isInstallRequired;
+    property public final int sessionId;
+    property public final androidx.lifecycle.LiveData<com.google.android.play.core.splitinstall.SplitInstallSessionState> status;
+  }
+
+}
+
diff --git a/ui/ui-android-text/api/res-0.1.0-dev05.txt b/navigation/navigation-dynamic-features-runtime/api/res-2.3.0-alpha05.txt
similarity index 100%
copy from ui/ui-android-text/api/res-0.1.0-dev05.txt
copy to navigation/navigation-dynamic-features-runtime/api/res-2.3.0-alpha05.txt
diff --git a/navigation/navigation-dynamic-features-runtime/api/restricted_2.3.0-alpha05.txt b/navigation/navigation-dynamic-features-runtime/api/restricted_2.3.0-alpha05.txt
new file mode 100644
index 0000000..1ee26e7
--- /dev/null
+++ b/navigation/navigation-dynamic-features-runtime/api/restricted_2.3.0-alpha05.txt
@@ -0,0 +1,105 @@
+// Signature format: 3.0
+package androidx.navigation.dynamicfeatures {
+
+  @androidx.navigation.Navigator.Name("activity") public final class DynamicActivityNavigator extends androidx.navigation.ActivityNavigator {
+    ctor public DynamicActivityNavigator(android.content.Context context, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination createDestination();
+  }
+
+  public static final class DynamicActivityNavigator.Destination extends androidx.navigation.ActivityNavigator.Destination {
+    ctor public DynamicActivityNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    ctor public DynamicActivityNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.ActivityNavigator.Destination> activityNavigator);
+    method public String? getModuleName();
+    method public void setModuleName(String? p);
+    property public final String? moduleName;
+  }
+
+  public final class DynamicActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
+    ctor public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, @IdRes int id);
+    method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination build();
+    method public String? getAction();
+    method public String? getActivityClassName();
+    method public android.net.Uri? getData();
+    method public String? getDataPattern();
+    method public String? getModuleName();
+    method public String? getTargetPackage();
+    method public void setAction(String? p);
+    method public void setActivityClassName(String? p);
+    method public void setData(android.net.Uri? p);
+    method public void setDataPattern(String? p);
+    method public void setModuleName(String? p);
+    method public void setTargetPackage(String? p);
+    property public final String? action;
+    property public final String? activityClassName;
+    property public final android.net.Uri? data;
+    property public final String? dataPattern;
+    property public final String? moduleName;
+    property public final String? targetPackage;
+  }
+
+  public final class DynamicActivityNavigatorDestinationBuilderKt {
+    method public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
+    ctor public DynamicExtras(androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor, androidx.navigation.Navigator.Extras? destinationExtras);
+    ctor public DynamicExtras(androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor);
+    ctor public DynamicExtras();
+    method public androidx.navigation.Navigator.Extras? getDestinationExtras();
+    method public androidx.navigation.dynamicfeatures.DynamicInstallMonitor? getInstallMonitor();
+  }
+
+  @androidx.navigation.Navigator.Name("navigation") public final class DynamicGraphNavigator extends androidx.navigation.NavGraphNavigator {
+    ctor public DynamicGraphNavigator(androidx.navigation.NavigatorProvider navigatorProvider, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.DynamicGraphNavigator.DynamicNavGraph createDestination();
+    method public void installDefaultProgressDestination(kotlin.jvm.functions.Function0<? extends androidx.navigation.NavDestination> progressDestinationSupplier);
+  }
+
+  public static final class DynamicGraphNavigator.DynamicNavGraph extends androidx.navigation.NavGraph {
+    ctor public DynamicGraphNavigator.DynamicNavGraph(internal androidx.navigation.dynamicfeatures.DynamicGraphNavigator navGraphNavigator, internal androidx.navigation.NavigatorProvider navigatorProvider);
+    method public String? getModuleName();
+    method public int getProgressDestination();
+    method public void setModuleName(String? p);
+    method public void setProgressDestination(int p);
+    property public final String? moduleName;
+    property public final int progressDestination;
+  }
+
+  @androidx.navigation.Navigator.Name("include-dynamic") public final class DynamicIncludeGraphNavigator extends androidx.navigation.Navigator<androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph> {
+    ctor public DynamicIncludeGraphNavigator(android.content.Context context, androidx.navigation.NavigatorProvider navigatorProvider, androidx.navigation.NavInflater navInflater, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    method public boolean popBackStack();
+  }
+
+  public static final class DynamicIncludeGraphNavigator.DynamicIncludeNavGraph extends androidx.navigation.NavDestination {
+    method public String? getGraphPackage();
+    method public String? getGraphResourceName();
+    method public String? getModuleName();
+    method public void setGraphPackage(String? p);
+    method public void setGraphResourceName(String? p);
+    method public void setModuleName(String? p);
+    property public final String? graphPackage;
+    property public final String? graphResourceName;
+    property public final String? moduleName;
+  }
+
+  public class DynamicInstallManager {
+    ctor public DynamicInstallManager(android.content.Context context, com.google.android.play.core.splitinstall.SplitInstallManager splitInstallManager);
+  }
+
+  public final class DynamicInstallMonitor {
+    ctor public DynamicInstallMonitor();
+    method public void cancelInstall();
+    method public Exception? getException();
+    method public int getSessionId();
+    method public androidx.lifecycle.LiveData<com.google.android.play.core.splitinstall.SplitInstallSessionState> getStatus();
+    method public boolean isInstallRequired();
+    property public final Exception? exception;
+    property public final boolean isInstallRequired;
+    property public final int sessionId;
+    property public final androidx.lifecycle.LiveData<com.google.android.play.core.splitinstall.SplitInstallSessionState> status;
+  }
+
+}
+
diff --git a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicIncludeGraphNavigator.kt b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicIncludeGraphNavigator.kt
index 9bb2283..f2d5eb1 100644
--- a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicIncludeGraphNavigator.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicIncludeGraphNavigator.kt
@@ -24,6 +24,7 @@
 import androidx.navigation.NavDestination
 import androidx.navigation.NavGraph
 import androidx.navigation.NavInflater
+import androidx.navigation.NavInflater.APPLICATION_ID_PLACEHOLDER
 import androidx.navigation.NavOptions
 import androidx.navigation.Navigator
 import androidx.navigation.NavigatorProvider
@@ -151,19 +152,39 @@
         override fun onInflate(context: Context, attrs: AttributeSet) {
             super.onInflate(context, attrs)
             context.withStyledAttributes(attrs, R.styleable.DynamicIncludeGraphNavigator) {
-                graphPackage = getString(R.styleable.DynamicIncludeGraphNavigator_graphPackage)
-                require(!graphPackage.isNullOrEmpty()) {
-                    "graphPackage must be set for dynamic navigation"
+                moduleName = getString(R.styleable.DynamicIncludeGraphNavigator_moduleName)
+                require(!moduleName.isNullOrEmpty()) {
+                    "`moduleName` must be set for <include-dynamic>"
                 }
 
+                graphPackage = getString(R.styleable.DynamicIncludeGraphNavigator_graphPackage)
+                    .let {
+                        if (it != null) {
+                            require(it.isNotEmpty()) {
+                                "`graphPackage` cannot be empty for <include-dynamic>. You can " +
+                                        "omit the `graphPackage` attribute entirely to use the " +
+                                        "default of ${context.packageName}.$moduleName."
+                            }
+                        }
+                        getPackageOrDefault(context, it)
+                    }
+
                 graphResourceName =
                     getString(R.styleable.DynamicIncludeGraphNavigator_graphResName)
-                require(!graphPackage.isNullOrEmpty()) {
-                    "graphResName must be set for dynamic navigation"
+                require(!graphResourceName.isNullOrEmpty()) {
+                    "`graphResName` must be set for <include-dynamic>"
                 }
-
-                moduleName = getString(R.styleable.DynamicIncludeGraphNavigator_moduleName)
             }
         }
+
+        internal fun getPackageOrDefault(
+            context: Context,
+            graphPackage: String?
+        ): String {
+            return graphPackage?.replace(
+                APPLICATION_ID_PLACEHOLDER,
+                context.packageName
+            ) ?: "${context.packageName}.$moduleName"
+        }
     }
 }
diff --git a/navigation/navigation-dynamic-features-runtime/src/test/java/androidx/navigation/dynamicfeatures/DynamicIncludeGraphNavigatorTest.kt b/navigation/navigation-dynamic-features-runtime/src/test/java/androidx/navigation/dynamicfeatures/DynamicIncludeGraphNavigatorTest.kt
index a542ea5..28118fb 100644
--- a/navigation/navigation-dynamic-features-runtime/src/test/java/androidx/navigation/dynamicfeatures/DynamicIncludeGraphNavigatorTest.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/test/java/androidx/navigation/dynamicfeatures/DynamicIncludeGraphNavigatorTest.kt
@@ -22,12 +22,15 @@
 import androidx.navigation.NoOpNavigator
 import androidx.navigation.dynamicfeatures.shared.TestDynamicInstallManager
 import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
 import org.junit.Assert.assertNotNull
+import org.junit.Assert.assertThat
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
-import org.mockito.Mockito.spy
+import org.mockito.Mockito.`when`
+import org.mockito.Mockito.mock
 
 @RunWith(JUnit4::class)
 @SmallTest
@@ -39,27 +42,50 @@
     private lateinit var noOpNavigator: NoOpNavigator
     private lateinit var installManager: TestDynamicInstallManager
     private lateinit var inflater: NavInflater
+    private lateinit var context: Context
 
     @Before
     fun setup() {
-        val contextSpy = spy(Context::class.java)
+        context = mock(Context::class.java)
+        `when`(context.packageName).thenReturn(PACKAGE_NAME)
         provider = NavigatorProvider()
         noOpNavigator = NoOpNavigator()
         installManager = TestDynamicInstallManager()
-        inflater = NavInflater(contextSpy, provider)
+        inflater = NavInflater(context, provider)
 
         navigator = DynamicIncludeGraphNavigator(
-            contextSpy,
+            context,
             provider,
             inflater,
             installManager
         )
         provider.addNavigator(noOpNavigator)
         dynamicNavGraph = navigator.createDestination()
+        dynamicNavGraph.moduleName = FEATURE_NAME
     }
 
     @Test
     fun testCreateDestination() {
         assertNotNull(navigator.createDestination())
     }
+
+    @Test
+    fun testReplacePackagePlaceholder() {
+        assertThat(
+            dynamicNavGraph.getPackageOrDefault(context, "\${applicationId}.something" +
+                    ".$FEATURE_NAME")
+        ).isEqualTo("$PACKAGE_NAME.something.$FEATURE_NAME")
+
+        assertThat(
+            dynamicNavGraph.getPackageOrDefault(context, "something.\${applicationId}" +
+                    ".$FEATURE_NAME")
+        ).isEqualTo("something.$PACKAGE_NAME.$FEATURE_NAME")
+
+        assertThat(
+            dynamicNavGraph.getPackageOrDefault(context, null)
+        ).isEqualTo("$PACKAGE_NAME.$FEATURE_NAME")
+    }
 }
+
+private const val PACKAGE_NAME = "com.test.app"
+private const val FEATURE_NAME = "myfeature"
diff --git a/navigation/navigation-fragment-ktx/api/2.3.0-alpha05.txt b/navigation/navigation-fragment-ktx/api/2.3.0-alpha05.txt
new file mode 100644
index 0000000..a09cb97
--- /dev/null
+++ b/navigation/navigation-fragment-ktx/api/2.3.0-alpha05.txt
@@ -0,0 +1,45 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  public final class NavGraphViewModelLazyKt {
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<VM> navGraphViewModels(androidx.fragment.app.Fragment, @IdRes int navGraphId, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer = null);
+  }
+
+}
+
+package androidx.navigation.fragment {
+
+  public final class DialogFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+    ctor public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+    method public androidx.navigation.fragment.DialogFragmentNavigator.Destination build();
+  }
+
+  public final class DialogFragmentNavigatorDestinationBuilderKt {
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class FragmentKt {
+    method public static androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment);
+  }
+
+  public final class FragmentNavArgsLazyKt {
+    method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args> navArgs(androidx.fragment.app.Fragment);
+  }
+
+  public final class FragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+    method public androidx.navigation.fragment.FragmentNavigator.Destination build();
+  }
+
+  public final class FragmentNavigatorDestinationBuilderKt {
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class FragmentNavigatorExtrasKt {
+    method public static androidx.navigation.fragment.FragmentNavigator.Extras FragmentNavigatorExtras(kotlin.Pair<? extends android.view.View,java.lang.String>... sharedElements);
+  }
+
+}
+
diff --git a/navigation/navigation-fragment-ktx/api/public_plus_experimental_2.3.0-alpha05.txt b/navigation/navigation-fragment-ktx/api/public_plus_experimental_2.3.0-alpha05.txt
new file mode 100644
index 0000000..a09cb97
--- /dev/null
+++ b/navigation/navigation-fragment-ktx/api/public_plus_experimental_2.3.0-alpha05.txt
@@ -0,0 +1,45 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  public final class NavGraphViewModelLazyKt {
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<VM> navGraphViewModels(androidx.fragment.app.Fragment, @IdRes int navGraphId, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer = null);
+  }
+
+}
+
+package androidx.navigation.fragment {
+
+  public final class DialogFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+    ctor public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+    method public androidx.navigation.fragment.DialogFragmentNavigator.Destination build();
+  }
+
+  public final class DialogFragmentNavigatorDestinationBuilderKt {
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class FragmentKt {
+    method public static androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment);
+  }
+
+  public final class FragmentNavArgsLazyKt {
+    method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args> navArgs(androidx.fragment.app.Fragment);
+  }
+
+  public final class FragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+    method public androidx.navigation.fragment.FragmentNavigator.Destination build();
+  }
+
+  public final class FragmentNavigatorDestinationBuilderKt {
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class FragmentNavigatorExtrasKt {
+    method public static androidx.navigation.fragment.FragmentNavigator.Extras FragmentNavigatorExtras(kotlin.Pair<? extends android.view.View,java.lang.String>... sharedElements);
+  }
+
+}
+
diff --git a/ui/ui-android-text/api/res-0.1.0-dev05.txt b/navigation/navigation-fragment-ktx/api/res-2.3.0-alpha05.txt
similarity index 100%
copy from ui/ui-android-text/api/res-0.1.0-dev05.txt
copy to navigation/navigation-fragment-ktx/api/res-2.3.0-alpha05.txt
diff --git a/navigation/navigation-fragment-ktx/api/restricted_2.3.0-alpha05.txt b/navigation/navigation-fragment-ktx/api/restricted_2.3.0-alpha05.txt
new file mode 100644
index 0000000..a09cb97
--- /dev/null
+++ b/navigation/navigation-fragment-ktx/api/restricted_2.3.0-alpha05.txt
@@ -0,0 +1,45 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  public final class NavGraphViewModelLazyKt {
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<VM> navGraphViewModels(androidx.fragment.app.Fragment, @IdRes int navGraphId, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer = null);
+  }
+
+}
+
+package androidx.navigation.fragment {
+
+  public final class DialogFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+    ctor public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+    method public androidx.navigation.fragment.DialogFragmentNavigator.Destination build();
+  }
+
+  public final class DialogFragmentNavigatorDestinationBuilderKt {
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class FragmentKt {
+    method public static androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment);
+  }
+
+  public final class FragmentNavArgsLazyKt {
+    method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args> navArgs(androidx.fragment.app.Fragment);
+  }
+
+  public final class FragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+    method public androidx.navigation.fragment.FragmentNavigator.Destination build();
+  }
+
+  public final class FragmentNavigatorDestinationBuilderKt {
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class FragmentNavigatorExtrasKt {
+    method public static androidx.navigation.fragment.FragmentNavigator.Extras FragmentNavigatorExtras(kotlin.Pair<? extends android.view.View,java.lang.String>... sharedElements);
+  }
+
+}
+
diff --git a/navigation/navigation-fragment-ktx/build.gradle b/navigation/navigation-fragment-ktx/build.gradle
index 02faade..f29b3d8 100644
--- a/navigation/navigation-fragment-ktx/build.gradle
+++ b/navigation/navigation-fragment-ktx/build.gradle
@@ -38,7 +38,7 @@
     api(project(":navigation:navigation-fragment"))
     // Ensure that the -ktx dependency graph mirrors the Java dependency graph
     api(project(":navigation:navigation-runtime-ktx"))
-    api("androidx.fragment:fragment-ktx:1.2.1")
+    api("androidx.fragment:fragment-ktx:1.2.4")
     api("androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0")
     api(KOTLIN_STDLIB)
     androidTestImplementation(project(":fragment:fragment-testing"))
diff --git a/navigation/navigation-fragment/api/2.3.0-alpha05.txt b/navigation/navigation-fragment/api/2.3.0-alpha05.txt
new file mode 100644
index 0000000..fa67952
--- /dev/null
+++ b/navigation/navigation-fragment/api/2.3.0-alpha05.txt
@@ -0,0 +1,55 @@
+// Signature format: 3.0
+package androidx.navigation.fragment {
+
+  @androidx.navigation.Navigator.Name("dialog") public final class DialogFragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+    ctor public DialogFragmentNavigator(android.content.Context, androidx.fragment.app.FragmentManager);
+    method public androidx.navigation.fragment.DialogFragmentNavigator.Destination createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.DialogFragmentNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(DialogFragment.class) public static class DialogFragmentNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
+    ctor public DialogFragmentNavigator.Destination(androidx.navigation.NavigatorProvider);
+    ctor public DialogFragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.DialogFragmentNavigator.Destination>);
+    method public final String getClassName();
+    method public final androidx.navigation.fragment.DialogFragmentNavigator.Destination setClassName(String);
+  }
+
+  @androidx.navigation.Navigator.Name("fragment") public class FragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor public FragmentNavigator(android.content.Context, androidx.fragment.app.FragmentManager, int);
+    method public androidx.navigation.fragment.FragmentNavigator.Destination createDestination();
+    method @Deprecated public androidx.fragment.app.Fragment instantiateFragment(android.content.Context, androidx.fragment.app.FragmentManager, String, android.os.Bundle?);
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.FragmentNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Fragment.class) public static class FragmentNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public FragmentNavigator.Destination(androidx.navigation.NavigatorProvider);
+    ctor public FragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination>);
+    method public final String getClassName();
+    method public final androidx.navigation.fragment.FragmentNavigator.Destination setClassName(String);
+  }
+
+  public static final class FragmentNavigator.Extras implements androidx.navigation.Navigator.Extras {
+    method public java.util.Map<android.view.View!,java.lang.String!> getSharedElements();
+  }
+
+  public static final class FragmentNavigator.Extras.Builder {
+    ctor public FragmentNavigator.Extras.Builder();
+    method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElement(android.view.View, String);
+    method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElements(java.util.Map<android.view.View!,java.lang.String!>);
+    method public androidx.navigation.fragment.FragmentNavigator.Extras build();
+  }
+
+  public class NavHostFragment extends androidx.fragment.app.Fragment implements androidx.navigation.NavHost {
+    ctor public NavHostFragment();
+    method public static androidx.navigation.fragment.NavHostFragment create(@NavigationRes int);
+    method public static androidx.navigation.fragment.NavHostFragment create(@NavigationRes int, android.os.Bundle?);
+    method @Deprecated protected androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> createFragmentNavigator();
+    method public static androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment);
+    method public final androidx.navigation.NavController getNavController();
+    method @CallSuper protected void onCreateNavController(androidx.navigation.NavController);
+  }
+
+}
+
diff --git a/navigation/navigation-fragment/api/public_plus_experimental_2.3.0-alpha05.txt b/navigation/navigation-fragment/api/public_plus_experimental_2.3.0-alpha05.txt
new file mode 100644
index 0000000..fa67952
--- /dev/null
+++ b/navigation/navigation-fragment/api/public_plus_experimental_2.3.0-alpha05.txt
@@ -0,0 +1,55 @@
+// Signature format: 3.0
+package androidx.navigation.fragment {
+
+  @androidx.navigation.Navigator.Name("dialog") public final class DialogFragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+    ctor public DialogFragmentNavigator(android.content.Context, androidx.fragment.app.FragmentManager);
+    method public androidx.navigation.fragment.DialogFragmentNavigator.Destination createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.DialogFragmentNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(DialogFragment.class) public static class DialogFragmentNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
+    ctor public DialogFragmentNavigator.Destination(androidx.navigation.NavigatorProvider);
+    ctor public DialogFragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.DialogFragmentNavigator.Destination>);
+    method public final String getClassName();
+    method public final androidx.navigation.fragment.DialogFragmentNavigator.Destination setClassName(String);
+  }
+
+  @androidx.navigation.Navigator.Name("fragment") public class FragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor public FragmentNavigator(android.content.Context, androidx.fragment.app.FragmentManager, int);
+    method public androidx.navigation.fragment.FragmentNavigator.Destination createDestination();
+    method @Deprecated public androidx.fragment.app.Fragment instantiateFragment(android.content.Context, androidx.fragment.app.FragmentManager, String, android.os.Bundle?);
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.FragmentNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Fragment.class) public static class FragmentNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public FragmentNavigator.Destination(androidx.navigation.NavigatorProvider);
+    ctor public FragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination>);
+    method public final String getClassName();
+    method public final androidx.navigation.fragment.FragmentNavigator.Destination setClassName(String);
+  }
+
+  public static final class FragmentNavigator.Extras implements androidx.navigation.Navigator.Extras {
+    method public java.util.Map<android.view.View!,java.lang.String!> getSharedElements();
+  }
+
+  public static final class FragmentNavigator.Extras.Builder {
+    ctor public FragmentNavigator.Extras.Builder();
+    method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElement(android.view.View, String);
+    method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElements(java.util.Map<android.view.View!,java.lang.String!>);
+    method public androidx.navigation.fragment.FragmentNavigator.Extras build();
+  }
+
+  public class NavHostFragment extends androidx.fragment.app.Fragment implements androidx.navigation.NavHost {
+    ctor public NavHostFragment();
+    method public static androidx.navigation.fragment.NavHostFragment create(@NavigationRes int);
+    method public static androidx.navigation.fragment.NavHostFragment create(@NavigationRes int, android.os.Bundle?);
+    method @Deprecated protected androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> createFragmentNavigator();
+    method public static androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment);
+    method public final androidx.navigation.NavController getNavController();
+    method @CallSuper protected void onCreateNavController(androidx.navigation.NavController);
+  }
+
+}
+
diff --git a/ui/ui-android-text/api/res-0.1.0-dev05.txt b/navigation/navigation-fragment/api/res-2.3.0-alpha05.txt
similarity index 100%
rename from ui/ui-android-text/api/res-0.1.0-dev05.txt
rename to navigation/navigation-fragment/api/res-2.3.0-alpha05.txt
diff --git a/navigation/navigation-fragment/api/restricted_2.3.0-alpha05.txt b/navigation/navigation-fragment/api/restricted_2.3.0-alpha05.txt
new file mode 100644
index 0000000..fa67952
--- /dev/null
+++ b/navigation/navigation-fragment/api/restricted_2.3.0-alpha05.txt
@@ -0,0 +1,55 @@
+// Signature format: 3.0
+package androidx.navigation.fragment {
+
+  @androidx.navigation.Navigator.Name("dialog") public final class DialogFragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+    ctor public DialogFragmentNavigator(android.content.Context, androidx.fragment.app.FragmentManager);
+    method public androidx.navigation.fragment.DialogFragmentNavigator.Destination createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.DialogFragmentNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(DialogFragment.class) public static class DialogFragmentNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
+    ctor public DialogFragmentNavigator.Destination(androidx.navigation.NavigatorProvider);
+    ctor public DialogFragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.DialogFragmentNavigator.Destination>);
+    method public final String getClassName();
+    method public final androidx.navigation.fragment.DialogFragmentNavigator.Destination setClassName(String);
+  }
+
+  @androidx.navigation.Navigator.Name("fragment") public class FragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor public FragmentNavigator(android.content.Context, androidx.fragment.app.FragmentManager, int);
+    method public androidx.navigation.fragment.FragmentNavigator.Destination createDestination();
+    method @Deprecated public androidx.fragment.app.Fragment instantiateFragment(android.content.Context, androidx.fragment.app.FragmentManager, String, android.os.Bundle?);
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.FragmentNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Fragment.class) public static class FragmentNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public FragmentNavigator.Destination(androidx.navigation.NavigatorProvider);
+    ctor public FragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination>);
+    method public final String getClassName();
+    method public final androidx.navigation.fragment.FragmentNavigator.Destination setClassName(String);
+  }
+
+  public static final class FragmentNavigator.Extras implements androidx.navigation.Navigator.Extras {
+    method public java.util.Map<android.view.View!,java.lang.String!> getSharedElements();
+  }
+
+  public static final class FragmentNavigator.Extras.Builder {
+    ctor public FragmentNavigator.Extras.Builder();
+    method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElement(android.view.View, String);
+    method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElements(java.util.Map<android.view.View!,java.lang.String!>);
+    method public androidx.navigation.fragment.FragmentNavigator.Extras build();
+  }
+
+  public class NavHostFragment extends androidx.fragment.app.Fragment implements androidx.navigation.NavHost {
+    ctor public NavHostFragment();
+    method public static androidx.navigation.fragment.NavHostFragment create(@NavigationRes int);
+    method public static androidx.navigation.fragment.NavHostFragment create(@NavigationRes int, android.os.Bundle?);
+    method @Deprecated protected androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> createFragmentNavigator();
+    method public static androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment);
+    method public final androidx.navigation.NavController getNavController();
+    method @CallSuper protected void onCreateNavController(androidx.navigation.NavController);
+  }
+
+}
+
diff --git a/navigation/navigation-fragment/build.gradle b/navigation/navigation-fragment/build.gradle
index 04bf922..eebdf74 100644
--- a/navigation/navigation-fragment/build.gradle
+++ b/navigation/navigation-fragment/build.gradle
@@ -27,7 +27,7 @@
 }
 
 dependencies {
-    api("androidx.fragment:fragment:1.2.1")
+    api("androidx.fragment:fragment:1.2.4")
     api(project(":navigation:navigation-runtime"))
 
     androidTestImplementation(project(":navigation:navigation-runtime-ktx"))
diff --git a/navigation/navigation-runtime-ktx/api/2.3.0-alpha05.txt b/navigation/navigation-runtime-ktx/api/2.3.0-alpha05.txt
new file mode 100644
index 0000000..09505f5
--- /dev/null
+++ b/navigation/navigation-runtime-ktx/api/2.3.0-alpha05.txt
@@ -0,0 +1,53 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  public final class ActivityKt {
+    method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int viewId);
+  }
+
+  public final class ActivityNavArgsLazyKt {
+    method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args> navArgs(android.app.Activity);
+  }
+
+  public final class ActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
+    ctor public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, @IdRes int id);
+    method public androidx.navigation.ActivityNavigator.Destination build();
+    method public String? getAction();
+    method public kotlin.reflect.KClass<? extends android.app.Activity>? getActivityClass();
+    method public android.net.Uri? getData();
+    method public String? getDataPattern();
+    method public String? getTargetPackage();
+    method public void setAction(String? p);
+    method public void setActivityClass(kotlin.reflect.KClass<? extends android.app.Activity>? p);
+    method public void setData(android.net.Uri? p);
+    method public void setDataPattern(String? p);
+    method public void setTargetPackage(String? p);
+    property public final String? action;
+    property public final kotlin.reflect.KClass<? extends android.app.Activity>? activityClass;
+    property public final android.net.Uri? data;
+    property public final String? dataPattern;
+    property public final String? targetPackage;
+  }
+
+  public final class ActivityNavigatorDestinationBuilderKt {
+    method public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class ActivityNavigatorExtrasKt {
+    method public static androidx.navigation.ActivityNavigator.Extras ActivityNavigatorExtras(androidx.core.app.ActivityOptionsCompat? activityOptions = null, int flags = 0);
+  }
+
+  public final class NavControllerKt {
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavHostKt {
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class ViewKt {
+    method public static androidx.navigation.NavController findNavController(android.view.View);
+  }
+
+}
+
diff --git a/navigation/navigation-runtime-ktx/api/public_plus_experimental_2.3.0-alpha05.txt b/navigation/navigation-runtime-ktx/api/public_plus_experimental_2.3.0-alpha05.txt
new file mode 100644
index 0000000..09505f5
--- /dev/null
+++ b/navigation/navigation-runtime-ktx/api/public_plus_experimental_2.3.0-alpha05.txt
@@ -0,0 +1,53 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  public final class ActivityKt {
+    method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int viewId);
+  }
+
+  public final class ActivityNavArgsLazyKt {
+    method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args> navArgs(android.app.Activity);
+  }
+
+  public final class ActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
+    ctor public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, @IdRes int id);
+    method public androidx.navigation.ActivityNavigator.Destination build();
+    method public String? getAction();
+    method public kotlin.reflect.KClass<? extends android.app.Activity>? getActivityClass();
+    method public android.net.Uri? getData();
+    method public String? getDataPattern();
+    method public String? getTargetPackage();
+    method public void setAction(String? p);
+    method public void setActivityClass(kotlin.reflect.KClass<? extends android.app.Activity>? p);
+    method public void setData(android.net.Uri? p);
+    method public void setDataPattern(String? p);
+    method public void setTargetPackage(String? p);
+    property public final String? action;
+    property public final kotlin.reflect.KClass<? extends android.app.Activity>? activityClass;
+    property public final android.net.Uri? data;
+    property public final String? dataPattern;
+    property public final String? targetPackage;
+  }
+
+  public final class ActivityNavigatorDestinationBuilderKt {
+    method public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class ActivityNavigatorExtrasKt {
+    method public static androidx.navigation.ActivityNavigator.Extras ActivityNavigatorExtras(androidx.core.app.ActivityOptionsCompat? activityOptions = null, int flags = 0);
+  }
+
+  public final class NavControllerKt {
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavHostKt {
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class ViewKt {
+    method public static androidx.navigation.NavController findNavController(android.view.View);
+  }
+
+}
+
diff --git a/ui/ui-android-text/api/res-0.1.0-dev05.txt b/navigation/navigation-runtime-ktx/api/res-2.3.0-alpha05.txt
similarity index 100%
copy from ui/ui-android-text/api/res-0.1.0-dev05.txt
copy to navigation/navigation-runtime-ktx/api/res-2.3.0-alpha05.txt
diff --git a/navigation/navigation-runtime-ktx/api/restricted_2.3.0-alpha05.txt b/navigation/navigation-runtime-ktx/api/restricted_2.3.0-alpha05.txt
new file mode 100644
index 0000000..09505f5
--- /dev/null
+++ b/navigation/navigation-runtime-ktx/api/restricted_2.3.0-alpha05.txt
@@ -0,0 +1,53 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  public final class ActivityKt {
+    method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int viewId);
+  }
+
+  public final class ActivityNavArgsLazyKt {
+    method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args> navArgs(android.app.Activity);
+  }
+
+  public final class ActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
+    ctor public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, @IdRes int id);
+    method public androidx.navigation.ActivityNavigator.Destination build();
+    method public String? getAction();
+    method public kotlin.reflect.KClass<? extends android.app.Activity>? getActivityClass();
+    method public android.net.Uri? getData();
+    method public String? getDataPattern();
+    method public String? getTargetPackage();
+    method public void setAction(String? p);
+    method public void setActivityClass(kotlin.reflect.KClass<? extends android.app.Activity>? p);
+    method public void setData(android.net.Uri? p);
+    method public void setDataPattern(String? p);
+    method public void setTargetPackage(String? p);
+    property public final String? action;
+    property public final kotlin.reflect.KClass<? extends android.app.Activity>? activityClass;
+    property public final android.net.Uri? data;
+    property public final String? dataPattern;
+    property public final String? targetPackage;
+  }
+
+  public final class ActivityNavigatorDestinationBuilderKt {
+    method public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class ActivityNavigatorExtrasKt {
+    method public static androidx.navigation.ActivityNavigator.Extras ActivityNavigatorExtras(androidx.core.app.ActivityOptionsCompat? activityOptions = null, int flags = 0);
+  }
+
+  public final class NavControllerKt {
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavHostKt {
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class ViewKt {
+    method public static androidx.navigation.NavController findNavController(android.view.View);
+  }
+
+}
+
diff --git a/navigation/navigation-runtime/api/2.3.0-alpha05.txt b/navigation/navigation-runtime/api/2.3.0-alpha05.txt
new file mode 100644
index 0000000..d0669a8
--- /dev/null
+++ b/navigation/navigation-runtime/api/2.3.0-alpha05.txt
@@ -0,0 +1,130 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  @androidx.navigation.Navigator.Name("activity") public class ActivityNavigator extends androidx.navigation.Navigator<androidx.navigation.ActivityNavigator.Destination> {
+    ctor public ActivityNavigator(android.content.Context);
+    method public static void applyPopAnimationsToPendingTransition(android.app.Activity);
+    method public androidx.navigation.ActivityNavigator.Destination createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.ActivityNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Activity.class) public static class ActivityNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public ActivityNavigator.Destination(androidx.navigation.NavigatorProvider);
+    ctor public ActivityNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.ActivityNavigator.Destination>);
+    method public final String? getAction();
+    method public final android.content.ComponentName? getComponent();
+    method public final android.net.Uri? getData();
+    method public final String? getDataPattern();
+    method public final android.content.Intent? getIntent();
+    method public final String? getTargetPackage();
+    method public final androidx.navigation.ActivityNavigator.Destination setAction(String?);
+    method public final androidx.navigation.ActivityNavigator.Destination setComponentName(android.content.ComponentName?);
+    method public final androidx.navigation.ActivityNavigator.Destination setData(android.net.Uri?);
+    method public final androidx.navigation.ActivityNavigator.Destination setDataPattern(String?);
+    method public final androidx.navigation.ActivityNavigator.Destination setIntent(android.content.Intent?);
+    method public final androidx.navigation.ActivityNavigator.Destination setTargetPackage(String?);
+  }
+
+  public static final class ActivityNavigator.Extras implements androidx.navigation.Navigator.Extras {
+    method public androidx.core.app.ActivityOptionsCompat? getActivityOptions();
+    method public int getFlags();
+  }
+
+  public static final class ActivityNavigator.Extras.Builder {
+    ctor public ActivityNavigator.Extras.Builder();
+    method public androidx.navigation.ActivityNavigator.Extras.Builder addFlags(int);
+    method public androidx.navigation.ActivityNavigator.Extras build();
+    method public androidx.navigation.ActivityNavigator.Extras.Builder setActivityOptions(androidx.core.app.ActivityOptionsCompat);
+  }
+
+  public final class NavBackStackEntry implements androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
+    method public android.os.Bundle? getArguments();
+    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+    method public androidx.navigation.NavDestination getDestination();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public androidx.lifecycle.SavedStateHandle getSavedStateHandle();
+    method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+  }
+
+  public class NavController {
+    ctor public NavController(android.content.Context);
+    method public void addOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener);
+    method public androidx.navigation.NavDeepLinkBuilder createDeepLink();
+    method public androidx.navigation.NavBackStackEntry getBackStackEntry(@IdRes int);
+    method public androidx.navigation.NavBackStackEntry? getCurrentBackStackEntry();
+    method public androidx.navigation.NavDestination? getCurrentDestination();
+    method public androidx.navigation.NavGraph getGraph();
+    method public androidx.navigation.NavInflater getNavInflater();
+    method public androidx.navigation.NavigatorProvider getNavigatorProvider();
+    method public androidx.navigation.NavBackStackEntry? getPreviousBackStackEntry();
+    method public androidx.lifecycle.ViewModelStoreOwner getViewModelStoreOwner(@IdRes int);
+    method public boolean handleDeepLink(android.content.Intent?);
+    method public void navigate(@IdRes int);
+    method public void navigate(@IdRes int, android.os.Bundle?);
+    method public void navigate(@IdRes int, android.os.Bundle?, androidx.navigation.NavOptions?);
+    method public void navigate(@IdRes int, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public void navigate(android.net.Uri);
+    method public void navigate(android.net.Uri, androidx.navigation.NavOptions?);
+    method public void navigate(android.net.Uri, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public void navigate(androidx.navigation.NavDirections);
+    method public void navigate(androidx.navigation.NavDirections, androidx.navigation.NavOptions?);
+    method public void navigate(androidx.navigation.NavDirections, androidx.navigation.Navigator.Extras);
+    method public boolean navigateUp();
+    method public boolean popBackStack();
+    method public boolean popBackStack(@IdRes int, boolean);
+    method public void removeOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener);
+    method @CallSuper public void restoreState(android.os.Bundle?);
+    method @CallSuper public android.os.Bundle? saveState();
+    method @CallSuper public void setGraph(@NavigationRes int);
+    method @CallSuper public void setGraph(@NavigationRes int, android.os.Bundle?);
+    method @CallSuper public void setGraph(androidx.navigation.NavGraph);
+    method @CallSuper public void setGraph(androidx.navigation.NavGraph, android.os.Bundle?);
+    field public static final String KEY_DEEP_LINK_INTENT = "android-support-nav:controller:deepLinkIntent";
+  }
+
+  public static interface NavController.OnDestinationChangedListener {
+    method public void onDestinationChanged(androidx.navigation.NavController, androidx.navigation.NavDestination, android.os.Bundle?);
+  }
+
+  public final class NavDeepLinkBuilder {
+    ctor public NavDeepLinkBuilder(android.content.Context);
+    method public android.app.PendingIntent createPendingIntent();
+    method public androidx.core.app.TaskStackBuilder createTaskStackBuilder();
+    method public androidx.navigation.NavDeepLinkBuilder setArguments(android.os.Bundle?);
+    method public androidx.navigation.NavDeepLinkBuilder setComponentName(Class<? extends android.app.Activity>);
+    method public androidx.navigation.NavDeepLinkBuilder setComponentName(android.content.ComponentName);
+    method public androidx.navigation.NavDeepLinkBuilder setDestination(@IdRes int);
+    method public androidx.navigation.NavDeepLinkBuilder setGraph(@NavigationRes int);
+    method public androidx.navigation.NavDeepLinkBuilder setGraph(androidx.navigation.NavGraph);
+  }
+
+  public interface NavHost {
+    method public androidx.navigation.NavController getNavController();
+  }
+
+  public class NavHostController extends androidx.navigation.NavController {
+    ctor public NavHostController(android.content.Context);
+    method public final void enableOnBackPressed(boolean);
+    method public final void setLifecycleOwner(androidx.lifecycle.LifecycleOwner);
+    method public final void setOnBackPressedDispatcher(androidx.activity.OnBackPressedDispatcher);
+    method public final void setViewModelStore(androidx.lifecycle.ViewModelStore);
+  }
+
+  public final class NavInflater {
+    ctor public NavInflater(android.content.Context, androidx.navigation.NavigatorProvider);
+    method public androidx.navigation.NavGraph inflate(@NavigationRes int);
+  }
+
+  public final class Navigation {
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int);
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int, android.os.Bundle?);
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(androidx.navigation.NavDirections);
+    method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int);
+    method public static androidx.navigation.NavController findNavController(android.view.View);
+    method public static void setViewNavController(android.view.View, androidx.navigation.NavController?);
+  }
+
+}
+
diff --git a/navigation/navigation-runtime/api/public_plus_experimental_2.3.0-alpha05.txt b/navigation/navigation-runtime/api/public_plus_experimental_2.3.0-alpha05.txt
new file mode 100644
index 0000000..d0669a8
--- /dev/null
+++ b/navigation/navigation-runtime/api/public_plus_experimental_2.3.0-alpha05.txt
@@ -0,0 +1,130 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  @androidx.navigation.Navigator.Name("activity") public class ActivityNavigator extends androidx.navigation.Navigator<androidx.navigation.ActivityNavigator.Destination> {
+    ctor public ActivityNavigator(android.content.Context);
+    method public static void applyPopAnimationsToPendingTransition(android.app.Activity);
+    method public androidx.navigation.ActivityNavigator.Destination createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.ActivityNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Activity.class) public static class ActivityNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public ActivityNavigator.Destination(androidx.navigation.NavigatorProvider);
+    ctor public ActivityNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.ActivityNavigator.Destination>);
+    method public final String? getAction();
+    method public final android.content.ComponentName? getComponent();
+    method public final android.net.Uri? getData();
+    method public final String? getDataPattern();
+    method public final android.content.Intent? getIntent();
+    method public final String? getTargetPackage();
+    method public final androidx.navigation.ActivityNavigator.Destination setAction(String?);
+    method public final androidx.navigation.ActivityNavigator.Destination setComponentName(android.content.ComponentName?);
+    method public final androidx.navigation.ActivityNavigator.Destination setData(android.net.Uri?);
+    method public final androidx.navigation.ActivityNavigator.Destination setDataPattern(String?);
+    method public final androidx.navigation.ActivityNavigator.Destination setIntent(android.content.Intent?);
+    method public final androidx.navigation.ActivityNavigator.Destination setTargetPackage(String?);
+  }
+
+  public static final class ActivityNavigator.Extras implements androidx.navigation.Navigator.Extras {
+    method public androidx.core.app.ActivityOptionsCompat? getActivityOptions();
+    method public int getFlags();
+  }
+
+  public static final class ActivityNavigator.Extras.Builder {
+    ctor public ActivityNavigator.Extras.Builder();
+    method public androidx.navigation.ActivityNavigator.Extras.Builder addFlags(int);
+    method public androidx.navigation.ActivityNavigator.Extras build();
+    method public androidx.navigation.ActivityNavigator.Extras.Builder setActivityOptions(androidx.core.app.ActivityOptionsCompat);
+  }
+
+  public final class NavBackStackEntry implements androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
+    method public android.os.Bundle? getArguments();
+    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+    method public androidx.navigation.NavDestination getDestination();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public androidx.lifecycle.SavedStateHandle getSavedStateHandle();
+    method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+  }
+
+  public class NavController {
+    ctor public NavController(android.content.Context);
+    method public void addOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener);
+    method public androidx.navigation.NavDeepLinkBuilder createDeepLink();
+    method public androidx.navigation.NavBackStackEntry getBackStackEntry(@IdRes int);
+    method public androidx.navigation.NavBackStackEntry? getCurrentBackStackEntry();
+    method public androidx.navigation.NavDestination? getCurrentDestination();
+    method public androidx.navigation.NavGraph getGraph();
+    method public androidx.navigation.NavInflater getNavInflater();
+    method public androidx.navigation.NavigatorProvider getNavigatorProvider();
+    method public androidx.navigation.NavBackStackEntry? getPreviousBackStackEntry();
+    method public androidx.lifecycle.ViewModelStoreOwner getViewModelStoreOwner(@IdRes int);
+    method public boolean handleDeepLink(android.content.Intent?);
+    method public void navigate(@IdRes int);
+    method public void navigate(@IdRes int, android.os.Bundle?);
+    method public void navigate(@IdRes int, android.os.Bundle?, androidx.navigation.NavOptions?);
+    method public void navigate(@IdRes int, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public void navigate(android.net.Uri);
+    method public void navigate(android.net.Uri, androidx.navigation.NavOptions?);
+    method public void navigate(android.net.Uri, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public void navigate(androidx.navigation.NavDirections);
+    method public void navigate(androidx.navigation.NavDirections, androidx.navigation.NavOptions?);
+    method public void navigate(androidx.navigation.NavDirections, androidx.navigation.Navigator.Extras);
+    method public boolean navigateUp();
+    method public boolean popBackStack();
+    method public boolean popBackStack(@IdRes int, boolean);
+    method public void removeOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener);
+    method @CallSuper public void restoreState(android.os.Bundle?);
+    method @CallSuper public android.os.Bundle? saveState();
+    method @CallSuper public void setGraph(@NavigationRes int);
+    method @CallSuper public void setGraph(@NavigationRes int, android.os.Bundle?);
+    method @CallSuper public void setGraph(androidx.navigation.NavGraph);
+    method @CallSuper public void setGraph(androidx.navigation.NavGraph, android.os.Bundle?);
+    field public static final String KEY_DEEP_LINK_INTENT = "android-support-nav:controller:deepLinkIntent";
+  }
+
+  public static interface NavController.OnDestinationChangedListener {
+    method public void onDestinationChanged(androidx.navigation.NavController, androidx.navigation.NavDestination, android.os.Bundle?);
+  }
+
+  public final class NavDeepLinkBuilder {
+    ctor public NavDeepLinkBuilder(android.content.Context);
+    method public android.app.PendingIntent createPendingIntent();
+    method public androidx.core.app.TaskStackBuilder createTaskStackBuilder();
+    method public androidx.navigation.NavDeepLinkBuilder setArguments(android.os.Bundle?);
+    method public androidx.navigation.NavDeepLinkBuilder setComponentName(Class<? extends android.app.Activity>);
+    method public androidx.navigation.NavDeepLinkBuilder setComponentName(android.content.ComponentName);
+    method public androidx.navigation.NavDeepLinkBuilder setDestination(@IdRes int);
+    method public androidx.navigation.NavDeepLinkBuilder setGraph(@NavigationRes int);
+    method public androidx.navigation.NavDeepLinkBuilder setGraph(androidx.navigation.NavGraph);
+  }
+
+  public interface NavHost {
+    method public androidx.navigation.NavController getNavController();
+  }
+
+  public class NavHostController extends androidx.navigation.NavController {
+    ctor public NavHostController(android.content.Context);
+    method public final void enableOnBackPressed(boolean);
+    method public final void setLifecycleOwner(androidx.lifecycle.LifecycleOwner);
+    method public final void setOnBackPressedDispatcher(androidx.activity.OnBackPressedDispatcher);
+    method public final void setViewModelStore(androidx.lifecycle.ViewModelStore);
+  }
+
+  public final class NavInflater {
+    ctor public NavInflater(android.content.Context, androidx.navigation.NavigatorProvider);
+    method public androidx.navigation.NavGraph inflate(@NavigationRes int);
+  }
+
+  public final class Navigation {
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int);
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int, android.os.Bundle?);
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(androidx.navigation.NavDirections);
+    method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int);
+    method public static androidx.navigation.NavController findNavController(android.view.View);
+    method public static void setViewNavController(android.view.View, androidx.navigation.NavController?);
+  }
+
+}
+
diff --git a/ui/ui-android-text/api/res-0.1.0-dev05.txt b/navigation/navigation-runtime/api/res-2.3.0-alpha05.txt
similarity index 100%
copy from ui/ui-android-text/api/res-0.1.0-dev05.txt
copy to navigation/navigation-runtime/api/res-2.3.0-alpha05.txt
diff --git a/navigation/navigation-runtime/api/restricted_2.3.0-alpha05.txt b/navigation/navigation-runtime/api/restricted_2.3.0-alpha05.txt
new file mode 100644
index 0000000..d0669a8
--- /dev/null
+++ b/navigation/navigation-runtime/api/restricted_2.3.0-alpha05.txt
@@ -0,0 +1,130 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  @androidx.navigation.Navigator.Name("activity") public class ActivityNavigator extends androidx.navigation.Navigator<androidx.navigation.ActivityNavigator.Destination> {
+    ctor public ActivityNavigator(android.content.Context);
+    method public static void applyPopAnimationsToPendingTransition(android.app.Activity);
+    method public androidx.navigation.ActivityNavigator.Destination createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.ActivityNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Activity.class) public static class ActivityNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public ActivityNavigator.Destination(androidx.navigation.NavigatorProvider);
+    ctor public ActivityNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.ActivityNavigator.Destination>);
+    method public final String? getAction();
+    method public final android.content.ComponentName? getComponent();
+    method public final android.net.Uri? getData();
+    method public final String? getDataPattern();
+    method public final android.content.Intent? getIntent();
+    method public final String? getTargetPackage();
+    method public final androidx.navigation.ActivityNavigator.Destination setAction(String?);
+    method public final androidx.navigation.ActivityNavigator.Destination setComponentName(android.content.ComponentName?);
+    method public final androidx.navigation.ActivityNavigator.Destination setData(android.net.Uri?);
+    method public final androidx.navigation.ActivityNavigator.Destination setDataPattern(String?);
+    method public final androidx.navigation.ActivityNavigator.Destination setIntent(android.content.Intent?);
+    method public final androidx.navigation.ActivityNavigator.Destination setTargetPackage(String?);
+  }
+
+  public static final class ActivityNavigator.Extras implements androidx.navigation.Navigator.Extras {
+    method public androidx.core.app.ActivityOptionsCompat? getActivityOptions();
+    method public int getFlags();
+  }
+
+  public static final class ActivityNavigator.Extras.Builder {
+    ctor public ActivityNavigator.Extras.Builder();
+    method public androidx.navigation.ActivityNavigator.Extras.Builder addFlags(int);
+    method public androidx.navigation.ActivityNavigator.Extras build();
+    method public androidx.navigation.ActivityNavigator.Extras.Builder setActivityOptions(androidx.core.app.ActivityOptionsCompat);
+  }
+
+  public final class NavBackStackEntry implements androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
+    method public android.os.Bundle? getArguments();
+    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+    method public androidx.navigation.NavDestination getDestination();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public androidx.lifecycle.SavedStateHandle getSavedStateHandle();
+    method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+  }
+
+  public class NavController {
+    ctor public NavController(android.content.Context);
+    method public void addOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener);
+    method public androidx.navigation.NavDeepLinkBuilder createDeepLink();
+    method public androidx.navigation.NavBackStackEntry getBackStackEntry(@IdRes int);
+    method public androidx.navigation.NavBackStackEntry? getCurrentBackStackEntry();
+    method public androidx.navigation.NavDestination? getCurrentDestination();
+    method public androidx.navigation.NavGraph getGraph();
+    method public androidx.navigation.NavInflater getNavInflater();
+    method public androidx.navigation.NavigatorProvider getNavigatorProvider();
+    method public androidx.navigation.NavBackStackEntry? getPreviousBackStackEntry();
+    method public androidx.lifecycle.ViewModelStoreOwner getViewModelStoreOwner(@IdRes int);
+    method public boolean handleDeepLink(android.content.Intent?);
+    method public void navigate(@IdRes int);
+    method public void navigate(@IdRes int, android.os.Bundle?);
+    method public void navigate(@IdRes int, android.os.Bundle?, androidx.navigation.NavOptions?);
+    method public void navigate(@IdRes int, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public void navigate(android.net.Uri);
+    method public void navigate(android.net.Uri, androidx.navigation.NavOptions?);
+    method public void navigate(android.net.Uri, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public void navigate(androidx.navigation.NavDirections);
+    method public void navigate(androidx.navigation.NavDirections, androidx.navigation.NavOptions?);
+    method public void navigate(androidx.navigation.NavDirections, androidx.navigation.Navigator.Extras);
+    method public boolean navigateUp();
+    method public boolean popBackStack();
+    method public boolean popBackStack(@IdRes int, boolean);
+    method public void removeOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener);
+    method @CallSuper public void restoreState(android.os.Bundle?);
+    method @CallSuper public android.os.Bundle? saveState();
+    method @CallSuper public void setGraph(@NavigationRes int);
+    method @CallSuper public void setGraph(@NavigationRes int, android.os.Bundle?);
+    method @CallSuper public void setGraph(androidx.navigation.NavGraph);
+    method @CallSuper public void setGraph(androidx.navigation.NavGraph, android.os.Bundle?);
+    field public static final String KEY_DEEP_LINK_INTENT = "android-support-nav:controller:deepLinkIntent";
+  }
+
+  public static interface NavController.OnDestinationChangedListener {
+    method public void onDestinationChanged(androidx.navigation.NavController, androidx.navigation.NavDestination, android.os.Bundle?);
+  }
+
+  public final class NavDeepLinkBuilder {
+    ctor public NavDeepLinkBuilder(android.content.Context);
+    method public android.app.PendingIntent createPendingIntent();
+    method public androidx.core.app.TaskStackBuilder createTaskStackBuilder();
+    method public androidx.navigation.NavDeepLinkBuilder setArguments(android.os.Bundle?);
+    method public androidx.navigation.NavDeepLinkBuilder setComponentName(Class<? extends android.app.Activity>);
+    method public androidx.navigation.NavDeepLinkBuilder setComponentName(android.content.ComponentName);
+    method public androidx.navigation.NavDeepLinkBuilder setDestination(@IdRes int);
+    method public androidx.navigation.NavDeepLinkBuilder setGraph(@NavigationRes int);
+    method public androidx.navigation.NavDeepLinkBuilder setGraph(androidx.navigation.NavGraph);
+  }
+
+  public interface NavHost {
+    method public androidx.navigation.NavController getNavController();
+  }
+
+  public class NavHostController extends androidx.navigation.NavController {
+    ctor public NavHostController(android.content.Context);
+    method public final void enableOnBackPressed(boolean);
+    method public final void setLifecycleOwner(androidx.lifecycle.LifecycleOwner);
+    method public final void setOnBackPressedDispatcher(androidx.activity.OnBackPressedDispatcher);
+    method public final void setViewModelStore(androidx.lifecycle.ViewModelStore);
+  }
+
+  public final class NavInflater {
+    ctor public NavInflater(android.content.Context, androidx.navigation.NavigatorProvider);
+    method public androidx.navigation.NavGraph inflate(@NavigationRes int);
+  }
+
+  public final class Navigation {
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int);
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int, android.os.Bundle?);
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(androidx.navigation.NavDirections);
+    method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int);
+    method public static androidx.navigation.NavController findNavController(android.view.View);
+    method public static void setViewNavController(android.view.View, androidx.navigation.NavController?);
+  }
+
+}
+
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavInflater.java b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavInflater.java
index 7a3a552..82ecc70 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavInflater.java
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavInflater.java
@@ -29,6 +29,7 @@
 
 import androidx.annotation.NavigationRes;
 import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
 import androidx.navigation.common.R;
 
 import org.xmlpull.v1.XmlPullParser;
@@ -44,7 +45,12 @@
     private static final String TAG_DEEP_LINK = "deepLink";
     private static final String TAG_ACTION = "action";
     private static final String TAG_INCLUDE = "include";
-    static final String APPLICATION_ID_PLACEHOLDER = "${applicationId}";
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public static final String APPLICATION_ID_PLACEHOLDER = "${applicationId}";
 
     private static final ThreadLocal<TypedValue> sTmpValue = new ThreadLocal<>();
 
diff --git a/navigation/navigation-testing/api/2.3.0-alpha05.txt b/navigation/navigation-testing/api/2.3.0-alpha05.txt
new file mode 100644
index 0000000..be673f0
--- /dev/null
+++ b/navigation/navigation-testing/api/2.3.0-alpha05.txt
@@ -0,0 +1,13 @@
+// Signature format: 3.0
+package androidx.navigation.testing {
+
+  public final class TestNavHostController extends androidx.navigation.NavHostController {
+    ctor public TestNavHostController(android.content.Context context);
+    method public java.util.List<androidx.navigation.NavBackStackEntry> getBackStack();
+    method public void setCurrentDestination(@IdRes int destId, android.os.Bundle args = android.os.Bundle());
+    method public void setCurrentDestination(@IdRes int destId);
+    property public final java.util.List<androidx.navigation.NavBackStackEntry> backStack;
+  }
+
+}
+
diff --git a/navigation/navigation-testing/api/public_plus_experimental_2.3.0-alpha05.txt b/navigation/navigation-testing/api/public_plus_experimental_2.3.0-alpha05.txt
new file mode 100644
index 0000000..be673f0
--- /dev/null
+++ b/navigation/navigation-testing/api/public_plus_experimental_2.3.0-alpha05.txt
@@ -0,0 +1,13 @@
+// Signature format: 3.0
+package androidx.navigation.testing {
+
+  public final class TestNavHostController extends androidx.navigation.NavHostController {
+    ctor public TestNavHostController(android.content.Context context);
+    method public java.util.List<androidx.navigation.NavBackStackEntry> getBackStack();
+    method public void setCurrentDestination(@IdRes int destId, android.os.Bundle args = android.os.Bundle());
+    method public void setCurrentDestination(@IdRes int destId);
+    property public final java.util.List<androidx.navigation.NavBackStackEntry> backStack;
+  }
+
+}
+
diff --git a/ui/ui-android-text/api/res-0.1.0-dev05.txt b/navigation/navigation-testing/api/res-2.3.0-alpha05.txt
similarity index 100%
copy from ui/ui-android-text/api/res-0.1.0-dev05.txt
copy to navigation/navigation-testing/api/res-2.3.0-alpha05.txt
diff --git a/navigation/navigation-testing/api/restricted_2.3.0-alpha05.txt b/navigation/navigation-testing/api/restricted_2.3.0-alpha05.txt
new file mode 100644
index 0000000..be673f0
--- /dev/null
+++ b/navigation/navigation-testing/api/restricted_2.3.0-alpha05.txt
@@ -0,0 +1,13 @@
+// Signature format: 3.0
+package androidx.navigation.testing {
+
+  public final class TestNavHostController extends androidx.navigation.NavHostController {
+    ctor public TestNavHostController(android.content.Context context);
+    method public java.util.List<androidx.navigation.NavBackStackEntry> getBackStack();
+    method public void setCurrentDestination(@IdRes int destId, android.os.Bundle args = android.os.Bundle());
+    method public void setCurrentDestination(@IdRes int destId);
+    property public final java.util.List<androidx.navigation.NavBackStackEntry> backStack;
+  }
+
+}
+
diff --git a/navigation/navigation-ui-ktx/api/2.3.0-alpha05.ignore b/navigation/navigation-ui-ktx/api/2.3.0-alpha05.ignore
new file mode 100644
index 0000000..657afee
--- /dev/null
+++ b/navigation/navigation-ui-ktx/api/2.3.0-alpha05.ignore
@@ -0,0 +1,9 @@
+// Baseline format: 1.0
+RemovedMethod: androidx.navigation.ui.AppBarConfigurationKt#AppBarConfiguration(android.view.Menu, androidx.drawerlayout.widget.DrawerLayout, kotlin.jvm.functions.Function0<java.lang.Boolean>):
+    Removed method androidx.navigation.ui.AppBarConfigurationKt.AppBarConfiguration(android.view.Menu,androidx.drawerlayout.widget.DrawerLayout,kotlin.jvm.functions.Function0<java.lang.Boolean>)
+RemovedMethod: androidx.navigation.ui.AppBarConfigurationKt#AppBarConfiguration(androidx.navigation.NavGraph, androidx.drawerlayout.widget.DrawerLayout, kotlin.jvm.functions.Function0<java.lang.Boolean>):
+    Removed method androidx.navigation.ui.AppBarConfigurationKt.AppBarConfiguration(androidx.navigation.NavGraph,androidx.drawerlayout.widget.DrawerLayout,kotlin.jvm.functions.Function0<java.lang.Boolean>)
+RemovedMethod: androidx.navigation.ui.AppBarConfigurationKt#AppBarConfiguration(java.util.Set<java.lang.Integer>, androidx.drawerlayout.widget.DrawerLayout, kotlin.jvm.functions.Function0<java.lang.Boolean>):
+    Removed method androidx.navigation.ui.AppBarConfigurationKt.AppBarConfiguration(java.util.Set<java.lang.Integer>,androidx.drawerlayout.widget.DrawerLayout,kotlin.jvm.functions.Function0<java.lang.Boolean>)
+RemovedMethod: androidx.navigation.ui.NavControllerKt#navigateUp(androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout):
+    Removed method androidx.navigation.ui.NavControllerKt.navigateUp(androidx.navigation.NavController,androidx.drawerlayout.widget.DrawerLayout)
diff --git a/navigation/navigation-ui-ktx/api/2.3.0-alpha05.txt b/navigation/navigation-ui-ktx/api/2.3.0-alpha05.txt
new file mode 100644
index 0000000..168f63e
--- /dev/null
+++ b/navigation/navigation-ui-ktx/api/2.3.0-alpha05.txt
@@ -0,0 +1,43 @@
+// Signature format: 3.0
+package androidx.navigation.ui {
+
+  public final class ActivityKt {
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+  }
+
+  public final class AppBarConfigurationKt {
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(androidx.navigation.NavGraph navGraph, androidx.customview.widget.Openable? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(android.view.Menu topLevelMenu, androidx.customview.widget.Openable? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(java.util.Set<java.lang.Integer> topLevelDestinationIds, androidx.customview.widget.Openable? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+  }
+
+  public final class BottomNavigationViewKt {
+    method public static void setupWithNavController(com.google.android.material.bottomnavigation.BottomNavigationView, androidx.navigation.NavController navController);
+  }
+
+  public final class CollapsingToolbarLayoutKt {
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+  }
+
+  public final class MenuItemKt {
+    method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController navController);
+  }
+
+  public final class NavControllerKt {
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.customview.widget.Openable? drawerLayout);
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration appBarConfiguration);
+  }
+
+  public final class NavigationViewKt {
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController navController);
+  }
+
+  public final class ToolbarKt {
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+  }
+
+}
+
diff --git a/navigation/navigation-ui-ktx/api/public_plus_experimental_2.3.0-alpha05.txt b/navigation/navigation-ui-ktx/api/public_plus_experimental_2.3.0-alpha05.txt
new file mode 100644
index 0000000..168f63e
--- /dev/null
+++ b/navigation/navigation-ui-ktx/api/public_plus_experimental_2.3.0-alpha05.txt
@@ -0,0 +1,43 @@
+// Signature format: 3.0
+package androidx.navigation.ui {
+
+  public final class ActivityKt {
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+  }
+
+  public final class AppBarConfigurationKt {
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(androidx.navigation.NavGraph navGraph, androidx.customview.widget.Openable? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(android.view.Menu topLevelMenu, androidx.customview.widget.Openable? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(java.util.Set<java.lang.Integer> topLevelDestinationIds, androidx.customview.widget.Openable? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+  }
+
+  public final class BottomNavigationViewKt {
+    method public static void setupWithNavController(com.google.android.material.bottomnavigation.BottomNavigationView, androidx.navigation.NavController navController);
+  }
+
+  public final class CollapsingToolbarLayoutKt {
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+  }
+
+  public final class MenuItemKt {
+    method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController navController);
+  }
+
+  public final class NavControllerKt {
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.customview.widget.Openable? drawerLayout);
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration appBarConfiguration);
+  }
+
+  public final class NavigationViewKt {
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController navController);
+  }
+
+  public final class ToolbarKt {
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+  }
+
+}
+
diff --git a/ui/ui-android-text/api/res-0.1.0-dev05.txt b/navigation/navigation-ui-ktx/api/res-2.3.0-alpha05.txt
similarity index 100%
copy from ui/ui-android-text/api/res-0.1.0-dev05.txt
copy to navigation/navigation-ui-ktx/api/res-2.3.0-alpha05.txt
diff --git a/navigation/navigation-ui-ktx/api/restricted_2.3.0-alpha05.ignore b/navigation/navigation-ui-ktx/api/restricted_2.3.0-alpha05.ignore
new file mode 100644
index 0000000..657afee
--- /dev/null
+++ b/navigation/navigation-ui-ktx/api/restricted_2.3.0-alpha05.ignore
@@ -0,0 +1,9 @@
+// Baseline format: 1.0
+RemovedMethod: androidx.navigation.ui.AppBarConfigurationKt#AppBarConfiguration(android.view.Menu, androidx.drawerlayout.widget.DrawerLayout, kotlin.jvm.functions.Function0<java.lang.Boolean>):
+    Removed method androidx.navigation.ui.AppBarConfigurationKt.AppBarConfiguration(android.view.Menu,androidx.drawerlayout.widget.DrawerLayout,kotlin.jvm.functions.Function0<java.lang.Boolean>)
+RemovedMethod: androidx.navigation.ui.AppBarConfigurationKt#AppBarConfiguration(androidx.navigation.NavGraph, androidx.drawerlayout.widget.DrawerLayout, kotlin.jvm.functions.Function0<java.lang.Boolean>):
+    Removed method androidx.navigation.ui.AppBarConfigurationKt.AppBarConfiguration(androidx.navigation.NavGraph,androidx.drawerlayout.widget.DrawerLayout,kotlin.jvm.functions.Function0<java.lang.Boolean>)
+RemovedMethod: androidx.navigation.ui.AppBarConfigurationKt#AppBarConfiguration(java.util.Set<java.lang.Integer>, androidx.drawerlayout.widget.DrawerLayout, kotlin.jvm.functions.Function0<java.lang.Boolean>):
+    Removed method androidx.navigation.ui.AppBarConfigurationKt.AppBarConfiguration(java.util.Set<java.lang.Integer>,androidx.drawerlayout.widget.DrawerLayout,kotlin.jvm.functions.Function0<java.lang.Boolean>)
+RemovedMethod: androidx.navigation.ui.NavControllerKt#navigateUp(androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout):
+    Removed method androidx.navigation.ui.NavControllerKt.navigateUp(androidx.navigation.NavController,androidx.drawerlayout.widget.DrawerLayout)
diff --git a/navigation/navigation-ui-ktx/api/restricted_2.3.0-alpha05.txt b/navigation/navigation-ui-ktx/api/restricted_2.3.0-alpha05.txt
new file mode 100644
index 0000000..168f63e
--- /dev/null
+++ b/navigation/navigation-ui-ktx/api/restricted_2.3.0-alpha05.txt
@@ -0,0 +1,43 @@
+// Signature format: 3.0
+package androidx.navigation.ui {
+
+  public final class ActivityKt {
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+  }
+
+  public final class AppBarConfigurationKt {
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(androidx.navigation.NavGraph navGraph, androidx.customview.widget.Openable? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(android.view.Menu topLevelMenu, androidx.customview.widget.Openable? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(java.util.Set<java.lang.Integer> topLevelDestinationIds, androidx.customview.widget.Openable? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+  }
+
+  public final class BottomNavigationViewKt {
+    method public static void setupWithNavController(com.google.android.material.bottomnavigation.BottomNavigationView, androidx.navigation.NavController navController);
+  }
+
+  public final class CollapsingToolbarLayoutKt {
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+  }
+
+  public final class MenuItemKt {
+    method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController navController);
+  }
+
+  public final class NavControllerKt {
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.customview.widget.Openable? drawerLayout);
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration appBarConfiguration);
+  }
+
+  public final class NavigationViewKt {
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController navController);
+  }
+
+  public final class ToolbarKt {
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+  }
+
+}
+
diff --git a/navigation/navigation-ui/api/2.3.0-alpha05.ignore b/navigation/navigation-ui/api/2.3.0-alpha05.ignore
new file mode 100644
index 0000000..9e9e553
--- /dev/null
+++ b/navigation/navigation-ui/api/2.3.0-alpha05.ignore
@@ -0,0 +1,9 @@
+// Baseline format: 1.0
+RemovedMethod: androidx.navigation.ui.NavigationUI#navigateUp(androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout):
+    Removed method androidx.navigation.ui.NavigationUI.navigateUp(androidx.navigation.NavController,androidx.drawerlayout.widget.DrawerLayout)
+RemovedMethod: androidx.navigation.ui.NavigationUI#setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout):
+    Removed method androidx.navigation.ui.NavigationUI.setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity,androidx.navigation.NavController,androidx.drawerlayout.widget.DrawerLayout)
+RemovedMethod: androidx.navigation.ui.NavigationUI#setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout):
+    Removed method androidx.navigation.ui.NavigationUI.setupWithNavController(androidx.appcompat.widget.Toolbar,androidx.navigation.NavController,androidx.drawerlayout.widget.DrawerLayout)
+RemovedMethod: androidx.navigation.ui.NavigationUI#setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout):
+    Removed method androidx.navigation.ui.NavigationUI.setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout,androidx.appcompat.widget.Toolbar,androidx.navigation.NavController,androidx.drawerlayout.widget.DrawerLayout)
diff --git a/navigation/navigation-ui/api/2.3.0-alpha05.txt b/navigation/navigation-ui/api/2.3.0-alpha05.txt
new file mode 100644
index 0000000..694afbd
--- /dev/null
+++ b/navigation/navigation-ui/api/2.3.0-alpha05.txt
@@ -0,0 +1,44 @@
+// Signature format: 3.0
+package androidx.navigation.ui {
+
+  public final class AppBarConfiguration {
+    method @Deprecated public androidx.drawerlayout.widget.DrawerLayout? getDrawerLayout();
+    method public androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? getFallbackOnNavigateUpListener();
+    method public androidx.customview.widget.Openable? getOpenableLayout();
+    method public java.util.Set<java.lang.Integer!> getTopLevelDestinations();
+  }
+
+  public static final class AppBarConfiguration.Builder {
+    ctor public AppBarConfiguration.Builder(androidx.navigation.NavGraph);
+    ctor public AppBarConfiguration.Builder(android.view.Menu);
+    ctor public AppBarConfiguration.Builder(int...);
+    ctor public AppBarConfiguration.Builder(java.util.Set<java.lang.Integer!>);
+    method public androidx.navigation.ui.AppBarConfiguration build();
+    method @Deprecated public androidx.navigation.ui.AppBarConfiguration.Builder setDrawerLayout(androidx.drawerlayout.widget.DrawerLayout?);
+    method public androidx.navigation.ui.AppBarConfiguration.Builder setFallbackOnNavigateUpListener(androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener?);
+    method public androidx.navigation.ui.AppBarConfiguration.Builder setOpenableLayout(androidx.customview.widget.Openable?);
+  }
+
+  public static interface AppBarConfiguration.OnNavigateUpListener {
+    method public boolean onNavigateUp();
+  }
+
+  public final class NavigationUI {
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.customview.widget.Openable?);
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController, androidx.customview.widget.Openable?);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.customview.widget.Openable?);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.customview.widget.Openable?);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController);
+    method public static void setupWithNavController(com.google.android.material.bottomnavigation.BottomNavigationView, androidx.navigation.NavController);
+  }
+
+}
+
diff --git a/navigation/navigation-ui/api/public_plus_experimental_2.3.0-alpha05.txt b/navigation/navigation-ui/api/public_plus_experimental_2.3.0-alpha05.txt
new file mode 100644
index 0000000..694afbd
--- /dev/null
+++ b/navigation/navigation-ui/api/public_plus_experimental_2.3.0-alpha05.txt
@@ -0,0 +1,44 @@
+// Signature format: 3.0
+package androidx.navigation.ui {
+
+  public final class AppBarConfiguration {
+    method @Deprecated public androidx.drawerlayout.widget.DrawerLayout? getDrawerLayout();
+    method public androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? getFallbackOnNavigateUpListener();
+    method public androidx.customview.widget.Openable? getOpenableLayout();
+    method public java.util.Set<java.lang.Integer!> getTopLevelDestinations();
+  }
+
+  public static final class AppBarConfiguration.Builder {
+    ctor public AppBarConfiguration.Builder(androidx.navigation.NavGraph);
+    ctor public AppBarConfiguration.Builder(android.view.Menu);
+    ctor public AppBarConfiguration.Builder(int...);
+    ctor public AppBarConfiguration.Builder(java.util.Set<java.lang.Integer!>);
+    method public androidx.navigation.ui.AppBarConfiguration build();
+    method @Deprecated public androidx.navigation.ui.AppBarConfiguration.Builder setDrawerLayout(androidx.drawerlayout.widget.DrawerLayout?);
+    method public androidx.navigation.ui.AppBarConfiguration.Builder setFallbackOnNavigateUpListener(androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener?);
+    method public androidx.navigation.ui.AppBarConfiguration.Builder setOpenableLayout(androidx.customview.widget.Openable?);
+  }
+
+  public static interface AppBarConfiguration.OnNavigateUpListener {
+    method public boolean onNavigateUp();
+  }
+
+  public final class NavigationUI {
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.customview.widget.Openable?);
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController, androidx.customview.widget.Openable?);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.customview.widget.Openable?);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.customview.widget.Openable?);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController);
+    method public static void setupWithNavController(com.google.android.material.bottomnavigation.BottomNavigationView, androidx.navigation.NavController);
+  }
+
+}
+
diff --git a/ui/ui-android-text/api/res-0.1.0-dev05.txt b/navigation/navigation-ui/api/res-2.3.0-alpha05.txt
similarity index 100%
copy from ui/ui-android-text/api/res-0.1.0-dev05.txt
copy to navigation/navigation-ui/api/res-2.3.0-alpha05.txt
diff --git a/navigation/navigation-ui/api/restricted_2.3.0-alpha05.ignore b/navigation/navigation-ui/api/restricted_2.3.0-alpha05.ignore
new file mode 100644
index 0000000..9e9e553
--- /dev/null
+++ b/navigation/navigation-ui/api/restricted_2.3.0-alpha05.ignore
@@ -0,0 +1,9 @@
+// Baseline format: 1.0
+RemovedMethod: androidx.navigation.ui.NavigationUI#navigateUp(androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout):
+    Removed method androidx.navigation.ui.NavigationUI.navigateUp(androidx.navigation.NavController,androidx.drawerlayout.widget.DrawerLayout)
+RemovedMethod: androidx.navigation.ui.NavigationUI#setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout):
+    Removed method androidx.navigation.ui.NavigationUI.setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity,androidx.navigation.NavController,androidx.drawerlayout.widget.DrawerLayout)
+RemovedMethod: androidx.navigation.ui.NavigationUI#setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout):
+    Removed method androidx.navigation.ui.NavigationUI.setupWithNavController(androidx.appcompat.widget.Toolbar,androidx.navigation.NavController,androidx.drawerlayout.widget.DrawerLayout)
+RemovedMethod: androidx.navigation.ui.NavigationUI#setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout):
+    Removed method androidx.navigation.ui.NavigationUI.setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout,androidx.appcompat.widget.Toolbar,androidx.navigation.NavController,androidx.drawerlayout.widget.DrawerLayout)
diff --git a/navigation/navigation-ui/api/restricted_2.3.0-alpha05.txt b/navigation/navigation-ui/api/restricted_2.3.0-alpha05.txt
new file mode 100644
index 0000000..694afbd
--- /dev/null
+++ b/navigation/navigation-ui/api/restricted_2.3.0-alpha05.txt
@@ -0,0 +1,44 @@
+// Signature format: 3.0
+package androidx.navigation.ui {
+
+  public final class AppBarConfiguration {
+    method @Deprecated public androidx.drawerlayout.widget.DrawerLayout? getDrawerLayout();
+    method public androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? getFallbackOnNavigateUpListener();
+    method public androidx.customview.widget.Openable? getOpenableLayout();
+    method public java.util.Set<java.lang.Integer!> getTopLevelDestinations();
+  }
+
+  public static final class AppBarConfiguration.Builder {
+    ctor public AppBarConfiguration.Builder(androidx.navigation.NavGraph);
+    ctor public AppBarConfiguration.Builder(android.view.Menu);
+    ctor public AppBarConfiguration.Builder(int...);
+    ctor public AppBarConfiguration.Builder(java.util.Set<java.lang.Integer!>);
+    method public androidx.navigation.ui.AppBarConfiguration build();
+    method @Deprecated public androidx.navigation.ui.AppBarConfiguration.Builder setDrawerLayout(androidx.drawerlayout.widget.DrawerLayout?);
+    method public androidx.navigation.ui.AppBarConfiguration.Builder setFallbackOnNavigateUpListener(androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener?);
+    method public androidx.navigation.ui.AppBarConfiguration.Builder setOpenableLayout(androidx.customview.widget.Openable?);
+  }
+
+  public static interface AppBarConfiguration.OnNavigateUpListener {
+    method public boolean onNavigateUp();
+  }
+
+  public final class NavigationUI {
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.customview.widget.Openable?);
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController, androidx.customview.widget.Openable?);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.customview.widget.Openable?);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.customview.widget.Openable?);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController);
+    method public static void setupWithNavController(com.google.android.material.bottomnavigation.BottomNavigationView, androidx.navigation.NavController);
+  }
+
+}
+
diff --git a/navigation/navigation-ui/build.gradle b/navigation/navigation-ui/build.gradle
index 67463c9..98b8051 100644
--- a/navigation/navigation-ui/build.gradle
+++ b/navigation/navigation-ui/build.gradle
@@ -34,8 +34,8 @@
 
 dependencies {
     api(project(":navigation:navigation-runtime"))
-    api("androidx.customview:customview:1.1.0-alpha02")
-    api("androidx.drawerlayout:drawerlayout:1.1.0-alpha04")
+    api("androidx.customview:customview:1.1.0-beta01")
+    api("androidx.drawerlayout:drawerlayout:1.1.0-beta01")
     api(MATERIAL)
     implementation('androidx.transition:transition:1.3.0')
 
diff --git a/paging/common/api/3.0.0-alpha01.txt b/paging/common/api/3.0.0-alpha01.txt
index 81ce7ed..30a52a2 100644
--- a/paging/common/api/3.0.0-alpha01.txt
+++ b/paging/common/api/3.0.0-alpha01.txt
@@ -222,11 +222,12 @@
   }
 
   public final class PagingConfig {
-    ctor public PagingConfig(int pageSize, int prefetchDistance, boolean enablePlaceholders, int initialLoadSize, int maxSize);
+    ctor public PagingConfig(int pageSize, int prefetchDistance, boolean enablePlaceholders, int initialLoadSize, int maxSize, int jumpThreshold);
     field public static final androidx.paging.PagingConfig.Companion! Companion;
     field public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
     field public final boolean enablePlaceholders;
     field public final int initialLoadSize;
+    field public final int jumpThreshold;
     field public final int maxSize;
     field public final int pageSize;
     field public final int prefetchDistance;
@@ -273,12 +274,14 @@
   public abstract class PagingSource<Key, Value> {
     ctor public PagingSource();
     method public final boolean getInvalid();
+    method public boolean getJumpingSupported();
     method public Key? getRefreshKey(androidx.paging.PagingState<Key,Value> state);
     method public void invalidate();
     method public abstract suspend Object load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
     method public final void registerInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
     method public final void unregisterInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
     property public final boolean invalid;
+    property public boolean jumpingSupported;
   }
 
   public static final class PagingSource.LoadParams<Key> {
@@ -377,7 +380,7 @@
   public abstract class RemoteMediator<Key, Value> {
     ctor public RemoteMediator();
     method public suspend Object initialize(kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.InitializeAction> $completion);
-    method public abstract suspend Object load(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value>? state, kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.MediatorResult> p);
+    method public abstract suspend Object load(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state, kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.MediatorResult> p);
   }
 
   public enum RemoteMediator.InitializeAction {
diff --git a/paging/common/api/current.txt b/paging/common/api/current.txt
index 81ce7ed..30a52a2 100644
--- a/paging/common/api/current.txt
+++ b/paging/common/api/current.txt
@@ -222,11 +222,12 @@
   }
 
   public final class PagingConfig {
-    ctor public PagingConfig(int pageSize, int prefetchDistance, boolean enablePlaceholders, int initialLoadSize, int maxSize);
+    ctor public PagingConfig(int pageSize, int prefetchDistance, boolean enablePlaceholders, int initialLoadSize, int maxSize, int jumpThreshold);
     field public static final androidx.paging.PagingConfig.Companion! Companion;
     field public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
     field public final boolean enablePlaceholders;
     field public final int initialLoadSize;
+    field public final int jumpThreshold;
     field public final int maxSize;
     field public final int pageSize;
     field public final int prefetchDistance;
@@ -273,12 +274,14 @@
   public abstract class PagingSource<Key, Value> {
     ctor public PagingSource();
     method public final boolean getInvalid();
+    method public boolean getJumpingSupported();
     method public Key? getRefreshKey(androidx.paging.PagingState<Key,Value> state);
     method public void invalidate();
     method public abstract suspend Object load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
     method public final void registerInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
     method public final void unregisterInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
     property public final boolean invalid;
+    property public boolean jumpingSupported;
   }
 
   public static final class PagingSource.LoadParams<Key> {
@@ -377,7 +380,7 @@
   public abstract class RemoteMediator<Key, Value> {
     ctor public RemoteMediator();
     method public suspend Object initialize(kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.InitializeAction> $completion);
-    method public abstract suspend Object load(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value>? state, kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.MediatorResult> p);
+    method public abstract suspend Object load(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state, kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.MediatorResult> p);
   }
 
   public enum RemoteMediator.InitializeAction {
diff --git a/paging/common/api/public_plus_experimental_3.0.0-alpha01.txt b/paging/common/api/public_plus_experimental_3.0.0-alpha01.txt
index 81ce7ed..30a52a2 100644
--- a/paging/common/api/public_plus_experimental_3.0.0-alpha01.txt
+++ b/paging/common/api/public_plus_experimental_3.0.0-alpha01.txt
@@ -222,11 +222,12 @@
   }
 
   public final class PagingConfig {
-    ctor public PagingConfig(int pageSize, int prefetchDistance, boolean enablePlaceholders, int initialLoadSize, int maxSize);
+    ctor public PagingConfig(int pageSize, int prefetchDistance, boolean enablePlaceholders, int initialLoadSize, int maxSize, int jumpThreshold);
     field public static final androidx.paging.PagingConfig.Companion! Companion;
     field public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
     field public final boolean enablePlaceholders;
     field public final int initialLoadSize;
+    field public final int jumpThreshold;
     field public final int maxSize;
     field public final int pageSize;
     field public final int prefetchDistance;
@@ -273,12 +274,14 @@
   public abstract class PagingSource<Key, Value> {
     ctor public PagingSource();
     method public final boolean getInvalid();
+    method public boolean getJumpingSupported();
     method public Key? getRefreshKey(androidx.paging.PagingState<Key,Value> state);
     method public void invalidate();
     method public abstract suspend Object load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
     method public final void registerInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
     method public final void unregisterInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
     property public final boolean invalid;
+    property public boolean jumpingSupported;
   }
 
   public static final class PagingSource.LoadParams<Key> {
@@ -377,7 +380,7 @@
   public abstract class RemoteMediator<Key, Value> {
     ctor public RemoteMediator();
     method public suspend Object initialize(kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.InitializeAction> $completion);
-    method public abstract suspend Object load(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value>? state, kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.MediatorResult> p);
+    method public abstract suspend Object load(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state, kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.MediatorResult> p);
   }
 
   public enum RemoteMediator.InitializeAction {
diff --git a/paging/common/api/public_plus_experimental_current.txt b/paging/common/api/public_plus_experimental_current.txt
index 81ce7ed..30a52a2 100644
--- a/paging/common/api/public_plus_experimental_current.txt
+++ b/paging/common/api/public_plus_experimental_current.txt
@@ -222,11 +222,12 @@
   }
 
   public final class PagingConfig {
-    ctor public PagingConfig(int pageSize, int prefetchDistance, boolean enablePlaceholders, int initialLoadSize, int maxSize);
+    ctor public PagingConfig(int pageSize, int prefetchDistance, boolean enablePlaceholders, int initialLoadSize, int maxSize, int jumpThreshold);
     field public static final androidx.paging.PagingConfig.Companion! Companion;
     field public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
     field public final boolean enablePlaceholders;
     field public final int initialLoadSize;
+    field public final int jumpThreshold;
     field public final int maxSize;
     field public final int pageSize;
     field public final int prefetchDistance;
@@ -273,12 +274,14 @@
   public abstract class PagingSource<Key, Value> {
     ctor public PagingSource();
     method public final boolean getInvalid();
+    method public boolean getJumpingSupported();
     method public Key? getRefreshKey(androidx.paging.PagingState<Key,Value> state);
     method public void invalidate();
     method public abstract suspend Object load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
     method public final void registerInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
     method public final void unregisterInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
     property public final boolean invalid;
+    property public boolean jumpingSupported;
   }
 
   public static final class PagingSource.LoadParams<Key> {
@@ -377,7 +380,7 @@
   public abstract class RemoteMediator<Key, Value> {
     ctor public RemoteMediator();
     method public suspend Object initialize(kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.InitializeAction> $completion);
-    method public abstract suspend Object load(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value>? state, kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.MediatorResult> p);
+    method public abstract suspend Object load(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state, kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.MediatorResult> p);
   }
 
   public enum RemoteMediator.InitializeAction {
diff --git a/paging/common/api/restricted_3.0.0-alpha01.txt b/paging/common/api/restricted_3.0.0-alpha01.txt
index 81ce7ed..30a52a2 100644
--- a/paging/common/api/restricted_3.0.0-alpha01.txt
+++ b/paging/common/api/restricted_3.0.0-alpha01.txt
@@ -222,11 +222,12 @@
   }
 
   public final class PagingConfig {
-    ctor public PagingConfig(int pageSize, int prefetchDistance, boolean enablePlaceholders, int initialLoadSize, int maxSize);
+    ctor public PagingConfig(int pageSize, int prefetchDistance, boolean enablePlaceholders, int initialLoadSize, int maxSize, int jumpThreshold);
     field public static final androidx.paging.PagingConfig.Companion! Companion;
     field public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
     field public final boolean enablePlaceholders;
     field public final int initialLoadSize;
+    field public final int jumpThreshold;
     field public final int maxSize;
     field public final int pageSize;
     field public final int prefetchDistance;
@@ -273,12 +274,14 @@
   public abstract class PagingSource<Key, Value> {
     ctor public PagingSource();
     method public final boolean getInvalid();
+    method public boolean getJumpingSupported();
     method public Key? getRefreshKey(androidx.paging.PagingState<Key,Value> state);
     method public void invalidate();
     method public abstract suspend Object load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
     method public final void registerInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
     method public final void unregisterInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
     property public final boolean invalid;
+    property public boolean jumpingSupported;
   }
 
   public static final class PagingSource.LoadParams<Key> {
@@ -377,7 +380,7 @@
   public abstract class RemoteMediator<Key, Value> {
     ctor public RemoteMediator();
     method public suspend Object initialize(kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.InitializeAction> $completion);
-    method public abstract suspend Object load(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value>? state, kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.MediatorResult> p);
+    method public abstract suspend Object load(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state, kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.MediatorResult> p);
   }
 
   public enum RemoteMediator.InitializeAction {
diff --git a/paging/common/api/restricted_current.txt b/paging/common/api/restricted_current.txt
index 81ce7ed..30a52a2 100644
--- a/paging/common/api/restricted_current.txt
+++ b/paging/common/api/restricted_current.txt
@@ -222,11 +222,12 @@
   }
 
   public final class PagingConfig {
-    ctor public PagingConfig(int pageSize, int prefetchDistance, boolean enablePlaceholders, int initialLoadSize, int maxSize);
+    ctor public PagingConfig(int pageSize, int prefetchDistance, boolean enablePlaceholders, int initialLoadSize, int maxSize, int jumpThreshold);
     field public static final androidx.paging.PagingConfig.Companion! Companion;
     field public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
     field public final boolean enablePlaceholders;
     field public final int initialLoadSize;
+    field public final int jumpThreshold;
     field public final int maxSize;
     field public final int pageSize;
     field public final int prefetchDistance;
@@ -273,12 +274,14 @@
   public abstract class PagingSource<Key, Value> {
     ctor public PagingSource();
     method public final boolean getInvalid();
+    method public boolean getJumpingSupported();
     method public Key? getRefreshKey(androidx.paging.PagingState<Key,Value> state);
     method public void invalidate();
     method public abstract suspend Object load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
     method public final void registerInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
     method public final void unregisterInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
     property public final boolean invalid;
+    property public boolean jumpingSupported;
   }
 
   public static final class PagingSource.LoadParams<Key> {
@@ -377,7 +380,7 @@
   public abstract class RemoteMediator<Key, Value> {
     ctor public RemoteMediator();
     method public suspend Object initialize(kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.InitializeAction> $completion);
-    method public abstract suspend Object load(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value>? state, kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.MediatorResult> p);
+    method public abstract suspend Object load(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state, kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.MediatorResult> p);
   }
 
   public enum RemoteMediator.InitializeAction {
diff --git a/paging/common/src/main/kotlin/androidx/paging/PageFetcher.kt b/paging/common/src/main/kotlin/androidx/paging/PageFetcher.kt
index 4c4f944..f069eb2 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PageFetcher.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PageFetcher.kt
@@ -112,11 +112,12 @@
                 previousGeneration?.close()
 
                 Pager(
-                    initialKey,
-                    pagingSource,
-                    config,
-                    remoteMediatorAccessor,
-                    retryChannel.asFlow()
+                    initialKey = initialKey,
+                    pagingSource = pagingSource,
+                    config = config,
+                    retryFlow = retryChannel.asFlow(),
+                    remoteMediatorAccessor = remoteMediatorAccessor,
+                    invalidate = this@PageFetcher::refresh
                 )
             }
             .filterNotNull()
diff --git a/paging/common/src/main/kotlin/androidx/paging/Pager.kt b/paging/common/src/main/kotlin/androidx/paging/Pager.kt
index 109df67..7d3f517 100644
--- a/paging/common/src/main/kotlin/androidx/paging/Pager.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/Pager.kt
@@ -28,6 +28,7 @@
 import androidx.paging.PagingSource.LoadParams
 import androidx.paging.PagingSource.LoadResult
 import androidx.paging.PagingSource.LoadResult.Page
+import androidx.paging.PagingSource.LoadResult.Page.Companion.COUNT_UNDEFINED
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.FlowPreview
@@ -51,6 +52,7 @@
 import kotlinx.coroutines.sync.Mutex
 import kotlinx.coroutines.sync.withLock
 import java.util.concurrent.atomic.AtomicBoolean
+import kotlin.math.absoluteValue
 
 /**
  * Holds a generation of pageable data, a snapshot of data loaded by [PagingSource]. An instance
@@ -61,9 +63,17 @@
     internal val initialKey: Key?,
     internal val pagingSource: PagingSource<Key, Value>,
     private val config: PagingConfig,
+    private val retryFlow: Flow<Unit>,
     private val remoteMediatorAccessor: RemoteMediatorAccessor<Key, Value>? = null,
-    private val retryFlow: Flow<Unit>
+    private val invalidate: () -> Unit = {}
 ) {
+    init {
+        require(config.jumpThreshold == COUNT_UNDEFINED || pagingSource.jumpingSupported) {
+            "PagingConfig.jumpThreshold was set, but the associated PagingSource has not marked " +
+                    "support for jumps by overriding PagingSource.jumpingSupported to true."
+        }
+    }
+
     @OptIn(ExperimentalCoroutinesApi::class)
     private val hintChannel = BroadcastChannel<ViewportHint>(CONFLATED)
     private var lastHint: ViewportHint? = null
@@ -169,8 +179,26 @@
         }
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
+    @OptIn(ExperimentalCoroutinesApi::class, FlowPreview::class)
     private fun CoroutineScope.startConsumingHints() {
+        // Pseudo-tiling via invalidation on jumps.
+        if (config.jumpThreshold != COUNT_UNDEFINED) {
+            launch {
+                hintChannel.asFlow()
+                    .collect { hint ->
+                        stateLock.withLock {
+                            with(state) {
+                                hint.withCoercedHint { _, _, hintOffset ->
+                                    if (hintOffset.absoluteValue >= config.jumpThreshold) {
+                                        invalidate()
+                                    }
+                                }
+                            }
+                        }
+                    }
+            }
+        }
+
         launch {
             state.consumePrependGenerationIdAsFlow()
                 .transformLatest { generationId ->
@@ -481,13 +509,13 @@
             generationId,
             pageIndex,
             indexInPage,
-            config.prefetchDistance + hintOffset
+            config.prefetchDistance + hintOffset.absoluteValue
         )
         END -> nextAppendKey(
             generationId,
             pageIndex,
             indexInPage,
-            config.prefetchDistance + hintOffset
+            config.prefetchDistance + hintOffset.absoluteValue
         )
         REFRESH -> throw IllegalArgumentException("Just use initialKey directly")
     }
diff --git a/paging/common/src/main/kotlin/androidx/paging/PagerState.kt b/paging/common/src/main/kotlin/androidx/paging/PagerState.kt
index 006679e..385af04 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PagerState.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PagerState.kt
@@ -31,7 +31,6 @@
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.consumeAsFlow
 import kotlinx.coroutines.flow.onStart
-import kotlin.math.absoluteValue
 
 /**
  * Internal state of [Pager] whose updates can be consumed as a [Flow]<[PageEvent]<[Value]>>.
@@ -297,39 +296,42 @@
      *
      * Note: If an invalid / out-of-date sourcePageIndex is passed, it will be coerced to the
      * closest pageIndex within the range of [pages]
-     *
-     * TODO: Handle pages.isEmpty (lastIndex returns -1)
      */
     internal suspend fun <T> ViewportHint.withCoercedHint(
         block: suspend (indexInPage: Int, pageIndex: Int, hintOffset: Int) -> T
     ): T {
+        if (pages.isEmpty()) {
+            throw IllegalStateException("Cannot coerce hint when no pages have loaded")
+        }
+
         var indexInPage = indexInPage
         var pageIndex = sourcePageIndex + initialPageIndex
         var hintOffset = 0
 
         // Coerce pageIndex to >= 0, snap indexInPage to 0 if pageIndex is coerced.
         if (pageIndex < 0) {
-            hintOffset = (pageIndex.absoluteValue - 1) * pageSize
+            hintOffset = pageIndex * pageSize + indexInPage
 
             pageIndex = 0
             indexInPage = 0
-        }
-
-        // Reduce indexInPage by incrementing pageIndex while indexInPage is outside the bounds of
-        // the page referenced by pageIndex.
-        while (pageIndex < pages.lastIndex && indexInPage > pages[pageIndex].data.lastIndex) {
-            indexInPage -= pages[pageIndex].data.size
-            pageIndex++
-        }
-
-        // Coerce pageIndex to <= pages.lastIndex, snap indexInPage to last index if pageIndex is
-        // coerced.
-        if (pageIndex > pages.lastIndex) {
-            val itemsInSkippedPages = (pageIndex - pages.lastIndex - 1) * pageSize
-            hintOffset = itemsInSkippedPages + indexInPage + 1
+        } else if (pageIndex > pages.lastIndex) {
+            // Number of items after last loaded item that this hint refers to.
+            hintOffset = (pageIndex - pages.lastIndex - 1) * pageSize + indexInPage + 1
 
             pageIndex = pages.lastIndex
-            indexInPage = pages.lastOrNull()?.data?.lastIndex ?: 0
+            indexInPage = pages.last().data.lastIndex
+        } else {
+            if (indexInPage !in pages[pageIndex].data.indices) {
+                hintOffset = indexInPage
+            }
+
+            // Reduce indexInPage by incrementing pageIndex while indexInPage is outside the bounds
+            // of the page referenced by pageIndex.
+            while (pageIndex < pages.lastIndex && indexInPage > pages[pageIndex].data.lastIndex) {
+                hintOffset -= pages[pageIndex].data.size
+                indexInPage -= pages[pageIndex].data.size
+                pageIndex++
+            }
         }
 
         return block(indexInPage, pageIndex, hintOffset)
diff --git a/paging/common/src/main/kotlin/androidx/paging/PagingConfig.kt b/paging/common/src/main/kotlin/androidx/paging/PagingConfig.kt
index e04c5db..cbed71d 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PagingConfig.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PagingConfig.kt
@@ -17,6 +17,9 @@
 package androidx.paging
 
 import androidx.annotation.IntRange
+import androidx.paging.PagingConfig.Builder
+import androidx.paging.PagingConfig.Companion.MAX_SIZE_UNBOUNDED
+import androidx.paging.PagingSource.LoadResult.Page.Companion.COUNT_UNDEFINED
 
 /**
  * Configures how to load content from a [PagingSource].
@@ -75,7 +78,15 @@
      * @see Builder.setMaxSize
      */
     @JvmField
-    val maxSize: Int = MAX_SIZE_UNBOUNDED
+    val maxSize: Int = MAX_SIZE_UNBOUNDED,
+
+    /**
+     * Threshold for number of items scrolled outside the bounds of loaded items to trigger
+     * invalidate. Defaults to [COUNT_UNDEFINED], which disables invalidation due to scrolling
+     * large distances.
+     */
+    @JvmField
+    val jumpThreshold: Int = COUNT_UNDEFINED
 ) {
     init {
         if (!enablePlaceholders && prefetchDistance == 0) {
@@ -92,7 +103,12 @@
                         ", maxSize=$maxSize"
             )
         }
+
+        require(jumpThreshold == COUNT_UNDEFINED || jumpThreshold > 0) {
+            "jumpThreshold must be positive to enable jumps or COUNT_UNDEFINED to disable jumping."
+        }
     }
+
     companion object {
         /**
          * When [maxSize] is set to [MAX_SIZE_UNBOUNDED], the maximum number of items loaded is
diff --git a/paging/common/src/main/kotlin/androidx/paging/PagingSource.kt b/paging/common/src/main/kotlin/androidx/paging/PagingSource.kt
index 0a687a3..61c1f02 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PagingSource.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PagingSource.kt
@@ -173,6 +173,22 @@
     }
 
     /**
+     * `true` if this [PagingSource] supports jumping, `false` otherwise.
+     *
+     * Override this to `true` if pseudo-fast scrolling via jumps is supported.
+     *
+     * A jump occurs when a `RecyclerView` scrolls through a number of placeholders defined by
+     * [PagingConfig.jumpThreshold] and triggers a load with [LoadType] [REFRESH].
+     *
+     * [PagingSource]s that support jumps should override [getRefreshKey] to return a [Key] that
+     * would load data fulfilling the viewport given a user's current [PagingState.anchorPosition].
+     *
+     * @see [PagingConfig.jumpThreshold]
+     */
+    open val jumpingSupported: Boolean
+        get() = false
+
+    /**
      * Request a refresh key given the current [PagingState] of the associated [PagingData] used to
      * present loaded data from this [PagingSource].
      *
diff --git a/paging/common/src/main/kotlin/androidx/paging/RemoteMediator.kt b/paging/common/src/main/kotlin/androidx/paging/RemoteMediator.kt
index 284bc50..3c0dec5 100644
--- a/paging/common/src/main/kotlin/androidx/paging/RemoteMediator.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/RemoteMediator.kt
@@ -26,6 +26,8 @@
  *  * [PagingSource] returns a [PagingSource.LoadResult] which signals start / end boundary.
  *
  * These events together can be used to implement layered pagination - network + local storage.
+ *
+ * @sample androidx.paging.samples.remoteMediatorSample
  */
 abstract class RemoteMediator<Key : Any, Value : Any> {
     /**
@@ -59,7 +61,7 @@
      * @return [MediatorResult] signifying what [LoadState] to be passed to the UI, and whether
      * there's more data available.
      */
-    abstract suspend fun load(loadType: LoadType, state: PagingState<Key, Value>?): MediatorResult
+    abstract suspend fun load(loadType: LoadType, state: PagingState<Key, Value>): MediatorResult
 
     /**
      * Callback fired during initialization of a [PagingData] stream, before initial load.
diff --git a/paging/common/src/test/kotlin/androidx/paging/CachedPageEventFlowTest.kt b/paging/common/src/test/kotlin/androidx/paging/CachedPageEventFlowTest.kt
index 75ddc03..f493aff 100644
--- a/paging/common/src/test/kotlin/androidx/paging/CachedPageEventFlowTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/CachedPageEventFlowTest.kt
@@ -21,6 +21,7 @@
 import androidx.paging.PageEvent.Insert.Companion.Start
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.channels.Channel
 import kotlinx.coroutines.flow.Flow
@@ -33,6 +34,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @RunWith(JUnit4::class)
 class CachedPageEventFlowTest {
     private val testScope = TestCoroutineScope()
diff --git a/paging/common/src/test/kotlin/androidx/paging/CachingTest.kt b/paging/common/src/test/kotlin/androidx/paging/CachingTest.kt
index 113bcfa..07de3aa 100644
--- a/paging/common/src/test/kotlin/androidx/paging/CachingTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/CachingTest.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
+
 package androidx.paging
 
 import androidx.paging.ActiveFlowTracker.FlowType
diff --git a/paging/common/src/test/kotlin/androidx/paging/ContiguousPagedListTest.kt b/paging/common/src/test/kotlin/androidx/paging/ContiguousPagedListTest.kt
index a8139d8..a53bc0b2 100644
--- a/paging/common/src/test/kotlin/androidx/paging/ContiguousPagedListTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/ContiguousPagedListTest.kt
@@ -14,6 +14,9 @@
  * limitations under the License.
  */
 
+@file:OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
+@file:Suppress("DEPRECATION")
+
 package androidx.paging
 
 import androidx.paging.ItemKeyedDataSourceTest.ItemDataSource
diff --git a/paging/common/src/test/kotlin/androidx/paging/HeaderFooterTest.kt b/paging/common/src/test/kotlin/androidx/paging/HeaderFooterTest.kt
index 862dfd2..fb3c12e 100644
--- a/paging/common/src/test/kotlin/androidx/paging/HeaderFooterTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/HeaderFooterTest.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
+
 package androidx.paging
 
 import androidx.paging.LoadState.Done
diff --git a/paging/common/src/test/kotlin/androidx/paging/ItemKeyedDataSourceTest.kt b/paging/common/src/test/kotlin/androidx/paging/ItemKeyedDataSourceTest.kt
index 651beccb..3ca6467 100644
--- a/paging/common/src/test/kotlin/androidx/paging/ItemKeyedDataSourceTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/ItemKeyedDataSourceTest.kt
@@ -31,6 +31,7 @@
 import org.mockito.Mockito.verifyNoMoreInteractions
 import kotlin.test.assertFailsWith
 
+@Suppress("DEPRECATION")
 @RunWith(JUnit4::class)
 class ItemKeyedDataSourceTest {
 
diff --git a/paging/common/src/test/kotlin/androidx/paging/LegacyPagerTest.kt b/paging/common/src/test/kotlin/androidx/paging/LegacyPagerTest.kt
index 3d42cc6..c2f10b2 100644
--- a/paging/common/src/test/kotlin/androidx/paging/LegacyPagerTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/LegacyPagerTest.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("DEPRECATION")
+
 package androidx.paging
 
 import androidx.paging.PagedList.Config
diff --git a/paging/common/src/test/kotlin/androidx/paging/LegacyPagingSourceTest.kt b/paging/common/src/test/kotlin/androidx/paging/LegacyPagingSourceTest.kt
index 3c9cf2e..26e903d 100644
--- a/paging/common/src/test/kotlin/androidx/paging/LegacyPagingSourceTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/LegacyPagingSourceTest.kt
@@ -45,6 +45,7 @@
 
     @Test
     fun item() {
+        @Suppress("DEPRECATION")
         val dataSource = object : ItemKeyedDataSource<Int, String>() {
             override fun loadInitial(
                 params: LoadInitialParams<Int>,
@@ -78,6 +79,7 @@
 
     @Test
     fun page() {
+        @Suppress("DEPRECATION")
         val dataSource = object : PageKeyedDataSource<Int, String>() {
             override fun loadInitial(
                 params: LoadInitialParams<Int>,
@@ -182,6 +184,7 @@
         assertTrue { dataSource.isInvalid }
     }
 
+    @Suppress("DEPRECATION")
     private fun createTestPositionalDataSource() = object : PositionalDataSource<String>() {
         override fun loadInitial(
             params: LoadInitialParams,
diff --git a/paging/common/src/test/kotlin/androidx/paging/PageFetcherTest.kt b/paging/common/src/test/kotlin/androidx/paging/PageFetcherTest.kt
index 866d2b1..a4fc55a 100644
--- a/paging/common/src/test/kotlin/androidx/paging/PageFetcherTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/PageFetcherTest.kt
@@ -277,6 +277,38 @@
 
         fetcherState.job.cancel()
     }
+
+    @Test
+    fun jump() = testScope.runBlockingTest {
+        pauseDispatcher {
+            var pagingSources = mutableListOf<PagingSource<Int, Int>>()
+            val pagingSourceFactory = { TestPagingSource().also { pagingSources.add(it) } }
+            val config = PagingConfig(
+                pageSize = 1,
+                prefetchDistance = 1,
+                enablePlaceholders = true,
+                initialLoadSize = 2,
+                maxSize = 3,
+                jumpThreshold = 10
+            )
+            val pageFetcher = PageFetcher(pagingSourceFactory, 50, config)
+            val fetcherState = collectFetcherState(pageFetcher)
+
+            advanceUntilIdle()
+
+            fetcherState.pagingDataList[0].receiver.addHint(ViewportHint(0, -50))
+            advanceUntilIdle()
+
+            val expected: List<PageEvent<Int>> = listOf(
+                PageEvent.LoadStateUpdate(LoadType.REFRESH, LoadState.Loading),
+                createRefresh(range = 50..51)
+            )
+            assertEvents(expected, fetcherState.pageEventLists[0])
+            assertTrue { pagingSources[0].invalid }
+
+            fetcherState.job.cancel()
+        }
+    }
 }
 
 internal class FetcherState<T : Any>(
diff --git a/paging/common/src/test/kotlin/androidx/paging/PageKeyedDataSourceTest.kt b/paging/common/src/test/kotlin/androidx/paging/PageKeyedDataSourceTest.kt
index 534aad2..5ddb98c 100644
--- a/paging/common/src/test/kotlin/androidx/paging/PageKeyedDataSourceTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/PageKeyedDataSourceTest.kt
@@ -41,6 +41,7 @@
 
     internal data class Page(val prev: String?, val data: List<Item>, val next: String?)
 
+    @Suppress("DEPRECATION")
     internal class ItemDataSource(val data: Map<String, Page> = PAGE_MAP) :
         PageKeyedDataSource<String, Item>() {
         private var error = false
@@ -111,6 +112,7 @@
         assertEquals(ITEM_LIST, pagedList)
     }
 
+    @Suppress("DEPRECATION")
     private fun performLoadInitial(
         invalidateDataSource: Boolean = false,
         callbackInvoker:
@@ -210,6 +212,7 @@
 
     @Test
     fun testBoundaryCallback() {
+        @Suppress("DEPRECATION")
         val dataSource = object : PageKeyedDataSource<String, String>() {
             override fun loadInitial(
                 params: LoadInitialParams<String>,
@@ -235,7 +238,7 @@
             }
         }
 
-        @Suppress("UNCHECKED_CAST")
+        @Suppress("UNCHECKED_CAST", "DEPRECATION")
         val boundaryCallback =
             mock(PagedList.BoundaryCallback::class.java) as PagedList.BoundaryCallback<String>
         val dispatcher = TestDispatcher()
@@ -263,6 +266,7 @@
 
     @Test
     fun testBoundaryCallbackJustInitial() {
+        @Suppress("DEPRECATION")
         val dataSource = object : PageKeyedDataSource<String, String>() {
             override fun loadInitial(
                 params: LoadInitialParams<String>,
@@ -287,7 +291,7 @@
             }
         }
 
-        @Suppress("UNCHECKED_CAST")
+        @Suppress("UNCHECKED_CAST", "DEPRECATION")
         val boundaryCallback =
             mock(PagedList.BoundaryCallback::class.java) as PagedList.BoundaryCallback<String>
         val dispatcher = TestDispatcher()
@@ -313,6 +317,7 @@
         verifyNoMoreInteractions(boundaryCallback)
     }
 
+    @Suppress("DEPRECATION")
     private abstract class WrapperDataSource<K : Any, A : Any, B : Any>(
         private val source: PageKeyedDataSource<K, A>
     ) : PageKeyedDataSource<K, B>() {
@@ -377,6 +382,7 @@
         protected abstract fun convert(source: List<A>): List<B>
     }
 
+    @Suppress("DEPRECATION")
     private class StringWrapperDataSource<K : Any, V : Any>(source: PageKeyedDataSource<K, V>) :
         WrapperDataSource<K, V, String>(source) {
         override fun convert(source: List<V>): List<String> {
@@ -384,6 +390,7 @@
         }
     }
 
+    @Suppress("DEPRECATION")
     private fun verifyWrappedDataSource(
         createWrapper: (PageKeyedDataSource<String, Item>) -> PageKeyedDataSource<String, String>
     ) {
diff --git a/paging/common/src/test/kotlin/androidx/paging/PagedListConfigTest.kt b/paging/common/src/test/kotlin/androidx/paging/PagedListConfigTest.kt
index 49e0ce2..6746965 100644
--- a/paging/common/src/test/kotlin/androidx/paging/PagedListConfigTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/PagedListConfigTest.kt
@@ -30,6 +30,7 @@
         assertEquals(30, config.initialLoadSizeHint)
         assertEquals(true, config.enablePlaceholders)
         assertEquals(10, config.prefetchDistance)
+        @Suppress("DEPRECATION")
         assertEquals(PagedList.Config.MAX_SIZE_UNBOUNDED, config.maxSize)
     }
 }
diff --git a/paging/common/src/test/kotlin/androidx/paging/PagedListTest.kt b/paging/common/src/test/kotlin/androidx/paging/PagedListTest.kt
index 7a4d6ea..13dcd2b 100644
--- a/paging/common/src/test/kotlin/androidx/paging/PagedListTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/PagedListTest.kt
@@ -18,8 +18,6 @@
 
 import androidx.paging.ContiguousPagedListTest.Companion.EXCEPTION
 import androidx.paging.LoadType.REFRESH
-import androidx.paging.PagedList.Builder
-import androidx.paging.PagedList.LoadStateManager
 import androidx.testutils.TestExecutor
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.runBlocking
@@ -54,7 +52,7 @@
     @Test
     fun createLegacy() {
         @Suppress("DEPRECATION")
-        val pagedList = Builder(ListDataSource(ITEMS), 100)
+        val pagedList = PagedList.Builder(ListDataSource(ITEMS), 100)
             .setNotifyExecutor(TestExecutor())
             .setFetchExecutor(TestExecutor())
             .build()
@@ -71,6 +69,7 @@
                 }
             }
             assertFailsWith<IllegalStateException> {
+                @Suppress("DEPRECATION")
                 PagedList.create(
                     pagingSource,
                     null,
@@ -98,6 +97,7 @@
             // create doesn't differentiate between throw vs error runnable, which is why
             // PagedList.Builder without the initial page is deprecated
             assertFailsWith<IllegalStateException> {
+                @Suppress("DEPRECATION")
                 PagedList.create(
                     pagingSource,
                     null,
@@ -123,7 +123,9 @@
                 pageSize = 10
             )
         ) as PagingSource.LoadResult.Page
-        val pagedList = Builder(pagingSource, initialPage, config)
+
+        @Suppress("DEPRECATION")
+        val pagedList = PagedList.Builder(pagingSource, initialPage, config)
             .setNotifyDispatcher(DirectDispatcher)
             .setFetchDispatcher(DirectDispatcher)
             .build()
@@ -135,7 +137,9 @@
     @Test
     fun setState_Error() {
         var onStateChangeCalls = 0
-        val loadStateManager = object : LoadStateManager() {
+
+        @Suppress("DEPRECATION")
+        val loadStateManager = object : PagedList.LoadStateManager() {
             override fun onStateChanged(type: LoadType, state: LoadState) {
                 onStateChangeCalls++
             }
diff --git a/paging/common/src/test/kotlin/androidx/paging/PagerStateTest.kt b/paging/common/src/test/kotlin/androidx/paging/PagerStateTest.kt
index 52f724b7..874d3bc 100644
--- a/paging/common/src/test/kotlin/androidx/paging/PagerStateTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/PagerStateTest.kt
@@ -20,6 +20,7 @@
 import androidx.paging.LoadType.REFRESH
 import androidx.paging.LoadType.START
 import androidx.paging.PagingSource.LoadResult.Page
+import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.TestCoroutineScope
 import kotlinx.coroutines.test.runBlockingTest
 import org.junit.Test
@@ -27,6 +28,7 @@
 import org.junit.runners.JUnit4
 import kotlin.test.assertEquals
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @RunWith(JUnit4::class)
 class PagerStateTest {
     private val testScope = TestCoroutineScope()
@@ -53,7 +55,7 @@
 
     @Test
     fun coerceWithHint_coerceOnlyIndexInPage() = testScope.runBlockingTest {
-        val pagerState = PagerState<Int, Int>(2, 6)
+        val pagerState = PagerState<Int, Int>(pageSize = 2, maxSize = 6)
 
         pagerState.insert(0, REFRESH, Page(listOf(4, 5), 3, 6))
         advanceUntilIdle()
@@ -63,6 +65,9 @@
         advanceUntilIdle()
 
         with(pagerState) {
+            // Hint references element marked below:
+            // [2, 3], [4, 5], [6, 7]
+            //          ^
             ViewportHint(-1, 2).withCoercedHint { indexInPage, pageIndex, hintOffset ->
                 assertEquals(0, indexInPage)
                 assertEquals(1, pageIndex)
@@ -73,7 +78,7 @@
 
     @Test
     fun coerceWithHint_coerceStart() = testScope.runBlockingTest {
-        val pagerState = PagerState<Int, Int>(2, 6)
+        val pagerState = PagerState<Int, Int>(pageSize = 2, maxSize = 6)
 
         pagerState.insert(0, REFRESH, Page(listOf(4, 5), 3, 6))
         advanceUntilIdle()
@@ -83,17 +88,20 @@
         advanceUntilIdle()
 
         with(pagerState) {
+            // Hint references element marked below:
+            // [_, _], [2, 3], [4, 5], [6, 7]
+            //  ^
             ViewportHint(-2, 0).withCoercedHint { indexInPage, pageIndex, hintOffset ->
                 assertEquals(0, indexInPage)
                 assertEquals(0, pageIndex)
-                assertEquals(0, hintOffset)
+                assertEquals(-2, hintOffset)
             }
         }
     }
 
     @Test
     fun coerceWithHint_coerceStartMultiplePages() = testScope.runBlockingTest {
-        val pagerState = PagerState<Int, Int>(2, 6)
+        val pagerState = PagerState<Int, Int>(pageSize = 2, maxSize = 6)
 
         pagerState.insert(0, REFRESH, Page(listOf(4, 5), 3, 6))
         advanceUntilIdle()
@@ -103,17 +111,20 @@
         advanceUntilIdle()
 
         with(pagerState) {
+            // Hint references element marked below:
+            // [_, _], [_, _], [2, 3], [4, 5], [6, 7]
+            //  ^
             ViewportHint(-3, 0).withCoercedHint { indexInPage, pageIndex, hintOffset ->
                 assertEquals(0, indexInPage)
                 assertEquals(0, pageIndex)
-                assertEquals(2, hintOffset)
+                assertEquals(-4, hintOffset)
             }
         }
     }
 
     @Test
     fun coerceWithHint_coerceStartWithIndexInPage() = testScope.runBlockingTest {
-        val pagerState = PagerState<Int, Int>(2, 6)
+        val pagerState = PagerState<Int, Int>(pageSize = 2, maxSize = 6)
 
         pagerState.insert(0, REFRESH, Page(listOf(4, 5), 3, 6))
         advanceUntilIdle()
@@ -123,6 +134,27 @@
         advanceUntilIdle()
 
         with(pagerState) {
+            // Hint references element marked below:
+            // [_, _], [2, 3], [4, 5], [6, 7]
+            //     ^
+            ViewportHint(-2, 1).withCoercedHint { indexInPage, pageIndex, hintOffset ->
+                assertEquals(0, indexInPage)
+                assertEquals(0, pageIndex)
+                assertEquals(-1, hintOffset)
+            }
+
+            // Hint references element marked below:
+            // [_, _], [_, _], [2, 3], [4, 5], [6, 7]
+            //     ^
+            ViewportHint(-2, -1).withCoercedHint { indexInPage, pageIndex, hintOffset ->
+                assertEquals(0, indexInPage)
+                assertEquals(0, pageIndex)
+                assertEquals(-3, hintOffset)
+            }
+
+            // Hint references element marked below:
+            // [_, _], [2, 3], [4, 5], [6, 7]
+            //          ^
             ViewportHint(-2, 2).withCoercedHint { indexInPage, pageIndex, hintOffset ->
                 assertEquals(0, indexInPage)
                 assertEquals(0, pageIndex)
@@ -133,7 +165,7 @@
 
     @Test
     fun coerceWithHint_coerceEnd() = testScope.runBlockingTest {
-        val pagerState = PagerState<Int, Int>(2, 6)
+        val pagerState = PagerState<Int, Int>(pageSize = 2, maxSize = 6)
 
         pagerState.insert(0, REFRESH, Page(listOf(4, 5), 3, 6))
         advanceUntilIdle()
@@ -143,6 +175,9 @@
         advanceUntilIdle()
 
         with(pagerState) {
+            // Hint references element marked below:
+            // [2, 3], [4, 5], [6, 7], [_, _]
+            //                          ^
             ViewportHint(2, 0).withCoercedHint { indexInPage, pageIndex, hintOffset ->
                 assertEquals(1, indexInPage)
                 assertEquals(2, pageIndex)
@@ -153,7 +188,7 @@
 
     @Test
     fun coerceWithHint_coerceEndMultiplePages() = testScope.runBlockingTest {
-        val pagerState = PagerState<Int, Int>(2, 6)
+        val pagerState = PagerState<Int, Int>(pageSize = 2, maxSize = 6)
 
         pagerState.insert(0, REFRESH, Page(listOf(4, 5), 3, 6))
         advanceUntilIdle()
@@ -163,11 +198,32 @@
         advanceUntilIdle()
 
         with(pagerState) {
+            // Hint references element marked below:
+            // [2, 3], [4, 5], [6, 7], [_, _]
+            //                             ^
+            ViewportHint(2, 1).withCoercedHint { indexInPage, pageIndex, hintOffset ->
+                assertEquals(1, indexInPage)
+                assertEquals(2, pageIndex)
+                assertEquals(2, hintOffset)
+            }
+
+            // Hint references element marked below:
+            // [2, 3], [4, 5], [6, 7], [_, _], [_, _]
+            //                                  ^
             ViewportHint(3, 0).withCoercedHint { indexInPage, pageIndex, hintOffset ->
                 assertEquals(1, indexInPage)
                 assertEquals(2, pageIndex)
                 assertEquals(3, hintOffset)
             }
+
+            // Hint references element marked below:
+            // [2, 3], [4, 5], [6, 7], [_, _]
+            //                     ^
+            ViewportHint(2, -1).withCoercedHint { indexInPage, pageIndex, hintOffset ->
+                assertEquals(1, indexInPage)
+                assertEquals(2, pageIndex)
+                assertEquals(0, hintOffset)
+            }
         }
     }
 
@@ -183,6 +239,9 @@
         advanceUntilIdle()
 
         with(pagerState) {
+            // Hint references element marked below:
+            // [2, 3], [4, 5], [6, 7], [_, _], [_, _]
+            //                                  ^
             ViewportHint(2, 2).withCoercedHint { indexInPage, pageIndex, hintOffset ->
                 assertEquals(1, indexInPage)
                 assertEquals(2, pageIndex)
diff --git a/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt b/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt
index 210f7f5..5603f16 100644
--- a/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt
@@ -30,7 +30,6 @@
 import androidx.paging.PageEvent.LoadStateUpdate
 import androidx.paging.PagingSource.LoadResult.Page
 import androidx.paging.TestPagingSource.Companion.LOAD_ERROR
-import androidx.paging.TestPagingSource.Companion.items
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.FlowPreview
@@ -46,6 +45,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 import kotlin.test.assertEquals
+import kotlin.test.assertFailsWith
 import kotlin.test.assertNotNull
 import kotlin.test.assertNull
 import kotlin.test.assertTrue
@@ -65,51 +65,6 @@
         maxSize = 3
     )
 
-    private fun pages(
-        pageOffset: Int,
-        range: IntRange
-    ) = listOf(
-        TransformablePage(
-            originalPageOffset = pageOffset,
-            data = items.slice(range),
-            originalPageSize = range.count(),
-            originalIndices = null
-        )
-    )
-
-    private fun createRefresh(
-        range: IntRange,
-        startState: LoadState = Idle,
-        endState: LoadState = Idle
-    ) = Refresh(
-        pages = pages(0, range),
-        placeholdersStart = range.first.coerceAtLeast(0),
-        placeholdersEnd = (items.size - range.last - 1).coerceAtLeast(0),
-        loadStates = mapOf(REFRESH to Idle, START to startState, END to endState)
-    )
-
-    private fun createPrepend(
-        pageOffset: Int,
-        range: IntRange,
-        startState: LoadState = Idle,
-        endState: LoadState = Idle
-    ) = Start(
-        pages = pages(pageOffset, range),
-        placeholdersStart = range.first.coerceAtLeast(0),
-        loadStates = mapOf(REFRESH to Idle, START to startState, END to endState)
-    )
-
-    private fun createAppend(
-        pageOffset: Int,
-        range: IntRange,
-        startState: LoadState = Idle,
-        endState: LoadState = Idle
-    ) = End(
-        pages = pages(pageOffset, range),
-        placeholdersEnd = (items.size - range.last - 1).coerceAtLeast(0),
-        loadStates = mapOf(REFRESH to Idle, START to startState, END to endState)
-    )
-
     @Test
     fun loadStates_prependDone() = testScope.runBlockingTest {
         val pageFetcher = PageFetcher(pagingSourceFactory, 1, config)
@@ -1053,8 +1008,8 @@
             initialKey = 0,
             pagingSource = pagingSourceFactory(),
             config = config,
-            remoteMediatorAccessor = RemoteMediatorAccessor(remoteMediator),
-            retryFlow = retryCh.asFlow()
+            retryFlow = retryCh.asFlow(),
+            remoteMediatorAccessor = RemoteMediatorAccessor(remoteMediator)
         )
 
         collectPagerData(pager) { _, _ ->
@@ -1080,8 +1035,8 @@
             initialKey = 99,
             pagingSource = pagingSourceFactory(),
             config = config,
-            remoteMediatorAccessor = RemoteMediatorAccessor(remoteMediator),
-            retryFlow = retryCh.asFlow()
+            retryFlow = retryCh.asFlow(),
+            remoteMediatorAccessor = RemoteMediatorAccessor(remoteMediator)
         )
 
         collectPagerData(pager) { _, _ ->
@@ -1092,6 +1047,47 @@
             assertNotNull(remoteMediator.loadEvents[0].state)
         }
     }
+
+    @Test
+    fun jump() = testScope.runBlockingTest {
+        pauseDispatcher {
+            val config = PagingConfig(
+                pageSize = 1,
+                prefetchDistance = 1,
+                enablePlaceholders = true,
+                initialLoadSize = 2,
+                maxSize = 3,
+                jumpThreshold = 10
+            )
+            var didJump = false
+            val pager = Pager(50, pagingSourceFactory(), config, retryFlow = retryCh.asFlow()) {
+                didJump = true
+            }
+            // Trigger collection on flow to init jump detection job.
+            val job = launch { pager.pageEventFlow.collect { } }
+
+            advanceUntilIdle()
+
+            pager.addHint(ViewportHint(0, -50))
+            advanceUntilIdle()
+
+            assertTrue { didJump }
+
+            job.cancel()
+        }
+    }
+
+    @Test
+    fun jump_requiresPagingSourceOptIn() {
+        assertFailsWith<IllegalArgumentException> {
+            Pager(
+                initialKey = 50,
+                pagingSource = TestPagingSource(jumpingSupported = false),
+                config = PagingConfig(pageSize = 1, prefetchDistance = 1, jumpThreshold = 1),
+                retryFlow = retryCh.asFlow()
+            )
+        }
+    }
 }
 
 @Suppress("SuspendFunctionOnCoroutineScope")
diff --git a/paging/common/src/test/kotlin/androidx/paging/PagingDataDifferTest.kt b/paging/common/src/test/kotlin/androidx/paging/PagingDataDifferTest.kt
index 9fb01c3..130bac4 100644
--- a/paging/common/src/test/kotlin/androidx/paging/PagingDataDifferTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/PagingDataDifferTest.kt
@@ -18,6 +18,7 @@
 
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.flow
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.suspendCancellableCoroutine
@@ -34,6 +35,7 @@
 import kotlin.test.assertFailsWith
 import kotlin.test.assertFalse
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @RunWith(JUnit4::class)
 class PagingDataDifferTest {
     private val testScope = TestCoroutineScope()
diff --git a/paging/common/src/test/kotlin/androidx/paging/PositionalDataSourceTest.kt b/paging/common/src/test/kotlin/androidx/paging/PositionalDataSourceTest.kt
index 706da3b..bbf5771 100644
--- a/paging/common/src/test/kotlin/androidx/paging/PositionalDataSourceTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/PositionalDataSourceTest.kt
@@ -28,6 +28,7 @@
 import org.mockito.Mockito.verifyNoMoreInteractions
 import java.util.concurrent.Executor
 
+@Suppress("DEPRECATION")
 @RunWith(JUnit4::class)
 class PositionalDataSourceTest {
     private fun computeInitialLoadPos(
diff --git a/paging/common/src/test/kotlin/androidx/paging/SeparatorsTest.kt b/paging/common/src/test/kotlin/androidx/paging/SeparatorsTest.kt
index 9be5339..17a6258 100644
--- a/paging/common/src/test/kotlin/androidx/paging/SeparatorsTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/SeparatorsTest.kt
@@ -25,6 +25,7 @@
 import androidx.paging.PageEvent.Insert.Companion.End
 import androidx.paging.PageEvent.Insert.Companion.Refresh
 import androidx.paging.PageEvent.Insert.Companion.Start
+import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.toList
 import kotlinx.coroutines.test.runBlockingTest
@@ -69,6 +70,7 @@
     )
 }
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @RunWith(JUnit4::class)
 class SeparatorsTest {
     @Test
diff --git a/paging/common/src/test/kotlin/androidx/paging/TestPagingSourceExt.kt b/paging/common/src/test/kotlin/androidx/paging/TestPagingSourceExt.kt
new file mode 100644
index 0000000..e2762a6
--- /dev/null
+++ b/paging/common/src/test/kotlin/androidx/paging/TestPagingSourceExt.kt
@@ -0,0 +1,76 @@
+/*
+ * 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.paging
+
+import androidx.paging.TestPagingSource.Companion.items
+
+internal fun createRefresh(
+    range: IntRange,
+    startState: LoadState = LoadState.Idle,
+    endState: LoadState = LoadState.Idle
+) = PageEvent.Insert.Refresh(
+    pages = pages(0, range),
+    placeholdersStart = range.first.coerceAtLeast(0),
+    placeholdersEnd = (items.size - range.last - 1).coerceAtLeast(0),
+    loadStates = mapOf(
+        LoadType.REFRESH to LoadState.Idle,
+        LoadType.START to startState,
+        LoadType.END to endState
+    )
+)
+
+internal fun createPrepend(
+    pageOffset: Int,
+    range: IntRange,
+    startState: LoadState = LoadState.Idle,
+    endState: LoadState = LoadState.Idle
+) = PageEvent.Insert.Start(
+    pages = pages(pageOffset, range),
+    placeholdersStart = range.first.coerceAtLeast(0),
+    loadStates = mapOf(
+        LoadType.REFRESH to LoadState.Idle,
+        LoadType.START to startState,
+        LoadType.END to endState
+    )
+)
+
+internal fun createAppend(
+    pageOffset: Int,
+    range: IntRange,
+    startState: LoadState = LoadState.Idle,
+    endState: LoadState = LoadState.Idle
+) = PageEvent.Insert.End(
+    pages = pages(pageOffset, range),
+    placeholdersEnd = (items.size - range.last - 1).coerceAtLeast(0),
+    loadStates = mapOf(
+        LoadType.REFRESH to LoadState.Idle,
+        LoadType.START to startState,
+        LoadType.END to endState
+    )
+)
+
+private fun pages(
+    pageOffset: Int,
+    range: IntRange
+) = listOf(
+    TransformablePage(
+        originalPageOffset = pageOffset,
+        data = items.slice(range),
+        originalPageSize = range.count(),
+        originalIndices = null
+    )
+)
diff --git a/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/v3room/V3RemoteMediator.kt b/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/v3room/V3RemoteMediator.kt
index 8c0c109..e51d566 100644
--- a/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/v3room/V3RemoteMediator.kt
+++ b/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/v3room/V3RemoteMediator.kt
@@ -32,7 +32,7 @@
 ) : RemoteMediator<Int, Customer>() {
     override suspend fun load(
         loadType: LoadType,
-        state: PagingState<Int, Customer>?
+        state: PagingState<Int, Customer>
     ): MediatorResult {
         if (loadType == LoadType.START) return MediatorResult.Success(false)
 
@@ -41,7 +41,7 @@
         val key = when (loadType) {
             LoadType.REFRESH -> 0
             LoadType.START -> throw IllegalStateException()
-            LoadType.END -> state?.pages?.last()?.nextKey ?: 0
+            LoadType.END -> state.pages.lastOrNull()?.nextKey ?: 0
         }
         val result = networkSource.load(
             PagingSource.LoadParams(
@@ -65,7 +65,7 @@
                     }
                 }
 
-                MediatorResult.Success(hasMoreData = result.nextKey != null)
+                MediatorResult.Success(hasMoreData = true)
             }
             is PagingSource.LoadResult.Error -> {
                 MediatorResult.Error(result.throwable)
diff --git a/paging/rxjava2/src/test/java/androidx/paging/RxPagedListBuilderTest.kt b/paging/rxjava2/src/test/java/androidx/paging/RxPagedListBuilderTest.kt
index a6e2783..98e99b6 100644
--- a/paging/rxjava2/src/test/java/androidx/paging/RxPagedListBuilderTest.kt
+++ b/paging/rxjava2/src/test/java/androidx/paging/RxPagedListBuilderTest.kt
@@ -105,6 +105,7 @@
             .setFetchScheduler(scheduler)
             .setNotifyScheduler(scheduler)
             .buildObservable()
+        @Suppress("DEPRECATION")
         val observer = TestObserver<PagedList<String>>()
 
         observable.subscribe(observer)
@@ -138,6 +139,7 @@
             .setFetchScheduler(fetchScheduler)
             .setNotifyScheduler(notifyScheduler)
             .buildObservable()
+        @Suppress("DEPRECATION")
         val observer = TestObserver<PagedList<String>>()
         observable.subscribe(observer)
 
@@ -169,6 +171,7 @@
             .setNotifyScheduler(notifyScheduler)
             .buildObservable()
 
+        @Suppress("DEPRECATION")
         val observer = TestObserver<PagedList<String>>()
         observable.subscribe(observer)
 
diff --git a/paging/samples/src/main/java/androidx/paging/samples/InsertSeparatorsUiModelSample.kt b/paging/samples/src/main/java/androidx/paging/samples/InsertSeparatorsUiModelSample.kt
index fb66957..fb867df 100644
--- a/paging/samples/src/main/java/androidx/paging/samples/InsertSeparatorsUiModelSample.kt
+++ b/paging/samples/src/main/java/androidx/paging/samples/InsertSeparatorsUiModelSample.kt
@@ -26,6 +26,8 @@
 
 class Item(
     @JvmField
+    val id: String,
+    @JvmField
     val label: String
 )
 
diff --git a/paging/samples/src/main/java/androidx/paging/samples/PagingSourceSample.kt b/paging/samples/src/main/java/androidx/paging/samples/PagingSourceSample.kt
index 23f9a9c..a0ad456 100644
--- a/paging/samples/src/main/java/androidx/paging/samples/PagingSourceSample.kt
+++ b/paging/samples/src/main/java/androidx/paging/samples/PagingSourceSample.kt
@@ -23,14 +23,20 @@
 import retrofit2.HttpException
 import java.io.IOException
 
-private class MyBackendService {
+internal class MyBackendService {
     data class RemoteResult(
         val items: List<Item>,
-        val prev: String,
-        val next: String
+        val prev: String?,
+        val next: String?
     )
+
     @Suppress("RedundantSuspendModifier", "UNUSED_PARAMETER")
-    suspend fun searchUsers(searchTerm: String, pageKey: String?): RemoteResult {
+    suspend fun searchItems(pageKey: String?): RemoteResult {
+        throw NotImplementedError()
+    }
+
+    @Suppress("RedundantSuspendModifier", "UNUSED_PARAMETER")
+    suspend fun itemsAfter(itemKey: String?): RemoteResult {
         throw NotImplementedError()
     }
 }
@@ -42,16 +48,17 @@
      * service, which uses String tokens to load pages (each response has a next/previous token).
      */
     class MyPagingSource(
-        val myBackend: MyBackendService,
-        val searchTerm: String
+        val myBackend: MyBackendService
     ) : PagingSource<String, Item>() {
         override suspend fun load(params: LoadParams<String>): LoadResult<String, Item> {
             // Retrofit calls that return the body type throw either IOException for network
             // failures, or HttpException for any non-2xx HTTP status codes. This code reports all
             // errors to the UI, but you can inspect/wrap the exceptions to provide more context.
             return try {
-                // suspending network load, executes automatically on worker thread
-                val response = myBackend.searchUsers(searchTerm, params.key)
+                // Suspending network load via Retrofit. This doesn't need to be wrapped in a
+                // withContext(Dispatcher.IO) { ... } block since Retrofit's Coroutine
+                // CallAdapter dispatches on a worker thread.
+                val response = myBackend.searchItems(params.key)
                 LoadResult.Page(
                     data = response.items,
                     prevKey = response.prev,
diff --git a/paging/samples/src/main/java/androidx/paging/samples/RemoteMediatorSample.kt b/paging/samples/src/main/java/androidx/paging/samples/RemoteMediatorSample.kt
new file mode 100644
index 0000000..21f9c7e
--- /dev/null
+++ b/paging/samples/src/main/java/androidx/paging/samples/RemoteMediatorSample.kt
@@ -0,0 +1,93 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("unused")
+
+package androidx.paging.samples
+
+import androidx.annotation.Sampled
+import androidx.paging.LoadType
+import androidx.paging.PagingState
+import androidx.paging.RemoteMediator
+import retrofit2.HttpException
+import java.io.IOException
+
+private interface ItemDao {
+    fun withTransaction(block: () -> Any)
+    fun insertAll(items: List<Item>)
+    fun removeAll()
+}
+
+private interface ItemKeyDao {
+    fun withTransaction(block: () -> Any)
+    fun queryKey(item: Item): String
+    fun insertKey(item: Item, key: String): String
+    fun removeAll()
+}
+
+@Sampled
+fun remoteMediatorSample() {
+    /**
+     * Sample RemoteMediator for a DB + Network based PagingData stream, which triggers network
+     * requests to fetch additional items when a user scrolls to the end of the list of items stored
+     * in DB.
+     *
+     * This sample loads `Item`s via Retrofit from a network service using String tokens to load
+     * pages (each response has a next/previous token), and inserts them into database.
+     */
+    class MyRemoteMediator(
+        private val database: ItemDao,
+        private val networkService: MyBackendService
+    ) : RemoteMediator<String, Item>() {
+        override suspend fun load(
+            loadType: LoadType,
+            state: PagingState<String, Item>
+        ): MediatorResult {
+            // Get the last accessed item from the current PagingState, which holds all loaded
+            // pages from DB.
+            val anchorItem = when (loadType) {
+                LoadType.REFRESH -> state.anchorPosition?.let { state.closestItemToPosition(it) }
+                LoadType.START -> return MediatorResult.Success(hasMoreData = false)
+                LoadType.END -> state.pages.lastOrNull { it.data.isNotEmpty() }?.data?.last()
+            }
+
+            return try {
+                // Suspending network load via Retrofit. This doesn't need to be wrapped in a
+                // withContext(Dispatcher.IO) { ... } block since Retrofit's Coroutine
+                // CallAdapter dispatches on a worker thread.
+                val response = networkService.itemsAfter(anchorItem?.id)
+
+                // Insert items into database, which invalidates the current PagingData,
+                // allowing Paging to present the updates in the DB.
+                database.withTransaction {
+                    if (loadType == LoadType.REFRESH) {
+                        database.removeAll()
+                    }
+
+                    database.insertAll(response.items)
+                }
+
+                // Return a successful result, signaling that more items were fetched from
+                // network and that Paging should expect to be invalidated.
+                MediatorResult.Success(hasMoreData = response.items.isNotEmpty())
+            } catch (e: IOException) {
+                MediatorResult.Error(e)
+            } catch (e: HttpException) {
+                MediatorResult.Error(e)
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/paging/testutils/src/main/java/androidx/paging/RemoteMediatorMock.kt b/paging/testutils/src/main/java/androidx/paging/RemoteMediatorMock.kt
index 9a6c71b..ba6aeae 100644
--- a/paging/testutils/src/main/java/androidx/paging/RemoteMediatorMock.kt
+++ b/paging/testutils/src/main/java/androidx/paging/RemoteMediatorMock.kt
@@ -26,7 +26,7 @@
 
     override suspend fun load(
         loadType: LoadType,
-        state: PagingState<Int, Int>?
+        state: PagingState<Int, Int>
     ): MediatorResult {
         loadEvents.add(LoadEvent(loadType, state))
         return MediatorResult.Success(false)
diff --git a/paging/testutils/src/main/java/androidx/paging/TestPagingSource.kt b/paging/testutils/src/main/java/androidx/paging/TestPagingSource.kt
index 59c3c70..1e1e265 100644
--- a/paging/testutils/src/main/java/androidx/paging/TestPagingSource.kt
+++ b/paging/testutils/src/main/java/androidx/paging/TestPagingSource.kt
@@ -25,7 +25,10 @@
  * Note: This class has a delay of 1000ms is built into its load method and is meant to be used
  * with APIs from [kotlinx.coroutines.test.DelayController].
  */
-class TestPagingSource(counted: Boolean = true) : PagingSource<Int, Int>() {
+class TestPagingSource(
+    counted: Boolean = true,
+    override val jumpingSupported: Boolean = true
+) : PagingSource<Int, Int>() {
     var errorNextLoad = false
 
     init {
diff --git a/preference/preference-ktx/build.gradle b/preference/preference-ktx/build.gradle
index 6e9ee54..07448a7 100644
--- a/preference/preference-ktx/build.gradle
+++ b/preference/preference-ktx/build.gradle
@@ -41,6 +41,12 @@
 
 dependencies {
     api(project(":preference:preference"))
+    api("androidx.core:core-ktx:1.1.0") {
+        because 'Mirror preference dependency graph for -ktx artifacts'
+    }
+    api("androidx.fragment:fragment-ktx:1.2.4") {
+        because 'Mirror preference dependency graph for -ktx artifacts'
+    }
     api(KOTLIN_STDLIB)
 
     androidTestImplementation(JUNIT)
diff --git a/preference/preference/build.gradle b/preference/preference/build.gradle
index 4a72194..54b1c36 100644
--- a/preference/preference/build.gradle
+++ b/preference/preference/build.gradle
@@ -30,7 +30,7 @@
     api("androidx.appcompat:appcompat:1.1.0")
     api("androidx.core:core:1.1.0")
     implementation("androidx.collection:collection:1.0.0")
-    api("androidx.fragment:fragment:1.2.3")
+    api("androidx.fragment:fragment:1.2.4")
     api("androidx.recyclerview:recyclerview:1.0.0")
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/TileList.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/TileList.java
index c445aff..baf0a7a 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/TileList.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/TileList.java
@@ -56,7 +56,14 @@
         mTiles.clear();
     }
 
+    /**
+     * Returns the {@link Tile} at the provided {@param index}, or {@code null} if the index
+     * provided is out of bounds.
+     */
     public Tile<T> getAtIndex(int index) {
+        if (index < 0 || index >= mTiles.size()) {
+            return null;
+        }
         return mTiles.valueAt(index);
     }
 
diff --git a/room/benchmark/build.gradle b/room/benchmark/build.gradle
index 19dede5..64a32092 100644
--- a/room/benchmark/build.gradle
+++ b/room/benchmark/build.gradle
@@ -26,7 +26,8 @@
 dependencies {
     androidTestImplementation(project(":room:room-common"))
     androidTestImplementation(project(":room:room-runtime"))
-    kaptAndroidTest project(":room:room-compiler")
+    // depend on the shadowed version so that it tests with the shipped artifact
+    kaptAndroidTest project(path: ":room:room-compiler", configuration: 'shadowAndImplementation')
     androidTestImplementation(project(":room:room-rxjava2"))
     androidTestImplementation(project(":sqlite:sqlite"))
     androidTestImplementation(project(":sqlite:sqlite-framework"))
diff --git a/room/compiler/build.gradle b/room/compiler/build.gradle
index 646b5ed..0bc38b7 100644
--- a/room/compiler/build.gradle
+++ b/room/compiler/build.gradle
@@ -14,17 +14,21 @@
  * limitations under the License.
  */
 
+
 import static androidx.build.dependencies.DependenciesKt.*
+import androidx.build.BuildOnServerKt
 import androidx.build.CompilationTarget
 import androidx.build.LibraryGroups
 import androidx.build.SupportConfig
 import androidx.build.AndroidXExtension
 import androidx.build.SdkHelperKt
 import androidx.build.Publish
+import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation
 
 plugins {
     id("AndroidXPlugin")
     id("kotlin")
+    id("com.github.johnrengelman.shadow")
 }
 
 def antlrOut = "$buildDir/generated/antlr/grammar-gen/"
@@ -40,6 +44,62 @@
     }
 }
 
+configurations {
+    /**
+     * shadowed is used for dependencies which we jarjar into the library jar instead of adding it
+     * as a pom dependency
+     */
+    shadowed
+    // make sure shadowed dependencies show up as compileOnly so that normal compilation works
+    compileOnly.extendsFrom(shadowed)
+    // compiler tests run w/o shadowed classes so we should add those dependencies into test
+    // configuration
+    testCompile.extendsFrom(shadowed)
+    // for downstream tests, provide a configuration that includes the shadow output + other
+    // dependencies that are not shadowed
+    shadowAndImplementation.extendsFrom(shadow)
+    shadowAndImplementation.extendsFrom(implementation)
+}
+
+shadowJar {
+    // set classifier to empty string so that it doesn't append anything to the jar.
+    archiveClassifier = ''
+    configurations = [project.configurations.shadowed]
+    dependencies {
+        // antlr has dependencies on unrelated projects for its gui stuff, do not include them
+        exclude(dependency('org.abego.treelayout:.*'))
+        exclude(dependency('org.glassfish:.*'))
+        exclude(dependency('com.ibm.icu:.*'))
+    }
+}
+
+jar {
+    // set a classifier on this one so that the output does not clash with the output from
+    // shadowJar task. We should never use this directly as it won't have the shadowed classes that
+    // are necessary to run.
+    archiveClassifier = 'before-jarjar'
+}
+
+// relocate all shadow dependencies
+task relocateShadowJar(type: ConfigureShadowRelocation) {
+    target = tasks.shadowJar
+    prefix = "androidx.room.jarjarred"
+}
+
+tasks.shadowJar.dependsOn tasks.relocateShadowJar
+
+configurations {
+    // replace the standard jar with the one built by 'shadowJar' in both api and runtime variants
+    apiElements.outgoing.artifacts.clear()
+    apiElements.outgoing.artifact(shadowJar) {
+        builtBy shadowJar
+    }
+    runtimeElements.outgoing.artifacts.clear()
+    runtimeElements.outgoing.artifact(shadowJar) {
+        builtBy shadowJar
+    }
+}
+
 dependencies {
     implementation(project(":room:room-common"))
     implementation(project(":room:room-migration"))
@@ -47,7 +107,7 @@
     implementation(AUTO_COMMON)
     implementation(AUTO_VALUE_ANNOTATIONS)
     implementation(JAVAPOET)
-    implementation(ANTLR)
+    shadowed(ANTLR)
     implementation(XERIAL)
     implementation(KOTLIN_METADATA_JVM)
     implementation(APACHE_COMMONS_CODEC)
@@ -75,6 +135,101 @@
             "-package", "androidx.room.parser"
 }
 
+/**
+ * Room compiler jarjars some dependencies. This task validates the published artifacts of room
+ * compiler to ensure dependencies are properly jarjarred.
+ */
+class CheckArtifactTask extends DefaultTask {
+    @InputFiles
+    FileCollection artifactInputs = project.objects.fileCollection()
+    @InputFile
+    File pomFile
+    @OutputFile
+    File result = new File(project.buildDir, "checkArtifactOutput.txt")
+    /**
+     * Checks the publish task's artifacts to make sure the classes.jar does include jarjarred
+     * antlr classes.
+     */
+    def validatePublishTaskOutputs() {
+        if (artifactInputs.files.isEmpty()) {
+            throw new GradleException("Couldn't find the classes.jar for the room-compiler " +
+                    "artifact. Ensure that publish is setup properly.")
+        }
+        artifactInputs.forEach {
+            validateJarContents(it)
+        }
+    }
+
+    /**
+     * Traverses the given jar file, looks for the classes that should be jarjarred and validates
+     * their location.
+     */
+    def validateJarContents(File jarFile) {
+        FileTree jarFiles = project.zipTree(jarFile)
+        def found = false
+        jarFiles.files.each {
+            if (it.path.contains("/org/antlr")) {
+                found = true
+                if (!it.path.contains("androidx/room/jarjarred/org/antlr")) {
+                    throw new GradleException("Any Antlr class included in the Room Compiler's" +
+                            " jar file should be moved into androidx/room/jarjarred.\n" +
+                            "Looks like $it has not been moved")
+                }
+            }
+        }
+        if (!found) {
+            throw new GradleException("Couldn't find any Antlr classes in room-compiler artifact" +
+                    ".\n Antlr is jarjarred into room-compiler so there should be some files")
+        }
+    }
+
+    /**
+     * Checks the generated pom file to ensure it does not depend on any jarjarred dependencies
+     * but still depends on others.
+     */
+    def validatePomTaskOutputs() {
+        if (!pomFile.canRead()) {
+            throw new GradleException("Cannot find the pom file for room-compiler")
+        }
+        def pomContents = pomFile.newReader().text
+        if (pomContents.contains("antlr")) {
+            throw new GradleException("Room-compiler pom file should not depend on antlr.\n" +
+                    "Pom Contents:\n $pomContents")
+        }
+        if(!pomContents.contains("<artifactId>kotlin-stdlib</artifactId>")) {
+            throw new GradleException("room-compiler should depend on kotlin stdlib.\n" +
+                    "Pom Contents:\n $pomContents")
+        }
+    }
+
+    @TaskAction
+    def validate() {
+        result.write("fail\n")
+        validatePublishTaskOutputs()
+        validatePomTaskOutputs()
+        // have a dummy output to make gradle happy w/ input/output checking.
+        result.write("ok\n")
+    }
+}
+
+def checkArtifactContentsTask = tasks.register("checkArtifactTask", CheckArtifactTask) {
+    it.artifactInputs.from {
+        ((PublishToMavenRepository) project.tasks
+                .named("publishMavenPublicationToMavenRepository").get()).getPublication()
+                .artifacts.matching {
+            it.classifier == null
+        }.collect {
+            it.file
+        }
+    }
+    def pomTask = (GenerateMavenPom) project.tasks
+            .named("generatePomFileForMavenPublication").get()
+    it.pomFile = pomTask.destination
+}
+
+// make sure we validate published artifacts on the build server.
+BuildOnServerKt.addToBuildOnServer(project, checkArtifactContentsTask)
+
 tasks.findByName("compileKotlin").dependsOn(generateAntlrTask)
 tasks.findByName("compileKotlin").dependsOn(":room:room-runtime:jarDebug")
 tasks.findByName("compileKotlin").dependsOn(":sqlite:sqlite:jarDebug")
diff --git a/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt b/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
index cea78ba..355281c 100644
--- a/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
@@ -18,7 +18,6 @@
 
 import COMMON
 import androidx.paging.DataSource
-import androidx.paging.PositionalDataSource
 import androidx.room.Entity
 import androidx.room.ext.GuavaUtilConcurrentTypeNames
 import androidx.room.ext.L
@@ -406,8 +405,9 @@
     fun findPositionalDataSource() {
         simpleRun {
             invocation ->
+            @Suppress("DEPRECATION")
             val dataSource = invocation.processingEnv.elementUtils
-                    .getTypeElement(PositionalDataSource::class.java.canonicalName)
+                    .getTypeElement(androidx.paging.PositionalDataSource::class.java.canonicalName)
             assertThat(dataSource, notNullValue())
             assertThat(DataSourceQueryResultBinderProvider(invocation.context).matches(
                     MoreTypes.asDeclared(dataSource.asType())), `is`(true))
diff --git a/room/integration-tests/autovaluetestapp/build.gradle b/room/integration-tests/autovaluetestapp/build.gradle
index a0d8e35..44836ef 100644
--- a/room/integration-tests/autovaluetestapp/build.gradle
+++ b/room/integration-tests/autovaluetestapp/build.gradle
@@ -35,7 +35,9 @@
     implementation(project(":room:room-runtime"))
     implementation(project(":arch:core-runtime"))
 
-    androidTestAnnotationProcessor project(":room:room-compiler")
+    // depend on the shadowed version so that it tests with the shipped artifact
+    androidTestAnnotationProcessor project(path: ":room:room-compiler",
+            configuration: 'shadowAndImplementation')
     androidTestAnnotationProcessor(AUTO_VALUE)
     androidTestAnnotationProcessor(AUTO_VALUE_PARCEL)
 
diff --git a/room/integration-tests/kotlintestapp/build.gradle b/room/integration-tests/kotlintestapp/build.gradle
index 7a9a80f..1f78013 100644
--- a/room/integration-tests/kotlintestapp/build.gradle
+++ b/room/integration-tests/kotlintestapp/build.gradle
@@ -55,7 +55,8 @@
     implementation(project(":lifecycle:lifecycle-livedata"))
     implementation(KOTLIN_STDLIB)
     implementation(KOTLIN_COROUTINES_ANDROID)
-    kaptAndroidTest project(":room:room-compiler")
+    // depend on the shadowed version so that it tests with the shipped artifact
+    kaptAndroidTest project(path: ":room:room-compiler", configuration: 'shadowAndImplementation')
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/room/integration-tests/noappcompattestapp/build.gradle b/room/integration-tests/noappcompattestapp/build.gradle
index 7f71429..7ae47cf 100644
--- a/room/integration-tests/noappcompattestapp/build.gradle
+++ b/room/integration-tests/noappcompattestapp/build.gradle
@@ -23,8 +23,11 @@
 
 dependencies {
     implementation(project(":room:room-runtime"))
-    annotationProcessor project(":room:room-compiler")
-    androidTestAnnotationProcessor project(":room:room-compiler")
+    // depend on the shadowed version so that it tests with the shipped artifact
+    annotationProcessor project(path: ":room:room-compiler",
+            configuration: 'shadowAndImplementation')
+    androidTestAnnotationProcessor project(path: ":room:room-compiler",
+            configuration: 'shadowAndImplementation')
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
diff --git a/room/integration-tests/testapp/build.gradle b/room/integration-tests/testapp/build.gradle
index 652a8f8..4059861 100644
--- a/room/integration-tests/testapp/build.gradle
+++ b/room/integration-tests/testapp/build.gradle
@@ -60,8 +60,12 @@
     implementation(FINDBUGS)
     implementation("androidx.recyclerview:recyclerview:1.0.0")
     implementation("androidx.appcompat:appcompat:1.0.0")
-    annotationProcessor project(":room:room-compiler")
-    androidTestAnnotationProcessor project(":room:room-compiler")
+    // use the shadowed dependency in tests so that if the shadowing does not work properly,
+    // our tests fail.
+    annotationProcessor project(path: ":room:room-compiler",
+            configuration: 'shadowAndImplementation')
+    androidTestAnnotationProcessor project(path: ":room:room-compiler",
+            configuration: 'shadowAndImplementation')
 
     androidTestImplementation(project(":room:room-testing"))
     androidTestImplementation(project(":room:room-rxjava2"))
diff --git a/security/crypto/api/1.0.0-rc01.txt b/security/crypto/api/1.0.0-rc01.txt
new file mode 100644
index 0000000..3fb36a8
--- /dev/null
+++ b/security/crypto/api/1.0.0-rc01.txt
@@ -0,0 +1,49 @@
+// Signature format: 3.0
+package androidx.security.crypto {
+
+  public final class EncryptedFile {
+    method public java.io.FileInputStream openFileInput() throws java.security.GeneralSecurityException, java.io.IOException;
+    method public java.io.FileOutputStream openFileOutput() throws java.security.GeneralSecurityException, java.io.IOException;
+  }
+
+  public static final class EncryptedFile.Builder {
+    ctor public EncryptedFile.Builder(java.io.File, android.content.Context, String, androidx.security.crypto.EncryptedFile.FileEncryptionScheme);
+    method public androidx.security.crypto.EncryptedFile build() throws java.security.GeneralSecurityException, java.io.IOException;
+    method public androidx.security.crypto.EncryptedFile.Builder setKeysetAlias(String);
+    method public androidx.security.crypto.EncryptedFile.Builder setKeysetPrefName(String);
+  }
+
+  public enum EncryptedFile.FileEncryptionScheme {
+    enum_constant public static final androidx.security.crypto.EncryptedFile.FileEncryptionScheme AES256_GCM_HKDF_4KB;
+  }
+
+  public final class EncryptedSharedPreferences implements android.content.SharedPreferences {
+    method public boolean contains(String?);
+    method public static android.content.SharedPreferences create(String, String, android.content.Context, androidx.security.crypto.EncryptedSharedPreferences.PrefKeyEncryptionScheme, androidx.security.crypto.EncryptedSharedPreferences.PrefValueEncryptionScheme) throws java.security.GeneralSecurityException, java.io.IOException;
+    method public android.content.SharedPreferences.Editor edit();
+    method public java.util.Map<java.lang.String!,?> getAll();
+    method public boolean getBoolean(String?, boolean);
+    method public float getFloat(String?, float);
+    method public int getInt(String?, int);
+    method public long getLong(String?, long);
+    method public String? getString(String?, String?);
+    method public java.util.Set<java.lang.String!>? getStringSet(String?, java.util.Set<java.lang.String!>?);
+    method public void registerOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener);
+    method public void unregisterOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener);
+  }
+
+  public enum EncryptedSharedPreferences.PrefKeyEncryptionScheme {
+    enum_constant public static final androidx.security.crypto.EncryptedSharedPreferences.PrefKeyEncryptionScheme AES256_SIV;
+  }
+
+  public enum EncryptedSharedPreferences.PrefValueEncryptionScheme {
+    enum_constant public static final androidx.security.crypto.EncryptedSharedPreferences.PrefValueEncryptionScheme AES256_GCM;
+  }
+
+  public final class MasterKeys {
+    method public static String getOrCreate(android.security.keystore.KeyGenParameterSpec) throws java.security.GeneralSecurityException, java.io.IOException;
+    field public static final android.security.keystore.KeyGenParameterSpec AES256_GCM_SPEC;
+  }
+
+}
+
diff --git a/security/crypto/api/1.1.0-alpha01.txt b/security/crypto/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..3fb36a8
--- /dev/null
+++ b/security/crypto/api/1.1.0-alpha01.txt
@@ -0,0 +1,49 @@
+// Signature format: 3.0
+package androidx.security.crypto {
+
+  public final class EncryptedFile {
+    method public java.io.FileInputStream openFileInput() throws java.security.GeneralSecurityException, java.io.IOException;
+    method public java.io.FileOutputStream openFileOutput() throws java.security.GeneralSecurityException, java.io.IOException;
+  }
+
+  public static final class EncryptedFile.Builder {
+    ctor public EncryptedFile.Builder(java.io.File, android.content.Context, String, androidx.security.crypto.EncryptedFile.FileEncryptionScheme);
+    method public androidx.security.crypto.EncryptedFile build() throws java.security.GeneralSecurityException, java.io.IOException;
+    method public androidx.security.crypto.EncryptedFile.Builder setKeysetAlias(String);
+    method public androidx.security.crypto.EncryptedFile.Builder setKeysetPrefName(String);
+  }
+
+  public enum EncryptedFile.FileEncryptionScheme {
+    enum_constant public static final androidx.security.crypto.EncryptedFile.FileEncryptionScheme AES256_GCM_HKDF_4KB;
+  }
+
+  public final class EncryptedSharedPreferences implements android.content.SharedPreferences {
+    method public boolean contains(String?);
+    method public static android.content.SharedPreferences create(String, String, android.content.Context, androidx.security.crypto.EncryptedSharedPreferences.PrefKeyEncryptionScheme, androidx.security.crypto.EncryptedSharedPreferences.PrefValueEncryptionScheme) throws java.security.GeneralSecurityException, java.io.IOException;
+    method public android.content.SharedPreferences.Editor edit();
+    method public java.util.Map<java.lang.String!,?> getAll();
+    method public boolean getBoolean(String?, boolean);
+    method public float getFloat(String?, float);
+    method public int getInt(String?, int);
+    method public long getLong(String?, long);
+    method public String? getString(String?, String?);
+    method public java.util.Set<java.lang.String!>? getStringSet(String?, java.util.Set<java.lang.String!>?);
+    method public void registerOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener);
+    method public void unregisterOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener);
+  }
+
+  public enum EncryptedSharedPreferences.PrefKeyEncryptionScheme {
+    enum_constant public static final androidx.security.crypto.EncryptedSharedPreferences.PrefKeyEncryptionScheme AES256_SIV;
+  }
+
+  public enum EncryptedSharedPreferences.PrefValueEncryptionScheme {
+    enum_constant public static final androidx.security.crypto.EncryptedSharedPreferences.PrefValueEncryptionScheme AES256_GCM;
+  }
+
+  public final class MasterKeys {
+    method public static String getOrCreate(android.security.keystore.KeyGenParameterSpec) throws java.security.GeneralSecurityException, java.io.IOException;
+    field public static final android.security.keystore.KeyGenParameterSpec AES256_GCM_SPEC;
+  }
+
+}
+
diff --git a/security/crypto/api/public_plus_experimental_1.0.0-rc01.txt b/security/crypto/api/public_plus_experimental_1.0.0-rc01.txt
new file mode 100644
index 0000000..3fb36a8
--- /dev/null
+++ b/security/crypto/api/public_plus_experimental_1.0.0-rc01.txt
@@ -0,0 +1,49 @@
+// Signature format: 3.0
+package androidx.security.crypto {
+
+  public final class EncryptedFile {
+    method public java.io.FileInputStream openFileInput() throws java.security.GeneralSecurityException, java.io.IOException;
+    method public java.io.FileOutputStream openFileOutput() throws java.security.GeneralSecurityException, java.io.IOException;
+  }
+
+  public static final class EncryptedFile.Builder {
+    ctor public EncryptedFile.Builder(java.io.File, android.content.Context, String, androidx.security.crypto.EncryptedFile.FileEncryptionScheme);
+    method public androidx.security.crypto.EncryptedFile build() throws java.security.GeneralSecurityException, java.io.IOException;
+    method public androidx.security.crypto.EncryptedFile.Builder setKeysetAlias(String);
+    method public androidx.security.crypto.EncryptedFile.Builder setKeysetPrefName(String);
+  }
+
+  public enum EncryptedFile.FileEncryptionScheme {
+    enum_constant public static final androidx.security.crypto.EncryptedFile.FileEncryptionScheme AES256_GCM_HKDF_4KB;
+  }
+
+  public final class EncryptedSharedPreferences implements android.content.SharedPreferences {
+    method public boolean contains(String?);
+    method public static android.content.SharedPreferences create(String, String, android.content.Context, androidx.security.crypto.EncryptedSharedPreferences.PrefKeyEncryptionScheme, androidx.security.crypto.EncryptedSharedPreferences.PrefValueEncryptionScheme) throws java.security.GeneralSecurityException, java.io.IOException;
+    method public android.content.SharedPreferences.Editor edit();
+    method public java.util.Map<java.lang.String!,?> getAll();
+    method public boolean getBoolean(String?, boolean);
+    method public float getFloat(String?, float);
+    method public int getInt(String?, int);
+    method public long getLong(String?, long);
+    method public String? getString(String?, String?);
+    method public java.util.Set<java.lang.String!>? getStringSet(String?, java.util.Set<java.lang.String!>?);
+    method public void registerOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener);
+    method public void unregisterOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener);
+  }
+
+  public enum EncryptedSharedPreferences.PrefKeyEncryptionScheme {
+    enum_constant public static final androidx.security.crypto.EncryptedSharedPreferences.PrefKeyEncryptionScheme AES256_SIV;
+  }
+
+  public enum EncryptedSharedPreferences.PrefValueEncryptionScheme {
+    enum_constant public static final androidx.security.crypto.EncryptedSharedPreferences.PrefValueEncryptionScheme AES256_GCM;
+  }
+
+  public final class MasterKeys {
+    method public static String getOrCreate(android.security.keystore.KeyGenParameterSpec) throws java.security.GeneralSecurityException, java.io.IOException;
+    field public static final android.security.keystore.KeyGenParameterSpec AES256_GCM_SPEC;
+  }
+
+}
+
diff --git a/security/crypto/api/public_plus_experimental_1.1.0-alpha01.txt b/security/crypto/api/public_plus_experimental_1.1.0-alpha01.txt
new file mode 100644
index 0000000..3fb36a8
--- /dev/null
+++ b/security/crypto/api/public_plus_experimental_1.1.0-alpha01.txt
@@ -0,0 +1,49 @@
+// Signature format: 3.0
+package androidx.security.crypto {
+
+  public final class EncryptedFile {
+    method public java.io.FileInputStream openFileInput() throws java.security.GeneralSecurityException, java.io.IOException;
+    method public java.io.FileOutputStream openFileOutput() throws java.security.GeneralSecurityException, java.io.IOException;
+  }
+
+  public static final class EncryptedFile.Builder {
+    ctor public EncryptedFile.Builder(java.io.File, android.content.Context, String, androidx.security.crypto.EncryptedFile.FileEncryptionScheme);
+    method public androidx.security.crypto.EncryptedFile build() throws java.security.GeneralSecurityException, java.io.IOException;
+    method public androidx.security.crypto.EncryptedFile.Builder setKeysetAlias(String);
+    method public androidx.security.crypto.EncryptedFile.Builder setKeysetPrefName(String);
+  }
+
+  public enum EncryptedFile.FileEncryptionScheme {
+    enum_constant public static final androidx.security.crypto.EncryptedFile.FileEncryptionScheme AES256_GCM_HKDF_4KB;
+  }
+
+  public final class EncryptedSharedPreferences implements android.content.SharedPreferences {
+    method public boolean contains(String?);
+    method public static android.content.SharedPreferences create(String, String, android.content.Context, androidx.security.crypto.EncryptedSharedPreferences.PrefKeyEncryptionScheme, androidx.security.crypto.EncryptedSharedPreferences.PrefValueEncryptionScheme) throws java.security.GeneralSecurityException, java.io.IOException;
+    method public android.content.SharedPreferences.Editor edit();
+    method public java.util.Map<java.lang.String!,?> getAll();
+    method public boolean getBoolean(String?, boolean);
+    method public float getFloat(String?, float);
+    method public int getInt(String?, int);
+    method public long getLong(String?, long);
+    method public String? getString(String?, String?);
+    method public java.util.Set<java.lang.String!>? getStringSet(String?, java.util.Set<java.lang.String!>?);
+    method public void registerOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener);
+    method public void unregisterOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener);
+  }
+
+  public enum EncryptedSharedPreferences.PrefKeyEncryptionScheme {
+    enum_constant public static final androidx.security.crypto.EncryptedSharedPreferences.PrefKeyEncryptionScheme AES256_SIV;
+  }
+
+  public enum EncryptedSharedPreferences.PrefValueEncryptionScheme {
+    enum_constant public static final androidx.security.crypto.EncryptedSharedPreferences.PrefValueEncryptionScheme AES256_GCM;
+  }
+
+  public final class MasterKeys {
+    method public static String getOrCreate(android.security.keystore.KeyGenParameterSpec) throws java.security.GeneralSecurityException, java.io.IOException;
+    field public static final android.security.keystore.KeyGenParameterSpec AES256_GCM_SPEC;
+  }
+
+}
+
diff --git a/ui/ui-text/api/res-0.1.0-dev01.txt b/security/crypto/api/res-1.0.0-rc01.txt
similarity index 100%
copy from ui/ui-text/api/res-0.1.0-dev01.txt
copy to security/crypto/api/res-1.0.0-rc01.txt
diff --git a/ui/ui-text/api/res-0.1.0-dev01.txt b/security/crypto/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from ui/ui-text/api/res-0.1.0-dev01.txt
copy to security/crypto/api/res-1.1.0-alpha01.txt
diff --git a/security/crypto/api/restricted_1.0.0-rc01.txt b/security/crypto/api/restricted_1.0.0-rc01.txt
new file mode 100644
index 0000000..3fb36a8
--- /dev/null
+++ b/security/crypto/api/restricted_1.0.0-rc01.txt
@@ -0,0 +1,49 @@
+// Signature format: 3.0
+package androidx.security.crypto {
+
+  public final class EncryptedFile {
+    method public java.io.FileInputStream openFileInput() throws java.security.GeneralSecurityException, java.io.IOException;
+    method public java.io.FileOutputStream openFileOutput() throws java.security.GeneralSecurityException, java.io.IOException;
+  }
+
+  public static final class EncryptedFile.Builder {
+    ctor public EncryptedFile.Builder(java.io.File, android.content.Context, String, androidx.security.crypto.EncryptedFile.FileEncryptionScheme);
+    method public androidx.security.crypto.EncryptedFile build() throws java.security.GeneralSecurityException, java.io.IOException;
+    method public androidx.security.crypto.EncryptedFile.Builder setKeysetAlias(String);
+    method public androidx.security.crypto.EncryptedFile.Builder setKeysetPrefName(String);
+  }
+
+  public enum EncryptedFile.FileEncryptionScheme {
+    enum_constant public static final androidx.security.crypto.EncryptedFile.FileEncryptionScheme AES256_GCM_HKDF_4KB;
+  }
+
+  public final class EncryptedSharedPreferences implements android.content.SharedPreferences {
+    method public boolean contains(String?);
+    method public static android.content.SharedPreferences create(String, String, android.content.Context, androidx.security.crypto.EncryptedSharedPreferences.PrefKeyEncryptionScheme, androidx.security.crypto.EncryptedSharedPreferences.PrefValueEncryptionScheme) throws java.security.GeneralSecurityException, java.io.IOException;
+    method public android.content.SharedPreferences.Editor edit();
+    method public java.util.Map<java.lang.String!,?> getAll();
+    method public boolean getBoolean(String?, boolean);
+    method public float getFloat(String?, float);
+    method public int getInt(String?, int);
+    method public long getLong(String?, long);
+    method public String? getString(String?, String?);
+    method public java.util.Set<java.lang.String!>? getStringSet(String?, java.util.Set<java.lang.String!>?);
+    method public void registerOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener);
+    method public void unregisterOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener);
+  }
+
+  public enum EncryptedSharedPreferences.PrefKeyEncryptionScheme {
+    enum_constant public static final androidx.security.crypto.EncryptedSharedPreferences.PrefKeyEncryptionScheme AES256_SIV;
+  }
+
+  public enum EncryptedSharedPreferences.PrefValueEncryptionScheme {
+    enum_constant public static final androidx.security.crypto.EncryptedSharedPreferences.PrefValueEncryptionScheme AES256_GCM;
+  }
+
+  public final class MasterKeys {
+    method public static String getOrCreate(android.security.keystore.KeyGenParameterSpec) throws java.security.GeneralSecurityException, java.io.IOException;
+    field public static final android.security.keystore.KeyGenParameterSpec AES256_GCM_SPEC;
+  }
+
+}
+
diff --git a/security/crypto/api/restricted_1.1.0-alpha01.txt b/security/crypto/api/restricted_1.1.0-alpha01.txt
new file mode 100644
index 0000000..3fb36a8
--- /dev/null
+++ b/security/crypto/api/restricted_1.1.0-alpha01.txt
@@ -0,0 +1,49 @@
+// Signature format: 3.0
+package androidx.security.crypto {
+
+  public final class EncryptedFile {
+    method public java.io.FileInputStream openFileInput() throws java.security.GeneralSecurityException, java.io.IOException;
+    method public java.io.FileOutputStream openFileOutput() throws java.security.GeneralSecurityException, java.io.IOException;
+  }
+
+  public static final class EncryptedFile.Builder {
+    ctor public EncryptedFile.Builder(java.io.File, android.content.Context, String, androidx.security.crypto.EncryptedFile.FileEncryptionScheme);
+    method public androidx.security.crypto.EncryptedFile build() throws java.security.GeneralSecurityException, java.io.IOException;
+    method public androidx.security.crypto.EncryptedFile.Builder setKeysetAlias(String);
+    method public androidx.security.crypto.EncryptedFile.Builder setKeysetPrefName(String);
+  }
+
+  public enum EncryptedFile.FileEncryptionScheme {
+    enum_constant public static final androidx.security.crypto.EncryptedFile.FileEncryptionScheme AES256_GCM_HKDF_4KB;
+  }
+
+  public final class EncryptedSharedPreferences implements android.content.SharedPreferences {
+    method public boolean contains(String?);
+    method public static android.content.SharedPreferences create(String, String, android.content.Context, androidx.security.crypto.EncryptedSharedPreferences.PrefKeyEncryptionScheme, androidx.security.crypto.EncryptedSharedPreferences.PrefValueEncryptionScheme) throws java.security.GeneralSecurityException, java.io.IOException;
+    method public android.content.SharedPreferences.Editor edit();
+    method public java.util.Map<java.lang.String!,?> getAll();
+    method public boolean getBoolean(String?, boolean);
+    method public float getFloat(String?, float);
+    method public int getInt(String?, int);
+    method public long getLong(String?, long);
+    method public String? getString(String?, String?);
+    method public java.util.Set<java.lang.String!>? getStringSet(String?, java.util.Set<java.lang.String!>?);
+    method public void registerOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener);
+    method public void unregisterOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener);
+  }
+
+  public enum EncryptedSharedPreferences.PrefKeyEncryptionScheme {
+    enum_constant public static final androidx.security.crypto.EncryptedSharedPreferences.PrefKeyEncryptionScheme AES256_SIV;
+  }
+
+  public enum EncryptedSharedPreferences.PrefValueEncryptionScheme {
+    enum_constant public static final androidx.security.crypto.EncryptedSharedPreferences.PrefValueEncryptionScheme AES256_GCM;
+  }
+
+  public final class MasterKeys {
+    method public static String getOrCreate(android.security.keystore.KeyGenParameterSpec) throws java.security.GeneralSecurityException, java.io.IOException;
+    field public static final android.security.keystore.KeyGenParameterSpec AES256_GCM_SPEC;
+  }
+
+}
+
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/SerializationProcessor.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/SerializationProcessor.kt
similarity index 78%
rename from serialization/serialization-compiler/src/main/kotlin/androidx/serialization/SerializationProcessor.kt
rename to serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/SerializationProcessor.kt
index 9ba5d6e..8eb9f51 100644
--- a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/SerializationProcessor.kt
+++ b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/SerializationProcessor.kt
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
-package androidx.serialization
+package androidx.serialization.compiler
 
-import androidx.serialization.compiler.codegen.java.JavaGenerator
+import androidx.serialization.compiler.codegen.CodeGenerator
 import androidx.serialization.compiler.processing.steps.EnumProcessingStep
 import com.google.auto.common.BasicAnnotationProcessor
 import com.google.auto.service.AutoService
@@ -32,13 +32,16 @@
 @IncrementalAnnotationProcessor(ISOLATING)
 class SerializationProcessor : BasicAnnotationProcessor() {
     override fun initSteps(): List<ProcessingStep> {
-        val javaGenerator = JavaGenerator(
+        val codeGenerator = CodeGenerator(
             processingEnv,
-            "androidx.serialization.SerializationProcessor")
-
-        return listOf(
-            EnumProcessingStep(processingEnv, javaGenerator)
+            "androidx.serialization.compiler.SerializationProcessor"
         )
+
+        val enumStep = EnumProcessingStep(processingEnv) { enum ->
+            codeGenerator.generateEnumSerializer(enum).writeTo(processingEnv)
+        }
+
+        return listOf(enumStep)
     }
 
     override fun getSupportedSourceVersion(): SourceVersion = SourceVersion.latest()
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/CodeGenerator.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/CodeGenerator.kt
new file mode 100644
index 0000000..8df0a80
--- /dev/null
+++ b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/CodeGenerator.kt
@@ -0,0 +1,34 @@
+/*
+ * 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.serialization.compiler.codegen
+
+import androidx.serialization.compiler.schema.Enum
+import javax.annotation.processing.ProcessingEnvironment
+import androidx.serialization.compiler.codegen.java.javaEnumSerializer
+
+internal class CodeGenerator(
+    val generatedAnnotation: GeneratedAnnotation? = null
+) {
+    constructor(
+        processingEnv: ProcessingEnvironment,
+        generatingClassName: String
+    ) : this(GeneratedAnnotation.fromEnvironment(processingEnv, generatingClassName))
+
+    fun generateEnumSerializer(enum: Enum): GeneratedFile {
+        return GeneratedFile.Java(javaEnumSerializer(enum, generatedAnnotation))
+    }
+}
\ No newline at end of file
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/GeneratedAnnotation.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/GeneratedAnnotation.kt
new file mode 100644
index 0000000..04e816f
--- /dev/null
+++ b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/GeneratedAnnotation.kt
@@ -0,0 +1,65 @@
+/*
+ * 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.serialization.compiler.codegen
+
+import androidx.serialization.compiler.processing.ext.packageElement
+import com.google.auto.common.GeneratedAnnotations
+import com.squareup.javapoet.ClassName as JavaClassName
+import com.squareup.javapoet.AnnotationSpec as JavaAnnotationSpec
+import javax.annotation.processing.ProcessingEnvironment
+import javax.lang.model.element.NestingKind
+
+internal class GeneratedAnnotation(
+    val generatingClassName: String,
+    val packageName: String,
+    val simpleName: String = "Generated"
+) {
+    private lateinit var javaAnnotationSpec: JavaAnnotationSpec
+
+    fun toJavaAnnotationSpec(): JavaAnnotationSpec {
+        if (!::javaAnnotationSpec.isInitialized) {
+            javaAnnotationSpec = JavaAnnotationSpec
+                .builder(JavaClassName.get(packageName, simpleName))
+                .addMember("value", "\$S", generatingClassName)
+                .build()
+        }
+
+        return javaAnnotationSpec
+    }
+
+    companion object {
+        fun fromEnvironment(
+            processingEnv: ProcessingEnvironment,
+            generatingClassName: String
+        ): GeneratedAnnotation? {
+            return GeneratedAnnotations.generatedAnnotation(
+                processingEnv.elementUtils,
+                processingEnv.sourceVersion
+            ).orElse(null).let { typeElement ->
+                require(typeElement.nestingKind == NestingKind.TOP_LEVEL) {
+                    "Expected @Generated annotation to be a top-level type"
+                }
+
+                GeneratedAnnotation(
+                    generatingClassName,
+                    typeElement.packageElement.toString(),
+                    typeElement.simpleName.toString()
+                )
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/GeneratedFile.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/GeneratedFile.kt
new file mode 100644
index 0000000..9c191b4
--- /dev/null
+++ b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/GeneratedFile.kt
@@ -0,0 +1,34 @@
+/*
+ * 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.serialization.compiler.codegen
+
+import com.squareup.javapoet.JavaFile
+import javax.annotation.processing.ProcessingEnvironment
+
+internal sealed class GeneratedFile {
+    abstract fun writeTo(processingEnv: ProcessingEnvironment)
+
+    class Java(val javaFile: JavaFile) : GeneratedFile() {
+        override fun writeTo(processingEnv: ProcessingEnvironment) {
+            javaFile.writeTo(processingEnv.filer)
+        }
+
+        override fun toString(): String {
+            return javaFile.toString()
+        }
+    }
+}
\ No newline at end of file
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/ClassNames.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/ClassNames.kt
deleted file mode 100644
index 8d8a07e..0000000
--- a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/ClassNames.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.serialization.compiler.codegen.java
-
-import com.squareup.javapoet.AnnotationSpec
-import com.squareup.javapoet.ClassName
-
-private const val RUNTIME_PACKAGE = "androidx.serialization.runtime.internal"
-
-internal val ENUM_SERIALIZER: ClassName = ClassName.get(RUNTIME_PACKAGE, "EnumSerializerV1")
-
-internal val NULLABLE: AnnotationSpec =
-    AnnotationSpec.builder(ClassName.get("androidx.annotation", "Nullable")).build()
-
-internal val NON_NULL: AnnotationSpec =
-    AnnotationSpec.builder(ClassName.get("androidx.annotation", "NonNull")).build()
-
-internal val OVERRIDE: AnnotationSpec =
-    AnnotationSpec.builder(ClassName.get("java.lang", "Override")).build()
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/EnumSerializer.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/EnumSerializer.kt
index 05d6f43..1dd613ff 100644
--- a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/EnumSerializer.kt
+++ b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/EnumSerializer.kt
@@ -17,23 +17,37 @@
 package androidx.serialization.compiler.codegen.java
 
 import androidx.serialization.EnumValue
+import androidx.serialization.compiler.codegen.GeneratedAnnotation
+import androidx.serialization.compiler.codegen.java.ext.buildClass
+import androidx.serialization.compiler.codegen.java.ext.controlFlow
+import androidx.serialization.compiler.codegen.java.ext.field
+import androidx.serialization.compiler.codegen.java.ext.nonNull
+import androidx.serialization.compiler.codegen.java.ext.overrideMethod
+import androidx.serialization.compiler.codegen.java.ext.parameterized
+import androidx.serialization.compiler.codegen.java.ext.switchCase
+import androidx.serialization.compiler.codegen.java.ext.switchDefault
+import androidx.serialization.compiler.codegen.java.ext.toClassName
 import androidx.serialization.compiler.schema.Enum
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.JavaFile
 import com.squareup.javapoet.TypeName
-import java.lang.IllegalArgumentException
 import javax.lang.model.element.Modifier.FINAL
 import javax.lang.model.element.Modifier.PUBLIC
 import javax.lang.model.element.Modifier.STATIC
 
 /** Generate an enum serializer implementation. */
-internal fun JavaGenerator.enumSerializer(enum: Enum): JavaFile {
-    val enumClass = ClassName.get(enum.element)
+internal fun javaEnumSerializer(
+    enum: Enum,
+    generatedAnnotation: GeneratedAnnotation? = null
+): JavaFile {
+    val enumClass = enum.element.toClassName()
     val serializer = serializerName(enumClass)
 
     val values = enum.values.sortedBy { it.id }
 
-    return buildClass(serializer, enum.element, PUBLIC, FINAL) {
+    return buildClass(serializer, PUBLIC, FINAL) {
+        generatedAnnotation?.let { addAnnotation(it.toJavaAnnotationSpec()) }
+        addOriginatingElement(enum.element)
         addSuperinterface(ENUM_SERIALIZER.parameterized(enumClass))
 
         field(serializer.nonNull, "INSTANCE", PUBLIC, STATIC, FINAL) {
@@ -53,7 +67,7 @@
 
                 switchDefault {
                     addStatement(
-                        "throw new \$T(\"Enum value \" + value.toString() +\$W" +
+                        "throw new \$T(\"Enum value \" + value.toString()\$W+ " +
                                 "\" does not have a serialization ID.\")",
                         IllegalArgumentException::class.java
                     )
@@ -80,3 +94,6 @@
         }
     }
 }
+
+val ENUM_SERIALIZER: ClassName =
+    ClassName.get("androidx.serialization.runtime.internal", "EnumSerializerV1")
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/JavaGenerator.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/JavaGenerator.kt
deleted file mode 100644
index 0d3745d..0000000
--- a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/JavaGenerator.kt
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.serialization.compiler.codegen.java
-
-import com.google.auto.common.GeneratedAnnotations
-import com.squareup.javapoet.AnnotationSpec
-import com.squareup.javapoet.ClassName
-import com.squareup.javapoet.JavaFile
-import com.squareup.javapoet.TypeSpec
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.SourceVersion
-import javax.lang.model.element.Element
-import javax.lang.model.element.Modifier
-
-/**
- * Central state holder for Java generation.
- *
- * Individual Java generators are implemented as extension methods.
- */
-internal class JavaGenerator(
-    val sourceVersion: SourceVersion = SourceVersion.latest(),
-    private val generatedAnnotation: AnnotationSpec? = null
-) {
-    constructor(
-        processingEnv: ProcessingEnvironment,
-        generatingClassName: String
-    ) : this (
-        sourceVersion = processingEnv.sourceVersion,
-        generatedAnnotation = GeneratedAnnotations.generatedAnnotation(
-            processingEnv.elementUtils,
-            processingEnv.sourceVersion
-        ).orElse(null)?.let { typeElement ->
-            AnnotationSpec.builder(ClassName.get(typeElement))
-                .addMember("value", "\$S", generatingClassName)
-                .build()
-        }
-    )
-
-    /** Build a class spec as a java file. */
-    inline fun buildClass(
-        className: ClassName,
-        originatingElement: Element,
-        vararg modifiers: Modifier,
-        init: TypeSpec.Builder.() -> Unit
-    ): JavaFile {
-        return buildJavaFile(
-            TypeSpec.classBuilder(className).apply {
-                addOriginatingElement(originatingElement)
-                addModifiers(*modifiers)
-                init()
-            },
-            className
-        )
-    }
-
-    /** Finish a type spec builder, adding a generated annotation if present. */
-    fun buildJavaFile(
-        builder: TypeSpec.Builder,
-        className: ClassName
-    ): JavaFile {
-        val typeSpec = builder.run {
-            generatedAnnotation?.let { addAnnotation(it) }
-            build()
-        }
-        return JavaFile.builder(className.packageName(), typeSpec).indent(INDENTATION).build()
-    }
-
-    private companion object {
-        const val INDENTATION = "    "
-    }
-}
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/JavaPoetExt.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/JavaPoetExt.kt
deleted file mode 100644
index 84cab13..0000000
--- a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/JavaPoetExt.kt
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.serialization.compiler.codegen.java
-
-import com.squareup.javapoet.ClassName
-import com.squareup.javapoet.FieldSpec
-import com.squareup.javapoet.MethodSpec
-import com.squareup.javapoet.ParameterizedTypeName
-import com.squareup.javapoet.TypeName
-import com.squareup.javapoet.TypeSpec
-import javax.lang.model.element.Modifier
-
-/** This type name annotated with NonNull. */
-internal val TypeName.nonNull: TypeName
-    get() {
-        require(!isPrimitive) { "@NonNull is not applicable to primitive type: $this" }
-        require(annotations.none { it.type == NULLABLE.type }) {
-            "@NonNull conflicts with @Nullable present on type: ${withoutAnnotations()}"
-        }
-        return if (annotations.any { it.type == NON_NULL.type }) this else annotated(NON_NULL)
-    }
-
-/** This type name annotated with Nullable. */
-internal val TypeName.nullable: TypeName
-    get() {
-        require(!isPrimitive) { "@Nullable is not applicable to primitive type: $this" }
-        require(annotations.none { it.type == NON_NULL.type }) {
-            "@Nullable conflicts with @NonNull present on type: ${withoutAnnotations()}"
-        }
-        return if (annotations.any { it.type == NULLABLE.type }) this else annotated(NULLABLE)
-    }
-
-/** This class name with type parameters.  */
-internal fun ClassName.parameterized(vararg typeArguments: TypeName): ParameterizedTypeName {
-    return ParameterizedTypeName.get(this, *typeArguments)
-}
-
-/** Type-safe builder for a field. */
-internal inline fun TypeSpec.Builder.field(
-    type: TypeName,
-    name: String,
-    vararg modifiers: Modifier,
-    init: FieldSpec.Builder.() -> Unit
-) {
-    addField(FieldSpec.builder(type, name, *modifiers).apply(init).build())
-}
-
-/** Type-safe builder for a method. */
-internal inline fun TypeSpec.Builder.method(
-    name: String,
-    vararg modifiers: Modifier,
-    init: MethodSpec.Builder.() -> Unit
-) {
-    addMethod(MethodSpec.methodBuilder(name).run {
-        addModifiers(*modifiers)
-        init()
-        build()
-    })
-}
-
-internal inline fun TypeSpec.Builder.overrideMethod(
-    name: String,
-    vararg modifiers: Modifier,
-    init: MethodSpec.Builder.() -> Unit
-) {
-    method(name, *modifiers) {
-        addAnnotation(OVERRIDE)
-        init()
-    }
-}
-
-/** Type-safe builder for a control flow within a method. */
-internal inline fun MethodSpec.Builder.controlFlow(
-    format: String,
-    vararg args: Any?,
-    body: MethodSpec.Builder.() -> Unit
-) {
-    beginControlFlow(format, *args)
-    body()
-    endControlFlow()
-}
-
-/** Type-safe builder for a `case` block within a `switch`. */
-internal inline fun MethodSpec.Builder.switchCase(
-    format: String,
-    vararg args: Any?,
-    body: MethodSpec.Builder.() -> Unit
-) {
-    addCode("case $format:\$>\n", *args)
-    body()
-    addCode("\$<")
-}
-
-/** Type-safe builder for a `default` block within a `switch`. */
-internal inline fun MethodSpec.Builder.switchDefault(body: MethodSpec.Builder.() -> Unit) {
-    addCode("default:\n\$>")
-    body()
-    addCode("\$<")
-}
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/ext/MethodSpecExt.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/ext/MethodSpecExt.kt
new file mode 100644
index 0000000..4bfdf17
--- /dev/null
+++ b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/ext/MethodSpecExt.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.serialization.compiler.codegen.java.ext
+
+import com.squareup.javapoet.MethodSpec
+
+/** Type-safe builder for a control flow within a method. */
+internal inline fun MethodSpec.Builder.controlFlow(
+    format: String,
+    vararg args: Any?,
+    body: MethodSpec.Builder.() -> Unit
+) {
+    beginControlFlow(format, *args)
+    body()
+    endControlFlow()
+}
+
+/** Type-safe builder for a `case` block within a `switch`. */
+internal inline fun MethodSpec.Builder.switchCase(
+    format: String,
+    vararg args: Any?,
+    body: MethodSpec.Builder.() -> Unit
+) {
+    addCode("case $format:\$>\n", *args)
+    body()
+    addCode("\$<")
+}
+
+/** Type-safe builder for a `default` block within a `switch`. */
+internal inline fun MethodSpec.Builder.switchDefault(body: MethodSpec.Builder.() -> Unit) {
+    addCode("default:\n\$>")
+    body()
+    addCode("\$<")
+}
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/ext/TypeNameExt.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/ext/TypeNameExt.kt
new file mode 100644
index 0000000..ce2995c
--- /dev/null
+++ b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/ext/TypeNameExt.kt
@@ -0,0 +1,61 @@
+/*
+ * 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.serialization.compiler.codegen.java.ext
+
+import com.squareup.javapoet.AnnotationSpec
+import com.squareup.javapoet.ClassName
+import com.squareup.javapoet.ParameterizedTypeName
+import com.squareup.javapoet.TypeName
+import javax.lang.model.element.TypeElement
+
+/** Convert a type element to a class name. */
+internal fun TypeElement.toClassName(): ClassName {
+    return ClassName.get(this)
+}
+
+/** This class name with type parameters.  */
+internal fun ClassName.parameterized(vararg typeArguments: TypeName): ParameterizedTypeName {
+    return ParameterizedTypeName.get(this, *typeArguments)
+}
+
+/** This type name annotated with NonNull. */
+internal val TypeName.nonNull: TypeName
+    get() {
+        require(!isPrimitive) { "@NonNull is not applicable to primitive type: $this" }
+        require(annotations.none { it.type == NULLABLE.type }) {
+            "@NonNull conflicts with @Nullable present on type: ${withoutAnnotations()}"
+        }
+        return if (annotations.any { it.type == NON_NULL.type }) this else annotated(
+            NON_NULL
+        )
+    }
+
+private val NON_NULL: AnnotationSpec =
+    AnnotationSpec.builder(ClassName.get("androidx.annotation", "NonNull")).build()
+
+/** This type name annotated with Nullable. */
+internal val TypeName.nullable: TypeName
+    get() {
+        require(!isPrimitive) { "@Nullable is not applicable to primitive type: $this" }
+        require(annotations.none { it.type == NON_NULL.type }) {
+            "@Nullable conflicts with @NonNull present on type: ${withoutAnnotations()}"
+        }
+        return if (annotations.any { it.type == NULLABLE.type }) this else annotated(NULLABLE)
+    }
+
+private val NULLABLE: AnnotationSpec =
+    AnnotationSpec.builder(ClassName.get("androidx.annotation", "Nullable")).build()
\ No newline at end of file
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/ext/TypeSpecExt.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/ext/TypeSpecExt.kt
new file mode 100644
index 0000000..f6002ac
--- /dev/null
+++ b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/codegen/java/ext/TypeSpecExt.kt
@@ -0,0 +1,82 @@
+/*
+ * 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.serialization.compiler.codegen.java.ext
+
+import com.squareup.javapoet.AnnotationSpec
+import com.squareup.javapoet.ClassName
+import com.squareup.javapoet.FieldSpec
+import com.squareup.javapoet.JavaFile
+import com.squareup.javapoet.MethodSpec
+import com.squareup.javapoet.TypeName
+import com.squareup.javapoet.TypeSpec
+import javax.lang.model.element.Modifier
+
+/** Builds a new class type spec. */
+internal inline fun buildClass(
+    className: ClassName,
+    vararg modifiers: Modifier,
+    init: TypeSpec.Builder.() -> Unit
+): JavaFile {
+    return TypeSpec.classBuilder(className.topLevelClassName()).run {
+        addModifiers(*modifiers)
+        init()
+        build()
+    }.toJavaFile(className.packageName())
+}
+
+internal fun TypeSpec.toJavaFile(packageName: String): JavaFile {
+    return JavaFile.builder(packageName, this).indent(INDENTATION).build()
+}
+
+private const val INDENTATION = "    "
+
+/** Type-safe builder for a field. */
+internal inline fun TypeSpec.Builder.field(
+    type: TypeName,
+    name: String,
+    vararg modifiers: Modifier,
+    init: FieldSpec.Builder.() -> Unit
+) {
+    addField(FieldSpec.builder(type, name, *modifiers).apply(init).build())
+}
+
+/** Type-safe builder for a method. */
+internal inline fun TypeSpec.Builder.method(
+    name: String,
+    vararg modifiers: Modifier,
+    init: MethodSpec.Builder.() -> Unit
+) {
+    addMethod(MethodSpec.methodBuilder(name).run {
+        addModifiers(*modifiers)
+        init()
+        build()
+    })
+}
+
+internal inline fun TypeSpec.Builder.overrideMethod(
+    name: String,
+    vararg modifiers: Modifier,
+    init: MethodSpec.Builder.() -> Unit
+) {
+    method(name, *modifiers) {
+        addAnnotation(OVERRIDE)
+        init()
+    }
+}
+
+private val OVERRIDE: AnnotationSpec =
+    AnnotationSpec.builder(ClassName.get("java.lang", "Override")).build()
\ No newline at end of file
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/AnnotationMirrorExt.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ext/AnnotationMirrorExt.kt
similarity index 94%
rename from serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/AnnotationMirrorExt.kt
rename to serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ext/AnnotationMirrorExt.kt
index e8cf3d7..0f8cd75 100644
--- a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/AnnotationMirrorExt.kt
+++ b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ext/AnnotationMirrorExt.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.serialization.compiler.processing
+package androidx.serialization.compiler.processing.ext
 
 import com.google.auto.common.AnnotationMirrors
 import javax.lang.model.element.AnnotationMirror
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/AnnotationValueExt.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ext/AnnotationValueExt.kt
similarity index 97%
rename from serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/AnnotationValueExt.kt
rename to serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ext/AnnotationValueExt.kt
index a99baef..84df736 100644
--- a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/AnnotationValueExt.kt
+++ b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ext/AnnotationValueExt.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.serialization.compiler.processing
+package androidx.serialization.compiler.processing.ext
 
 import javax.lang.model.element.AnnotationMirror
 import javax.lang.model.element.AnnotationValue
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ElementExt.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ext/ElementExt.kt
similarity index 97%
rename from serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ElementExt.kt
rename to serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ext/ElementExt.kt
index 3d918d1..6115b38 100644
--- a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ElementExt.kt
+++ b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ext/ElementExt.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.serialization.compiler.processing
+package androidx.serialization.compiler.processing.ext
 
 import com.google.auto.common.MoreElements
 import javax.lang.model.element.AnnotationMirror
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ProcessingExt.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ext/MessagerExt.kt
similarity index 84%
rename from serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ProcessingExt.kt
rename to serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ext/MessagerExt.kt
index 5b7f7a8..84a1f7b 100644
--- a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ProcessingExt.kt
+++ b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ext/MessagerExt.kt
@@ -14,10 +14,9 @@
  * limitations under the License.
  */
 
-package androidx.serialization.compiler.processing
+package androidx.serialization.compiler.processing.ext
 
 import javax.annotation.processing.Messager
-import javax.annotation.processing.ProcessingEnvironment
 import javax.lang.model.element.AnnotationMirror
 import javax.lang.model.element.AnnotationValue
 import javax.lang.model.element.Element
@@ -25,11 +24,6 @@
 import javax.tools.Diagnostic.Kind.WARNING
 import kotlin.reflect.KClass
 
-/** Determine if a qualified class name is present in the processing environment. */
-internal fun ProcessingEnvironment.isClassPresent(qualifiedName: String): Boolean {
-    return elementUtils.getTypeElement(qualifiedName) != null
-}
-
 /** Print [message] as a warning with optional positional information. */
 internal inline fun Messager.warn(
     element: Element? = null,
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ProcessReserved.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/parsers/ParseReserved.kt
similarity index 81%
rename from serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ProcessReserved.kt
rename to serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/parsers/ParseReserved.kt
index 425d0d0..b0a0d3e 100644
--- a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/ProcessReserved.kt
+++ b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/parsers/ParseReserved.kt
@@ -14,9 +14,14 @@
  * limitations under the License.
  */
 
-package androidx.serialization.compiler.processing
+package androidx.serialization.compiler.processing.parsers
 
 import androidx.serialization.Reserved.IdRange
+import androidx.serialization.compiler.processing.ext.asAnnotationMirror
+import androidx.serialization.compiler.processing.ext.asInt
+import androidx.serialization.compiler.processing.ext.asList
+import androidx.serialization.compiler.processing.ext.asString
+import androidx.serialization.compiler.processing.ext.get
 import androidx.serialization.schema.Reserved
 import javax.lang.model.element.TypeElement
 import androidx.serialization.Reserved as ReservedAnnotation
@@ -28,7 +33,7 @@
  * [IdRange] with its `from` greater than its `to`, it reverses them before converting them to an
  * [IntRange], reserving the same range of IDs as if they had been correctly placed.
  */
-internal fun processReserved(element: TypeElement): Reserved {
+internal fun parseReserved(element: TypeElement): Reserved {
     return when (val reserved = element[ReservedAnnotation::class]) {
         null -> Reserved.empty()
         else -> Reserved(
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/steps/EnumProcessingStep.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/steps/EnumProcessingStep.kt
index 7505f72..4b2d008 100644
--- a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/steps/EnumProcessingStep.kt
+++ b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/processing/steps/EnumProcessingStep.kt
@@ -17,17 +17,16 @@
 package androidx.serialization.compiler.processing.steps
 
 import androidx.serialization.EnumValue
-import androidx.serialization.compiler.codegen.java.JavaGenerator
-import androidx.serialization.compiler.codegen.java.enumSerializer
-import androidx.serialization.compiler.processing.asInt
-import androidx.serialization.compiler.processing.asTypeElement
-import androidx.serialization.compiler.processing.asVariableElement
-import androidx.serialization.compiler.processing.error
-import androidx.serialization.compiler.processing.get
-import androidx.serialization.compiler.processing.isVisibleToPackage
-import androidx.serialization.compiler.processing.isPrivate
-import androidx.serialization.compiler.processing.processReserved
+import androidx.serialization.compiler.processing.ext.asInt
+import androidx.serialization.compiler.processing.ext.asTypeElement
+import androidx.serialization.compiler.processing.ext.asVariableElement
+import androidx.serialization.compiler.processing.ext.error
+import androidx.serialization.compiler.processing.ext.get
+import androidx.serialization.compiler.processing.ext.isPrivate
+import androidx.serialization.compiler.processing.ext.isVisibleToPackage
+import androidx.serialization.compiler.processing.parsers.parseReserved
 import androidx.serialization.compiler.schema.Enum
+import androidx.serialization.compiler.schema.ext.toTypeName
 import com.google.auto.common.BasicAnnotationProcessor.ProcessingStep
 import com.google.common.collect.SetMultimap
 import javax.annotation.processing.Messager
@@ -40,8 +39,7 @@
 /** Processing step that parses and validates enums, and generates enum coders. */
 internal class EnumProcessingStep(
     private val processingEnv: ProcessingEnvironment,
-    private val javaGenerator: JavaGenerator,
-    private val onEnum: ((Enum) -> Unit)? = null
+    private val onEnum: (Enum) -> Unit
 ) : ProcessingStep {
     private val messager: Messager = processingEnv.messager
 
@@ -90,7 +88,7 @@
      * This method operates by validating that the enum class is not private, then walking its
      * enum constants. It validates that all constants have an [EnumValue] annotation, and then
      * reads [EnumValue.id] and constructs an [Enum] and dispatches it to [onEnum]. It fills
-     * [Enum.reserved] using [processReserved].
+     * [Enum.reserved] using [parseReserved].
      */
     private fun processEnumClass(enumClass: TypeElement) {
         check(enumClass.kind == ElementKind.ENUM) {
@@ -114,14 +112,19 @@
             hasError = true
         }
 
-        val values = mutableSetOf<Enum.Value>()
+        val values = mutableListOf<Enum.Value>()
 
         for (element in enumClass.enclosedElements) {
             if (element.kind == ENUM_CONSTANT) {
                 val annotation = element[EnumValue::class]
 
                 if (annotation != null) {
-                    values += Enum.Value(element.asVariableElement(), annotation["value"].asInt())
+                    values += Enum.Value(
+                        id = annotation["value"].asInt(),
+                        name = element.simpleName.toString(),
+                        element = element.asVariableElement(),
+                        annotation = annotation
+                    )
                 } else {
                     messager.error(element) {
                         "To avoid unexpected behavior, all enum constants in a serializable " +
@@ -133,9 +136,7 @@
         }
 
         if (!hasError) {
-            val enum = Enum(enumClass, values, processReserved(enumClass))
-            onEnum?.invoke(enum)
-            javaGenerator.enumSerializer(enum).writeTo(processingEnv.filer)
+            onEnum(Enum(enumClass.toTypeName(), values, parseReserved(enumClass), enumClass))
         }
     }
 }
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/schema/Enum.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/schema/Enum.kt
new file mode 100644
index 0000000..3615733
--- /dev/null
+++ b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/schema/Enum.kt
@@ -0,0 +1,37 @@
+/*
+ * 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.serialization.compiler.schema
+
+import androidx.serialization.schema.Reserved
+import androidx.serialization.schema.TypeName
+import javax.lang.model.element.AnnotationMirror
+import javax.lang.model.element.TypeElement
+import javax.lang.model.element.VariableElement
+
+internal class Enum(
+    override val name: TypeName,
+    override val values: List<Value>,
+    override val reserved: Reserved,
+    val element: TypeElement
+) : androidx.serialization.schema.Enum {
+    class Value(
+        override val id: Int,
+        override val name: String,
+        val element: VariableElement,
+        val annotation: AnnotationMirror
+    ) : androidx.serialization.schema.Enum.Value
+}
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/schema/FieldAccessor.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/schema/FieldAccessor.kt
deleted file mode 100644
index 7b43ff7..0000000
--- a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/schema/FieldAccessor.kt
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.serialization.compiler.schema
-
-import javax.lang.model.element.Element
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.VariableElement
-
-/** Things that can access a message field. */
-internal sealed class FieldAccessor {
-    abstract val element: Element
-}
-
-/** Things that can read a message field. */
-internal sealed class FieldReader : FieldAccessor()
-
-/** Things that can set or update a message field. */
-internal sealed class FieldWriter : FieldAccessor()
-
-/** Things that can set a field at construction time. */
-internal sealed class FieldCreator : FieldWriter()
-
-/** Things that can update a field after construction. */
-internal sealed class FieldUpdater : FieldWriter()
-
-/** An open or final field. */
-internal data class FieldFieldReader(override val element: VariableElement) : FieldReader()
-
-/** A getter method. */
-internal data class GetterFieldReader(override val element: ExecutableElement) : FieldReader()
-
-/** An open field. */
-internal data class FieldFieldUpdater(override val element: VariableElement) : FieldUpdater()
-
-/** A setter method. */
-internal data class SetterFieldUpdater(override val element: ExecutableElement) : FieldUpdater()
-
-/** A constructor parameter. */
-internal data class ConstructorFieldCreator(
-    override val element: VariableElement,
-    val position: Int,
-    val constructorElement: ExecutableElement
-) : FieldCreator()
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/schema/Schema.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/schema/Schema.kt
deleted file mode 100644
index 90f09ed..0000000
--- a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/schema/Schema.kt
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.serialization.compiler.schema
-
-import androidx.serialization.schema.ComplexType
-import androidx.serialization.schema.Enum as SchemaEnum
-import androidx.serialization.schema.Message as SchemaMessage
-import androidx.serialization.schema.Reserved
-import androidx.serialization.schema.Service as SchemaService
-import androidx.serialization.schema.Service.Action.Mode.BLOCKING
-import androidx.serialization.schema.Type
-import androidx.serialization.schema.TypeName
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.TypeElement
-import javax.lang.model.element.VariableElement
-
-/** Base type for schema compiled from the processing environment. */
-internal sealed class ProcessingType : ComplexType {
-    /** Type element this Serialization type is derived from. */
-    abstract val element: TypeElement
-}
-
-internal data class Enum(
-    override val element: TypeElement,
-    override val values: Set<Value> = emptySet(),
-    override val reserved: Reserved = Reserved.empty(),
-    override val name: TypeName = element.toTypeName()
-) : ProcessingType(), SchemaEnum {
-    data class Value(
-        /** Element representing the annotated enum constant. */
-        val element: VariableElement,
-        override val id: Int,
-        override val name: String = element.simpleName.toString()
-    ) : SchemaEnum.Value
-}
-
-internal data class Message(
-    override val element: TypeElement,
-    override val fields: Set<Field> = emptySet(),
-    override val reserved: Reserved = Reserved.empty(),
-    override val name: TypeName = element.toTypeName()
-) : ProcessingType(), SchemaMessage {
-    data class Field(
-        override val id: Int,
-        override val name: String,
-        override val type: Type,
-        /** Accessor for reading this field. */
-        val reader: FieldReader,
-        /** Accessor for writing to this field. */
-        val writer: FieldWriter,
-        /** Whether a field should be set to null instead of a default instance when omitted. */
-        val nullable: Boolean = false
-    ) : SchemaMessage.Field
-}
-
-internal data class Service(
-    override val element: TypeElement,
-    override val actions: Set<Action> = emptySet(),
-    override val reserved: Reserved = Reserved.empty(),
-    override val name: TypeName = element.toTypeName(),
-    override val descriptor: String = name.canonicalName
-) : ProcessingType(), SchemaService {
-    data class Action(
-        /** Element representing the annotated action method. */
-        val element: ExecutableElement,
-        override val id: Int,
-        override val name: String = element.simpleName.toString(),
-        override val mode: SchemaService.Action.Mode = BLOCKING,
-        override val request: Message? = null,
-        override val response: Message? = null
-    ) : SchemaService.Action
-}
diff --git a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/schema/TypeNameExt.kt b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/schema/ext/TypeNameExt.kt
similarity index 96%
rename from serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/schema/TypeNameExt.kt
rename to serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/schema/ext/TypeNameExt.kt
index 285a73c..b0a3968 100644
--- a/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/schema/TypeNameExt.kt
+++ b/serialization/serialization-compiler/src/main/kotlin/androidx/serialization/compiler/schema/ext/TypeNameExt.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.serialization.compiler.schema
+package androidx.serialization.compiler.schema.ext
 
 import androidx.serialization.schema.TypeName
 import javax.lang.model.element.Element
diff --git a/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/EnumSerializerTest.kt b/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/EnumSerializerTest.kt
new file mode 100644
index 0000000..0827a49
--- /dev/null
+++ b/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/EnumSerializerTest.kt
@@ -0,0 +1,97 @@
+/*
+ * 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.serialization.compiler
+
+import com.google.testing.compile.Compilation
+import com.google.testing.compile.CompilationSubject.assertThat
+import com.google.testing.compile.Compiler.javac
+import com.google.testing.compile.JavaFileObjects
+import org.junit.Test
+import javax.tools.JavaFileObject
+
+/** Integration tests for enum serializer generation. */
+class EnumSerializerTest {
+    @Test
+    fun test() {
+        val enum = JavaFileObjects.forSourceString("com.example.TestEnum", """
+            package com.example;
+            
+            import androidx.serialization.EnumValue;
+            
+            public enum TestEnum {
+                @EnumValue(EnumValue.DEFAULT)
+                DEFAULT,
+                @EnumValue(1)
+                ONE,
+                @EnumValue(2)
+                TWO
+            }
+        """.trimIndent())
+
+        /* ktlint-disable max-line-length */
+        val serializer = JavaFileObjects.forSourceString("com.example.TestEnumSerializer", """
+            package com.example;
+
+            import androidx.annotation.NonNull;
+            import androidx.serialization.runtime.internal.EnumSerializerV1;
+            import java.lang.IllegalArgumentException;
+            import java.lang.Override;
+            import javax.annotation.processing.Generated;
+
+            @Generated("androidx.serialization.compiler.SerializationProcessor")
+            public final class TestEnumSerializer implements EnumSerializerV1<TestEnum> {
+                public static final @NonNull TestEnumSerializer INSTANCE = new TestEnumSerializer();
+
+                @Override
+                public int encode(@NonNull TestEnum value) {
+                    switch (value) {
+                        case DEFAULT:
+                            return 0;
+                        case ONE:
+                            return 1;
+                        case TWO:
+                            return 2;
+                        default:
+                            throw new IllegalArgumentException("Enum value " + value.toString()
+                                    + " does not have a serialization ID.");
+                    }
+                }
+
+                @Override
+                public @NonNull TestEnum decode(int value) {
+                    switch (value) {
+                        case 1:
+                            return TestEnum.ONE;
+                        case 2:
+                            return TestEnum.TWO;
+                        default:
+                            return TestEnum.DEFAULT;
+                    }
+                }
+            }
+        """.trimIndent())
+        /* ktlint-enable max-line-length */
+
+        assertThat(compile(enum))
+            .generatedSourceFile("com.example.TestEnumSerializer")
+            .hasSourceEquivalentTo(serializer)
+    }
+
+    private fun compile(vararg sources: JavaFileObject): Compilation {
+        return javac().withProcessors(SerializationProcessor()).compile(*sources)
+    }
+}
\ No newline at end of file
diff --git a/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/SerializationProcessorTest.kt b/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/SerializationProcessorTest.kt
similarity index 96%
rename from serialization/serialization-compiler/src/test/kotlin/androidx/serialization/SerializationProcessorTest.kt
rename to serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/SerializationProcessorTest.kt
index 1a670da..53a00ae 100644
--- a/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/SerializationProcessorTest.kt
+++ b/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/SerializationProcessorTest.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.serialization
+package androidx.serialization.compiler
 
 import com.google.testing.compile.Compilation
 import com.google.testing.compile.CompilationSubject.assertThat
diff --git a/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/TestElements.kt b/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/TestElements.kt
deleted file mode 100644
index 37b1c12..0000000
--- a/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/TestElements.kt
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.serialization.compiler
-
-import javax.lang.model.element.AnnotationMirror
-import javax.lang.model.element.Element
-import javax.lang.model.element.ElementKind
-import javax.lang.model.element.ElementVisitor
-import javax.lang.model.element.Modifier
-import javax.lang.model.element.Name
-import javax.lang.model.element.NestingKind
-import javax.lang.model.element.PackageElement
-import javax.lang.model.element.TypeElement
-import javax.lang.model.element.TypeParameterElement
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.TypeMirror
-
-/**
- * Generates a test implementation of [TypeElement].
- *
- * This allows testing code generation in isolation without a processing environment. The
- * [TypeElement.getEnclosingElement] of the returned type will be an appropriate package element
- * or a hierarchy of nested type elements if more than one simple name is supplied.
- */
-internal fun testTypeElement(
-    packageName: String,
-    vararg simpleNames: String,
-    kind: ElementKind = ElementKind.CLASS,
-    modifiers: Set<Modifier> = emptySet()
-): TypeElement {
-    require(simpleNames.isNotEmpty())
-    var qualifiedName = "$packageName.${simpleNames.first()}"
-    var cursor = TestTypeElement(
-        enclosingElement = TestPackageElement(packageName),
-        nestingKind = NestingKind.TOP_LEVEL,
-        simpleName = simpleNames.first(),
-        qualifiedName = qualifiedName,
-        modifiers = modifiers,
-        kind = kind
-    )
-
-    for (i in 1 until simpleNames.size) {
-        qualifiedName = "$qualifiedName.${simpleNames[i]}"
-        cursor = TestTypeElement(
-            enclosingElement = cursor,
-            nestingKind = NestingKind.MEMBER,
-            simpleName = simpleNames[i],
-            qualifiedName = qualifiedName,
-            modifiers = modifiers,
-            kind = kind
-        )
-    }
-
-    return cursor
-}
-
-/** Generates a test implementation of [VariableElement]. */
-internal fun testVariableElement(
-    simpleName: String,
-    kind: ElementKind,
-    enclosingElement: Element? = null,
-    vararg modifiers: Modifier
-): VariableElement {
-    return TestVariableElement(
-        simpleName,
-        enclosingElement,
-        kind,
-        modifiers.toSet()
-    )
-}
-
-private class TestName(
-    private val name: String
-) : Name, CharSequence by name {
-    override fun contentEquals(cs: CharSequence): Boolean = name.contentEquals(cs)
-    override fun toString(): String = name
-}
-
-private abstract class AbstractTestElement(
-    simpleName: String,
-    private val enclosingElement: Element?,
-    private val kind: ElementKind,
-    private val modifiers: Set<Modifier>
-) : Element {
-    private val enclosedElements = mutableListOf<AbstractTestElement>()
-    private val simpleName = TestName(simpleName)
-
-    init {
-        enclosingElement?.let {
-            when (it) { is AbstractTestElement -> it.enclosedElements += this }
-        }
-    }
-
-    override fun getModifiers(): Set<Modifier> = modifiers
-    override fun getSimpleName(): Name = simpleName
-    override fun getKind(): ElementKind = kind
-    override fun getEnclosingElement(): Element? = enclosingElement
-    override fun getEnclosedElements(): List<Element> = enclosedElements
-
-    override fun getAnnotationMirrors() = emptyList<AnnotationMirror>()
-
-    override fun asType(): TypeMirror {
-        throw UnsupportedOperationException("Test Element implementation")
-    }
-
-    override fun <A : Annotation> getAnnotationsByType(annotationType: Class<A>): Array<A> {
-        notImplemented()
-    }
-
-    override fun <A : Annotation> getAnnotation(annotationType: Class<A>): A {
-        notImplemented()
-    }
-
-    protected fun notImplemented(): Nothing {
-        throw UnsupportedOperationException(
-            "Test implementation of ${this::class.java.simpleName} does not implement this method"
-        )
-    }
-}
-
-private class TestPackageElement(
-    qualifiedName: String
-) : PackageElement, AbstractTestElement(
-    simpleName = qualifiedName.split(".").last(),
-    enclosingElement = null,
-    kind = ElementKind.PACKAGE,
-    modifiers = emptySet()
-) {
-    private val qualifiedName = TestName(qualifiedName)
-
-    override fun isUnnamed(): Boolean = qualifiedName.isEmpty()
-    override fun getQualifiedName(): Name = qualifiedName
-
-    override fun <R, P> accept(v: ElementVisitor<R, P>, p: P): R {
-        return v.visitPackage(this, p)
-    }
-}
-
-private class TestTypeElement(
-    simpleName: String,
-    qualifiedName: String,
-    enclosingElement: Element?,
-    kind: ElementKind,
-    modifiers: Set<Modifier>,
-    private val nestingKind: NestingKind = NestingKind.TOP_LEVEL
-) : TypeElement, AbstractTestElement(simpleName, enclosingElement, kind, modifiers) {
-    private val qualifiedNameAsName = TestName(qualifiedName)
-
-    override fun getQualifiedName(): Name = qualifiedNameAsName
-    override fun getNestingKind(): NestingKind = nestingKind
-
-    override fun getSuperclass(): TypeMirror = notImplemented()
-    override fun getTypeParameters(): List<TypeParameterElement> = notImplemented()
-    override fun getInterfaces(): List<TypeMirror> = notImplemented()
-
-    override fun <R, P> accept(v: ElementVisitor<R, P>, p: P): R {
-        return v.visitType(this, p)
-    }
-}
-
-private class TestVariableElement(
-    simpleName: String,
-    enclosingElement: Element?,
-    kind: ElementKind,
-    modifiers: Set<Modifier>
-) : VariableElement, AbstractTestElement(simpleName, enclosingElement, kind, modifiers) {
-    override fun getConstantValue(): Any = notImplemented()
-
-    override fun <R, P> accept(v: ElementVisitor<R, P>, p: P): R {
-        return v.visitVariable(this, p)
-    }
-}
diff --git a/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/TestSchema.kt b/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/TestSchema.kt
deleted file mode 100644
index 4376cb2..0000000
--- a/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/TestSchema.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.serialization.compiler
-
-import androidx.serialization.compiler.schema.Enum
-import androidx.serialization.schema.Reserved
-import javax.lang.model.element.ElementKind.ENUM_CONSTANT
-
-/** Generates a customizable [Enum] for testing code generation. */
-internal fun testEnum(
-    packageName: String = "com.example",
-    vararg simpleNames: String = Array(1) { "TestEnum" },
-    values: Map<Int, String> = mapOf(
-        0 to "DEFAULT",
-        1 to "ONE",
-        2 to "TWO"
-    ),
-    reserved: Reserved = Reserved.empty()
-): Enum {
-    val typeElement = testTypeElement(packageName, *simpleNames)
-    return Enum(
-        typeElement,
-        values.mapTo(mutableSetOf()) { (id, name) ->
-            Enum.Value(testVariableElement(name, ENUM_CONSTANT, typeElement), id)
-        },
-        reserved
-    )
-}
diff --git a/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/codegen/java/EnumSerializerTest.kt b/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/codegen/java/EnumSerializerTest.kt
deleted file mode 100644
index f7025b4..0000000
--- a/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/codegen/java/EnumSerializerTest.kt
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.serialization.compiler.codegen.java
-
-import androidx.serialization.compiler.testEnum
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-
-/** Unit tests for [enumSerializer]. */
-class EnumSerializerTest {
-    @Test
-    fun testFullClass() {
-        /* ktlint-disable max-line-length */
-        assertThat(testJavaGenerator(this::class).enumSerializer(testEnum()).toString())
-            .contains("""
-                @Generated("androidx.serialization.compiler.codegen.java.EnumSerializerTest")
-                public final class TestEnumSerializer implements EnumSerializerV1<TestEnum> {
-                    public static final @NonNull TestEnumSerializer INSTANCE = new TestEnumSerializer();
-
-                    @Override
-                    public int encode(@NonNull TestEnum value) {
-                        switch (value) {
-                            case DEFAULT:
-                                return 0;
-                            case ONE:
-                                return 1;
-                            case TWO:
-                                return 2;
-                            default:
-                                throw new IllegalArgumentException("Enum value " + value.toString() +
-                                        " does not have a serialization ID.");
-                        }
-                    }
-
-                    @Override
-                    public @NonNull TestEnum decode(int value) {
-                        switch (value) {
-                            case 1:
-                                return TestEnum.ONE;
-                            case 2:
-                                return TestEnum.TWO;
-                            default:
-                                return TestEnum.DEFAULT;
-                        }
-                    }
-                }
-            """.trimIndent())
-        /* ktlint-enable max-line-length */
-    }
-}
diff --git a/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/codegen/java/TestJavaGenerator.kt b/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/codegen/java/TestJavaGenerator.kt
deleted file mode 100644
index bc167e5..0000000
--- a/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/codegen/java/TestJavaGenerator.kt
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.serialization.compiler.codegen.java
-
-import com.squareup.javapoet.AnnotationSpec
-import com.squareup.javapoet.ClassName
-import javax.lang.model.SourceVersion
-import javax.lang.model.SourceVersion.RELEASE_8
-import kotlin.reflect.KClass
-
-internal fun testJavaGenerator(
-    generatingClass: KClass<*>,
-    sourceVersion: SourceVersion = SourceVersion.latest()
-): JavaGenerator {
-
-    val packageName = if (sourceVersion <= RELEASE_8) {
-        "javax.annotation.processing"
-    } else {
-        "javax.annotation"
-    }
-
-    val generatedAnnotation = AnnotationSpec.builder(ClassName.get(packageName, "Generated"))
-        .addMember("value", "\$S", generatingClass.java.canonicalName)
-        .build()
-
-    return JavaGenerator(sourceVersion, generatedAnnotation)
-}
diff --git a/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/processing/ProcessReservedTest.kt b/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/processing/parsers/ParseReservedTest.kt
similarity index 86%
rename from serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/processing/ProcessReservedTest.kt
rename to serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/processing/parsers/ParseReservedTest.kt
index af484b2d..b29c05a 100644
--- a/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/processing/ProcessReservedTest.kt
+++ b/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/processing/parsers/ParseReservedTest.kt
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
-package androidx.serialization.compiler.processing
+package androidx.serialization.compiler.processing.parsers
 
-import androidx.serialization.compiler.testTypeElement
+import androidx.serialization.compiler.processing.ext.asTypeElement
 import androidx.serialization.schema.Reserved
 import com.google.auto.common.BasicAnnotationProcessor
 import com.google.auto.common.BasicAnnotationProcessor.ProcessingStep
@@ -29,14 +29,8 @@
 import javax.lang.model.SourceVersion
 import javax.lang.model.element.Element
 
-/** Unit tests for [processReserved]. */
-class ProcessReservedTest {
-    @Test
-    fun testEmpty() {
-        val typeElement = testTypeElement("com.example", "Test")
-        assertThat(processReserved(typeElement)).isSameInstanceAs(Reserved.empty())
-    }
-
+/** Unit tests for [parseReserved]. */
+class ParseReservedTest {
     @Test
     fun testIds() {
         assertThat(compile("@Reserved(ids = {1, 2, 3})").ids).containsExactly(1, 2, 3)
@@ -60,7 +54,8 @@
     }
 
     private fun compile(reserved: String): Reserved {
-        val processor = ReservedProcessor()
+        val processor =
+            ReservedProcessor()
         val source = JavaFileObjects.forSourceString("TestClass", """
             import androidx.serialization.Reserved;
             
@@ -82,7 +77,7 @@
             elementsByAnnotation: SetMultimap<Class<out Annotation>, Element>
         ): Set<Element> {
             elementsByAnnotation[androidx.serialization.Reserved::class.java].forEach {
-                onReserved(processReserved(it.asTypeElement()))
+                onReserved(parseReserved(it.asTypeElement()))
             }
 
             return emptySet()
diff --git a/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/processing/steps/EnumProcessingStepTest.kt b/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/processing/steps/EnumProcessingStepTest.kt
index 28a6106..5662eb4 100644
--- a/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/processing/steps/EnumProcessingStepTest.kt
+++ b/serialization/serialization-compiler/src/test/kotlin/androidx/serialization/compiler/processing/steps/EnumProcessingStepTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.serialization.compiler.processing.steps
 
-import androidx.serialization.compiler.codegen.java.JavaGenerator
 import androidx.serialization.compiler.schema.Enum
 import androidx.serialization.schema.Reserved
 import com.google.auto.common.BasicAnnotationProcessor
@@ -124,26 +123,6 @@
                     "annotated with @EnumValue")
     }
 
-    @Test
-    fun testSerializerGeneration() {
-        val testEnum = JavaFileObjects.forSourceString("com.example.Test", """
-            package com.example;
-            import androidx.serialization.EnumValue;
-            
-            public enum Test {
-                @EnumValue(EnumValue.DEFAULT)
-                DEFAULT,
-                @EnumValue(1)
-                ONE,
-                @EnumValue(2)
-                TWO
-            }
-        """.trimIndent())
-
-        assertThat(compile(testEnum))
-            .generatedSourceFile("com.example.TestSerializer")
-    }
-
     private fun compile(vararg sources: JavaFileObject): Compilation {
         return javac().withProcessors(SchemaCompilationProcessor()).compile(*sources)
     }
@@ -160,8 +139,7 @@
         lateinit var enum: Enum
 
         override fun initSteps(): List<ProcessingStep> {
-            val javaGenerator = JavaGenerator(processingEnv, this::class.java.canonicalName)
-            return listOf(EnumProcessingStep(processingEnv, javaGenerator) { enum = it })
+            return listOf(EnumProcessingStep(processingEnv) { enum = it })
     }
 
         override fun getSupportedSourceVersion(): SourceVersion {
diff --git a/settings.gradle b/settings.gradle
index 7b5cb83..0a36247 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -34,7 +34,11 @@
         file = filePath
     }
     if (!file.exists()) {
-        throw new Exception("Path " + file + " does not exist; cannot include project " + name)
+        // This option is supported so that development/simplify_build_failure.sh can try
+        // deleting entire projects at once to identify the cause of a build failure
+        if (System.getenv("ALLOW_MISSING_PROJECTS") == null) {
+            throw new Exception("Path " + file + " does not exist; cannot include project " + name)
+        }
     }
     project(name).projectDir = file
 }
@@ -133,6 +137,9 @@
 includeProject(":fakeannotations", "fakeannotations")
 includeProject(":gridlayout:gridlayout", "gridlayout/gridlayout")
 includeProject(":heifwriter:heifwriter", "heifwriter/heifwriter")
+includeProject(":hilt:hilt-common", "hilt/common")
+includeProject(":hilt:hilt-compiler", "hilt/compiler")
+includeProject(":hilt:hilt-lifecycle-viewmodel", "hilt/lifecycle-viewmodel")
 includeProject(":hilt:integration-tests:hilt-testapp-viewmodel", "hilt/integration-tests/viewmodelapp")
 includeProject(":inspection:inspection", "inspection/inspection")
 includeProject(":inspection:inspection-gradle-plugin", "inspection/inspection-gradle-plugin")
@@ -168,9 +175,6 @@
 includeProject(":lifecycle:lifecycle-runtime-testing", "lifecycle/lifecycle-runtime-testing")
 includeProject(":lifecycle:lifecycle-service", "lifecycle/lifecycle-service")
 includeProject(":lifecycle:lifecycle-viewmodel", "lifecycle/lifecycle-viewmodel")
-includeProject(":lifecycle:lifecycle-viewmodel-hilt", "lifecycle/lifecycle-viewmodel-hilt")
-includeProject(":lifecycle:lifecycle-viewmodel-hilt-common", "lifecycle/lifecycle-viewmodel-hilt-common")
-includeProject(":lifecycle:lifecycle-viewmodel-hilt-compiler", "lifecycle/lifecycle-viewmodel-hilt-compiler")
 includeProject(":lifecycle:lifecycle-viewmodel-ktx", "lifecycle/lifecycle-viewmodel-ktx")
 includeProject(":lifecycle:lifecycle-viewmodel-savedstate","lifecycle/lifecycle-viewmodel-savedstate")
 includeProject(":lint-demos:lint-demo-appcompat", "lint-demos/lint-demo-appcompat")
diff --git a/slices/benchmark/build.gradle b/slices/benchmark/build.gradle
index f7cb0db..19510e2 100644
--- a/slices/benchmark/build.gradle
+++ b/slices/benchmark/build.gradle
@@ -25,7 +25,7 @@
 }
 
 dependencies {
-    androidTestImplementation(project(":core:core"))
+    androidTestImplementation("androidx.core:core:1.3.0-beta01")
     androidTestImplementation(project(":slice-view"))
     androidTestImplementation(project(":slice-core"))
     androidTestImplementation(project(":slice-builders"))
diff --git a/slices/builders/ktx/build.gradle b/slices/builders/ktx/build.gradle
index 80e9003..59d222a 100644
--- a/slices/builders/ktx/build.gradle
+++ b/slices/builders/ktx/build.gradle
@@ -40,7 +40,7 @@
 dependencies {
     implementation(project(":slice-core"))
     api "androidx.annotation:annotation:1.1.0"
-    implementation(project(":core:core"))
+    implementation("androidx.core:core:1.3.0-beta01")
     api(project(":slice-builders"))
     api(KOTLIN_STDLIB)
 
diff --git a/slices/core/src/main/java/androidx/slice/compat/SliceProviderCompat.java b/slices/core/src/main/java/androidx/slice/compat/SliceProviderCompat.java
index 1c835bc..f8f0f32 100644
--- a/slices/core/src/main/java/androidx/slice/compat/SliceProviderCompat.java
+++ b/slices/core/src/main/java/androidx/slice/compat/SliceProviderCompat.java
@@ -22,6 +22,7 @@
 import static androidx.core.content.PermissionChecker.PERMISSION_DENIED;
 import static androidx.core.content.PermissionChecker.PERMISSION_GRANTED;
 
+import android.annotation.SuppressLint;
 import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -431,6 +432,7 @@
         }
     }
 
+    @SuppressLint("WrongConstant") // Needed for IconCompat.TYPE_RESOURCE lint failure
     private static Slice parseSlice(final Context context, Bundle res) {
         if (res == null) {
             return null;
diff --git a/test/screenshot/src/main/java/androidx/test/screenshot/ScreenshotTestRule.kt b/test/screenshot/src/main/java/androidx/test/screenshot/ScreenshotTestRule.kt
index 1db0b01..8b788d8 100644
--- a/test/screenshot/src/main/java/androidx/test/screenshot/ScreenshotTestRule.kt
+++ b/test/screenshot/src/main/java/androidx/test/screenshot/ScreenshotTestRule.kt
@@ -110,6 +110,7 @@
         override fun evaluate() {
             // We currently only support Cuttlefish API 29 because of the storage access.
             Assume.assumeTrue(Build.MODEL.contains("Cuttlefish"))
+            Assume.assumeTrue(Build.VERSION.SDK_INT == 29)
             base.evaluate()
         }
     }
diff --git a/tracing/tracing-ktx/api/1.0.0-alpha01.txt b/tracing/tracing-ktx/api/1.0.0-alpha01.txt
index e4ca3ba..8227d8b 100644
--- a/tracing/tracing-ktx/api/1.0.0-alpha01.txt
+++ b/tracing/tracing-ktx/api/1.0.0-alpha01.txt
@@ -3,7 +3,7 @@
 
   public final class TraceKt {
     method public static inline <T> T! trace(String label, kotlin.jvm.functions.Function0<? extends T> block);
-    method public static suspend <T> Object! traceAsync(String methodName, int cookie, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T> p);
+    method public static suspend inline <T> Object! traceAsync(String methodName, int cookie, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>! p);
   }
 
 }
diff --git a/tracing/tracing-ktx/api/api_lint.ignore b/tracing/tracing-ktx/api/api_lint.ignore
new file mode 100644
index 0000000..7255b7a
--- /dev/null
+++ b/tracing/tracing-ktx/api/api_lint.ignore
@@ -0,0 +1,5 @@
+// Baseline format: 1.0
+MissingNullability: androidx.tracing.TraceKt#traceAsync(String, int, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super T>,?>, kotlin.coroutines.Continuation<? super T>):
+    Missing nullability on method `traceAsync` return
+MissingNullability: androidx.tracing.TraceKt#traceAsync(String, int, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super T>,?>, kotlin.coroutines.Continuation<? super T>) parameter #3:
+    Missing nullability on parameter `p` in method `traceAsync`
diff --git a/tracing/tracing-ktx/api/current.txt b/tracing/tracing-ktx/api/current.txt
index e4ca3ba..8227d8b 100644
--- a/tracing/tracing-ktx/api/current.txt
+++ b/tracing/tracing-ktx/api/current.txt
@@ -3,7 +3,7 @@
 
   public final class TraceKt {
     method public static inline <T> T! trace(String label, kotlin.jvm.functions.Function0<? extends T> block);
-    method public static suspend <T> Object! traceAsync(String methodName, int cookie, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T> p);
+    method public static suspend inline <T> Object! traceAsync(String methodName, int cookie, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>! p);
   }
 
 }
diff --git a/tracing/tracing-ktx/api/public_plus_experimental_1.0.0-alpha01.txt b/tracing/tracing-ktx/api/public_plus_experimental_1.0.0-alpha01.txt
index e4ca3ba..8227d8b 100644
--- a/tracing/tracing-ktx/api/public_plus_experimental_1.0.0-alpha01.txt
+++ b/tracing/tracing-ktx/api/public_plus_experimental_1.0.0-alpha01.txt
@@ -3,7 +3,7 @@
 
   public final class TraceKt {
     method public static inline <T> T! trace(String label, kotlin.jvm.functions.Function0<? extends T> block);
-    method public static suspend <T> Object! traceAsync(String methodName, int cookie, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T> p);
+    method public static suspend inline <T> Object! traceAsync(String methodName, int cookie, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>! p);
   }
 
 }
diff --git a/tracing/tracing-ktx/api/public_plus_experimental_current.txt b/tracing/tracing-ktx/api/public_plus_experimental_current.txt
index e4ca3ba..8227d8b 100644
--- a/tracing/tracing-ktx/api/public_plus_experimental_current.txt
+++ b/tracing/tracing-ktx/api/public_plus_experimental_current.txt
@@ -3,7 +3,7 @@
 
   public final class TraceKt {
     method public static inline <T> T! trace(String label, kotlin.jvm.functions.Function0<? extends T> block);
-    method public static suspend <T> Object! traceAsync(String methodName, int cookie, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T> p);
+    method public static suspend inline <T> Object! traceAsync(String methodName, int cookie, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>! p);
   }
 
 }
diff --git a/tracing/tracing-ktx/api/restricted_1.0.0-alpha01.txt b/tracing/tracing-ktx/api/restricted_1.0.0-alpha01.txt
index e4ca3ba..8227d8b 100644
--- a/tracing/tracing-ktx/api/restricted_1.0.0-alpha01.txt
+++ b/tracing/tracing-ktx/api/restricted_1.0.0-alpha01.txt
@@ -3,7 +3,7 @@
 
   public final class TraceKt {
     method public static inline <T> T! trace(String label, kotlin.jvm.functions.Function0<? extends T> block);
-    method public static suspend <T> Object! traceAsync(String methodName, int cookie, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T> p);
+    method public static suspend inline <T> Object! traceAsync(String methodName, int cookie, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>! p);
   }
 
 }
diff --git a/tracing/tracing-ktx/api/restricted_current.txt b/tracing/tracing-ktx/api/restricted_current.txt
index e4ca3ba..8227d8b 100644
--- a/tracing/tracing-ktx/api/restricted_current.txt
+++ b/tracing/tracing-ktx/api/restricted_current.txt
@@ -3,7 +3,7 @@
 
   public final class TraceKt {
     method public static inline <T> T! trace(String label, kotlin.jvm.functions.Function0<? extends T> block);
-    method public static suspend <T> Object! traceAsync(String methodName, int cookie, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T> p);
+    method public static suspend inline <T> Object! traceAsync(String methodName, int cookie, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>! p);
   }
 
 }
diff --git a/tracing/tracing-ktx/src/main/java/androidx/tracing/Trace.kt b/tracing/tracing-ktx/src/main/java/androidx/tracing/Trace.kt
index fa97bbd..a5b0ab2 100644
--- a/tracing/tracing-ktx/src/main/java/androidx/tracing/Trace.kt
+++ b/tracing/tracing-ktx/src/main/java/androidx/tracing/Trace.kt
@@ -16,8 +16,6 @@
 
 package androidx.tracing
 
-import android.annotation.SuppressLint
-
 /**
  * Wrap the specified [block] in calls to [Trace.beginSection] (with the supplied [label])
  * and [Trace.endSection].
@@ -41,8 +39,11 @@
  * @param methodName The method name to appear in the trace.
  * @param cookie Unique identifier for distinguishing simultaneous events
  */
-@SuppressLint("MissingNullability") // b/152801955
-suspend fun <T> traceAsync(methodName: String, cookie: Int, block: suspend () -> T): T {
+suspend inline fun <T> traceAsync(
+    methodName: String,
+    cookie: Int,
+    crossinline block: suspend () -> T
+): T {
     try {
         Trace.beginAsyncSection(methodName, cookie)
         return block()
diff --git a/ui/README.md b/ui/README.md
index aafcf5c..4b4c429 100644
--- a/ui/README.md
+++ b/ui/README.md
@@ -40,9 +40,6 @@
 Library code for Jetpack Compose lives under the `frameworks/support/ui` directory. Additionally, sample code can be found within each module in the `integration-tests` subdirectories and the compiler and runtime code can be found in `frameworks/support/compose`.
 
 The modules within UI are structured as follows:
-* `ui-android-text/`
-
-   Android specific text stack dependent implementations
 * `ui-android-view/`
 
    Wrappers and adapters for existing Android Views
@@ -75,7 +72,13 @@
    Testing framework
 * `ui-text/`
 
-   Text engine
+   Base Text composables
+* `ui-text-core/`
+
+   Text engine that contains base text components
+* `ui-text-android/`
+
+   Android specific text stack dependent implementations
 
 ## Feedback
 To provide feedback or report bugs, please refer to the main [AndroidX contribution guide](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/README.md) and report your bugs [here](https://issuetracker.google.com/issues/new?component=612128)
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 7243f75..34fc367 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
@@ -193,7 +193,7 @@
 }
 
 @Composable
-fun FillerContainer(modifier: Modifier = Modifier.None, children: @Composable() () -> Unit) {
+fun FillerContainer(modifier: Modifier = Modifier, children: @Composable() () -> Unit) {
     Layout(children, modifier) { measurable, constraints, _ ->
         val childConstraints = constraints.copy(minWidth = 0.ipx, minHeight = 0.ipx)
         val placeable = measurable.firstOrNull()?.measure(childConstraints)
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/autofill/AndroidAutofillBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/autofill/AndroidAutofillBenchmark.kt
index e834a86..af0c5cd 100644
--- a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/autofill/AndroidAutofillBenchmark.kt
+++ b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/autofill/AndroidAutofillBenchmark.kt
@@ -16,10 +16,10 @@
 
 package androidx.ui.benchmark.test.autofill
 
-import android.app.Activity
 import android.graphics.Rect
 import android.util.SparseArray
 import android.view.autofill.AutofillValue
+import androidx.activity.ComponentActivity
 import androidx.benchmark.junit4.BenchmarkRule
 import androidx.benchmark.junit4.measureRepeated
 import androidx.test.annotation.UiThreadTest
@@ -41,7 +41,7 @@
 class AndroidAutofillBenchmark {
 
     @get:Rule
-    val activityRule = ActivityTestRule(Activity::class.java)
+    val activityRule = ActivityTestRule(ComponentActivity::class.java)
 
     @get:Rule
     val benchmarkRule = BenchmarkRule()
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/core/OnPositionedBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/core/OnPositionedBenchmark.kt
index 2a313d4..b1352e5 100644
--- a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/core/OnPositionedBenchmark.kt
+++ b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/core/OnPositionedBenchmark.kt
@@ -72,7 +72,7 @@
             val modifier = if (count == 1) {
                 Modifier.onPositioned { it.size }
             } else {
-                Modifier.None
+                Modifier
             }
             Box(Modifier.preferredSize(100.dp) + modifier, gravity = ContentGravity.Center) {
                 StaticChildren(count - 1)
diff --git a/ui/integration-tests/benchmark/src/main/AndroidManifest.xml b/ui/integration-tests/benchmark/src/main/AndroidManifest.xml
index 8504493..d85c4ca 100644
--- a/ui/integration-tests/benchmark/src/main/AndroidManifest.xml
+++ b/ui/integration-tests/benchmark/src/main/AndroidManifest.xml
@@ -19,7 +19,7 @@
 
     <application>
         <activity
-            android:name="android.app.Activity"
+            android:name="androidx.activity.ComponentActivity"
             android:theme="@style/TestTheme" />
     </application>
 </manifest>
diff --git a/ui/integration-tests/benchmark/src/main/java/androidx/ui/benchmark/AndroidBenchmarkRule.kt b/ui/integration-tests/benchmark/src/main/java/androidx/ui/benchmark/AndroidBenchmarkRule.kt
index 7827058..74e44d3 100644
--- a/ui/integration-tests/benchmark/src/main/java/androidx/ui/benchmark/AndroidBenchmarkRule.kt
+++ b/ui/integration-tests/benchmark/src/main/java/androidx/ui/benchmark/AndroidBenchmarkRule.kt
@@ -16,7 +16,7 @@
 
 package androidx.ui.benchmark
 
-import android.app.Activity
+import androidx.activity.ComponentActivity
 import androidx.benchmark.junit4.BenchmarkRule
 import androidx.benchmark.junit4.measureRepeated
 import androidx.test.rule.ActivityTestRule
@@ -33,8 +33,8 @@
 class AndroidBenchmarkRule : TestRule {
 
     private val activityTestRule =
-        ActivityTestRule<Activity>(
-            Activity::class.java
+        ActivityTestRule<ComponentActivity>(
+            ComponentActivity::class.java
         )
 
     val benchmarkRule = BenchmarkRule()
diff --git a/ui/integration-tests/benchmark/src/main/java/androidx/ui/benchmark/ComposeBenchmarkRule.kt b/ui/integration-tests/benchmark/src/main/java/androidx/ui/benchmark/ComposeBenchmarkRule.kt
index b351717..5fb2a75 100644
--- a/ui/integration-tests/benchmark/src/main/java/androidx/ui/benchmark/ComposeBenchmarkRule.kt
+++ b/ui/integration-tests/benchmark/src/main/java/androidx/ui/benchmark/ComposeBenchmarkRule.kt
@@ -16,7 +16,7 @@
 
 package androidx.ui.benchmark
 
-import android.app.Activity
+import androidx.activity.ComponentActivity
 import androidx.benchmark.junit4.BenchmarkRule
 import androidx.benchmark.junit4.measureRepeated
 import androidx.test.rule.ActivityTestRule
@@ -37,7 +37,8 @@
     private val enableTransitions: Boolean = false
 ) : TestRule {
 
-    private val activityTestRule = ActivityTestRule<Activity>(Activity::class.java)
+    private val activityTestRule =
+        ActivityTestRule<ComponentActivity>(ComponentActivity::class.java)
 
     val benchmarkRule = BenchmarkRule()
 
diff --git a/ui/integration-tests/demos/build.gradle b/ui/integration-tests/demos/build.gradle
index 2fb2e4b..121ec74 100644
--- a/ui/integration-tests/demos/build.gradle
+++ b/ui/integration-tests/demos/build.gradle
@@ -19,7 +19,7 @@
     implementation(project(":ui:ui-layout:integration-tests:ui-layout-demos"))
     implementation(project(":ui:ui-material:integration-tests:ui-material-demos"))
     implementation(project(":ui:ui-material:integration-tests:ui-material-studies"))
-    implementation(project(":ui:ui-text:integration-tests:ui-text-demos"))
+    implementation(project(":ui:ui-text-core:integration-tests:ui-text-demos"))
 
     implementation(KOTLIN_REFLECT)
     implementation(KOTLIN_STDLIB)
@@ -30,7 +30,7 @@
     implementation project(":ui:ui-foundation")
     implementation project(":ui:ui-framework")
     implementation project(":ui:ui-layout")
-    implementation project(":ui:ui-text")
+    implementation project(":ui:ui-text-core")
     implementation project(":ui:ui-foundation")
     implementation project(":ui:ui-material")
     implementation project(":ui:integration-tests:demos:common")
diff --git a/ui/integration-tests/demos/common/build.gradle b/ui/integration-tests/demos/common/build.gradle
index 98bf64f..456f301 100644
--- a/ui/integration-tests/demos/common/build.gradle
+++ b/ui/integration-tests/demos/common/build.gradle
@@ -29,6 +29,7 @@
     kotlinPlugin project(path: ":compose:compose-compiler")
     implementation(KOTLIN_STDLIB)
 
+    api "androidx.activity:activity:1.2.0-alpha02"
     implementation project(":compose:compose-runtime")
 }
 
diff --git a/ui/integration-tests/demos/common/src/main/java/androidx/ui/demos/common/Demo.kt b/ui/integration-tests/demos/common/src/main/java/androidx/ui/demos/common/Demo.kt
index e2842d2..1293289 100644
--- a/ui/integration-tests/demos/common/src/main/java/androidx/ui/demos/common/Demo.kt
+++ b/ui/integration-tests/demos/common/src/main/java/androidx/ui/demos/common/Demo.kt
@@ -17,6 +17,7 @@
 package androidx.ui.demos.common
 
 import android.app.Activity
+import androidx.activity.ComponentActivity
 import androidx.compose.Composable
 import kotlin.reflect.KClass
 
@@ -34,7 +35,7 @@
  * @property activityClass the KClass (Foo::class) of the activity that will be launched when
  * this demo is selected.
  */
-class ActivityDemo <T : Activity> (title: String, val activityClass: KClass<T>) : Demo(title)
+class ActivityDemo<T : ComponentActivity>(title: String, val activityClass: KClass<T>) : Demo(title)
 
 /**
  * Demo that displays [Composable] [content] when selected.
diff --git a/ui/integration-tests/demos/src/main/java/androidx/ui/demos/DemoFilter.kt b/ui/integration-tests/demos/src/main/java/androidx/ui/demos/DemoFilter.kt
index 94c4cab..99386e3 100644
--- a/ui/integration-tests/demos/src/main/java/androidx/ui/demos/DemoFilter.kt
+++ b/ui/integration-tests/demos/src/main/java/androidx/ui/demos/DemoFilter.kt
@@ -99,7 +99,7 @@
 private fun FilterField(
     filterText: TextFieldValue,
     onFilter: (TextFieldValue) -> Unit,
-    modifier: Modifier = Modifier.None
+    modifier: Modifier = Modifier
 ) {
     val identifier = "filter"
     val manager = FocusManagerAmbient.current
diff --git a/ui/integration-tests/demos/src/main/java/androidx/ui/demos/DemoSettingsActivity.kt b/ui/integration-tests/demos/src/main/java/androidx/ui/demos/DemoSettingsActivity.kt
index 51fab10..c7f883d 100644
--- a/ui/integration-tests/demos/src/main/java/androidx/ui/demos/DemoSettingsActivity.kt
+++ b/ui/integration-tests/demos/src/main/java/androidx/ui/demos/DemoSettingsActivity.kt
@@ -60,7 +60,7 @@
                 title = "Shuffle all colors"
                 onPreferenceClickListener = Preference.OnPreferenceClickListener {
                     generateRandomPalette().saveColors(context)
-                    activity!!.finish()
+                    requireActivity().finish()
                     true
                 }
             }
@@ -70,7 +70,7 @@
                 onPreferenceClickListener = Preference.OnPreferenceClickListener {
                     val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
                     sharedPreferences.edit().clear().apply()
-                    activity!!.finish()
+                    requireActivity().finish()
                     true
                 }
             }
diff --git a/ui/integration-tests/test/src/main/java/androidx/ui/integration/test/core/text/TextBasicTestCase.kt b/ui/integration-tests/test/src/main/java/androidx/ui/integration/test/core/text/TextBasicTestCase.kt
index 05025d0..809c06f 100644
--- a/ui/integration-tests/test/src/main/java/androidx/ui/integration/test/core/text/TextBasicTestCase.kt
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/integration/test/core/text/TextBasicTestCase.kt
@@ -50,7 +50,7 @@
     @Composable
     override fun emitContent() {
         Text(
-            text = text, style = TextStyle(color = Color.Black, fontSize = 8.sp),
+            text = text, color = Color.Black, style = TextStyle(fontSize = 8.sp),
             modifier = Modifier.wrapContentSize(Alignment.Center).preferredWidth(160.dp)
         )
     }
diff --git a/ui/integration-tests/test/src/main/java/androidx/ui/integration/test/core/text/TextMultiStyleTestCase.kt b/ui/integration-tests/test/src/main/java/androidx/ui/integration/test/core/text/TextMultiStyleTestCase.kt
index 2593ecc..2550f14 100644
--- a/ui/integration-tests/test/src/main/java/androidx/ui/integration/test/core/text/TextMultiStyleTestCase.kt
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/integration/test/core/text/TextMultiStyleTestCase.kt
@@ -53,7 +53,7 @@
     @Composable
     override fun emitContent() {
         Text(
-            text = text, style = TextStyle(color = Color.Black, fontSize = 8.sp),
+            text = text, color = Color.Black, style = TextStyle(fontSize = 8.sp),
             modifier = Modifier.wrapContentSize(Alignment.Center).preferredWidth(160.dp)
         )
     }
diff --git a/ui/integration-tests/test/src/main/java/androidx/ui/integration/test/foundation/NestedScrollerTestCase.kt b/ui/integration-tests/test/src/main/java/androidx/ui/integration/test/foundation/NestedScrollerTestCase.kt
index 4b40422..5ac6a90 100644
--- a/ui/integration-tests/test/src/main/java/androidx/ui/integration/test/foundation/NestedScrollerTestCase.kt
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/integration/test/foundation/NestedScrollerTestCase.kt
@@ -85,7 +85,8 @@
                             Box(Modifier.preferredSize(350.px.toDp()).drawBackground(color))
                             Text(
                                 text = "Some title",
-                                style = TextStyle(Color.Black, 60.px.toSp())
+                                color = Color.Black,
+                                style = TextStyle(fontSize = 60.px.toSp())
                             )
                             Row(Modifier.fillMaxWidth()) {
                                 Text(
diff --git a/ui/integration-tests/test/src/main/java/androidx/ui/integration/test/material/CheckboxesInRowsTestCase.kt b/ui/integration-tests/test/src/main/java/androidx/ui/integration/test/material/CheckboxesInRowsTestCase.kt
index 02841f5..893a89a 100644
--- a/ui/integration-tests/test/src/main/java/androidx/ui/integration/test/material/CheckboxesInRowsTestCase.kt
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/integration/test/material/CheckboxesInRowsTestCase.kt
@@ -65,7 +65,7 @@
     }
 
     @Composable
-    fun CheckboxWithState(modifier: Modifier = Modifier.None) {
+    fun CheckboxWithState(modifier: Modifier = Modifier) {
         val state = state { false }
         states.add(state)
         Checkbox(
diff --git a/ui/settings.gradle b/ui/settings.gradle
index d11a5e66..aeb885f 100644
--- a/ui/settings.gradle
+++ b/ui/settings.gradle
@@ -49,7 +49,7 @@
 includeProject(":ui:integration-tests:demos", "integration-tests/demos")
 includeProject(":ui:integration-tests:demos:common", "integration-tests/demos/common")
 includeProject(":ui:integration-tests:test", "integration-tests/test")
-includeProject(":ui:ui-android-text", "ui-android-text")
+includeProject(":ui:ui-text-android", "ui-text-android")
 includeProject(":ui:ui-android-view", "ui-android-view")
 includeProject(":ui:ui-android-view:integration-tests:ui-android-view-demos", "ui-android-view/integration-tests/android-view-demos")
 includeProject(":ui:ui-android-view:samples", "ui-android-view/samples")
@@ -69,6 +69,7 @@
 includeProject(":ui:ui-internal-lint-checks", "ui-internal-lint-checks")
 includeProject(":ui:ui-geometry", "ui-geometry")
 includeProject(":ui:ui-graphics", "ui-graphics")
+includeProject(":ui:ui-graphics:samples", "ui-graphics/samples")
 includeProject(":ui:ui-layout", "ui-layout")
 includeProject(":ui:ui-layout:integration-tests:ui-layout-demos", "ui-layout/integration-tests/layout-demos")
 includeProject(":ui:ui-layout:samples", "ui-layout/samples")
@@ -83,9 +84,11 @@
 includeProject(":ui:ui-platform", "ui-platform")
 includeProject(":ui:ui-platform:samples", "ui-platform/samples")
 includeProject(":ui:ui-test", "ui-test")
+includeProject(":ui:ui-test-font", "ui-test-font")
 includeProject(":ui:ui-text", "ui-text")
-includeProject(":ui:ui-text:integration-tests:ui-text-demos", "ui-text/integration-tests/text-demos")
-includeProject(":ui:ui-text:samples", "ui-text/samples")
+includeProject(":ui:ui-text-core", "ui-text-core")
+includeProject(":ui:ui-text-core:integration-tests:ui-text-demos", "ui-text-core/integration-tests/text-demos")
+includeProject(":ui:ui-text-core:samples", "ui-text-core/samples")
 includeProject(":ui:ui-tooling", "ui-tooling")
 includeProject(":ui:ui-unit", "ui-unit")
 includeProject(":ui:ui-unit:samples", "ui-unit/samples")
diff --git a/ui/ui-android-text/api/res-0.1.0-dev01.txt b/ui/ui-android-text/api/res-0.1.0-dev01.txt
deleted file mode 100644
index e69de29..0000000
--- a/ui/ui-android-text/api/res-0.1.0-dev01.txt
+++ /dev/null
diff --git a/ui/ui-android-text/api/res-0.1.0-dev02.txt b/ui/ui-android-text/api/res-0.1.0-dev02.txt
deleted file mode 100644
index e69de29..0000000
--- a/ui/ui-android-text/api/res-0.1.0-dev02.txt
+++ /dev/null
diff --git a/ui/ui-android-text/api/res-0.1.0-dev06.txt b/ui/ui-android-text/api/res-0.1.0-dev06.txt
deleted file mode 100644
index e69de29..0000000
--- a/ui/ui-android-text/api/res-0.1.0-dev06.txt
+++ /dev/null
diff --git a/ui/ui-android-text/api/res-0.1.0-dev07.txt b/ui/ui-android-text/api/res-0.1.0-dev07.txt
deleted file mode 100644
index e69de29..0000000
--- a/ui/ui-android-text/api/res-0.1.0-dev07.txt
+++ /dev/null
diff --git a/ui/ui-android-text/api/res-0.1.0-dev08.txt b/ui/ui-android-text/api/res-0.1.0-dev08.txt
deleted file mode 100644
index e69de29..0000000
--- a/ui/ui-android-text/api/res-0.1.0-dev08.txt
+++ /dev/null
diff --git a/ui/ui-android-text/src/androidTest/assets/sample_font.ttf b/ui/ui-android-text/src/androidTest/assets/sample_font.ttf
deleted file mode 100644
index da7301a..0000000
--- a/ui/ui-android-text/src/androidTest/assets/sample_font.ttf
+++ /dev/null
Binary files differ
diff --git a/ui/ui-android-text/src/androidTest/assets/sample_font.ttx b/ui/ui-android-text/src/androidTest/assets/sample_font.ttx
deleted file mode 100644
index 95d0619..0000000
--- a/ui/ui-android-text/src/androidTest/assets/sample_font.ttx
+++ /dev/null
@@ -1,318 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0">
-
-  <GlyphOrder>
-    <GlyphID id="0" name=".notdef"/>
-    <GlyphID id="1" name="1em"/>
-    <GlyphID id="2" name="1em_rtl"/>
-    <GlyphID id="3" name="space"/>
-    <GlyphID id="4" name="hyphen"/>
-    <GlyphID id="5" name="linefeed"/>
-  </GlyphOrder>
-
-  <head>
-    <tableVersion value="1.0"/>
-    <fontRevision value="1.0"/>
-    <checkSumAdjustment value="0x640cdb2f"/>
-    <magicNumber value="0x5f0f3cf5"/>
-    <flags value="00000000 00000011"/>
-    <unitsPerEm value="1000"/>
-    <created value="Thu Feb 15 18:29:10 2018"/>
-    <modified value="Sun Oct 14 06:29:17 2018"/>
-    <xMin value="0"/>
-    <yMin value="-200"/>
-    <xMax value="1000"/>
-    <yMax value="800"/>
-    <macStyle value="00000000 00000000"/>
-    <lowestRecPPEM value="7"/>
-    <fontDirectionHint value="2"/>
-    <glyphDataFormat value="0"/>
-  </head>
-
-  <hhea>
-    <tableVersion value="0x00010000"/>
-    <ascent value="1000"/>
-    <descent value="-200"/>
-    <lineGap value="0"/>
-    <advanceWidthMax value="1000"/>
-    <minLeftSideBearing value="0"/>
-    <minRightSideBearing value="0"/>
-    <xMaxExtent value="1000"/>
-    <caretSlopeRise value="1"/>
-    <caretSlopeRun value="0"/>
-    <caretOffset value="0"/>
-    <reserved0 value="0"/>
-    <reserved1 value="0"/>
-    <reserved2 value="0"/>
-    <reserved3 value="0"/>
-    <metricDataFormat value="0"/>
-  </hhea>
-
-  <maxp>
-    <tableVersion value="0x10000"/>
-    <maxZones value="0"/>
-    <maxTwilightPoints value="0"/>
-    <maxStorage value="0"/>
-    <maxFunctionDefs value="0"/>
-    <maxInstructionDefs value="0"/>
-    <maxStackElements value="0"/>
-    <maxSizeOfInstructions value="0"/>
-    <maxComponentElements value="0"/>
-  </maxp>
-
-  <OS_2>
-    <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
-         will be recalculated by the compiler -->
-    <version value="3"/>
-    <xAvgCharWidth value="594"/>
-    <usWeightClass value="100"/>
-    <usWidthClass value="5"/>
-    <fsType value="00000000 00001000"/>
-    <ySubscriptXSize value="650"/>
-    <ySubscriptYSize value="600"/>
-    <ySubscriptXOffset value="0"/>
-    <ySubscriptYOffset value="75"/>
-    <ySuperscriptXSize value="650"/>
-    <ySuperscriptYSize value="600"/>
-    <ySuperscriptXOffset value="0"/>
-    <ySuperscriptYOffset value="350"/>
-    <yStrikeoutSize value="50"/>
-    <yStrikeoutPosition value="300"/>
-    <sFamilyClass value="0"/>
-    <panose>
-      <bFamilyType value="0"/>
-      <bSerifStyle value="0"/>
-      <bWeight value="5"/>
-      <bProportion value="0"/>
-      <bContrast value="0"/>
-      <bStrokeVariation value="0"/>
-      <bArmStyle value="0"/>
-      <bLetterForm value="0"/>
-      <bMidline value="0"/>
-      <bXHeight value="0"/>
-    </panose>
-    <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
-    <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
-    <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
-    <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
-    <achVendID value="UKWN"/>
-    <fsSelection value="00000000 01000000"/>
-    <usFirstCharIndex value="9"/>
-    <usLastCharIndex value="122"/>
-    <sTypoAscender value="800"/>
-    <sTypoDescender value="-200"/>
-    <sTypoLineGap value="200"/>
-    <usWinAscent value="1000"/>
-    <usWinDescent value="200"/>
-    <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
-    <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
-    <sxHeight value="500"/>
-    <sCapHeight value="700"/>
-    <usDefaultChar value="0"/>
-    <usBreakChar value="32"/>
-    <usMaxContext value="0"/>
-  </OS_2>
-
-  <hmtx>
-    <mtx name=".notdef" width="500" lsb="93"/>
-    <mtx name="1em" width="1000" lsb="0"/>
-    <mtx name="1em_rtl" width="1000" lsb="0"/>
-    <mtx name="space" width="1000" lsb="0"/>
-    <mtx name="hyphen" width="1000" lsb="0"/>
-    <mtx name="linefeed" width="500" lsb="0"/>
-  </hmtx>
-
-  <cmap>
-    <tableVersion version="0"/>
-    <cmap_format_4 platformID="3" platEncID="10" language="0">
-        <map code="0x0009" name="1em" /> <!-- TAB -->
-        <map code="0x000A" name="linefeed" /> <!-- LINEFEED -->
-        <map code="0x0020" name="space" /> <!-- SPACE -->
-        <map code="0x002C" name="1em" /> <!-- , -->
-        <map code="0x002D" name="hyphen" /> <!-- - -->
-        <map code="0x002E" name="1em" /> <!-- . -->
-        <map code="0x0041" name="1em" /> <!-- A -->
-        <map code="0x0042" name="1em" /> <!-- B -->
-        <map code="0x0043" name="1em" /> <!-- C -->
-        <map code="0x0044" name="1em" /> <!-- D -->
-        <map code="0x0045" name="1em" /> <!-- E -->
-        <map code="0x0046" name="1em" /> <!-- F -->
-        <map code="0x0047" name="1em" /> <!-- G -->
-        <map code="0x0048" name="1em" /> <!-- H -->
-        <map code="0x0049" name="1em" /> <!-- I -->
-        <map code="0x004A" name="1em" /> <!-- J -->
-        <map code="0x004B" name="1em" /> <!-- K -->
-        <map code="0x004C" name="1em" /> <!-- L -->
-        <map code="0x004D" name="1em" /> <!-- M -->
-        <map code="0x004E" name="1em" /> <!-- N -->
-        <map code="0x004F" name="1em" /> <!-- O -->
-        <map code="0x0050" name="1em" /> <!-- P -->
-        <map code="0x0051" name="1em" /> <!-- Q -->
-        <map code="0x0052" name="1em" /> <!-- R -->
-        <map code="0x0053" name="1em" /> <!-- S -->
-        <map code="0x0054" name="1em" /> <!-- T -->
-        <map code="0x0055" name="1em" /> <!-- U -->
-        <map code="0x0056" name="1em" /> <!-- V -->
-        <map code="0x0057" name="1em" /> <!-- W -->
-        <map code="0x0058" name="1em" /> <!-- X -->
-        <map code="0x0059" name="1em" /> <!-- Y -->
-        <map code="0x005A" name="1em" /> <!-- Z -->
-        <map code="0x0061" name="1em" /> <!-- a -->
-        <map code="0x0062" name="1em" /> <!-- b -->
-        <map code="0x0063" name="1em" /> <!-- c -->
-        <map code="0x0064" name="1em" /> <!-- d -->
-        <map code="0x0065" name="1em" /> <!-- e -->
-        <map code="0x0066" name="1em" /> <!-- f -->
-        <map code="0x0067" name="1em" /> <!-- g -->
-        <map code="0x0068" name="1em" /> <!-- h -->
-        <map code="0x0069" name="1em" /> <!-- i -->
-        <map code="0x006A" name="1em" /> <!-- j -->
-        <map code="0x006B" name="1em" /> <!-- k -->
-        <map code="0x006C" name="1em" /> <!-- l -->
-        <map code="0x006D" name="1em" /> <!-- m -->
-        <map code="0x006E" name="1em" /> <!-- n -->
-        <map code="0x006F" name="1em" /> <!-- o -->
-        <map code="0x0070" name="1em" /> <!-- p -->
-        <map code="0x0071" name="1em" /> <!-- q -->
-        <map code="0x0072" name="1em" /> <!-- r -->
-        <map code="0x0073" name="1em" /> <!-- s -->
-        <map code="0x0074" name="1em" /> <!-- t -->
-        <map code="0x0075" name="1em" /> <!-- u -->
-        <map code="0x0076" name="1em" /> <!-- v -->
-        <map code="0x0077" name="1em" /> <!-- w -->
-        <map code="0x0078" name="1em" /> <!-- x -->
-        <map code="0x0079" name="1em" /> <!-- y -->
-        <map code="0x007A" name="1em" /> <!-- z -->
-
-        <map code="0x05D0" name="1em_rtl"/>	<!-- א Alef -->
-        <map code="0x05D1" name="1em_rtl"/>	<!-- ב Bet -->
-        <map code="0x05D2" name="1em_rtl"/>	<!-- ג Gimel -->
-        <map code="0x05D3" name="1em_rtl"/>	<!-- ד Dalet -->
-        <map code="0x05D4" name="1em_rtl"/>	<!-- ה He -->
-        <map code="0x05D5" name="1em_rtl"/>	<!-- ו Vav -->
-        <map code="0x05D6" name="1em_rtl"/>	<!-- ז Zayin -->
-        <map code="0x05D7" name="1em_rtl"/>	<!-- ח Het -->
-        <map code="0x05D8" name="1em_rtl"/>	<!-- ט Tet -->
-        <map code="0x05D9" name="1em_rtl"/>	<!-- י Yod -->
-        <map code="0x05DA" name="1em_rtl"/>	<!-- ך Final Kaf -->
-        <map code="0x05DB" name="1em_rtl"/>	<!-- כ Kaf -->
-        <map code="0x05DC" name="1em_rtl"/>	<!-- ל Lamed -->
-        <map code="0x05DD" name="1em_rtl"/>	<!-- ם Final Mem -->
-        <map code="0x05DE" name="1em_rtl"/>	<!-- מ Mem -->
-        <map code="0x05DF" name="1em_rtl"/>	<!-- ן Final Nun -->
-        <map code="0x05E0" name="1em_rtl"/>	<!-- נ Nun -->
-        <map code="0x05E1" name="1em_rtl"/>	<!-- ס Samekh -->
-        <map code="0x05E2" name="1em_rtl"/>	<!-- ע Ayin -->
-        <map code="0x05E3" name="1em_rtl"/>	<!-- ף Final Pe -->
-        <map code="0x05E4" name="1em_rtl"/>	<!-- פ Pe -->
-        <map code="0x05E5" name="1em_rtl"/>	<!-- ץ Final Tsadi -->
-        <map code="0x05E6" name="1em_rtl"/>	<!-- צ Tsadi -->
-        <map code="0x05E7" name="1em_rtl"/>	<!-- ק Qof -->
-        <map code="0x05E8" name="1em_rtl"/>	<!-- ר Resh -->
-        <map code="0x05E9" name="1em_rtl"/>	<!-- ש Shin -->
-        <map code="0x05EA" name="1em_rtl"/>	<!-- ת Tav -->
-
-    </cmap_format_4>
-  </cmap>
-
-  <loca>
-    <!-- The 'loca' table will be calculated by the compiler -->
-  </loca>
-
-  <glyf>
-    <TTGlyph name=".notdef" xMin="0" yMin="0" xMax="0" yMax="0" />
-    <TTGlyph name="1em" xMin="0" yMin="-200" xMax="1000" yMax="800">
-        <contour>
-            <pt x="0" y="-200" on="1"/>
-            <pt x="1000" y="300" on="1"/>
-            <pt x="0" y="800" on="1"/>
-        </contour>
-        <instructions />
-    </TTGlyph>
-    <TTGlyph name="1em_rtl" xMin="0" yMin="-200" xMax="1000" yMax="800">
-        <contour>
-            <pt x="1000" y="-200" on="1"/>
-            <pt x="0" y="300" on="1"/>
-            <pt x="1000" y="800" on="1"/>
-        </contour>
-        <instructions />
-    </TTGlyph>
-    <TTGlyph name="space" xMin="0" yMin="-200" xMax="1000" yMax="800">
-        <contour>
-            <pt x="0" y="0" on="1"/>
-            <pt x="1000" y="0" on="1"/>
-            <pt x="1000" y="10" on="1"/>
-            <pt x="0" y="10" on="1"/>
-        </contour>
-        <instructions />
-    </TTGlyph>
-    <TTGlyph name="hyphen" xMin="0" yMin="-200" xMax="1000" yMax="800">
-        <contour>
-            <pt x="0" y="0" on="1"/>
-            <pt x="1000" y="0" on="1"/>
-            <pt x="1000" y="500" on="1"/>
-            <pt x="0" y="500" on="1"/>
-            <pt x="0" y="0" on="1"/>
-        </contour>
-        <instructions />
-    </TTGlyph>
-    <TTGlyph name="linefeed" xMin="0" yMin="-200" xMax="0" yMax="800" />
-  </glyf>
-
-  <name>
-    <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
-      Copyright (C) 2018 The Android Open Source Project
-    </namerecord>
-    <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
-      Sample Font
-    </namerecord>
-    <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
-      Regular
-    </namerecord>
-    <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
-      Sample Font
-    </namerecord>
-    <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
-      SampleFont-Regular
-    </namerecord>
-    <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
-      Licensed under the Apache License, Version 2.0 (the "License");
-      you may not use this file except in compliance with the License.
-      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.
-    </namerecord>
-    <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
-      http://www.apache.org/licenses/LICENSE-2.0
-    </namerecord>
-  </name>
-
-  <post>
-    <formatType value="3.0"/>
-    <italicAngle value="0.0"/>
-    <underlinePosition value="-75"/>
-    <underlineThickness value="50"/>
-    <isFixedPitch value="0"/>
-    <minMemType42 value="0"/>
-    <maxMemType42 value="0"/>
-    <minMemType1 value="0"/>
-    <maxMemType1 value="0"/>
-  </post>
-
-</ttFont>
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/AndroidViewDemos.kt b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/AndroidViewDemos.kt
index 3bd431c..61235a4 100644
--- a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/AndroidViewDemos.kt
+++ b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/AndroidViewDemos.kt
@@ -21,6 +21,5 @@
 import androidx.ui.demos.common.DemoCategory
 
 val AndroidViewDemos = DemoCategory("AndroidView", listOf(
-    ComposableDemo("Views in Compose") { ViewInComposeDemo() },
     ActivityDemo("WebComponent", WebComponentActivity::class)
 ))
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 154a280..e8c9f49 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
@@ -15,7 +15,6 @@
  */
 package androidx.ui.androidview.demos
 
-import android.app.Activity
 import android.graphics.Bitmap
 import android.os.Bundle
 import android.util.Log
@@ -27,6 +26,7 @@
 import android.widget.EditText
 import android.widget.FrameLayout
 import android.widget.LinearLayout
+import androidx.activity.ComponentActivity
 import androidx.ui.androidview.adapters.dp
 import androidx.ui.androidview.adapters.setControlledText
 import androidx.ui.androidview.adapters.setLayoutHeight
@@ -46,7 +46,7 @@
     var url: String = "https://www.google.com"
 }
 
-open class WebComponentActivity : Activity() {
+open class WebComponentActivity : ComponentActivity() {
 
     val webContext = WebContext()
 
diff --git a/ui/ui-android-view/samples/build.gradle b/ui/ui-android-view/samples/build.gradle
index 5c565df..77c8bdf 100644
--- a/ui/ui-android-view/samples/build.gradle
+++ b/ui/ui-android-view/samples/build.gradle
@@ -36,7 +36,7 @@
     implementation project(":ui:ui-framework")
     implementation project(":ui:ui-layout")
     implementation project(":ui:ui-foundation")
-    implementation project(":ui:ui-text")
+    implementation project(":ui:ui-text-core")
     implementation project(":ui:ui-android-view")
 }
 
diff --git a/ui/ui-animation-core/src/main/java/androidx/animation/TransitionDefinition.kt b/ui/ui-animation-core/src/main/java/androidx/animation/TransitionDefinition.kt
index 4f5d8d2..f49a71a 100644
--- a/ui/ui-animation-core/src/main/java/androidx/animation/TransitionDefinition.kt
+++ b/ui/ui-animation-core/src/main/java/androidx/animation/TransitionDefinition.kt
@@ -307,51 +307,4 @@
     SNAP_TO_END, // Not yet supported
     TWEEN, // Not yet supported
     UNINTERRUPTIBLE
-}
-
-/********************* The rest of this file is an example ***********************/
-private enum class ButtonState {
-    Pressed,
-    Released
-}
-
-private val alpha = FloatPropKey()
-private val radius = FloatPropKey()
-
-// TODO: Support states with only part of the props defined
-
-private val example = transitionDefinition {
-    state(ButtonState.Pressed) {
-        this[alpha] = 0f
-        this[radius] = 200f
-    }
-    state(ButtonState.Released) {
-        this[alpha] = 0f
-        this[radius] = 60f
-    }
-
-    transition(fromState = ButtonState.Released, toState = ButtonState.Pressed) {
-        alpha using keyframes {
-            duration = 375
-            0f at 0 // ms  // Optional
-            0.4f at 75 // ms
-            0.4f at 225 // ms
-            0f at 375 // ms  // Optional
-        }
-        radius using physics {
-            dampingRatio = 1.0f
-        }
-        interruptionHandling = InterruptionHandling.UNINTERRUPTIBLE
-    }
-
-    transition(ButtonState.Released to ButtonState.Pressed) {
-
-        // TODO: how do we define sequential tween, alpha then radius snap
-        alpha using tween {
-            easing = LinearEasing
-            duration = 150
-            // TODO: Default behavior for transition: when the transition finishes
-            // normally, all values should be snapped to the pre-defined values.
-        }
-    }
-}
+}
\ No newline at end of file
diff --git a/ui/ui-animation-core/src/test/java/androidx/animation/TypeConverterTest.kt b/ui/ui-animation-core/src/test/java/androidx/animation/TypeConverterTest.kt
index fab8207..7753e3f 100644
--- a/ui/ui-animation-core/src/test/java/androidx/animation/TypeConverterTest.kt
+++ b/ui/ui-animation-core/src/test/java/androidx/animation/TypeConverterTest.kt
@@ -16,7 +16,7 @@
 
 package androidx.animation
 
-import junit.framework.Assert.assertEquals
+import org.junit.Assert.assertEquals
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
diff --git a/ui/ui-animation/integration-tests/animation-demos/build.gradle b/ui/ui-animation/integration-tests/animation-demos/build.gradle
index 4e60c74..73e6ead 100644
--- a/ui/ui-animation/integration-tests/animation-demos/build.gradle
+++ b/ui/ui-animation/integration-tests/animation-demos/build.gradle
@@ -19,7 +19,7 @@
     implementation project(":ui:ui-core")
     implementation project(":ui:ui-framework")
     implementation project(":ui:ui-layout")
-    implementation project(":ui:ui-text")
+    implementation project(":ui:ui-text-core")
     implementation project(':ui:ui-animation')
     implementation project(':ui:ui-foundation')
 }
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/AnimatableSeekBarDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/AnimatableSeekBarDemo.kt
index a16c2f3..1b61aa5 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/AnimatableSeekBarDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/AnimatableSeekBarDemo.kt
@@ -29,8 +29,8 @@
 import androidx.ui.core.AnimationClockAmbient
 import androidx.ui.core.Modifier
 import androidx.ui.core.gesture.DragObserver
-import androidx.ui.core.gesture.PressIndicatorGestureDetector
-import androidx.ui.core.gesture.RawDragGestureDetector
+import androidx.ui.core.gesture.pressIndicatorGestureFilter
+import androidx.ui.core.gesture.rawDragGestureFilter
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.Canvas
 import androidx.ui.foundation.Text
@@ -118,14 +118,16 @@
     }
 
     DrawSeekBar(
-        RawDragGestureDetector(dragObserver) + PressIndicatorGestureDetector(onStart = onPress),
+        Modifier
+            .rawDragGestureFilter(dragObserver)
+            .pressIndicatorGestureFilter(onStart = onPress),
         animValue.value,
         clock
     )
 }
 
 @Composable
-fun DrawSeekBar(modifier: Modifier = Modifier.None, x: Float, clock: ManualAnimationClock) {
+fun DrawSeekBar(modifier: Modifier = Modifier, x: Float, clock: ManualAnimationClock) {
     val paint = remember { Paint() }
     Canvas(modifier.fillMaxWidth().preferredHeight(60.dp)) {
         val centerY = size.height.value / 2
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/CrossfadeDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/CrossfadeDemo.kt
index bea1b62..c3ef2d0 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/CrossfadeDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/CrossfadeDemo.kt
@@ -24,7 +24,7 @@
 import androidx.compose.state
 import androidx.ui.animation.Crossfade
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.TapGestureDetector
+import androidx.ui.core.gesture.tapGestureFilter
 import androidx.ui.foundation.Box
 import androidx.ui.graphics.Color
 import androidx.ui.layout.Column
@@ -41,7 +41,7 @@
         Row {
             tabs.forEach {
                 Box(
-                    TapGestureDetector(onTap = {
+                    Modifier.tapGestureFilter(onTap = {
                         Log.e("Crossfade", "Switch to $it")
                         current = it
                     })
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrollingDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrollingDemo.kt
index ea556f8..cb3e9d1 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrollingDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrollingDemo.kt
@@ -25,11 +25,11 @@
 import androidx.compose.remember
 import androidx.compose.state
 import androidx.ui.animation.animatedFloat
+import androidx.ui.core.DrawScope
 import androidx.ui.core.Modifier
 import androidx.ui.core.gesture.DragObserver
-import androidx.ui.core.gesture.RawDragGestureDetector
+import androidx.ui.core.gesture.rawDragGestureFilter
 import androidx.ui.foundation.Canvas
-import androidx.ui.foundation.CanvasScope
 import androidx.ui.foundation.Text
 import androidx.ui.geometry.Rect
 import androidx.ui.graphics.Color
@@ -54,7 +54,7 @@
         )
         val animScroll = animatedFloat(0f)
         val itemWidth = state { 0f }
-        val gesture = RawDragGestureDetector(dragObserver = object : DragObserver {
+        val gesture = Modifier.rawDragGestureFilter(dragObserver = object : DragObserver {
             override fun onDrag(dragDistance: PxPosition): PxPosition {
                 // Snap to new drag position
                 animScroll.snapTo(animScroll.value + dragDistance.x.value)
@@ -93,7 +93,7 @@
     }
 }
 
-private fun CanvasScope.drawItems(
+private fun DrawScope.drawItems(
     scrollPosition: Float,
     width: Float,
     height: Float,
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/GestureBasedAnimationDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/GestureBasedAnimationDemo.kt
index afe6136..aa1102e 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/GestureBasedAnimationDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/GestureBasedAnimationDemo.kt
@@ -24,7 +24,7 @@
 import androidx.ui.animation.ColorPropKey
 import androidx.ui.animation.Transition
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.PressIndicatorGestureDetector
+import androidx.ui.core.gesture.pressIndicatorGestureFilter
 import androidx.ui.foundation.Canvas
 import androidx.ui.geometry.Rect
 import androidx.ui.graphics.Color
@@ -61,7 +61,7 @@
 fun GestureBasedAnimationDemo() {
     val toState = state { ComponentState.Released }
     val pressIndicator =
-        PressIndicatorGestureDetector(
+        Modifier.pressIndicatorGestureFilter(
             onStart = { toState.value = ComponentState.Pressed },
             onStop = { toState.value = ComponentState.Released },
             onCancel = { toState.value = ComponentState.Released })
@@ -72,7 +72,7 @@
 }
 
 @Composable
-private fun ScaledColorRect(modifier: Modifier = Modifier.None, scale: Float, color: Color) {
+private fun ScaledColorRect(modifier: Modifier = Modifier, scale: Float, color: Color) {
     val paint = remember { Paint() }
     Canvas(modifier.fillMaxSize()) {
         val centerX = size.width.value / 2
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/RepeatedRotationDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/RepeatedRotationDemo.kt
index a0c5c99..525a4ef 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/RepeatedRotationDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/RepeatedRotationDemo.kt
@@ -24,7 +24,7 @@
 import androidx.ui.animation.Transition
 import androidx.ui.core.Alignment
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.TapGestureDetector
+import androidx.ui.core.gesture.tapGestureFilter
 import androidx.ui.foundation.Canvas
 import androidx.ui.foundation.Text
 import androidx.ui.graphics.Color
@@ -49,12 +49,12 @@
     ) {
         val textStyle = TextStyle(fontSize = 18.sp)
         Text(
-            modifier = TapGestureDetector(onTap = { state.value = RotationStates.Rotated }),
+            modifier = Modifier.tapGestureFilter(onTap = { state.value = RotationStates.Rotated }),
             text = "Rotate 10 times",
             style = textStyle
         )
         Text(
-            modifier = TapGestureDetector(onTap = { state.value = RotationStates.Original }),
+            modifier = Modifier.tapGestureFilter(onTap = { state.value = RotationStates.Original }),
             text = "Reset",
             style = textStyle
         )
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrollingDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrollingDemo.kt
index 5b2fda5..639fda3 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrollingDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrollingDemo.kt
@@ -24,11 +24,11 @@
 import androidx.compose.remember
 import androidx.compose.state
 import androidx.ui.animation.animatedFloat
+import androidx.ui.core.DrawScope
 import androidx.ui.core.Modifier
 import androidx.ui.core.gesture.DragObserver
-import androidx.ui.core.gesture.RawDragGestureDetector
+import androidx.ui.core.gesture.rawDragGestureFilter
 import androidx.ui.foundation.Canvas
-import androidx.ui.foundation.CanvasScope
 import androidx.ui.foundation.Text
 import androidx.ui.geometry.Rect
 import androidx.ui.graphics.Color
@@ -55,7 +55,7 @@
         val animScroll = animatedFloat(0f)
         val itemWidth = state { 0f }
         val isFlinging = state { false }
-        val gesture = RawDragGestureDetector(dragObserver = object : DragObserver {
+        val gesture = Modifier.rawDragGestureFilter(dragObserver = object : DragObserver {
             override fun onDrag(dragDistance: PxPosition): PxPosition {
                 animScroll.snapTo(animScroll.targetValue + dragDistance.x.value)
                 return dragDistance
@@ -107,7 +107,7 @@
     }
 }
 
-private fun CanvasScope.drawRects(paint: Paint, animScroll: Float) {
+private fun DrawScope.drawRects(paint: Paint, animScroll: Float) {
     val width = size.width.value / 2f
     val scroll = animScroll + width / 2
     var startingPos = scroll % width
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/StateBasedRippleDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/StateBasedRippleDemo.kt
index ab7baee..5a65259 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/StateBasedRippleDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/StateBasedRippleDemo.kt
@@ -28,7 +28,7 @@
 import androidx.ui.animation.Transition
 import androidx.ui.core.DensityAmbient
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.PressIndicatorGestureDetector
+import androidx.ui.core.gesture.pressIndicatorGestureFilter
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.Canvas
 import androidx.ui.geometry.Offset
@@ -61,14 +61,14 @@
     }
     Transition(definition = rippleTransDef, toState = toState.value) { state ->
         RippleRectFromState(
-            PressIndicatorGestureDetector(onStart = onPress, onStop = onRelease), state =
+            Modifier.pressIndicatorGestureFilter(onStart = onPress, onStop = onRelease), state =
             state
         )
     }
 }
 
 @Composable
-private fun RippleRectFromState(modifier: Modifier = Modifier.None, state: TransitionState) {
+private fun RippleRectFromState(modifier: Modifier = Modifier, state: TransitionState) {
     Canvas(modifier.fillMaxSize()) {
         // TODO: file bug for when "down" is not a file level val, it's not memoized correctly
         val x = down.x
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismissDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismissDemo.kt
index 643cad9..1e3c27c 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismissDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismissDemo.kt
@@ -27,12 +27,12 @@
 import androidx.compose.state
 import androidx.ui.animation.animatedFloat
 import androidx.ui.core.DensityAmbient
+import androidx.ui.core.DrawScope
 import androidx.ui.core.Modifier
 import androidx.ui.core.gesture.DragObserver
-import androidx.ui.core.gesture.RawDragGestureDetector
+import androidx.ui.core.gesture.rawDragGestureFilter
 import androidx.ui.core.onPositioned
 import androidx.ui.foundation.Canvas
-import androidx.ui.foundation.CanvasScope
 import androidx.ui.foundation.Text
 import androidx.ui.geometry.Rect
 import androidx.ui.graphics.Color
@@ -69,7 +69,7 @@
     val index = state { 0 }
     val itemWidth = state { 0f }
     val isFlinging = state { false }
-    val modifier = RawDragGestureDetector(dragObserver = object : DragObserver {
+    val modifier = Modifier.rawDragGestureFilter(dragObserver = object : DragObserver {
         override fun onStart(downPosition: PxPosition) {
             itemBottom.setBounds(0f, height)
             if (isFlinging.value && itemBottom.targetValue < 100f) {
@@ -146,7 +146,7 @@
     }
 }
 
-private fun CanvasScope.drawLeftItems(
+private fun DrawScope.drawLeftItems(
     paint: Paint,
     horizontalOffset: Float,
     width: Float,
@@ -172,7 +172,7 @@
     }
 }
 
-private fun CanvasScope.drawDismissingItem(
+private fun DrawScope.drawDismissingItem(
     paint: Paint,
     bottom: Float,
     width: Float,
diff --git a/ui/ui-animation/samples/build.gradle b/ui/ui-animation/samples/build.gradle
index f51e194..c14dfa7 100644
--- a/ui/ui-animation/samples/build.gradle
+++ b/ui/ui-animation/samples/build.gradle
@@ -34,7 +34,7 @@
 
     implementation project(":compose:compose-runtime")
     implementation project(":ui:ui-animation")
-    implementation project(":ui:ui-text")
+    implementation project(":ui:ui-text-core")
     implementation project(":ui:ui-foundation")
 }
 
diff --git a/ui/ui-animation/samples/src/main/java/androidx/ui/animation/samples/AnimatedValueSamples.kt b/ui/ui-animation/samples/src/main/java/androidx/ui/animation/samples/AnimatedValueSamples.kt
index 4e48342..65c325a 100644
--- a/ui/ui-animation/samples/src/main/java/androidx/ui/animation/samples/AnimatedValueSamples.kt
+++ b/ui/ui-animation/samples/src/main/java/androidx/ui/animation/samples/AnimatedValueSamples.kt
@@ -27,7 +27,6 @@
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.ContentGravity
 import androidx.ui.foundation.Text
-import androidx.ui.foundation.currentTextStyle
 import androidx.ui.foundation.drawBackground
 import androidx.ui.graphics.Color
 import androidx.ui.layout.fillMaxSize
@@ -54,7 +53,7 @@
 fun ColorTransition(enabled: Boolean) {
     Box(Modifier.fillMaxSize(), gravity = ContentGravity.Center) {
         val textColor = animate(if (enabled) Color.Black else Color.Gray)
-        Text("Visibility Transition", style = currentTextStyle().copy(color = textColor))
+        Text("Visibility Transition", color = textColor)
     }
 }
 
diff --git a/ui/ui-animation/src/androidTest/java/androidx/ui/animation/CrossfadeUiTest.kt b/ui/ui-animation/src/androidTest/java/androidx/ui/animation/CrossfadeUiTest.kt
index a5d6139..950e2bf 100644
--- a/ui/ui-animation/src/androidTest/java/androidx/ui/animation/CrossfadeUiTest.kt
+++ b/ui/ui-animation/src/androidTest/java/androidx/ui/animation/CrossfadeUiTest.kt
@@ -24,6 +24,7 @@
 import androidx.ui.foundation.Text
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.findByText
+import androidx.ui.test.runOnIdleCompose
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -66,7 +67,7 @@
         }
         composeTestRule.clockTestRule.advanceClock(300)
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             showFirst = false
         }
         composeTestRule.clockTestRule.advanceClock(300)
diff --git a/ui/ui-core/api/0.1.0-dev09.txt b/ui/ui-core/api/0.1.0-dev09.txt
index deb1869..00d1aae 100644
--- a/ui/ui-core/api/0.1.0-dev09.txt
+++ b/ui/ui-core/api/0.1.0-dev09.txt
@@ -100,6 +100,10 @@
     method public androidx.ui.unit.PxPosition getPositionChange();
   }
 
+  public interface ContentDrawScope extends androidx.ui.core.DrawScope {
+    method public void drawContent();
+  }
+
   public interface CustomEvent {
   }
 
@@ -150,17 +154,18 @@
   }
 
   public interface DrawModifier extends androidx.ui.core.Modifier.Element {
-    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
+    method public void draw(androidx.ui.core.ContentDrawScope);
   }
 
   public final class DrawModifierKt {
-    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onDraw);
-    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onDraw);
-    method public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onDraw);
+    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
   }
 
-  public interface DrawReceiver extends androidx.ui.unit.Density {
-    method public void drawChildren();
+  public interface DrawScope extends androidx.ui.graphics.Canvas androidx.ui.unit.Density {
+    method public androidx.ui.unit.PxSize getSize();
+    property public abstract androidx.ui.unit.PxSize size;
   }
 
   public final class HorizontalAlignmentLine extends androidx.ui.core.AlignmentLine {
@@ -197,9 +202,11 @@
   }
 
   public final class LayoutCoordinatesKt {
+    method public static androidx.ui.unit.PxBounds getBoundsInParent(androidx.ui.core.LayoutCoordinates);
     method public static androidx.ui.unit.PxBounds getBoundsInRoot(androidx.ui.core.LayoutCoordinates);
     method public static androidx.ui.unit.PxBounds getGlobalBounds(androidx.ui.core.LayoutCoordinates);
     method public static inline androidx.ui.unit.PxPosition getGlobalPosition(androidx.ui.core.LayoutCoordinates);
+    method public static androidx.ui.unit.PxPosition getPositionInParent(androidx.ui.core.LayoutCoordinates);
     method public static inline androidx.ui.unit.PxPosition getPositionInRoot(androidx.ui.core.LayoutCoordinates);
   }
 
@@ -260,8 +267,8 @@
   public static final class Modifier.Companion implements androidx.ui.core.Modifier {
     method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.ui.core.Modifier.Element,? extends R> operation);
     method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.ui.core.Modifier.Element,? super R,? extends R> operation);
-    method public androidx.ui.core.Modifier getNone();
-    property public final androidx.ui.core.Modifier None;
+    method @Deprecated public androidx.ui.core.Modifier getNone();
+    property @Deprecated public final androidx.ui.core.Modifier None;
   }
 
   public static interface Modifier.Element extends androidx.ui.core.Modifier {
@@ -291,12 +298,16 @@
   public abstract class Placeable {
     ctor public Placeable();
     method public abstract operator androidx.ui.unit.IntPx? get(androidx.ui.core.AlignmentLine line);
+    method protected final androidx.ui.unit.IntPxPosition getApparentToRealOffset();
     method public final androidx.ui.unit.IntPx getHeight();
-    method public abstract androidx.ui.unit.IntPxSize getSize();
+    method protected abstract androidx.ui.unit.IntPxSize getMeasuredSize();
+    method protected abstract androidx.ui.core.Constraints getMeasurementConstraints();
     method public final androidx.ui.unit.IntPx getWidth();
     method protected abstract void performPlace(androidx.ui.unit.IntPxPosition position);
+    property protected final androidx.ui.unit.IntPxPosition apparentToRealOffset;
     property public final androidx.ui.unit.IntPx height;
-    property public abstract androidx.ui.unit.IntPxSize size;
+    property protected abstract androidx.ui.unit.IntPxSize measuredSize;
+    property protected abstract androidx.ui.core.Constraints measurementConstraints;
     property public final androidx.ui.unit.IntPx width;
     field public static final androidx.ui.core.Placeable.PlacementScope! PlacementScope;
   }
@@ -306,10 +317,10 @@
     method public void place(androidx.ui.core.Placeable, androidx.ui.unit.PxPosition position);
     method public void place(androidx.ui.core.Placeable, androidx.ui.unit.IntPx x, androidx.ui.unit.IntPx y);
     method public void place(androidx.ui.core.Placeable, androidx.ui.unit.Px x, androidx.ui.unit.Px y);
-    method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPxPosition position);
     method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.PxPosition position);
     method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPx x, androidx.ui.unit.IntPx y);
     method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.Px x, androidx.ui.unit.Px y);
+    method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPxPosition position);
   }
 
   public enum PointerEventPass {
@@ -366,6 +377,13 @@
     method public static boolean positionChangedIgnoreConsumed(androidx.ui.core.PointerInputChange);
   }
 
+  public final class Ref<T> {
+    ctor public Ref();
+    method public T? getValue();
+    method public void setValue(T? p);
+    property public final T? value;
+  }
+
   public final class TransformOrigin {
     ctor public TransformOrigin(internal long value);
     method public float getPivotFractionX();
@@ -396,6 +414,14 @@
     enum_constant public static final androidx.ui.focus.FocusDetailedState Inactive;
   }
 
+  public interface FocusModifier extends androidx.ui.core.Modifier.Element {
+    method public boolean captureFocus();
+    method public boolean freeFocus();
+    method public androidx.ui.focus.FocusDetailedState getFocusDetailedState();
+    method public void requestFocus();
+    property public abstract androidx.ui.focus.FocusDetailedState focusDetailedState;
+  }
+
   public enum FocusState {
     enum_constant public static final androidx.ui.focus.FocusState Focused;
     enum_constant public static final androidx.ui.focus.FocusState NotFocusable;
diff --git a/ui/ui-core/api/current.txt b/ui/ui-core/api/current.txt
index deb1869..00d1aae 100644
--- a/ui/ui-core/api/current.txt
+++ b/ui/ui-core/api/current.txt
@@ -100,6 +100,10 @@
     method public androidx.ui.unit.PxPosition getPositionChange();
   }
 
+  public interface ContentDrawScope extends androidx.ui.core.DrawScope {
+    method public void drawContent();
+  }
+
   public interface CustomEvent {
   }
 
@@ -150,17 +154,18 @@
   }
 
   public interface DrawModifier extends androidx.ui.core.Modifier.Element {
-    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
+    method public void draw(androidx.ui.core.ContentDrawScope);
   }
 
   public final class DrawModifierKt {
-    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onDraw);
-    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onDraw);
-    method public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onDraw);
+    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
   }
 
-  public interface DrawReceiver extends androidx.ui.unit.Density {
-    method public void drawChildren();
+  public interface DrawScope extends androidx.ui.graphics.Canvas androidx.ui.unit.Density {
+    method public androidx.ui.unit.PxSize getSize();
+    property public abstract androidx.ui.unit.PxSize size;
   }
 
   public final class HorizontalAlignmentLine extends androidx.ui.core.AlignmentLine {
@@ -197,9 +202,11 @@
   }
 
   public final class LayoutCoordinatesKt {
+    method public static androidx.ui.unit.PxBounds getBoundsInParent(androidx.ui.core.LayoutCoordinates);
     method public static androidx.ui.unit.PxBounds getBoundsInRoot(androidx.ui.core.LayoutCoordinates);
     method public static androidx.ui.unit.PxBounds getGlobalBounds(androidx.ui.core.LayoutCoordinates);
     method public static inline androidx.ui.unit.PxPosition getGlobalPosition(androidx.ui.core.LayoutCoordinates);
+    method public static androidx.ui.unit.PxPosition getPositionInParent(androidx.ui.core.LayoutCoordinates);
     method public static inline androidx.ui.unit.PxPosition getPositionInRoot(androidx.ui.core.LayoutCoordinates);
   }
 
@@ -260,8 +267,8 @@
   public static final class Modifier.Companion implements androidx.ui.core.Modifier {
     method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.ui.core.Modifier.Element,? extends R> operation);
     method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.ui.core.Modifier.Element,? super R,? extends R> operation);
-    method public androidx.ui.core.Modifier getNone();
-    property public final androidx.ui.core.Modifier None;
+    method @Deprecated public androidx.ui.core.Modifier getNone();
+    property @Deprecated public final androidx.ui.core.Modifier None;
   }
 
   public static interface Modifier.Element extends androidx.ui.core.Modifier {
@@ -291,12 +298,16 @@
   public abstract class Placeable {
     ctor public Placeable();
     method public abstract operator androidx.ui.unit.IntPx? get(androidx.ui.core.AlignmentLine line);
+    method protected final androidx.ui.unit.IntPxPosition getApparentToRealOffset();
     method public final androidx.ui.unit.IntPx getHeight();
-    method public abstract androidx.ui.unit.IntPxSize getSize();
+    method protected abstract androidx.ui.unit.IntPxSize getMeasuredSize();
+    method protected abstract androidx.ui.core.Constraints getMeasurementConstraints();
     method public final androidx.ui.unit.IntPx getWidth();
     method protected abstract void performPlace(androidx.ui.unit.IntPxPosition position);
+    property protected final androidx.ui.unit.IntPxPosition apparentToRealOffset;
     property public final androidx.ui.unit.IntPx height;
-    property public abstract androidx.ui.unit.IntPxSize size;
+    property protected abstract androidx.ui.unit.IntPxSize measuredSize;
+    property protected abstract androidx.ui.core.Constraints measurementConstraints;
     property public final androidx.ui.unit.IntPx width;
     field public static final androidx.ui.core.Placeable.PlacementScope! PlacementScope;
   }
@@ -306,10 +317,10 @@
     method public void place(androidx.ui.core.Placeable, androidx.ui.unit.PxPosition position);
     method public void place(androidx.ui.core.Placeable, androidx.ui.unit.IntPx x, androidx.ui.unit.IntPx y);
     method public void place(androidx.ui.core.Placeable, androidx.ui.unit.Px x, androidx.ui.unit.Px y);
-    method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPxPosition position);
     method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.PxPosition position);
     method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPx x, androidx.ui.unit.IntPx y);
     method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.Px x, androidx.ui.unit.Px y);
+    method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPxPosition position);
   }
 
   public enum PointerEventPass {
@@ -366,6 +377,13 @@
     method public static boolean positionChangedIgnoreConsumed(androidx.ui.core.PointerInputChange);
   }
 
+  public final class Ref<T> {
+    ctor public Ref();
+    method public T? getValue();
+    method public void setValue(T? p);
+    property public final T? value;
+  }
+
   public final class TransformOrigin {
     ctor public TransformOrigin(internal long value);
     method public float getPivotFractionX();
@@ -396,6 +414,14 @@
     enum_constant public static final androidx.ui.focus.FocusDetailedState Inactive;
   }
 
+  public interface FocusModifier extends androidx.ui.core.Modifier.Element {
+    method public boolean captureFocus();
+    method public boolean freeFocus();
+    method public androidx.ui.focus.FocusDetailedState getFocusDetailedState();
+    method public void requestFocus();
+    property public abstract androidx.ui.focus.FocusDetailedState focusDetailedState;
+  }
+
   public enum FocusState {
     enum_constant public static final androidx.ui.focus.FocusState Focused;
     enum_constant public static final androidx.ui.focus.FocusState NotFocusable;
diff --git a/ui/ui-core/api/public_plus_experimental_0.1.0-dev09.txt b/ui/ui-core/api/public_plus_experimental_0.1.0-dev09.txt
index deb1869..00d1aae 100644
--- a/ui/ui-core/api/public_plus_experimental_0.1.0-dev09.txt
+++ b/ui/ui-core/api/public_plus_experimental_0.1.0-dev09.txt
@@ -100,6 +100,10 @@
     method public androidx.ui.unit.PxPosition getPositionChange();
   }
 
+  public interface ContentDrawScope extends androidx.ui.core.DrawScope {
+    method public void drawContent();
+  }
+
   public interface CustomEvent {
   }
 
@@ -150,17 +154,18 @@
   }
 
   public interface DrawModifier extends androidx.ui.core.Modifier.Element {
-    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
+    method public void draw(androidx.ui.core.ContentDrawScope);
   }
 
   public final class DrawModifierKt {
-    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onDraw);
-    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onDraw);
-    method public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onDraw);
+    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
   }
 
-  public interface DrawReceiver extends androidx.ui.unit.Density {
-    method public void drawChildren();
+  public interface DrawScope extends androidx.ui.graphics.Canvas androidx.ui.unit.Density {
+    method public androidx.ui.unit.PxSize getSize();
+    property public abstract androidx.ui.unit.PxSize size;
   }
 
   public final class HorizontalAlignmentLine extends androidx.ui.core.AlignmentLine {
@@ -197,9 +202,11 @@
   }
 
   public final class LayoutCoordinatesKt {
+    method public static androidx.ui.unit.PxBounds getBoundsInParent(androidx.ui.core.LayoutCoordinates);
     method public static androidx.ui.unit.PxBounds getBoundsInRoot(androidx.ui.core.LayoutCoordinates);
     method public static androidx.ui.unit.PxBounds getGlobalBounds(androidx.ui.core.LayoutCoordinates);
     method public static inline androidx.ui.unit.PxPosition getGlobalPosition(androidx.ui.core.LayoutCoordinates);
+    method public static androidx.ui.unit.PxPosition getPositionInParent(androidx.ui.core.LayoutCoordinates);
     method public static inline androidx.ui.unit.PxPosition getPositionInRoot(androidx.ui.core.LayoutCoordinates);
   }
 
@@ -260,8 +267,8 @@
   public static final class Modifier.Companion implements androidx.ui.core.Modifier {
     method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.ui.core.Modifier.Element,? extends R> operation);
     method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.ui.core.Modifier.Element,? super R,? extends R> operation);
-    method public androidx.ui.core.Modifier getNone();
-    property public final androidx.ui.core.Modifier None;
+    method @Deprecated public androidx.ui.core.Modifier getNone();
+    property @Deprecated public final androidx.ui.core.Modifier None;
   }
 
   public static interface Modifier.Element extends androidx.ui.core.Modifier {
@@ -291,12 +298,16 @@
   public abstract class Placeable {
     ctor public Placeable();
     method public abstract operator androidx.ui.unit.IntPx? get(androidx.ui.core.AlignmentLine line);
+    method protected final androidx.ui.unit.IntPxPosition getApparentToRealOffset();
     method public final androidx.ui.unit.IntPx getHeight();
-    method public abstract androidx.ui.unit.IntPxSize getSize();
+    method protected abstract androidx.ui.unit.IntPxSize getMeasuredSize();
+    method protected abstract androidx.ui.core.Constraints getMeasurementConstraints();
     method public final androidx.ui.unit.IntPx getWidth();
     method protected abstract void performPlace(androidx.ui.unit.IntPxPosition position);
+    property protected final androidx.ui.unit.IntPxPosition apparentToRealOffset;
     property public final androidx.ui.unit.IntPx height;
-    property public abstract androidx.ui.unit.IntPxSize size;
+    property protected abstract androidx.ui.unit.IntPxSize measuredSize;
+    property protected abstract androidx.ui.core.Constraints measurementConstraints;
     property public final androidx.ui.unit.IntPx width;
     field public static final androidx.ui.core.Placeable.PlacementScope! PlacementScope;
   }
@@ -306,10 +317,10 @@
     method public void place(androidx.ui.core.Placeable, androidx.ui.unit.PxPosition position);
     method public void place(androidx.ui.core.Placeable, androidx.ui.unit.IntPx x, androidx.ui.unit.IntPx y);
     method public void place(androidx.ui.core.Placeable, androidx.ui.unit.Px x, androidx.ui.unit.Px y);
-    method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPxPosition position);
     method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.PxPosition position);
     method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPx x, androidx.ui.unit.IntPx y);
     method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.Px x, androidx.ui.unit.Px y);
+    method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPxPosition position);
   }
 
   public enum PointerEventPass {
@@ -366,6 +377,13 @@
     method public static boolean positionChangedIgnoreConsumed(androidx.ui.core.PointerInputChange);
   }
 
+  public final class Ref<T> {
+    ctor public Ref();
+    method public T? getValue();
+    method public void setValue(T? p);
+    property public final T? value;
+  }
+
   public final class TransformOrigin {
     ctor public TransformOrigin(internal long value);
     method public float getPivotFractionX();
@@ -396,6 +414,14 @@
     enum_constant public static final androidx.ui.focus.FocusDetailedState Inactive;
   }
 
+  public interface FocusModifier extends androidx.ui.core.Modifier.Element {
+    method public boolean captureFocus();
+    method public boolean freeFocus();
+    method public androidx.ui.focus.FocusDetailedState getFocusDetailedState();
+    method public void requestFocus();
+    property public abstract androidx.ui.focus.FocusDetailedState focusDetailedState;
+  }
+
   public enum FocusState {
     enum_constant public static final androidx.ui.focus.FocusState Focused;
     enum_constant public static final androidx.ui.focus.FocusState NotFocusable;
diff --git a/ui/ui-core/api/public_plus_experimental_current.txt b/ui/ui-core/api/public_plus_experimental_current.txt
index deb1869..00d1aae 100644
--- a/ui/ui-core/api/public_plus_experimental_current.txt
+++ b/ui/ui-core/api/public_plus_experimental_current.txt
@@ -100,6 +100,10 @@
     method public androidx.ui.unit.PxPosition getPositionChange();
   }
 
+  public interface ContentDrawScope extends androidx.ui.core.DrawScope {
+    method public void drawContent();
+  }
+
   public interface CustomEvent {
   }
 
@@ -150,17 +154,18 @@
   }
 
   public interface DrawModifier extends androidx.ui.core.Modifier.Element {
-    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
+    method public void draw(androidx.ui.core.ContentDrawScope);
   }
 
   public final class DrawModifierKt {
-    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onDraw);
-    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onDraw);
-    method public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onDraw);
+    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
   }
 
-  public interface DrawReceiver extends androidx.ui.unit.Density {
-    method public void drawChildren();
+  public interface DrawScope extends androidx.ui.graphics.Canvas androidx.ui.unit.Density {
+    method public androidx.ui.unit.PxSize getSize();
+    property public abstract androidx.ui.unit.PxSize size;
   }
 
   public final class HorizontalAlignmentLine extends androidx.ui.core.AlignmentLine {
@@ -197,9 +202,11 @@
   }
 
   public final class LayoutCoordinatesKt {
+    method public static androidx.ui.unit.PxBounds getBoundsInParent(androidx.ui.core.LayoutCoordinates);
     method public static androidx.ui.unit.PxBounds getBoundsInRoot(androidx.ui.core.LayoutCoordinates);
     method public static androidx.ui.unit.PxBounds getGlobalBounds(androidx.ui.core.LayoutCoordinates);
     method public static inline androidx.ui.unit.PxPosition getGlobalPosition(androidx.ui.core.LayoutCoordinates);
+    method public static androidx.ui.unit.PxPosition getPositionInParent(androidx.ui.core.LayoutCoordinates);
     method public static inline androidx.ui.unit.PxPosition getPositionInRoot(androidx.ui.core.LayoutCoordinates);
   }
 
@@ -260,8 +267,8 @@
   public static final class Modifier.Companion implements androidx.ui.core.Modifier {
     method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.ui.core.Modifier.Element,? extends R> operation);
     method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.ui.core.Modifier.Element,? super R,? extends R> operation);
-    method public androidx.ui.core.Modifier getNone();
-    property public final androidx.ui.core.Modifier None;
+    method @Deprecated public androidx.ui.core.Modifier getNone();
+    property @Deprecated public final androidx.ui.core.Modifier None;
   }
 
   public static interface Modifier.Element extends androidx.ui.core.Modifier {
@@ -291,12 +298,16 @@
   public abstract class Placeable {
     ctor public Placeable();
     method public abstract operator androidx.ui.unit.IntPx? get(androidx.ui.core.AlignmentLine line);
+    method protected final androidx.ui.unit.IntPxPosition getApparentToRealOffset();
     method public final androidx.ui.unit.IntPx getHeight();
-    method public abstract androidx.ui.unit.IntPxSize getSize();
+    method protected abstract androidx.ui.unit.IntPxSize getMeasuredSize();
+    method protected abstract androidx.ui.core.Constraints getMeasurementConstraints();
     method public final androidx.ui.unit.IntPx getWidth();
     method protected abstract void performPlace(androidx.ui.unit.IntPxPosition position);
+    property protected final androidx.ui.unit.IntPxPosition apparentToRealOffset;
     property public final androidx.ui.unit.IntPx height;
-    property public abstract androidx.ui.unit.IntPxSize size;
+    property protected abstract androidx.ui.unit.IntPxSize measuredSize;
+    property protected abstract androidx.ui.core.Constraints measurementConstraints;
     property public final androidx.ui.unit.IntPx width;
     field public static final androidx.ui.core.Placeable.PlacementScope! PlacementScope;
   }
@@ -306,10 +317,10 @@
     method public void place(androidx.ui.core.Placeable, androidx.ui.unit.PxPosition position);
     method public void place(androidx.ui.core.Placeable, androidx.ui.unit.IntPx x, androidx.ui.unit.IntPx y);
     method public void place(androidx.ui.core.Placeable, androidx.ui.unit.Px x, androidx.ui.unit.Px y);
-    method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPxPosition position);
     method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.PxPosition position);
     method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPx x, androidx.ui.unit.IntPx y);
     method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.Px x, androidx.ui.unit.Px y);
+    method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPxPosition position);
   }
 
   public enum PointerEventPass {
@@ -366,6 +377,13 @@
     method public static boolean positionChangedIgnoreConsumed(androidx.ui.core.PointerInputChange);
   }
 
+  public final class Ref<T> {
+    ctor public Ref();
+    method public T? getValue();
+    method public void setValue(T? p);
+    property public final T? value;
+  }
+
   public final class TransformOrigin {
     ctor public TransformOrigin(internal long value);
     method public float getPivotFractionX();
@@ -396,6 +414,14 @@
     enum_constant public static final androidx.ui.focus.FocusDetailedState Inactive;
   }
 
+  public interface FocusModifier extends androidx.ui.core.Modifier.Element {
+    method public boolean captureFocus();
+    method public boolean freeFocus();
+    method public androidx.ui.focus.FocusDetailedState getFocusDetailedState();
+    method public void requestFocus();
+    property public abstract androidx.ui.focus.FocusDetailedState focusDetailedState;
+  }
+
   public enum FocusState {
     enum_constant public static final androidx.ui.focus.FocusState Focused;
     enum_constant public static final androidx.ui.focus.FocusState NotFocusable;
diff --git a/ui/ui-core/api/restricted_0.1.0-dev09.txt b/ui/ui-core/api/restricted_0.1.0-dev09.txt
index deb1869..00d1aae 100644
--- a/ui/ui-core/api/restricted_0.1.0-dev09.txt
+++ b/ui/ui-core/api/restricted_0.1.0-dev09.txt
@@ -100,6 +100,10 @@
     method public androidx.ui.unit.PxPosition getPositionChange();
   }
 
+  public interface ContentDrawScope extends androidx.ui.core.DrawScope {
+    method public void drawContent();
+  }
+
   public interface CustomEvent {
   }
 
@@ -150,17 +154,18 @@
   }
 
   public interface DrawModifier extends androidx.ui.core.Modifier.Element {
-    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
+    method public void draw(androidx.ui.core.ContentDrawScope);
   }
 
   public final class DrawModifierKt {
-    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onDraw);
-    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onDraw);
-    method public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onDraw);
+    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
   }
 
-  public interface DrawReceiver extends androidx.ui.unit.Density {
-    method public void drawChildren();
+  public interface DrawScope extends androidx.ui.graphics.Canvas androidx.ui.unit.Density {
+    method public androidx.ui.unit.PxSize getSize();
+    property public abstract androidx.ui.unit.PxSize size;
   }
 
   public final class HorizontalAlignmentLine extends androidx.ui.core.AlignmentLine {
@@ -197,9 +202,11 @@
   }
 
   public final class LayoutCoordinatesKt {
+    method public static androidx.ui.unit.PxBounds getBoundsInParent(androidx.ui.core.LayoutCoordinates);
     method public static androidx.ui.unit.PxBounds getBoundsInRoot(androidx.ui.core.LayoutCoordinates);
     method public static androidx.ui.unit.PxBounds getGlobalBounds(androidx.ui.core.LayoutCoordinates);
     method public static inline androidx.ui.unit.PxPosition getGlobalPosition(androidx.ui.core.LayoutCoordinates);
+    method public static androidx.ui.unit.PxPosition getPositionInParent(androidx.ui.core.LayoutCoordinates);
     method public static inline androidx.ui.unit.PxPosition getPositionInRoot(androidx.ui.core.LayoutCoordinates);
   }
 
@@ -260,8 +267,8 @@
   public static final class Modifier.Companion implements androidx.ui.core.Modifier {
     method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.ui.core.Modifier.Element,? extends R> operation);
     method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.ui.core.Modifier.Element,? super R,? extends R> operation);
-    method public androidx.ui.core.Modifier getNone();
-    property public final androidx.ui.core.Modifier None;
+    method @Deprecated public androidx.ui.core.Modifier getNone();
+    property @Deprecated public final androidx.ui.core.Modifier None;
   }
 
   public static interface Modifier.Element extends androidx.ui.core.Modifier {
@@ -291,12 +298,16 @@
   public abstract class Placeable {
     ctor public Placeable();
     method public abstract operator androidx.ui.unit.IntPx? get(androidx.ui.core.AlignmentLine line);
+    method protected final androidx.ui.unit.IntPxPosition getApparentToRealOffset();
     method public final androidx.ui.unit.IntPx getHeight();
-    method public abstract androidx.ui.unit.IntPxSize getSize();
+    method protected abstract androidx.ui.unit.IntPxSize getMeasuredSize();
+    method protected abstract androidx.ui.core.Constraints getMeasurementConstraints();
     method public final androidx.ui.unit.IntPx getWidth();
     method protected abstract void performPlace(androidx.ui.unit.IntPxPosition position);
+    property protected final androidx.ui.unit.IntPxPosition apparentToRealOffset;
     property public final androidx.ui.unit.IntPx height;
-    property public abstract androidx.ui.unit.IntPxSize size;
+    property protected abstract androidx.ui.unit.IntPxSize measuredSize;
+    property protected abstract androidx.ui.core.Constraints measurementConstraints;
     property public final androidx.ui.unit.IntPx width;
     field public static final androidx.ui.core.Placeable.PlacementScope! PlacementScope;
   }
@@ -306,10 +317,10 @@
     method public void place(androidx.ui.core.Placeable, androidx.ui.unit.PxPosition position);
     method public void place(androidx.ui.core.Placeable, androidx.ui.unit.IntPx x, androidx.ui.unit.IntPx y);
     method public void place(androidx.ui.core.Placeable, androidx.ui.unit.Px x, androidx.ui.unit.Px y);
-    method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPxPosition position);
     method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.PxPosition position);
     method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPx x, androidx.ui.unit.IntPx y);
     method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.Px x, androidx.ui.unit.Px y);
+    method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPxPosition position);
   }
 
   public enum PointerEventPass {
@@ -366,6 +377,13 @@
     method public static boolean positionChangedIgnoreConsumed(androidx.ui.core.PointerInputChange);
   }
 
+  public final class Ref<T> {
+    ctor public Ref();
+    method public T? getValue();
+    method public void setValue(T? p);
+    property public final T? value;
+  }
+
   public final class TransformOrigin {
     ctor public TransformOrigin(internal long value);
     method public float getPivotFractionX();
@@ -396,6 +414,14 @@
     enum_constant public static final androidx.ui.focus.FocusDetailedState Inactive;
   }
 
+  public interface FocusModifier extends androidx.ui.core.Modifier.Element {
+    method public boolean captureFocus();
+    method public boolean freeFocus();
+    method public androidx.ui.focus.FocusDetailedState getFocusDetailedState();
+    method public void requestFocus();
+    property public abstract androidx.ui.focus.FocusDetailedState focusDetailedState;
+  }
+
   public enum FocusState {
     enum_constant public static final androidx.ui.focus.FocusState Focused;
     enum_constant public static final androidx.ui.focus.FocusState NotFocusable;
diff --git a/ui/ui-core/api/restricted_current.txt b/ui/ui-core/api/restricted_current.txt
index deb1869..00d1aae 100644
--- a/ui/ui-core/api/restricted_current.txt
+++ b/ui/ui-core/api/restricted_current.txt
@@ -100,6 +100,10 @@
     method public androidx.ui.unit.PxPosition getPositionChange();
   }
 
+  public interface ContentDrawScope extends androidx.ui.core.DrawScope {
+    method public void drawContent();
+  }
+
   public interface CustomEvent {
   }
 
@@ -150,17 +154,18 @@
   }
 
   public interface DrawModifier extends androidx.ui.core.Modifier.Element {
-    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
+    method public void draw(androidx.ui.core.ContentDrawScope);
   }
 
   public final class DrawModifierKt {
-    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onDraw);
-    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onDraw);
-    method public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onDraw);
+    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
   }
 
-  public interface DrawReceiver extends androidx.ui.unit.Density {
-    method public void drawChildren();
+  public interface DrawScope extends androidx.ui.graphics.Canvas androidx.ui.unit.Density {
+    method public androidx.ui.unit.PxSize getSize();
+    property public abstract androidx.ui.unit.PxSize size;
   }
 
   public final class HorizontalAlignmentLine extends androidx.ui.core.AlignmentLine {
@@ -197,9 +202,11 @@
   }
 
   public final class LayoutCoordinatesKt {
+    method public static androidx.ui.unit.PxBounds getBoundsInParent(androidx.ui.core.LayoutCoordinates);
     method public static androidx.ui.unit.PxBounds getBoundsInRoot(androidx.ui.core.LayoutCoordinates);
     method public static androidx.ui.unit.PxBounds getGlobalBounds(androidx.ui.core.LayoutCoordinates);
     method public static inline androidx.ui.unit.PxPosition getGlobalPosition(androidx.ui.core.LayoutCoordinates);
+    method public static androidx.ui.unit.PxPosition getPositionInParent(androidx.ui.core.LayoutCoordinates);
     method public static inline androidx.ui.unit.PxPosition getPositionInRoot(androidx.ui.core.LayoutCoordinates);
   }
 
@@ -260,8 +267,8 @@
   public static final class Modifier.Companion implements androidx.ui.core.Modifier {
     method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.ui.core.Modifier.Element,? extends R> operation);
     method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.ui.core.Modifier.Element,? super R,? extends R> operation);
-    method public androidx.ui.core.Modifier getNone();
-    property public final androidx.ui.core.Modifier None;
+    method @Deprecated public androidx.ui.core.Modifier getNone();
+    property @Deprecated public final androidx.ui.core.Modifier None;
   }
 
   public static interface Modifier.Element extends androidx.ui.core.Modifier {
@@ -291,12 +298,16 @@
   public abstract class Placeable {
     ctor public Placeable();
     method public abstract operator androidx.ui.unit.IntPx? get(androidx.ui.core.AlignmentLine line);
+    method protected final androidx.ui.unit.IntPxPosition getApparentToRealOffset();
     method public final androidx.ui.unit.IntPx getHeight();
-    method public abstract androidx.ui.unit.IntPxSize getSize();
+    method protected abstract androidx.ui.unit.IntPxSize getMeasuredSize();
+    method protected abstract androidx.ui.core.Constraints getMeasurementConstraints();
     method public final androidx.ui.unit.IntPx getWidth();
     method protected abstract void performPlace(androidx.ui.unit.IntPxPosition position);
+    property protected final androidx.ui.unit.IntPxPosition apparentToRealOffset;
     property public final androidx.ui.unit.IntPx height;
-    property public abstract androidx.ui.unit.IntPxSize size;
+    property protected abstract androidx.ui.unit.IntPxSize measuredSize;
+    property protected abstract androidx.ui.core.Constraints measurementConstraints;
     property public final androidx.ui.unit.IntPx width;
     field public static final androidx.ui.core.Placeable.PlacementScope! PlacementScope;
   }
@@ -306,10 +317,10 @@
     method public void place(androidx.ui.core.Placeable, androidx.ui.unit.PxPosition position);
     method public void place(androidx.ui.core.Placeable, androidx.ui.unit.IntPx x, androidx.ui.unit.IntPx y);
     method public void place(androidx.ui.core.Placeable, androidx.ui.unit.Px x, androidx.ui.unit.Px y);
-    method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPxPosition position);
     method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.PxPosition position);
     method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPx x, androidx.ui.unit.IntPx y);
     method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.Px x, androidx.ui.unit.Px y);
+    method public void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntPxPosition position);
   }
 
   public enum PointerEventPass {
@@ -366,6 +377,13 @@
     method public static boolean positionChangedIgnoreConsumed(androidx.ui.core.PointerInputChange);
   }
 
+  public final class Ref<T> {
+    ctor public Ref();
+    method public T? getValue();
+    method public void setValue(T? p);
+    property public final T? value;
+  }
+
   public final class TransformOrigin {
     ctor public TransformOrigin(internal long value);
     method public float getPivotFractionX();
@@ -396,6 +414,14 @@
     enum_constant public static final androidx.ui.focus.FocusDetailedState Inactive;
   }
 
+  public interface FocusModifier extends androidx.ui.core.Modifier.Element {
+    method public boolean captureFocus();
+    method public boolean freeFocus();
+    method public androidx.ui.focus.FocusDetailedState getFocusDetailedState();
+    method public void requestFocus();
+    property public abstract androidx.ui.focus.FocusDetailedState focusDetailedState;
+  }
+
   public enum FocusState {
     enum_constant public static final androidx.ui.focus.FocusState Focused;
     enum_constant public static final androidx.ui.focus.FocusState NotFocusable;
diff --git a/ui/ui-core/samples/src/main/java/androidx/ui/core/samples/ModifierSamples.kt b/ui/ui-core/samples/src/main/java/androidx/ui/core/samples/ModifierSamples.kt
index a11340c..e1fde33 100644
--- a/ui/ui-core/samples/src/main/java/androidx/ui/core/samples/ModifierSamples.kt
+++ b/ui/ui-core/samples/src/main/java/androidx/ui/core/samples/ModifierSamples.kt
@@ -57,7 +57,7 @@
 @Composable
 fun ModifierParameterSample() {
     @Composable
-    fun PaddedColumn(modifier: Modifier = Modifier.None) {
+    fun PaddedColumn(modifier: Modifier = Modifier) {
         Column(modifier.padding(10.dp)) {
             // ...
         }
@@ -71,8 +71,8 @@
     fun ButtonBar(
         onOk: () -> Unit,
         onCancel: () -> Unit,
-        modifier: Modifier = Modifier.None,
-        buttonModifier: Modifier = Modifier.None
+        modifier: Modifier = Modifier,
+        buttonModifier: Modifier = Modifier
     ) {
         Row(modifier) {
             Button(onCancel, buttonModifier) {
diff --git a/ui/ui-core/src/main/java/androidx/ui/autofill/AutofillTree.kt b/ui/ui-core/src/main/java/androidx/ui/autofill/AutofillTree.kt
index c3ca40e..1206ee5 100644
--- a/ui/ui-core/src/main/java/androidx/ui/autofill/AutofillTree.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/autofill/AutofillTree.kt
@@ -17,18 +17,32 @@
 package androidx.ui.autofill
 
 /**
- * The autofill tree.
+ * The autofill tree is a temporary data structure that is used before the Semantics Tree is
+ * implemented. This data structure is used by compose components to set autofill
+ * hints (via [AutofillNode]s). It is also used  by the autofill framework to communicate with
+ * Compose components (by calling [performAutofill]).
  *
- * This is used temporarily until we have a semantic tree implemented (b/138604305). This
- * implementation is a tree of height = 1, and we don't use the root node right now, so this is
- * essentially a group of leaf nodes.
+ * The [AutofillTree] will be replaced by Autofill Semantics (b/138604305).
+ *
+ * Since this is a temporary implementation, it is implemented as a list of [children], which is
+ * essentially a tree of height = 1
  */
 class AutofillTree {
+    /**
+     * A map which contains [AutofillNode]s, where every node represents an autofillable field.
+     */
     val children: MutableMap<Int, AutofillNode> = mutableMapOf()
 
+    /**
+     * Add the specified [AutofillNode] to the [AutofillTree].
+     */
     operator fun plusAssign(autofillNode: AutofillNode) {
         children[autofillNode.id] = autofillNode
     }
 
+    /**
+     * The autofill framework uses this function to 'fill' the [AutofillNode] represented by
+     * [id] with the specified [value].
+     */
     fun performAutofill(id: Int, value: String) = children[id]?.onFill?.invoke(value)
 }
\ No newline at end of file
diff --git a/ui/ui-core/src/main/java/androidx/ui/core/Constraints.kt b/ui/ui-core/src/main/java/androidx/ui/core/Constraints.kt
index 41d3b05a..dd190c1 100644
--- a/ui/ui-core/src/main/java/androidx/ui/core/Constraints.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/core/Constraints.kt
@@ -25,7 +25,7 @@
 import androidx.ui.unit.isFinite
 
 /**
- * Immutable constraints used for measuring child [Layout]s. A parent [Layout]
+ * Immutable constraints used for measuring child [Layout]s or [LayoutModifier2]s. A parent layout
  * can measure their children using the measure method on the corresponding [Measurable]s,
  * method which takes the [Constraints] the child has to follow. A measured child is then
  * responsible to choose for themselves and return a size which satisfies the set of [Constraints]
@@ -37,6 +37,12 @@
  * parent needs to measure the children with appropriate [Constraints], such that whatever valid
  * sizes children choose, they can be laid out in a way that also respects the parent's incoming
  * [Constraints]. Note that different children can be measured with different [Constraints].
+ * A child is allowed to choose a size that does not satisfy its constraints. However, when this
+ * happens, the parent will not read from the [Placeable] the real size of the child, but rather
+ * one that was coerced in the child's constraints; therefore, a parent can assume that its
+ * children will always respect the constraints in their layout algorithm. When this does not
+ * happen in reality, the position assigned to the child will be automatically offset to be centered
+ * on the space assigned by the parent under the assumption that constraints were respected.
  * A set of [Constraints] can have infinite maxWidth and/or maxHeight. This is a trick often
  * used by parents to ask their children for their preferred size: unbounded constraints force
  * children whose default behavior is to fill the available space (always size to
diff --git a/ui/ui-core/src/main/java/androidx/ui/core/ContentDrawScope.kt b/ui/ui-core/src/main/java/androidx/ui/core/ContentDrawScope.kt
new file mode 100644
index 0000000..73b1c69
--- /dev/null
+++ b/ui/ui-core/src/main/java/androidx/ui/core/ContentDrawScope.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.ui.core
+
+import androidx.ui.graphics.Canvas
+import androidx.ui.unit.Density
+import androidx.ui.unit.PxSize
+
+/**
+ * Receiver scope for drawing content into a layout.
+ * @see Modifier.drawBehind
+ * @see androidx.ui.foundation.Canvas
+ */
+interface DrawScope : Canvas, Density {
+    /**
+     * The size of layout being drawn in.
+     */
+    val size: PxSize
+}
+
+/**
+ * Receiver scope for drawing content into a layout, where the content can
+ * be drawn between other canvas operations. If [drawContent] is not called,
+ * the contents of the layout will not be drawn.
+ *
+ * @see DrawModifier
+ */
+interface ContentDrawScope : DrawScope {
+    /**
+     * Causes child drawing operations to run during the `onPaint` lambda.
+     */
+    fun drawContent()
+}
diff --git a/ui/ui-core/src/main/java/androidx/ui/core/DrawModifier.kt b/ui/ui-core/src/main/java/androidx/ui/core/DrawModifier.kt
index 7f37e21..ce9bb36 100644
--- a/ui/ui-core/src/main/java/androidx/ui/core/DrawModifier.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/core/DrawModifier.kt
@@ -17,26 +17,19 @@
 package androidx.ui.core
 
 import androidx.ui.graphics.Canvas
-import androidx.ui.unit.Density
-import androidx.ui.unit.PxSize
 
 /**
  * A [Modifier.Element] that draws into the space of the layout.
  */
 interface DrawModifier : Modifier.Element {
-    fun draw(
-        density: Density,
-        drawContent: () -> Unit,
-        canvas: Canvas,
-        size: PxSize
-    )
+    fun ContentDrawScope.draw()
 }
 
 /**
  * Draw into a [Canvas] behind the modified content.
  */
 fun Modifier.drawBehind(
-    onDraw: Density.(canvas: Canvas, size: PxSize) -> Unit
+    onDraw: DrawScope.() -> Unit
 ) = this + DrawBackgroundModifier(onDraw)
 
 /**
@@ -51,24 +44,15 @@
     )
 )
 fun draw(
-    onDraw: Density.(canvas: Canvas, size: PxSize) -> Unit
+    onDraw: DrawScope.() -> Unit
 ): DrawModifier = DrawBackgroundModifier(onDraw)
 
 private class DrawBackgroundModifier(
-    val onDraw: Density.(canvas: Canvas, size: PxSize) -> Unit
+    val onDraw: DrawScope.() -> Unit
 ) : DrawModifier {
-
-    override fun draw(
-        density: Density,
-        drawContent: () -> Unit,
-        canvas: Canvas,
-        size: PxSize
-    ) {
-        try {
-            density.onDraw(canvas, size)
-        } finally {
-            drawContent()
-        }
+    override fun ContentDrawScope.draw() {
+        onDraw()
+        drawContent()
     }
 }
 
@@ -76,34 +60,11 @@
  * Creates a [DrawModifier] that allows the developer to draw before or after the layout's
  * contents. It also allows the modifier to adjust the layout's canvas.
  */
-// TODO(mount): DrawReceiver should accept a Canvas for drawChildren()
-// TODO(mount): drawChildren() should be drawContent()
-// TODO Current implementation is not thread-safe
-fun drawWithContent(
-    onDraw: DrawReceiver.(canvas: Canvas, size: PxSize) -> Unit
-): DrawModifier = object : DrawModifier, DrawReceiver {
-    private var _density: Density? = null
-    override val density: Float get() = _density!!.density
-    override val fontScale: Float get() = _density!!.fontScale
-    private var drawContentFunction: (() -> Unit)? = null
-
-    override fun draw(
-        density: Density,
-        drawContent: () -> Unit,
-        canvas: Canvas,
-        size: PxSize
-    ) {
-        drawContentFunction = drawContent
-        _density = density
-        try {
-            this.onDraw(canvas, size)
-        } finally {
-            _density = null
-            drawContentFunction = null
-        }
-    }
-
-    override fun drawChildren() {
-        drawContentFunction!!.invoke()
+// TODO: Inline this function -- it breaks with current compiler
+/*inline*/ fun drawWithContent(
+    onDraw: ContentDrawScope.() -> Unit
+): DrawModifier = object : DrawModifier {
+    override fun ContentDrawScope.draw() {
+        onDraw()
     }
 }
diff --git a/ui/ui-core/src/main/java/androidx/ui/core/DrawReceiver.kt b/ui/ui-core/src/main/java/androidx/ui/core/DrawReceiver.kt
deleted file mode 100644
index d6b6b88..0000000
--- a/ui/ui-core/src/main/java/androidx/ui/core/DrawReceiver.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package androidx.ui.core
-
-import androidx.ui.unit.Density
-
-/**
- * Receiver scope for [Draw] lambda that allows ordering the child drawing between
- * canvas operations. Most Draw calls don't accept children, but in some rare cases
- * a [Canvas] should be modified for the children. [DrawReceiver] is the receiver scope for
- * the `onPaint` to give access to [drawChildren].
- */
-interface DrawReceiver : Density {
-    /**
-     * Causes child drawing operations to run during the `onPaint` lambda.
-     */
-    fun drawChildren()
-}
diff --git a/ui/ui-core/src/main/java/androidx/ui/core/LayoutCoordinates.kt b/ui/ui-core/src/main/java/androidx/ui/core/LayoutCoordinates.kt
index 09e9295..7254dfe 100644
--- a/ui/ui-core/src/main/java/androidx/ui/core/LayoutCoordinates.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/core/LayoutCoordinates.kt
@@ -20,6 +20,8 @@
 import androidx.ui.unit.IntPxSize
 import androidx.ui.unit.PxBounds
 import androidx.ui.unit.PxPosition
+import androidx.ui.unit.px
+import androidx.ui.unit.toPx
 
 /**
  * A holder of the measured bounds for the layout (MeasureBox).
@@ -95,6 +97,23 @@
     get() {
         return findRoot(this).childBoundingBox(this)
     }
+
+/**
+ * Returns the position of the top-left in the parent's content area or (0, 0)
+ * for the root.
+ */
+val LayoutCoordinates.positionInParent: PxPosition
+    get() = parentCoordinates?.childToLocal(this, PxPosition.Origin) ?: PxPosition.Origin
+
+/**
+ * Returns the bounding box of the child in the parent's content area, including any clipping
+ * done with respect to the parent. For the root, the bounds is positioned at (0, 0) and sized
+ * to the size of the root.
+ */
+val LayoutCoordinates.boundsInParent: PxBounds
+    get() = parentCoordinates?.childBoundingBox(this)
+        ?: PxBounds(0.px, 0.px, size.width.toPx(), size.height.toPx())
+
 /**
  * The global boundaries of this layout inside.
  */
diff --git a/ui/ui-core/src/main/java/androidx/ui/core/LayoutModifier.kt b/ui/ui-core/src/main/java/androidx/ui/core/LayoutModifier.kt
index 19936c6..c954be3 100644
--- a/ui/ui-core/src/main/java/androidx/ui/core/LayoutModifier.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/core/LayoutModifier.kt
@@ -236,7 +236,8 @@
 
     private class DummyPlaceable(width: IntPx, height: IntPx) : Placeable() {
         override fun get(line: AlignmentLine): IntPx? = null
-        override val size = IntPxSize(width, height)
+        override val measurementConstraints = Constraints()
+        override val measuredSize = IntPxSize(width, height)
         override fun performPlace(position: IntPxPosition) { }
     }
 
diff --git a/ui/ui-core/src/main/java/androidx/ui/core/Modifier.kt b/ui/ui-core/src/main/java/androidx/ui/core/Modifier.kt
index 4aa04b8..802a133 100644
--- a/ui/ui-core/src/main/java/androidx/ui/core/Modifier.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/core/Modifier.kt
@@ -35,11 +35,11 @@
  *
  * Composables that accept a [Modifier] as a parameter to be applied to the whole component
  * represented by the composable function should name the parameter `modifier` and
- * assign the parameter a default value of [Modifier.None]. It should appear as the first
+ * assign the parameter a default value of [Modifier]. It should appear as the first
  * optional parameter in the parameter list; after all required parameters (except for trailing
  * lambda parameters) but before any other parameters with default values. Any default modifiers
  * desired by a composable function should come after the `modifier` parameter's value in the
- * composable function's implementation, keeping [Modifier.None] as the default parameter value.
+ * composable function's implementation, keeping [Modifier] as the default parameter value.
  * For example:
  *
  * @sample androidx.ui.core.samples.ModifierParameterSample
@@ -85,7 +85,7 @@
      * Returns a [Modifier] representing this modifier followed by [other] in sequence.
      */
     operator fun plus(other: Modifier): Modifier =
-        if (other === None) this else foldOut(other) { element, wrapped ->
+        if (other === Modifier) this else foldOut(other) { element, wrapped ->
             CombinedModifier(element, wrapped)
         }
 
@@ -100,18 +100,38 @@
             operation(this, initial)
     }
 
+    /**
+     * The companion object `Modifier` is the empty, default, or starter [Modifier]
+     * that contains no [elements][Element]. Use it to create a new [Modifier] using
+     * modifier extension factory functions:
+     *
+     * @sample androidx.ui.core.samples.ModifierUsageSample
+     *
+     * or as the default value for [Modifier] parameters:
+     *
+     * @sample androidx.ui.core.samples.ModifierParameterSample
+     */
     // The companion object implements `Modifier` so that it may be used  as the start of a
     // modifier extension factory expression.
     companion object : Modifier {
         override fun <R> foldIn(initial: R, operation: (R, Element) -> R): R = initial
         override fun <R> foldOut(initial: R, operation: (Element, R) -> R): R = initial
         override operator fun plus(other: Modifier): Modifier = other
-        override fun toString() = "Modifier.None"
+        override fun toString() = "Modifier"
 
         /**
          * An empty [Modifier] that contains no [elements][Element].
          * Suitable for use as a sentinel or default parameter.
+         *
+         * @deprecated Use the [Modifier] companion object instead
          */
+        @Deprecated(
+            "use the Modifier companion object instead",
+            replaceWith = ReplaceWith(
+                "Modifier",
+                "androidx.ui.core.Modifier"
+            )
+        )
         val None: Modifier get() = this
     }
 }
@@ -119,7 +139,7 @@
 /**
  * A node in a [Modifier] chain. A CombinedModifier always contains at least two elements;
  * a Modifier of one is always just the [Modifier.Element] itself, and a Modifier of zero is always
- * [Modifier.None].
+ * [Modifier].
  */
 private class CombinedModifier(
     private val element: Modifier.Element,
diff --git a/ui/ui-core/src/main/java/androidx/ui/core/Placeable.kt b/ui/ui-core/src/main/java/androidx/ui/core/Placeable.kt
index c9618f63..c84d0a3 100644
--- a/ui/ui-core/src/main/java/androidx/ui/core/Placeable.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/core/Placeable.kt
@@ -21,6 +21,7 @@
 import androidx.ui.unit.IntPxSize
 import androidx.ui.unit.Px
 import androidx.ui.unit.PxPosition
+import androidx.ui.unit.coerceIn
 import androidx.ui.unit.round
 
 /**
@@ -31,16 +32,26 @@
  */
 abstract class Placeable {
     /**
-     * The width, in pixels, of the measured layout. This is the `width`
-     * value passed into [MeasureScope.layout].
+     * The width, in pixels, of the measured layout, as seen by the parent. This is usually the
+     * `width` value passed into [MeasureScope.layout], but will be different if the layout does
+     * not respect its incoming constraints, so the width will be coerced inside the min and
+     * max width.
      */
-    val width: IntPx get() = size.width
+    val width: IntPx get() = measuredSize.width.coerceIn(
+        measurementConstraints.minWidth,
+        measurementConstraints.maxWidth
+    )
 
     /**
-     * The height, in pixels, of the measured layout. This is the `height`
-     * value passed into [MeasureScope.layout].
+     * The height, in pixels, of the measured layout, as seen by the parent. This is usually the
+     * `height` value passed into [MeasureScope.layout], but can be different if the layout does
+     * not respect its incoming constraints, so the height will be coerced inside the min and
+     * max height.
      */
-    val height: IntPx get() = size.height
+    val height: IntPx get() = measuredSize.height.coerceIn(
+        measurementConstraints.minHeight,
+        measurementConstraints.maxHeight
+    )
 
     /**
      * Returns the position of an [alignment line][AlignmentLine],
@@ -49,9 +60,9 @@
     abstract operator fun get(line: AlignmentLine): IntPx?
 
     /**
-     * The measured size of this Placeable.
+     * The measured size of this Placeable. This might not respect [measurementConstraints].
      */
-    abstract val size: IntPxSize
+    protected abstract val measuredSize: IntPxSize
 
     /**
      * Positions the [Placeable] at [position] in its parent's coordinate system.
@@ -59,6 +70,19 @@
     protected abstract fun performPlace(position: IntPxPosition)
 
     /**
+     * The constraints used for the measurement made to obtain this [Placeable].
+     */
+    protected abstract val measurementConstraints: Constraints
+
+    /**
+     * The offset to be added to an apparent position assigned to this [Placeable] to make it real.
+     * The real layout will be centered on the space assigned by the parent, which computed the
+     * child's position only seeing its apparent size.
+     */
+    protected val apparentToRealOffset: IntPxPosition
+        get() = IntPxPosition((width - measuredSize.width) / 2, (height - measuredSize.height) / 2)
+
+    /**
      * Receiver scope that permits explicit placement of a [Placeable].
      *
      * While a [Placeable] may be placed at any time, this explicit receiver scope is used
@@ -98,9 +122,11 @@
          */
         fun Placeable.place(position: IntPxPosition) {
             if (parentLayoutDirection == LayoutDirection.Ltr || parentWidth == IntPx.Zero) {
-                performPlace(position)
+                placeAbsolute(position)
             } else {
-                performPlace(IntPxPosition(parentWidth - width - position.x, position.y))
+                placeAbsolute(
+                    IntPxPosition(parentWidth - measuredSize.width - position.x, position.y)
+                )
             }
         }
 
@@ -119,23 +145,23 @@
 
         /**
          * Place a [Placeable] at [x], [y] in its parent's coordinate system.
-         * If the layout direction is right-to-left, the given [position] will be horizontally
+         * If the layout direction is right-to-left, the given position will be horizontally
          * mirrored so that the position of the [Placeable] implicitly reacts to RTL layout
          * direction contexts.
          * If this method is used outside the [MeasureScope.layout] positioning block, the
          * automatic position mirroring will not happen and the [Placeable] will be placed at the
-         * given [position], similar to the [placeAbsolute] method.
+         * given position, similar to the [placeAbsolute] method.
          */
         fun Placeable.place(x: IntPx, y: IntPx) = place(IntPxPosition(x, y))
 
         /**
          * Place a [Placeable] at [x], [y] in its parent's coordinate system.
-         * If the layout direction is right-to-left, the given [position] will be horizontally
+         * If the layout direction is right-to-left, the given position will be horizontally
          * mirrored so that the position of the [Placeable] implicitly reacts to RTL layout
          * direction contexts.
          * If this method is used outside the [MeasureScope.layout] positioning block, the
          * automatic position mirroring will not happen and the [Placeable] will be placed at the
-         * given [position], similar to the [placeAbsolute] method.
+         * given position, similar to the [placeAbsolute] method.
          */
         fun Placeable.place(x: Px, y: Px) = place(IntPxPosition(x.round(), y.round()))
 
@@ -144,32 +170,32 @@
          * Unlike [place], the given [position] will not implicitly react in RTL layout direction
          * contexts.
          */
-        fun Placeable.placeAbsolute(position: IntPxPosition) {
-            performPlace(position)
-        }
-
-        /**
-         * Place a [Placeable] at [position] in its parent's coordinate system.
-         * Unlike [place], the given [position] will not implicitly react in RTL layout direction
-         * contexts.
-         */
         fun Placeable.placeAbsolute(position: PxPosition) {
             placeAbsolute(position.round())
         }
 
         /**
          * Place a [Placeable] at [x], [y] in its parent's coordinate system.
-         * Unlike [place], the given [position] will not implicitly react in RTL layout direction
+         * Unlike [place], the given position will not implicitly react in RTL layout direction
          * contexts.
          */
         fun Placeable.placeAbsolute(x: IntPx, y: IntPx) = placeAbsolute(IntPxPosition(x, y))
 
         /**
          * Place a [Placeable] at [x], [y] in its parent's coordinate system.
-         * Unlike [place], the given [position] will not implicitly react in RTL layout direction
+         * Unlike [place], the given position will not implicitly react in RTL layout direction
          * contexts.
          */
         fun Placeable.placeAbsolute(x: Px, y: Px) =
             placeAbsolute(IntPxPosition(x.round(), y.round()))
+
+        /**
+         * Place a [Placeable] at [position] in its parent's coordinate system.
+         * Unlike [place], the given [position] will not implicitly react in RTL layout direction
+         * contexts.
+         */
+        fun Placeable.placeAbsolute(position: IntPxPosition) {
+            performPlace(position + apparentToRealOffset)
+        }
     }
 }
\ No newline at end of file
diff --git a/ui/ui-core/src/main/java/androidx/ui/core/PointerInput.kt b/ui/ui-core/src/main/java/androidx/ui/core/PointerInput.kt
index e3e0e61..0ed9c5f 100644
--- a/ui/ui-core/src/main/java/androidx/ui/core/PointerInput.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/core/PointerInput.kt
@@ -25,6 +25,25 @@
 /**
  * Describes a change that has occurred for a particular pointer, as well as how much of the change
  * has been consumed (meaning, used by a node in the UI).
+ *
+ * The [current] data always represents the position of the pointer relative to the element that
+ * this [PointerInputChange] is being dispatched to.
+ *
+ * The [previous] data, however, represents the position of the pointer offset to the current
+ * position of the pointer relative to the screen.
+ *
+ * This means that [current] and [previous] can always be used to understand how much a pointer
+ * has moved relative to an element, even if that element is moving along with the changes to the
+ * pointer.  For example, if a pointer touches a 1x1 pixel box in the middle, [current] will
+ * report a position of (0, 0) when dispatched to it.  If the next event moves x position 5
+ * pixels, [current] will report (5, 0) and [previous] will report (0, 0).  If the box moves all 5
+ * pixels, and the next event represents the pointer moving along the x axis for 5 more pixels,
+ * [current] will again report (5, 0) and [previous] will report (0, 0).
+ *
+ * @param id The unique id of the pointer associated with this [PointerInputChange].
+ * @param current The [PointerInputData] that represents the current state of this pointer.
+ * @param previous The [PointerInputData] that represents the previous state of this pointer.
+ * @param consumed Which aspects of this change have been consumed.
  */
 data class PointerInputChange(
     val id: PointerId,
@@ -43,6 +62,11 @@
 // TODO(shepshapard): Uptime will be an Inline Class, so it should not be nullable.
 /**
  * Data associated with a pointer.
+ *
+ * @param uptime The time associated with this particular [PointerInputData]
+ * @param position The position of the pointer at [uptime] relative to element that
+ * the owning [PointerInputChange] is being dispatched to.
+ * @param down True if the at [uptime] the pointer was contacting the screen.
  */
 data class PointerInputData(
     val uptime: Uptime? = null,
@@ -52,6 +76,9 @@
 
 /**
  * Describes what aspects of, and how much of, a change has been consumed.
+ *
+ * @param positionChange The amount of change to the position that has been consumed.
+ * @param downChange True if a change to down or up has been consumed.
  */
 data class ConsumedData(
     val positionChange: PxPosition = PxPosition.Origin,
@@ -103,23 +130,54 @@
 
 // Change querying functions
 
+/**
+ * True if this [PointerInputChange] represents a pointer coming in contact with the screen and
+ * that change has not been consumed.
+ */
 fun PointerInputChange.changedToDown() = !consumed.downChange && !previous.down && current.down
 
+/**
+ * True if this [PointerInputChange] represents a pointer coming in contact with the screen, whether
+ * or not that change has been consumed.
+ */
 fun PointerInputChange.changedToDownIgnoreConsumed() = !previous.down && current.down
 
+/**
+ * True if this [PointerInputChange] represents a pointer breaking contact with the screen and
+ * that change has not been consumed.
+ */
 fun PointerInputChange.changedToUp() = !consumed.downChange && previous.down && !current.down
 
+/**
+ * True if this [PointerInputChange] represents a pointer breaking contact with the screen, whether
+ * or not that change has been consumed.
+ */
 fun PointerInputChange.changedToUpIgnoreConsumed() = previous.down && !current.down
 
-fun PointerInputChange.positionChange() = this.positionChangeInternal(false)
-
-fun PointerInputChange.positionChangeIgnoreConsumed() = this.positionChangeInternal(true)
-
+/**
+ * True if this [PointerInputChange] represents a pointer moving on the screen and some of that
+ * movement has not been consumed.
+ */
 fun PointerInputChange.positionChanged() = this.positionChangeInternal(false) != PxPosition.Origin
 
+/**
+ * True if this [PointerInputChange] represents a pointer moving on the screen ignoring how much
+ * of that movement may have been consumed.
+ */
 fun PointerInputChange.positionChangedIgnoreConsumed() =
     this.positionChangeInternal(true) != PxPosition.Origin
 
+/**
+ * The distance that the pointer has moved on the screen minus any distance that has been consumed.
+ */
+fun PointerInputChange.positionChange() = this.positionChangeInternal(false)
+
+/**
+ * The distance that the pointer has moved on the screen, ignoring any distance that may have been
+ * consumed.
+ */
+fun PointerInputChange.positionChangeIgnoreConsumed() = this.positionChangeInternal(true)
+
 private fun PointerInputChange.positionChangeInternal(ignoreConsumed: Boolean = false): PxPosition {
     val previousPosition = previous.position
     val currentPosition = current.position
@@ -140,14 +198,30 @@
 
 // Consumption querying functions
 
+/**
+ * True if any of this [PointerInputChange]s movement has been consumed.
+ */
 fun PointerInputChange.anyPositionChangeConsumed() =
     consumed.positionChange.x.value != 0f || consumed.positionChange.y.value != 0f
 
 // Consume functions
 
+/**
+ * Consume the up or down change of this [PointerInputChange].
+ *
+ * Note: This function creates a modified copy of this [PointerInputChange].
+ */
 fun PointerInputChange.consumeDownChange() =
     copy(consumed = this.consumed.copy(downChange = true))
 
+/**
+ * Consumes some portion of the position change of this [PointerInputChange].
+ *
+ * Note: This function creates a modified copy of this [PointerInputChange]
+ *
+ * @param consumedDx The amount of position change on the x axis to consume.
+ * @param consumedDy The amount of position change on the y axis to consume.
+ */
 fun PointerInputChange.consumePositionChange(
     consumedDx: Px,
     consumedDy: Px
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/LayoutCoordinatesHelper.kt b/ui/ui-core/src/main/java/androidx/ui/core/Ref.kt
similarity index 67%
rename from ui/ui-test/src/main/java/androidx/ui/test/LayoutCoordinatesHelper.kt
rename to ui/ui-core/src/main/java/androidx/ui/core/Ref.kt
index b09b72c..77a4e85 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/LayoutCoordinatesHelper.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/core/Ref.kt
@@ -14,13 +14,11 @@
  * limitations under the License.
  */
 
-package androidx.ui.test
-
-import androidx.ui.core.LayoutCoordinates
-import androidx.ui.unit.PxPosition
+package androidx.ui.core
 
 /**
- * Returns the position relative to the parent Layout
+ * Value holder general purpose class.
  */
-val LayoutCoordinates.positionInParent: PxPosition
-    get() = parentCoordinates?.childToLocal(this, PxPosition.Origin) ?: PxPosition.Origin
\ No newline at end of file
+class Ref<T> {
+    var value: T? = null
+}
diff --git a/ui/ui-core/src/main/java/androidx/ui/focus/FocusModifier.kt b/ui/ui-core/src/main/java/androidx/ui/focus/FocusModifier.kt
new file mode 100644
index 0000000..f5cc7ea
--- /dev/null
+++ b/ui/ui-core/src/main/java/androidx/ui/focus/FocusModifier.kt
@@ -0,0 +1,59 @@
+/*
+ * 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.ui.focus
+
+import androidx.ui.core.Modifier
+
+/**
+ * A [Modifier.Element] that wraps makes the modifiers on the right into a Focusable. Use a
+ * different instance of [FocusModifier] for each focusable component.
+ *
+ * TODO(b/152528891): Write tests for [FocusModifier] after we finalize on the api (API
+ * review tracked by b/152529882).
+ */
+interface FocusModifier : Modifier.Element {
+    /**
+     * The current focus state of the component wrapped by this [Modifier].
+     */
+    val focusDetailedState: FocusDetailedState
+
+    /**
+     * Use this function to request focus for this component. If the system grants focus to the
+     * component wrapped by this [modifier][FocusModifier], its [state][focusDetailedState] will
+     * be set to [Active][FocusDetailedState.Active].
+     */
+    fun requestFocus()
+
+    /**
+     * Use this function to send a request to capture the focus. If a component is captured, it's
+     * [state][focusDetailedState] will be set to [Captured][FocusDetailedState.Captured]. When a
+     * component is in this state, it holds onto focus until [freeFocus] is called. When a
+     * component is in the [Captured][FocusDetailedState.Captured] state, all focus requests from
+     * other components are declined.
+     *
+     * @return true if the focus was successfully captured. false otherwise.
+     */
+    fun captureFocus(): Boolean
+
+    /**
+     * Use this function to send a request to release focus when the component is in a
+     * [Captured][FocusDetailedState.Captured] state.
+     *
+     * @return true if the focus was successfully released. false otherwise.
+     */
+    fun freeFocus(): Boolean
+}
\ No newline at end of file
diff --git a/ui/ui-foundation/api/0.1.0-dev08.txt b/ui/ui-foundation/api/0.1.0-dev08.txt
index c8bb322..2689396 100644
--- a/ui/ui-foundation/api/0.1.0-dev08.txt
+++ b/ui/ui-foundation/api/0.1.0-dev08.txt
@@ -114,7 +114,7 @@
   }
 
   public final class PasswordTextFieldKt {
-    method public static void PasswordTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange = {}, androidx.ui.text.TextStyle textStyle = TextStyle.Default, char mask = '\u2022', androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {});
+    method public static void PasswordTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange = {}, androidx.ui.graphics.Color? textColor = null, androidx.ui.text.TextStyle textStyle = TextStyle.Default, char mask = '\u2022', androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {});
   }
 
   public final class ScrollerKt {
@@ -156,15 +156,15 @@
   }
 
   public final class TextFieldKt {
-    method public static void TextField(String value, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-    method public static void TextField(androidx.ui.text.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-    method public static void TextField(androidx.ui.text.TextFieldValue model, androidx.ui.text.TextRange? compositionRange, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function2<? super androidx.ui.text.TextFieldValue,? super androidx.ui.text.TextRange,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void TextField(String value, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, androidx.ui.graphics.Color? textColor = null, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void TextField(androidx.ui.text.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.graphics.Color? textColor = null, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void TextField(androidx.ui.text.TextFieldValue model, androidx.ui.text.TextRange? compositionRange, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function2<? super androidx.ui.text.TextFieldValue,? super androidx.ui.text.TextRange,kotlin.Unit> onValueChange, androidx.ui.graphics.Color? textColor = null, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
   }
 
   public final class TextKt {
     method public static void ProvideTextStyle(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void Text(String text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void Text(String text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color? color = null, androidx.ui.unit.TextUnit size = TextUnit.Inherit, androidx.ui.text.style.TextAlign? align = null, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color? color = null, androidx.ui.unit.TextUnit size = TextUnit.Inherit, androidx.ui.text.style.TextAlign? align = null, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
     method public static androidx.ui.text.TextStyle currentTextStyle();
   }
 
diff --git a/ui/ui-foundation/api/0.1.0-dev09.txt b/ui/ui-foundation/api/0.1.0-dev09.txt
index 2466d14..f5e9c04 100644
--- a/ui/ui-foundation/api/0.1.0-dev09.txt
+++ b/ui/ui-foundation/api/0.1.0-dev09.txt
@@ -2,7 +2,7 @@
 package androidx.ui.foundation {
 
   public final class AdapterListKt {
-    method public static <T> void AdapterList(java.util.List<? extends T> data, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> itemCallback);
+    method public static <T> void AdapterList(java.util.List<? extends T> data, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> itemCallback);
   }
 
   public final class Border {
@@ -19,37 +19,32 @@
   }
 
   public final class BoxKt {
-    method public static void Box(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp padding = elvis {
-    @null var var411905cf: androidx.ui.unit.Dp = border?.size
-    if (var411905cf != null) var411905cf else 0.dp
+    method public static void Box(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp padding = elvis {
+    @null var var41190502: androidx.ui.unit.Dp = border?.size
+    if (var41190502 != null) var41190502 else 0.dp
 }, androidx.ui.unit.Dp paddingStart = Dp.Unspecified, androidx.ui.unit.Dp paddingTop = Dp.Unspecified, androidx.ui.unit.Dp paddingEnd = Dp.Unspecified, androidx.ui.unit.Dp paddingBottom = Dp.Unspecified, androidx.ui.core.Alignment gravity = ContentGravity.TopStart, kotlin.jvm.functions.Function0<kotlin.Unit> children = emptyContent());
   }
 
   public final class CanvasKt {
-    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.CanvasScope,kotlin.Unit> onCanvas);
-  }
-
-  public interface CanvasScope extends androidx.ui.graphics.Canvas androidx.ui.unit.Density {
-    method public androidx.ui.unit.PxSize getSize();
-    property public abstract androidx.ui.unit.PxSize size;
+    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
   }
 
   public final class ClickableKt {
-    method public static void Clickable(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, String? onClickLabel = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void Clickable(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, String? onClickLabel = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class ClickableTextKt {
-    method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
+    method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
   }
 
   public final class ColoredRectKt {
-    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
-    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Color color, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
+    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
+    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Color color, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
   }
 
   public final class ContentColorKt {
-    method public static void ProvideContentColor(androidx.ui.graphics.Color color, kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static androidx.ui.graphics.Color contentColor();
+    method public static androidx.compose.ProvidableAmbient<androidx.ui.graphics.Color> getContentColorAmbient();
   }
 
   public final class DarkThemeKt {
@@ -66,7 +61,7 @@
 
   public final class DrawBackground implements androidx.ui.core.DrawModifier {
     method public androidx.ui.foundation.DrawBackground copy(androidx.ui.graphics.Paint paint, androidx.ui.graphics.Shape shape);
-    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
+    method public void draw(androidx.ui.core.ContentDrawScope);
   }
 
   public final class DrawBackgroundKt {
@@ -78,7 +73,7 @@
   }
 
   public final class DrawBorder implements androidx.ui.core.DrawModifier {
-    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
+    method public void draw(androidx.ui.core.ContentDrawScope);
   }
 
   public final class DrawBorderKt {
@@ -104,22 +99,22 @@
   }
 
   public final class IconKt {
-    method public static void Icon(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color tint = contentColor());
-    method public static void Icon(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color tint = contentColor());
-    method public static void Icon(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color tint = contentColor());
+    method public static void Icon(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color tint = contentColor());
+    method public static void Icon(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color tint = contentColor());
+    method public static void Icon(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color tint = contentColor());
   }
 
   public final class ImageKt {
-    method public static inline void Image(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
-    method public static inline void Image(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
-    method public static void Image(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
+    method public static inline void Image(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
+    method public static inline void Image(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
+    method public static void Image(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
     method @Deprecated public static void SimpleImage(androidx.ui.graphics.ImageAsset image, androidx.ui.graphics.Color? tint = null);
   }
 
   public final class ScrollerKt {
-    method public static void HorizontalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier.None, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
+    method public static void HorizontalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
     method public static androidx.ui.foundation.ScrollerPosition ScrollerPosition(float initial = 0f);
-    method public static void VerticalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier.None, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
+    method public static void VerticalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
   }
 
   public final class ScrollerPosition {
@@ -155,7 +150,7 @@
   }
 
   public final class TextFieldKt {
-    method public static void TextField(androidx.ui.foundation.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void TextField(androidx.ui.foundation.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.graphics.Color? textColor = null, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
   }
 
   public final class TextFieldValue {
@@ -170,8 +165,8 @@
 
   public final class TextKt {
     method public static void ProvideTextStyle(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void Text(String text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void Text(String text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color? color = null, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color? color = null, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
     method public static androidx.ui.text.TextStyle currentTextStyle();
   }
 
@@ -289,13 +284,13 @@
 package androidx.ui.foundation.selection {
 
   public final class MutuallyExclusiveSetItemKt {
-    method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class ToggleableKt {
-    method public static void Toggleable(boolean value, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void Toggleable(boolean value, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static androidx.ui.foundation.selection.ToggleableState ToggleableState(boolean value);
-    method public static void TriStateToggleable(androidx.ui.foundation.selection.ToggleableState state = androidx.ui.foundation.selection.ToggleableState.On, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void TriStateToggleable(androidx.ui.foundation.selection.ToggleableState state = androidx.ui.foundation.selection.ToggleableState.On, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public enum ToggleableState {
diff --git a/ui/ui-foundation/api/current.txt b/ui/ui-foundation/api/current.txt
index 2466d14..f5e9c04 100644
--- a/ui/ui-foundation/api/current.txt
+++ b/ui/ui-foundation/api/current.txt
@@ -2,7 +2,7 @@
 package androidx.ui.foundation {
 
   public final class AdapterListKt {
-    method public static <T> void AdapterList(java.util.List<? extends T> data, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> itemCallback);
+    method public static <T> void AdapterList(java.util.List<? extends T> data, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> itemCallback);
   }
 
   public final class Border {
@@ -19,37 +19,32 @@
   }
 
   public final class BoxKt {
-    method public static void Box(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp padding = elvis {
-    @null var var411905cf: androidx.ui.unit.Dp = border?.size
-    if (var411905cf != null) var411905cf else 0.dp
+    method public static void Box(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp padding = elvis {
+    @null var var41190502: androidx.ui.unit.Dp = border?.size
+    if (var41190502 != null) var41190502 else 0.dp
 }, androidx.ui.unit.Dp paddingStart = Dp.Unspecified, androidx.ui.unit.Dp paddingTop = Dp.Unspecified, androidx.ui.unit.Dp paddingEnd = Dp.Unspecified, androidx.ui.unit.Dp paddingBottom = Dp.Unspecified, androidx.ui.core.Alignment gravity = ContentGravity.TopStart, kotlin.jvm.functions.Function0<kotlin.Unit> children = emptyContent());
   }
 
   public final class CanvasKt {
-    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.CanvasScope,kotlin.Unit> onCanvas);
-  }
-
-  public interface CanvasScope extends androidx.ui.graphics.Canvas androidx.ui.unit.Density {
-    method public androidx.ui.unit.PxSize getSize();
-    property public abstract androidx.ui.unit.PxSize size;
+    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
   }
 
   public final class ClickableKt {
-    method public static void Clickable(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, String? onClickLabel = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void Clickable(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, String? onClickLabel = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class ClickableTextKt {
-    method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
+    method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
   }
 
   public final class ColoredRectKt {
-    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
-    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Color color, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
+    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
+    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Color color, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
   }
 
   public final class ContentColorKt {
-    method public static void ProvideContentColor(androidx.ui.graphics.Color color, kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static androidx.ui.graphics.Color contentColor();
+    method public static androidx.compose.ProvidableAmbient<androidx.ui.graphics.Color> getContentColorAmbient();
   }
 
   public final class DarkThemeKt {
@@ -66,7 +61,7 @@
 
   public final class DrawBackground implements androidx.ui.core.DrawModifier {
     method public androidx.ui.foundation.DrawBackground copy(androidx.ui.graphics.Paint paint, androidx.ui.graphics.Shape shape);
-    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
+    method public void draw(androidx.ui.core.ContentDrawScope);
   }
 
   public final class DrawBackgroundKt {
@@ -78,7 +73,7 @@
   }
 
   public final class DrawBorder implements androidx.ui.core.DrawModifier {
-    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
+    method public void draw(androidx.ui.core.ContentDrawScope);
   }
 
   public final class DrawBorderKt {
@@ -104,22 +99,22 @@
   }
 
   public final class IconKt {
-    method public static void Icon(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color tint = contentColor());
-    method public static void Icon(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color tint = contentColor());
-    method public static void Icon(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color tint = contentColor());
+    method public static void Icon(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color tint = contentColor());
+    method public static void Icon(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color tint = contentColor());
+    method public static void Icon(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color tint = contentColor());
   }
 
   public final class ImageKt {
-    method public static inline void Image(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
-    method public static inline void Image(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
-    method public static void Image(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
+    method public static inline void Image(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
+    method public static inline void Image(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
+    method public static void Image(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
     method @Deprecated public static void SimpleImage(androidx.ui.graphics.ImageAsset image, androidx.ui.graphics.Color? tint = null);
   }
 
   public final class ScrollerKt {
-    method public static void HorizontalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier.None, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
+    method public static void HorizontalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
     method public static androidx.ui.foundation.ScrollerPosition ScrollerPosition(float initial = 0f);
-    method public static void VerticalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier.None, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
+    method public static void VerticalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
   }
 
   public final class ScrollerPosition {
@@ -155,7 +150,7 @@
   }
 
   public final class TextFieldKt {
-    method public static void TextField(androidx.ui.foundation.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void TextField(androidx.ui.foundation.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.graphics.Color? textColor = null, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
   }
 
   public final class TextFieldValue {
@@ -170,8 +165,8 @@
 
   public final class TextKt {
     method public static void ProvideTextStyle(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void Text(String text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void Text(String text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color? color = null, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color? color = null, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
     method public static androidx.ui.text.TextStyle currentTextStyle();
   }
 
@@ -289,13 +284,13 @@
 package androidx.ui.foundation.selection {
 
   public final class MutuallyExclusiveSetItemKt {
-    method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class ToggleableKt {
-    method public static void Toggleable(boolean value, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void Toggleable(boolean value, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static androidx.ui.foundation.selection.ToggleableState ToggleableState(boolean value);
-    method public static void TriStateToggleable(androidx.ui.foundation.selection.ToggleableState state = androidx.ui.foundation.selection.ToggleableState.On, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void TriStateToggleable(androidx.ui.foundation.selection.ToggleableState state = androidx.ui.foundation.selection.ToggleableState.On, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public enum ToggleableState {
diff --git a/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev08.txt b/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev08.txt
index c8bb322..2689396 100644
--- a/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev08.txt
+++ b/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev08.txt
@@ -114,7 +114,7 @@
   }
 
   public final class PasswordTextFieldKt {
-    method public static void PasswordTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange = {}, androidx.ui.text.TextStyle textStyle = TextStyle.Default, char mask = '\u2022', androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {});
+    method public static void PasswordTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange = {}, androidx.ui.graphics.Color? textColor = null, androidx.ui.text.TextStyle textStyle = TextStyle.Default, char mask = '\u2022', androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {});
   }
 
   public final class ScrollerKt {
@@ -156,15 +156,15 @@
   }
 
   public final class TextFieldKt {
-    method public static void TextField(String value, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-    method public static void TextField(androidx.ui.text.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-    method public static void TextField(androidx.ui.text.TextFieldValue model, androidx.ui.text.TextRange? compositionRange, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function2<? super androidx.ui.text.TextFieldValue,? super androidx.ui.text.TextRange,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void TextField(String value, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, androidx.ui.graphics.Color? textColor = null, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void TextField(androidx.ui.text.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.graphics.Color? textColor = null, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void TextField(androidx.ui.text.TextFieldValue model, androidx.ui.text.TextRange? compositionRange, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function2<? super androidx.ui.text.TextFieldValue,? super androidx.ui.text.TextRange,kotlin.Unit> onValueChange, androidx.ui.graphics.Color? textColor = null, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
   }
 
   public final class TextKt {
     method public static void ProvideTextStyle(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void Text(String text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void Text(String text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color? color = null, androidx.ui.unit.TextUnit size = TextUnit.Inherit, androidx.ui.text.style.TextAlign? align = null, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color? color = null, androidx.ui.unit.TextUnit size = TextUnit.Inherit, androidx.ui.text.style.TextAlign? align = null, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
     method public static androidx.ui.text.TextStyle currentTextStyle();
   }
 
diff --git a/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev09.txt b/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev09.txt
index 2466d14..f5e9c04 100644
--- a/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev09.txt
+++ b/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev09.txt
@@ -2,7 +2,7 @@
 package androidx.ui.foundation {
 
   public final class AdapterListKt {
-    method public static <T> void AdapterList(java.util.List<? extends T> data, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> itemCallback);
+    method public static <T> void AdapterList(java.util.List<? extends T> data, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> itemCallback);
   }
 
   public final class Border {
@@ -19,37 +19,32 @@
   }
 
   public final class BoxKt {
-    method public static void Box(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp padding = elvis {
-    @null var var411905cf: androidx.ui.unit.Dp = border?.size
-    if (var411905cf != null) var411905cf else 0.dp
+    method public static void Box(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp padding = elvis {
+    @null var var41190502: androidx.ui.unit.Dp = border?.size
+    if (var41190502 != null) var41190502 else 0.dp
 }, androidx.ui.unit.Dp paddingStart = Dp.Unspecified, androidx.ui.unit.Dp paddingTop = Dp.Unspecified, androidx.ui.unit.Dp paddingEnd = Dp.Unspecified, androidx.ui.unit.Dp paddingBottom = Dp.Unspecified, androidx.ui.core.Alignment gravity = ContentGravity.TopStart, kotlin.jvm.functions.Function0<kotlin.Unit> children = emptyContent());
   }
 
   public final class CanvasKt {
-    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.CanvasScope,kotlin.Unit> onCanvas);
-  }
-
-  public interface CanvasScope extends androidx.ui.graphics.Canvas androidx.ui.unit.Density {
-    method public androidx.ui.unit.PxSize getSize();
-    property public abstract androidx.ui.unit.PxSize size;
+    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
   }
 
   public final class ClickableKt {
-    method public static void Clickable(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, String? onClickLabel = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void Clickable(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, String? onClickLabel = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class ClickableTextKt {
-    method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
+    method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
   }
 
   public final class ColoredRectKt {
-    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
-    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Color color, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
+    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
+    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Color color, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
   }
 
   public final class ContentColorKt {
-    method public static void ProvideContentColor(androidx.ui.graphics.Color color, kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static androidx.ui.graphics.Color contentColor();
+    method public static androidx.compose.ProvidableAmbient<androidx.ui.graphics.Color> getContentColorAmbient();
   }
 
   public final class DarkThemeKt {
@@ -66,7 +61,7 @@
 
   public final class DrawBackground implements androidx.ui.core.DrawModifier {
     method public androidx.ui.foundation.DrawBackground copy(androidx.ui.graphics.Paint paint, androidx.ui.graphics.Shape shape);
-    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
+    method public void draw(androidx.ui.core.ContentDrawScope);
   }
 
   public final class DrawBackgroundKt {
@@ -78,7 +73,7 @@
   }
 
   public final class DrawBorder implements androidx.ui.core.DrawModifier {
-    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
+    method public void draw(androidx.ui.core.ContentDrawScope);
   }
 
   public final class DrawBorderKt {
@@ -104,22 +99,22 @@
   }
 
   public final class IconKt {
-    method public static void Icon(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color tint = contentColor());
-    method public static void Icon(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color tint = contentColor());
-    method public static void Icon(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color tint = contentColor());
+    method public static void Icon(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color tint = contentColor());
+    method public static void Icon(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color tint = contentColor());
+    method public static void Icon(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color tint = contentColor());
   }
 
   public final class ImageKt {
-    method public static inline void Image(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
-    method public static inline void Image(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
-    method public static void Image(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
+    method public static inline void Image(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
+    method public static inline void Image(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
+    method public static void Image(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
     method @Deprecated public static void SimpleImage(androidx.ui.graphics.ImageAsset image, androidx.ui.graphics.Color? tint = null);
   }
 
   public final class ScrollerKt {
-    method public static void HorizontalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier.None, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
+    method public static void HorizontalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
     method public static androidx.ui.foundation.ScrollerPosition ScrollerPosition(float initial = 0f);
-    method public static void VerticalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier.None, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
+    method public static void VerticalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
   }
 
   public final class ScrollerPosition {
@@ -155,7 +150,7 @@
   }
 
   public final class TextFieldKt {
-    method public static void TextField(androidx.ui.foundation.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void TextField(androidx.ui.foundation.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.graphics.Color? textColor = null, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
   }
 
   public final class TextFieldValue {
@@ -170,8 +165,8 @@
 
   public final class TextKt {
     method public static void ProvideTextStyle(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void Text(String text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void Text(String text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color? color = null, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color? color = null, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
     method public static androidx.ui.text.TextStyle currentTextStyle();
   }
 
@@ -289,13 +284,13 @@
 package androidx.ui.foundation.selection {
 
   public final class MutuallyExclusiveSetItemKt {
-    method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class ToggleableKt {
-    method public static void Toggleable(boolean value, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void Toggleable(boolean value, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static androidx.ui.foundation.selection.ToggleableState ToggleableState(boolean value);
-    method public static void TriStateToggleable(androidx.ui.foundation.selection.ToggleableState state = androidx.ui.foundation.selection.ToggleableState.On, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void TriStateToggleable(androidx.ui.foundation.selection.ToggleableState state = androidx.ui.foundation.selection.ToggleableState.On, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public enum ToggleableState {
diff --git a/ui/ui-foundation/api/public_plus_experimental_current.txt b/ui/ui-foundation/api/public_plus_experimental_current.txt
index 2466d14..f5e9c04 100644
--- a/ui/ui-foundation/api/public_plus_experimental_current.txt
+++ b/ui/ui-foundation/api/public_plus_experimental_current.txt
@@ -2,7 +2,7 @@
 package androidx.ui.foundation {
 
   public final class AdapterListKt {
-    method public static <T> void AdapterList(java.util.List<? extends T> data, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> itemCallback);
+    method public static <T> void AdapterList(java.util.List<? extends T> data, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> itemCallback);
   }
 
   public final class Border {
@@ -19,37 +19,32 @@
   }
 
   public final class BoxKt {
-    method public static void Box(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp padding = elvis {
-    @null var var411905cf: androidx.ui.unit.Dp = border?.size
-    if (var411905cf != null) var411905cf else 0.dp
+    method public static void Box(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp padding = elvis {
+    @null var var41190502: androidx.ui.unit.Dp = border?.size
+    if (var41190502 != null) var41190502 else 0.dp
 }, androidx.ui.unit.Dp paddingStart = Dp.Unspecified, androidx.ui.unit.Dp paddingTop = Dp.Unspecified, androidx.ui.unit.Dp paddingEnd = Dp.Unspecified, androidx.ui.unit.Dp paddingBottom = Dp.Unspecified, androidx.ui.core.Alignment gravity = ContentGravity.TopStart, kotlin.jvm.functions.Function0<kotlin.Unit> children = emptyContent());
   }
 
   public final class CanvasKt {
-    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.CanvasScope,kotlin.Unit> onCanvas);
-  }
-
-  public interface CanvasScope extends androidx.ui.graphics.Canvas androidx.ui.unit.Density {
-    method public androidx.ui.unit.PxSize getSize();
-    property public abstract androidx.ui.unit.PxSize size;
+    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
   }
 
   public final class ClickableKt {
-    method public static void Clickable(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, String? onClickLabel = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void Clickable(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, String? onClickLabel = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class ClickableTextKt {
-    method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
+    method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
   }
 
   public final class ColoredRectKt {
-    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
-    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Color color, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
+    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
+    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Color color, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
   }
 
   public final class ContentColorKt {
-    method public static void ProvideContentColor(androidx.ui.graphics.Color color, kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static androidx.ui.graphics.Color contentColor();
+    method public static androidx.compose.ProvidableAmbient<androidx.ui.graphics.Color> getContentColorAmbient();
   }
 
   public final class DarkThemeKt {
@@ -66,7 +61,7 @@
 
   public final class DrawBackground implements androidx.ui.core.DrawModifier {
     method public androidx.ui.foundation.DrawBackground copy(androidx.ui.graphics.Paint paint, androidx.ui.graphics.Shape shape);
-    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
+    method public void draw(androidx.ui.core.ContentDrawScope);
   }
 
   public final class DrawBackgroundKt {
@@ -78,7 +73,7 @@
   }
 
   public final class DrawBorder implements androidx.ui.core.DrawModifier {
-    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
+    method public void draw(androidx.ui.core.ContentDrawScope);
   }
 
   public final class DrawBorderKt {
@@ -104,22 +99,22 @@
   }
 
   public final class IconKt {
-    method public static void Icon(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color tint = contentColor());
-    method public static void Icon(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color tint = contentColor());
-    method public static void Icon(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color tint = contentColor());
+    method public static void Icon(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color tint = contentColor());
+    method public static void Icon(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color tint = contentColor());
+    method public static void Icon(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color tint = contentColor());
   }
 
   public final class ImageKt {
-    method public static inline void Image(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
-    method public static inline void Image(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
-    method public static void Image(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
+    method public static inline void Image(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
+    method public static inline void Image(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
+    method public static void Image(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
     method @Deprecated public static void SimpleImage(androidx.ui.graphics.ImageAsset image, androidx.ui.graphics.Color? tint = null);
   }
 
   public final class ScrollerKt {
-    method public static void HorizontalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier.None, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
+    method public static void HorizontalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
     method public static androidx.ui.foundation.ScrollerPosition ScrollerPosition(float initial = 0f);
-    method public static void VerticalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier.None, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
+    method public static void VerticalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
   }
 
   public final class ScrollerPosition {
@@ -155,7 +150,7 @@
   }
 
   public final class TextFieldKt {
-    method public static void TextField(androidx.ui.foundation.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void TextField(androidx.ui.foundation.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.graphics.Color? textColor = null, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
   }
 
   public final class TextFieldValue {
@@ -170,8 +165,8 @@
 
   public final class TextKt {
     method public static void ProvideTextStyle(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void Text(String text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void Text(String text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color? color = null, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color? color = null, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
     method public static androidx.ui.text.TextStyle currentTextStyle();
   }
 
@@ -289,13 +284,13 @@
 package androidx.ui.foundation.selection {
 
   public final class MutuallyExclusiveSetItemKt {
-    method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class ToggleableKt {
-    method public static void Toggleable(boolean value, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void Toggleable(boolean value, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static androidx.ui.foundation.selection.ToggleableState ToggleableState(boolean value);
-    method public static void TriStateToggleable(androidx.ui.foundation.selection.ToggleableState state = androidx.ui.foundation.selection.ToggleableState.On, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void TriStateToggleable(androidx.ui.foundation.selection.ToggleableState state = androidx.ui.foundation.selection.ToggleableState.On, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public enum ToggleableState {
diff --git a/ui/ui-foundation/api/restricted_0.1.0-dev08.txt b/ui/ui-foundation/api/restricted_0.1.0-dev08.txt
index c8bb322..2689396 100644
--- a/ui/ui-foundation/api/restricted_0.1.0-dev08.txt
+++ b/ui/ui-foundation/api/restricted_0.1.0-dev08.txt
@@ -114,7 +114,7 @@
   }
 
   public final class PasswordTextFieldKt {
-    method public static void PasswordTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange = {}, androidx.ui.text.TextStyle textStyle = TextStyle.Default, char mask = '\u2022', androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {});
+    method public static void PasswordTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange = {}, androidx.ui.graphics.Color? textColor = null, androidx.ui.text.TextStyle textStyle = TextStyle.Default, char mask = '\u2022', androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {});
   }
 
   public final class ScrollerKt {
@@ -156,15 +156,15 @@
   }
 
   public final class TextFieldKt {
-    method public static void TextField(String value, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-    method public static void TextField(androidx.ui.text.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-    method public static void TextField(androidx.ui.text.TextFieldValue model, androidx.ui.text.TextRange? compositionRange, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function2<? super androidx.ui.text.TextFieldValue,? super androidx.ui.text.TextRange,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void TextField(String value, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, androidx.ui.graphics.Color? textColor = null, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void TextField(androidx.ui.text.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.graphics.Color? textColor = null, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void TextField(androidx.ui.text.TextFieldValue model, androidx.ui.text.TextRange? compositionRange, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function2<? super androidx.ui.text.TextFieldValue,? super androidx.ui.text.TextRange,kotlin.Unit> onValueChange, androidx.ui.graphics.Color? textColor = null, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
   }
 
   public final class TextKt {
     method public static void ProvideTextStyle(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void Text(String text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void Text(String text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color? color = null, androidx.ui.unit.TextUnit size = TextUnit.Inherit, androidx.ui.text.style.TextAlign? align = null, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color? color = null, androidx.ui.unit.TextUnit size = TextUnit.Inherit, androidx.ui.text.style.TextAlign? align = null, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
     method public static androidx.ui.text.TextStyle currentTextStyle();
   }
 
diff --git a/ui/ui-foundation/api/restricted_0.1.0-dev09.txt b/ui/ui-foundation/api/restricted_0.1.0-dev09.txt
index 2466d14..f5e9c04 100644
--- a/ui/ui-foundation/api/restricted_0.1.0-dev09.txt
+++ b/ui/ui-foundation/api/restricted_0.1.0-dev09.txt
@@ -2,7 +2,7 @@
 package androidx.ui.foundation {
 
   public final class AdapterListKt {
-    method public static <T> void AdapterList(java.util.List<? extends T> data, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> itemCallback);
+    method public static <T> void AdapterList(java.util.List<? extends T> data, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> itemCallback);
   }
 
   public final class Border {
@@ -19,37 +19,32 @@
   }
 
   public final class BoxKt {
-    method public static void Box(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp padding = elvis {
-    @null var var411905cf: androidx.ui.unit.Dp = border?.size
-    if (var411905cf != null) var411905cf else 0.dp
+    method public static void Box(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp padding = elvis {
+    @null var var41190502: androidx.ui.unit.Dp = border?.size
+    if (var41190502 != null) var41190502 else 0.dp
 }, androidx.ui.unit.Dp paddingStart = Dp.Unspecified, androidx.ui.unit.Dp paddingTop = Dp.Unspecified, androidx.ui.unit.Dp paddingEnd = Dp.Unspecified, androidx.ui.unit.Dp paddingBottom = Dp.Unspecified, androidx.ui.core.Alignment gravity = ContentGravity.TopStart, kotlin.jvm.functions.Function0<kotlin.Unit> children = emptyContent());
   }
 
   public final class CanvasKt {
-    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.CanvasScope,kotlin.Unit> onCanvas);
-  }
-
-  public interface CanvasScope extends androidx.ui.graphics.Canvas androidx.ui.unit.Density {
-    method public androidx.ui.unit.PxSize getSize();
-    property public abstract androidx.ui.unit.PxSize size;
+    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
   }
 
   public final class ClickableKt {
-    method public static void Clickable(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, String? onClickLabel = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void Clickable(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, String? onClickLabel = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class ClickableTextKt {
-    method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
+    method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
   }
 
   public final class ColoredRectKt {
-    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
-    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Color color, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
+    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
+    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Color color, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
   }
 
   public final class ContentColorKt {
-    method public static void ProvideContentColor(androidx.ui.graphics.Color color, kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static androidx.ui.graphics.Color contentColor();
+    method public static androidx.compose.ProvidableAmbient<androidx.ui.graphics.Color> getContentColorAmbient();
   }
 
   public final class DarkThemeKt {
@@ -66,7 +61,7 @@
 
   public final class DrawBackground implements androidx.ui.core.DrawModifier {
     method public androidx.ui.foundation.DrawBackground copy(androidx.ui.graphics.Paint paint, androidx.ui.graphics.Shape shape);
-    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
+    method public void draw(androidx.ui.core.ContentDrawScope);
   }
 
   public final class DrawBackgroundKt {
@@ -78,7 +73,7 @@
   }
 
   public final class DrawBorder implements androidx.ui.core.DrawModifier {
-    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
+    method public void draw(androidx.ui.core.ContentDrawScope);
   }
 
   public final class DrawBorderKt {
@@ -104,22 +99,22 @@
   }
 
   public final class IconKt {
-    method public static void Icon(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color tint = contentColor());
-    method public static void Icon(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color tint = contentColor());
-    method public static void Icon(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color tint = contentColor());
+    method public static void Icon(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color tint = contentColor());
+    method public static void Icon(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color tint = contentColor());
+    method public static void Icon(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color tint = contentColor());
   }
 
   public final class ImageKt {
-    method public static inline void Image(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
-    method public static inline void Image(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
-    method public static void Image(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
+    method public static inline void Image(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
+    method public static inline void Image(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
+    method public static void Image(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
     method @Deprecated public static void SimpleImage(androidx.ui.graphics.ImageAsset image, androidx.ui.graphics.Color? tint = null);
   }
 
   public final class ScrollerKt {
-    method public static void HorizontalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier.None, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
+    method public static void HorizontalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
     method public static androidx.ui.foundation.ScrollerPosition ScrollerPosition(float initial = 0f);
-    method public static void VerticalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier.None, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
+    method public static void VerticalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
   }
 
   public final class ScrollerPosition {
@@ -155,7 +150,7 @@
   }
 
   public final class TextFieldKt {
-    method public static void TextField(androidx.ui.foundation.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void TextField(androidx.ui.foundation.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.graphics.Color? textColor = null, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
   }
 
   public final class TextFieldValue {
@@ -170,8 +165,8 @@
 
   public final class TextKt {
     method public static void ProvideTextStyle(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void Text(String text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void Text(String text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color? color = null, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color? color = null, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
     method public static androidx.ui.text.TextStyle currentTextStyle();
   }
 
@@ -289,13 +284,13 @@
 package androidx.ui.foundation.selection {
 
   public final class MutuallyExclusiveSetItemKt {
-    method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class ToggleableKt {
-    method public static void Toggleable(boolean value, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void Toggleable(boolean value, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static androidx.ui.foundation.selection.ToggleableState ToggleableState(boolean value);
-    method public static void TriStateToggleable(androidx.ui.foundation.selection.ToggleableState state = androidx.ui.foundation.selection.ToggleableState.On, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void TriStateToggleable(androidx.ui.foundation.selection.ToggleableState state = androidx.ui.foundation.selection.ToggleableState.On, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public enum ToggleableState {
diff --git a/ui/ui-foundation/api/restricted_current.txt b/ui/ui-foundation/api/restricted_current.txt
index 2466d14..f5e9c04 100644
--- a/ui/ui-foundation/api/restricted_current.txt
+++ b/ui/ui-foundation/api/restricted_current.txt
@@ -2,7 +2,7 @@
 package androidx.ui.foundation {
 
   public final class AdapterListKt {
-    method public static <T> void AdapterList(java.util.List<? extends T> data, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> itemCallback);
+    method public static <T> void AdapterList(java.util.List<? extends T> data, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> itemCallback);
   }
 
   public final class Border {
@@ -19,37 +19,32 @@
   }
 
   public final class BoxKt {
-    method public static void Box(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp padding = elvis {
-    @null var var411905cf: androidx.ui.unit.Dp = border?.size
-    if (var411905cf != null) var411905cf else 0.dp
+    method public static void Box(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp padding = elvis {
+    @null var var41190502: androidx.ui.unit.Dp = border?.size
+    if (var41190502 != null) var41190502 else 0.dp
 }, androidx.ui.unit.Dp paddingStart = Dp.Unspecified, androidx.ui.unit.Dp paddingTop = Dp.Unspecified, androidx.ui.unit.Dp paddingEnd = Dp.Unspecified, androidx.ui.unit.Dp paddingBottom = Dp.Unspecified, androidx.ui.core.Alignment gravity = ContentGravity.TopStart, kotlin.jvm.functions.Function0<kotlin.Unit> children = emptyContent());
   }
 
   public final class CanvasKt {
-    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.CanvasScope,kotlin.Unit> onCanvas);
-  }
-
-  public interface CanvasScope extends androidx.ui.graphics.Canvas androidx.ui.unit.Density {
-    method public androidx.ui.unit.PxSize getSize();
-    property public abstract androidx.ui.unit.PxSize size;
+    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
   }
 
   public final class ClickableKt {
-    method public static void Clickable(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, String? onClickLabel = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void Clickable(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, String? onClickLabel = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class ClickableTextKt {
-    method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
+    method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
   }
 
   public final class ColoredRectKt {
-    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
-    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Color color, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
+    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
+    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Color color, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
   }
 
   public final class ContentColorKt {
-    method public static void ProvideContentColor(androidx.ui.graphics.Color color, kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static androidx.ui.graphics.Color contentColor();
+    method public static androidx.compose.ProvidableAmbient<androidx.ui.graphics.Color> getContentColorAmbient();
   }
 
   public final class DarkThemeKt {
@@ -66,7 +61,7 @@
 
   public final class DrawBackground implements androidx.ui.core.DrawModifier {
     method public androidx.ui.foundation.DrawBackground copy(androidx.ui.graphics.Paint paint, androidx.ui.graphics.Shape shape);
-    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
+    method public void draw(androidx.ui.core.ContentDrawScope);
   }
 
   public final class DrawBackgroundKt {
@@ -78,7 +73,7 @@
   }
 
   public final class DrawBorder implements androidx.ui.core.DrawModifier {
-    method public void draw(androidx.ui.unit.Density density, kotlin.jvm.functions.Function0<kotlin.Unit> drawContent, androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size);
+    method public void draw(androidx.ui.core.ContentDrawScope);
   }
 
   public final class DrawBorderKt {
@@ -104,22 +99,22 @@
   }
 
   public final class IconKt {
-    method public static void Icon(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color tint = contentColor());
-    method public static void Icon(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color tint = contentColor());
-    method public static void Icon(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color tint = contentColor());
+    method public static void Icon(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color tint = contentColor());
+    method public static void Icon(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color tint = contentColor());
+    method public static void Icon(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color tint = contentColor());
   }
 
   public final class ImageKt {
-    method public static inline void Image(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
-    method public static inline void Image(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
-    method public static void Image(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
+    method public static inline void Image(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
+    method public static inline void Image(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
+    method public static void Image(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.graphics.ScaleFit scaleFit = ScaleFit.Fit, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
     method @Deprecated public static void SimpleImage(androidx.ui.graphics.ImageAsset image, androidx.ui.graphics.Color? tint = null);
   }
 
   public final class ScrollerKt {
-    method public static void HorizontalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier.None, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
+    method public static void HorizontalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
     method public static androidx.ui.foundation.ScrollerPosition ScrollerPosition(float initial = 0f);
-    method public static void VerticalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier.None, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
+    method public static void VerticalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
   }
 
   public final class ScrollerPosition {
@@ -155,7 +150,7 @@
   }
 
   public final class TextFieldKt {
-    method public static void TextField(androidx.ui.foundation.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void TextField(androidx.ui.foundation.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.graphics.Color? textColor = null, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
   }
 
   public final class TextFieldValue {
@@ -170,8 +165,8 @@
 
   public final class TextKt {
     method public static void ProvideTextStyle(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void Text(String text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void Text(String text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color? color = null, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
+    method public static void Text(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color? color = null, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
     method public static androidx.ui.text.TextStyle currentTextStyle();
   }
 
@@ -289,13 +284,13 @@
 package androidx.ui.foundation.selection {
 
   public final class MutuallyExclusiveSetItemKt {
-    method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class ToggleableKt {
-    method public static void Toggleable(boolean value, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void Toggleable(boolean value, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static androidx.ui.foundation.selection.ToggleableState ToggleableState(boolean value);
-    method public static void TriStateToggleable(androidx.ui.foundation.selection.ToggleableState state = androidx.ui.foundation.selection.ToggleableState.On, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void TriStateToggleable(androidx.ui.foundation.selection.ToggleableState state = androidx.ui.foundation.selection.ToggleableState.On, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public enum ToggleableState {
diff --git a/ui/ui-foundation/build.gradle b/ui/ui-foundation/build.gradle
index 242bbf4..591a17f 100644
--- a/ui/ui-foundation/build.gradle
+++ b/ui/ui-foundation/build.gradle
@@ -41,6 +41,7 @@
     implementation project(':ui:ui-framework')
     implementation project(':ui:ui-layout')
     implementation project(':ui:ui-platform')
+    implementation project(':ui:ui-text-core')
     implementation project(':ui:ui-text')
 
     testImplementation(ANDROIDX_TEST_RULES)
diff --git a/ui/ui-foundation/integration-tests/foundation-demos/build.gradle b/ui/ui-foundation/integration-tests/foundation-demos/build.gradle
index 691ac3d..7c464a7 100644
--- a/ui/ui-foundation/integration-tests/foundation-demos/build.gradle
+++ b/ui/ui-foundation/integration-tests/foundation-demos/build.gradle
@@ -41,7 +41,7 @@
     implementation project(":ui:ui-animation")
     implementation project(":ui:ui-layout")
     implementation project(":ui:ui-foundation:samples")
-    implementation project(":ui:ui-text")
+    implementation project(":ui:ui-text-core")
 }
 
 android {
diff --git a/ui/ui-foundation/samples/build.gradle b/ui/ui-foundation/samples/build.gradle
index d6a2247..b41c8cf 100644
--- a/ui/ui-foundation/samples/build.gradle
+++ b/ui/ui-foundation/samples/build.gradle
@@ -38,7 +38,7 @@
     implementation project(":ui:ui-foundation")
     implementation project(":ui:ui-framework")
     implementation project(":ui:ui-layout")
-    implementation project(":ui:ui-text")
+    implementation project(":ui:ui-text-core")
 }
 
 android {
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ClickableTextSample.kt b/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ClickableTextSample.kt
index ce49c48..084e532 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ClickableTextSample.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ClickableTextSample.kt
@@ -21,7 +21,7 @@
 import androidx.compose.Composable
 import androidx.compose.state
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.LongPressGestureDetector
+import androidx.ui.core.gesture.longPressGestureFilter
 import androidx.ui.foundation.ClickableText
 import androidx.ui.foundation.Text
 import androidx.ui.text.AnnotatedString
@@ -44,7 +44,7 @@
 @Composable
 fun LongClickableText(
     text: AnnotatedString,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     style: TextStyle = TextStyle.Default,
     softWrap: Boolean = false,
     overflow: TextOverflow = TextOverflow.Clip,
@@ -53,7 +53,7 @@
     onLongClick: (offset: Int) -> Unit
 ) {
     val layoutResult = state<TextLayoutResult?> { null }
-    val gesture = LongPressGestureDetector(
+    val gesture = Modifier.longPressGestureFilter(
         onLongPress = { pos ->
             layoutResult.value?.let { layout ->
                 onLongClick(layout.getOffsetForPosition(pos))
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ScrollerSamples.kt b/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ScrollerSamples.kt
index 1d5662e..5e9e52e 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ScrollerSamples.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ScrollerSamples.kt
@@ -22,7 +22,7 @@
 import androidx.compose.state
 import androidx.ui.core.Alignment
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.PressIndicatorGestureDetector
+import androidx.ui.core.gesture.pressIndicatorGestureFilter
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.Clickable
 import androidx.ui.foundation.ContentGravity
@@ -204,8 +204,8 @@
         color.value = releasedColor
     }
 
-    val gestureModifier =
-        PressIndicatorGestureDetector(onStart = onPress, onStop = onRelease, onCancel = onRelease)
+    val gestureModifier = Modifier
+        .pressIndicatorGestureFilter(onStart = onPress, onStop = onRelease, onCancel = onRelease)
 
     Text(text, gestureModifier.drawBackground(color.value, RectangleShape), style = textStyle)
 }
diff --git a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/CanvasTest.kt b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/CanvasTest.kt
index c4ed557..b203bb3 100644
--- a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/CanvasTest.kt
+++ b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/CanvasTest.kt
@@ -62,7 +62,7 @@
     @Test
     fun canvas_noSize_emptyCanvas() {
         composeTestRule.setContentAndCollectSizes {
-            Canvas(modifier = Modifier.None) {
+            Canvas(modifier = Modifier) {
                 drawRect(size.toRect(), Paint())
             }
         }
diff --git a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ClickableTest.kt b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ClickableTest.kt
index 42e82d9..a7044bf 100644
--- a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ClickableTest.kt
+++ b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ClickableTest.kt
@@ -26,6 +26,7 @@
 import androidx.ui.test.createFullSemantics
 import androidx.ui.test.doClick
 import androidx.ui.test.findByTag
+import androidx.ui.test.runOnIdleCompose
 import com.google.common.truth.Truth.assertThat
 import org.junit.Rule
 import org.junit.Test
@@ -99,14 +100,14 @@
         findByTag("myClickable")
             .doClick()
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(counter).isEqualTo(1)
         }
 
         findByTag("myClickable")
             .doClick()
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(counter).isEqualTo(2)
         }
     }
diff --git a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ClickableTextTest.kt b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ClickableTextTest.kt
index dfe4bbe..72fd4fa 100644
--- a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ClickableTextTest.kt
+++ b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ClickableTextTest.kt
@@ -21,6 +21,7 @@
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.doClick
 import androidx.ui.test.findByTag
+import androidx.ui.test.runOnIdleCompose
 import androidx.ui.text.AnnotatedString
 import com.nhaarman.mockitokotlin2.any
 import com.nhaarman.mockitokotlin2.mock
@@ -51,7 +52,7 @@
 
         findByTag("clickableText").doClick()
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             verify(onClick, times(1)).invoke(any())
         }
     }
diff --git a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/DeterminateProgressTest.kt b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/DeterminateProgressTest.kt
index 6dd242b..d5b419f 100644
--- a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/DeterminateProgressTest.kt
+++ b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/DeterminateProgressTest.kt
@@ -25,6 +25,7 @@
 import androidx.ui.test.assertValueEquals
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.findByTag
+import androidx.ui.test.runOnUiThread
 import androidx.ui.unit.dp
 import org.junit.Rule
 import org.junit.Test
@@ -60,7 +61,7 @@
         findByTag(tag)
             .assertValueEquals("0.0")
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             state.progress = 0.5f
         }
 
diff --git a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/DraggableTest.kt b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/DraggableTest.kt
index 847c31e..8bda42c 100644
--- a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/DraggableTest.kt
+++ b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/DraggableTest.kt
@@ -30,6 +30,7 @@
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.doGesture
 import androidx.ui.test.findByTag
+import androidx.ui.test.runOnIdleCompose
 import androidx.ui.test.sendSwipe
 import androidx.ui.test.sendSwipeWithVelocity
 import androidx.ui.unit.PxPosition
@@ -70,7 +71,7 @@
                 duration = 100.milliseconds
             )
         }
-        val lastTotal = composeTestRule.runOnIdleCompose {
+        val lastTotal = runOnIdleCompose {
             assertThat(total).isGreaterThan(0)
             total
         }
@@ -81,7 +82,7 @@
                 duration = 100.milliseconds
             )
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(total).isEqualTo(lastTotal)
         }
         findByTag(draggableBoxTag).doGesture {
@@ -91,7 +92,7 @@
                 duration = 100.milliseconds
             )
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(total).isLessThan(0.01f)
         }
     }
@@ -115,7 +116,7 @@
                 duration = 100.milliseconds
             )
         }
-        val lastTotal = composeTestRule.runOnIdleCompose {
+        val lastTotal = runOnIdleCompose {
             assertThat(total).isGreaterThan(0)
             total
         }
@@ -126,7 +127,7 @@
                 duration = 100.milliseconds
             )
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(total).isEqualTo(lastTotal)
         }
         findByTag(draggableBoxTag).doGesture {
@@ -136,7 +137,7 @@
                 duration = 100.milliseconds
             )
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(total).isLessThan(0.01f)
         }
     }
@@ -159,7 +160,7 @@
                 }
             )
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(startTrigger).isEqualTo(0)
             assertThat(stopTrigger).isEqualTo(0)
         }
@@ -170,7 +171,7 @@
                 duration = 100.milliseconds
             )
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(startTrigger).isEqualTo(1)
             assertThat(stopTrigger).isEqualTo(1)
         }
@@ -197,7 +198,7 @@
                 duration = 100.milliseconds
             )
         }
-        val prevTotal = composeTestRule.runOnIdleCompose {
+        val prevTotal = runOnIdleCompose {
             assertThat(total).isGreaterThan(0f)
             enabled.value = false
             total
@@ -209,7 +210,7 @@
                 duration = 100.milliseconds
             )
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(total).isEqualTo(prevTotal)
         }
     }
@@ -237,7 +238,7 @@
 
             )
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(velocityTriggered - 112f).isLessThan(0.1f)
         }
     }
@@ -262,7 +263,7 @@
                 duration = 100.milliseconds
             )
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             // should be exactly 100 as there's no slop
             assertThat(total).isEqualTo(100f)
         }
@@ -283,7 +284,7 @@
                     onDragStopped = { dragStopped += 1 },
                     startDragImmediately = true
                 )
-            } else Modifier.None
+            } else Modifier
         }
         findByTag(draggableBoxTag).doGesture {
             this.sendSwipe(
@@ -292,7 +293,7 @@
                 duration = 100.milliseconds
             )
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             // should be exactly 100 as there's no slop
             assertThat(total).isGreaterThan(0f)
             assertThat(dragStopped).isEqualTo(1f)
@@ -336,7 +337,7 @@
                 duration = 300.milliseconds
             )
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(innerDrag).isGreaterThan(0f)
             assertThat(outerDrag).isGreaterThan(0f)
             // we consumed half delta in child, so exactly half should go to the parent
diff --git a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ScrollableTest.kt b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ScrollableTest.kt
index 6b02bf6..91ef177 100644
--- a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ScrollableTest.kt
+++ b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ScrollableTest.kt
@@ -38,6 +38,8 @@
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.doGesture
 import androidx.ui.test.findByTag
+import androidx.ui.test.runOnIdleCompose
+import androidx.ui.test.runOnUiThread
 import androidx.ui.test.sendSwipe
 import androidx.ui.test.sendSwipeWithVelocity
 import androidx.ui.unit.PxPosition
@@ -89,7 +91,7 @@
         }
         advanceClockAndAwaitAnimation(state, clocks)
 
-        val lastTotal = composeTestRule.runOnIdleCompose {
+        val lastTotal = runOnIdleCompose {
             assertThat(total).isGreaterThan(0)
             total
         }
@@ -102,7 +104,7 @@
         }
         advanceClockAndAwaitAnimation(state, clocks)
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(total).isEqualTo(lastTotal)
         }
         findByTag(scrollableBoxTag).doGesture {
@@ -113,7 +115,7 @@
             )
         }
         advanceClockAndAwaitAnimation(state, clocks)
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(total).isLessThan(0.01f)
         }
     }
@@ -145,7 +147,7 @@
         }
         advanceClockAndAwaitAnimation(state, clocks)
 
-        val lastTotal = composeTestRule.runOnIdleCompose {
+        val lastTotal = runOnIdleCompose {
             assertThat(total).isGreaterThan(0)
             total
         }
@@ -158,7 +160,7 @@
         }
         advanceClockAndAwaitAnimation(state, clocks)
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(total).isEqualTo(lastTotal)
         }
         findByTag(scrollableBoxTag).doGesture {
@@ -169,7 +171,7 @@
             )
         }
         advanceClockAndAwaitAnimation(state, clocks)
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(total).isLessThan(0.01f)
         }
     }
@@ -196,7 +198,7 @@
                 onScrollStopped = { stopTrigger++ }
             )
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(startTrigger).isEqualTo(0)
             assertThat(stopTrigger).isEqualTo(0)
         }
@@ -208,13 +210,13 @@
             )
         }
         // don't wait for animation so stop is 0, as we flinging still
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(startTrigger).isEqualTo(1)
             assertThat(stopTrigger).isEqualTo(0)
         }
         advanceClockAndAwaitAnimation(state, clocks)
         // after wait we expect stop to trigger
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(startTrigger).isEqualTo(1)
             assertThat(stopTrigger).isEqualTo(1)
         }
@@ -248,7 +250,7 @@
             )
         }
         advanceClockAndAwaitAnimation(state, clocks)
-        val prevTotal = composeTestRule.runOnIdleCompose {
+        val prevTotal = runOnIdleCompose {
             assertThat(total).isGreaterThan(0f)
             enabled.value = false
             total
@@ -261,7 +263,7 @@
             )
         }
         advanceClockAndAwaitAnimation(state, clocks)
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(total).isEqualTo(prevTotal)
         }
     }
@@ -308,7 +310,7 @@
 
             )
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             // should be first velocity, as fling was disrupted
             assertThat(velocityTriggered - 112f).isLessThan(0.1f)
         }
@@ -340,7 +342,7 @@
             )
         }
         // don't advance clocks
-        val prevTotal = composeTestRule.runOnUiThread {
+        val prevTotal = runOnUiThread {
             Truth.assertThat(total).isGreaterThan(0f)
             total
         }
@@ -351,7 +353,7 @@
                 duration = 100.milliseconds
             )
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             // last swipe should add exactly 114 as we don't advance clocks and already flinging
             val expected = prevTotal + 114
             assertThat(total - expected).isLessThan(0.1f)
@@ -381,7 +383,7 @@
                     }
                 )
             } else {
-                Modifier.None
+                Modifier
             }
         }
         findByTag(scrollableBoxTag).doGesture {
@@ -391,7 +393,7 @@
                 duration = 100.milliseconds
             )
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(total).isGreaterThan(0f)
             assertThat(dragStopped).isEqualTo(1f)
         }
@@ -412,21 +414,21 @@
         setScrollableContent {
             Modifier.scrollable(dragDirection = DragDirection.Vertical, scrollableState = state)
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(total).isEqualTo(0f)
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             state.smoothScrollBy(1000f)
         }
         advanceClockAndAwaitAnimation(state, clocks)
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(total).isEqualTo(1000f)
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             state.smoothScrollBy(-200f)
         }
         advanceClockAndAwaitAnimation(state, clocks)
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(total).isEqualTo(800f)
         }
     }
@@ -449,15 +451,15 @@
             if (!disposed.value) {
                 Modifier.scrollable(dragDirection = DragDirection.Vertical, scrollableState = state)
             } else {
-                Modifier.None
+                Modifier
             }
         }
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             state.smoothScrollBy(1000f)
             disposed.value = true
         }
         advanceClockAndAwaitAnimation(state, clocks)
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(total).isEqualTo(0f)
         }
     }
@@ -480,26 +482,26 @@
             if (!disposed.value) {
                 Modifier.scrollable(dragDirection = DragDirection.Vertical, scrollableState = state)
             } else {
-                Modifier.None
+                Modifier
             }
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             state.smoothScrollBy(300f)
         }
         advanceClockAndAwaitAnimation(state, clocks)
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(total).isEqualTo(300f)
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             state.smoothScrollBy(200f)
         }
         // don't advance clocks yet, toggle disposed value
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             disposed.value = true
         }
         advanceClockAndAwaitAnimation(state, clocks)
         // still 300 and didn't fail in onScrollConsumptionRequested.. lambda
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(total).isEqualTo(300f)
         }
     }
@@ -555,7 +557,7 @@
                 duration = 300.milliseconds
             )
         }
-        val lastEqualDrag = composeTestRule.runOnIdleCompose {
+        val lastEqualDrag = runOnIdleCompose {
             assertThat(innerDrag).isGreaterThan(0f)
             assertThat(outerDrag).isGreaterThan(0f)
             // we consumed half delta in child, so exactly half should go to the parent
@@ -565,7 +567,7 @@
         advanceClockAndAwaitAnimation(innerState, clocks)
         advanceClockAndAwaitAnimation(outerState, clocks)
         // and nothing should change as we don't do nested fling
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(outerDrag).isEqualTo(lastEqualDrag)
         }
     }
@@ -601,7 +603,7 @@
     }
 
     private fun advanceClockAndAwaitAnimation(state: ScrollableState, clock: ManualAnimationClock) {
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             clock.clockTimeMillis += 5000
         }
         awaitScrollAnimation(state)
diff --git a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ScrollerTest.kt b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ScrollerTest.kt
index 39f99e9..4327221 100644
--- a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ScrollerTest.kt
+++ b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ScrollerTest.kt
@@ -43,6 +43,8 @@
 import androidx.ui.test.doScrollTo
 import androidx.ui.test.findByTag
 import androidx.ui.test.findByText
+import androidx.ui.test.runOnIdleCompose
+import androidx.ui.test.runOnUiThread
 import androidx.ui.test.sendClick
 import androidx.ui.test.sendSwipeDown
 import androidx.ui.test.sendSwipeLeft
@@ -106,7 +108,7 @@
 
         composeVerticalScroller(scrollerPosition)
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertTrue(scrollerPosition.maxPosition == 0f)
         }
     }
@@ -135,12 +137,12 @@
 
         validateVerticalScroller(height = height)
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertEquals(scrollDistance.toFloat(), scrollerPosition.maxPosition)
             scrollerPosition.scrollTo(scrollDistance.toFloat())
         }
 
-        composeTestRule.runOnIdleCompose {} // Just so the block below is correct
+        runOnIdleCompose {} // Just so the block below is correct
         validateVerticalScroller(offset = scrollDistance, height = height)
     }
 
@@ -179,12 +181,12 @@
 
         validateHorizontalScroller(width = width)
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertEquals(scrollDistance.toFloat(), scrollerPosition.maxPosition)
             scrollerPosition.scrollTo(scrollDistance.toFloat())
         }
 
-        composeTestRule.runOnIdleCompose {} // Just so the block below is correct
+        runOnIdleCompose {} // Just so the block below is correct
         validateHorizontalScroller(offset = scrollDistance, width = width)
     }
 
@@ -258,38 +260,38 @@
 
         createScrollableContent(isVertical = true, scrollerPosition = scrollerPosition)
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(scrollerPosition.value).isEqualTo(0f)
             assertThat(scrollerPosition.maxPosition).isGreaterThan(0f)
         }
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             scrollerPosition.scrollTo(-100f)
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(scrollerPosition.value).isEqualTo(0f)
         }
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             scrollerPosition.scrollBy(-100f)
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(scrollerPosition.value).isEqualTo(0f)
         }
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             scrollerPosition.scrollTo(scrollerPosition.maxPosition)
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(scrollerPosition.value).isEqualTo(scrollerPosition.maxPosition)
         }
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             scrollerPosition.scrollTo(scrollerPosition.maxPosition + 1000)
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(scrollerPosition.value).isEqualTo(scrollerPosition.maxPosition)
         }
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             scrollerPosition.scrollBy(100f)
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(scrollerPosition.value).isEqualTo(scrollerPosition.maxPosition)
         }
     }
@@ -304,7 +306,7 @@
 
         createScrollableContent(isVertical = true, scrollerPosition = scrollerPosition)
 
-        val max = composeTestRule.runOnIdleCompose {
+        val max = runOnIdleCompose {
             assertThat(scrollerPosition.value).isEqualTo(0f)
             assertThat(scrollerPosition.maxPosition).isGreaterThan(0f)
             scrollerPosition.maxPosition
@@ -340,7 +342,7 @@
 
         createScrollableContent(isVertical = true, scrollerPosition = scrollerPosition)
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(scrollerPosition.value).isEqualTo(0f)
             assertThat(scrollerPosition.isAnimating).isEqualTo(false)
         }
@@ -348,7 +350,7 @@
         findByTag(scrollerTag)
             .doGesture { sendSwipeUp() }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             clock.clockTimeMillis += 100
             assertThat(scrollerPosition.isAnimating).isEqualTo(true)
         }
@@ -357,7 +359,7 @@
         findByTag(scrollerTag)
             .doGesture { sendClick() }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(scrollerPosition.isAnimating).isEqualTo(false)
         }
     }
@@ -368,14 +370,14 @@
         clock: ManualAnimationClock,
         uiAction: () -> Unit
     ) {
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             uiAction.invoke()
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             clock.clockTimeMillis += 5000
         }
         findByTag(scrollerTag).awaitScrollAnimation(scrollerPosition)
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(scrollerPosition.value).isEqualTo(assertValue)
         }
     }
@@ -393,21 +395,21 @@
 
         createScrollableContent(isVertical, scrollerPosition = scrollerPosition)
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(scrollerPosition.value).isEqualTo(0f)
         }
 
         findByTag(scrollerTag)
             .doGesture { firstSwipe() }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             clock.clockTimeMillis += 5000
         }
 
         findByTag(scrollerTag)
             .awaitScrollAnimation(scrollerPosition)
 
-        val scrolledValue = composeTestRule.runOnIdleCompose {
+        val scrolledValue = runOnIdleCompose {
             scrollerPosition.value
         }
         assertThat(scrolledValue).isGreaterThan(0f)
@@ -415,14 +417,14 @@
         findByTag(scrollerTag)
             .doGesture { secondSwipe() }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             clock.clockTimeMillis += 5000
         }
 
         findByTag(scrollerTag)
             .awaitScrollAnimation(scrollerPosition)
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(scrollerPosition.value).isLessThan(scrolledValue)
         }
     }
diff --git a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/TextFieldOnValueChangeTextFieldValueTest.kt b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/TextFieldOnValueChangeTextFieldValueTest.kt
index 4b608f1..c9213e9 100644
--- a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/TextFieldOnValueChangeTextFieldValueTest.kt
+++ b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/TextFieldOnValueChangeTextFieldValueTest.kt
@@ -33,6 +33,8 @@
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.doGesture
 import androidx.ui.test.findByTag
+import androidx.ui.test.runOnIdleCompose
+import androidx.ui.test.runOnUiThread
 import androidx.ui.test.sendClick
 import androidx.ui.text.TextRange
 import androidx.ui.unit.PxPosition
@@ -98,7 +100,7 @@
         findByTag("textField")
             .doGesture { sendClick(PxPosition(1.px, 1.px)) }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             // Verify startInput is called and capture the callback.
             val onEditCommandCaptor = argumentCaptor<(List<EditOperation>) -> Unit>()
             verify(textInputService, times(1)).startInput(
@@ -117,7 +119,7 @@
 
     private fun performEditOperation(op: EditOperation) {
         arrayOf(listOf(op)).forEach {
-            composeTestRule.runOnUiThread {
+            runOnUiThread {
                 onEditCommandCallback(it)
             }
         }
@@ -127,7 +129,7 @@
     fun commitText_onValueChange_call_once() {
         // Committing text should be reported as value change
         performEditOperation(CommitTextEditOp("ABCDE", 1))
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             verify(onValueChange, times(1))
                 .invoke(eq(
                     TextFieldValue(
@@ -142,7 +144,7 @@
     fun setComposingRegion_onValueChange_never_call() {
         // Composition conversion is not counted as a value change in EditorModel text field.
         performEditOperation(SetComposingRegionEditOp(0, 5))
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             verify(onValueChange, never()).invoke(any())
         }
     }
@@ -150,7 +152,7 @@
     @Test
     fun setComposingText_onValueChange_call_once() {
         performEditOperation(SetComposingTextEditOp("ABCDE", 1))
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             verify(onValueChange, times(1))
                 .invoke(eq(
                     TextFieldValue(
@@ -165,7 +167,7 @@
     fun setSelection_onValueChange_call_once() {
         // Selection change is a part of value-change in EditorModel text field
         performEditOperation(SetSelectionEditOp(1, 1))
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             verify(onValueChange, times(1)).invoke(eq(
                 TextFieldValue(
                     "abcde",
@@ -178,7 +180,7 @@
     @Test
     fun clearComposition_onValueChange_call_once() {
         performEditOperation(SetComposingTextEditOp("ABCDE", 1))
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             verify(onValueChange, times(1))
                 .invoke(eq(
                     TextFieldValue(
@@ -191,13 +193,13 @@
         // Finishing composition change is not counted as a value change in EditorModel text field.
         clearInvocations(onValueChange)
         performEditOperation(FinishComposingTextEditOp())
-        composeTestRule.runOnIdleCompose { verify(onValueChange, never()).invoke(any()) }
+        runOnIdleCompose { verify(onValueChange, never()).invoke(any()) }
     }
 
     @Test
     fun deleteSurroundingText_onValueChange_call_once() {
         performEditOperation(DeleteSurroundingTextEditOp(0, 1))
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             verify(onValueChange, times(1)).invoke(eq(
                 TextFieldValue(
                     "bcde",
diff --git a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/TextFieldTest.kt b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/TextFieldTest.kt
index 3bfdbfe..38fa9d7 100644
--- a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/TextFieldTest.kt
+++ b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/TextFieldTest.kt
@@ -33,6 +33,7 @@
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.doClick
 import androidx.ui.test.findByTag
+import androidx.ui.test.runOnIdleCompose
 import androidx.ui.text.TextLayoutResult
 import com.google.common.truth.Truth.assertThat
 import com.nhaarman.mockitokotlin2.any
@@ -75,7 +76,7 @@
 
         findByTag("textField").doClick()
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             verify(focusManager, times(1)).requestFocus(any())
         }
     }
@@ -147,7 +148,7 @@
             .doClick()
 
         var onEditCommandCallback: ((List<EditOperation>) -> Unit)? = null
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             // Verify startInput is called and capture the callback.
             val onEditCommandCaptor = argumentCaptor<(List<EditOperation>) -> Unit>()
             verify(textInputService, times(1)).startInput(
@@ -173,10 +174,10 @@
             // TODO: This should work only with runOnUiThread. But it seems that these events are
             // not buffered and chaining multiple of them before composition happens makes them to
             // get lost.
-            composeTestRule.runOnIdleCompose { onEditCommandCallback!!.invoke(it) }
+            runOnIdleCompose { onEditCommandCallback!!.invoke(it) }
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             val stateCaptor = argumentCaptor<EditorValue>()
             verify(textInputService, atLeastOnce())
                 .onStateUpdated(eq(inputSessionToken), stateCaptor.capture())
@@ -224,7 +225,7 @@
             .doClick()
 
         var onEditCommandCallback: ((List<EditOperation>) -> Unit)? = null
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             // Verify startInput is called and capture the callback.
             val onEditCommandCaptor = argumentCaptor<(List<EditOperation>) -> Unit>()
             verify(textInputService, times(1)).startInput(
@@ -250,10 +251,10 @@
             // TODO: This should work only with runOnUiThread. But it seems that these events are
             // not buffered and chaining multiple of them before composition happens makes them to
             // get lost.
-            composeTestRule.runOnIdleCompose { onEditCommandCallback!!.invoke(it) }
+            runOnIdleCompose { onEditCommandCallback!!.invoke(it) }
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             val stateCaptor = argumentCaptor<EditorValue>()
             verify(textInputService, atLeastOnce())
                 .onStateUpdated(eq(inputSessionToken), stateCaptor.capture())
@@ -297,7 +298,7 @@
             .doClick()
 
         var onEditCommandCallback: ((List<EditOperation>) -> Unit)? = null
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             // Verify startInput is called and capture the callback.
             val onEditCommandCaptor = argumentCaptor<(List<EditOperation>) -> Unit>()
             verify(textInputService, times(1)).startInput(
@@ -321,10 +322,10 @@
             // TODO: This should work only with runOnUiThread. But it seems that these events are
             // not buffered and chaining multiple of them before composition happens makes them to
             // get lost.
-            composeTestRule.runOnIdleCompose { onEditCommandCallback!!.invoke(it) }
+            runOnIdleCompose { onEditCommandCallback!!.invoke(it) }
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             val layoutCaptor = argumentCaptor<TextLayoutResult>()
             verify(onTextLayout, atLeastOnce()).invoke(layoutCaptor.capture())
 
diff --git a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/TextTest.kt b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/TextTest.kt
new file mode 100644
index 0000000..1121d2b
--- /dev/null
+++ b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/TextTest.kt
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.foundation
+
+import androidx.test.filters.MediumTest
+import androidx.ui.graphics.Color
+import androidx.ui.test.createComposeRule
+import androidx.ui.test.runOnIdleCompose
+import androidx.ui.text.TextStyle
+import androidx.ui.text.font.FontStyle
+import androidx.ui.text.style.TextAlign
+import androidx.ui.unit.sp
+import com.google.common.truth.Truth
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@MediumTest
+@RunWith(JUnit4::class)
+class TextTest {
+
+    @get:Rule
+    val composeTestRule = createComposeRule()
+
+    private val ExpectedTextStyle = TextStyle(
+        color = Color.Blue,
+        textAlign = TextAlign.End,
+        fontSize = 32.sp,
+        fontStyle = FontStyle.Italic
+    )
+
+    private val TestText = "TestText"
+
+    @Test
+    fun inheritsCurrentTextStyle() {
+        var textColor: Color? = null
+        composeTestRule.setContent {
+            ProvideTextStyle(ExpectedTextStyle) {
+                Box(backgroundColor = Color.White) {
+                    Text(TestText, onTextLayout = { textColor = it.layoutInput.style.color })
+                }
+            }
+        }
+
+        runOnIdleCompose {
+            Truth.assertThat(textColor).isEqualTo(ExpectedTextStyle.color)
+        }
+    }
+
+    @Test
+    fun settingCustomTextStyle() {
+        var textColor: Color? = null
+        val testStyle = TextStyle(color = Color.Green)
+        composeTestRule.setContent {
+            ProvideTextStyle(ExpectedTextStyle) {
+                Box(backgroundColor = Color.White) {
+                    Text(
+                        TestText,
+                        style = testStyle,
+                        onTextLayout = { textColor = it.layoutInput.style.color }
+                    )
+                }
+            }
+        }
+
+        runOnIdleCompose {
+            Truth.assertThat(textColor).isEqualTo(testStyle.color)
+        }
+    }
+
+    @Test
+    fun settingColorExplicitly() {
+        var textColor: Color? = null
+        val expectedColor = Color.Green
+        composeTestRule.setContent {
+            ProvideTextStyle(ExpectedTextStyle) {
+                Box(backgroundColor = Color.White) {
+                    Text(
+                        TestText,
+                        color = expectedColor,
+                        onTextLayout = { textColor = it.layoutInput.style.color }
+                    )
+                }
+            }
+        }
+
+        runOnIdleCompose {
+            // `color` parameter should override style.
+            Truth.assertThat(textColor).isEqualTo(expectedColor)
+        }
+    }
+
+    // Not really an expected use-case, but we should ensure the behavior here is consistent.
+    @Test
+    fun settingColorAndTextStyle() {
+        var textColor: Color? = null
+        val expectedColor = Color.Green
+        composeTestRule.setContent {
+            ProvideTextStyle(ExpectedTextStyle) {
+                Box(backgroundColor = Color.White) {
+                    // Set both color and style
+                    Text(
+                        TestText,
+                        color = expectedColor,
+                        style = ExpectedTextStyle,
+                        onTextLayout = { textColor = it.layoutInput.style.color }
+                    )
+                }
+            }
+        }
+
+        runOnIdleCompose {
+            Truth.assertThat(textColor).isEqualTo(expectedColor)
+        }
+    }
+}
diff --git a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ToggleableTest.kt b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ToggleableTest.kt
index 5e6d500..b984e54 100644
--- a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ToggleableTest.kt
+++ b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ToggleableTest.kt
@@ -30,6 +30,7 @@
 import androidx.ui.test.createFullSemantics
 import androidx.ui.test.doClick
 import androidx.ui.test.findByTag
+import androidx.ui.test.runOnIdleCompose
 import com.google.common.truth.Truth.assertThat
 import org.junit.Rule
 import org.junit.Test
@@ -165,7 +166,7 @@
         findByTag("myToggleable")
             .doClick()
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(checked).isEqualTo(false)
         }
     }
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/AdapterList.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/AdapterList.kt
index 28aeb7b..1591737 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/AdapterList.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/AdapterList.kt
@@ -465,7 +465,7 @@
 @Composable
 fun <T> AdapterList(
     data: List<T>,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     itemCallback: @Composable() (T) -> Unit
 ) {
     val state = remember { ListState(data = data, itemCallback = itemCallback) }
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Box.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Box.kt
index 30fbc45..a83be56 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Box.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Box.kt
@@ -65,7 +65,7 @@
  */
 @Composable
 fun Box(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     shape: Shape = RectangleShape,
     backgroundColor: Color = Color.Transparent,
     border: Border? = null,
@@ -78,10 +78,10 @@
     children: @Composable() () -> Unit = emptyContent()
 ) {
     val borderModifier =
-        if (border != null) Modifier.drawBorder(border, shape) else Modifier.None
+        if (border != null) Modifier.drawBorder(border, shape) else Modifier
     val backgroundModifier =
         if (backgroundColor == Color.Transparent) {
-            Modifier.None
+            Modifier
         } else {
             Modifier.drawBackground(backgroundColor, shape)
         }
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Canvas.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Canvas.kt
index ab0dbefd..afca77d 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Canvas.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Canvas.kt
@@ -18,27 +18,10 @@
 
 import androidx.compose.Composable
 import androidx.ui.core.Modifier
+import androidx.ui.core.DrawScope
 import androidx.ui.core.drawBehind
-import androidx.ui.graphics.Canvas
 import androidx.ui.layout.ColumnScope
 import androidx.ui.layout.Spacer
-import androidx.ui.unit.Density
-import androidx.ui.unit.PxSize
-
-/**
- * Interface that provides everything you need to draw on [Canvas]. This includes
- * [androidx.ui.graphics.Canvas] scoping, [Density] and size of the [Canvas], already converted
- * to pixels
- */
-interface CanvasScope : Canvas, Density {
-    val size: PxSize
-}
-
-private class CanvasScopeImpl(
-    canvas: Canvas,
-    density: Density,
-    override val size: PxSize
-) : CanvasScope, Canvas by canvas, Density by density
 
 /**
  * Component that allow you to specify an area on the screen and perform canvas drawing on this
@@ -54,10 +37,8 @@
  * function invocation inside it will result to runtime exception
  */
 @Composable
-fun Canvas(modifier: Modifier, onCanvas: CanvasScope.() -> Unit) {
+fun Canvas(modifier: Modifier, onCanvas: DrawScope.() -> Unit) {
     Spacer(
-        modifier.drawBehind { canvas, size ->
-            CanvasScopeImpl(canvas, this, size).onCanvas()
-        }
+        modifier.drawBehind(onCanvas)
     )
 }
\ No newline at end of file
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
index 143d9ab..e945f002 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
@@ -19,13 +19,13 @@
 import androidx.compose.Composable
 import androidx.ui.core.Modifier
 import androidx.ui.core.PassThroughLayout
-import androidx.ui.core.gesture.TapGestureDetector
+import androidx.ui.core.gesture.tapGestureFilter
 import androidx.ui.semantics.Semantics
 import androidx.ui.semantics.enabled
 import androidx.ui.semantics.onClick
 
 /**
- * Combines [TapGestureDetector] and [Semantics] for the clickable
+ * Combines [tapGestureFilter] and [Semantics] for the clickable
  * components like Button.
  *
  * @sample androidx.ui.foundation.samples.ClickableSample
@@ -40,7 +40,7 @@
 @Composable
 fun Clickable(
     onClick: () -> Unit,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     enabled: Boolean = true,
     onClickLabel: String? = null,
     children: @Composable() () -> Unit
@@ -57,9 +57,9 @@
         // TODO(b/150706555): This layout is temporary and should be removed once Semantics
         //  is implemented with modifiers.
         val tap = if (enabled) {
-            TapGestureDetector(onClick)
+            Modifier.tapGestureFilter(onClick)
         } else {
-            Modifier.None
+            Modifier
         }
         @Suppress("DEPRECATION")
         PassThroughLayout(modifier + tap, children)
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/ClickableText.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/ClickableText.kt
index 51eb602..a2df686 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/ClickableText.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/ClickableText.kt
@@ -18,7 +18,7 @@
 import androidx.compose.Composable
 import androidx.compose.state
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.PressIndicatorGestureDetector
+import androidx.ui.core.gesture.pressIndicatorGestureFilter
 import androidx.ui.text.AnnotatedString
 import androidx.ui.text.TextLayoutResult
 import androidx.ui.text.TextStyle
@@ -28,7 +28,7 @@
 /**
  * A continent version of [Text] component to be able to handle click event on the text.
  *
- * This is a shorthand of [Text] with [PressIndicatorGestureDetector] to be able to handle click
+ * This is a shorthand of [Text] with [pressIndicatorGestureFilter] to be able to handle click
  * event easily.
  *
  * @sample androidx.ui.foundation.samples.ClickableText
@@ -38,7 +38,7 @@
  * @sample androidx.ui.foundation.samples.LongClickableText
  *
  * @see Text
- * @see androidx.ui.core.gesture.PressIndicatorGestureDetector
+ * @see androidx.ui.core.gesture.pressIndicatorGestureFilter
  *
  * @param text The text to be displayed.
  * @param modifier Modifier to apply to this layout node.
@@ -57,7 +57,7 @@
 @Composable
 fun ClickableText(
     text: AnnotatedString,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     style: TextStyle = TextStyle.Default,
     softWrap: Boolean = true,
     overflow: TextOverflow = TextOverflow.Clip,
@@ -66,7 +66,7 @@
     onClick: (Int) -> Unit
 ) {
     val layoutResult = state<TextLayoutResult?> { null }
-    val pressIndicator = PressIndicatorGestureDetector(
+    val pressIndicator = Modifier.pressIndicatorGestureFilter(
         onStart = { pos ->
             layoutResult.value?.let { layoutResult ->
                 onClick(layoutResult.getOffsetForPosition(pos))
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/ColoredRect.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/ColoredRect.kt
index 6e51dc1..ba0bc08 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/ColoredRect.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/ColoredRect.kt
@@ -50,7 +50,7 @@
 @Composable
 fun ColoredRect(
     brush: Brush,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     width: Dp? = null,
     height: Dp? = null
 ) {
@@ -79,7 +79,7 @@
 @Composable
 fun ColoredRect(
     color: Color,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     width: Dp? = null,
     height: Dp? = null
 ) {
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/ContentColor.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/ContentColor.kt
index 4ae5720..a59f49f 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/ContentColor.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/ContentColor.kt
@@ -17,10 +17,8 @@
 package androidx.ui.foundation
 
 import androidx.compose.Composable
-import androidx.compose.Providers
 import androidx.compose.ambientOf
 import androidx.ui.graphics.Color
-import androidx.ui.text.TextStyle
 
 /**
  * Returns the preferred content color at the call site's position in the hierarchy.
@@ -36,17 +34,8 @@
 fun contentColor() = ContentColorAmbient.current
 
 /**
- * Sets [color] as the preferred content color for [children].
- * This color can then be retrieved inside children by using [contentColor]. Typography and
- * iconography should use this value as their default color.
+ * Ambient containing the preferred content color for a given position in the hierarchy.
+ *
+ * See [contentColor] for a more descriptive alias to consume the value from this ambient.
  */
-@Composable
-fun ProvideContentColor(color: Color, children: @Composable() () -> Unit) {
-    Providers(ContentColorAmbient provides color) {
-        // TODO: we probably want to instead provide a Text component that queries contentColor()
-        // instead of needing to manually merge this style.
-        ProvideTextStyle(value = TextStyle(color = color), children = children)
-    }
-}
-
-private val ContentColorAmbient = ambientOf { Color.Black }
+val ContentColorAmbient = ambientOf { Color.Black }
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBackground.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBackground.kt
index 96d0309..c474503 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBackground.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBackground.kt
@@ -19,17 +19,16 @@
 import androidx.compose.Composable
 import androidx.compose.remember
 import androidx.ui.core.DrawModifier
+import androidx.ui.core.ContentDrawScope
 import androidx.ui.core.Modifier
 import androidx.ui.foundation.shape.RectangleShape
 import androidx.ui.graphics.Brush
-import androidx.ui.graphics.Canvas
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.Outline
 import androidx.ui.graphics.Paint
 import androidx.ui.graphics.Shape
 import androidx.ui.graphics.SolidColor
 import androidx.ui.graphics.drawOutline
-import androidx.ui.unit.Density
 import androidx.ui.unit.PxSize
 import androidx.ui.unit.toRect
 
@@ -125,14 +124,14 @@
     private var lastSize: PxSize? = null
     private var lastOutline: Outline? = null
 
-    override fun draw(density: Density, drawContent: () -> Unit, canvas: Canvas, size: PxSize) {
+    override fun ContentDrawScope.draw() {
         if (shape === RectangleShape) {
             // shortcut to avoid Outline calculation and allocation
-            canvas.drawRect(size.toRect(), paint)
+            drawRect(size.toRect(), paint)
         } else {
             val localOutline =
-                if (size == lastSize) lastOutline!! else shape.createOutline(size, density)
-            canvas.drawOutline(localOutline, paint)
+                if (size == lastSize) lastOutline!! else shape.createOutline(size, this)
+            drawOutline(localOutline, paint)
             lastOutline = localOutline
             lastSize = size
         }
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBorder.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBorder.kt
index 79f661c..ffcc246 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBorder.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBorder.kt
@@ -19,6 +19,7 @@
 import androidx.compose.Composable
 import androidx.compose.remember
 import androidx.ui.core.DrawModifier
+import androidx.ui.core.ContentDrawScope
 import androidx.ui.core.Modifier
 import androidx.ui.foundation.shape.RectangleShape
 import androidx.ui.geometry.Offset
@@ -171,7 +172,9 @@
         cache.borderSize = borderWidth
     }
 
-    override fun draw(density: Density, drawContent: () -> Unit, canvas: Canvas, size: PxSize) {
+    override fun ContentDrawScope.draw() {
+        val density = this
+        val canvas = this
         with(cache) {
             drawContent()
             modifierSize = size
@@ -191,7 +194,7 @@
             } else {
                 val path = borderPath(density, borderSize)
                 paint.style = PaintingStyle.fill
-                canvas.drawPath(path, paint)
+                drawPath(path, paint)
             }
         }
     }
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Icon.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Icon.kt
index dc33236..bf8cd78 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Icon.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Icon.kt
@@ -42,7 +42,7 @@
 @Composable
 fun Icon(
     asset: VectorAsset,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     tint: Color = contentColor()
 ) {
     Icon(
@@ -62,7 +62,7 @@
 @Composable
 fun Icon(
     asset: ImageAsset,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     tint: Color = contentColor()
 ) {
     val painter = remember(asset) { ImagePainter(asset) }
@@ -83,7 +83,7 @@
 @Composable
 fun Icon(
     painter: Painter,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     tint: Color = contentColor()
 ) {
     // TODO: consider allowing developers to override the intrinsic size, and specify their own
@@ -99,7 +99,7 @@
     this + if (painter.intrinsicSize == PxSize.UnspecifiedSize) {
         DefaultIconSizeModifier
     } else {
-        Modifier.None
+        Modifier
     }
 
 // Default icon size, for icons with no intrinsic size information
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Image.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Image.kt
index f77a843..56c3764 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Image.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Image.kt
@@ -60,7 +60,7 @@
 @Composable
 inline fun Image(
     asset: ImageAsset,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     alignment: Alignment = Alignment.Center,
     scaleFit: ScaleFit = ScaleFit.Fit,
     alpha: Float = DefaultAlpha,
@@ -101,7 +101,7 @@
 @Composable
 inline fun Image(
     asset: VectorAsset,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     alignment: Alignment = Alignment.Center,
     scaleFit: ScaleFit = ScaleFit.Fit,
     alpha: Float = DefaultAlpha,
@@ -141,7 +141,7 @@
 @Composable
 fun Image(
     painter: Painter,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     alignment: Alignment = Alignment.Center,
     scaleFit: ScaleFit = ScaleFit.Fit,
     alpha: Float = DefaultAlpha,
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Scroller.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Scroller.kt
index f4b36e0..ef6ad40 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Scroller.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Scroller.kt
@@ -174,7 +174,7 @@
 @Composable
 fun VerticalScroller(
     scrollerPosition: ScrollerPosition = ScrollerPosition(),
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     isScrollable: Boolean = true,
     child: @Composable() () -> Unit
 ) {
@@ -204,7 +204,7 @@
 @Composable
 fun HorizontalScroller(
     scrollerPosition: ScrollerPosition = ScrollerPosition(),
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     isScrollable: Boolean = true,
     child: @Composable() () -> Unit
 ) {
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Text.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Text.kt
index fbac2ad..4179852 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Text.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Text.kt
@@ -20,8 +20,9 @@
 import androidx.compose.Providers
 import androidx.compose.StructurallyEqual
 import androidx.compose.ambientOf
-import androidx.ui.core.CoreText
+import androidx.ui.text.CoreText
 import androidx.ui.core.Modifier
+import androidx.ui.graphics.Color
 import androidx.ui.semantics.Semantics
 import androidx.ui.semantics.accessibilityLabel
 import androidx.ui.text.AnnotatedString
@@ -32,11 +33,20 @@
 /**
  * High level element that displays text and provides semantics / accessibility information.
  *
- * The default [style] uses the [currentTextStyle] defined by a theme. In addition, if no text
- * color is manually specified in [style] then the text color will be [contentColor].
+ * The default [style] uses the [currentTextStyle] defined by a theme. If you are setting your
+ * own style, you may want to consider first retrieving [currentTextStyle], and using
+ * [TextStyle.copy] to keep any theme defined attributes, only modifying the specific attributes
+ * you want to override.
+ *
+ * If [color] is explicitly set, it will always be used instead of the value inside [style]. If
+ * [color] is not set, and [style] does not have a color, then [contentColor] will be used - this
+ * allows this [Text] or element containing this [Text] to adapt to different background
+ * colors and still maintain contrast and accessibility.
  *
  * @param text The text to be displayed.
- * @param modifier Modifier to apply to this layout node.
+ * @param modifier [Modifier] to apply to this layout node.
+ * @param color [Color] to apply to the text. If `null`, and [style] has no color set, this will be
+ * [contentColor].
  * @param style Style configuration for the text such as color, font, line height etc.
  * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in the
  * text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
@@ -50,7 +60,8 @@
 @Composable
 fun Text(
     text: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
+    color: Color? = null,
     style: TextStyle = currentTextStyle(),
     softWrap: Boolean = true,
     overflow: TextOverflow = TextOverflow.Clip,
@@ -60,6 +71,7 @@
     Text(
         AnnotatedString(text),
         modifier,
+        color,
         style,
         softWrap,
         overflow,
@@ -71,11 +83,20 @@
 /**
  * High level element that displays text and provides semantics / accessibility information.
  *
- * The default [style] uses the [currentTextStyle] defined by a theme. In addition, if no text
- * color is manually specified in [style] then the text color will be [contentColor].
+ * The default [style] uses the [currentTextStyle] defined by a theme. If you are setting your
+ * own style, you may want to consider first retrieving [currentTextStyle], and using
+ * [TextStyle.copy] to keep any theme defined attributes, only modifying the specific attributes
+ * you want to override.
+ *
+ * If [color] is explicitly set, it will always be used instead of the value inside [style]. If
+ * [color] is not set, and [style] does not have a color, then [contentColor] will be used - this
+ * allows this [Text] or element containing this [Text] to adapt to different background
+ * colors and still maintain contrast and accessibility.
  *
  * @param text The text to be displayed.
- * @param modifier Modifier to apply to this layout node.
+ * @param modifier [Modifier] to apply to this layout node.
+ * @param color [Color] to apply to the text. If `null`, and [style] has no color set, this will be
+ * [contentColor].
  * @param style Style configuration for the text such as color, font, line height etc.
  * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in the
  * text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
@@ -89,18 +110,21 @@
 @Composable
 fun Text(
     text: AnnotatedString,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
+    color: Color? = null,
     style: TextStyle = currentTextStyle(),
     softWrap: Boolean = true,
     overflow: TextOverflow = TextOverflow.Clip,
     maxLines: Int = Int.MAX_VALUE,
     onTextLayout: (TextLayoutResult) -> Unit = {}
 ) {
+    val textColor = color ?: style.color ?: contentColor()
+    val mergedStyle = style.merge(TextStyle(color = textColor))
     Semantics(properties = { accessibilityLabel = text.text }) {
         CoreText(
             text,
             modifier,
-            style,
+            mergedStyle,
             softWrap,
             overflow,
             maxLines,
@@ -119,8 +143,7 @@
  */
 @Composable
 fun ProvideTextStyle(value: TextStyle, children: @Composable() () -> Unit) {
-    val style = TextStyleAmbient.current
-    val mergedStyle = style.merge(value)
+    val mergedStyle = currentTextStyle().merge(value)
     Providers(TextStyleAmbient provides mergedStyle, children = children)
 }
 
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/TextField.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/TextField.kt
index 861d41e..15cd01e 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/TextField.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/TextField.kt
@@ -18,9 +18,10 @@
 
 import androidx.compose.Composable
 import androidx.compose.state
-import androidx.ui.core.CoreTextField
+import androidx.ui.text.CoreTextField
 import androidx.ui.core.Modifier
 import androidx.ui.core.input.FocusManager
+import androidx.ui.graphics.Color
 import androidx.ui.input.ImeAction
 import androidx.ui.input.EditorValue
 import androidx.ui.input.KeyboardType
@@ -67,6 +68,8 @@
  * the input service update the text, selection or cursor, this callback is called with the updated
  * [TextFieldValue]. If you want to observe the composition text, use [TextField] with
  * compositionRange instead.
+ * @param textColor [Color] to apply to the text. If `null`, and [textStyle] has no color set, this
+ * will be [contentColor].
  * @param textStyle Style configuration that applies at character level such as color, font etc.
  * @param keyboardType The keyboard type to be used in this text field. Note that this input type
  * is honored by IME and shows corresponding keyboard but this is not guaranteed. For example,
@@ -94,8 +97,9 @@
 @Composable
 fun TextField(
     value: TextFieldValue,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     onValueChange: (TextFieldValue) -> Unit,
+    textColor: Color? = null,
     textStyle: TextStyle = currentTextStyle(),
     keyboardType: KeyboardType = KeyboardType.Text,
     imeAction: ImeAction = ImeAction.Unspecified,
@@ -118,6 +122,9 @@
         )
     }
 
+    val color = textColor ?: textStyle.color ?: contentColor()
+    val mergedStyle = textStyle.merge(TextStyle(color = color))
+
     CoreTextField(
         value = fullModel.value,
         modifier = modifier,
@@ -133,7 +140,7 @@
                 )
             }
         },
-        textStyle = textStyle,
+        textStyle = mergedStyle,
         keyboardType = keyboardType,
         imeAction = imeAction,
         onFocus = onFocus,
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/animation/AndroidFlingCalculator.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/animation/AndroidFlingCalculator.kt
index 07e9fe5..e1ee210 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/animation/AndroidFlingCalculator.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/animation/AndroidFlingCalculator.kt
@@ -17,6 +17,7 @@
 package androidx.ui.foundation.animation
 
 import android.view.ViewConfiguration
+import androidx.ui.core.DensityAmbient
 import androidx.ui.unit.Density
 import kotlin.math.exp
 import kotlin.math.ln
@@ -49,6 +50,8 @@
 
 /**
  * Configuration for Android-feel flinging motion at the given density.
+ *
+ * @param density density of the screen. Use [DensityAmbient] to get current density in composition.
  */
 class AndroidFlingCalculator(
     val density: Density
@@ -118,6 +121,7 @@
             return distance * sign(initialVelocity) *
                     AndroidFlingSpline.flingPosition(splinePos).distanceCoefficient
         }
+
         fun velocity(time: Long): Float {
             val splinePos = if (duration > 0) time / duration.toFloat() else 1f
             return AndroidFlingSpline.flingPosition(splinePos).velocityCoefficient *
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/Draggable.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/Draggable.kt
index aedfa17..f424c03 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/Draggable.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/Draggable.kt
@@ -20,8 +20,8 @@
 import androidx.compose.Composable
 import androidx.compose.remember
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.DragGestureDetector
 import androidx.ui.core.gesture.DragObserver
+import androidx.ui.core.gesture.dragGestureFilter
 import androidx.ui.unit.PxPosition
 import androidx.ui.unit.px
 
@@ -32,7 +32,7 @@
  * The common usecase for this component is when you need to be able to drag something
  * inside the component on the screen and represent this state via one float value
  *
- * If you need to control the whole dragging flow, consider using [DragGestureDetector] instead.
+ * If you need to control the whole dragging flow, consider using [dragGestureFilter] instead.
  *
  * If you are implementing scroll/fling behavior, consider using [scrollable].
  *
@@ -66,7 +66,7 @@
     val dragState = remember {
         DraggableState()
     }
-    return this + DragGestureDetector(
+    return dragGestureFilter(
         dragObserver = object : DragObserver {
 
             override fun onStart(downPosition: PxPosition) {
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/Scrollable.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/Scrollable.kt
index 467494e..e3fc5c7 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/Scrollable.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/Scrollable.kt
@@ -27,8 +27,8 @@
 import androidx.ui.animation.asDisposableClock
 import androidx.ui.core.AnimationClockAmbient
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.DragGestureDetector
 import androidx.ui.core.gesture.DragObserver
+import androidx.ui.core.gesture.dragGestureFilter
 import androidx.ui.foundation.animation.FlingConfig
 import androidx.ui.foundation.animation.fling
 import androidx.ui.unit.PxPosition
@@ -166,7 +166,7 @@
     onDispose {
         scrollableState.stopAnimation()
     }
-    return this + DragGestureDetector(
+    return dragGestureFilter(
         dragObserver = object : DragObserver {
 
             override fun onStart(downPosition: PxPosition) {
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/MutuallyExclusiveSetItem.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/MutuallyExclusiveSetItem.kt
index dfc6512..5be5b7d 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/MutuallyExclusiveSetItem.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/MutuallyExclusiveSetItem.kt
@@ -19,7 +19,7 @@
 import androidx.compose.Composable
 import androidx.ui.core.Modifier
 import androidx.ui.core.PassThroughLayout
-import androidx.ui.core.gesture.TapGestureDetector
+import androidx.ui.core.gesture.tapGestureFilter
 import androidx.ui.foundation.Strings
 import androidx.ui.foundation.semantics.inMutuallyExclusiveGroup
 import androidx.ui.foundation.semantics.selected
@@ -43,7 +43,7 @@
 fun MutuallyExclusiveSetItem(
     selected: Boolean,
     onClick: () -> Unit,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() () -> Unit
 ) {
     // TODO: when semantics can be merged, we should make this use Clickable internally rather
@@ -59,6 +59,6 @@
         // TODO(b/150706555): This layout is temporary and should be removed once Semantics
         //  is implemented with modifiers.
         @Suppress("DEPRECATION")
-        PassThroughLayout(modifier + TapGestureDetector(onClick), children)
+        PassThroughLayout(modifier.tapGestureFilter(onClick), children)
     }
 }
\ No newline at end of file
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/Toggleable.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/Toggleable.kt
index 984d9cb..9d3e36a 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/Toggleable.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/Toggleable.kt
@@ -19,7 +19,7 @@
 import androidx.compose.Composable
 import androidx.ui.core.Modifier
 import androidx.ui.core.PassThroughLayout
-import androidx.ui.core.gesture.TapGestureDetector
+import androidx.ui.core.gesture.tapGestureFilter
 import androidx.ui.foundation.Strings
 import androidx.ui.foundation.selection.ToggleableState.Indeterminate
 import androidx.ui.foundation.selection.ToggleableState.Off
@@ -31,7 +31,7 @@
 import androidx.ui.semantics.onClick
 
 /**
- * Combines [TapGestureDetector] and [Semantics] for the components that need to be
+ * Combines [tapGestureFilter] and [Semantics] for the components that need to be
  * toggleable, like Switch.
  *
  * @sample androidx.ui.foundation.samples.ToggleableSample
@@ -52,7 +52,7 @@
     value: Boolean,
     onValueChange: (Boolean) -> Unit,
     enabled: Boolean = true,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() () -> Unit
 ) {
     TriStateToggleable(
@@ -65,7 +65,7 @@
 }
 
 /**
- * Combines [TapGestureDetector] and [Semantics] for the components with three states
+ * Combines [tapGestureFilter] and [Semantics] for the components with three states
  * like TriStateCheckbox.
  *
  * It supports three states: On, Off and Indeterminate.
@@ -90,7 +90,7 @@
     state: ToggleableState = On,
     onClick: () -> Unit,
     enabled: Boolean = true,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() () -> Unit
 ) {
     // TODO(pavlis): Handle multiple states for Semantics
@@ -111,19 +111,25 @@
         // TODO(b/150706555): This layout is temporary and should be removed once Semantics
         //  is implemented with modifiers.
         @Suppress("DEPRECATION")
-        PassThroughLayout(modifier + TapGestureDetector(onClick), children)
+        PassThroughLayout(modifier.tapGestureFilter(onClick), children)
     }
 }
 
 /**
  * Enum that represents possible toggleable states.
- * @property On components is on
- * @property Off components is off
- * @property Indeterminate means that on/off value cannot be determined
  */
 enum class ToggleableState {
+    /**
+     * State that means a component is on
+     */
     On,
+    /**
+     * State that means a component is off
+     */
     Off,
+    /**
+     * State that means that on/off value of a component cannot be determined
+     */
     Indeterminate
 }
 
diff --git a/ui/ui-framework/api/0.1.0-dev09.txt b/ui/ui-framework/api/0.1.0-dev09.txt
index 7c13d81..4b5c134 100644
--- a/ui/ui-framework/api/0.1.0-dev09.txt
+++ b/ui/ui-framework/api/0.1.0-dev09.txt
@@ -16,19 +16,9 @@
     method @Deprecated public static androidx.ui.core.Modifier getDrawClipToBounds();
   }
 
-  public final class CoreTextFieldKt {
-    method public static void CoreTextField(androidx.ui.input.EditorValue value, androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = TextStyle.Default, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-  }
-
-  public final class CoreTextKt {
-    method public static void CoreText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, int maxLines, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout);
-    method public static androidx.ui.core.HorizontalAlignmentLine getFirstBaseline();
-    method public static androidx.ui.core.HorizontalAlignmentLine getLastBaseline();
-  }
-
   public final class DrawKt {
     method @Deprecated public static inline void Draw(kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onPaint);
-    method @Deprecated public static inline void Draw(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onPaint);
+    method @Deprecated public static inline void Draw(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function3<? super androidx.ui.core.ContentDrawScope,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onPaint);
   }
 
   public final class DrawShadowKt {
@@ -37,17 +27,17 @@
   }
 
   public enum DropDownAlignment {
-    enum_constant public static final androidx.ui.core.DropDownAlignment Left;
-    enum_constant public static final androidx.ui.core.DropDownAlignment Right;
+    enum_constant public static final androidx.ui.core.DropDownAlignment End;
+    enum_constant public static final androidx.ui.core.DropDownAlignment Start;
   }
 
   public final class LayoutKt {
-    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicHeightMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicHeightMeasureBlock, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
-    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
+    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicHeightMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicHeightMeasureBlock, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
+    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
     method public static androidx.ui.core.LayoutNode.MeasureBlocks MeasuringIntrinsicsMeasureBlocks(kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
-    method @Deprecated public static void MultiMeasureLayout(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
-    method @Deprecated public static void PassThroughLayout(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void WithConstraints(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function2<? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,kotlin.Unit> children);
+    method @Deprecated public static void MultiMeasureLayout(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
+    method @Deprecated public static void PassThroughLayout(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void WithConstraints(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function2<? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,kotlin.Unit> children);
   }
 
   public final class LayoutTag implements androidx.ui.core.LayoutTagParentData androidx.ui.core.ParentDataModifier {
@@ -87,7 +77,7 @@
   }
 
   public final class PopupKt {
-    method public static void DropdownPopup(androidx.ui.core.DropDownAlignment dropDownAlignment = androidx.ui.core.DropDownAlignment.Left, androidx.ui.unit.IntPxPosition offset = IntPxPosition(IntPx.Zero, IntPx.Zero), androidx.ui.core.PopupProperties popupProperties = androidx.ui.core.PopupProperties(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void DropdownPopup(androidx.ui.core.DropDownAlignment dropDownAlignment = androidx.ui.core.DropDownAlignment.Start, androidx.ui.unit.IntPxPosition offset = IntPxPosition(IntPx.Zero, IntPx.Zero), androidx.ui.core.PopupProperties popupProperties = androidx.ui.core.PopupProperties(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static void Popup(androidx.ui.core.Alignment alignment = Alignment.TopStart, androidx.ui.unit.IntPxPosition offset = IntPxPosition(IntPx.Zero, IntPx.Zero), androidx.ui.core.PopupProperties popupProperties = androidx.ui.core.PopupProperties(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static boolean isPopupLayout(android.view.View view, String? testTag = null);
   }
@@ -106,22 +96,18 @@
     method public static void TestTag(String tag, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
-  public final class TextFieldDelegateKt {
-  }
-
   public final class WrapperKt {
     method public static androidx.compose.ProvidableAmbient<androidx.animation.AnimationClockObservable> getAnimationClockAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.autofill.Autofill> getAutofillAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.autofill.AutofillTree> getAutofillTreeAmbient();
+    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.clipboard.ClipboardManager> getClipboardManagerAmbient();
     method public static androidx.compose.ProvidableAmbient<android.content.res.Configuration> getConfigurationAmbient();
     method public static androidx.compose.ProvidableAmbient<android.content.Context> getContextAmbient();
-    method public static androidx.compose.ProvidableAmbient<kotlin.coroutines.CoroutineContext> getCoroutineContextAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.unit.Density> getDensityAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.input.FocusManager> getFocusManagerAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.text.font.Font.ResourceLoader> getFontLoaderAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.hapticfeedback.HapticFeedback> getHapticFeedBackAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.LayoutDirection> getLayoutDirectionAmbient();
-    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.Owner> getOwnerAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.input.TextInputService> getTextInputServiceAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.platform.UriHandler> getUriHandlerAmbient();
     method public static androidx.compose.Composition setContent(android.app.Activity, kotlin.jvm.functions.Function0<kotlin.Unit> content);
@@ -155,12 +141,12 @@
     method public static androidx.ui.unit.Duration getZoomControlsTimeout();
   }
 
-  public final class DoubleTapGestureDetectorKt {
-    method public static androidx.ui.core.Modifier DoubleTapGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onDoubleTap);
+  public final class DoubleTapGestureFilterKt {
+    method public static androidx.ui.core.Modifier doubleTapGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onDoubleTap);
   }
 
-  public final class DragGestureDetectorKt {
-    method public static androidx.ui.core.Modifier DragGestureDetector(androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null, boolean startDragImmediately = false);
+  public final class DragGestureFilterKt {
+    method public static androidx.ui.core.Modifier dragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null, boolean startDragImmediately = false);
   }
 
   public interface DragObserver {
@@ -174,8 +160,8 @@
     method public static boolean anyPointersInBounds(java.util.List<androidx.ui.core.PointerInputChange>, androidx.ui.unit.IntPxSize bounds);
   }
 
-  public final class LongPressDragGestureDetectorKt {
-    method public static androidx.ui.core.Modifier LongPressDragGestureDetector(androidx.ui.core.gesture.LongPressDragObserver longPressDragObserver);
+  public final class LongPressDragGestureFilterKt {
+    method public static androidx.ui.core.Modifier longPressDragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.LongPressDragObserver longPressDragObserver);
   }
 
   public interface LongPressDragObserver {
@@ -190,24 +176,24 @@
     field public static final androidx.ui.core.gesture.LongPressFiredEvent! INSTANCE;
   }
 
-  public final class LongPressGestureDetectorKt {
-    method public static androidx.ui.core.Modifier LongPressGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onLongPress);
+  public final class LongPressGestureFilterKt {
+    method public static androidx.ui.core.Modifier longPressGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onLongPress);
   }
 
-  public final class PressIndicatorGestureDetectorKt {
-    method public static androidx.ui.core.Modifier PressIndicatorGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit>? onStart = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onStop = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onCancel = null, boolean enabled = true);
+  public final class PressIndicatorGestureFilterKt {
+    method public static androidx.ui.core.Modifier pressIndicatorGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit>? onStart = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onStop = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onCancel = null, boolean enabled = true);
   }
 
-  public final class RawDragGestureDetectorKt {
-    method public static androidx.ui.core.Modifier RawDragGestureDetector(androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging = null);
+  public final class RawDragGestureFilterKt {
+    method public static androidx.ui.core.Modifier rawDragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging = null);
   }
 
-  public final class RawPressStartGestureDetectorKt {
-    method public static androidx.ui.core.Modifier RawPressStartStartGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onPressStart, boolean enabled = false, androidx.ui.core.PointerEventPass executionPass = PointerEventPass.PostUp);
+  public final class RawPressStartGestureFilterKt {
+    method public static androidx.ui.core.Modifier rawPressStartGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onPressStart, boolean enabled = false, androidx.ui.core.PointerEventPass executionPass = PointerEventPass.PostUp);
   }
 
-  public final class RawScaleGestureDetectorKt {
-    method public static androidx.ui.core.Modifier RawScaleGestureDetector(androidx.ui.core.gesture.RawScaleObserver scaleObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartScaling = null);
+  public final class RawScaleGestureFilterKt {
+    method public static androidx.ui.core.Modifier rawScaleGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.RawScaleObserver scaleObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartScaling = null);
   }
 
   public interface RawScaleObserver {
@@ -217,8 +203,8 @@
     method public default void onStop();
   }
 
-  public final class ScaleGestureDetectorKt {
-    method public static androidx.ui.core.Modifier ScaleGestureDetector(androidx.ui.core.gesture.ScaleObserver scaleObserver);
+  public final class ScaleGestureFilterKt {
+    method public static androidx.ui.core.Modifier scaleGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.ScaleObserver scaleObserver);
   }
 
   public interface ScaleObserver {
@@ -228,19 +214,19 @@
     method public default void onStop();
   }
 
-  public final class ScaleSlopExceededGestureDetectorKt {
-    method public static androidx.ui.core.Modifier ScaleSlopExceededGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onScaleSlopExceeded);
+  public final class ScaleSlopExceededGestureFilterKt {
+    method public static androidx.ui.core.Modifier scaleSlopExceededGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onScaleSlopExceeded);
   }
 
   public final class ScaleUtilKt {
   }
 
-  public final class TapGestureDetectorKt {
-    method public static androidx.ui.core.Modifier TapGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onTap);
+  public final class TapGestureFilterKt {
+    method public static androidx.ui.core.Modifier tapGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onTap);
   }
 
-  public final class TouchSlopExceededGestureDetectorKt {
-    method public static androidx.ui.core.Modifier TouchSlopExceededGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onTouchSlopExceeded, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null);
+  public final class TouchSlopExceededGestureFilterKt {
+    method public static androidx.ui.core.Modifier touchSlopExceededGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onTouchSlopExceeded, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null);
   }
 
 }
@@ -335,13 +321,15 @@
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.selection.SelectionRegistrar> getSelectionRegistrarAmbient();
   }
 
-  public final class TextSelectionDelegateKt {
-  }
-
 }
 
 package androidx.ui.focus {
 
+  public final class FocusModifierProviderKt {
+    method public static androidx.ui.focus.FocusModifier FocusModifier();
+    method public static androidx.ui.focus.FocusState getFocusState(androidx.ui.focus.FocusModifier);
+  }
+
   public final class FocusOperator {
     ctor public FocusOperator();
     method public androidx.ui.focus.FocusDetailedState getFocusDetailedState();
@@ -629,3 +617,11 @@
 
 }
 
+package androidx.ui.viewinterop {
+
+  public final class ComposedViewKt {
+    method public static void AndroidView(@LayoutRes int resId, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> postInflationCallback = { _ ->  });
+  }
+
+}
+
diff --git a/ui/ui-framework/api/current.txt b/ui/ui-framework/api/current.txt
index 7c13d81..4b5c134 100644
--- a/ui/ui-framework/api/current.txt
+++ b/ui/ui-framework/api/current.txt
@@ -16,19 +16,9 @@
     method @Deprecated public static androidx.ui.core.Modifier getDrawClipToBounds();
   }
 
-  public final class CoreTextFieldKt {
-    method public static void CoreTextField(androidx.ui.input.EditorValue value, androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = TextStyle.Default, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-  }
-
-  public final class CoreTextKt {
-    method public static void CoreText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, int maxLines, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout);
-    method public static androidx.ui.core.HorizontalAlignmentLine getFirstBaseline();
-    method public static androidx.ui.core.HorizontalAlignmentLine getLastBaseline();
-  }
-
   public final class DrawKt {
     method @Deprecated public static inline void Draw(kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onPaint);
-    method @Deprecated public static inline void Draw(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onPaint);
+    method @Deprecated public static inline void Draw(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function3<? super androidx.ui.core.ContentDrawScope,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onPaint);
   }
 
   public final class DrawShadowKt {
@@ -37,17 +27,17 @@
   }
 
   public enum DropDownAlignment {
-    enum_constant public static final androidx.ui.core.DropDownAlignment Left;
-    enum_constant public static final androidx.ui.core.DropDownAlignment Right;
+    enum_constant public static final androidx.ui.core.DropDownAlignment End;
+    enum_constant public static final androidx.ui.core.DropDownAlignment Start;
   }
 
   public final class LayoutKt {
-    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicHeightMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicHeightMeasureBlock, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
-    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
+    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicHeightMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicHeightMeasureBlock, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
+    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
     method public static androidx.ui.core.LayoutNode.MeasureBlocks MeasuringIntrinsicsMeasureBlocks(kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
-    method @Deprecated public static void MultiMeasureLayout(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
-    method @Deprecated public static void PassThroughLayout(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void WithConstraints(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function2<? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,kotlin.Unit> children);
+    method @Deprecated public static void MultiMeasureLayout(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
+    method @Deprecated public static void PassThroughLayout(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void WithConstraints(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function2<? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,kotlin.Unit> children);
   }
 
   public final class LayoutTag implements androidx.ui.core.LayoutTagParentData androidx.ui.core.ParentDataModifier {
@@ -87,7 +77,7 @@
   }
 
   public final class PopupKt {
-    method public static void DropdownPopup(androidx.ui.core.DropDownAlignment dropDownAlignment = androidx.ui.core.DropDownAlignment.Left, androidx.ui.unit.IntPxPosition offset = IntPxPosition(IntPx.Zero, IntPx.Zero), androidx.ui.core.PopupProperties popupProperties = androidx.ui.core.PopupProperties(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void DropdownPopup(androidx.ui.core.DropDownAlignment dropDownAlignment = androidx.ui.core.DropDownAlignment.Start, androidx.ui.unit.IntPxPosition offset = IntPxPosition(IntPx.Zero, IntPx.Zero), androidx.ui.core.PopupProperties popupProperties = androidx.ui.core.PopupProperties(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static void Popup(androidx.ui.core.Alignment alignment = Alignment.TopStart, androidx.ui.unit.IntPxPosition offset = IntPxPosition(IntPx.Zero, IntPx.Zero), androidx.ui.core.PopupProperties popupProperties = androidx.ui.core.PopupProperties(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static boolean isPopupLayout(android.view.View view, String? testTag = null);
   }
@@ -106,22 +96,18 @@
     method public static void TestTag(String tag, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
-  public final class TextFieldDelegateKt {
-  }
-
   public final class WrapperKt {
     method public static androidx.compose.ProvidableAmbient<androidx.animation.AnimationClockObservable> getAnimationClockAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.autofill.Autofill> getAutofillAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.autofill.AutofillTree> getAutofillTreeAmbient();
+    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.clipboard.ClipboardManager> getClipboardManagerAmbient();
     method public static androidx.compose.ProvidableAmbient<android.content.res.Configuration> getConfigurationAmbient();
     method public static androidx.compose.ProvidableAmbient<android.content.Context> getContextAmbient();
-    method public static androidx.compose.ProvidableAmbient<kotlin.coroutines.CoroutineContext> getCoroutineContextAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.unit.Density> getDensityAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.input.FocusManager> getFocusManagerAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.text.font.Font.ResourceLoader> getFontLoaderAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.hapticfeedback.HapticFeedback> getHapticFeedBackAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.LayoutDirection> getLayoutDirectionAmbient();
-    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.Owner> getOwnerAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.input.TextInputService> getTextInputServiceAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.platform.UriHandler> getUriHandlerAmbient();
     method public static androidx.compose.Composition setContent(android.app.Activity, kotlin.jvm.functions.Function0<kotlin.Unit> content);
@@ -155,12 +141,12 @@
     method public static androidx.ui.unit.Duration getZoomControlsTimeout();
   }
 
-  public final class DoubleTapGestureDetectorKt {
-    method public static androidx.ui.core.Modifier DoubleTapGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onDoubleTap);
+  public final class DoubleTapGestureFilterKt {
+    method public static androidx.ui.core.Modifier doubleTapGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onDoubleTap);
   }
 
-  public final class DragGestureDetectorKt {
-    method public static androidx.ui.core.Modifier DragGestureDetector(androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null, boolean startDragImmediately = false);
+  public final class DragGestureFilterKt {
+    method public static androidx.ui.core.Modifier dragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null, boolean startDragImmediately = false);
   }
 
   public interface DragObserver {
@@ -174,8 +160,8 @@
     method public static boolean anyPointersInBounds(java.util.List<androidx.ui.core.PointerInputChange>, androidx.ui.unit.IntPxSize bounds);
   }
 
-  public final class LongPressDragGestureDetectorKt {
-    method public static androidx.ui.core.Modifier LongPressDragGestureDetector(androidx.ui.core.gesture.LongPressDragObserver longPressDragObserver);
+  public final class LongPressDragGestureFilterKt {
+    method public static androidx.ui.core.Modifier longPressDragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.LongPressDragObserver longPressDragObserver);
   }
 
   public interface LongPressDragObserver {
@@ -190,24 +176,24 @@
     field public static final androidx.ui.core.gesture.LongPressFiredEvent! INSTANCE;
   }
 
-  public final class LongPressGestureDetectorKt {
-    method public static androidx.ui.core.Modifier LongPressGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onLongPress);
+  public final class LongPressGestureFilterKt {
+    method public static androidx.ui.core.Modifier longPressGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onLongPress);
   }
 
-  public final class PressIndicatorGestureDetectorKt {
-    method public static androidx.ui.core.Modifier PressIndicatorGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit>? onStart = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onStop = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onCancel = null, boolean enabled = true);
+  public final class PressIndicatorGestureFilterKt {
+    method public static androidx.ui.core.Modifier pressIndicatorGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit>? onStart = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onStop = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onCancel = null, boolean enabled = true);
   }
 
-  public final class RawDragGestureDetectorKt {
-    method public static androidx.ui.core.Modifier RawDragGestureDetector(androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging = null);
+  public final class RawDragGestureFilterKt {
+    method public static androidx.ui.core.Modifier rawDragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging = null);
   }
 
-  public final class RawPressStartGestureDetectorKt {
-    method public static androidx.ui.core.Modifier RawPressStartStartGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onPressStart, boolean enabled = false, androidx.ui.core.PointerEventPass executionPass = PointerEventPass.PostUp);
+  public final class RawPressStartGestureFilterKt {
+    method public static androidx.ui.core.Modifier rawPressStartGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onPressStart, boolean enabled = false, androidx.ui.core.PointerEventPass executionPass = PointerEventPass.PostUp);
   }
 
-  public final class RawScaleGestureDetectorKt {
-    method public static androidx.ui.core.Modifier RawScaleGestureDetector(androidx.ui.core.gesture.RawScaleObserver scaleObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartScaling = null);
+  public final class RawScaleGestureFilterKt {
+    method public static androidx.ui.core.Modifier rawScaleGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.RawScaleObserver scaleObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartScaling = null);
   }
 
   public interface RawScaleObserver {
@@ -217,8 +203,8 @@
     method public default void onStop();
   }
 
-  public final class ScaleGestureDetectorKt {
-    method public static androidx.ui.core.Modifier ScaleGestureDetector(androidx.ui.core.gesture.ScaleObserver scaleObserver);
+  public final class ScaleGestureFilterKt {
+    method public static androidx.ui.core.Modifier scaleGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.ScaleObserver scaleObserver);
   }
 
   public interface ScaleObserver {
@@ -228,19 +214,19 @@
     method public default void onStop();
   }
 
-  public final class ScaleSlopExceededGestureDetectorKt {
-    method public static androidx.ui.core.Modifier ScaleSlopExceededGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onScaleSlopExceeded);
+  public final class ScaleSlopExceededGestureFilterKt {
+    method public static androidx.ui.core.Modifier scaleSlopExceededGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onScaleSlopExceeded);
   }
 
   public final class ScaleUtilKt {
   }
 
-  public final class TapGestureDetectorKt {
-    method public static androidx.ui.core.Modifier TapGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onTap);
+  public final class TapGestureFilterKt {
+    method public static androidx.ui.core.Modifier tapGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onTap);
   }
 
-  public final class TouchSlopExceededGestureDetectorKt {
-    method public static androidx.ui.core.Modifier TouchSlopExceededGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onTouchSlopExceeded, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null);
+  public final class TouchSlopExceededGestureFilterKt {
+    method public static androidx.ui.core.Modifier touchSlopExceededGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onTouchSlopExceeded, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null);
   }
 
 }
@@ -335,13 +321,15 @@
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.selection.SelectionRegistrar> getSelectionRegistrarAmbient();
   }
 
-  public final class TextSelectionDelegateKt {
-  }
-
 }
 
 package androidx.ui.focus {
 
+  public final class FocusModifierProviderKt {
+    method public static androidx.ui.focus.FocusModifier FocusModifier();
+    method public static androidx.ui.focus.FocusState getFocusState(androidx.ui.focus.FocusModifier);
+  }
+
   public final class FocusOperator {
     ctor public FocusOperator();
     method public androidx.ui.focus.FocusDetailedState getFocusDetailedState();
@@ -629,3 +617,11 @@
 
 }
 
+package androidx.ui.viewinterop {
+
+  public final class ComposedViewKt {
+    method public static void AndroidView(@LayoutRes int resId, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> postInflationCallback = { _ ->  });
+  }
+
+}
+
diff --git a/ui/ui-framework/api/public_plus_experimental_0.1.0-dev09.txt b/ui/ui-framework/api/public_plus_experimental_0.1.0-dev09.txt
index 7c13d81..4b5c134 100644
--- a/ui/ui-framework/api/public_plus_experimental_0.1.0-dev09.txt
+++ b/ui/ui-framework/api/public_plus_experimental_0.1.0-dev09.txt
@@ -16,19 +16,9 @@
     method @Deprecated public static androidx.ui.core.Modifier getDrawClipToBounds();
   }
 
-  public final class CoreTextFieldKt {
-    method public static void CoreTextField(androidx.ui.input.EditorValue value, androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = TextStyle.Default, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-  }
-
-  public final class CoreTextKt {
-    method public static void CoreText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, int maxLines, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout);
-    method public static androidx.ui.core.HorizontalAlignmentLine getFirstBaseline();
-    method public static androidx.ui.core.HorizontalAlignmentLine getLastBaseline();
-  }
-
   public final class DrawKt {
     method @Deprecated public static inline void Draw(kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onPaint);
-    method @Deprecated public static inline void Draw(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onPaint);
+    method @Deprecated public static inline void Draw(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function3<? super androidx.ui.core.ContentDrawScope,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onPaint);
   }
 
   public final class DrawShadowKt {
@@ -37,17 +27,17 @@
   }
 
   public enum DropDownAlignment {
-    enum_constant public static final androidx.ui.core.DropDownAlignment Left;
-    enum_constant public static final androidx.ui.core.DropDownAlignment Right;
+    enum_constant public static final androidx.ui.core.DropDownAlignment End;
+    enum_constant public static final androidx.ui.core.DropDownAlignment Start;
   }
 
   public final class LayoutKt {
-    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicHeightMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicHeightMeasureBlock, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
-    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
+    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicHeightMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicHeightMeasureBlock, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
+    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
     method public static androidx.ui.core.LayoutNode.MeasureBlocks MeasuringIntrinsicsMeasureBlocks(kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
-    method @Deprecated public static void MultiMeasureLayout(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
-    method @Deprecated public static void PassThroughLayout(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void WithConstraints(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function2<? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,kotlin.Unit> children);
+    method @Deprecated public static void MultiMeasureLayout(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
+    method @Deprecated public static void PassThroughLayout(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void WithConstraints(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function2<? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,kotlin.Unit> children);
   }
 
   public final class LayoutTag implements androidx.ui.core.LayoutTagParentData androidx.ui.core.ParentDataModifier {
@@ -87,7 +77,7 @@
   }
 
   public final class PopupKt {
-    method public static void DropdownPopup(androidx.ui.core.DropDownAlignment dropDownAlignment = androidx.ui.core.DropDownAlignment.Left, androidx.ui.unit.IntPxPosition offset = IntPxPosition(IntPx.Zero, IntPx.Zero), androidx.ui.core.PopupProperties popupProperties = androidx.ui.core.PopupProperties(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void DropdownPopup(androidx.ui.core.DropDownAlignment dropDownAlignment = androidx.ui.core.DropDownAlignment.Start, androidx.ui.unit.IntPxPosition offset = IntPxPosition(IntPx.Zero, IntPx.Zero), androidx.ui.core.PopupProperties popupProperties = androidx.ui.core.PopupProperties(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static void Popup(androidx.ui.core.Alignment alignment = Alignment.TopStart, androidx.ui.unit.IntPxPosition offset = IntPxPosition(IntPx.Zero, IntPx.Zero), androidx.ui.core.PopupProperties popupProperties = androidx.ui.core.PopupProperties(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static boolean isPopupLayout(android.view.View view, String? testTag = null);
   }
@@ -106,22 +96,18 @@
     method public static void TestTag(String tag, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
-  public final class TextFieldDelegateKt {
-  }
-
   public final class WrapperKt {
     method public static androidx.compose.ProvidableAmbient<androidx.animation.AnimationClockObservable> getAnimationClockAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.autofill.Autofill> getAutofillAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.autofill.AutofillTree> getAutofillTreeAmbient();
+    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.clipboard.ClipboardManager> getClipboardManagerAmbient();
     method public static androidx.compose.ProvidableAmbient<android.content.res.Configuration> getConfigurationAmbient();
     method public static androidx.compose.ProvidableAmbient<android.content.Context> getContextAmbient();
-    method public static androidx.compose.ProvidableAmbient<kotlin.coroutines.CoroutineContext> getCoroutineContextAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.unit.Density> getDensityAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.input.FocusManager> getFocusManagerAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.text.font.Font.ResourceLoader> getFontLoaderAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.hapticfeedback.HapticFeedback> getHapticFeedBackAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.LayoutDirection> getLayoutDirectionAmbient();
-    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.Owner> getOwnerAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.input.TextInputService> getTextInputServiceAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.platform.UriHandler> getUriHandlerAmbient();
     method public static androidx.compose.Composition setContent(android.app.Activity, kotlin.jvm.functions.Function0<kotlin.Unit> content);
@@ -155,12 +141,12 @@
     method public static androidx.ui.unit.Duration getZoomControlsTimeout();
   }
 
-  public final class DoubleTapGestureDetectorKt {
-    method public static androidx.ui.core.Modifier DoubleTapGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onDoubleTap);
+  public final class DoubleTapGestureFilterKt {
+    method public static androidx.ui.core.Modifier doubleTapGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onDoubleTap);
   }
 
-  public final class DragGestureDetectorKt {
-    method public static androidx.ui.core.Modifier DragGestureDetector(androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null, boolean startDragImmediately = false);
+  public final class DragGestureFilterKt {
+    method public static androidx.ui.core.Modifier dragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null, boolean startDragImmediately = false);
   }
 
   public interface DragObserver {
@@ -174,8 +160,8 @@
     method public static boolean anyPointersInBounds(java.util.List<androidx.ui.core.PointerInputChange>, androidx.ui.unit.IntPxSize bounds);
   }
 
-  public final class LongPressDragGestureDetectorKt {
-    method public static androidx.ui.core.Modifier LongPressDragGestureDetector(androidx.ui.core.gesture.LongPressDragObserver longPressDragObserver);
+  public final class LongPressDragGestureFilterKt {
+    method public static androidx.ui.core.Modifier longPressDragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.LongPressDragObserver longPressDragObserver);
   }
 
   public interface LongPressDragObserver {
@@ -190,24 +176,24 @@
     field public static final androidx.ui.core.gesture.LongPressFiredEvent! INSTANCE;
   }
 
-  public final class LongPressGestureDetectorKt {
-    method public static androidx.ui.core.Modifier LongPressGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onLongPress);
+  public final class LongPressGestureFilterKt {
+    method public static androidx.ui.core.Modifier longPressGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onLongPress);
   }
 
-  public final class PressIndicatorGestureDetectorKt {
-    method public static androidx.ui.core.Modifier PressIndicatorGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit>? onStart = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onStop = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onCancel = null, boolean enabled = true);
+  public final class PressIndicatorGestureFilterKt {
+    method public static androidx.ui.core.Modifier pressIndicatorGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit>? onStart = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onStop = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onCancel = null, boolean enabled = true);
   }
 
-  public final class RawDragGestureDetectorKt {
-    method public static androidx.ui.core.Modifier RawDragGestureDetector(androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging = null);
+  public final class RawDragGestureFilterKt {
+    method public static androidx.ui.core.Modifier rawDragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging = null);
   }
 
-  public final class RawPressStartGestureDetectorKt {
-    method public static androidx.ui.core.Modifier RawPressStartStartGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onPressStart, boolean enabled = false, androidx.ui.core.PointerEventPass executionPass = PointerEventPass.PostUp);
+  public final class RawPressStartGestureFilterKt {
+    method public static androidx.ui.core.Modifier rawPressStartGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onPressStart, boolean enabled = false, androidx.ui.core.PointerEventPass executionPass = PointerEventPass.PostUp);
   }
 
-  public final class RawScaleGestureDetectorKt {
-    method public static androidx.ui.core.Modifier RawScaleGestureDetector(androidx.ui.core.gesture.RawScaleObserver scaleObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartScaling = null);
+  public final class RawScaleGestureFilterKt {
+    method public static androidx.ui.core.Modifier rawScaleGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.RawScaleObserver scaleObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartScaling = null);
   }
 
   public interface RawScaleObserver {
@@ -217,8 +203,8 @@
     method public default void onStop();
   }
 
-  public final class ScaleGestureDetectorKt {
-    method public static androidx.ui.core.Modifier ScaleGestureDetector(androidx.ui.core.gesture.ScaleObserver scaleObserver);
+  public final class ScaleGestureFilterKt {
+    method public static androidx.ui.core.Modifier scaleGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.ScaleObserver scaleObserver);
   }
 
   public interface ScaleObserver {
@@ -228,19 +214,19 @@
     method public default void onStop();
   }
 
-  public final class ScaleSlopExceededGestureDetectorKt {
-    method public static androidx.ui.core.Modifier ScaleSlopExceededGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onScaleSlopExceeded);
+  public final class ScaleSlopExceededGestureFilterKt {
+    method public static androidx.ui.core.Modifier scaleSlopExceededGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onScaleSlopExceeded);
   }
 
   public final class ScaleUtilKt {
   }
 
-  public final class TapGestureDetectorKt {
-    method public static androidx.ui.core.Modifier TapGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onTap);
+  public final class TapGestureFilterKt {
+    method public static androidx.ui.core.Modifier tapGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onTap);
   }
 
-  public final class TouchSlopExceededGestureDetectorKt {
-    method public static androidx.ui.core.Modifier TouchSlopExceededGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onTouchSlopExceeded, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null);
+  public final class TouchSlopExceededGestureFilterKt {
+    method public static androidx.ui.core.Modifier touchSlopExceededGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onTouchSlopExceeded, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null);
   }
 
 }
@@ -335,13 +321,15 @@
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.selection.SelectionRegistrar> getSelectionRegistrarAmbient();
   }
 
-  public final class TextSelectionDelegateKt {
-  }
-
 }
 
 package androidx.ui.focus {
 
+  public final class FocusModifierProviderKt {
+    method public static androidx.ui.focus.FocusModifier FocusModifier();
+    method public static androidx.ui.focus.FocusState getFocusState(androidx.ui.focus.FocusModifier);
+  }
+
   public final class FocusOperator {
     ctor public FocusOperator();
     method public androidx.ui.focus.FocusDetailedState getFocusDetailedState();
@@ -629,3 +617,11 @@
 
 }
 
+package androidx.ui.viewinterop {
+
+  public final class ComposedViewKt {
+    method public static void AndroidView(@LayoutRes int resId, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> postInflationCallback = { _ ->  });
+  }
+
+}
+
diff --git a/ui/ui-framework/api/public_plus_experimental_current.txt b/ui/ui-framework/api/public_plus_experimental_current.txt
index 7c13d81..4b5c134 100644
--- a/ui/ui-framework/api/public_plus_experimental_current.txt
+++ b/ui/ui-framework/api/public_plus_experimental_current.txt
@@ -16,19 +16,9 @@
     method @Deprecated public static androidx.ui.core.Modifier getDrawClipToBounds();
   }
 
-  public final class CoreTextFieldKt {
-    method public static void CoreTextField(androidx.ui.input.EditorValue value, androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = TextStyle.Default, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-  }
-
-  public final class CoreTextKt {
-    method public static void CoreText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, int maxLines, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout);
-    method public static androidx.ui.core.HorizontalAlignmentLine getFirstBaseline();
-    method public static androidx.ui.core.HorizontalAlignmentLine getLastBaseline();
-  }
-
   public final class DrawKt {
     method @Deprecated public static inline void Draw(kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onPaint);
-    method @Deprecated public static inline void Draw(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onPaint);
+    method @Deprecated public static inline void Draw(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function3<? super androidx.ui.core.ContentDrawScope,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onPaint);
   }
 
   public final class DrawShadowKt {
@@ -37,17 +27,17 @@
   }
 
   public enum DropDownAlignment {
-    enum_constant public static final androidx.ui.core.DropDownAlignment Left;
-    enum_constant public static final androidx.ui.core.DropDownAlignment Right;
+    enum_constant public static final androidx.ui.core.DropDownAlignment End;
+    enum_constant public static final androidx.ui.core.DropDownAlignment Start;
   }
 
   public final class LayoutKt {
-    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicHeightMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicHeightMeasureBlock, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
-    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
+    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicHeightMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicHeightMeasureBlock, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
+    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
     method public static androidx.ui.core.LayoutNode.MeasureBlocks MeasuringIntrinsicsMeasureBlocks(kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
-    method @Deprecated public static void MultiMeasureLayout(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
-    method @Deprecated public static void PassThroughLayout(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void WithConstraints(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function2<? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,kotlin.Unit> children);
+    method @Deprecated public static void MultiMeasureLayout(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
+    method @Deprecated public static void PassThroughLayout(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void WithConstraints(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function2<? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,kotlin.Unit> children);
   }
 
   public final class LayoutTag implements androidx.ui.core.LayoutTagParentData androidx.ui.core.ParentDataModifier {
@@ -87,7 +77,7 @@
   }
 
   public final class PopupKt {
-    method public static void DropdownPopup(androidx.ui.core.DropDownAlignment dropDownAlignment = androidx.ui.core.DropDownAlignment.Left, androidx.ui.unit.IntPxPosition offset = IntPxPosition(IntPx.Zero, IntPx.Zero), androidx.ui.core.PopupProperties popupProperties = androidx.ui.core.PopupProperties(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void DropdownPopup(androidx.ui.core.DropDownAlignment dropDownAlignment = androidx.ui.core.DropDownAlignment.Start, androidx.ui.unit.IntPxPosition offset = IntPxPosition(IntPx.Zero, IntPx.Zero), androidx.ui.core.PopupProperties popupProperties = androidx.ui.core.PopupProperties(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static void Popup(androidx.ui.core.Alignment alignment = Alignment.TopStart, androidx.ui.unit.IntPxPosition offset = IntPxPosition(IntPx.Zero, IntPx.Zero), androidx.ui.core.PopupProperties popupProperties = androidx.ui.core.PopupProperties(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static boolean isPopupLayout(android.view.View view, String? testTag = null);
   }
@@ -106,22 +96,18 @@
     method public static void TestTag(String tag, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
-  public final class TextFieldDelegateKt {
-  }
-
   public final class WrapperKt {
     method public static androidx.compose.ProvidableAmbient<androidx.animation.AnimationClockObservable> getAnimationClockAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.autofill.Autofill> getAutofillAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.autofill.AutofillTree> getAutofillTreeAmbient();
+    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.clipboard.ClipboardManager> getClipboardManagerAmbient();
     method public static androidx.compose.ProvidableAmbient<android.content.res.Configuration> getConfigurationAmbient();
     method public static androidx.compose.ProvidableAmbient<android.content.Context> getContextAmbient();
-    method public static androidx.compose.ProvidableAmbient<kotlin.coroutines.CoroutineContext> getCoroutineContextAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.unit.Density> getDensityAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.input.FocusManager> getFocusManagerAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.text.font.Font.ResourceLoader> getFontLoaderAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.hapticfeedback.HapticFeedback> getHapticFeedBackAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.LayoutDirection> getLayoutDirectionAmbient();
-    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.Owner> getOwnerAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.input.TextInputService> getTextInputServiceAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.platform.UriHandler> getUriHandlerAmbient();
     method public static androidx.compose.Composition setContent(android.app.Activity, kotlin.jvm.functions.Function0<kotlin.Unit> content);
@@ -155,12 +141,12 @@
     method public static androidx.ui.unit.Duration getZoomControlsTimeout();
   }
 
-  public final class DoubleTapGestureDetectorKt {
-    method public static androidx.ui.core.Modifier DoubleTapGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onDoubleTap);
+  public final class DoubleTapGestureFilterKt {
+    method public static androidx.ui.core.Modifier doubleTapGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onDoubleTap);
   }
 
-  public final class DragGestureDetectorKt {
-    method public static androidx.ui.core.Modifier DragGestureDetector(androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null, boolean startDragImmediately = false);
+  public final class DragGestureFilterKt {
+    method public static androidx.ui.core.Modifier dragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null, boolean startDragImmediately = false);
   }
 
   public interface DragObserver {
@@ -174,8 +160,8 @@
     method public static boolean anyPointersInBounds(java.util.List<androidx.ui.core.PointerInputChange>, androidx.ui.unit.IntPxSize bounds);
   }
 
-  public final class LongPressDragGestureDetectorKt {
-    method public static androidx.ui.core.Modifier LongPressDragGestureDetector(androidx.ui.core.gesture.LongPressDragObserver longPressDragObserver);
+  public final class LongPressDragGestureFilterKt {
+    method public static androidx.ui.core.Modifier longPressDragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.LongPressDragObserver longPressDragObserver);
   }
 
   public interface LongPressDragObserver {
@@ -190,24 +176,24 @@
     field public static final androidx.ui.core.gesture.LongPressFiredEvent! INSTANCE;
   }
 
-  public final class LongPressGestureDetectorKt {
-    method public static androidx.ui.core.Modifier LongPressGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onLongPress);
+  public final class LongPressGestureFilterKt {
+    method public static androidx.ui.core.Modifier longPressGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onLongPress);
   }
 
-  public final class PressIndicatorGestureDetectorKt {
-    method public static androidx.ui.core.Modifier PressIndicatorGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit>? onStart = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onStop = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onCancel = null, boolean enabled = true);
+  public final class PressIndicatorGestureFilterKt {
+    method public static androidx.ui.core.Modifier pressIndicatorGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit>? onStart = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onStop = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onCancel = null, boolean enabled = true);
   }
 
-  public final class RawDragGestureDetectorKt {
-    method public static androidx.ui.core.Modifier RawDragGestureDetector(androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging = null);
+  public final class RawDragGestureFilterKt {
+    method public static androidx.ui.core.Modifier rawDragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging = null);
   }
 
-  public final class RawPressStartGestureDetectorKt {
-    method public static androidx.ui.core.Modifier RawPressStartStartGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onPressStart, boolean enabled = false, androidx.ui.core.PointerEventPass executionPass = PointerEventPass.PostUp);
+  public final class RawPressStartGestureFilterKt {
+    method public static androidx.ui.core.Modifier rawPressStartGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onPressStart, boolean enabled = false, androidx.ui.core.PointerEventPass executionPass = PointerEventPass.PostUp);
   }
 
-  public final class RawScaleGestureDetectorKt {
-    method public static androidx.ui.core.Modifier RawScaleGestureDetector(androidx.ui.core.gesture.RawScaleObserver scaleObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartScaling = null);
+  public final class RawScaleGestureFilterKt {
+    method public static androidx.ui.core.Modifier rawScaleGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.RawScaleObserver scaleObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartScaling = null);
   }
 
   public interface RawScaleObserver {
@@ -217,8 +203,8 @@
     method public default void onStop();
   }
 
-  public final class ScaleGestureDetectorKt {
-    method public static androidx.ui.core.Modifier ScaleGestureDetector(androidx.ui.core.gesture.ScaleObserver scaleObserver);
+  public final class ScaleGestureFilterKt {
+    method public static androidx.ui.core.Modifier scaleGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.ScaleObserver scaleObserver);
   }
 
   public interface ScaleObserver {
@@ -228,19 +214,19 @@
     method public default void onStop();
   }
 
-  public final class ScaleSlopExceededGestureDetectorKt {
-    method public static androidx.ui.core.Modifier ScaleSlopExceededGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onScaleSlopExceeded);
+  public final class ScaleSlopExceededGestureFilterKt {
+    method public static androidx.ui.core.Modifier scaleSlopExceededGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onScaleSlopExceeded);
   }
 
   public final class ScaleUtilKt {
   }
 
-  public final class TapGestureDetectorKt {
-    method public static androidx.ui.core.Modifier TapGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onTap);
+  public final class TapGestureFilterKt {
+    method public static androidx.ui.core.Modifier tapGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onTap);
   }
 
-  public final class TouchSlopExceededGestureDetectorKt {
-    method public static androidx.ui.core.Modifier TouchSlopExceededGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onTouchSlopExceeded, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null);
+  public final class TouchSlopExceededGestureFilterKt {
+    method public static androidx.ui.core.Modifier touchSlopExceededGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onTouchSlopExceeded, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null);
   }
 
 }
@@ -335,13 +321,15 @@
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.selection.SelectionRegistrar> getSelectionRegistrarAmbient();
   }
 
-  public final class TextSelectionDelegateKt {
-  }
-
 }
 
 package androidx.ui.focus {
 
+  public final class FocusModifierProviderKt {
+    method public static androidx.ui.focus.FocusModifier FocusModifier();
+    method public static androidx.ui.focus.FocusState getFocusState(androidx.ui.focus.FocusModifier);
+  }
+
   public final class FocusOperator {
     ctor public FocusOperator();
     method public androidx.ui.focus.FocusDetailedState getFocusDetailedState();
@@ -629,3 +617,11 @@
 
 }
 
+package androidx.ui.viewinterop {
+
+  public final class ComposedViewKt {
+    method public static void AndroidView(@LayoutRes int resId, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> postInflationCallback = { _ ->  });
+  }
+
+}
+
diff --git a/ui/ui-framework/api/restricted_0.1.0-dev09.txt b/ui/ui-framework/api/restricted_0.1.0-dev09.txt
index 20c1c21..beb61fc 100644
--- a/ui/ui-framework/api/restricted_0.1.0-dev09.txt
+++ b/ui/ui-framework/api/restricted_0.1.0-dev09.txt
@@ -16,19 +16,9 @@
     method @Deprecated public static androidx.ui.core.Modifier getDrawClipToBounds();
   }
 
-  public final class CoreTextFieldKt {
-    method public static void CoreTextField(androidx.ui.input.EditorValue value, androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = TextStyle.Default, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-  }
-
-  public final class CoreTextKt {
-    method public static void CoreText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, int maxLines, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout);
-    method public static androidx.ui.core.HorizontalAlignmentLine getFirstBaseline();
-    method public static androidx.ui.core.HorizontalAlignmentLine getLastBaseline();
-  }
-
   public final class DrawKt {
     method @Deprecated public static inline void Draw(kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onPaint);
-    method @Deprecated public static inline void Draw(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onPaint);
+    method @Deprecated public static inline void Draw(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function3<? super androidx.ui.core.ContentDrawScope,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onPaint);
   }
 
   public final class DrawShadowKt {
@@ -37,17 +27,17 @@
   }
 
   public enum DropDownAlignment {
-    enum_constant public static final androidx.ui.core.DropDownAlignment Left;
-    enum_constant public static final androidx.ui.core.DropDownAlignment Right;
+    enum_constant public static final androidx.ui.core.DropDownAlignment End;
+    enum_constant public static final androidx.ui.core.DropDownAlignment Start;
   }
 
   public final class LayoutKt {
-    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicHeightMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicHeightMeasureBlock, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
-    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
+    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicHeightMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicHeightMeasureBlock, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
+    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
     method public static androidx.ui.core.LayoutNode.MeasureBlocks MeasuringIntrinsicsMeasureBlocks(kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
-    method @Deprecated public static void MultiMeasureLayout(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
-    method @Deprecated public static void PassThroughLayout(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void WithConstraints(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function2<? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,kotlin.Unit> children);
+    method @Deprecated public static void MultiMeasureLayout(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
+    method @Deprecated public static void PassThroughLayout(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void WithConstraints(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function2<? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,kotlin.Unit> children);
   }
 
   public final class LayoutTag implements androidx.ui.core.LayoutTagParentData androidx.ui.core.ParentDataModifier {
@@ -87,7 +77,7 @@
   }
 
   public final class PopupKt {
-    method public static void DropdownPopup(androidx.ui.core.DropDownAlignment dropDownAlignment = androidx.ui.core.DropDownAlignment.Left, androidx.ui.unit.IntPxPosition offset = IntPxPosition(IntPx.Zero, IntPx.Zero), androidx.ui.core.PopupProperties popupProperties = androidx.ui.core.PopupProperties(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void DropdownPopup(androidx.ui.core.DropDownAlignment dropDownAlignment = androidx.ui.core.DropDownAlignment.Start, androidx.ui.unit.IntPxPosition offset = IntPxPosition(IntPx.Zero, IntPx.Zero), androidx.ui.core.PopupProperties popupProperties = androidx.ui.core.PopupProperties(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static void Popup(androidx.ui.core.Alignment alignment = Alignment.TopStart, androidx.ui.unit.IntPxPosition offset = IntPxPosition(IntPx.Zero, IntPx.Zero), androidx.ui.core.PopupProperties popupProperties = androidx.ui.core.PopupProperties(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static boolean isPopupLayout(android.view.View view, String? testTag = null);
   }
@@ -106,22 +96,18 @@
     method public static void TestTag(String tag, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
-  public final class TextFieldDelegateKt {
-  }
-
   public final class WrapperKt {
     method public static androidx.compose.ProvidableAmbient<androidx.animation.AnimationClockObservable> getAnimationClockAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.autofill.Autofill> getAutofillAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.autofill.AutofillTree> getAutofillTreeAmbient();
+    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.clipboard.ClipboardManager> getClipboardManagerAmbient();
     method public static androidx.compose.ProvidableAmbient<android.content.res.Configuration> getConfigurationAmbient();
     method public static androidx.compose.ProvidableAmbient<android.content.Context> getContextAmbient();
-    method public static androidx.compose.ProvidableAmbient<kotlin.coroutines.CoroutineContext> getCoroutineContextAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.unit.Density> getDensityAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.input.FocusManager> getFocusManagerAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.text.font.Font.ResourceLoader> getFontLoaderAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.hapticfeedback.HapticFeedback> getHapticFeedBackAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.LayoutDirection> getLayoutDirectionAmbient();
-    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.Owner> getOwnerAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.input.TextInputService> getTextInputServiceAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.platform.UriHandler> getUriHandlerAmbient();
     method public static androidx.compose.Composition setContent(android.app.Activity, kotlin.jvm.functions.Function0<kotlin.Unit> content);
@@ -155,12 +141,12 @@
     method public static androidx.ui.unit.Duration getZoomControlsTimeout();
   }
 
-  public final class DoubleTapGestureDetectorKt {
-    method public static androidx.ui.core.Modifier DoubleTapGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onDoubleTap);
+  public final class DoubleTapGestureFilterKt {
+    method public static androidx.ui.core.Modifier doubleTapGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onDoubleTap);
   }
 
-  public final class DragGestureDetectorKt {
-    method public static androidx.ui.core.Modifier DragGestureDetector(androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null, boolean startDragImmediately = false);
+  public final class DragGestureFilterKt {
+    method public static androidx.ui.core.Modifier dragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null, boolean startDragImmediately = false);
   }
 
   public interface DragObserver {
@@ -174,8 +160,8 @@
     method public static boolean anyPointersInBounds(java.util.List<androidx.ui.core.PointerInputChange>, androidx.ui.unit.IntPxSize bounds);
   }
 
-  public final class LongPressDragGestureDetectorKt {
-    method public static androidx.ui.core.Modifier LongPressDragGestureDetector(androidx.ui.core.gesture.LongPressDragObserver longPressDragObserver);
+  public final class LongPressDragGestureFilterKt {
+    method public static androidx.ui.core.Modifier longPressDragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.LongPressDragObserver longPressDragObserver);
   }
 
   public interface LongPressDragObserver {
@@ -190,24 +176,24 @@
     field public static final androidx.ui.core.gesture.LongPressFiredEvent! INSTANCE;
   }
 
-  public final class LongPressGestureDetectorKt {
-    method public static androidx.ui.core.Modifier LongPressGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onLongPress);
+  public final class LongPressGestureFilterKt {
+    method public static androidx.ui.core.Modifier longPressGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onLongPress);
   }
 
-  public final class PressIndicatorGestureDetectorKt {
-    method public static androidx.ui.core.Modifier PressIndicatorGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit>? onStart = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onStop = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onCancel = null, boolean enabled = true);
+  public final class PressIndicatorGestureFilterKt {
+    method public static androidx.ui.core.Modifier pressIndicatorGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit>? onStart = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onStop = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onCancel = null, boolean enabled = true);
   }
 
-  public final class RawDragGestureDetectorKt {
-    method public static androidx.ui.core.Modifier RawDragGestureDetector(androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging = null);
+  public final class RawDragGestureFilterKt {
+    method public static androidx.ui.core.Modifier rawDragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging = null);
   }
 
-  public final class RawPressStartGestureDetectorKt {
-    method public static androidx.ui.core.Modifier RawPressStartStartGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onPressStart, boolean enabled = false, androidx.ui.core.PointerEventPass executionPass = PointerEventPass.PostUp);
+  public final class RawPressStartGestureFilterKt {
+    method public static androidx.ui.core.Modifier rawPressStartGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onPressStart, boolean enabled = false, androidx.ui.core.PointerEventPass executionPass = PointerEventPass.PostUp);
   }
 
-  public final class RawScaleGestureDetectorKt {
-    method public static androidx.ui.core.Modifier RawScaleGestureDetector(androidx.ui.core.gesture.RawScaleObserver scaleObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartScaling = null);
+  public final class RawScaleGestureFilterKt {
+    method public static androidx.ui.core.Modifier rawScaleGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.RawScaleObserver scaleObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartScaling = null);
   }
 
   public interface RawScaleObserver {
@@ -217,8 +203,8 @@
     method public default void onStop();
   }
 
-  public final class ScaleGestureDetectorKt {
-    method public static androidx.ui.core.Modifier ScaleGestureDetector(androidx.ui.core.gesture.ScaleObserver scaleObserver);
+  public final class ScaleGestureFilterKt {
+    method public static androidx.ui.core.Modifier scaleGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.ScaleObserver scaleObserver);
   }
 
   public interface ScaleObserver {
@@ -228,19 +214,19 @@
     method public default void onStop();
   }
 
-  public final class ScaleSlopExceededGestureDetectorKt {
-    method public static androidx.ui.core.Modifier ScaleSlopExceededGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onScaleSlopExceeded);
+  public final class ScaleSlopExceededGestureFilterKt {
+    method public static androidx.ui.core.Modifier scaleSlopExceededGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onScaleSlopExceeded);
   }
 
   public final class ScaleUtilKt {
   }
 
-  public final class TapGestureDetectorKt {
-    method public static androidx.ui.core.Modifier TapGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onTap);
+  public final class TapGestureFilterKt {
+    method public static androidx.ui.core.Modifier tapGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onTap);
   }
 
-  public final class TouchSlopExceededGestureDetectorKt {
-    method public static androidx.ui.core.Modifier TouchSlopExceededGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onTouchSlopExceeded, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null);
+  public final class TouchSlopExceededGestureFilterKt {
+    method public static androidx.ui.core.Modifier touchSlopExceededGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onTouchSlopExceeded, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null);
   }
 
 }
@@ -335,13 +321,15 @@
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.selection.SelectionRegistrar> getSelectionRegistrarAmbient();
   }
 
-  public final class TextSelectionDelegateKt {
-  }
-
 }
 
 package androidx.ui.focus {
 
+  public final class FocusModifierProviderKt {
+    method public static androidx.ui.focus.FocusModifier FocusModifier();
+    method public static androidx.ui.focus.FocusState getFocusState(androidx.ui.focus.FocusModifier);
+  }
+
   public final class FocusOperator {
     ctor public FocusOperator();
     method public androidx.ui.focus.FocusDetailedState getFocusDetailedState();
@@ -638,3 +626,11 @@
 
 }
 
+package androidx.ui.viewinterop {
+
+  public final class ComposedViewKt {
+    method public static void AndroidView(@LayoutRes int resId, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> postInflationCallback = { _ ->  });
+  }
+
+}
+
diff --git a/ui/ui-framework/api/restricted_current.txt b/ui/ui-framework/api/restricted_current.txt
index 20c1c21..beb61fc 100644
--- a/ui/ui-framework/api/restricted_current.txt
+++ b/ui/ui-framework/api/restricted_current.txt
@@ -16,19 +16,9 @@
     method @Deprecated public static androidx.ui.core.Modifier getDrawClipToBounds();
   }
 
-  public final class CoreTextFieldKt {
-    method public static void CoreTextField(androidx.ui.input.EditorValue value, androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = TextStyle.Default, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
-  }
-
-  public final class CoreTextKt {
-    method public static void CoreText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.text.TextStyle style, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, int maxLines, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout);
-    method public static androidx.ui.core.HorizontalAlignmentLine getFirstBaseline();
-    method public static androidx.ui.core.HorizontalAlignmentLine getLastBaseline();
-  }
-
   public final class DrawKt {
     method @Deprecated public static inline void Draw(kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onPaint);
-    method @Deprecated public static inline void Draw(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onPaint);
+    method @Deprecated public static inline void Draw(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function3<? super androidx.ui.core.ContentDrawScope,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> onPaint);
   }
 
   public final class DrawShadowKt {
@@ -37,17 +27,17 @@
   }
 
   public enum DropDownAlignment {
-    enum_constant public static final androidx.ui.core.DropDownAlignment Left;
-    enum_constant public static final androidx.ui.core.DropDownAlignment Right;
+    enum_constant public static final androidx.ui.core.DropDownAlignment End;
+    enum_constant public static final androidx.ui.core.DropDownAlignment Start;
   }
 
   public final class LayoutKt {
-    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicHeightMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicHeightMeasureBlock, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
-    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
+    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> minIntrinsicHeightMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.unit.Density,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super androidx.ui.unit.IntPx,? super androidx.ui.core.LayoutDirection,androidx.ui.unit.IntPx> maxIntrinsicHeightMeasureBlock, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
+    method public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
     method public static androidx.ui.core.LayoutNode.MeasureBlocks MeasuringIntrinsicsMeasureBlocks(kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
-    method @Deprecated public static void MultiMeasureLayout(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
-    method @Deprecated public static void PassThroughLayout(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void WithConstraints(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function2<? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,kotlin.Unit> children);
+    method @Deprecated public static void MultiMeasureLayout(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
+    method @Deprecated public static void PassThroughLayout(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void WithConstraints(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function2<? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,kotlin.Unit> children);
   }
 
   public final class LayoutTag implements androidx.ui.core.LayoutTagParentData androidx.ui.core.ParentDataModifier {
@@ -87,7 +77,7 @@
   }
 
   public final class PopupKt {
-    method public static void DropdownPopup(androidx.ui.core.DropDownAlignment dropDownAlignment = androidx.ui.core.DropDownAlignment.Left, androidx.ui.unit.IntPxPosition offset = IntPxPosition(IntPx.Zero, IntPx.Zero), androidx.ui.core.PopupProperties popupProperties = androidx.ui.core.PopupProperties(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void DropdownPopup(androidx.ui.core.DropDownAlignment dropDownAlignment = androidx.ui.core.DropDownAlignment.Start, androidx.ui.unit.IntPxPosition offset = IntPxPosition(IntPx.Zero, IntPx.Zero), androidx.ui.core.PopupProperties popupProperties = androidx.ui.core.PopupProperties(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static void Popup(androidx.ui.core.Alignment alignment = Alignment.TopStart, androidx.ui.unit.IntPxPosition offset = IntPxPosition(IntPx.Zero, IntPx.Zero), androidx.ui.core.PopupProperties popupProperties = androidx.ui.core.PopupProperties(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method public static boolean isPopupLayout(android.view.View view, String? testTag = null);
   }
@@ -106,22 +96,18 @@
     method public static void TestTag(String tag, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
-  public final class TextFieldDelegateKt {
-  }
-
   public final class WrapperKt {
     method public static androidx.compose.ProvidableAmbient<androidx.animation.AnimationClockObservable> getAnimationClockAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.autofill.Autofill> getAutofillAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.autofill.AutofillTree> getAutofillTreeAmbient();
+    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.clipboard.ClipboardManager> getClipboardManagerAmbient();
     method public static androidx.compose.ProvidableAmbient<android.content.res.Configuration> getConfigurationAmbient();
     method public static androidx.compose.ProvidableAmbient<android.content.Context> getContextAmbient();
-    method public static androidx.compose.ProvidableAmbient<kotlin.coroutines.CoroutineContext> getCoroutineContextAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.unit.Density> getDensityAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.input.FocusManager> getFocusManagerAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.text.font.Font.ResourceLoader> getFontLoaderAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.hapticfeedback.HapticFeedback> getHapticFeedBackAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.LayoutDirection> getLayoutDirectionAmbient();
-    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.Owner> getOwnerAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.input.TextInputService> getTextInputServiceAmbient();
     method public static androidx.compose.ProvidableAmbient<androidx.ui.platform.UriHandler> getUriHandlerAmbient();
     method public static androidx.compose.Composition setContent(android.app.Activity, kotlin.jvm.functions.Function0<kotlin.Unit> content);
@@ -155,12 +141,12 @@
     method public static androidx.ui.unit.Duration getZoomControlsTimeout();
   }
 
-  public final class DoubleTapGestureDetectorKt {
-    method public static androidx.ui.core.Modifier DoubleTapGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onDoubleTap);
+  public final class DoubleTapGestureFilterKt {
+    method public static androidx.ui.core.Modifier doubleTapGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onDoubleTap);
   }
 
-  public final class DragGestureDetectorKt {
-    method public static androidx.ui.core.Modifier DragGestureDetector(androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null, boolean startDragImmediately = false);
+  public final class DragGestureFilterKt {
+    method public static androidx.ui.core.Modifier dragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null, boolean startDragImmediately = false);
   }
 
   public interface DragObserver {
@@ -174,8 +160,8 @@
     method public static boolean anyPointersInBounds(java.util.List<androidx.ui.core.PointerInputChange>, androidx.ui.unit.IntPxSize bounds);
   }
 
-  public final class LongPressDragGestureDetectorKt {
-    method public static androidx.ui.core.Modifier LongPressDragGestureDetector(androidx.ui.core.gesture.LongPressDragObserver longPressDragObserver);
+  public final class LongPressDragGestureFilterKt {
+    method public static androidx.ui.core.Modifier longPressDragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.LongPressDragObserver longPressDragObserver);
   }
 
   public interface LongPressDragObserver {
@@ -190,24 +176,24 @@
     field public static final androidx.ui.core.gesture.LongPressFiredEvent! INSTANCE;
   }
 
-  public final class LongPressGestureDetectorKt {
-    method public static androidx.ui.core.Modifier LongPressGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onLongPress);
+  public final class LongPressGestureFilterKt {
+    method public static androidx.ui.core.Modifier longPressGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onLongPress);
   }
 
-  public final class PressIndicatorGestureDetectorKt {
-    method public static androidx.ui.core.Modifier PressIndicatorGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit>? onStart = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onStop = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onCancel = null, boolean enabled = true);
+  public final class PressIndicatorGestureFilterKt {
+    method public static androidx.ui.core.Modifier pressIndicatorGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit>? onStart = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onStop = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onCancel = null, boolean enabled = true);
   }
 
-  public final class RawDragGestureDetectorKt {
-    method public static androidx.ui.core.Modifier RawDragGestureDetector(androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging = null);
+  public final class RawDragGestureFilterKt {
+    method public static androidx.ui.core.Modifier rawDragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging = null);
   }
 
-  public final class RawPressStartGestureDetectorKt {
-    method public static androidx.ui.core.Modifier RawPressStartStartGestureDetector(kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onPressStart, boolean enabled = false, androidx.ui.core.PointerEventPass executionPass = PointerEventPass.PostUp);
+  public final class RawPressStartGestureFilterKt {
+    method public static androidx.ui.core.Modifier rawPressStartGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onPressStart, boolean enabled = false, androidx.ui.core.PointerEventPass executionPass = PointerEventPass.PostUp);
   }
 
-  public final class RawScaleGestureDetectorKt {
-    method public static androidx.ui.core.Modifier RawScaleGestureDetector(androidx.ui.core.gesture.RawScaleObserver scaleObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartScaling = null);
+  public final class RawScaleGestureFilterKt {
+    method public static androidx.ui.core.Modifier rawScaleGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.RawScaleObserver scaleObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartScaling = null);
   }
 
   public interface RawScaleObserver {
@@ -217,8 +203,8 @@
     method public default void onStop();
   }
 
-  public final class ScaleGestureDetectorKt {
-    method public static androidx.ui.core.Modifier ScaleGestureDetector(androidx.ui.core.gesture.ScaleObserver scaleObserver);
+  public final class ScaleGestureFilterKt {
+    method public static androidx.ui.core.Modifier scaleGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.ScaleObserver scaleObserver);
   }
 
   public interface ScaleObserver {
@@ -228,19 +214,19 @@
     method public default void onStop();
   }
 
-  public final class ScaleSlopExceededGestureDetectorKt {
-    method public static androidx.ui.core.Modifier ScaleSlopExceededGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onScaleSlopExceeded);
+  public final class ScaleSlopExceededGestureFilterKt {
+    method public static androidx.ui.core.Modifier scaleSlopExceededGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onScaleSlopExceeded);
   }
 
   public final class ScaleUtilKt {
   }
 
-  public final class TapGestureDetectorKt {
-    method public static androidx.ui.core.Modifier TapGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onTap);
+  public final class TapGestureFilterKt {
+    method public static androidx.ui.core.Modifier tapGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onTap);
   }
 
-  public final class TouchSlopExceededGestureDetectorKt {
-    method public static androidx.ui.core.Modifier TouchSlopExceededGestureDetector(kotlin.jvm.functions.Function0<kotlin.Unit> onTouchSlopExceeded, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null);
+  public final class TouchSlopExceededGestureFilterKt {
+    method public static androidx.ui.core.Modifier touchSlopExceededGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onTouchSlopExceeded, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null);
   }
 
 }
@@ -335,13 +321,15 @@
     method public static androidx.compose.ProvidableAmbient<androidx.ui.core.selection.SelectionRegistrar> getSelectionRegistrarAmbient();
   }
 
-  public final class TextSelectionDelegateKt {
-  }
-
 }
 
 package androidx.ui.focus {
 
+  public final class FocusModifierProviderKt {
+    method public static androidx.ui.focus.FocusModifier FocusModifier();
+    method public static androidx.ui.focus.FocusState getFocusState(androidx.ui.focus.FocusModifier);
+  }
+
   public final class FocusOperator {
     ctor public FocusOperator();
     method public androidx.ui.focus.FocusDetailedState getFocusDetailedState();
@@ -638,3 +626,11 @@
 
 }
 
+package androidx.ui.viewinterop {
+
+  public final class ComposedViewKt {
+    method public static void AndroidView(@LayoutRes int resId, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> postInflationCallback = { _ ->  });
+  }
+
+}
+
diff --git a/ui/ui-framework/build.gradle b/ui/ui-framework/build.gradle
index f25e640..343d3fe 100644
--- a/ui/ui-framework/build.gradle
+++ b/ui/ui-framework/build.gradle
@@ -40,7 +40,7 @@
     implementation project(":compose:compose-runtime")
     api project(":ui:ui-core")
     implementation project(":ui:ui-platform")
-    api project(":ui:ui-text")
+    api project(":ui:ui-text-core")
     implementation project(":ui:ui-util")
     implementation project(":ui:ui-vector")
     implementation project(":ui:ui-saved-instance-state")
@@ -56,7 +56,7 @@
     }
 
     androidTestImplementation project(":ui:ui-test")
-
+    androidTestImplementation project(":ui:ui-test-font")
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(JUNIT)
diff --git a/ui/ui-framework/integration-tests/framework-demos/build.gradle b/ui/ui-framework/integration-tests/framework-demos/build.gradle
index 4f2e550..3f4196a 100644
--- a/ui/ui-framework/integration-tests/framework-demos/build.gradle
+++ b/ui/ui-framework/integration-tests/framework-demos/build.gradle
@@ -18,7 +18,7 @@
     implementation project(":ui:integration-tests:demos:common")
     implementation project(":ui:ui-core")
     implementation project(":ui:ui-layout")
-    implementation project(":ui:ui-text")
+    implementation project(":ui:ui-text-core")
     implementation project(":ui:ui-animation")
     implementation project(":ui:ui-foundation")
     implementation project(":ui:ui-framework")
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/AnimationGestureSemanticsDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/AnimationGestureSemanticsDemo.kt
index 6b543dd..3262ff1 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/AnimationGestureSemanticsDemo.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/AnimationGestureSemanticsDemo.kt
@@ -23,7 +23,7 @@
 import androidx.ui.animation.ColorPropKey
 import androidx.ui.animation.Transition
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.PressIndicatorGestureDetector
+import androidx.ui.core.gesture.pressIndicatorGestureFilter
 import androidx.ui.foundation.Canvas
 import androidx.ui.geometry.Offset
 import androidx.ui.graphics.Color
@@ -74,7 +74,7 @@
 private fun WithoutSemanticActions() {
     val animationEndState = state { ComponentState.Released }
     val pressIndicator =
-        PressIndicatorGestureDetector(
+        Modifier.pressIndicatorGestureFilter(
             onStart = { animationEndState.value = ComponentState.Pressed },
             onStop = { animationEndState.value = ComponentState.Released })
     Animation(pressIndicator, animationEndState = animationEndState.value)
@@ -193,7 +193,7 @@
 }
 
 @Composable
-private fun Animation(modifier: Modifier = Modifier.None, animationEndState: ComponentState) {
+private fun Animation(modifier: Modifier = Modifier, animationEndState: ComponentState) {
     Transition(definition = transitionDefinition, toState = animationEndState) { state ->
         val color = state[colorKey]
         val sizeRatio = state[sizeKey]
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/PopupDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/PopupDemo.kt
index 48527f6..f631d6b 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/PopupDemo.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/PopupDemo.kt
@@ -260,17 +260,17 @@
     Column(Modifier.gravity(ColumnAlign.Center)) {
         val heightSize = 120.dp
         val widthSize = 160.dp
-        val dropDownAlignment = state { DropDownAlignment.Left }
+        val dropDownAlignment = state { DropDownAlignment.Start }
 
         ClickableTextWithBackground(
             text = "Change alignment",
             color = Color.Cyan,
             onClick = {
                 dropDownAlignment.value =
-                    if (dropDownAlignment.value == DropDownAlignment.Left) {
-                        DropDownAlignment.Right
+                    if (dropDownAlignment.value == DropDownAlignment.Start) {
+                        DropDownAlignment.End
                     } else {
-                        DropDownAlignment.Left
+                        DropDownAlignment.Start
                     }
             }
         )
@@ -469,7 +469,7 @@
 
 @Composable
 private fun EditLine(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     keyboardType: KeyboardType = KeyboardType.Text,
     imeAction: ImeAction = ImeAction.Unspecified,
     onValueChange: (String) -> Unit = {},
@@ -485,7 +485,6 @@
         onValueChange = {
             state.value = it
             onValueChange(it.text)
-        },
-        textStyle = TextStyle()
+        }
     )
 }
\ No newline at end of file
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/SemanticsL1.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/SemanticsL1.kt
index fedc87e..8d5ec8b 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/SemanticsL1.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/SemanticsL1.kt
@@ -19,7 +19,7 @@
 import androidx.compose.Composable
 import androidx.compose.state
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.PressIndicatorGestureDetector
+import androidx.ui.core.gesture.pressIndicatorGestureFilter
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.ContentGravity
 import androidx.ui.foundation.Text
@@ -145,7 +145,7 @@
     onPress: SemanticAction<PxPosition> = SemanticAction(defaultParam = PxPosition.Origin) { },
     onRelease: SemanticAction<Unit> = SemanticAction(defaultParam = Unit) { },
     onCancel: SemanticAction<Unit> = SemanticAction(defaultParam = Unit) { }
-) = PressIndicatorGestureDetector(
+) = Modifier.pressIndicatorGestureFilter(
         onStart = { onPress.action(ActionParam(ActionCaller.PointerInput, it)) },
         onStop = { onRelease.action(ActionParam(ActionCaller.PointerInput, Unit)) },
         onCancel = { onCancel.action(ActionParam(ActionCaller.PointerInput, Unit)) }
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/focus/FocusableDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/focus/FocusableDemo.kt
index e5466dd..ba88e12 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/focus/FocusableDemo.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/focus/FocusableDemo.kt
@@ -18,11 +18,12 @@
 
 import androidx.compose.Composable
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.PressIndicatorGestureDetector
+import androidx.ui.core.gesture.tapGestureFilter
+import androidx.ui.focus.FocusModifier
 import androidx.ui.focus.FocusState.Focused
 import androidx.ui.focus.FocusState.NotFocusable
 import androidx.ui.focus.FocusState.NotFocused
-import androidx.ui.focus.Focusable
+import androidx.ui.focus.focusState
 import androidx.ui.foundation.Text
 import androidx.ui.graphics.Color
 import androidx.ui.layout.Arrangement
@@ -30,46 +31,42 @@
 import androidx.ui.layout.Row
 import androidx.ui.layout.RowScope
 import androidx.ui.layout.fillMaxWidth
-import androidx.ui.text.TextStyle
 
 @Composable
 fun FocusableDemo() {
-    Focusable {
-        Column(arrangement = Arrangement.SpaceEvenly) {
-            CenteredRow {
-                Text("Click on any focusable to bring it into focus:")
-            }
-            CenteredRow {
-                FocusableText("Focusable 1")
-            }
-            CenteredRow {
-                FocusableText("Focusable 2")
-            }
-            CenteredRow {
-                FocusableText("Focusable 3")
-            }
+    Column(
+        arrangement = Arrangement.SpaceEvenly
+    ) {
+        CenteredRow {
+            Text("Click on any focusable to bring it into focus:")
+        }
+        CenteredRow {
+            FocusableText("Focusable 1")
+        }
+        CenteredRow {
+            FocusableText("Focusable 2")
+        }
+        CenteredRow {
+            FocusableText("Focusable 3")
         }
     }
 }
 
 @Composable
 private fun FocusableText(text: String) {
-    Focusable { focus ->
-        Text(
-            modifier = PressIndicatorGestureDetector(onStart = { focus.requestFocus() }),
-            text = text,
-            style = TextStyle(
-                color = when (focus.focusState) {
-                    Focused -> Color.Green
-                    NotFocused -> Color.Black
-                    NotFocusable -> Color.Gray
-                }
-            )
-        )
-    }
+    val focusModifier = FocusModifier()
+    Text(
+        modifier = focusModifier.tapGestureFilter { focusModifier.requestFocus() },
+        text = text,
+        color = when (focusModifier.focusState) {
+            Focused -> Color.Green
+            NotFocused -> Color.Black
+            NotFocusable -> Color.Gray
+        }
+    )
 }
 
 @Composable
 private fun CenteredRow(children: @Composable() RowScope.() -> Unit) {
-    Row(Modifier.fillMaxWidth(), arrangement = Arrangement.Center, children = children)
+    Row(modifier = Modifier.fillMaxWidth(), arrangement = Arrangement.Center, children = children)
 }
\ No newline at end of file
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/DoubleTapGestureDetectorDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/DoubleTapGestureDetectorDemo.kt
index 121e5a0..3759aee 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/DoubleTapGestureDetectorDemo.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/DoubleTapGestureDetectorDemo.kt
@@ -20,7 +20,7 @@
 import androidx.compose.state
 import androidx.ui.core.Alignment
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.DoubleTapGestureDetector
+import androidx.ui.core.gesture.doubleTapGestureFilter
 import androidx.ui.foundation.Border
 import androidx.ui.foundation.Box
 import androidx.ui.layout.fillMaxSize
@@ -43,7 +43,7 @@
     Box(
         Modifier.fillMaxSize()
             .wrapContentSize(Alignment.Center)
-            .plus(DoubleTapGestureDetector(onDoubleTap))
+            .doubleTapGestureFilter(onDoubleTap)
             .preferredSize(192.dp),
         backgroundColor = color.value,
         border = Border(2.dp, BorderColor)
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/DragScaleGestureDetectorDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/DragScaleGestureDetectorDemo.kt
index 8bca91f..2daf6cf 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/DragScaleGestureDetectorDemo.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/DragScaleGestureDetectorDemo.kt
@@ -21,11 +21,11 @@
 import androidx.ui.core.Alignment
 import androidx.ui.core.DensityAmbient
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.DragGestureDetector
 import androidx.ui.core.gesture.DragObserver
-import androidx.ui.core.gesture.ScaleGestureDetector
+import androidx.ui.core.gesture.scaleGestureFilter
 import androidx.ui.core.gesture.ScaleObserver
-import androidx.ui.core.gesture.TapGestureDetector
+import androidx.ui.core.gesture.tapGestureFilter
+import androidx.ui.core.gesture.dragGestureFilter
 import androidx.ui.foundation.Box
 import androidx.ui.graphics.Color
 import androidx.ui.layout.fillMaxSize
@@ -64,13 +64,15 @@
 
     val gestures =
         if (dragInScale.value) {
-            ScaleGestureDetector(scaleObserver) +
-                    DragGestureDetector(dragObserver) +
-                    TapGestureDetector(onRelease)
+            Modifier
+                .scaleGestureFilter(scaleObserver)
+                .dragGestureFilter(dragObserver)
+                .tapGestureFilter(onRelease)
         } else {
-            DragGestureDetector(dragObserver) +
-                    ScaleGestureDetector(scaleObserver) +
-                    TapGestureDetector(onRelease)
+            Modifier
+                .dragGestureFilter(dragObserver)
+                .scaleGestureFilter(scaleObserver)
+                .tapGestureFilter(onRelease)
         }
 
     val (offsetX, offsetY) =
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/LongPressDragGestureDetectorDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/LongPressDragGestureDetectorDemo.kt
index 5594a0b..92cbd7d 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/LongPressDragGestureDetectorDemo.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/LongPressDragGestureDetectorDemo.kt
@@ -21,7 +21,7 @@
 import androidx.ui.core.Alignment
 import androidx.ui.core.DensityAmbient
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.LongPressDragGestureDetector
+import androidx.ui.core.gesture.longPressDragGestureFilter
 import androidx.ui.core.gesture.LongPressDragObserver
 import androidx.ui.foundation.Box
 import androidx.ui.layout.fillMaxSize
@@ -69,7 +69,7 @@
         Modifier.offset(offsetX, offsetY)
             .fillMaxSize()
             .wrapContentSize(Alignment.Center)
-            .plus(LongPressDragGestureDetector(longPressDragObserver))
+            .longPressDragGestureFilter(longPressDragObserver)
             .preferredSize(96.dp),
         backgroundColor = color.value
     )
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/LongPressGestureDetectorDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/LongPressGestureDetectorDemo.kt
index e45282d..5046e2b 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/LongPressGestureDetectorDemo.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/LongPressGestureDetectorDemo.kt
@@ -20,7 +20,7 @@
 import androidx.compose.state
 import androidx.ui.core.Alignment
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.LongPressGestureDetector
+import androidx.ui.core.gesture.longPressGestureFilter
 import androidx.ui.foundation.Border
 import androidx.ui.foundation.Box
 import androidx.ui.layout.fillMaxSize
@@ -43,7 +43,7 @@
     Box(
         Modifier.fillMaxSize()
             .wrapContentSize(Alignment.Center)
-            .plus(LongPressGestureDetector(onLongPress))
+            .longPressGestureFilter(onLongPress)
             .preferredSize(192.dp),
         backgroundColor = color.value,
         border = Border(2.dp, BorderColor)
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/NestedLongPressDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/NestedLongPressDemo.kt
index bcc1342..8351972 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/NestedLongPressDemo.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/NestedLongPressDemo.kt
@@ -19,7 +19,7 @@
 import androidx.compose.Composable
 import androidx.compose.state
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.LongPressGestureDetector
+import androidx.ui.core.gesture.longPressGestureFilter
 import androidx.ui.foundation.Border
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.ContentGravity
@@ -43,7 +43,7 @@
 
 @Composable
 private fun LongPressableContainer(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() () -> Unit
 ) {
     val defaultColor = DefaultBackgroundColor
@@ -63,7 +63,7 @@
     }
 
     Box(
-        modifier + LongPressGestureDetector(onLongPress),
+        modifier.longPressGestureFilter(onLongPress),
         backgroundColor = color,
         gravity = ContentGravity.Center,
         border = Border(2.dp, BorderColor),
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/NestedPressDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/NestedPressDemo.kt
index 632dfbf..f924ebd 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/NestedPressDemo.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/NestedPressDemo.kt
@@ -20,10 +20,10 @@
 import androidx.compose.remember
 import androidx.compose.state
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.DoubleTapGestureDetector
-import androidx.ui.core.gesture.LongPressGestureDetector
-import androidx.ui.core.gesture.PressIndicatorGestureDetector
-import androidx.ui.core.gesture.TapGestureDetector
+import androidx.ui.core.gesture.doubleTapGestureFilter
+import androidx.ui.core.gesture.longPressGestureFilter
+import androidx.ui.core.gesture.pressIndicatorGestureFilter
+import androidx.ui.core.gesture.tapGestureFilter
 import androidx.ui.foundation.Border
 import androidx.ui.foundation.Box
 import androidx.ui.graphics.compositeOver
@@ -46,7 +46,7 @@
 
 @Composable
 private fun PressableContainer(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() () -> Unit = {}
 ) {
     val defaultColor = DefaultBackgroundColor
@@ -82,10 +82,12 @@
         currentColor.value
     }
 
-    val gestureDetectors = PressIndicatorGestureDetector(onStart, onStop, onStop) +
-            TapGestureDetector(onTap) +
-            DoubleTapGestureDetector(onDoubleTap) +
-            LongPressGestureDetector(onLongPress)
+    val gestureDetectors =
+        Modifier
+            .pressIndicatorGestureFilter(onStart, onStop, onStop)
+            .tapGestureFilter(onTap)
+            .doubleTapGestureFilter(onDoubleTap)
+            .longPressGestureFilter(onLongPress)
     Box(
         modifier + gestureDetectors,
         backgroundColor = color, border = Border(2.dp, BorderColor),
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/NestedScalingDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/NestedScalingDemo.kt
index f15d578..311a909 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/NestedScalingDemo.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/NestedScalingDemo.kt
@@ -21,7 +21,7 @@
 import androidx.ui.core.Alignment
 import androidx.ui.core.Layout
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.RawScaleGestureDetector
+import androidx.ui.core.gesture.rawScaleGestureFilter
 import androidx.ui.core.gesture.RawScaleObserver
 import androidx.ui.foundation.drawBackground
 import androidx.ui.graphics.Color
@@ -75,7 +75,7 @@
     Layout(
         children = children,
         modifier = Modifier.wrapContentSize(Alignment.Center)
-            .plus(RawScaleGestureDetector(outerScaleObserver))
+            .rawScaleGestureFilter(outerScaleObserver)
             .drawBackground(color = color),
         measureBlock = { measurables, constraints, _ ->
             val newConstraints =
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/NestedScrollingDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/NestedScrollingDemo.kt
index cf05fe4..243c434 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/NestedScrollingDemo.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/NestedScrollingDemo.kt
@@ -20,28 +20,27 @@
 import androidx.compose.state
 import androidx.ui.core.Direction
 import androidx.ui.core.DrawModifier
+import androidx.ui.core.ContentDrawScope
 import androidx.ui.core.Layout
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.DoubleTapGestureDetector
-import androidx.ui.core.gesture.DragGestureDetector
+import androidx.ui.core.gesture.doubleTapGestureFilter
 import androidx.ui.core.gesture.DragObserver
-import androidx.ui.core.gesture.LongPressGestureDetector
-import androidx.ui.core.gesture.PressIndicatorGestureDetector
-import androidx.ui.core.gesture.TapGestureDetector
+import androidx.ui.core.gesture.longPressGestureFilter
+import androidx.ui.core.gesture.pressIndicatorGestureFilter
+import androidx.ui.core.gesture.tapGestureFilter
+import androidx.ui.core.gesture.dragGestureFilter
 import androidx.ui.foundation.Border
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.drawBackground
 import androidx.ui.foundation.drawBorder
-import androidx.ui.graphics.Canvas
 import androidx.ui.graphics.Color
+import androidx.ui.graphics.withSave
 import androidx.ui.layout.Column
 import androidx.ui.layout.fillMaxWidth
 import androidx.ui.layout.preferredHeight
-import androidx.ui.unit.Density
 import androidx.ui.unit.Dp
 import androidx.ui.unit.IntPx
 import androidx.ui.unit.PxPosition
-import androidx.ui.unit.PxSize
 import androidx.ui.unit.dp
 import androidx.ui.unit.ipx
 import androidx.ui.unit.px
@@ -105,7 +104,7 @@
 
     Layout(
         children = children,
-        modifier = DragGestureDetector(dragObserver, canDrag) + ClipModifier,
+        modifier = Modifier.dragGestureFilter(dragObserver, canDrag) + ClipModifier,
         measureBlock = { measurables, constraints, _ ->
             val placeable =
                 measurables.first()
@@ -120,11 +119,11 @@
 }
 
 val ClipModifier = object : DrawModifier {
-    override fun draw(density: Density, drawContent: () -> Unit, canvas: Canvas, size: PxSize) {
-        canvas.save()
-        canvas.clipRect(size.toRect())
-        drawContent()
-        canvas.restore()
+    override fun ContentDrawScope.draw() {
+        withSave {
+            clipRect(size.toRect())
+            drawContent()
+        }
     }
 }
 
@@ -163,18 +162,17 @@
         showPressed.value = false
     }
 
-    val gestureDetectors = PressIndicatorGestureDetector(
-        onPress,
-        onRelease,
-        onRelease
-    ) + TapGestureDetector(onTap) +
-            DoubleTapGestureDetector(onDoubleTap) +
-            LongPressGestureDetector(onLongPress)
+    val gestureDetectors =
+        Modifier
+            .pressIndicatorGestureFilter(onPress, onRelease, onRelease)
+            .tapGestureFilter(onTap)
+            .doubleTapGestureFilter(onDoubleTap)
+            .longPressGestureFilter(onLongPress)
 
     val layout = Modifier.fillMaxWidth().preferredHeight(height)
 
     val pressOverlay =
-        if (showPressed.value) Modifier.drawBackground(pressedColor) else Modifier.None
+        if (showPressed.value) Modifier.drawBackground(pressedColor) else Modifier
     Box(gestureDetectors.plus(layout).drawBackground(color.value).plus(pressOverlay))
 }
 
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/PopupDragDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/PopupDragDemo.kt
index 6a1841a..5915eb8 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/PopupDragDemo.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/PopupDragDemo.kt
@@ -23,7 +23,7 @@
 import androidx.ui.core.Modifier
 import androidx.ui.core.Popup
 import androidx.ui.core.gesture.DragObserver
-import androidx.ui.core.gesture.RawDragGestureDetector
+import androidx.ui.core.gesture.rawDragGestureFilter
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.ContentGravity
 import androidx.ui.foundation.Text
@@ -39,6 +39,7 @@
 
 @Composable
 fun PopupDragDemo() {
+    // TODO fix this demo in RTL (check when draggable handles RTL)
     val offset = state {
         PxPosition.Origin
     }
@@ -55,7 +56,9 @@
     Popup(alignment = Alignment.TopStart, offset = offset.value.round()) {
         Stack {
             Box(
-                RawDragGestureDetector(observer) + Modifier.preferredSize(70.dp),
+                Modifier
+                    .rawDragGestureFilter(observer)
+                    .preferredSize(70.dp),
                 shape = CircleShape,
                 backgroundColor = Color.Green,
                 gravity = ContentGravity.Center
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/PressIndicatorGestureDetectorDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/PressIndicatorGestureDetectorDemo.kt
index 65d7214..d384e94 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/PressIndicatorGestureDetectorDemo.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/PressIndicatorGestureDetectorDemo.kt
@@ -20,7 +20,7 @@
 import androidx.compose.state
 import androidx.ui.core.Alignment
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.PressIndicatorGestureDetector
+import androidx.ui.core.gesture.pressIndicatorGestureFilter
 import androidx.ui.foundation.Border
 import androidx.ui.foundation.Box
 import androidx.ui.graphics.compositeOver
@@ -55,7 +55,7 @@
     Box(
         Modifier.fillMaxSize()
             .wrapContentSize(Alignment.Center)
-            .plus(PressIndicatorGestureDetector(onStart, onStop, onStop))
+            .pressIndicatorGestureFilter(onStart, onStop, onStop)
             .preferredSize(192.dp),
         backgroundColor = color,
         border = Border(2.dp, BorderColor)
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/RawDragGestureDetectorDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/RawDragGestureDetectorDemo.kt
index 4f7ae54..3b12f86 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/RawDragGestureDetectorDemo.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/RawDragGestureDetectorDemo.kt
@@ -22,7 +22,7 @@
 import androidx.ui.core.DensityAmbient
 import androidx.ui.core.Modifier
 import androidx.ui.core.gesture.DragObserver
-import androidx.ui.core.gesture.RawDragGestureDetector
+import androidx.ui.core.gesture.rawDragGestureFilter
 import androidx.ui.foundation.Box
 import androidx.ui.layout.fillMaxSize
 import androidx.ui.layout.offset
@@ -52,7 +52,7 @@
         Modifier.offset(offsetX, offsetY)
             .fillMaxSize()
             .wrapContentSize(Alignment.Center)
-            .plus(RawDragGestureDetector(dragObserver))
+            .rawDragGestureFilter(dragObserver)
             .preferredSize(96.dp),
         backgroundColor = Grey
     )
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/ScaleGestureDetectorDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/ScaleGestureDetectorDemo.kt
index d8935e0..236fdd2 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/ScaleGestureDetectorDemo.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/ScaleGestureDetectorDemo.kt
@@ -20,7 +20,7 @@
 import androidx.compose.state
 import androidx.ui.core.Alignment
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.ScaleGestureDetector
+import androidx.ui.core.gesture.scaleGestureFilter
 import androidx.ui.core.gesture.ScaleObserver
 import androidx.ui.foundation.Box
 import androidx.ui.graphics.Color
@@ -45,7 +45,7 @@
     Box(
         Modifier.fillMaxSize()
             .wrapContentSize(Alignment.Center)
-            .plus(ScaleGestureDetector(scaleObserver))
+            .scaleGestureFilter(scaleObserver)
             .preferredSize(size.value),
         backgroundColor = Color(0xFF9e9e9e.toInt())
     )
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/TapGestureDetectorDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/TapGestureDetectorDemo.kt
index 40be1ff..3798a66 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/TapGestureDetectorDemo.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/TapGestureDetectorDemo.kt
@@ -20,7 +20,7 @@
 import androidx.compose.state
 import androidx.ui.core.Alignment
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.TapGestureDetector
+import androidx.ui.core.gesture.tapGestureFilter
 import androidx.ui.foundation.Border
 import androidx.ui.foundation.Box
 import androidx.ui.layout.fillMaxSize
@@ -42,7 +42,7 @@
     Box(
         Modifier.fillMaxSize()
             .wrapContentSize(Alignment.Center)
-            .plus(TapGestureDetector(onTap))
+            .tapGestureFilter(onTap)
             .preferredSize(192.dp),
         backgroundColor = color.value,
         border = Border(2.dp, BorderColor)
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/TouchSlopDragGestureDetectorDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/TouchSlopDragGestureDetectorDemo.kt
index 5a9360b..6954a8f 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/TouchSlopDragGestureDetectorDemo.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/TouchSlopDragGestureDetectorDemo.kt
@@ -22,8 +22,8 @@
 import androidx.ui.core.DensityAmbient
 import androidx.ui.core.Direction
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.DragGestureDetector
 import androidx.ui.core.gesture.DragObserver
+import androidx.ui.core.gesture.dragGestureFilter
 import androidx.ui.foundation.Box
 import androidx.ui.graphics.Color
 import androidx.ui.layout.fillMaxSize
@@ -107,7 +107,7 @@
         Modifier.offset(offsetX, offsetY)
             .fillMaxSize()
             .wrapContentSize(Alignment.Center)
-            .plus(DragGestureDetector(dragObserver, canDrag))
+            .dragGestureFilter(dragObserver, canDrag)
             .preferredSize(96.dp),
         backgroundColor = color
     )
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/TouchSlopExceededGestureDetectorDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/TouchSlopExceededGestureDetectorDemo.kt
index e0d2775..b3e5c22 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/TouchSlopExceededGestureDetectorDemo.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/TouchSlopExceededGestureDetectorDemo.kt
@@ -21,7 +21,7 @@
 import androidx.ui.core.Alignment
 import androidx.ui.core.Direction
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.TouchSlopExceededGestureDetector
+import androidx.ui.core.gesture.touchSlopExceededGestureFilter
 import androidx.ui.foundation.Box
 import androidx.ui.graphics.Color
 import androidx.ui.layout.fillMaxSize
@@ -79,7 +79,7 @@
     Box(
         Modifier.fillMaxSize()
             .wrapContentSize(Alignment.Center)
-            .plus(TouchSlopExceededGestureDetector(onTouchSlopExceeded, canDrag))
+            .touchSlopExceededGestureFilter(onTouchSlopExceeded, canDrag)
             .preferredSize(96.dp),
         backgroundColor = color
     )
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ViewInCompose.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/viewinterop/ViewInCompose.kt
similarity index 86%
rename from ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ViewInCompose.kt
rename to ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/viewinterop/ViewInCompose.kt
index cce5f47..3c81df8 100644
--- a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ViewInCompose.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/viewinterop/ViewInCompose.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.ui.androidview.demos
+package androidx.ui.framework.demos.viewinterop
 
 import android.content.Context
 import android.graphics.Canvas
@@ -29,11 +29,11 @@
 import androidx.compose.Composable
 import androidx.compose.Providers
 import androidx.compose.state
-import androidx.ui.androidview.AndroidView
-import androidx.ui.androidview.adapters.Ref
-import androidx.ui.androidview.adapters.setRef
+import androidx.ui.viewinterop.AndroidView
 import androidx.ui.core.ContextAmbient
+import androidx.ui.core.Ref
 import androidx.ui.foundation.Text
+import androidx.ui.framework.demos.R
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.toArgb
 import androidx.ui.layout.Column
@@ -42,6 +42,10 @@
 @Composable
 fun ViewInComposeDemo() {
     Column {
+        // This is a collection of multiple ways of including Android Views in Compose
+        // UI hierarchies. Note that these APIs are subject to change. Also note that
+        // pointer input is currently not working for Views inside Compose.
+
         // Include Android View.
         TextView(text = "This is a text in a TextView")
         val ref = Ref<View>()
@@ -65,7 +69,11 @@
         // Compose custom Android View and do remeasurements and invalidates.
         val squareRef = Ref<ColoredSquareView>()
         FrameLayout {
-            ColoredSquareView(size = 200, color = Color.Cyan, ref = squareRef)
+            ColoredSquareView(
+                size = 200,
+                color = Color.Cyan,
+                ref = squareRef
+            )
         }
         Button(onClick = { squareRef.value!!.size += 50 }) {
             Text("Increase size of Android view")
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/viewinterop/ViewRef.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/viewinterop/ViewRef.kt
new file mode 100644
index 0000000..351cef0
--- /dev/null
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/viewinterop/ViewRef.kt
@@ -0,0 +1,46 @@
+/*
+ * 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.ui.framework.demos.viewinterop
+
+import android.view.View
+import androidx.ui.core.Ref
+
+// TODO(popam): this file is a subset of ViewRef.kt in ui-android-view. Deduplicate later
+
+/**
+ * A Ref is essentially a "value-holder" class that can be used with Compose to get
+ * controlled access to the underlying view instances that are constructed as a result
+ * of a compose() pass in Compose.
+ *
+ * See [ViewInComposeDemo] for an example.
+ */
+fun <T : View> T.setRef(ref: Ref<T>) {
+    storedRef?.value = null
+    storedRef = ref
+    ref.value = this
+}
+
+internal var <T : View> T.storedRef: Ref<T>?
+    get() {
+        @Suppress("UNCHECKED_CAST")
+        return getTag(refKey) as? Ref<T>
+    }
+    set(value) {
+        setTag(refKey, value)
+    }
+
+private val refKey = (3 shl 24) or "Ref".hashCode()
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/test_layout.xml b/ui/ui-framework/integration-tests/framework-demos/src/main/res/layout/test_layout.xml
similarity index 100%
rename from ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/test_layout.xml
rename to ui/ui-framework/integration-tests/framework-demos/src/main/res/layout/test_layout.xml
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/res/values/styles.xml b/ui/ui-framework/integration-tests/framework-demos/src/main/res/values/styles.xml
similarity index 100%
rename from ui/ui-android-view/integration-tests/android-view-demos/src/main/res/values/styles.xml
rename to ui/ui-framework/integration-tests/framework-demos/src/main/res/values/styles.xml
diff --git a/ui/ui-framework/samples/src/main/java/androidx/ui/framework/samples/PopupSample.kt b/ui/ui-framework/samples/src/main/java/androidx/ui/framework/samples/PopupSample.kt
index 499fec0..7bf3014 100644
--- a/ui/ui-framework/samples/src/main/java/androidx/ui/framework/samples/PopupSample.kt
+++ b/ui/ui-framework/samples/src/main/java/androidx/ui/framework/samples/PopupSample.kt
@@ -57,7 +57,7 @@
         val cornerSize = 16.dp
 
         // The popup will appear below the parent
-        DropdownPopup(dropDownAlignment = DropDownAlignment.Left) {
+        DropdownPopup(dropDownAlignment = DropDownAlignment.Start) {
             // Draw a rectangle shape with rounded corners inside the popup
             Box(
                 Modifier.preferredSize(popupWidth, popupHeight),
diff --git a/ui/ui-framework/src/androidTest/assets/sample_font.ttx b/ui/ui-framework/src/androidTest/assets/sample_font.ttx
deleted file mode 100644
index f97a6af0..0000000
--- a/ui/ui-framework/src/androidTest/assets/sample_font.ttx
+++ /dev/null
@@ -1,314 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0">
-
-  <GlyphOrder>
-    <GlyphID id="0" name=".notdef"/>
-    <GlyphID id="1" name="1em"/>
-    <GlyphID id="2" name="1em_rtl"/>
-    <GlyphID id="3" name="space"/>
-    <GlyphID id="4" name="hyphen"/>
-  </GlyphOrder>
-
-  <head>
-    <tableVersion value="1.0"/>
-    <fontRevision value="1.0"/>
-    <checkSumAdjustment value="0x640cdb2f"/>
-    <magicNumber value="0x5f0f3cf5"/>
-    <flags value="00000000 00000011"/>
-    <unitsPerEm value="1000"/>
-    <created value="Thu Feb 15 18:29:10 2018"/>
-    <modified value="Sun Oct 14 06:29:17 2018"/>
-    <xMin value="0"/>
-    <yMin value="-200"/>
-    <xMax value="1000"/>
-    <yMax value="800"/>
-    <macStyle value="00000000 00000000"/>
-    <lowestRecPPEM value="7"/>
-    <fontDirectionHint value="2"/>
-    <glyphDataFormat value="0"/>
-  </head>
-
-  <hhea>
-    <tableVersion value="0x00010000"/>
-    <ascent value="1000"/>
-    <descent value="-200"/>
-    <lineGap value="0"/>
-    <advanceWidthMax value="1000"/>
-    <minLeftSideBearing value="0"/>
-    <minRightSideBearing value="0"/>
-    <xMaxExtent value="1000"/>
-    <caretSlopeRise value="1"/>
-    <caretSlopeRun value="0"/>
-    <caretOffset value="0"/>
-    <reserved0 value="0"/>
-    <reserved1 value="0"/>
-    <reserved2 value="0"/>
-    <reserved3 value="0"/>
-    <metricDataFormat value="0"/>
-  </hhea>
-
-  <maxp>
-    <tableVersion value="0x10000"/>
-    <maxZones value="0"/>
-    <maxTwilightPoints value="0"/>
-    <maxStorage value="0"/>
-    <maxFunctionDefs value="0"/>
-    <maxInstructionDefs value="0"/>
-    <maxStackElements value="0"/>
-    <maxSizeOfInstructions value="0"/>
-    <maxComponentElements value="0"/>
-  </maxp>
-
-  <OS_2>
-    <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
-         will be recalculated by the compiler -->
-    <version value="3"/>
-    <xAvgCharWidth value="594"/>
-    <usWeightClass value="100"/>
-    <usWidthClass value="5"/>
-    <fsType value="00000000 00001000"/>
-    <ySubscriptXSize value="650"/>
-    <ySubscriptYSize value="600"/>
-    <ySubscriptXOffset value="0"/>
-    <ySubscriptYOffset value="75"/>
-    <ySuperscriptXSize value="650"/>
-    <ySuperscriptYSize value="600"/>
-    <ySuperscriptXOffset value="0"/>
-    <ySuperscriptYOffset value="350"/>
-    <yStrikeoutSize value="50"/>
-    <yStrikeoutPosition value="300"/>
-    <sFamilyClass value="0"/>
-    <panose>
-      <bFamilyType value="0"/>
-      <bSerifStyle value="0"/>
-      <bWeight value="5"/>
-      <bProportion value="0"/>
-      <bContrast value="0"/>
-      <bStrokeVariation value="0"/>
-      <bArmStyle value="0"/>
-      <bLetterForm value="0"/>
-      <bMidline value="0"/>
-      <bXHeight value="0"/>
-    </panose>
-    <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
-    <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
-    <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
-    <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
-    <achVendID value="UKWN"/>
-    <fsSelection value="00000000 01000000"/>
-    <usFirstCharIndex value="9"/>
-    <usLastCharIndex value="122"/>
-    <sTypoAscender value="800"/>
-    <sTypoDescender value="-200"/>
-    <sTypoLineGap value="200"/>
-    <usWinAscent value="1000"/>
-    <usWinDescent value="200"/>
-    <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
-    <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
-    <sxHeight value="500"/>
-    <sCapHeight value="700"/>
-    <usDefaultChar value="0"/>
-    <usBreakChar value="32"/>
-    <usMaxContext value="0"/>
-  </OS_2>
-
-  <hmtx>
-    <mtx name=".notdef" width="500" lsb="93"/>
-    <mtx name="1em" width="1000" lsb="0"/>
-    <mtx name="1em_rtl" width="1000" lsb="0"/>
-    <mtx name="space" width="1000" lsb="0"/>
-    <mtx name="hyphen" width="1000" lsb="0"/>
-  </hmtx>
-
-  <cmap>
-    <tableVersion version="0"/>
-    <cmap_format_4 platformID="3" platEncID="10" language="0">
-        <map code="0x0009" name="1em" /> <!-- TAB -->
-        <map code="0x0020" name="space" /> <!-- SPACE -->
-        <map code="0x002C" name="1em" /> <!-- , -->
-        <map code="0x002D" name="hyphen" /> <!-- - -->
-        <map code="0x002E" name="1em" /> <!-- . -->
-        <map code="0x0041" name="1em" /> <!-- A -->
-        <map code="0x0042" name="1em" /> <!-- B -->
-        <map code="0x0043" name="1em" /> <!-- C -->
-        <map code="0x0044" name="1em" /> <!-- D -->
-        <map code="0x0045" name="1em" /> <!-- E -->
-        <map code="0x0046" name="1em" /> <!-- F -->
-        <map code="0x0047" name="1em" /> <!-- G -->
-        <map code="0x0048" name="1em" /> <!-- H -->
-        <map code="0x0049" name="1em" /> <!-- I -->
-        <map code="0x004A" name="1em" /> <!-- J -->
-        <map code="0x004B" name="1em" /> <!-- K -->
-        <map code="0x004C" name="1em" /> <!-- L -->
-        <map code="0x004D" name="1em" /> <!-- M -->
-        <map code="0x004E" name="1em" /> <!-- N -->
-        <map code="0x004F" name="1em" /> <!-- O -->
-        <map code="0x0050" name="1em" /> <!-- P -->
-        <map code="0x0051" name="1em" /> <!-- Q -->
-        <map code="0x0052" name="1em" /> <!-- R -->
-        <map code="0x0053" name="1em" /> <!-- S -->
-        <map code="0x0054" name="1em" /> <!-- T -->
-        <map code="0x0055" name="1em" /> <!-- U -->
-        <map code="0x0056" name="1em" /> <!-- V -->
-        <map code="0x0057" name="1em" /> <!-- W -->
-        <map code="0x0058" name="1em" /> <!-- X -->
-        <map code="0x0059" name="1em" /> <!-- Y -->
-        <map code="0x005A" name="1em" /> <!-- Z -->
-        <map code="0x0061" name="1em" /> <!-- a -->
-        <map code="0x0062" name="1em" /> <!-- b -->
-        <map code="0x0063" name="1em" /> <!-- c -->
-        <map code="0x0064" name="1em" /> <!-- d -->
-        <map code="0x0065" name="1em" /> <!-- e -->
-        <map code="0x0066" name="1em" /> <!-- f -->
-        <map code="0x0067" name="1em" /> <!-- g -->
-        <map code="0x0068" name="1em" /> <!-- h -->
-        <map code="0x0069" name="1em" /> <!-- i -->
-        <map code="0x006A" name="1em" /> <!-- j -->
-        <map code="0x006B" name="1em" /> <!-- k -->
-        <map code="0x006C" name="1em" /> <!-- l -->
-        <map code="0x006D" name="1em" /> <!-- m -->
-        <map code="0x006E" name="1em" /> <!-- n -->
-        <map code="0x006F" name="1em" /> <!-- o -->
-        <map code="0x0070" name="1em" /> <!-- p -->
-        <map code="0x0071" name="1em" /> <!-- q -->
-        <map code="0x0072" name="1em" /> <!-- r -->
-        <map code="0x0073" name="1em" /> <!-- s -->
-        <map code="0x0074" name="1em" /> <!-- t -->
-        <map code="0x0075" name="1em" /> <!-- u -->
-        <map code="0x0076" name="1em" /> <!-- v -->
-        <map code="0x0077" name="1em" /> <!-- w -->
-        <map code="0x0078" name="1em" /> <!-- x -->
-        <map code="0x0079" name="1em" /> <!-- y -->
-        <map code="0x007A" name="1em" /> <!-- z -->
-
-        <map code="0x05D0" name="1em_rtl"/>	<!-- א Alef -->
-        <map code="0x05D1" name="1em_rtl"/>	<!-- ב Bet -->
-        <map code="0x05D2" name="1em_rtl"/>	<!-- ג Gimel -->
-        <map code="0x05D3" name="1em_rtl"/>	<!-- ד Dalet -->
-        <map code="0x05D4" name="1em_rtl"/>	<!-- ה He -->
-        <map code="0x05D5" name="1em_rtl"/>	<!-- ו Vav -->
-        <map code="0x05D6" name="1em_rtl"/>	<!-- ז Zayin -->
-        <map code="0x05D7" name="1em_rtl"/>	<!-- ח Het -->
-        <map code="0x05D8" name="1em_rtl"/>	<!-- ט Tet -->
-        <map code="0x05D9" name="1em_rtl"/>	<!-- י Yod -->
-        <map code="0x05DA" name="1em_rtl"/>	<!-- ך Final Kaf -->
-        <map code="0x05DB" name="1em_rtl"/>	<!-- כ Kaf -->
-        <map code="0x05DC" name="1em_rtl"/>	<!-- ל Lamed -->
-        <map code="0x05DD" name="1em_rtl"/>	<!-- ם Final Mem -->
-        <map code="0x05DE" name="1em_rtl"/>	<!-- מ Mem -->
-        <map code="0x05DF" name="1em_rtl"/>	<!-- ן Final Nun -->
-        <map code="0x05E0" name="1em_rtl"/>	<!-- נ Nun -->
-        <map code="0x05E1" name="1em_rtl"/>	<!-- ס Samekh -->
-        <map code="0x05E2" name="1em_rtl"/>	<!-- ע Ayin -->
-        <map code="0x05E3" name="1em_rtl"/>	<!-- ף Final Pe -->
-        <map code="0x05E4" name="1em_rtl"/>	<!-- פ Pe -->
-        <map code="0x05E5" name="1em_rtl"/>	<!-- ץ Final Tsadi -->
-        <map code="0x05E6" name="1em_rtl"/>	<!-- צ Tsadi -->
-        <map code="0x05E7" name="1em_rtl"/>	<!-- ק Qof -->
-        <map code="0x05E8" name="1em_rtl"/>	<!-- ר Resh -->
-        <map code="0x05E9" name="1em_rtl"/>	<!-- ש Shin -->
-        <map code="0x05EA" name="1em_rtl"/>	<!-- ת Tav -->
-
-    </cmap_format_4>
-  </cmap>
-
-  <loca>
-    <!-- The 'loca' table will be calculated by the compiler -->
-  </loca>
-
-  <glyf>
-    <TTGlyph name=".notdef" xMin="0" yMin="0" xMax="0" yMax="0" />
-    <TTGlyph name="1em" xMin="0" yMin="-200" xMax="1000" yMax="800">
-        <contour>
-            <pt x="0" y="-200" on="1"/>
-            <pt x="1000" y="300" on="1"/>
-            <pt x="0" y="800" on="1"/>
-        </contour>
-        <instructions />
-    </TTGlyph>
-    <TTGlyph name="1em_rtl" xMin="0" yMin="-200" xMax="1000" yMax="800">
-        <contour>
-            <pt x="1000" y="-200" on="1"/>
-            <pt x="0" y="300" on="1"/>
-            <pt x="1000" y="800" on="1"/>
-        </contour>
-        <instructions />
-    </TTGlyph>
-    <TTGlyph name="space" xMin="0" yMin="-200" xMax="1000" yMax="800">
-        <contour>
-            <pt x="0" y="0" on="1"/>
-            <pt x="1000" y="0" on="1"/>
-            <pt x="1000" y="10" on="1"/>
-            <pt x="0" y="10" on="1"/>
-        </contour>
-        <instructions />
-    </TTGlyph>
-    <TTGlyph name="hyphen" xMin="0" yMin="-200" xMax="1000" yMax="800">
-        <contour>
-            <pt x="0" y="0" on="1"/>
-            <pt x="1000" y="0" on="1"/>
-            <pt x="1000" y="500" on="1"/>
-            <pt x="0" y="500" on="1"/>
-            <pt x="0" y="0" on="1"/>
-        </contour>
-        <instructions />
-    </TTGlyph>
-  </glyf>
-
-  <name>
-    <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
-      Copyright (C) 2018 The Android Open Source Project
-    </namerecord>
-    <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
-      Sample Font
-    </namerecord>
-    <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
-      Regular
-    </namerecord>
-    <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
-      Sample Font
-    </namerecord>
-    <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
-      SampleFont-Regular
-    </namerecord>
-    <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
-      Licensed under the Apache License, Version 2.0 (the "License");
-      you may not use this file except in compliance with the License.
-      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.
-    </namerecord>
-    <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
-      http://www.apache.org/licenses/LICENSE-2.0
-    </namerecord>
-  </name>
-
-  <post>
-    <formatType value="3.0"/>
-    <italicAngle value="0.0"/>
-    <underlinePosition value="-75"/>
-    <underlineThickness value="50"/>
-    <isFixedPitch value="0"/>
-    <minMemType42 value="0"/>
-    <maxMemType42 value="0"/>
-    <minMemType1 value="0"/>
-    <maxMemType1 value="0"/>
-  </post>
-
-</ttFont>
\ No newline at end of file
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/CoreTextFieldTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/CoreTextFieldTest.kt
deleted file mode 100644
index dd4799c..0000000
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/CoreTextFieldTest.kt
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.ui.core
-
-import androidx.test.filters.SmallTest
-import androidx.test.rule.ActivityTestRule
-import androidx.ui.core.test.runOnUiThreadIR
-import androidx.ui.framework.test.TestActivity
-import androidx.ui.input.EditorValue
-import androidx.ui.layout.rtl
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
-
-@RunWith(JUnit4::class)
-@SmallTest
-class CoreTextFieldTest {
-    @get:Rule
-    val rule = ActivityTestRule<TestActivity>(TestActivity::class.java)
-    private lateinit var activity: TestActivity
-
-    @Before
-    fun setup() {
-        activity = rule.activity
-    }
-
-    @Test
-    fun testCorrectLayoutDirection() {
-        val latch = CountDownLatch(1)
-        var layoutDirection: LayoutDirection? = null
-        rule.runOnUiThreadIR {
-            activity.setContent {
-                CoreTextField(
-                    value = EditorValue("..."),
-                    modifier = Modifier.rtl,
-                    onValueChange = {}
-                ) { result ->
-                    layoutDirection = result.layoutInput.layoutDirection
-                    latch.countDown()
-                }
-            }
-        }
-
-        assertThat(latch.await(1, TimeUnit.SECONDS)).isTrue()
-        assertThat(layoutDirection).isNotNull()
-        assertThat(layoutDirection!!).isEqualTo(LayoutDirection.Rtl)
-    }
-}
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/PainterModifierTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/PainterModifierTest.kt
index 4a5eade..ff4d7aa 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/PainterModifierTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/PainterModifierTest.kt
@@ -22,10 +22,12 @@
 import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import androidx.test.rule.ActivityTestRule
+import androidx.ui.core.test.AlignTopLeft
 import androidx.ui.core.test.AtLeastSize
+import androidx.ui.core.test.FixedSize
 import androidx.ui.core.test.Padding
 import androidx.ui.core.test.background
-import androidx.ui.core.test.runOnUiThreadIR
+import androidx.ui.core.test.setContentInFrameLayout
 import androidx.ui.core.test.waitAndScreenShot
 import androidx.ui.framework.test.TestActivity
 import androidx.ui.geometry.Rect
@@ -80,8 +82,8 @@
     @Test
     fun testPainterModifierColorFilter() {
         val paintLatch = CountDownLatch(1)
-        rule.runOnUiThreadIR {
-            activity.setContent {
+        rule.runOnUiThread {
+            activity.setContentInFrameLayout {
                 testPainter(
                     colorFilter = ColorFilter(Color.Cyan, BlendMode.srcIn),
                     latch = paintLatch
@@ -103,8 +105,8 @@
     @Test
     fun testPainterModifierAlpha() {
         val paintLatch = CountDownLatch(1)
-        rule.runOnUiThreadIR {
-            activity.setContent {
+        rule.runOnUiThread {
+            activity.setContentInFrameLayout {
                 testPainter(
                     alpha = 0.5f,
                     latch = paintLatch
@@ -137,8 +139,8 @@
     @Test
     fun testPainterModifierRtl() {
         val paintLatch = CountDownLatch(1)
-        rule.runOnUiThreadIR {
-            activity.setContent {
+        rule.runOnUiThread {
+            activity.setContentInFrameLayout {
                 testPainter(
                     rtl = true,
                     latch = paintLatch
@@ -161,9 +163,9 @@
     fun testPainterAspectRatioMaintainedInSmallerParent() {
         val paintLatch = CountDownLatch(1)
         val containerSizePx = containerWidth.roundToInt().ipx * 3
-        rule.runOnUiThreadIR {
-            activity.setContent {
-                AtLeastSize(size = containerSizePx, modifier = background(Color.White)) {
+        rule.runOnUiThread {
+            activity.setContentInFrameLayout {
+                FixedSize(size = containerSizePx, modifier = background(Color.White)) {
                     // Verify that the contents are scaled down appropriately even though
                     // the Painter's intrinsic width and height is twice that of the component
                     // it is to be drawn into
@@ -207,8 +209,8 @@
     fun testPainterAlignedBottomRightIfSmallerThanParent() {
         val paintLatch = CountDownLatch(1)
         val containerSizePx = containerWidth.roundToInt().ipx * 2
-        rule.runOnUiThreadIR {
-            activity.setContent {
+        rule.runOnUiThread {
+            activity.setContentInFrameLayout {
                 AtLeastSize(size = containerWidth.roundToInt().ipx * 2,
                     modifier = background(Color.White).paint(
                         LatchPainter(
@@ -250,8 +252,8 @@
     @Test
     fun testPainterModifierIntrinsicSize() {
         val paintLatch = CountDownLatch(1)
-        rule.runOnUiThreadIR {
-            activity.setContent {
+        rule.runOnUiThread {
+            activity.setContentInFrameLayout {
                 NoMinSizeContainer {
                     NoIntrinsicSizeContainer(
                         Modifier.paint(LatchPainter(containerWidth, containerHeight, paintLatch))
@@ -284,14 +286,14 @@
     fun testPainterIntrinsicSizeDoesNotExceedMax() {
         val paintLatch = CountDownLatch(1)
         val containerSize = containerWidth.roundToInt() / 2
-        rule.runOnUiThreadIR {
-            activity.setContent {
+        rule.runOnUiThread {
+            activity.setContentInFrameLayout {
                 NoIntrinsicSizeContainer(
                     background(Color.White) +
                             FixedSizeModifier(containerWidth.roundToInt().ipx)
                 ) {
                     NoIntrinsicSizeContainer(
-                        FixedSizeModifier(containerSize.ipx).paint(
+                        AlignTopLeft + FixedSizeModifier(containerSize.ipx).paint(
                             LatchPainter(
                                 containerWidth,
                                 containerHeight,
@@ -332,8 +334,8 @@
     fun testPainterNotSizedToIntrinsics() {
         val paintLatch = CountDownLatch(1)
         val containerSize = containerWidth.roundToInt() / 2
-        rule.runOnUiThreadIR {
-            activity.setContent {
+        rule.runOnUiThread {
+            activity.setContentInFrameLayout {
                 NoIntrinsicSizeContainer(
                     background(Color.White) +
                             FixedSizeModifier(containerSize.ipx)
@@ -444,7 +446,7 @@
      */
     @Composable
     fun NoIntrinsicSizeContainer(
-        modifier: Modifier = Modifier.None,
+        modifier: Modifier = Modifier,
         children: @Composable() () -> Unit
     ) {
         Layout(children, modifier) { measurables, constraints, _ ->
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/PopupTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/PopupTest.kt
index e099314..31a2c06 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/PopupTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/PopupTest.kt
@@ -28,7 +28,9 @@
 import androidx.test.filters.MediumTest
 import androidx.ui.core.selection.SimpleContainer
 import androidx.ui.layout.preferredSize
+import androidx.ui.layout.rtl
 import androidx.ui.test.createComposeRule
+import androidx.ui.test.runOnIdleCompose
 import androidx.ui.unit.IntPx
 import androidx.ui.unit.IntPxPosition
 import androidx.ui.unit.IntPxSize
@@ -66,7 +68,11 @@
 
     // TODO(b/140215440): Some tests are calling the OnChildPosition method inside the Popup too
     //  many times
-    private fun createPopupWithAlignmentRule(alignment: Alignment, measureLatch: CountDownLatch) {
+    private fun createPopupWithAlignmentRule(
+        alignment: Alignment,
+        measureLatch: CountDownLatch,
+        modifier: Modifier = Modifier
+    ) {
         with(composeTestRule.density) {
             val popupWidthDp = popupSize.width.toDp()
             val popupHeightDp = popupSize.height.toDp()
@@ -75,6 +81,7 @@
 
             composeTestRule.setContent {
                 // Get the compose view position on screen
+                @Suppress("DEPRECATION")
                 val composeView = OwnerAmbient.current as View
                 val positionArray = IntArray(2)
                 composeView.getLocationOnScreen(positionArray)
@@ -83,10 +90,14 @@
                     IntPx(positionArray[1])
                 )
 
-                // Align the parent of the popup on the TopLeft corner, this results in the global
+                // Align the parent of the popup on the top left corner, this results in the global
                 // position of the parent to be (0, 0)
                 TestAlign {
-                    SimpleContainer(width = parentWidthDp, height = parentHeightDp) {
+                    SimpleContainer(
+                        width = parentWidthDp,
+                        height = parentHeightDp,
+                        modifier = modifier
+                    ) {
                         PopupTestTag(testTag) {
                             Popup(alignment = alignment, offset = offset) {
                                 // This is called after the OnChildPosition method in Popup() which
@@ -108,7 +119,7 @@
     // TODO(b/139861182): Remove all of this and provide helpers on ComposeTestRule
     private fun popupMatches(viewMatcher: Matcher<in View>) {
         // Make sure that current measurement/drawing is finished
-        composeTestRule.runOnIdleCompose { }
+        runOnIdleCompose { }
         Espresso.onView(instanceOf(Owner::class.java))
             .inRoot(PopupLayoutMatcher())
             .check(matches(viewMatcher))
@@ -167,18 +178,37 @@
     }
 
     @Test
-    fun popup_correctPosition_alignmentTopLeft() {
-        /* Expected TopLeft Position
+    fun popup_correctPosition_alignmentTopStart() {
+        /* Expected TopStart Position
            x = offset.x
            y = offset.y
         */
-        val expectedPositionTopLeft = IntPxPosition(IntPx(10), IntPx(10))
+        val expectedPositionTopStart = IntPxPosition(IntPx(10), IntPx(10))
         val measureLatch = CountDownLatch(1)
 
         createPopupWithAlignmentRule(alignment = Alignment.TopStart, measureLatch = measureLatch)
 
         measureLatch.await(1, TimeUnit.SECONDS)
-        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionTopLeft))
+        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionTopStart))
+    }
+
+    @Test
+    fun popup_correctPosition_alignmentTopStart_rtl() {
+        /* Expected TopStart Position
+           x = -offset.x + parentSize.x - popupSize.x
+           y = offset.y
+        */
+        val expectedPositionTopStart = IntPxPosition(IntPx(50), IntPx(10))
+        val measureLatch = CountDownLatch(1)
+
+        createPopupWithAlignmentRule(
+            modifier = Modifier.rtl,
+            alignment = Alignment.TopStart,
+            measureLatch = measureLatch
+        )
+
+        measureLatch.await(1, TimeUnit.SECONDS)
+        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionTopStart))
     }
 
     @Test
@@ -197,48 +227,124 @@
     }
 
     @Test
-    fun popup_correctPosition_alignmentTopRight() {
-        /* Expected TopRight Position
+    fun popup_correctPosition_alignmentTopCenter_rtl() {
+        /* Expected TopCenter Position
+           x = -offset.x + parentSize.x / 2 - popupSize.x / 2
+           y = offset.y
+        */
+        val expectedPositionTopCenter = IntPxPosition(IntPx(20), IntPx(10))
+        val measureLatch = CountDownLatch(1)
+
+        createPopupWithAlignmentRule(
+            modifier = Modifier.rtl,
+            alignment = Alignment.TopCenter,
+            measureLatch = measureLatch
+        )
+
+        measureLatch.await(1, TimeUnit.SECONDS)
+        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionTopCenter))
+    }
+
+    @Test
+    fun popup_correctPosition_alignmentTopEnd() {
+        /* Expected TopEnd Position
            x = offset.x + parentSize.x - popupSize.x
            y = offset.y
         */
-        val expectedPositionTopRight = IntPxPosition(IntPx(70), IntPx(10))
+        val expectedPositionTopEnd = IntPxPosition(IntPx(70), IntPx(10))
         val measureLatch = CountDownLatch(1)
 
         createPopupWithAlignmentRule(alignment = Alignment.TopEnd, measureLatch = measureLatch)
 
         measureLatch.await(1, TimeUnit.SECONDS)
-        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionTopRight))
+        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionTopEnd))
     }
 
     @Test
-    fun popup_correctPosition_alignmentCenterRight() {
-        /* Expected CenterRight Position
+    fun popup_correctPosition_alignmentTopEnd_rtl() {
+        /* Expected TopEnd Position
+           x = -offset.x falls back to zero if outside the screen
+           y = offset.y
+        */
+        val expectedPositionTopEnd = IntPxPosition(IntPx(0), IntPx(10))
+        val measureLatch = CountDownLatch(1)
+
+        createPopupWithAlignmentRule(
+            modifier = Modifier.rtl,
+            alignment = Alignment.TopEnd,
+            measureLatch = measureLatch
+        )
+
+        measureLatch.await(1, TimeUnit.SECONDS)
+        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionTopEnd))
+    }
+
+    @Test
+    fun popup_correctPosition_alignmentCenterEnd() {
+        /* Expected CenterEnd Position
            x = offset.x + parentSize.x - popupSize.x
            y = offset.y + parentSize.y / 2 - popupSize.y / 2
         */
-        val expectedPositionCenterRight = IntPxPosition(IntPx(70), IntPx(50))
+        val expectedPositionCenterEnd = IntPxPosition(IntPx(70), IntPx(50))
         val measureLatch = CountDownLatch(1)
 
         createPopupWithAlignmentRule(alignment = Alignment.CenterEnd, measureLatch = measureLatch)
 
         measureLatch.await(1, TimeUnit.SECONDS)
-        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionCenterRight))
+        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionCenterEnd))
     }
 
     @Test
-    fun popup_correctPosition_alignmentBottomRight() {
-        /* Expected BottomRight Position
+    fun popup_correctPosition_alignmentCenterEnd_rtl() {
+        /* Expected CenterEnd Position
+           x = -offset.x falls back to zero if outside the screen
+           y = offset.y + parentSize.y / 2 - popupSize.y / 2
+        */
+        val expectedPositionCenterEnd = IntPxPosition(IntPx(0), IntPx(50))
+        val measureLatch = CountDownLatch(1)
+
+        createPopupWithAlignmentRule(
+            modifier = Modifier.rtl,
+            alignment = Alignment.CenterEnd,
+            measureLatch = measureLatch
+        )
+
+        measureLatch.await(1, TimeUnit.SECONDS)
+        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionCenterEnd))
+    }
+
+    @Test
+    fun popup_correctPosition_alignmentBottomEnd() {
+        /* Expected BottomEnd Position
            x = offset.x + parentSize.x - popupSize.x
            y = offset.y + parentSize.y - popupSize.y
         */
-        val expectedPositionBottomRight = IntPxPosition(IntPx(70), IntPx(90))
+        val expectedPositionBottomEnd = IntPxPosition(IntPx(70), IntPx(90))
         val measureLatch = CountDownLatch(1)
 
         createPopupWithAlignmentRule(alignment = Alignment.BottomEnd, measureLatch = measureLatch)
 
         measureLatch.await(1, TimeUnit.SECONDS)
-        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionBottomRight))
+        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionBottomEnd))
+    }
+
+    @Test
+    fun popup_correctPosition_alignmentBottomEnd_rtl() {
+        /* Expected BottomEnd Position
+           x = -offset.x falls back to zero if outside the screen
+           y = offset.y + parentSize.y - popupSize.y
+        */
+        val expectedPositionBottomEnd = IntPxPosition(IntPx(0), IntPx(90))
+        val measureLatch = CountDownLatch(1)
+
+        createPopupWithAlignmentRule(
+            modifier = Modifier.rtl,
+            alignment = Alignment.BottomEnd,
+            measureLatch = measureLatch
+        )
+
+        measureLatch.await(1, TimeUnit.SECONDS)
+        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionBottomEnd))
     }
 
     @Test
@@ -260,33 +366,90 @@
     }
 
     @Test
-    fun popup_correctPosition_alignmentBottomLeft() {
-        /* Expected BottomLeft Position
+    fun popup_correctPosition_alignmentBottomCenter_rtl() {
+        /* Expected BottomCenter Position
+           x = -offset.x + parentSize.x / 2 - popupSize.x / 2
+           y = offset.y + parentSize.y - popupSize.y
+        */
+        val expectedPositionBottomCenter = IntPxPosition(IntPx(20), IntPx(90))
+        val measureLatch = CountDownLatch(1)
+
+        createPopupWithAlignmentRule(
+            modifier = Modifier.rtl,
+            alignment = Alignment.BottomCenter,
+            measureLatch = measureLatch
+        )
+
+        measureLatch.await(1, TimeUnit.SECONDS)
+        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionBottomCenter))
+    }
+
+    @Test
+    fun popup_correctPosition_alignmentBottomStart() {
+        /* Expected BottomStart Position
            x = offset.x
            y = offset.y + parentSize.y - popupSize.y
         */
-        val expectedPositionBottomLeft = IntPxPosition(IntPx(10), IntPx(90))
+        val expectedPositionBottomStart = IntPxPosition(IntPx(10), IntPx(90))
         val measureLatch = CountDownLatch(1)
 
         createPopupWithAlignmentRule(alignment = Alignment.BottomStart, measureLatch = measureLatch)
 
         measureLatch.await(1, TimeUnit.SECONDS)
-        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionBottomLeft))
+        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionBottomStart))
     }
 
     @Test
-    fun popup_correctPosition_alignmentCenterLeft() {
-        /* Expected CenterLeft Position
+    fun popup_correctPosition_alignmentBottomStart_rtl() {
+        /* Expected BottomStart Position
+           x = -offset.x + parentSize.x - popupSize.x
+           y = offset.y + parentSize.y - popupSize.y
+        */
+        val expectedPositionBottomStart = IntPxPosition(IntPx(50), IntPx(90))
+        val measureLatch = CountDownLatch(1)
+
+        createPopupWithAlignmentRule(
+            modifier = Modifier.rtl,
+            alignment = Alignment.BottomStart,
+            measureLatch = measureLatch
+        )
+
+        measureLatch.await(1, TimeUnit.SECONDS)
+        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionBottomStart))
+    }
+
+    @Test
+    fun popup_correctPosition_alignmentCenterStart() {
+        /* Expected CenterStart Position
            x = offset.x
            y = offset.y + parentSize.y / 2 - popupSize.y / 2
         */
-        val expectedPositionCenterLeft = IntPxPosition(IntPx(10), IntPx(50))
+        val expectedPositionCenterStart = IntPxPosition(IntPx(10), IntPx(50))
         val measureLatch = CountDownLatch(1)
 
         createPopupWithAlignmentRule(alignment = Alignment.CenterStart, measureLatch = measureLatch)
 
         measureLatch.await(1, TimeUnit.SECONDS)
-        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionCenterLeft))
+        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionCenterStart))
+    }
+
+    @Test
+    fun popup_correctPosition_alignmentCenterStart_rtl() {
+        /* Expected CenterStart Position
+           x = -offset.x + parentSize.x - popupSize.x
+           y = offset.y + parentSize.y / 2 - popupSize.y / 2
+        */
+        val expectedPositionCenterStart = IntPxPosition(IntPx(50), IntPx(50))
+        val measureLatch = CountDownLatch(1)
+
+        createPopupWithAlignmentRule(
+            modifier = Modifier.rtl,
+            alignment = Alignment.CenterStart,
+            measureLatch = measureLatch
+        )
+
+        measureLatch.await(1, TimeUnit.SECONDS)
+        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionCenterStart))
     }
 
     @Test
@@ -305,12 +468,31 @@
     }
 
     @Test
-    fun popup_calculateGlobalPositionTopLeft() {
-        /* Expected TopLeft Position
+    fun popup_correctPosition_alignmentCenter_rtl() {
+        /* Expected Center Position
+           x = -offset.x + parentSize.x / 2 - popupSize.x / 2
+           y = offset.y + parentSize.y / 2 - popupSize.y / 2
+        */
+        val expectedPositionCenter = IntPxPosition(IntPx(20), IntPx(50))
+        val measureLatch = CountDownLatch(1)
+
+        createPopupWithAlignmentRule(
+            modifier = Modifier.rtl,
+            alignment = Alignment.Center,
+            measureLatch = measureLatch
+        )
+
+        measureLatch.await(1, TimeUnit.SECONDS)
+        popupMatches(matchesPosition(composeViewAbsolutePosition + expectedPositionCenter))
+    }
+
+    @Test
+    fun popup_calculateGlobalPositionTopStart() {
+        /* Expected TopStart Position
            x = parentGlobalPosition.x + offset.x
            y = parentGlobalPosition.y + offset.y
         */
-        val expectedPositionTopLeft = IntPxPosition(IntPx(60), IntPx(60))
+        val expectedPositionTopStart = IntPxPosition(IntPx(60), IntPx(60))
         val popupPositionProperties = PopupPositionProperties(
             offset = offset
         )
@@ -318,12 +500,35 @@
         popupPositionProperties.parentSize = parentSize.toPxSize()
         popupPositionProperties.childrenSize = popupSize.toPxSize()
 
-        val positionTopLeft = calculatePopupGlobalPosition(
+        val positionTopStart = calculatePopupGlobalPosition(
             popupPositionProperties,
             Alignment.TopStart
         )
 
-        Truth.assertThat(positionTopLeft).isEqualTo(expectedPositionTopLeft)
+        Truth.assertThat(positionTopStart).isEqualTo(expectedPositionTopStart)
+    }
+
+    @Test
+    fun popup_calculateGlobalPositionTopStart_rtl() {
+        /* Expected TopStart Position
+           x = parentGlobalPosition.x + parentSize.x - popupSize.x + (-offset.x)
+           y = parentGlobalPosition.y + offset.y
+        */
+        val expectedPositionTopStart = IntPxPosition(IntPx(100), IntPx(60))
+        val popupPositionProperties = PopupPositionProperties(
+            offset = offset
+        )
+        popupPositionProperties.parentPosition = parentGlobalPosition.toPxPosition()
+        popupPositionProperties.parentSize = parentSize.toPxSize()
+        popupPositionProperties.childrenSize = popupSize.toPxSize()
+        popupPositionProperties.parentLayoutDirection = LayoutDirection.Rtl
+
+        val positionTopStart = calculatePopupGlobalPosition(
+            popupPositionProperties,
+            Alignment.TopStart
+        )
+
+        Truth.assertThat(positionTopStart).isEqualTo(expectedPositionTopStart)
     }
 
     @Test
@@ -349,12 +554,35 @@
     }
 
     @Test
-    fun popup_calculateGlobalPositionTopRight() {
-        /* Expected TopRight Position
+    fun popup_calculateGlobalPositionTopCenter_rtl() {
+        /* Expected TopCenter Position
+           x = parentGlobalPosition.x + (-offset.x) + parentSize.x / 2 - popupSize.x / 2
+           y = parentGlobalPosition.y + offset.y
+        */
+        val expectedPositionTopCenter = IntPxPosition(IntPx(70), IntPx(60))
+        val popupPositionProperties = PopupPositionProperties(
+            offset = offset
+        )
+        popupPositionProperties.parentPosition = parentGlobalPosition.toPxPosition()
+        popupPositionProperties.parentSize = parentSize.toPxSize()
+        popupPositionProperties.childrenSize = popupSize.toPxSize()
+        popupPositionProperties.parentLayoutDirection = LayoutDirection.Rtl
+
+        val positionTopCenter = calculatePopupGlobalPosition(
+            popupPositionProperties,
+            Alignment.TopCenter
+        )
+
+        Truth.assertThat(positionTopCenter).isEqualTo(expectedPositionTopCenter)
+    }
+
+    @Test
+    fun popup_calculateGlobalPositionTopEnd() {
+        /* Expected TopEnd Position
            x = parentGlobalPosition.x + offset.x + parentSize.x - popupSize.x
            y = parentGlobalPosition.y + offset.y
         */
-        val expectedPositionTopRight = IntPxPosition(IntPx(120), IntPx(60))
+        val expectedPositionTopEnd = IntPxPosition(IntPx(120), IntPx(60))
         val popupPositionProperties = PopupPositionProperties(
             offset = offset
         )
@@ -362,21 +590,44 @@
         popupPositionProperties.parentSize = parentSize.toPxSize()
         popupPositionProperties.childrenSize = popupSize.toPxSize()
 
-        val positionTopRight = calculatePopupGlobalPosition(
+        val positionTopEnd = calculatePopupGlobalPosition(
             popupPositionProperties,
             Alignment.TopEnd
         )
 
-        Truth.assertThat(positionTopRight).isEqualTo(expectedPositionTopRight)
+        Truth.assertThat(positionTopEnd).isEqualTo(expectedPositionTopEnd)
     }
 
     @Test
-    fun popup_calculateGlobalPositionCenterRight() {
-        /* Expected CenterRight Position
+    fun popup_calculateGlobalPositionTopEnd_rtl() {
+        /* Expected TopEnd Position
+           x = parentGlobalPosition.x + (-offset.x)
+           y = parentGlobalPosition.y + offset.y
+        */
+        val expectedPositionTopEnd = IntPxPosition(IntPx(40), IntPx(60))
+        val popupPositionProperties = PopupPositionProperties(
+            offset = offset
+        )
+        popupPositionProperties.parentPosition = parentGlobalPosition.toPxPosition()
+        popupPositionProperties.parentSize = parentSize.toPxSize()
+        popupPositionProperties.childrenSize = popupSize.toPxSize()
+        popupPositionProperties.parentLayoutDirection = LayoutDirection.Rtl
+
+        val positionTopEnd = calculatePopupGlobalPosition(
+            popupPositionProperties,
+            Alignment.TopEnd
+        )
+
+        Truth.assertThat(positionTopEnd).isEqualTo(expectedPositionTopEnd)
+    }
+
+    @Test
+    fun popup_calculateGlobalPositionCenterEnd() {
+        /* Expected CenterEnd Position
            x = parentGlobalPosition.x + offset.x + parentSize.x - popupSize.x
            y = parentGlobalPosition.y + offset.y + parentSize.y / 2 - popupSize.y / 2
         */
-        val expectedPositionCenterRight = IntPxPosition(IntPx(120), IntPx(100))
+        val expectedPositionCenterEnd = IntPxPosition(IntPx(120), IntPx(100))
         val popupPositionProperties = PopupPositionProperties(
             offset = offset
         )
@@ -384,12 +635,79 @@
         popupPositionProperties.parentSize = parentSize.toPxSize()
         popupPositionProperties.childrenSize = popupSize.toPxSize()
 
-        val positionBottomRight = calculatePopupGlobalPosition(
+        val positionBottomEnd = calculatePopupGlobalPosition(
             popupPositionProperties,
             Alignment.CenterEnd
         )
 
-        Truth.assertThat(positionBottomRight).isEqualTo(expectedPositionCenterRight)
+        Truth.assertThat(positionBottomEnd).isEqualTo(expectedPositionCenterEnd)
+    }
+
+    @Test
+    fun popup_calculateGlobalPositionCenterEnd_rtl() {
+        /* Expected CenterEnd Position
+           x = parentGlobalPosition.x + (-offset.x)
+           y = parentGlobalPosition.y + offset.y + parentSize.y / 2 - popupSize.y / 2
+        */
+        val expectedPositionCenterEnd = IntPxPosition(IntPx(40), IntPx(100))
+        val popupPositionProperties = PopupPositionProperties(
+            offset = offset
+        )
+        popupPositionProperties.parentPosition = parentGlobalPosition.toPxPosition()
+        popupPositionProperties.parentSize = parentSize.toPxSize()
+        popupPositionProperties.childrenSize = popupSize.toPxSize()
+        popupPositionProperties.parentLayoutDirection = LayoutDirection.Rtl
+
+        val positionBottomEnd = calculatePopupGlobalPosition(
+            popupPositionProperties,
+            Alignment.CenterEnd
+        )
+
+        Truth.assertThat(positionBottomEnd).isEqualTo(expectedPositionCenterEnd)
+    }
+
+    @Test
+    fun popup_calculateGlobalPositionBottomEnd() {
+        /* Expected BottomEnd Position
+           x = parentGlobalPosition.x + parentSize.x - popupSize.x + offset.x
+           y = parentGlobalPosition.y + offset.y + parentSize.y - popupSize.y
+        */
+        val expectedPositionBottomEnd = IntPxPosition(IntPx(120), IntPx(140))
+        val popupPositionProperties = PopupPositionProperties(
+            offset = offset
+        )
+        popupPositionProperties.parentPosition = parentGlobalPosition.toPxPosition()
+        popupPositionProperties.parentSize = parentSize.toPxSize()
+        popupPositionProperties.childrenSize = popupSize.toPxSize()
+
+        val positionBottomCenter = calculatePopupGlobalPosition(
+            popupPositionProperties,
+            Alignment.BottomEnd
+        )
+
+        Truth.assertThat(positionBottomCenter).isEqualTo(expectedPositionBottomEnd)
+    }
+
+    @Test
+    fun popup_calculateGlobalPositionBottomEnd_rtl() {
+        /* Expected BottomEnd Position
+           x = parentGlobalPosition.x + parentSize.x - popupSize.x + offset.x
+           y = parentGlobalPosition.y + offset.y + parentSize.y - popupSize.y
+        */
+        val expectedPositionBottomEnd = IntPxPosition(IntPx(120), IntPx(140))
+        val popupPositionProperties = PopupPositionProperties(
+            offset = offset
+        )
+        popupPositionProperties.parentPosition = parentGlobalPosition.toPxPosition()
+        popupPositionProperties.parentSize = parentSize.toPxSize()
+        popupPositionProperties.childrenSize = popupSize.toPxSize()
+
+        val positionBottomCenter = calculatePopupGlobalPosition(
+            popupPositionProperties,
+            Alignment.BottomEnd
+        )
+
+        Truth.assertThat(positionBottomCenter).isEqualTo(expectedPositionBottomEnd)
     }
 
     @Test
@@ -415,12 +733,35 @@
     }
 
     @Test
-    fun popup_calculateGlobalPositionBottomLeft() {
-        /* Expected BottomLeft Position
+    fun popup_calculateGlobalPositionBottomCenter_rtl() {
+        /* Expected BottomCenter Position
+           x = parentGlobalPosition.x + (-offset.x) + parentSize.x / 2 - popupSize.x / 2
+           y = parentGlobalPosition.y + offset.y + parentSize.y - popupSize.y
+        */
+        val expectedPositionBottomCenter = IntPxPosition(IntPx(70), IntPx(140))
+        val popupPositionProperties = PopupPositionProperties(
+            offset = offset
+        )
+        popupPositionProperties.parentPosition = parentGlobalPosition.toPxPosition()
+        popupPositionProperties.parentSize = parentSize.toPxSize()
+        popupPositionProperties.childrenSize = popupSize.toPxSize()
+        popupPositionProperties.parentLayoutDirection = LayoutDirection.Rtl
+
+        val positionBottomCenter = calculatePopupGlobalPosition(
+            popupPositionProperties,
+            Alignment.BottomCenter
+        )
+
+        Truth.assertThat(positionBottomCenter).isEqualTo(expectedPositionBottomCenter)
+    }
+
+    @Test
+    fun popup_calculateGlobalPositionBottomStart() {
+        /* Expected BottomStart Position
            x = parentGlobalPosition.x + offset.x
            y = parentGlobalPosition.y + offset.y + parentSize.y - popupSize.y
         */
-        val expectedPositionBottomLeft = IntPxPosition(IntPx(60), IntPx(140))
+        val expectedPositionBottomStart = IntPxPosition(IntPx(60), IntPx(140))
         val popupPositionProperties = PopupPositionProperties(
             offset = offset
         )
@@ -428,21 +769,44 @@
         popupPositionProperties.parentSize = parentSize.toPxSize()
         popupPositionProperties.childrenSize = popupSize.toPxSize()
 
-        val positionBottomLeft = calculatePopupGlobalPosition(
+        val positionBottomStart = calculatePopupGlobalPosition(
             popupPositionProperties,
             Alignment.BottomStart
         )
 
-        Truth.assertThat(positionBottomLeft).isEqualTo(expectedPositionBottomLeft)
+        Truth.assertThat(positionBottomStart).isEqualTo(expectedPositionBottomStart)
     }
 
     @Test
-    fun popup_calculateGlobalPositionCenterLeft() {
-        /* Expected CenterLeft Position
+    fun popup_calculateGlobalPositionBottomStart_rtl() {
+        /* Expected BottomStart Position
+           x = parentGlobalPosition.x + parentSize.x - popupSize.x + (-offset.x)
+           y = parentGlobalPosition.y + offset.y + parentSize.y - popupSize.y
+        */
+        val expectedPositionBottomStart = IntPxPosition(IntPx(100), IntPx(140))
+        val popupPositionProperties = PopupPositionProperties(
+            offset = offset
+        )
+        popupPositionProperties.parentPosition = parentGlobalPosition.toPxPosition()
+        popupPositionProperties.parentSize = parentSize.toPxSize()
+        popupPositionProperties.childrenSize = popupSize.toPxSize()
+        popupPositionProperties.parentLayoutDirection = LayoutDirection.Rtl
+
+        val positionBottomStart = calculatePopupGlobalPosition(
+            popupPositionProperties,
+            Alignment.BottomStart
+        )
+
+        Truth.assertThat(positionBottomStart).isEqualTo(expectedPositionBottomStart)
+    }
+
+    @Test
+    fun popup_calculateGlobalPositionCenterStart() {
+        /* Expected CenterStart Position
            x = parentGlobalPosition.x + offset.x
            y = parentGlobalPosition.y + offset.y + parentSize.y / 2 - popupSize.y / 2
         */
-        val expectedPositionCenterLeft = IntPxPosition(IntPx(60), IntPx(100))
+        val expectedPositionCenterStart = IntPxPosition(IntPx(60), IntPx(100))
         val popupPositionProperties = PopupPositionProperties(
             offset = offset
         )
@@ -450,12 +814,35 @@
         popupPositionProperties.parentSize = parentSize.toPxSize()
         popupPositionProperties.childrenSize = popupSize.toPxSize()
 
-        val positionCenterLeft = calculatePopupGlobalPosition(
+        val positionCenterStart = calculatePopupGlobalPosition(
             popupPositionProperties,
             Alignment.CenterStart
         )
 
-        Truth.assertThat(positionCenterLeft).isEqualTo(expectedPositionCenterLeft)
+        Truth.assertThat(positionCenterStart).isEqualTo(expectedPositionCenterStart)
+    }
+
+    @Test
+    fun popup_calculateGlobalPositionCenterStart_rtl() {
+        /* Expected CenterStart Position
+           x = parentGlobalPosition.x + parentSize.x - popupSize.x + (-offset.x)
+           y = parentGlobalPosition.y + offset.y + parentSize.y / 2 - popupSize.y / 2
+        */
+        val expectedPositionCenterStart = IntPxPosition(IntPx(100), IntPx(100))
+        val popupPositionProperties = PopupPositionProperties(
+            offset = offset
+        )
+        popupPositionProperties.parentPosition = parentGlobalPosition.toPxPosition()
+        popupPositionProperties.parentSize = parentSize.toPxSize()
+        popupPositionProperties.childrenSize = popupSize.toPxSize()
+        popupPositionProperties.parentLayoutDirection = LayoutDirection.Rtl
+
+        val positionCenterStart = calculatePopupGlobalPosition(
+            popupPositionProperties,
+            Alignment.CenterStart
+        )
+
+        Truth.assertThat(positionCenterStart).isEqualTo(expectedPositionCenterStart)
     }
 
     @Test
@@ -481,6 +868,29 @@
     }
 
     @Test
+    fun popup_calculateGlobalPositionCenter_rtl() {
+        /* Expected Center Position
+           x = parentGlobalPosition.x + (-offset.x) + parentSize.x / 2 - popupSize.x / 2
+           y = parentGlobalPosition.y + offset.y + parentSize.y / 2 - popupSize.y / 2
+        */
+        val expectedPositionCenter = IntPxPosition(IntPx(70), IntPx(100))
+        val popupPositionProperties = PopupPositionProperties(
+            offset = offset
+        )
+        popupPositionProperties.parentPosition = parentGlobalPosition.toPxPosition()
+        popupPositionProperties.parentSize = parentSize.toPxSize()
+        popupPositionProperties.childrenSize = popupSize.toPxSize()
+        popupPositionProperties.parentLayoutDirection = LayoutDirection.Rtl
+
+        val positionCenter = calculatePopupGlobalPosition(
+            popupPositionProperties,
+            Alignment.Center
+        )
+
+        Truth.assertThat(positionCenter).isEqualTo(expectedPositionCenter)
+    }
+
+    @Test
     fun popup_hasViewTreeLifecycleOwner() {
         composeTestRule.setContent {
             PopupTestTag(testTag) {
@@ -502,7 +912,7 @@
     }
 
     @Test
-    fun dropdownAlignment_calculateGlobalPositionLeft() {
+    fun dropdownAlignment_calculateGlobalPositionStart() {
         /* Expected Dropdown Start Position
            x = parentGlobalPosition.x + offset.x
            y = parentGlobalPosition.y + offset.y + parentSize.y
@@ -515,14 +925,35 @@
 
         val positionLeft = calculateDropdownPopupPosition(
             popupPositionProperties,
-            DropDownAlignment.Left
+            DropDownAlignment.Start
         )
 
         Truth.assertThat(positionLeft).isEqualTo(expectedPositionLeft)
     }
 
     @Test
-    fun dropdownAlignment_calculateGlobalPositionRight() {
+    fun dropdownAlignment_calculateGlobalPositionStart_rtl() {
+        /* Expected Dropdown Start Position
+           x = parentGlobalPosition.x + parentSize.x - popupSize.x + (-offset.x)
+           y = parentGlobalPosition.y + offset.y + parentSize.y
+        */
+        val expectedPosition = IntPxPosition(IntPx(100), IntPx(160))
+        val popupPositionProperties = PopupPositionProperties(offset = offset)
+        popupPositionProperties.parentPosition = parentGlobalPosition.toPxPosition()
+        popupPositionProperties.parentSize = parentSize.toPxSize()
+        popupPositionProperties.childrenSize = popupSize.toPxSize()
+        popupPositionProperties.parentLayoutDirection = LayoutDirection.Rtl
+
+        val positionLeft = calculateDropdownPopupPosition(
+            popupPositionProperties,
+            DropDownAlignment.Start
+        )
+
+        Truth.assertThat(positionLeft).isEqualTo(expectedPosition)
+    }
+
+    @Test
+    fun dropdownAlignment_calculateGlobalPositionEnd() {
         /* Expected Dropdown End Position
            x = parentGlobalPosition.x + offset.x + parentSize.x
            y = parentGlobalPosition.y + offset.y + parentSize.y
@@ -535,7 +966,28 @@
 
         val positionRight = calculateDropdownPopupPosition(
             popupPositionProperties,
-            DropDownAlignment.Right
+            DropDownAlignment.End
+        )
+
+        Truth.assertThat(positionRight).isEqualTo(expectedPositionRight)
+    }
+
+    @Test
+    fun dropdownAlignment_calculateGlobalPositionEnd_rtl() {
+        /* Expected Dropdown End Position
+           x = parentGlobalPosition.x - popupSize.x + (-offset.x)
+           y = parentGlobalPosition.y + offset.y + parentSize.y
+        */
+        val expectedPositionRight = IntPxPosition(IntPx(0), IntPx(160))
+        val popupPositionProperties = PopupPositionProperties(offset = offset)
+        popupPositionProperties.parentPosition = parentGlobalPosition.toPxPosition()
+        popupPositionProperties.parentSize = parentSize.toPxSize()
+        popupPositionProperties.childrenSize = popupSize.toPxSize()
+        popupPositionProperties.parentLayoutDirection = LayoutDirection.Rtl
+
+        val positionRight = calculateDropdownPopupPosition(
+            popupPositionProperties,
+            DropDownAlignment.End
         )
 
         Truth.assertThat(positionRight).isEqualTo(expectedPositionRight)
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/gesture/LongPressDragGestureDetectorTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/gesture/LongPressDragGestureFilterTest.kt
similarity index 95%
rename from ui/ui-framework/src/androidTest/java/androidx/ui/core/gesture/LongPressDragGestureDetectorTest.kt
rename to ui/ui-framework/src/androidTest/java/androidx/ui/core/gesture/LongPressDragGestureFilterTest.kt
index ab07e2c..f4162a0 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/gesture/LongPressDragGestureDetectorTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/gesture/LongPressDragGestureFilterTest.kt
@@ -22,8 +22,10 @@
 import androidx.test.filters.LargeTest
 import androidx.test.rule.ActivityTestRule
 import androidx.ui.core.Layout
+import androidx.ui.core.Modifier
 import androidx.ui.core.setContent
 import androidx.ui.framework.test.TestActivity
+import androidx.ui.layout.Stack
 import androidx.ui.unit.PxPosition
 import androidx.ui.unit.ipx
 import com.nhaarman.mockitokotlin2.any
@@ -47,7 +49,7 @@
 
 @LargeTest
 @RunWith(JUnit4::class)
-class LongPressDragGestureDetectorTest {
+class LongPressDragGestureFilterTest {
     @get:Rule
     val activityTestRule = ActivityTestRule<TestActivity>(TestActivity::class.java)
     private lateinit var longPressDragObserver: LongPressDragObserver
@@ -66,14 +68,16 @@
         val setupLatch = CountDownLatch(2)
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                Layout(
-                    modifier = LongPressDragGestureDetector(longPressDragObserver),
-                    measureBlock = { _, _, _ ->
-                        layout(100.ipx, 100.ipx) {
-                            setupLatch.countDown()
-                        }
-                    }, children = emptyContent()
-                )
+                Stack {
+                    Layout(
+                        modifier = Modifier.longPressDragGestureFilter(longPressDragObserver),
+                        measureBlock = { _, _, _ ->
+                            layout(100.ipx, 100.ipx) {
+                                setupLatch.countDown()
+                            }
+                        }, children = emptyContent()
+                    )
+                }
             }
 
             view = activity.findViewById<ViewGroup>(android.R.id.content)
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/gesture/ScaleGestureDetectorTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/gesture/ScaleGestureFilterTest.kt
similarity index 93%
rename from ui/ui-framework/src/androidTest/java/androidx/ui/core/gesture/ScaleGestureDetectorTest.kt
rename to ui/ui-framework/src/androidTest/java/androidx/ui/core/gesture/ScaleGestureFilterTest.kt
index cb6676e..df9b2b8 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/gesture/ScaleGestureDetectorTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/gesture/ScaleGestureFilterTest.kt
@@ -23,8 +23,10 @@
 import androidx.test.rule.ActivityTestRule
 import androidx.ui.core.DensityAmbient
 import androidx.ui.core.Layout
+import androidx.ui.core.Modifier
 import androidx.ui.core.setContent
 import androidx.ui.framework.test.TestActivity
+import androidx.ui.layout.Stack
 import androidx.ui.unit.Px
 import androidx.ui.unit.ceil
 import com.nhaarman.mockitokotlin2.any
@@ -45,7 +47,7 @@
 
 @LargeTest
 @RunWith(JUnit4::class)
-class ScaleGestureDetectorTest {
+class ScaleGestureFilterTest {
     @get:Rule
     val activityTestRule = ActivityTestRule<TestActivity>(TestActivity::class.java)
     private lateinit var scaleObserver: ScaleObserver
@@ -65,18 +67,20 @@
         val setupLatch = CountDownLatch(2)
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                touchSlop = with(DensityAmbient.current) { TouchSlop.toPx() }
-                Layout(
-                    modifier = ScaleGestureDetector(scaleObserver),
-                    measureBlock = { _, _, _ ->
-                        layout(
-                            (touchSlop * LayoutDimensionFactor).ceil(),
-                            (touchSlop * LayoutDimensionFactor).ceil()
-                        ) {
-                            setupLatch.countDown()
-                        }
-                    }, children = emptyContent()
-                )
+                Stack {
+                    touchSlop = with(DensityAmbient.current) { TouchSlop.toPx() }
+                    Layout(
+                        modifier = Modifier.scaleGestureFilter(scaleObserver),
+                        measureBlock = { _, _, _ ->
+                            layout(
+                                (touchSlop * LayoutDimensionFactor).ceil(),
+                                (touchSlop * LayoutDimensionFactor).ceil()
+                            ) {
+                                setupLatch.countDown()
+                            }
+                        }, children = emptyContent()
+                    )
+                }
             }
 
             view = activity.findViewById<ViewGroup>(android.R.id.content)
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/gesture/TouchSlopDragGestureDetectorTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/gesture/TouchSlopDragGestureFilterTest.kt
similarity index 91%
rename from ui/ui-framework/src/androidTest/java/androidx/ui/core/gesture/TouchSlopDragGestureDetectorTest.kt
rename to ui/ui-framework/src/androidTest/java/androidx/ui/core/gesture/TouchSlopDragGestureFilterTest.kt
index 0c65fca..a2068e3 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/gesture/TouchSlopDragGestureDetectorTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/gesture/TouchSlopDragGestureFilterTest.kt
@@ -22,8 +22,10 @@
 import androidx.test.rule.ActivityTestRule
 import androidx.ui.core.DensityAmbient
 import androidx.ui.core.Layout
+import androidx.ui.core.Modifier
 import androidx.ui.core.setContent
 import androidx.ui.framework.test.TestActivity
+import androidx.ui.layout.Stack
 import androidx.ui.unit.Px
 import androidx.ui.unit.PxPosition
 import androidx.ui.unit.ipx
@@ -44,7 +46,7 @@
 
 @LargeTest
 @RunWith(JUnit4::class)
-class TouchSlopDragGestureDetectorTest {
+class TouchSlopDragGestureFilterTest {
     @get:Rule
     val activityTestRule = ActivityTestRule<TestActivity>(TestActivity::class.java)
     private lateinit var dragObserver: DragObserver
@@ -250,18 +252,20 @@
         val setupLatch = CountDownLatch(2)
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                touchSlop = with(DensityAmbient.current) { TouchSlop.toPx() }
-                Layout(
-                    modifier = DragGestureDetector(
-                        dragObserver,
-                        startDragImmediately = startDragImmediately
-                    ),
-                    measureBlock = { _, _, _ ->
-                        layout(100.ipx, 100.ipx) {
-                            setupLatch.countDown()
-                        }
-                    }, children = {}
-                )
+                Stack {
+                    touchSlop = with(DensityAmbient.current) { TouchSlop.toPx() }
+                    Layout(
+                        modifier = Modifier.dragGestureFilter(
+                            dragObserver,
+                            startDragImmediately = startDragImmediately
+                        ),
+                        measureBlock = { _, _, _ ->
+                            layout(100.ipx, 100.ipx) {
+                                setupLatch.countDown()
+                            }
+                        }, children = {}
+                    )
+                }
             }
 
             view = activity.findViewById<ViewGroup>(android.R.id.content)
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/selection/SelectionHandlesTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/selection/SelectionHandlesTest.kt
index 574bdc9..2822a28 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/selection/SelectionHandlesTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/selection/SelectionHandlesTest.kt
@@ -22,6 +22,7 @@
 import androidx.test.rule.ActivityTestRule
 import androidx.ui.core.setContent
 import androidx.ui.core.test.runOnUiThreadIR
+import androidx.ui.core.test.setContentInFrameLayout
 import androidx.ui.core.test.waitAndScreenShot
 import androidx.ui.framework.test.TestActivity
 import androidx.ui.graphics.Color
@@ -85,7 +86,7 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun StartSelectionHandle_left_pointing() {
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 StartSelectionHandle(selection = selectionLtrHandleDirection)
             }
         }
@@ -101,7 +102,7 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun StartSelectionHandle_right_pointing() {
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 StartSelectionHandle(selection = selectionRtlHandleDirection)
             }
         }
@@ -117,7 +118,7 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun EndSelectionHandle_right_pointing() {
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 EndSelectionHandle(selection = selectionLtrHandleDirection)
             }
         }
@@ -133,7 +134,7 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun EndSelectionHandle_left_pointing() {
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 EndSelectionHandle(selection = selectionRtlHandleDirection)
             }
         }
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidLayoutDrawTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidLayoutDrawTest.kt
index cfc3162..ca0559a 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidLayoutDrawTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidLayoutDrawTest.kt
@@ -39,9 +39,12 @@
 import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import androidx.test.rule.ActivityTestRule
+import androidx.ui.core.Alignment
 import androidx.ui.core.Constraints
+import androidx.ui.core.DensityAmbient
 import androidx.ui.core.DrawLayerModifier
 import androidx.ui.core.DrawModifier
+import androidx.ui.core.ContentDrawScope
 import androidx.ui.core.HorizontalAlignmentLine
 import androidx.ui.core.Layout
 import androidx.ui.core.LayoutDirection
@@ -64,18 +67,20 @@
 import androidx.ui.framework.test.TestActivity
 import androidx.ui.geometry.Offset
 import androidx.ui.geometry.Rect
-import androidx.ui.graphics.Canvas
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.Outline
 import androidx.ui.graphics.Paint
 import androidx.ui.graphics.PaintingStyle
 import androidx.ui.graphics.Path
 import androidx.ui.graphics.Shape
+import androidx.ui.layout.size
+import androidx.ui.layout.wrapContentSize
 import androidx.ui.unit.Density
 import androidx.ui.unit.IntPx
 import androidx.ui.unit.IntPxPosition
 import androidx.ui.unit.IntPxSize
 import androidx.ui.unit.PxSize
+import androidx.ui.unit.dp
 import androidx.ui.unit.ipx
 import androidx.ui.unit.max
 import androidx.ui.unit.min
@@ -338,20 +343,15 @@
         activityTestRule.runOnUiThreadIR {
             activity.setContentInFrameLayout {
                 val contentDrawing = object : DrawModifier {
-                    override fun draw(
-                        density: Density,
-                        drawContent: () -> Unit,
-                        canvas: Canvas,
-                        size: PxSize
-                    ) {
+                    override fun ContentDrawScope.draw() {
                         // Fill the space with the outerColor
                         val paint = Paint()
                         paint.color = model.outerColor
-                        canvas.drawRect(size.toRect(), paint)
-                        canvas.nativeCanvas.save()
+                        drawRect(size.toRect(), paint)
+                        nativeCanvas.save()
                         val offset = size.width.value / 3
                         // clip drawing to the inner rectangle
-                        canvas.clipRect(Rect(offset, offset, offset * 2, offset * 2))
+                        clipRect(Rect(offset, offset, offset * 2, offset * 2))
                         drawContent()
 
                         // Fill bottom half with innerColor -- should be clipped
@@ -360,22 +360,22 @@
                             0f, size.height.value / 2f,
                             size.width.value, size.height.value
                         )
-                        canvas.drawRect(paintRect, paint)
+                        drawRect(paintRect, paint)
                         // restore the canvas
-                        canvas.nativeCanvas.restore()
+                        nativeCanvas.restore()
                     }
                 }
 
-                val paddingContent = Modifier.drawBehind { canvas, parentSize ->
+                val paddingContent = Modifier.drawBehind {
                     // Fill top half with innerColor -- should be clipped
                     drawLatch.countDown()
                     val paint = Paint()
                     paint.color = model.innerColor
                     val paintRect = Rect(
-                        0f, 0f, parentSize.width.value,
-                        parentSize.height.value / 2f
+                        0f, 0f, size.width.value,
+                        size.height.value / 2f
                     )
-                    canvas.drawRect(paintRect, paint)
+                    drawRect(paintRect, paint)
                 }
                 Padding(size = (model.size * 3), modifier = contentDrawing + paddingContent) {
                 }
@@ -460,21 +460,21 @@
 
         val layoutLatch = CountDownLatch(1)
         activityTestRule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 Layout(
-                    modifier = Modifier.drawBehind { canvas, size ->
+                    modifier = Modifier.drawBehind {
                         val paint = Paint()
                         paint.color = model.outerColor
-                        canvas.drawRect(size.toRect(), paint)
+                        drawRect(size.toRect(), paint)
                     },
                     children = {
                         AtLeastSize(
                             size = model.size,
-                            modifier = Modifier.drawBehind { canvas, size ->
+                            modifier = Modifier.drawBehind {
                                 drawLatch.countDown()
                                 val paint = Paint()
                                 paint.color = model.innerColor
-                                canvas.drawRect(size.toRect(), paint)
+                                drawRect(size.toRect(), paint)
                             }
                         )
                     }, measureBlock = { measurables, constraints, _ ->
@@ -491,7 +491,7 @@
                     })
             }
         }
-        layoutLatch.await(1, TimeUnit.SECONDS)
+        assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
 
         validateSquareColors(outerColor = blue, innerColor = white, size = 10)
 
@@ -548,7 +548,7 @@
         ) {
             Layout(
                 children = {},
-                modifier = Modifier.drawBehind { _, _ ->
+                modifier = Modifier.drawBehind {
                     drawn.value = true
                     latch.countDown()
                 },
@@ -678,22 +678,22 @@
         val innerColor = Color(0xFFFFFFFF)
         activityTestRule.runOnUiThreadIR {
             activity.setContentInFrameLayout {
-                AtLeastSize(size = 30.ipx, modifier = Modifier.drawBehind { canvas, size ->
+                AtLeastSize(size = 30.ipx, modifier = Modifier.drawBehind {
                     drawLatch.countDown()
                     val paint = Paint()
                     paint.color = outerColor
-                    canvas.drawRect(size.toRect(), paint)
+                    drawRect(size.toRect(), paint)
                 }) {
                     AtLeastSize(size = 30.ipx) {
                         if (drawChild.value) {
                             Padding(size = 10.ipx) {
                                 AtLeastSize(
                                     size = 10.ipx,
-                                    modifier = Modifier.drawBehind { canvas, size ->
+                                    modifier = Modifier.drawBehind {
                                         drawLatch.countDown()
                                         val paint = Paint()
                                         paint.color = innerColor
-                                        canvas.drawRect(size.toRect(), paint)
+                                        drawRect(size.toRect(), paint)
                                     }
                                 )
                             }
@@ -722,21 +722,21 @@
         val innerColor = Color(0xFFFFFFFF)
         activityTestRule.runOnUiThreadIR {
             activity.setContentInFrameLayout {
-                AtLeastSize(size = 30.ipx, modifier = Modifier.drawBehind { canvas, size ->
+                AtLeastSize(size = 30.ipx, modifier = Modifier.drawBehind {
                     drawLatch.countDown()
                     val paint = Paint()
                     paint.color = outerColor
-                    canvas.drawRect(size.toRect(), paint)
+                    drawRect(size.toRect(), paint)
                 }) {
                     Padding(size = 20.ipx) {
                         if (drawChild.value) {
                             AtLeastSize(
                                 size = 20.ipx,
-                                modifier = Modifier.drawBehind { canvas, size ->
+                                modifier = Modifier.drawBehind {
                                     drawLatch.countDown()
                                     val paint = Paint()
                                     paint.color = innerColor
-                                    canvas.drawRect(size.toRect(), paint)
+                                    drawRect(size.toRect(), paint)
                                 }
                             )
                         }
@@ -1317,14 +1317,18 @@
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
                 val child = @Composable {
-                    Layout(children = {}) { _, _, _ ->
-                        layout(0.ipx, 0.ipx, mapOf(TestLine to 10.ipx)) { ++childLayouts }
+                    Layout(children = {}) { _, constraints, _ ->
+                        layout(
+                            constraints.minWidth,
+                            constraints.minHeight,
+                            mapOf(TestLine to 10.ipx)
+                        ) { ++childLayouts }
                     }
                 }
                 val inner = @Composable {
                     Layout({ Wrap { Wrap { child() } } }) { measurables, constraints, _ ->
                         val placeable = measurables[0].measure(constraints)
-                        layout(0.ipx, 0.ipx) {
+                        layout(placeable.width, placeable.height) {
                             placeable.place(0.ipx, 0.ipx)
                             assertEquals(10.ipx, placeable[TestLine])
                         }
@@ -1353,8 +1357,12 @@
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
                 val child = @Composable {
-                    Layout(children = {}) { _, _, _ ->
-                        layout(0.ipx, 0.ipx, mapOf(TestLine to 10.ipx)) {
+                    Layout(children = {}) { _, constraints, _ ->
+                        layout(
+                            constraints.minWidth,
+                            constraints.minHeight,
+                            mapOf(TestLine to 10.ipx)
+                        ) {
                             model.offset // To ensure relayout.
                             ++childLayouts
                         }
@@ -1365,7 +1373,7 @@
                         WrapForceRelayout(model) { child() }
                     }) { measurables, constraints, _ ->
                         val placeable = measurables[0].measure(constraints)
-                        layout(0.ipx, 0.ipx) {
+                        layout(placeable.width, placeable.height) {
                             if (model.offset > 15.ipx) assertEquals(10.ipx, placeable[TestLine])
                             placeable.place(0.ipx, 0.ipx)
                             if (model.offset > 5.ipx) assertEquals(10.ipx, placeable[TestLine])
@@ -1442,7 +1450,7 @@
                     // This assumes a layout was done before the draw pass.
                     Layout(
                         children = {},
-                        modifier = Modifier.drawBehind { _, _ ->
+                        modifier = Modifier.drawBehind {
                             assertTrue(laidOut)
                             latch.countDown()
                         }
@@ -1475,7 +1483,7 @@
         activityTestRule.runOnUiThreadIR {
             activity.setContentInFrameLayout {
                 Layout(children = {
-                    AtLeastSize(30.ipx, modifier = Modifier.drawBehind { _, _ -> drawn = true })
+                    AtLeastSize(30.ipx, modifier = Modifier.drawBehind { drawn = true })
                 }, modifier = drawLatchModifier()) { _, _, _ ->
                     // don't measure or place the AtLeastSize
                     latch.countDown()
@@ -1578,9 +1586,9 @@
         val latch = CountDownLatch(1)
         activityTestRule.runOnUiThreadIR {
             activity.setContentInFrameLayout {
-                val drawnContent = Modifier.drawBehind { _, parentSize ->
-                    assertEquals(100.px, parentSize.width)
-                    assertEquals(100.px, parentSize.height)
+                val drawnContent = Modifier.drawBehind {
+                    assertEquals(100.px, size.width)
+                    assertEquals(100.px, size.height)
                     latch.countDown()
                 }
                 AtLeastSize(100.ipx, PaddingModifier(10.ipx) + drawnContent) {
@@ -1598,9 +1606,9 @@
                 AtLeastSize(
                     100.ipx,
                     PaddingModifier(10.ipx).drawLayer()
-                        .drawBehind { _, parentSize ->
-                            assertEquals(100.px, parentSize.width)
-                            assertEquals(100.px, parentSize.height)
+                        .drawBehind {
+                            assertEquals(100.px, size.width)
+                            assertEquals(100.px, size.height)
                             latch.countDown()
                         }
                 ) {
@@ -1654,9 +1662,10 @@
                         FixedSize(size, parentDataModifier)
                     },
                     measureBlock = { measurables, constraints, _ ->
-                        measurables.forEachIndexed { i, child ->
+                        for (i in 0 until measurables.size) {
+                            val child = measurables[i]
                             val placeable = child.measure(constraints)
-                            childSizes[i] = placeable.size
+                            childSizes[i] = IntPxSize(placeable.width, placeable.height)
                             latch.countDown()
                         }
                         layout(0.ipx, 0.ipx) { }
@@ -1740,13 +1749,13 @@
         val innerColor = Color.White
         activityTestRule.runOnUiThreadIR {
             activity.setContentInFrameLayout {
-                val colorModifier = Modifier.drawBehind { canvas, size ->
+                val colorModifier = Modifier.drawBehind {
                     val paint = Paint()
                     paint.style = PaintingStyle.fill
                     paint.color = outerColor
-                    canvas.drawRect(size.toRect(), paint)
+                    drawRect(size.toRect(), paint)
                     paint.color = innerColor
-                    canvas.drawRect(Rect(10f, 10f, 20f, 20f), paint)
+                    drawRect(Rect(10f, 10f, 20f, 20f), paint)
                     drawLatch.countDown()
                 }
                 FixedSize(30.ipx, colorModifier)
@@ -1762,7 +1771,7 @@
         val innerColor = Color.White
         activityTestRule.runOnUiThreadIR {
             activity.setContentInFrameLayout {
-                val countDownModifier = Modifier.drawBehind { _, _ ->
+                val countDownModifier = Modifier.drawBehind {
                     drawLatch.countDown()
                 }
                 FixedSize(
@@ -1809,18 +1818,17 @@
         val innerColor = Color.White
         activityTestRule.runOnUiThreadIR {
             activity.setContentInFrameLayout {
-                val drawAndOffset = drawWithContent { canvas, size ->
+                val drawAndOffset = drawWithContent {
                     val paint = Paint().apply { color = outerColor }
-                    canvas.drawRect(size.toRect(), paint)
-                    canvas.translate(10f, 10f)
-                    drawChildren()
-                    canvas.translate(-10f, -10f)
+                    drawRect(size.toRect(), paint)
+                    translate(10f, 10f)
+                    drawContent()
+                    translate(-10f, -10f)
                 }
                 FixedSize(30.ipx, drawAndOffset) {
                     FixedSize(
-                        size = 10.ipx, modifier = background(
-                            color = innerColor
-                        ) + drawLatchModifier()
+                        size = 10.ipx,
+                        modifier = AlignTopLeft + background(innerColor) + drawLatchModifier()
                     )
                 }
             }
@@ -1837,16 +1845,16 @@
 
         activityTestRule.runOnUiThreadIR {
             activity.setContentInFrameLayout {
-                FixedSize(30.ipx, modifier = Modifier.drawBehind { canvas, size ->
-                    canvas.drawRect(size.toRect(), Paint().apply { color = green })
+                FixedSize(30.ipx, modifier = Modifier.drawBehind {
+                    drawRect(size.toRect(), Paint().apply { color = green })
                 }) {
                     FixedSize(
                         model.offset,
                         modifier = AlignTopLeft.drawLayer()
-                            .drawBehind { canvas, parentSize ->
+                            .drawBehind {
                                 drawLatch.countDown()
-                                canvas.drawRect(
-                                    parentSize.toRect(),
+                                drawRect(
+                                    size.toRect(),
                                     Paint().apply { color = blue })
                             }
                     ) {
@@ -1920,7 +1928,7 @@
                 Layout(children = {
                     val state = state { false }
                     var lastLayoutValue: Boolean = false
-                    Layout(children = {}, modifier = Modifier.drawBehind { _, _ ->
+                    Layout(children = {}, modifier = Modifier.drawBehind {
                         // this verifies the layout was remeasured before being drawn
                         assertTrue(lastLayoutValue)
                         drawlatch.countDown()
@@ -1963,7 +1971,7 @@
                 ) {
                     FixedSize(
                         size = 20.ipx,
-                        modifier = PaddingModifier(5.ipx) + scale(0.5f) +
+                        modifier = AlignTopLeft + PaddingModifier(5.ipx) + scale(0.5f) +
                                 background(Color.Red) + latch(drawLatch)
                     ) {}
                 }
@@ -2031,12 +2039,12 @@
                             outlineShape = triangleShape,
                             clipToBounds = false,
                             clipToOutline = false
-                        ).drawBehind { canvas, _ ->
+                        ).drawBehind {
                             val paint = Paint().apply {
                                 color = Color.Blue
                                 style = PaintingStyle.fill
                             }
-                            canvas.drawRect(Rect(-10f, -10f, 20f, 20f), paint)
+                            drawRect(Rect(-10f, -10f, 20f, 20f), paint)
                         } + background(Color.Red) + latch(drawLatch)
                     ) {}
                 }
@@ -2092,13 +2100,13 @@
             activity.setContent {
                 FixedSize(
                     30.ipx,
-                    Modifier.drawBehind { _, _ -> outerLatch.countDown() }.drawLayer()
+                    Modifier.drawBehind { outerLatch.countDown() }.drawLayer()
                 ) {
-                    FixedSize(10.ipx, Modifier.drawBehind { canvas, _ ->
+                    FixedSize(10.ipx, Modifier.drawBehind {
                         val paint = Paint().apply {
                             color = Color.Blue
                         }
-                        canvas.drawLine(
+                        drawLine(
                             Offset(model.offset.value.toFloat(), 0f),
                             Offset(0f, model.offset.value.toFloat()),
                             paint
@@ -2178,33 +2186,43 @@
         }
     }
 
-    private val AlignTopLeft = object : LayoutModifier {
-        override fun Density.modifyConstraints(
-            constraints: Constraints,
-            layoutDirection: LayoutDirection
-        ) =
-            constraints.copy(minWidth = 0.ipx, minHeight = 0.ipx)
-
-        override fun Density.modifySize(
-            constraints: Constraints,
-            layoutDirection: LayoutDirection,
-            childSize: IntPxSize
-        ) = IntPxSize(constraints.maxWidth, constraints.maxHeight)
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun testInvalidateIntroducedLayer() {
+        val color = mutableStateOf(Color.Red)
+        activityTestRule.runOnUiThread {
+            activity.setContentInFrameLayout {
+                FixedSize(size = 30.ipx) {
+                    FixedSize(
+                        10.ipx,
+                        PaddingModifier(10.ipx).drawLayer(elevation = 1f) +
+                                background(Color.White)
+                    )
+                    FixedSize(30.ipx, background(color.value) + drawLatchModifier())
+                }
+            }
+        }
+        validateSquareColors(outerColor = Color.Red, innerColor = Color.White, size = 10)
+        drawLatch = CountDownLatch(1)
+        activityTestRule.runOnUiThread {
+            color.value = Color.Blue
+        }
+        validateSquareColors(outerColor = Color.Blue, innerColor = Color.White, size = 10)
     }
 
     private fun composeSquares(model: SquareModel) {
         activityTestRule.runOnUiThreadIR {
             activity.setContentInFrameLayout {
-                Padding(size = model.size, modifier = Modifier.drawBehind { canvas, size ->
+                Padding(size = model.size, modifier = Modifier.drawBehind {
                     val paint = Paint()
                     paint.color = model.outerColor
-                    canvas.drawRect(size.toRect(), paint)
+                    drawRect(size.toRect(), paint)
                 }) {
-                    AtLeastSize(size = model.size, modifier = Modifier.drawBehind { canvas, size ->
+                    AtLeastSize(size = model.size, modifier = Modifier.drawBehind {
                         drawLatch.countDown()
                         val paint = Paint()
                         paint.color = model.innerColor
-                        canvas.drawRect(size.toRect(), paint)
+                        drawRect(size.toRect(), paint)
                     })
                 }
             }
@@ -2264,22 +2282,22 @@
     private fun composeNestedSquares(model: SquareModel) {
         activityTestRule.runOnUiThreadIR {
             activity.setContentInFrameLayout {
-                val fillColorModifier = Modifier.drawBehind { canvas, size ->
-                    canvas.drawRect(size.toRect(), Paint().apply {
+                val fillColorModifier = Modifier.drawBehind {
+                    drawRect(size.toRect(), Paint().apply {
                         this.color = model.innerColor
                     })
                     drawLatch.countDown()
                 }
-                val innerDrawWithContentModifier = drawWithContent { canvas, size ->
+                val innerDrawWithContentModifier = drawWithContent {
                     val paint = Paint()
                     paint.color = model.outerColor
-                    canvas.drawRect(size.toRect(), paint)
+                    drawRect(size.toRect(), paint)
                     val start = model.size.value.toFloat()
                     val end = start * 2
-                    canvas.nativeCanvas.save()
-                    canvas.clipRect(Rect(start, start, end, end))
-                    drawChildren()
-                    canvas.nativeCanvas.restore()
+                    nativeCanvas.save()
+                    clipRect(Rect(start, start, end, end))
+                    drawContent()
+                    nativeCanvas.restore()
                 }
                 AtLeastSize(size = (model.size * 3), modifier = innerDrawWithContentModifier) {
                     AtLeastSize(size = (model.size * 3), modifier = fillColorModifier)
@@ -2307,8 +2325,8 @@
 
     @Composable
     private fun fillColor(color: Color, doCountDown: Boolean = true): Modifier =
-        Modifier.drawBehind { canvas, parentSize ->
-            canvas.drawRect(parentSize.toRect(), Paint().apply {
+        Modifier.drawBehind {
+            drawRect(size.toRect(), Paint().apply {
                 this.color = color
             })
             if (doCountDown) {
@@ -2321,8 +2339,8 @@
         squareModel: SquareModel,
         isInner: Boolean,
         doCountDown: Boolean = true
-    ): Modifier = Modifier.drawBehind { canvas, parentSize ->
-        canvas.drawRect(parentSize.toRect(), Paint().apply {
+    ): Modifier = Modifier.drawBehind {
+        drawRect(size.toRect(), Paint().apply {
             this.color = if (isInner) squareModel.innerColor else squareModel.outerColor
         })
         if (doCountDown) {
@@ -2330,7 +2348,7 @@
         }
     }
 
-    fun drawLatchModifier() = Modifier.drawBehind { _, _ -> drawLatch.countDown() }
+    fun drawLatchModifier() = Modifier.drawBehind { drawLatch.countDown() }
 }
 
 fun Bitmap.assertRect(
@@ -2402,7 +2420,7 @@
 @Composable
 fun AtLeastSize(
     size: IntPx,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() () -> Unit = emptyContent()
 ) {
     Layout(
@@ -2436,7 +2454,7 @@
 @Composable
 fun FixedSize(
     size: IntPx,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() () -> Unit = emptyContent()
 ) {
     Layout(children = children, modifier = modifier) { measurables, _, _ ->
@@ -2453,8 +2471,9 @@
 }
 
 @Composable
-fun Align(children: @Composable() () -> Unit) {
+fun Align(modifier: Modifier = Modifier.None, children: @Composable() () -> Unit) {
     Layout(
+        modifier = modifier,
         measureBlock = { measurables, constraints, _ ->
             val newConstraints = Constraints(
                 minWidth = IntPx.Zero,
@@ -2483,7 +2502,7 @@
 @Composable
 internal fun Padding(
     size: IntPx,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() () -> Unit
 ) {
     Layout(
@@ -2518,7 +2537,7 @@
 fun TwoMeasureLayout(
     size: IntPx,
     latch: CountDownLatch,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() () -> Unit
 ) {
     Layout(modifier = modifier, children = children) { measurables, _, _ ->
@@ -2545,7 +2564,7 @@
 fun Position(
     size: IntPx,
     offset: OffsetModel,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() () -> Unit
 ) {
     Layout(modifier = modifier, children = children) { measurables, constraints, _ ->
@@ -2562,7 +2581,7 @@
 
 @Composable
 fun Wrap(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     minWidth: IntPx = 0.ipx,
     minHeight: IntPx = 0.ipx,
     children: @Composable() () -> Unit = {}
@@ -2579,7 +2598,7 @@
 
 @Composable
 fun Scroller(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     onScrollPositionChanged: (position: IntPx, maxPosition: IntPx) -> Unit,
     offset: OffsetModel,
     child: @Composable() () -> Unit
@@ -2598,7 +2617,7 @@
 
 @Composable
 private fun ScrollerLayout(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     @Suppress("UNUSED_PARAMETER") maxPosition: IntPx,
     onMaxPositionChanged: () -> Unit,
     child: @Composable() () -> Unit
@@ -2621,7 +2640,7 @@
 @Composable
 fun WrapForceRelayout(
     model: OffsetModel,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() () -> Unit
 ) {
     Layout(modifier = modifier, children = children) { measurables, constraints, _ ->
@@ -2636,7 +2655,7 @@
 }
 
 @Composable
-fun SimpleRow(modifier: Modifier = Modifier.None, children: @Composable() () -> Unit) {
+fun SimpleRow(modifier: Modifier = Modifier, children: @Composable() () -> Unit) {
     Layout(modifier = modifier, children = children) { measurables, constraints, _ ->
         var width = 0.ipx
         var height = 0.ipx
@@ -2745,6 +2764,20 @@
     ) = IntPxPosition(left, top)
 }
 
+internal val AlignTopLeft = object : LayoutModifier {
+    override fun Density.modifyConstraints(
+        constraints: Constraints,
+        layoutDirection: LayoutDirection
+    ) =
+        constraints.copy(minWidth = 0.ipx, minHeight = 0.ipx)
+
+    override fun Density.modifySize(
+        constraints: Constraints,
+        layoutDirection: LayoutDirection,
+        childSize: IntPxSize
+    ) = IntPxSize(constraints.maxWidth, constraints.maxHeight)
+}
+
 @Model
 class SquareModel(
     var size: IntPx = 10.ipx,
@@ -2838,16 +2871,16 @@
     frameLayout.setContent(children)
 }
 
-fun background(color: Color) = Modifier.drawBehind { canvas, size ->
+fun background(color: Color) = Modifier.drawBehind {
     val paint = Paint().apply { this.color = color }
-    canvas.drawRect(size.toRect(), paint)
+    drawRect(size.toRect(), paint)
 }
 
-fun background(model: SquareModel, isInner: Boolean) = Modifier.drawBehind { canvas, size ->
+fun background(model: SquareModel, isInner: Boolean) = Modifier.drawBehind {
     val paint = Paint().apply {
         this.color = if (isInner) model.innerColor else model.outerColor
     }
-    canvas.drawRect(size.toRect(), paint)
+    drawRect(size.toRect(), paint)
 }
 
 class CombinedModifier(color: Color) : LayoutModifier, DrawModifier {
@@ -2882,8 +2915,8 @@
         return IntPxSize(constraints.maxWidth, constraints.maxHeight)
     }
 
-    override fun draw(density: Density, drawContent: () -> Unit, canvas: Canvas, size: PxSize) {
-        canvas.drawRect(size.toRect(), paint)
+    override fun ContentDrawScope.draw() {
+        drawRect(size.toRect(), paint)
     }
 }
 
@@ -2911,6 +2944,6 @@
     }
 }
 
-fun latch(countDownLatch: CountDownLatch) = Modifier.drawBehind { _, _ ->
+fun latch(countDownLatch: CountDownLatch) = Modifier.drawBehind {
     countDownLatch.countDown()
 }
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidViewCompatTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidViewCompatTest.kt
index 0d08ad0..bdf0b81 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidViewCompatTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidViewCompatTest.kt
@@ -35,6 +35,7 @@
 import androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA
 import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
+import androidx.ui.core.Alignment
 import androidx.ui.core.Constraints
 import androidx.ui.core.Layout
 import androidx.ui.core.LayoutDirection
@@ -46,12 +47,15 @@
 import androidx.ui.core.drawLayer
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.toArgb
+import androidx.ui.layout.wrapContentSize
 import androidx.ui.semantics.Semantics
 import androidx.ui.test.assertIsDisplayed
 import androidx.ui.test.assertPixels
 import androidx.ui.test.captureToBitmap
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.findByTag
+import androidx.ui.test.runOnIdleCompose
+import androidx.ui.test.runOnUiThread
 import androidx.ui.unit.Density
 import androidx.ui.unit.IntPxPosition
 import androidx.ui.unit.ipx
@@ -81,9 +85,12 @@
         composeTestRule.setContent {
             TestTag("content") {
                 Semantics {
-                    Layout(@Composable {
-                        ColoredSquareView(size = squareSize.offset.value, ref = squareRef)
-                    }) { measurables, constraints, _ ->
+                    Layout(
+                        @Composable {
+                            ColoredSquareView(size = squareSize.offset.value, ref = squareRef)
+                        },
+                        Modifier.wrapContentSize(Alignment.TopStart)
+                    ) { measurables, constraints, _ ->
                         assertEquals(1, measurables.size)
                         val placeable = measurables.first().measure(
                             constraints.copy(minWidth = 0.ipx, minHeight = 0.ipx)
@@ -105,7 +112,7 @@
             .check(matches(isDescendantOfA(instanceOf(Owner::class.java))))
             .check(matches(`is`(squareView)))
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             // Change view attribute using recomposition.
             squareSize.offset = 200.ipx
             expectedSize = 200
@@ -116,7 +123,7 @@
             .check(matches(isDescendantOfA(instanceOf(Owner::class.java))))
             .check(matches(`is`(squareView)))
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             // Change view attribute using the View reference.
             squareView!!.size = 300
             expectedSize = 300
@@ -136,10 +143,12 @@
         val squareSize = 100
         var expectedColor = Color.Blue
         composeTestRule.setContent {
-            TestTag("content") {
-                Semantics {
-                    Container(modifier = Modifier.drawLayer(clipToBounds = false)) {
-                        ColoredSquareView(color = colorModel.color, ref = squareRef)
+            Align {
+                TestTag("content") {
+                    Semantics {
+                        Container(Modifier.drawLayer(clipToBounds = false)) {
+                            ColoredSquareView(color = colorModel.color, ref = squareRef)
+                        }
                     }
                 }
             }
@@ -162,7 +171,7 @@
             .captureToBitmap()
             .assertPixels(expectedColorProvider = expectedPixelColor)
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             // Change view attribute using recomposition.
             colorModel.color = Color.Green
             expectedColor = Color.Green
@@ -176,7 +185,7 @@
             .captureToBitmap()
             .assertPixels(expectedColorProvider = expectedPixelColor)
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             // Change view attribute using the View reference.
             colorModel.color = Color.Red
             expectedColor = Color.Red
@@ -212,12 +221,12 @@
             constraints: Constraints,
             layoutParams: ViewGroup.LayoutParams
         ) {
-            composeTestRule.runOnUiThread {
+            runOnUiThread {
                 constraintsHolder.constraints = constraints
                 viewRef.value?.layoutParams = layoutParams
             }
 
-            composeTestRule.runOnIdleCompose {
+            runOnIdleCompose {
                 assertEquals(expectedWidthSpec, widthMeasureSpecRef.value)
                 assertEquals(expectedHeightSpec, heightMeasureSpecRef.value)
             }
@@ -308,11 +317,11 @@
                 MeasureSpecSaverView(ref = viewRef)
             }
         }
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             constraintsHolder.constraints = Constraints(minWidth = 20.ipx, minHeight = 30.ipx)
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertEquals(20, viewRef.value!!.minimumWidth)
             assertEquals(30, viewRef.value!!.minimumHeight)
         }
@@ -383,7 +392,7 @@
 
     @Composable
     fun Container(
-        modifier: Modifier = Modifier.None,
+        modifier: Modifier = Modifier,
         children: @Composable() () -> Unit
     ) {
         Layout(children, modifier) { measurables, constraints, _ ->
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/ClipTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/ClipTest.kt
index 3a97d1b..befb799 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/ClipTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/ClipTest.kt
@@ -23,6 +23,7 @@
 import androidx.test.rule.ActivityTestRule
 import androidx.ui.core.DrawLayerModifier
 import androidx.ui.core.Modifier
+import androidx.ui.core.DrawScope
 import androidx.ui.core.clip
 import androidx.ui.core.clipToBounds
 import androidx.ui.core.drawBehind
@@ -31,7 +32,6 @@
 import androidx.ui.geometry.RRect
 import androidx.ui.geometry.Radius
 import androidx.ui.geometry.Rect
-import androidx.ui.graphics.Canvas
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.Outline
 import androidx.ui.graphics.Paint
@@ -98,7 +98,7 @@
     @Test
     fun simpleRectClip() {
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 Padding(size = 10.ipx, modifier = FillColor(Color.Green)) {
                     AtLeastSize(
                         size = 10.ipx,
@@ -119,7 +119,7 @@
     @Test
     fun simpleClipToBounds() {
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 Padding(size = 10.ipx, modifier = FillColor(Color.Green)) {
                     AtLeastSize(
                         size = 10.ipx,
@@ -164,7 +164,7 @@
                     Outline.Rounded(RRect(size.toRect(), Radius.circular(12f)))
         }
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 AtLeastSize(
                     size = 30.ipx,
                     modifier = FillColor(Color.Green) + Modifier.clip(shape) + FillColor(Color.Cyan)
@@ -203,7 +203,7 @@
                 )
         }
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 AtLeastSize(
                     size = 30.ipx,
                     modifier = FillColor(Color.Green).clip(shape) + FillColor(Color.Cyan)) {
@@ -226,7 +226,7 @@
     @Test
     fun triangleClip() {
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 AtLeastSize(
                     size = 30.ipx,
                     modifier = FillColor(Color.Green) + Modifier.clip(triangleShape) +
@@ -257,7 +257,7 @@
                 )
         }
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 AtLeastSize(
                     size = 30.ipx,
                     modifier = FillColor(Color.Green) + Modifier.clip(concaveShape) +
@@ -278,7 +278,7 @@
         val model = ValueModel<Shape>(rectShape)
 
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 AtLeastSize(
                     size = 30.ipx,
                     modifier = FillColor(Color.Green) + Modifier.clip(model.value) +
@@ -313,7 +313,7 @@
         val model = ValueModel<Shape>(rectShape)
 
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 AtLeastSize(
                     size = 30.ipx,
                     modifier = FillColor(Color.Green) + Modifier.clip(model.value) +
@@ -340,7 +340,7 @@
         val model = ValueModel<Shape>(triangleShape)
 
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 AtLeastSize(
                     size = 30.ipx,
                     modifier = FillColor(Color.Green) + Modifier.clip(model.value) +
@@ -367,8 +367,8 @@
         val model = ValueModel<Shape>(triangleShape)
         // to be replaced with a DrawModifier wrapped into remember, so the recomposition
         // is not causing invalidation as the DrawModifier didn't change
-        val drawCallback: Density.(canvas: Canvas, parentSize: PxSize) -> Unit = { canvas, size ->
-            canvas.drawRect(
+        val drawCallback: DrawScope.() -> Unit = {
+            drawRect(
                 Rect(
                     -100f,
                     -100f,
@@ -390,7 +390,7 @@
         }
 
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 AtLeastSize(
                     size = 30.ipx,
                     modifier = background(Color.Green) + clip + Modifier.drawBehind(drawCallback)
@@ -417,12 +417,12 @@
         val model = ValueModel(false)
 
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 Padding(size = 10.ipx, modifier = FillColor(Color.Green)) {
                     val modifier = if (model.value) {
                         Modifier.clip(rectShape) + FillColor(Color.Cyan)
                     } else {
-                        Modifier.None
+                        Modifier
                     }
                     AtLeastSize(size = 10.ipx, modifier = modifier) {
                     }
@@ -443,13 +443,13 @@
     }
 
     private fun FillColor(color: Color): Modifier {
-        return Modifier.drawBehind { canvas, parentSize ->
-            canvas.drawRect(
+        return Modifier.drawBehind {
+            drawRect(
                 Rect(
                     -100f,
                     -100f,
-                    parentSize.width.value + 100f,
-                    parentSize.height.value + 100f
+                    size.width.value + 100f,
+                    size.height.value + 100f
                 ), Paint().apply {
                     this.color = color
                 })
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/DrawLayerTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/DrawLayerTest.kt
index 4d204ef..0e193ac 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/DrawLayerTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/DrawLayerTest.kt
@@ -27,7 +27,6 @@
 import androidx.ui.core.globalPosition
 import androidx.ui.core.onPositioned
 import androidx.ui.core.positionInRoot
-import androidx.ui.core.setContent
 import androidx.ui.framework.test.TestActivity
 import androidx.ui.unit.PxBounds
 import androidx.ui.unit.PxPosition
@@ -72,7 +71,7 @@
     @Test
     fun testLayerBoundsPosition() {
         activityTestRule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 FixedSize(30.ipx, PaddingModifier(10.ipx).drawLayer() + positioner) {
                 }
             }
@@ -95,7 +94,7 @@
     @Test
     fun testScale() {
         activityTestRule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 Padding(10.ipx) {
                     FixedSize(
                         10.ipx,
@@ -117,7 +116,7 @@
     @Test
     fun testRotation() {
         activityTestRule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 Padding(10.ipx) {
                     FixedSize(
                         10.ipx,
@@ -139,7 +138,7 @@
     @Test
     fun testRotationPivot() {
         activityTestRule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 Padding(10.ipx) {
                     FixedSize(10.ipx,
                         Modifier.drawLayer(
@@ -162,7 +161,7 @@
     @Test
     fun testTranslationXY() {
         activityTestRule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 Padding(10.ipx) {
                     FixedSize(10.ipx,
                         Modifier.drawLayer(
@@ -185,7 +184,7 @@
     @Test
     fun testClip() {
         activityTestRule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 Padding(10.ipx) {
                     FixedSize(10.ipx, Modifier.drawLayer(clipToBounds = true)) {
                         FixedSize(
@@ -210,7 +209,7 @@
     @Test
     fun testTotalClip() {
         activityTestRule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 Padding(10.ipx) {
                     FixedSize(10.ipx, Modifier.drawLayer(clipToBounds = true)) {
                         FixedSize(
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/DrawReorderingTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/DrawReorderingTest.kt
index 229b700..ae9843d 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/DrawReorderingTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/DrawReorderingTest.kt
@@ -563,14 +563,14 @@
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
     }
 
-    fun Modifier.drawLatchModifier() = drawBehind { _, _ -> drawLatch.countDown() }
+    fun Modifier.drawLatchModifier() = drawBehind { drawLatch.countDown() }
 }
 
 private fun Modifier.background(
     color: State<Color>
-) = drawBehind { canvas, parentSize ->
+) = drawBehind {
     if (color.value != Color.Transparent) {
-        canvas.drawRect(parentSize.toRect(), Paint().apply {
+        drawRect(size.toRect(), Paint().apply {
             this.color = color.value
         })
     }
@@ -579,7 +579,7 @@
 @Composable
 fun FixedSize(
     size: State<IntPx>,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() () -> Unit = emptyContent()
 ) {
     Layout(children = children, modifier = modifier) { measurables, _, _ ->
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/DrawShadowTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/DrawShadowTest.kt
index 7d298e3..837cb87 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/DrawShadowTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/DrawShadowTest.kt
@@ -28,7 +28,6 @@
 import androidx.ui.core.drawBehind
 import androidx.ui.core.drawLayer
 import androidx.ui.core.drawShadow
-import androidx.ui.core.setContent
 import androidx.ui.framework.test.TestActivity
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.Outline
@@ -78,7 +77,7 @@
     @Test
     fun shadowDrawn() {
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 ShadowContainer()
             }
         }
@@ -93,7 +92,7 @@
     @Test
     fun shadowDrawnInsideRenderNode() {
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 ShadowContainer(modifier = Modifier.drawLayer(clipToBounds = false))
             }
         }
@@ -110,7 +109,7 @@
         val elevation = mutableStateOf(0.dp)
 
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 ShadowContainer(elevation)
             }
         }
@@ -131,7 +130,7 @@
         val elevation = mutableStateOf(0.dp)
 
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 ShadowContainer(elevation, modifier = Modifier.drawLayer(clipToBounds = true))
             }
         }
@@ -150,7 +149,7 @@
     @Test
     fun opacityAppliedForTheShadow() {
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 AtLeastSize(size = 12.ipx, modifier = background(Color.White)) {
                     AtLeastSize(
                         size = 10.ipx,
@@ -178,12 +177,12 @@
         val model = ValueModel(false)
 
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 AtLeastSize(size = 12.ipx, modifier = background(Color.White)) {
                     val shadow = if (model.value) {
                         Modifier.drawShadow(rectShape, 8.dp)
                     } else {
-                        Modifier.None
+                        Modifier
                     }
                     AtLeastSize(size = 10.ipx, modifier = shadow) {
                     }
@@ -205,7 +204,7 @@
     @Composable
     private fun ShadowContainer(
         elevation: State<Dp> = mutableStateOf(8.dp),
-        modifier: Modifier = Modifier.None
+        modifier: Modifier = Modifier
     ) {
         AtLeastSize(size = 12.ipx, modifier = modifier + background(Color.White)) {
             AtLeastSize(
@@ -220,8 +219,8 @@
         assertNotEquals(color(width / 2, height - 1), Color.White)
     }
 
-    private fun background(color: Color) = Modifier.drawBehind { canvas, size ->
-        canvas.drawRect(size.toRect(), Paint().apply {
+    private fun background(color: Color) = Modifier.drawBehind {
+        drawRect(size.toRect(), Paint().apply {
             this.color = color
         })
         drawLatch.countDown()
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/ModelReadsTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/ModelReadsTest.kt
index f9cd45e..c6cf5c2 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/ModelReadsTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/ModelReadsTest.kt
@@ -56,7 +56,7 @@
         var positionLatch = CountDownLatch(1)
         rule.runOnUiThread {
             activity.setContentInFrameLayout {
-                Layout({}, modifier = Modifier.drawBehind { _, _ ->
+                Layout({}, modifier = Modifier.drawBehind {
                     // read from the model
                     model.offset
                     drawLatch.countDown()
@@ -99,7 +99,7 @@
         var positionLatch = CountDownLatch(1)
         rule.runOnUiThread {
             activity.setContentInFrameLayout {
-                Layout({}, modifier = Modifier.drawBehind { _, _ ->
+                Layout({}, modifier = Modifier.drawBehind {
                     // read from the model
                     drawModel.offset
                     drawLatch.countDown()
@@ -141,7 +141,7 @@
         var drawLatch = CountDownLatch(1)
         rule.runOnUiThread {
             activity.setContentInFrameLayout {
-                Layout({}, modifier = Modifier.drawBehind { _, _ ->
+                Layout({}, modifier = Modifier.drawBehind {
                     // read from the model
                     model.offset
                     drawLatch.countDown()
@@ -222,7 +222,7 @@
         val model = ValueModel(0)
         rule.runOnUiThread {
             activity.setContentInFrameLayout {
-                AtLeastSize(10.ipx, modifier = Modifier.drawBehind { _, _ ->
+                AtLeastSize(10.ipx, modifier = Modifier.drawBehind {
                     if (enabled.value) {
                         // read the model
                         model.value
@@ -285,12 +285,12 @@
         rule.runOnUiThread {
             activity.setContentInFrameLayout {
                 val modifier = if (enabled.value) {
-                    Modifier.drawBehind { _, _ ->
+                    Modifier.drawBehind {
                         // read the model
                         model.value
                         latch.countDown()
                     }
-                } else Modifier.None
+                } else Modifier
                 AtLeastSize(10.ipx, modifier = modifier) {}
             }
         }
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/OnPositionedTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/OnPositionedTest.kt
index be00ea7..84dcf0b 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/OnPositionedTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/OnPositionedTest.kt
@@ -22,12 +22,16 @@
 import androidx.test.filters.SmallTest
 import androidx.test.rule.ActivityTestRule
 import androidx.ui.core.Layout
+import androidx.ui.core.LayoutCoordinates
 import androidx.ui.core.Modifier
+import androidx.ui.core.boundsInParent
 import androidx.ui.core.globalPosition
 import androidx.ui.core.onChildPositioned
 import androidx.ui.core.onPositioned
+import androidx.ui.core.positionInParent
 import androidx.ui.core.setContent
 import androidx.ui.framework.test.TestActivity
+import androidx.ui.unit.PxBounds
 import androidx.ui.unit.PxPosition
 import androidx.ui.unit.ipx
 import androidx.ui.unit.px
@@ -147,7 +151,7 @@
         var childGlobalPosition = PxPosition(0.px, 0.px)
         var latch = CountDownLatch(1)
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 Layout(
                     measureBlock = { measurables, constraints, _ ->
                         layout(10.ipx, 10.ipx) {
@@ -234,4 +238,66 @@
         assertTrue(wrap2OnPositionedCalled)
         assertEquals(1, onChildPositionedCalledTimes)
     }
+
+    @Test
+    fun testPositionInParent() {
+        val positionedLatch = CountDownLatch(1)
+        var coordinates: LayoutCoordinates? = null
+
+        rule.runOnUiThread {
+            activity.setContentInFrameLayout {
+                FixedSize(10.ipx,
+                    PaddingModifier(5.ipx) +
+                            Modifier.onPositioned {
+                                coordinates = it
+                                positionedLatch.countDown()
+                            }
+                ) {
+                }
+            }
+        }
+        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+        rule.runOnUiThread {
+            assertEquals(PxPosition(5.px, 5.px), coordinates!!.positionInParent)
+
+            var root = coordinates!!
+            while (root.parentCoordinates != null) {
+                root = root.parentCoordinates!!
+            }
+
+            assertEquals(PxPosition.Origin, root.positionInParent)
+        }
+    }
+
+    @Test
+    fun testBoundsInParent() {
+        val positionedLatch = CountDownLatch(1)
+        var coordinates: LayoutCoordinates? = null
+
+        rule.runOnUiThread {
+            activity.setContentInFrameLayout {
+                FixedSize(10.ipx,
+                    PaddingModifier(5.ipx) +
+                            Modifier.onPositioned {
+                                coordinates = it
+                                positionedLatch.countDown()
+                            }
+                ) {
+                }
+            }
+        }
+        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+        rule.runOnUiThread {
+            assertEquals(PxBounds(5.px, 5.px, 15.px, 15.px), coordinates!!.boundsInParent)
+
+            var root = coordinates!!
+            while (root.parentCoordinates != null) {
+                root = root.parentCoordinates!!
+            }
+
+            assertEquals(PxBounds(0.px, 0.px, 20.px, 20.px), root.boundsInParent)
+        }
+    }
 }
\ No newline at end of file
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/OpacityTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/OpacityTest.kt
index c0f7cb11..0a71ccf 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/OpacityTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/OpacityTest.kt
@@ -52,7 +52,7 @@
     val rule = ActivityTestRule<TestActivity>(TestActivity::class.java)
     private lateinit var activity: TestActivity
     private lateinit var drawLatch: CountDownLatch
-    private val unlatch = Modifier.drawBehind { _, _ -> drawLatch.countDown() }
+    private val unlatch = Modifier.drawBehind { drawLatch.countDown() }
 
     @Before
     fun setup() {
@@ -66,7 +66,7 @@
     fun drawFullOpacity() {
         val color = Color.LightGray
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 AtLeastSize(size = 10.ipx,
                     modifier = background(Color.White) +
                             Modifier.drawOpacity(1f) +
@@ -86,7 +86,7 @@
     fun drawZeroOpacity() {
         val color = Color.LightGray
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 AtLeastSize(size = 10.ipx,
                     modifier = background(Color.White) +
                             Modifier.drawOpacity(0f) +
@@ -107,7 +107,7 @@
     fun drawHalfOpacity() {
         val color = Color.Red
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 Row(background(Color.White)) {
                     AtLeastSize(size = 10.ipx,
                         modifier = background(Color.White) +
@@ -136,7 +136,7 @@
         val model = ValueModel(0.5f)
 
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 AtLeastSize(size = 10.ipx,
                     modifier = background(Color.White) +
                             Modifier.drawOpacity(model.value) +
@@ -164,7 +164,7 @@
         var opacity by mutableStateOf(0f)
 
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 AtLeastSize(size = 10.ipx,
                     modifier = background(Color.White) +
                             Modifier.drawOpacity(1f) +
@@ -192,14 +192,14 @@
         val model = ValueModel(false)
 
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 AtLeastSize(size = 10.ipx,
                     modifier = background(Color.White) +
                             if (model.value) {
                                 Modifier.drawOpacity(0f) +
                                         background(Color.Green)
                             } else {
-                                Modifier.None
+                                Modifier
                             } +
                             unlatch
                 ) {
@@ -228,7 +228,7 @@
 }
 
 @Composable
-fun Row(modifier: Modifier = Modifier.None, children: @Composable() () -> Unit) {
+fun Row(modifier: Modifier = Modifier, children: @Composable() () -> Unit) {
     Layout(modifier = modifier, children = children) { measurables, constraints, _ ->
         val placeables = measurables.map { it.measure(constraints) }
         var width = 0.ipx
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/ParentDataModifierTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/ParentDataModifierTest.kt
index dd25865..af21fd7 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/ParentDataModifierTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/ParentDataModifierTest.kt
@@ -149,10 +149,10 @@
 
 @Composable
 fun SimpleDrawChild(drawLatch: CountDownLatch) {
-    AtLeastSize(size = 10.ipx, modifier = Modifier.drawBehind { canvas, size ->
+    AtLeastSize(size = 10.ipx, modifier = Modifier.drawBehind {
         val paint = Paint()
         paint.color = Color(0xFF008000)
-        canvas.drawRect(size.toRect(), paint)
+        drawRect(size.toRect(), paint)
         drawLatch.countDown()
     }) {}
 }
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/RtlLayoutTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/RtlLayoutTest.kt
index ff0156e..cc5a68b 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/RtlLayoutTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/RtlLayoutTest.kt
@@ -27,7 +27,6 @@
 import androidx.ui.core.Modifier
 import androidx.ui.core.Ref
 import androidx.ui.core.onPositioned
-import androidx.ui.core.setContent
 import androidx.ui.unit.Density
 import androidx.ui.unit.PxPosition
 import androidx.ui.unit.ipx
@@ -65,7 +64,7 @@
     @Test
     fun customLayout_absolutePositioning() = with(density) {
         activityTestRule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 CustomLayout(true, LayoutDirection.Ltr)
             }
         }
@@ -82,7 +81,7 @@
     @Test
     fun customLayout_absolutePositioning_rtl() = with(density) {
         activityTestRule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 CustomLayout(true, LayoutDirection.Rtl)
             }
         }
@@ -99,7 +98,7 @@
     @Test
     fun customLayout_positioning() = with(density) {
         activityTestRule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 CustomLayout(false, LayoutDirection.Ltr)
             }
         }
@@ -116,7 +115,7 @@
     @Test
     fun customLayout_positioning_rtl() = with(density) {
         activityTestRule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 CustomLayout(false, LayoutDirection.Rtl)
             }
         }
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/WithConstraintsTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/WithConstraintsTest.kt
index 30894b7..8248d12 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/WithConstraintsTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/WithConstraintsTest.kt
@@ -33,7 +33,10 @@
 import androidx.ui.core.Layout
 import androidx.ui.core.LayoutDirection
 import androidx.ui.core.LayoutModifier
+import androidx.ui.core.LayoutModifier2
+import androidx.ui.core.Measurable
 import androidx.ui.core.MeasureBlock
+import androidx.ui.core.MeasureScope
 import androidx.ui.core.Modifier
 import androidx.ui.core.Ref
 import androidx.ui.core.WithConstraints
@@ -97,7 +100,7 @@
                 WithConstraints { constraints, _ ->
                     topConstraints.value = constraints
                     Padding(size = size) {
-                        val drawModifier = Modifier.drawBehind { _, _ ->
+                        val drawModifier = Modifier.drawBehind {
                             countDownLatch.countDown()
                         }
                         WithConstraints(drawModifier) { constraints, _ ->
@@ -139,17 +142,17 @@
         rule.runOnUiThreadIR {
             activity.setContentInFrameLayout {
                 WithConstraints { constraints, _ ->
-                    val outerModifier = Modifier.drawBehind { canvas, size ->
+                    val outerModifier = Modifier.drawBehind {
                         val paint = Paint()
                         paint.color = model.outerColor
-                        canvas.drawRect(size.toRect(), paint)
+                        drawRect(size.toRect(), paint)
                     }
                     Layout(children = {
-                        val innerModifier = Modifier.drawBehind { canvas, size ->
+                        val innerModifier = Modifier.drawBehind {
                             drawLatch.countDown()
                             val paint = Paint()
                             paint.color = model.innerColor
-                            canvas.drawRect(size.toRect(), paint)
+                            drawRect(size.toRect(), paint)
                         }
                         Layout(
                             children = {},
@@ -370,7 +373,7 @@
                 Container(100.ipx, 100.ipx, backgroundModifier(Color.Red)) {
                     ChangingConstraintsLayout(model) {
                         WithConstraints { constraints, _ ->
-                            Container(100.ipx, 100.ipx) {
+                            Container(100.ipx, 100.ipx, infiniteConstraints) {
                                 Container(100.ipx, 100.ipx) {
                                     Layout(
                                         {},
@@ -395,7 +398,6 @@
         rule.runOnUiThread {
             model.value = 50.ipx
         }
-
         takeScreenShot(100).apply {
             assertRect(color = Color.Red, holeSize = 50)
             assertRect(color = Color.Yellow, size = 50)
@@ -461,7 +463,7 @@
                                 }
                             }
                         }
-                        Container(100.ipx, 100.ipx, Modifier.None, emptyContent())
+                        Container(100.ipx, 100.ipx, Modifier, emptyContent())
                     }
                 }
             }
@@ -491,7 +493,7 @@
             activity.setContent {
                 val state = state { false }
                 var lastLayoutValue: Boolean = false
-                val drawModifier = Modifier.drawBehind { _, _ ->
+                val drawModifier = Modifier.drawBehind {
                     // this verifies the layout was remeasured before being drawn
                     assertTrue(lastLayoutValue)
                     drawlatch.countDown()
@@ -695,10 +697,10 @@
     }
 
     private fun countdownLatchBackgroundModifier(color: Color) =
-        Modifier.drawBehind { canvas, size ->
+        Modifier.drawBehind {
             val paint = Paint()
             paint.color = color
-            canvas.drawRect(size.toRect(), paint)
+            drawRect(size.toRect(), paint)
             drawLatch.countDown()
         }
 
@@ -736,7 +738,7 @@
 fun Container(
     width: IntPx,
     height: IntPx,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() () ->
     Unit
 ) {
@@ -789,8 +791,21 @@
     }
 }
 
-fun backgroundModifier(color: Color) = Modifier.drawBehind { canvas, size ->
+fun backgroundModifier(color: Color) = Modifier.drawBehind {
     val paint = Paint()
     paint.color = color
-    canvas.drawRect(size.toRect(), paint)
+    drawRect(size.toRect(), paint)
+}
+
+val infiniteConstraints = object : LayoutModifier2 {
+    override fun MeasureScope.measure(
+        measurable: Measurable,
+        constraints: Constraints,
+        layoutDirection: LayoutDirection
+    ): MeasureScope.MeasureResult {
+        val placeable = measurable.measure(Constraints())
+        return layout(constraints.maxWidth, constraints.maxHeight) {
+            placeable.place(0.ipx, 0.ipx)
+        }
+    }
 }
\ No newline at end of file
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/framework/test/TestActivity.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/framework/test/TestActivity.kt
index 7737c16..78f546c 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/framework/test/TestActivity.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/framework/test/TestActivity.kt
@@ -15,10 +15,10 @@
  */
 package androidx.ui.framework.test
 
-import android.app.Activity
+import androidx.activity.ComponentActivity
 import java.util.concurrent.CountDownLatch
 
-class TestActivity : Activity() {
+class TestActivity : ComponentActivity() {
     var hasFocusLatch = CountDownLatch(1)
 
     override fun onWindowFocusChanged(hasFocus: Boolean) {
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/graphics/vector/VectorInvalidationTestCase.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/graphics/vector/VectorInvalidationTestCase.kt
index 8ca57fa..d55b354 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/graphics/vector/VectorInvalidationTestCase.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/graphics/vector/VectorInvalidationTestCase.kt
@@ -61,8 +61,8 @@
         }
     }
 
-    val WhiteBackground = Modifier.drawBehind { canvas, size ->
-        canvas.drawRect(
+    val WhiteBackground = Modifier.drawBehind {
+        drawRect(
             Rect.fromLTWH(
                 0.0f,
                 0.0f,
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/graphics/vector/VectorTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/graphics/vector/VectorTest.kt
index d95f0f8..0788069 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/graphics/vector/VectorTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/graphics/vector/VectorTest.kt
@@ -26,9 +26,9 @@
 import androidx.ui.core.DensityAmbient
 import androidx.ui.core.Modifier
 import androidx.ui.core.paint
-import androidx.ui.core.setContent
 import androidx.ui.core.test.AtLeastSize
 import androidx.ui.core.test.runOnUiThreadIR
+import androidx.ui.core.test.setContentInFrameLayout
 import androidx.ui.core.test.waitAndScreenShot
 import androidx.ui.framework.test.TestActivity
 import androidx.ui.graphics.Color
@@ -70,7 +70,7 @@
     @Test
     fun testVectorTint() {
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 VectorTint()
             }
         }
@@ -85,7 +85,7 @@
     @Test
     fun testVectorAlignment() {
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 VectorTint(minimumSize = 500.ipx, alignment = Alignment.BottomEnd)
             }
         }
@@ -103,7 +103,7 @@
         val latch2 = CountDownLatch(1)
         val testCase = VectorInvalidationTestCase(latch1)
         rule.runOnUiThreadIR {
-            activity.setContent {
+            activity.setContentInFrameLayout {
                 testCase.createTestVector()
             }
         }
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/res/FontResourcesTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/res/FontResourcesTest.kt
index 17fb91b..d566b91 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/res/FontResourcesTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/res/FontResourcesTest.kt
@@ -20,14 +20,15 @@
 import androidx.test.filters.SmallTest
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.ui.core.ContextAmbient
-import androidx.ui.framework.test.R
 import androidx.ui.test.createComposeRule
+import androidx.ui.test.runOnIdleCompose
 import androidx.ui.text.Typeface
 import androidx.ui.text.font.FontFamily
 import androidx.ui.text.font.FontWeight
 import androidx.ui.text.font.asFontFamily
 import androidx.ui.text.font.font
 import androidx.ui.text.font.fontFamily
+import androidx.ui.text.font.test.R
 import com.google.common.truth.Truth.assertThat
 import org.junit.Rule
 import org.junit.Test
@@ -63,7 +64,7 @@
             }
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(result).isNotNull()
             assertThat(result!!.state).isEqualTo(LoadingState.LOADED)
             assertThat(result!!.resource.resource).isEqualTo(
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/res/ResourcesTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/res/ResourcesTest.kt
index 3af247c..799a5db 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/res/ResourcesTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/res/ResourcesTest.kt
@@ -23,8 +23,10 @@
 import androidx.ui.core.ContextAmbient
 import androidx.ui.framework.test.R
 import androidx.ui.graphics.ImageAsset
+import androidx.ui.graphics.asAndroidBitmap
 import androidx.ui.graphics.imageFromResource
 import androidx.ui.test.createComposeRule
+import androidx.ui.test.runOnIdleCompose
 import com.google.common.truth.Truth.assertThat
 import org.junit.Rule
 import org.junit.Test
@@ -84,25 +86,28 @@
             }
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(pendingExecutor.runnable).isNotNull()
             assertThat(res!!.resource).isInstanceOf(PendingResource::class.java)
             assertThat(res!!.resource.resource).isNotNull()
-            assertThat(res!!.resource.resource!!.nativeImage.sameAs(pendingImage.nativeImage))
+            assertThat(res!!.resource.resource!!.asAndroidBitmap().sameAs(pendingImage
+                .asAndroidBitmap()))
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             pendingExecutor.runNow() // load the resource
             assertThat(uiThreadWork).isNotNull()
             // update @Model object so that recompose is expected to be triggered.
             uiThreadWork?.invoke()
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(pendingExecutor.runnable).isNull()
             assertThat(res!!.resource).isInstanceOf(LoadedResource::class.java)
             assertThat(res!!.resource.resource).isNotNull()
-            assertThat(res!!.resource.resource!!.nativeImage.sameAs(loadedImage.nativeImage))
+            assertThat(res!!.resource.resource!!
+                .asAndroidBitmap()
+                .sameAs(loadedImage.asAndroidBitmap()))
                 .isTrue()
         }
     }
@@ -138,26 +143,30 @@
             }
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(pendingExecutor.runnable).isNotNull()
             assertThat(res!!.resource).isInstanceOf(PendingResource::class.java)
             assertThat(res!!.resource.resource).isNotNull()
-            assertThat(res!!.resource.resource!!.nativeImage.sameAs(pendingImage.nativeImage))
+            assertThat(res!!.resource.resource!!
+                .asAndroidBitmap()
+                .sameAs(pendingImage.asAndroidBitmap()))
                 .isTrue()
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             pendingExecutor.runNow() // load the resource
             assertThat(uiThreadWork).isNotNull()
             // update @Model object so that recompose is expected to be triggered.
             uiThreadWork?.invoke()
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(pendingExecutor.runnable).isNull()
             assertThat(res!!.resource).isInstanceOf(FailedResource::class.java)
             assertThat(res!!.resource.resource).isNotNull()
-            assertThat(res!!.resource.resource!!.nativeImage.sameAs(failedImage.nativeImage))
+            assertThat(res!!.resource.resource!!
+                .asAndroidBitmap()
+                .sameAs(failedImage.asAndroidBitmap()))
                 .isTrue()
         }
     }
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/semantics/SemanticsTests.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/semantics/SemanticsTests.kt
index 0f2f42d..b437b4a 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/semantics/SemanticsTests.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/semantics/SemanticsTests.kt
@@ -31,6 +31,8 @@
 import androidx.ui.test.findByTag
 import androidx.ui.test.findByText
 import androidx.ui.test.assert
+import androidx.ui.test.runOnIdleCompose
+import androidx.ui.test.runOnUiThread
 import androidx.ui.unit.IntPx
 import androidx.ui.unit.ipx
 import androidx.ui.unit.max
@@ -51,7 +53,7 @@
 
     private fun executeUpdateBlocking(updateFunction: () -> Unit) {
         val latch = CountDownLatch(1)
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             updateFunction()
             latch.countDown()
         }
@@ -82,7 +84,7 @@
 
         findByTag(TestTag).assertLabelEquals(label)
 
-        composeTestRule.runOnIdleCompose { showSubtree.value = false }
+        runOnIdleCompose { showSubtree.value = false }
 
         findByTag(TestTag).assertDoesNotHaveProperty(SemanticsProperties.AccessibilityLabel)
 
@@ -122,7 +124,7 @@
             .assertLabelEquals(label)
             .assertDoesNotHaveProperty(SemanticsProperties.AccessibilityValue)
 
-        composeTestRule.runOnIdleCompose { showNewNode.value = true }
+        runOnIdleCompose { showNewNode.value = true }
 
         findByTag(TestTag)
             .assertLabelEquals(label)
@@ -152,7 +154,7 @@
 
         findAllByText(label).assertCountEquals(1)
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             showSubtree.value = false
         }
 
@@ -179,7 +181,7 @@
 
         findByTag(TestTag).assertLabelEquals(beforeLabel)
 
-        composeTestRule.runOnIdleCompose { isAfter.value = true }
+        runOnIdleCompose { isAfter.value = true }
 
         findByTag(TestTag).assertLabelEquals(afterLabel)
     }
@@ -209,7 +211,7 @@
 
         findByTag(TestTag).assertLabelEquals(beforeLabel)
 
-        composeTestRule.runOnIdleCompose { isAfter.value = true }
+        runOnIdleCompose { isAfter.value = true }
 
         findByTag(TestTag).assertLabelEquals(afterLabel)
     }
@@ -236,7 +238,7 @@
 
         findByTag(TestTag).assertLabelEquals(beforeLabel)
 
-        composeTestRule.runOnIdleCompose { isAfter.value = true }
+        runOnIdleCompose { isAfter.value = true }
 
         findByTag(TestTag).assertLabelEquals(afterLabel)
     }
@@ -263,7 +265,7 @@
 
         findByTag(TestTag).assertLabelEquals(beforeLabel)
 
-        composeTestRule.runOnIdleCompose { isAfter.value = true }
+        runOnIdleCompose { isAfter.value = true }
 
         findByTag(TestTag).assertLabelEquals(afterLabel)
     }
@@ -334,7 +336,7 @@
 
         findByTag(TestTag).assertLabelEquals(beforeLabel)
 
-        composeTestRule.runOnIdleCompose { isAfter.value = true }
+        runOnIdleCompose { isAfter.value = true }
 
         findByTag(TestTag).assertLabelEquals(afterLabel)
     }
@@ -368,7 +370,7 @@
         findByTag(TestTag).assertLabelEquals(beforeLabel)
         assertThat(nodeCount).isEqualTo(1)
 
-        composeTestRule.runOnIdleCompose { isAfter.value = true }
+        runOnIdleCompose { isAfter.value = true }
 
         // Make sure everything is still behaving as expected
         findByTag(TestTag).assertLabelEquals(afterLabel)
diff --git a/ui/ui-android-view/src/androidTest/java/androidx/ui/androidview/test/ComposedViewTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/viewinterop/ComposedViewTest.kt
similarity index 96%
rename from ui/ui-android-view/src/androidTest/java/androidx/ui/androidview/test/ComposedViewTest.kt
rename to ui/ui-framework/src/androidTest/java/androidx/ui/viewinterop/ComposedViewTest.kt
index 23972b5..b796077 100644
--- a/ui/ui-android-view/src/androidTest/java/androidx/ui/androidview/test/ComposedViewTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/viewinterop/ComposedViewTest.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.ui.androidview.test
+package androidx.ui.viewinterop
 
 import android.util.TypedValue
 import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
@@ -24,7 +24,7 @@
 import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
 import androidx.test.espresso.matcher.ViewMatchers.withClassName
 import androidx.test.filters.SmallTest
-import androidx.ui.androidview.AndroidView
+import androidx.ui.framework.test.R
 import androidx.ui.test.createComposeRule
 import org.hamcrest.CoreMatchers.endsWith
 import org.hamcrest.CoreMatchers.instanceOf
diff --git a/ui/ui-framework/src/androidTest/res/font/sample_font.ttf b/ui/ui-framework/src/androidTest/res/font/sample_font.ttf
deleted file mode 100644
index 382a737..0000000
--- a/ui/ui-framework/src/androidTest/res/font/sample_font.ttf
+++ /dev/null
Binary files differ
diff --git a/ui/ui-android-view/src/androidTest/res/layout/test_layout.xml b/ui/ui-framework/src/androidTest/res/layout/test_layout.xml
similarity index 100%
rename from ui/ui-android-view/src/androidTest/res/layout/test_layout.xml
rename to ui/ui-framework/src/androidTest/res/layout/test_layout.xml
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/Draw.kt b/ui/ui-framework/src/main/java/androidx/ui/core/Draw.kt
index 97b43aa..45688bd 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/Draw.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/Draw.kt
@@ -55,8 +55,8 @@
 
 /**
  * A Draw scope that accepts children to allow modifying the canvas for children.
- * The [children] are drawn when [DrawReceiver.drawChildren] is called.
- * If the [onPaint] does not call [DrawReceiver.drawChildren] then it will be called
+ * The [children] are drawn when [ContentDrawScope.drawContent] is called.
+ * If the [onPaint] does not call [ContentDrawScope.drawContent] then it will be called
  * after the lambda.
  *
  * *Deprecated:* Draw composable is a common source of bugs as it's not a layout and takes parent
@@ -74,7 +74,7 @@
 )
 inline fun Draw(
     crossinline children: @Composable() () -> Unit,
-    noinline onPaint: DrawReceiver.(canvas: Canvas, parentSize: PxSize) -> Unit
+    noinline onPaint: ContentDrawScope.(canvas: Canvas, parentSize: PxSize) -> Unit
 ) {
     DrawNode(onPaintWithChildren = onPaint) {
         children()
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/Layout.kt b/ui/ui-framework/src/main/java/androidx/ui/core/Layout.kt
index 6809492..edb931b 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/Layout.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/Layout.kt
@@ -75,7 +75,7 @@
     maxIntrinsicWidthMeasureBlock: IntrinsicMeasureBlock,
     /*crossinline*/
     maxIntrinsicHeightMeasureBlock: IntrinsicMeasureBlock,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     /*crossinline*/
     measureBlock: MeasureBlock
 ) {
@@ -140,7 +140,7 @@
 /*inline*/ fun Layout(
     /*crossinline*/
     children: @Composable() () -> Unit,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     /*noinline*/
     measureBlock: MeasureBlock
 ) {
@@ -164,7 +164,7 @@
 @Deprecated("This composable is temporary to enable quicker prototyping in ConstraintLayout. " +
         "It should not be used in app code directly.")
 fun MultiMeasureLayout(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() () -> Unit,
     measureBlock: MeasureBlock
 ) {
@@ -178,7 +178,7 @@
 @Deprecated("This composable supports our transition from single child composables to modifiers. " +
         "It should not be used in app code directly.")
 fun PassThroughLayout(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() () -> Unit
 ) {
     val measureBlocks = remember {
@@ -202,7 +202,8 @@
  */
 private class DummyPlaceable(width: IntPx, height: IntPx) : Placeable() {
     override fun get(line: AlignmentLine): IntPx? = null
-    override val size = IntPxSize(width, height)
+    override val measurementConstraints = Constraints()
+    override val measuredSize = IntPxSize(width, height)
     override fun performPlace(position: IntPxPosition) { }
 }
 
@@ -417,7 +418,7 @@
  */
 @Composable
 fun WithConstraints(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() (Constraints, LayoutDirection) -> Unit
 ) {
     val state = remember { WithConstrainsState() }
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/PainterModifier.kt b/ui/ui-framework/src/main/java/androidx/ui/core/PainterModifier.kt
index 27279df..ccb8f5b 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/PainterModifier.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/PainterModifier.kt
@@ -18,7 +18,6 @@
 
 import androidx.compose.Composable
 import androidx.compose.remember
-import androidx.ui.graphics.Canvas
 import androidx.ui.graphics.ColorFilter
 import androidx.ui.graphics.DefaultAlpha
 import androidx.ui.graphics.ScaleFit
@@ -210,12 +209,7 @@
         return max(painterIntrinsicHeight, layoutHeight)
     }
 
-    override fun draw(
-        density: Density,
-        drawContent: () -> Unit,
-        canvas: Canvas,
-        size: PxSize
-    ) {
+    override fun ContentDrawScope.draw() {
         val intrinsicSize = painter.intrinsicSize
         val srcWidth = if (intrinsicSize.width.value != Float.POSITIVE_INFINITY) {
             intrinsicSize.width
@@ -241,17 +235,17 @@
         val dx = alignedPosition.x.value.toFloat()
         val dy = alignedPosition.y.value.toFloat()
 
-        canvas.save()
-        canvas.translate(dx, dy)
-        canvas.scale(scale, scale)
+        save()
+        translate(dx, dy)
+        scale(scale, scale)
 
         painter.draw(
-            canvas = canvas,
+            canvas = this,
             bounds = PxSize(srcWidth, srcHeight),
             alpha = alpha,
             colorFilter = colorFilter,
             rtl = rtl)
 
-        canvas.restore()
+        restore()
     }
 }
\ No newline at end of file
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/Popup.kt b/ui/ui-framework/src/main/java/androidx/ui/core/Popup.kt
index 867389b..4c6ed19 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/Popup.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/Popup.kt
@@ -55,7 +55,9 @@
  * @sample androidx.ui.framework.samples.PopupSample
  *
  * @param alignment The alignment relative to the parent.
- * @param offset An offset from the original aligned position of the popup.
+ * @param offset An offset from the original aligned position of the popup. Offset respects the
+ * Ltr/Rtl context, thus in Ltr it will be added to the original aligned position and in Rtl it
+ * will be subtracted from it.
  * @param popupProperties Provides extended set of properties to configure the popup.
  * @param children The content to be displayed inside the popup.
  */
@@ -90,14 +92,14 @@
  *
  * @sample androidx.ui.framework.samples.DropdownPopupSample
  *
- * @param dropDownAlignment The left or right alignment below the parent.
+ * @param dropDownAlignment The start or end alignment below the parent.
  * @param offset An offset from the original aligned position of the popup.
  * @param popupProperties Provides extended set of properties to configure the popup.
  * @param children The content to be displayed inside the popup.
  */
 @Composable
 fun DropdownPopup(
-    dropDownAlignment: DropDownAlignment = DropDownAlignment.Left,
+    dropDownAlignment: DropDownAlignment = DropDownAlignment.Start,
     offset: IntPxPosition = IntPxPosition(IntPx.Zero, IntPx.Zero),
     popupProperties: PopupProperties = PopupProperties(),
     children: @Composable() () -> Unit
@@ -137,6 +139,7 @@
 ) {
     val context = ContextAmbient.current
     // TODO(b/139866476): Decide if we want to expose the AndroidComposeView
+    @Suppress("DEPRECATION")
     val owner = OwnerAmbient.current
     val providedTestTag = PopupTestTagAmbient.current
 
@@ -158,7 +161,7 @@
 
     // TODO(soboleva): Look at module arrangement so that Box can be
     // used instead of this custom Layout
-    // Get the parent's global position and size
+    // Get the parent's global position, size and layout direction
     Layout(children = emptyContent(), modifier = Modifier.onPositioned { childCoordinates ->
         val coordinates = childCoordinates.parentCoordinates!!
         // Get the global position of the parent
@@ -170,7 +173,10 @@
 
         // Update the popup's position
         popupLayout.updatePosition()
-    }) { _, _, _ -> layout(0.ipx, 0.ipx) {} }
+    }) { _, _, layoutDirection ->
+        popupLayout.popupPositionProperties.parentLayoutDirection = layoutDirection
+        layout(0.ipx, 0.ipx) {}
+    }
 
     onCommit {
         composition = popupLayout.setContent {
@@ -359,6 +365,7 @@
     var parentPosition = PxPosition.Origin
     var parentSize = PxSize.Zero
     var childrenSize = PxSize.Zero
+    var parentLayoutDirection: LayoutDirection = LayoutDirection.Ltr
 }
 
 /**
@@ -366,14 +373,16 @@
  * [DropDownAlignment] is used to specify how should [DropdownPopup] be aligned.
  */
 enum class DropDownAlignment {
-    Left,
-    Right
+    Start,
+    End
 }
 
 internal fun calculatePopupGlobalPosition(
     popupPositionProperties: PopupPositionProperties,
     alignment: Alignment
 ): IntPxPosition {
+    val layoutDirection = popupPositionProperties.parentLayoutDirection
+
     // TODO: Decide which is the best way to round to result without reimplementing Alignment.align
     var popupGlobalPosition = IntPxPosition(IntPx.Zero, IntPx.Zero)
 
@@ -382,14 +391,16 @@
         IntPxSize(
             popupPositionProperties.parentSize.width.round(),
             popupPositionProperties.parentSize.height.round()
-        )
+        ),
+        layoutDirection
     )
     // Get the aligned point inside the child
     val relativePopupPos = alignment.align(
         IntPxSize(
             popupPositionProperties.childrenSize.width.round(),
             popupPositionProperties.childrenSize.height.round()
-        )
+        ),
+        layoutDirection
     )
 
     // Add the global position of the parent
@@ -405,7 +416,11 @@
     popupGlobalPosition -= IntPxPosition(relativePopupPos.x, relativePopupPos.y)
 
     // Add the user offset
-    popupGlobalPosition += popupPositionProperties.offset
+    val offset = IntPxPosition(
+        popupPositionProperties.offset.x * (if (layoutDirection == LayoutDirection.Ltr) 1 else -1),
+        popupPositionProperties.offset.y
+    )
+    popupGlobalPosition += offset
 
     return popupGlobalPosition
 }
@@ -414,6 +429,8 @@
     popupPositionProperties: PopupPositionProperties,
     dropDownAlignment: DropDownAlignment
 ): IntPxPosition {
+    val layoutDirection = popupPositionProperties.parentLayoutDirection
+
     var popupGlobalPosition = IntPxPosition(IntPx.Zero, IntPx.Zero)
 
     // Add the global position of the parent
@@ -422,14 +439,27 @@
         popupPositionProperties.parentPosition.y.round()
     )
 
-    // The X coordinate of the popup relative to the parent is equal to the parent's width if
-    // aligned to the END or it is 0 otherwise
+    /*
+    * In LTR context aligns popup's left edge with the parent's left edge for Start alignment and
+    * parent's right edge for End alignment.
+    * In RTL context aligns popup's right edge with the parent's right edge for Start alignment and
+    * parent's left edge for End alignment.
+    */
     val alignmentPositionX =
-        if (dropDownAlignment == DropDownAlignment.Right) {
-            popupPositionProperties.parentSize.width.round()
+        if (dropDownAlignment == DropDownAlignment.Start) {
+            if (layoutDirection == LayoutDirection.Ltr) {
+                0.ipx
+            } else {
+                popupPositionProperties.parentSize.width.round() -
+                    popupPositionProperties.childrenSize.width.round()
+            }
         } else {
-            IntPx.Zero
-        }
+            if (layoutDirection == LayoutDirection.Ltr) {
+                popupPositionProperties.parentSize.width.round()
+            } else {
+                -popupPositionProperties.childrenSize.width.round()
+            }
+    }
 
     // The popup's position relative to the parent's top left corner
     val dropdownAlignmentPosition = IntPxPosition(
@@ -440,7 +470,11 @@
     popupGlobalPosition += dropdownAlignmentPosition
 
     // Add the user offset
-    popupGlobalPosition += popupPositionProperties.offset
+    val offset = IntPxPosition(
+        popupPositionProperties.offset.x * (if (layoutDirection == LayoutDirection.Ltr) 1 else -1),
+        popupPositionProperties.offset.y
+    )
+    popupGlobalPosition += offset
 
     return popupGlobalPosition
 }
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/Wrapper.kt b/ui/ui-framework/src/main/java/androidx/ui/core/Wrapper.kt
index 618af3d..a534288 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/Wrapper.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/Wrapper.kt
@@ -41,6 +41,7 @@
 import androidx.compose.setValue
 import androidx.ui.autofill.Autofill
 import androidx.ui.autofill.AutofillTree
+import androidx.ui.core.clipboard.ClipboardManager
 import androidx.ui.core.hapticfeedback.HapticFeedback
 import androidx.ui.core.input.FocusManager
 import androidx.ui.core.input.FocusManagerImpl
@@ -155,6 +156,7 @@
 fun ViewGroup.setContent(
     content: @Composable() () -> Unit
 ): Composition {
+    FrameManager.ensureStarted()
     val composeView =
         if (childCount > 0) {
             getChildAt(0) as? Owner
@@ -241,6 +243,7 @@
 
     val uriHandler = remember { AndroidUriHandler(context) }
 
+    @Suppress("DEPRECATION")
     Providers(
         ContextAmbient provides context,
         CoroutineContextAmbient provides coroutineContext,
@@ -249,7 +252,9 @@
         TextInputServiceAmbient provides owner.textInputService,
         FontLoaderAmbient provides owner.fontLoader,
         HapticFeedBackAmbient provides owner.hapticFeedBack,
+        ClipboardManagerAmbient provides owner.clipboardManager,
         AutofillTreeAmbient provides owner.autofillTree,
+        AutofillAmbient provides owner.autofill,
         ConfigurationAmbient provides configuration,
         OwnerAmbient provides owner,
         LayoutDirectionAmbient provides layoutDirection,
@@ -260,20 +265,52 @@
     )
 }
 
+/**
+ * Provides a [Context] that can be used by Android applications.
+ */
 val ContextAmbient = staticAmbientOf<Context>()
 
+/**
+ * Provides the [Density] to be used to transform between [density-independent pixel
+ * units (DP)][androidx.ui.unit.Dp] and [pixel units][androidx.ui.unit.Px] or
+ * [scale-independent pixel units (SP)][androidx.ui.unit.TextUnit] and
+ * [pixel units][androidx.ui.unit.Px]. This is typically used when a [DP][androidx.ui.unit.Dp]
+ * is provided and it must be converted in the body of [Layout] or [DrawModifier].
+ */
 val DensityAmbient = ambientOf<Density>(StructurallyEqual)
 
+/**
+ * Don't use this.
+ * @suppress
+ */
+@Deprecated(message = "This will be replaced with something more appropriate when suspend works.")
 val CoroutineContextAmbient = ambientOf<CoroutineContext>()
 
+/**
+ * The Android [Configuration]. The [Configuration] is useful for determining how to organize the
+ * UI.
+ */
 val ConfigurationAmbient = ambientOf<Configuration>(NeverEqual)
 
+/**
+ * Don't use this
+ * @suppress
+ */
 // TODO(b/139866476): The Owner should not be exposed via ambient
+@Deprecated(message = "This will be removed as of b/139866476")
 val OwnerAmbient = staticAmbientOf<Owner>()
 
+/**
+ * The ambient that can be used to trigger autofill actions. Eg. [Autofill.requestAutofillForNode].
+ */
 val AutofillAmbient = ambientOf<Autofill?>()
 
-// This will ultimately be replaced by Autofill Semantics (b/138604305).
+/**
+ * The ambient that can be used to add
+ * [AutofillNode][import androidx.ui.autofill.AutofillNode]s to the autofill tree. The
+ * [AutofillTree] is a temporary data structure that will be replaced by Autofill Semantics
+ * (b/138604305).
+ */
 val AutofillTreeAmbient = staticAmbientOf<AutofillTree>()
 
 val LayoutDirectionAmbient = ambientOf<LayoutDirection>()
@@ -282,12 +319,17 @@
 
 val TextInputServiceAmbient = staticAmbientOf<TextInputService?>()
 
+/**
+ * The default animation clock used for animations when an explicit clock isn't provided.
+ */
 val AnimationClockAmbient = staticAmbientOf<AnimationClockObservable>()
 
 val FontLoaderAmbient = staticAmbientOf<Font.ResourceLoader>()
 
 val UriHandlerAmbient = staticAmbientOf<UriHandler>()
 
+val ClipboardManagerAmbient = staticAmbientOf<ClipboardManager>()
+
 /**
  * The ambient to provide haptic feedback to the user.
  */
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/DoubleTapGestureDetector.kt b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/DoubleTapGestureFilter.kt
similarity index 93%
rename from ui/ui-framework/src/main/java/androidx/ui/core/gesture/DoubleTapGestureDetector.kt
rename to ui/ui-framework/src/main/java/androidx/ui/core/gesture/DoubleTapGestureFilter.kt
index 984568f..87b2cb3 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/DoubleTapGestureDetector.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/DoubleTapGestureFilter.kt
@@ -31,7 +31,6 @@
 import androidx.ui.unit.IntPxSize
 import androidx.ui.unit.PxPosition
 import androidx.ui.util.fastAny
-import androidx.ui.util.fastAny
 import kotlinx.coroutines.Job
 import kotlin.coroutines.CoroutineContext
 
@@ -51,17 +50,18 @@
  * Also, given that this gesture detector is so temporary, opting to not write substantial tests.
  */
 @Composable
-fun DoubleTapGestureDetector(
+fun Modifier.doubleTapGestureFilter(
     onDoubleTap: (PxPosition) -> Unit
 ): Modifier {
+    @Suppress("DEPRECATION")
     val coroutineContext = CoroutineContextAmbient.current
     // TODO(shepshapard): coroutineContext should be a field
-    val recognizer = remember { DoubleTapGestureRecognizer(coroutineContext) }
-    recognizer.onDoubleTap = onDoubleTap
-    return PointerInputModifierImpl(recognizer)
+    val filter = remember { DoubleTapGestureFilter(coroutineContext) }
+    filter.onDoubleTap = onDoubleTap
+    return this + PointerInputModifierImpl(filter)
 }
 
-internal class DoubleTapGestureRecognizer(
+internal class DoubleTapGestureFilter(
     val coroutineContext: CoroutineContext
 ) : PointerInputFilter() {
     lateinit var onDoubleTap: (PxPosition) -> Unit
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/DragGestureDetector.kt b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/DragGestureFilter.kt
similarity index 93%
rename from ui/ui-framework/src/main/java/androidx/ui/core/gesture/DragGestureDetector.kt
rename to ui/ui-framework/src/main/java/androidx/ui/core/gesture/DragGestureFilter.kt
index 9cda3da..26647c4 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/DragGestureDetector.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/DragGestureFilter.kt
@@ -56,7 +56,7 @@
  * touches it, dragging is immediately started so the animation stops and dragging can occur.
  */
 @Composable
-fun DragGestureDetector(
+fun Modifier.dragGestureFilter(
     dragObserver: DragObserver,
     canDrag: ((Direction) -> Boolean)? = null,
     startDragImmediately: Boolean = false
@@ -67,12 +67,14 @@
     // TODO(b/146427920): There is a gap here where RawPressStartGestureDetector can cause a call to
     //  DragObserver.onStart but if the pointer doesn't move and releases, (or if cancel is called)
     //  The appropriate callbacks to DragObserver will not be called.
-    return RawDragGestureDetector(glue.rawDragObserver, glue::enabledOrStarted) +
-            TouchSlopExceededGestureDetector(glue::enableDrag, canDrag) +
-            RawPressStartStartGestureDetector(
-                glue::startDrag,
-                startDragImmediately,
-                PointerEventPass.InitialDown)
+    return this
+        .rawDragGestureFilter(glue.rawDragObserver, glue::enabledOrStarted)
+        .touchSlopExceededGestureFilter(glue::enableDrag, canDrag)
+        .rawPressStartGestureFilter(
+            glue::startDrag,
+            startDragImmediately,
+            PointerEventPass.InitialDown
+        )
 }
 
 /**
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/LongPressDragGestureDetector.kt b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/LongPressDragGestureFilter.kt
similarity index 95%
rename from ui/ui-framework/src/main/java/androidx/ui/core/gesture/LongPressDragGestureDetector.kt
rename to ui/ui-framework/src/main/java/androidx/ui/core/gesture/LongPressDragGestureFilter.kt
index bb0b943..7e6428a 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/LongPressDragGestureDetector.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/LongPressDragGestureFilter.kt
@@ -118,19 +118,19 @@
  * @see LongPressDragObserver
  */
 @Composable
-fun LongPressDragGestureDetector(
+fun Modifier.longPressDragGestureFilter(
     longPressDragObserver: LongPressDragObserver
 ): Modifier {
     val glue = remember { LongPressDragGestureDetectorGlue() }
     glue.longPressDragObserver = longPressDragObserver
 
-    return RawDragGestureDetector(glue.dragObserver, glue::dragEnabled) +
-            PointerInputModifierImpl(glue) +
-            LongPressGestureDetector(glue.onLongPress)
+    return rawDragGestureFilter(glue.dragObserver, glue::dragEnabled)
+        .plus(PointerInputModifierImpl(glue))
+        .longPressGestureFilter(glue.onLongPress)
 }
 
 /**
- * Glues together the logic of [RawDragGestureDetector], [LongPressGestureDetector],
+ * Glues together the logic of [rawDragGestureFilter], [longPressGestureFilter],
  * and a custom [PointerInputHandler] to make LongPressDragGestureDetector work.
  */
 private class LongPressDragGestureDetectorGlue : PointerInputFilter() {
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/LongPressGestureDetector.kt b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/LongPressGestureFilter.kt
similarity index 95%
rename from ui/ui-framework/src/main/java/androidx/ui/core/gesture/LongPressGestureDetector.kt
rename to ui/ui-framework/src/main/java/androidx/ui/core/gesture/LongPressGestureFilter.kt
index 374ac2f..2a41f57 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/LongPressGestureDetector.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/LongPressGestureFilter.kt
@@ -49,16 +49,17 @@
  * (double tap, triple tap) and tap.
  */
 @Composable
-fun LongPressGestureDetector(
+fun Modifier.longPressGestureFilter(
     onLongPress: (PxPosition) -> Unit
 ): Modifier {
+    @Suppress("DEPRECATION")
     val coroutineContext = CoroutineContextAmbient.current
-    val recognizer = remember { LongPressGestureRecognizer(coroutineContext) }
-    recognizer.onLongPress = onLongPress
-    return PointerInputModifierImpl(recognizer)
+    val filter = remember { LongPressGestureFilter(coroutineContext) }
+    filter.onLongPress = onLongPress
+    return this + PointerInputModifierImpl(filter)
 }
 
-internal class LongPressGestureRecognizer(
+internal class LongPressGestureFilter(
     private val coroutineContext: CoroutineContext
 ) : PointerInputFilter() {
     lateinit var onLongPress: (PxPosition) -> Unit
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/PressIndicatorGestureDetector.kt b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/PressIndicatorGestureFilter.kt
similarity index 89%
rename from ui/ui-framework/src/main/java/androidx/ui/core/gesture/PressIndicatorGestureDetector.kt
rename to ui/ui-framework/src/main/java/androidx/ui/core/gesture/PressIndicatorGestureFilter.kt
index 707d16b..ad7dbd8 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/PressIndicatorGestureDetector.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/PressIndicatorGestureFilter.kt
@@ -49,24 +49,24 @@
  */
 // TODO(b/139020678): Probably has shared functionality with other press based detectors.
 @Composable
-fun PressIndicatorGestureDetector(
+fun Modifier.pressIndicatorGestureFilter(
     onStart: ((PxPosition) -> Unit)? = null,
     onStop: (() -> Unit)? = null,
     onCancel: (() -> Unit)? = null,
     enabled: Boolean = true
 ): Modifier {
-    val recognizer = remember { PressIndicatorGestureRecognizer() }
-    recognizer.onStart = onStart
-    recognizer.onStop = onStop
-    recognizer.onCancel = onCancel
-    recognizer.setEnabled(enabled)
-    return PointerInputModifierImpl(recognizer)
+    val filter = remember { PressIndicatorGestureFilter() }
+    filter.onStart = onStart
+    filter.onStop = onStop
+    filter.onCancel = onCancel
+    filter.setEnabled(enabled)
+    return this + PointerInputModifierImpl(filter)
 }
 
-internal class PressIndicatorGestureRecognizer : PointerInputFilter() {
+internal class PressIndicatorGestureFilter : PointerInputFilter() {
     /**
      * Called if the first pointer's down change was not consumed by the time this gesture
-     * recognizer receives it in the [PointerEventPass.PostUp] pass.
+     * filter receives it in the [PointerEventPass.PostUp] pass.
      *
      * This callback should be used to indicate that the press state should be shown.  An [Offset]
      * is provided to indicate where the first pointer made contact with this gesrure detector.
@@ -85,9 +85,9 @@
     /**
      * Called if onStart was attempted to be called (it may have been null), and either:
      * 1. Pointer movement was consumed by the time [PointerEventPass.PostDown] reaches this
-     * gesture recognizer.
+     * gesture filter.
      * 2. [setEnabled] is called with false.
-     * 3. This gesture recognizer is removed from the hierarchy, or it has no descendants
+     * 3. This [PointerInputFilter] is removed from the hierarchy, or it has no descendants
      * to define it's position or size.
      * 4. The Compose root is notified that it will no longer receive input, and thus onStop
      * will never be reached (For example, the Android View that hosts compose receives
@@ -101,16 +101,17 @@
     private var state = State.Idle
 
     /**
-     * Sets whether this gesture recognizer is enabled.  True by default.
+     * Sets whether this [PointerInputFilter] is enabled.  True by default.
      *
-     * When enabled, this gesture recognizer will act normally.
+     * When enabled, this [PointerInputFilter] will act normally.
      *
-     * When disabled, this gesture recognizer will not process any input.  No aspects
+     * When disabled, this [PointerInputFilter] will not process any input.  No aspects
      * of any [PointerInputChange]s will be consumed and no callbacks will be called.
      *
      * If the last callback that was attempted to be called was [onStart] ([onStart] may have
      * been false) and [enabled] is false, [onCancel] will be called.
      */
+    // TODO(shepshapard): Remove 'setEnabled'.  It serves no purpose anymore.
     fun setEnabled(enabled: Boolean) {
         if (state == State.Started) {
             // If the state is Started and we were passed true, we don't want to change it to
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/RawDragGestureDetector.kt b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/RawDragGestureFilter.kt
similarity index 96%
rename from ui/ui-framework/src/main/java/androidx/ui/core/gesture/RawDragGestureDetector.kt
rename to ui/ui-framework/src/main/java/androidx/ui/core/gesture/RawDragGestureFilter.kt
index d014b20..842bf74 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/RawDragGestureDetector.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/RawDragGestureFilter.kt
@@ -99,7 +99,7 @@
  * Note: By default, this gesture detector only waits for a single pointer to have moved to start
  * dragging.  It is extremely likely that you don't want to use this gesture detector directly, but
  * instead use a drag gesture detector that does wait for some other condition to have occurred
- * (such as [DragGestureDetector] which waits for a single pointer to have passed touch
+ * (such as [dragGestureFilter] which waits for a single pointer to have passed touch
  * slop before dragging starts).
  *
  * Dragging begins when the a single pointer has moved and either [canStartDragging] is null or
@@ -123,17 +123,17 @@
 // TODO(b/129784010): Consider also allowing onStart, onDrag, and onStop to be set individually (instead of all being
 //  set via DragObserver).
 @Composable
-fun RawDragGestureDetector(
+fun Modifier.rawDragGestureFilter(
     dragObserver: DragObserver,
     canStartDragging: (() -> Boolean)? = null
 ): Modifier {
-    val recognizer = remember { RawDragGestureRecognizer() }
-    recognizer.dragObserver = dragObserver
-    recognizer.canStartDragging = canStartDragging
-    return PointerInputModifierImpl(recognizer)
+    val filter = remember { RawDragGestureFilter() }
+    filter.dragObserver = dragObserver
+    filter.canStartDragging = canStartDragging
+    return this + PointerInputModifierImpl(filter)
 }
 
-internal class RawDragGestureRecognizer : PointerInputFilter() {
+internal class RawDragGestureFilter : PointerInputFilter() {
     private val velocityTrackers: MutableMap<PointerId, VelocityTracker> = mutableMapOf()
     private val downPositions: MutableMap<PointerId, PxPosition> = mutableMapOf()
     private var started = false
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/RawPressStartGestureDetector.kt b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/RawPressStartGestureFilter.kt
similarity index 91%
rename from ui/ui-framework/src/main/java/androidx/ui/core/gesture/RawPressStartGestureDetector.kt
rename to ui/ui-framework/src/main/java/androidx/ui/core/gesture/RawPressStartGestureFilter.kt
index f2c1899..09c53d5 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/RawPressStartGestureDetector.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/RawPressStartGestureFilter.kt
@@ -50,19 +50,19 @@
  * react to and consume down changes.  Defaults to [PointerEventPass.PostUp].
  */
 @Composable
-fun RawPressStartStartGestureDetector(
+fun Modifier.rawPressStartGestureFilter(
     onPressStart: (PxPosition) -> Unit,
     enabled: Boolean = false,
     executionPass: PointerEventPass = PointerEventPass.PostUp
 ): Modifier {
-    val recognizer = remember { RawPressStartGestureRecognizer() }
-    recognizer.onPressStart = onPressStart
-    recognizer.setEnabled(enabled = enabled)
-    recognizer.setExecutionPass(executionPass)
-    return PointerInputModifierImpl(recognizer)
+    val filter = remember { RawPressStartGestureFilter() }
+    filter.onPressStart = onPressStart
+    filter.setEnabled(enabled = enabled)
+    filter.setExecutionPass(executionPass)
+    return this + PointerInputModifierImpl(filter)
 }
 
-internal class RawPressStartGestureRecognizer : PointerInputFilter() {
+internal class RawPressStartGestureFilter : PointerInputFilter() {
 
     lateinit var onPressStart: (PxPosition) -> Unit
     private var enabled: Boolean = true
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/RawScaleGestureDetector.kt b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/RawScaleGestureFilter.kt
similarity index 93%
rename from ui/ui-framework/src/main/java/androidx/ui/core/gesture/RawScaleGestureDetector.kt
rename to ui/ui-framework/src/main/java/androidx/ui/core/gesture/RawScaleGestureFilter.kt
index 0c1fb9a..08aee3c 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/RawScaleGestureDetector.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/RawScaleGestureFilter.kt
@@ -29,8 +29,8 @@
 import androidx.ui.unit.IntPxSize
 
 /**
- * Observes various events sent by [RawScaleGestureDetector].  Implement and pass into
- * [RawScaleGestureDetector] so that [RawScaleGestureDetector] may call the functions when events
+ * Observes various events sent by [rawScaleGestureFilter].  Implement and pass into
+ * [rawScaleGestureFilter] so that [rawScaleGestureFilter] may call the functions when events
  * occur.
  */
 interface RawScaleObserver {
@@ -38,11 +38,11 @@
     /**
      * Override to be notified when scaling has started.
      *
-     * This will be called when scaling occurs (and when the associated [RawScaleGestureDetector]
+     * This will be called when scaling occurs (and when the associated [rawScaleGestureFilter]
      * is allowed to start). Always called just before [onScale] and isn't called again until
      * after [onStop].
      *
-     * @see RawScaleGestureDetector
+     * @see rawScaleGestureFilter
      * @see onScale
      * @see onStop
      */
@@ -101,7 +101,7 @@
  * Note: By default, this gesture detector will start as soon as the average distance between
  * pointers changes by just a little bit. It is likely that you don't want to use this gesture
  * detector directly, but instead use a scale gesture detector that is less aggressive about
- * starting (such as [RawScaleGestureDetector] which waits for a pointer to have passed touch slop
+ * starting (such as [rawScaleGestureFilter] which waits for a pointer to have passed touch slop
  * before starting).
  *
  * Scaling begins when the average distance between a set of pointers changes and either
@@ -118,18 +118,18 @@
  * canStartScaling is called for each pointer event to check to see if it is allowed to start.
  */
 @Composable
-fun RawScaleGestureDetector(
+fun Modifier.rawScaleGestureFilter(
     scaleObserver: RawScaleObserver,
     canStartScaling: (() -> Boolean)? = null
 ): Modifier {
-    val recognizer = remember { RawScaleGestureRecognizer() }
+    val filter = remember { RawScaleGestureFilter() }
     // TODO(b/129784010): Consider also allowing onStart, onScale, and onEnd to be set individually.
-    recognizer.scaleObserver = scaleObserver
-    recognizer.canStartScaling = canStartScaling
-    return PointerInputModifierImpl(recognizer)
+    filter.scaleObserver = scaleObserver
+    filter.canStartScaling = canStartScaling
+    return this + PointerInputModifierImpl(filter)
 }
 
-internal class RawScaleGestureRecognizer : PointerInputFilter() {
+internal class RawScaleGestureFilter : PointerInputFilter() {
     private var active = false
     lateinit var scaleObserver: RawScaleObserver
     var canStartScaling: (() -> Boolean)? = null
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/ScaleGestureDetector.kt b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/ScaleGestureFilter.kt
similarity index 89%
rename from ui/ui-framework/src/main/java/androidx/ui/core/gesture/ScaleGestureDetector.kt
rename to ui/ui-framework/src/main/java/androidx/ui/core/gesture/ScaleGestureFilter.kt
index f28636c..f40a43a 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/ScaleGestureDetector.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/ScaleGestureFilter.kt
@@ -21,8 +21,8 @@
 import androidx.ui.core.Modifier
 
 /**
- * Observes various events sent by [ScaleGestureDetector].  Implement and pass into
- * [ScaleGestureDetector] so that [ScaleGestureDetector] may call the functions when events occur.
+ * Observes various events sent by [scaleGestureFilter].  Implement and pass into
+ * [scaleGestureFilter] so that [scaleGestureFilter] may call the functions when events occur.
  */
 interface ScaleObserver {
     /**
@@ -33,7 +33,7 @@
      * [TouchSlop]). Always called just before [onScale] and isn't called again until
      * after [onStop].
      *
-     * @see ScaleGestureDetector
+     * @see scaleGestureFilter
      * @see onScale
      * @see onStop
      */
@@ -50,7 +50,7 @@
      * such that they are 20 pixels apart, the scaleFactor will be 2.  If 2 fingers that are 20
      * pixels apart move such that they are 10 pixels apart, the scaleFactor will be .5.
      *
-     * @see ScaleGestureDetector
+     * @see scaleGestureFilter
      * @see onStart
      * @see onStop
      *
@@ -64,7 +64,7 @@
      *
      * Only called after [onStart] and one or more calls to [onScale]
      *
-     * @see ScaleGestureDetector
+     * @see scaleGestureFilter
      * @see onStart
      * @see onScale
      */
@@ -95,21 +95,22 @@
  * was previously called. [RawScaleObserver.onStop] is called when no pointers remain.
  * [RawScaleObserver.onCancel] is called due to a system cancellation event.
  *
- * This gesture detector is similar to [RawScaleGestureDetector] except that it is made for more
+ * This gesture detector is similar to [rawScaleGestureFilter] except that it is made for more
  * standard use cases where touch slop should likely be respected and no "nested scaling" is
  * needed.
  *
  * @param scaleObserver The callback interface to report all events related to scaling.
  */
 @Composable
-fun ScaleGestureDetector(
+fun Modifier.scaleGestureFilter(
     scaleObserver: ScaleObserver
 ): Modifier {
     val glue = remember { TouchSlopScaleGestureDetectorGlue() }
     glue.scaleObserver = scaleObserver
 
-    return RawScaleGestureDetector(glue.rawScaleObserver, glue::scaleEnabled) +
-            ScaleSlopExceededGestureDetector(glue::enableScale)
+    return this
+        .rawScaleGestureFilter(glue.rawScaleObserver, glue::scaleEnabled)
+        .scaleSlopExceededGestureFilter(glue::enableScale)
 }
 
 /**
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/ScaleSlopExceededGestureDetector.kt b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/ScaleSlopExceededGestureFilter.kt
similarity index 87%
rename from ui/ui-framework/src/main/java/androidx/ui/core/gesture/ScaleSlopExceededGestureDetector.kt
rename to ui/ui-framework/src/main/java/androidx/ui/core/gesture/ScaleSlopExceededGestureFilter.kt
index 596c13b..56d5c96 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/ScaleSlopExceededGestureDetector.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/ScaleSlopExceededGestureFilter.kt
@@ -33,9 +33,9 @@
 /**
  * This gesture detector detects when a user's pointer input is intended to include scaling.
  *
- * This gesture detector is very similar to [RawScaleGestureDetector] except that instead of
+ * This gesture detector is very similar to [rawScaleGestureFilter] except that instead of
  * providing callbacks for scaling, it instead provides one callback for when a user is intending
- * to scale.  It does so using the same semantics as [RawScaleGestureDetector], and simply waits
+ * to scale.  It does so using the same semantics as [rawScaleGestureFilter], and simply waits
  * until the user has scaled just enough to suggest the user is truly intended to scale.
  *
  * The gesture is considered to include scaling when the absolute cumulative average change in
@@ -48,23 +48,23 @@
  * the average of the pointers than they were).
  */
 @Composable
-fun ScaleSlopExceededGestureDetector(
+fun Modifier.scaleSlopExceededGestureFilter(
     onScaleSlopExceeded: () -> Unit
 ): Modifier {
     val scaleSlop = with(DensityAmbient.current) { ScaleSlop.toPx() }
-    val recognizer = remember { ScaleSlopExceededGestureRecognizer(scaleSlop) }
+    val filter = remember { ScaleSlopExceededGestureFilter(scaleSlop) }
     // TODO(b/129784010): Consider also allowing onStart, onScale, and onEnd to be set individually.
-    recognizer.onScaleSlopExceeded = onScaleSlopExceeded
-    return PointerInputModifierImpl(recognizer)
+    filter.onScaleSlopExceeded = onScaleSlopExceeded
+    return this + PointerInputModifierImpl(filter)
 }
 
 /**
  * @param scaleSlop The absolute cumulative average change in distance of all pointers from the
  * average pointer over time that must be surpassed to indicate the user is trying to scale.
  *
- * @see ScaleSlopExceededGestureDetector
+ * @see scaleSlopExceededGestureFilter
  */
-internal class ScaleSlopExceededGestureRecognizer(private val scaleSlop: Px) : PointerInputFilter
+internal class ScaleSlopExceededGestureFilter(private val scaleSlop: Px) : PointerInputFilter
     () {
     lateinit var onScaleSlopExceeded: () -> Unit
 
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/TapGestureDetector.kt b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/TapGestureFilter.kt
similarity index 93%
rename from ui/ui-framework/src/main/java/androidx/ui/core/gesture/TapGestureDetector.kt
rename to ui/ui-framework/src/main/java/androidx/ui/core/gesture/TapGestureFilter.kt
index 2f2ee57..67f6621 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/TapGestureDetector.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/TapGestureFilter.kt
@@ -47,16 +47,16 @@
  */
 // TODO(b/139020678): Probably has shared functionality with other press based detectors.
 @Composable
-fun TapGestureDetector(
+fun Modifier.tapGestureFilter(
     onTap: () -> Unit
 ): Modifier {
-    val recognizer = remember { TapGestureRecognizer() }
-    recognizer.onTap = onTap
-    recognizer.consumeDownOnStart = false
-    return PointerInputModifierImpl(recognizer)
+    val filter = remember { TapGestureFilter() }
+    filter.onTap = onTap
+    filter.consumeDownOnStart = false
+    return this + PointerInputModifierImpl(filter)
 }
 
-internal class TapGestureRecognizer : PointerInputFilter() {
+internal class TapGestureFilter : PointerInputFilter() {
     /**
      * Called to indicate that a press gesture has successfully completed.
      *
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/TouchSlopExceededGestureDetector.kt b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/TouchSlopExceededGestureFilter.kt
similarity index 95%
rename from ui/ui-framework/src/main/java/androidx/ui/core/gesture/TouchSlopExceededGestureDetector.kt
rename to ui/ui-framework/src/main/java/androidx/ui/core/gesture/TouchSlopExceededGestureFilter.kt
index fb0f5e8..3ed2f05 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/TouchSlopExceededGestureDetector.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/TouchSlopExceededGestureFilter.kt
@@ -43,20 +43,20 @@
  * If [canDrag] is not provided, touch slop will be able to be exceeded in all directions.
  */
 @Composable
-fun TouchSlopExceededGestureDetector(
+fun Modifier.touchSlopExceededGestureFilter(
     onTouchSlopExceeded: () -> Unit,
     canDrag: ((Direction) -> Boolean)? = null
 ): Modifier {
     val touchSlop = with(DensityAmbient.current) { TouchSlop.toPx() }
-    val recognizer = remember { TouchSlopExceededGestureRecognizer(touchSlop) }
-    recognizer.canDrag = canDrag
-    recognizer.onTouchSlopExceeded = onTouchSlopExceeded
-    return PointerInputModifierImpl(recognizer)
+    val filter = remember { TouchSlopExceededGestureFilter(touchSlop) }
+    filter.canDrag = canDrag
+    filter.onTouchSlopExceeded = onTouchSlopExceeded
+    return this + PointerInputModifierImpl(filter)
 }
 
 // TODO(shepshapard): Shouldn't touchSlop be Px and not IntPx? What if the density bucket of the
 //  device is not a whole number?
-internal class TouchSlopExceededGestureRecognizer(
+internal class TouchSlopExceededGestureFilter(
     private val touchSlop: Px
 ) : PointerInputFilter() {
     private val pointerTrackers: MutableMap<PointerId, PointerTrackingData> = mutableMapOf()
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/constants.kt b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/constants.kt
index 36466f7..815a84c 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/gesture/constants.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/gesture/constants.kt
@@ -33,16 +33,15 @@
 
 /**
  * Maximum length of time between a tap down and a tap up for the gesture to be
- * considered a tap. (Currently not honored by the TapGestureRecognizer.)
+ * considered a tap. (Currently not honored by the TapGestureFilter.)
  */
-// TODO(shepshapard): Remove this, or implement a hover-tap gesture recognizer which
+// TODO(shepshapard): Remove this, or implement a hover-tap gesture filter which
 // uses this.
 val HoverTapTimeout: Duration = 150.milliseconds
 
 /**
  * Maximum distance between the down and up pointers for a tap. (Currently not
- * honored by the [TapGestureRecognizer]; [PrimaryPointerGestureRecognizer],
- * which TapGestureRecognizer inherits from, uses [kTouchSlop].)
+ * honored by the [TapGestureFilter].
  */
 // TODO(shepshapard): Remove this or implement it correctly.
 val HoverTapSlop = 20.dp
@@ -61,7 +60,7 @@
 /**
  * The minimum time from the end of the first tap to the start of the second
  * tap in a double-tap gesture. (Currently not honored by the
- * DoubleTapGestureRecognizer.)
+ * DoubleTapGestureFilter.)
  */
 // TODO(shepshapard): Either implement this or remove the constant.
 val DoubleTapMinTime: Duration = 40.milliseconds
@@ -79,7 +78,7 @@
 /**
  * The maximum distance that the first touch in a double-tap gesture can travel
  * before deciding that it is not part of a double-tap gesture.
- * DoubleTapGestureRecognizer also restricts the second touch to this distance.
+ * DoubleTapGestureFilter also restricts the second touch to this distance.
  */
 val DoubleTapTouchSlop = TouchSlop
 
@@ -101,7 +100,7 @@
  * the gesture is a paging gesture. (Currently not used, because paging uses a
  * regular drag gesture, which uses kTouchSlop.)
  */
-// TODO(shepshapard): Create variants of HorizontalDragGestureRecognizer et al for
+// TODO(shepshapard): Create variants of HorizontalDragGestureFilter et al for
 // paging, which use this constant.
 val PagingTouchSlop = TouchSlop * 2.dp
 
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt b/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt
index b2e95c6..df633a5 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt
@@ -21,6 +21,7 @@
 import androidx.compose.remember
 import androidx.compose.state
 import androidx.ui.core.Alignment
+import androidx.ui.core.ClipboardManagerAmbient
 import androidx.ui.core.Constraints
 import androidx.ui.core.HapticFeedBackAmbient
 import androidx.ui.core.Layout
@@ -29,9 +30,9 @@
 import androidx.ui.core.Placeable
 import androidx.ui.core.Popup
 import androidx.ui.core.enforce
-import androidx.ui.core.gesture.DragGestureDetector
-import androidx.ui.core.gesture.LongPressDragGestureDetector
-import androidx.ui.core.gesture.TapGestureDetector
+import androidx.ui.core.gesture.longPressDragGestureFilter
+import androidx.ui.core.gesture.tapGestureFilter
+import androidx.ui.core.gesture.dragGestureFilter
 import androidx.ui.core.hasFixedHeight
 import androidx.ui.core.hasFixedWidth
 import androidx.ui.core.onPositioned
@@ -76,11 +77,14 @@
     val manager = remember { SelectionManager(registrarImpl) }
 
     manager.hapticFeedBack = HapticFeedBackAmbient.current
+    manager.clipboardManager = ClipboardManagerAmbient.current
     manager.onSelectionChange = onSelectionChange
     manager.selection = selection
 
-    val gestureModifiers = TapGestureDetector({ manager.onRelease() }) +
-            LongPressDragGestureDetector(manager.longPressDragObserver)
+    val gestureModifiers =
+        Modifier
+            .tapGestureFilter({ manager.onRelease() })
+            .longPressDragGestureFilter(manager.longPressDragObserver)
 
     Providers(SelectionRegistrarAmbient provides registrarImpl) {
         // Get the layout coordinates of the selection container. This is for hit test of
@@ -133,7 +137,7 @@
                 },
                 offset = IntPxPosition(startOffset.x.value.toIntPx(), startOffset.y.value.toIntPx())
             ) {
-                val drag = DragGestureDetector(
+                val drag = Modifier.dragGestureFilter(
                     dragObserver = manager.handleDragObserver(isStartHandle = true)
                 )
                 // TODO(b/150706555): This layout is temporary and should be removed once Semantics
@@ -153,7 +157,7 @@
                 },
                 offset = IntPxPosition(endOffset.x.value.toIntPx(), endOffset.y.value.toIntPx())
             ) {
-                val drag = DragGestureDetector(
+                val drag = Modifier.dragGestureFilter(
                     dragObserver = manager.handleDragObserver(isStartHandle = false)
                 )
                 // TODO(b/150706555): This layout is temporary and should be removed once Semantics
@@ -172,7 +176,7 @@
  * the children.
  */
 @Composable
-private fun Wrap(modifier: Modifier = Modifier.None, children: @Composable() () -> Unit) {
+private fun Wrap(modifier: Modifier = Modifier, children: @Composable() () -> Unit) {
     Layout(modifier = modifier, children = children) { measurables, constraints, _ ->
         val placeables = measurables.map { measurable ->
             measurable.measure(constraints)
@@ -199,7 +203,7 @@
  */
 @Composable
 internal fun SimpleContainer(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     width: Dp? = null,
     height: Dp? = null,
     children: @Composable() () -> Unit
@@ -244,7 +248,7 @@
                         containerHeight - it.height
                     )
                 )
-                it.placeAbsolute(
+                it.place(
                     position.x,
                     position.y
                 )
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionHandles.kt b/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionHandles.kt
index e04641f..20d4459 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionHandles.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionHandles.kt
@@ -21,16 +21,14 @@
 import androidx.compose.remember
 import androidx.ui.core.Layout
 import androidx.ui.core.Modifier
+import androidx.ui.core.DrawScope
 import androidx.ui.core.drawBehind
 import androidx.ui.geometry.Rect
-import androidx.ui.graphics.Canvas
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.Paint
 import androidx.ui.graphics.Path
 import androidx.ui.text.style.TextDirection
-import androidx.ui.unit.Density
 import androidx.ui.unit.Dp
-import androidx.ui.unit.PxSize
 import androidx.ui.unit.dp
 
 internal val HANDLE_WIDTH = 25.dp
@@ -41,7 +39,7 @@
 private fun SelectionHandle(left: Boolean) {
     val paint = remember { Paint().also { it.isAntiAlias = true } }
     paint.color = HANDLE_COLOR
-    HandleDrawLayout(width = HANDLE_WIDTH, height = HANDLE_HEIGHT) { canvas, _ ->
+    HandleDrawLayout(width = HANDLE_WIDTH, height = HANDLE_HEIGHT) {
         val path = Path().apply {
             addRect(
                 Rect(
@@ -68,7 +66,7 @@
                 )
             )
         }
-        canvas.drawPath(path, paint)
+        drawPath(path, paint)
     }
 }
 
@@ -81,7 +79,7 @@
 private fun HandleDrawLayout(
     width: Dp,
     height: Dp,
-    onCanvas: Density.(Canvas, PxSize) -> Unit
+    onCanvas: DrawScope.() -> Unit
 ) {
     Layout(emptyContent(), Modifier.drawBehind(onCanvas)) { _, _, _ ->
         // take width and height space of the screen and allow draw modifier to draw inside of it
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionManager.kt b/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionManager.kt
index cd65aae..77c3d77 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionManager.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionManager.kt
@@ -17,6 +17,7 @@
 package androidx.ui.core.selection
 
 import androidx.ui.core.LayoutCoordinates
+import androidx.ui.core.clipboard.ClipboardManager
 import androidx.ui.core.gesture.DragObserver
 import androidx.ui.core.gesture.LongPressDragObserver
 import androidx.ui.core.hapticfeedback.HapticFeedback
@@ -49,6 +50,11 @@
     var hapticFeedBack: HapticFeedback? = null
 
     /**
+     * [ClipboardManager] to perform clipboard features.
+     */
+    var clipboardManager: ClipboardManager? = null
+
+    /**
      * Layout Coordinates of the selection container.
      */
     lateinit var containerLayoutCoordinates: LayoutCoordinates
@@ -141,6 +147,11 @@
         return selectedText
     }
 
+    internal fun copy() {
+        val selectedText = getSelectedText()
+        selectedText?.let { clipboardManager?.setText(it) }
+    }
+
     // This is for PressGestureDetector to cancel the selection.
     fun onRelease() {
         // Call mergeSelections with an out of boundary input to inform all text widgets to
diff --git a/ui/ui-framework/src/main/java/androidx/ui/focus/FocusModifierProvider.kt b/ui/ui-framework/src/main/java/androidx/ui/focus/FocusModifierProvider.kt
new file mode 100644
index 0000000..53e1f6a
--- /dev/null
+++ b/ui/ui-framework/src/main/java/androidx/ui/focus/FocusModifierProvider.kt
@@ -0,0 +1,33 @@
+/*
+ * 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.ui.focus
+
+import androidx.compose.Composable
+import androidx.compose.remember
+import androidx.ui.core.focus.createFocusModifier
+
+/**
+ * Use this function to create an instance of [FocusModifier]. Adding a [FocusModifier] to a
+ * [Composable] makes it focusable.
+ */
+@Composable
+fun FocusModifier(): FocusModifier = remember { createFocusModifier(FocusDetailedState.Inactive) }
+
+/**
+ * This function returns the [FocusState] for the component wrapped by this [FocusModifier].
+ */
+val FocusModifier.focusState: FocusState get() = focusDetailedState.focusState()
\ No newline at end of file
diff --git a/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/VectorCompose.kt b/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/VectorCompose.kt
index aa9a721..2aba4f9 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/VectorCompose.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/VectorCompose.kt
@@ -196,10 +196,10 @@
     val vectorHeight = defaultHeight.value
     val vectorPxSize = PxSize(Px(vectorWidth), Px(vectorHeight))
 
-    return this.drawBehind { canvas, parentSize ->
-        val parentWidth = parentSize.width.value
-        val parentHeight = parentSize.height.value
-        val scale = scaleFit.scale(vectorPxSize, parentSize)
+    return this.drawBehind {
+        val parentWidth = size.width.value
+        val parentHeight = size.height.value
+        val scale = scaleFit.scale(vectorPxSize, size)
 
         val alignedPosition = alignment.align(
             IntPxSize(
@@ -215,9 +215,9 @@
         vector.root.scaleX = (vectorWidth / viewportWidth) * scale
         vector.root.scaleY = (vectorHeight / viewportHeight) * scale
 
-        canvas.withSave {
-            canvas.translate(translateX, translateY)
-            vector.draw(canvas, DefaultAlpha, ColorFilter(tintColor, tintBlendMode))
+        withSave {
+            translate(translateX, translateY)
+            vector.draw(this, DefaultAlpha, ColorFilter(tintColor, tintBlendMode))
         }
     }
 }
diff --git a/ui/ui-framework/src/main/java/androidx/ui/node/ViewInterop.kt b/ui/ui-framework/src/main/java/androidx/ui/node/ViewInterop.kt
index f3e7f04..80c1ba3 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/node/ViewInterop.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/node/ViewInterop.kt
@@ -95,8 +95,8 @@
     // TODO(popam): forward pointer input, accessibility, focus
     // Prepare layout node that proxies measure and layout passes to the View.
     val layoutNode = LayoutNode()
-    layoutNode.modifier = Modifier.drawBehind { canvas, _ ->
-        draw(canvas.nativeCanvas)
+    layoutNode.modifier = Modifier.drawBehind {
+        draw(nativeCanvas)
     }
     layoutNode.onAttach = { owner ->
         (owner as? AndroidOwner)?.addAndroidView(this, layoutNode)
diff --git a/ui/ui-android-view/src/main/java/androidx/ui/androidview/ComposedView.kt b/ui/ui-framework/src/main/java/androidx/ui/viewinterop/ComposedView.kt
similarity index 98%
rename from ui/ui-android-view/src/main/java/androidx/ui/androidview/ComposedView.kt
rename to ui/ui-framework/src/main/java/androidx/ui/viewinterop/ComposedView.kt
index 2c24ae2..7f5b0ee 100644
--- a/ui/ui-android-view/src/main/java/androidx/ui/androidview/ComposedView.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/viewinterop/ComposedView.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.ui.androidview
+package androidx.ui.viewinterop
 
 import android.content.Context
 import android.view.LayoutInflater
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/DoubleTapGestureDetectorTest.kt b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/DoubleTapGestureFilterTest.kt
similarity index 62%
rename from ui/ui-framework/src/test/java/androidx/ui/core/gesture/DoubleTapGestureDetectorTest.kt
rename to ui/ui-framework/src/test/java/androidx/ui/core/gesture/DoubleTapGestureFilterTest.kt
index 6442fee..894fd81 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/DoubleTapGestureDetectorTest.kt
+++ b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/DoubleTapGestureFilterTest.kt
@@ -45,26 +45,26 @@
 
 @kotlinx.coroutines.ObsoleteCoroutinesApi
 @RunWith(JUnit4::class)
-class DoubleTapGestureDetectorTest {
+class DoubleTapGestureFilterTest {
 
     private val DoubleTapTimeoutMillis = 100.milliseconds
     @Suppress("DEPRECATION")
     private val testContext = kotlinx.coroutines.test.TestCoroutineContext()
     private val onDoubleTap: (PxPosition) -> Unit = mock()
-    private lateinit var mRecognizer: DoubleTapGestureRecognizer
+    private lateinit var filter: DoubleTapGestureFilter
 
     @Before
     fun setup() {
-        mRecognizer = DoubleTapGestureRecognizer(testContext)
-        mRecognizer.onDoubleTap = onDoubleTap
-        mRecognizer.doubleTapTimeout = DoubleTapTimeoutMillis
+        filter = DoubleTapGestureFilter(testContext)
+        filter.onDoubleTap = onDoubleTap
+        filter.doubleTapTimeout = DoubleTapTimeoutMillis
     }
 
     // Tests that verify conditions under which onDoubleTap will not be called.
 
     @Test
     fun onPointerInput_down_onDoubleTapNotCalled() {
-        mRecognizer::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
+        filter::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
         verify(onDoubleTap, never()).invoke(any())
     }
 
@@ -73,8 +73,8 @@
         val down = down(0, 0.milliseconds)
         val up = down.up(duration = 1.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up)
+        filter::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(up)
 
         verify(onDoubleTap, never()).invoke(any())
     }
@@ -85,10 +85,10 @@
         val up = down1.up(duration = 1.milliseconds)
         val down2 = down(2, 100.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
 
         verify(onDoubleTap, never()).invoke(any())
     }
@@ -99,10 +99,10 @@
         val up = down1.up(duration = 1.milliseconds)
         val down2 = down(2, 101.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up)
         testContext.advanceTimeBy(100, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
 
         verify(onDoubleTap, never()).invoke(any())
     }
@@ -114,11 +114,11 @@
         val down2 = down(2, 101.milliseconds)
         val up2 = down2.up(duration = 102.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(100, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap, never()).invoke(any())
     }
@@ -131,12 +131,12 @@
         val down2 = down(2, 101.milliseconds)
         val up2 = down2.up(duration = 102.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(moveConsumed)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(moveConsumed)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap, never()).invoke(any())
     }
@@ -149,12 +149,12 @@
         val moveConsumed = down2.moveTo(101.milliseconds, x = 1f).consume(dx = 1f)
         val up2 = moveConsumed.up(duration = 102.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(moveConsumed)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(moveConsumed)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap, never()).invoke(any())
     }
@@ -170,12 +170,12 @@
         val down2 = down(2, 101.milliseconds)
         val up2 = down2.up(duration = 102.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1A, down1B)
-        mRecognizer::onPointerInput.invokeOverAllPasses(moveConsumed1A, move1B)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1A, up1B)
+        filter::onPointerInput.invokeOverAllPasses(down1A, down1B)
+        filter::onPointerInput.invokeOverAllPasses(moveConsumed1A, move1B)
+        filter::onPointerInput.invokeOverAllPasses(up1A, up1B)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap, never()).invoke(any())
     }
@@ -191,12 +191,12 @@
         val up2A = moveConsumed2A.up(duration = 102.milliseconds)
         val up2B = move2B.up(duration = 102.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up2)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2A, down2B)
-        mRecognizer::onPointerInput.invokeOverAllPasses(moveConsumed2A, move2B)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2A, up2B)
+        filter::onPointerInput.invokeOverAllPasses(down2A, down2B)
+        filter::onPointerInput.invokeOverAllPasses(moveConsumed2A, move2B)
+        filter::onPointerInput.invokeOverAllPasses(up2A, up2B)
 
         verify(onDoubleTap, never()).invoke(any())
     }
@@ -208,11 +208,11 @@
         val down2 = down(0, 100.milliseconds)
         val up2 = down2.up(duration = 102.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap, never()).invoke(any())
     }
@@ -224,11 +224,11 @@
         val down2 = down(0, 100.milliseconds)
         val up2 = down2.up(duration = 102.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap, never()).invoke(any())
     }
@@ -240,11 +240,11 @@
         val down2 = down(0, 100.milliseconds).consumeDownChange()
         val up2 = down2.up(duration = 102.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap, never()).invoke(any())
     }
@@ -256,11 +256,11 @@
         val down2 = down(0, 100.milliseconds)
         val up2 = down2.up(duration = 102.milliseconds).consumeDownChange()
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap, never()).invoke(any())
     }
@@ -276,11 +276,11 @@
         val move1A3 = move1A2.moveTo(102.milliseconds)
         val up2 = down2.up(duration = 102.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1A, down1B)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move1A1, up2B)
+        filter::onPointerInput.invokeOverAllPasses(down1A, down1B)
+        filter::onPointerInput.invokeOverAllPasses(move1A1, up2B)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move1A2, down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move1A3, up2)
+        filter::onPointerInput.invokeOverAllPasses(move1A2, down2)
+        filter::onPointerInput.invokeOverAllPasses(move1A3, up2)
 
         verify(onDoubleTap, never()).invoke(any())
     }
@@ -294,11 +294,11 @@
         val move2A = down2A.moveTo(101.milliseconds)
         val up2B = down2B.up(duration = 101.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2A, down2B)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move2A, up2B)
+        filter::onPointerInput.invokeOverAllPasses(down2A, down2B)
+        filter::onPointerInput.invokeOverAllPasses(move2A, up2B)
 
         verify(onDoubleTap, never()).invoke(any())
     }
@@ -311,11 +311,11 @@
         val down2 = down(0, 13.milliseconds, 0f, 0f)
         val up2 = down2.up(duration = 14.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(move, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(up, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(down, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(move, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(up, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(down2, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(up2, IntPxSize(1.ipx, 1.ipx))
 
         verify(onDoubleTap, never()).invoke(any())
     }
@@ -328,11 +328,11 @@
         val move2 = down2.moveTo(3.milliseconds, 1f, 1f)
         val up2 = down2.up(duration = 4.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(up, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(move2, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(down, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(up, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(down2, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(move2, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(up2, IntPxSize(1.ipx, 1.ipx))
 
         verify(onDoubleTap, never()).invoke(any())
     }
@@ -346,11 +346,11 @@
         val down2 = down(2, 100.milliseconds)
         val up2 = down2.up(duration = 101.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap).invoke(any())
     }
@@ -363,12 +363,12 @@
         val down2 = down(2, 101.milliseconds)
         val up2 = down2.up(duration = 102.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap).invoke(any())
     }
@@ -381,12 +381,12 @@
         val move = down2.moveTo(101.milliseconds, x = 1f)
         val up2 = move.up(duration = 102.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap).invoke(any())
     }
@@ -402,12 +402,12 @@
         val down2 = down(2, 101.milliseconds)
         val up2 = down2.up(duration = 102.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1A, down1B)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move1A, move1B)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1A, up1B)
+        filter::onPointerInput.invokeOverAllPasses(down1A, down1B)
+        filter::onPointerInput.invokeOverAllPasses(move1A, move1B)
+        filter::onPointerInput.invokeOverAllPasses(up1A, up1B)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap).invoke(any())
     }
@@ -423,12 +423,12 @@
         val up2A = move2A.up(duration = 102.milliseconds)
         val up2B = move2B.up(duration = 102.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2A, down2B)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move2A, move2B)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2A, up2B)
+        filter::onPointerInput.invokeOverAllPasses(down2A, down2B)
+        filter::onPointerInput.invokeOverAllPasses(move2A, move2B)
+        filter::onPointerInput.invokeOverAllPasses(up2A, up2B)
 
         verify(onDoubleTap).invoke(any())
     }
@@ -443,14 +443,14 @@
         val down3 = down(0, 5.milliseconds, 0f, 0f)
         val up3 = down3.up(6.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(move, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(up, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(down, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(move, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(up, IntPxSize(1.ipx, 1.ipx))
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(down3, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(up3, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(down2, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(up2, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(down3, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(up3, IntPxSize(1.ipx, 1.ipx))
 
         verify(onDoubleTap).invoke(any())
     }
@@ -467,16 +467,16 @@
         val down4 = down(0, 7.milliseconds, 0f, 0f)
         val up4 = down4.up(8.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(up, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(move2, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(down, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(up, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(down2, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(move2, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(up2, IntPxSize(1.ipx, 1.ipx))
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down3, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(up3, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(down4, IntPxSize(1.ipx, 1.ipx))
-        mRecognizer::onPointerInput.invokeOverAllPasses(up4, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(down3, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(up3, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(down4, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(up4, IntPxSize(1.ipx, 1.ipx))
 
         verify(onDoubleTap).invoke(any())
     }
@@ -492,12 +492,12 @@
         val wait2 = 50L
         val up2 = down2.up(duration = 101.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(wait1, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
         testContext.advanceTimeBy(wait2, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap).invoke(any())
     }
@@ -511,11 +511,11 @@
         val down2 = down(2, 100.milliseconds)
         val up2 = down2.up(duration = 101.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap).invoke(PxPosition.Origin)
     }
@@ -528,12 +528,12 @@
         val move2 = down2.moveTo(101.milliseconds, 3f, 5f)
         val up2 = move2.up(duration = 102.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(move2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap).invoke(PxPosition(3.px, 5.px))
     }
@@ -550,13 +550,13 @@
         val move2B2 = move2B1.moveTo(102.milliseconds, x = 7f, y = 11f)
         val up2B = move2B2.up(duration = 103.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2A, down2B)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move2A, move2B1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2A, move2B2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2B)
+        filter::onPointerInput.invokeOverAllPasses(down2A, down2B)
+        filter::onPointerInput.invokeOverAllPasses(move2A, move2B1)
+        filter::onPointerInput.invokeOverAllPasses(up2A, move2B2)
+        filter::onPointerInput.invokeOverAllPasses(up2B)
 
         verify(onDoubleTap).invoke(PxPosition((7).px, (11).px))
     }
@@ -566,7 +566,7 @@
     @Test
     fun onPointerInput_down_downNotConsumed() {
         val down = down(0, 0.milliseconds)
-        val result = mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        val result = filter::onPointerInput.invokeOverAllPasses(down)
         assertThat(result.consumed.downChange).isFalse()
     }
 
@@ -574,8 +574,8 @@
     fun onPointerInput_downUp_upNotConsumed() {
         val down = down(0, 0.milliseconds)
         val up = down.up(1.milliseconds)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
-        val result = mRecognizer::onPointerInput.invokeOverAllPasses(up)
+        filter::onPointerInput.invokeOverAllPasses(down)
+        val result = filter::onPointerInput.invokeOverAllPasses(up)
         assertThat(result.consumed.downChange).isFalse()
     }
 
@@ -585,10 +585,10 @@
         val up = down.up(1.milliseconds)
         val down2 = down(2, 100.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up)
+        filter::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(up)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        val result = mRecognizer::onPointerInput.invokeOverAllPasses(down2)
+        val result = filter::onPointerInput.invokeOverAllPasses(down2)
 
         assertThat(result.consumed.downChange).isFalse()
     }
@@ -600,11 +600,11 @@
         val down2 = down(2, 101.milliseconds)
         val up2 = down2.up(duration = 102.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up)
+        filter::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(up)
         testContext.advanceTimeBy(100, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        val result = mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        val result = filter::onPointerInput.invokeOverAllPasses(up2)
 
         assertThat(result.consumed.downChange).isFalse()
     }
@@ -616,11 +616,11 @@
         val down2 = down(2, 100.milliseconds)
         val up2 = down2.up(duration = 101.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up)
+        filter::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(up)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        val result = mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        val result = filter::onPointerInput.invokeOverAllPasses(up2)
 
         assertThat(result.consumed.downChange).isTrue()
     }
@@ -634,12 +634,12 @@
         val down2 = down(1, duration = 200.milliseconds)
         val up2 = down2.up(duration = 201.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
-        mRecognizer.onCancel()
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
+        filter.onCancel()
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap, never()).invoke(any())
     }
@@ -651,12 +651,12 @@
         val down2 = down(2, 200.milliseconds)
         val up2 = down2.up(duration = 201.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer.onCancel()
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter.onCancel()
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap, never()).invoke(any())
     }
@@ -668,12 +668,12 @@
         val down2 = down(1, duration = 200.milliseconds)
         val up2 = down2.up(duration = 201.milliseconds)
 
-        mRecognizer.onCancel()
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter.onCancel()
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap).invoke(any())
     }
@@ -686,13 +686,13 @@
         val down2 = down(2, duration = 200.milliseconds)
         val up2 = down2.up(duration = 201.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down0)
-        mRecognizer.onCancel()
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down0)
+        filter.onCancel()
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap).invoke(any())
     }
@@ -706,14 +706,14 @@
         val down2 = down(2, duration = 200.milliseconds)
         val up2 = down2.up(duration = 201.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up0)
-        mRecognizer.onCancel()
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down0)
+        filter::onPointerInput.invokeOverAllPasses(up0)
+        filter.onCancel()
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap).invoke(any())
     }
@@ -728,15 +728,15 @@
         val down3 = down(3, 200.milliseconds)
         val up3 = down3.up(duration = 201.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer.onCancel()
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down0)
+        filter::onPointerInput.invokeOverAllPasses(up0)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter.onCancel()
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down3)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up3)
+        filter::onPointerInput.invokeOverAllPasses(down3)
+        filter::onPointerInput.invokeOverAllPasses(up3)
 
         verify(onDoubleTap).invoke(any())
     }
@@ -753,17 +753,17 @@
         val down3 = down(3, 300.milliseconds)
         val up3 = down3.up(duration = 301.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up0)
+        filter::onPointerInput.invokeOverAllPasses(down0)
+        filter::onPointerInput.invokeOverAllPasses(up0)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
-        mRecognizer.onCancel()
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(up1)
+        filter.onCancel()
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down3)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up3)
+        filter::onPointerInput.invokeOverAllPasses(down3)
+        filter::onPointerInput.invokeOverAllPasses(up3)
 
         verify(onDoubleTap, times(2)).invoke(any())
     }
@@ -784,15 +784,15 @@
         val down2 = down(2, 102.milliseconds)
         val up2 = down2.up(duration = 103.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up0)
+        filter::onPointerInput.invokeOverAllPasses(down0)
+        filter::onPointerInput.invokeOverAllPasses(up0)
         testContext.advanceTimeBy(delay0, TimeUnit.MILLISECONDS)
-        mRecognizer.onCancel()
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
+        filter.onCancel()
+        filter::onPointerInput.invokeOverAllPasses(down1)
         testContext.advanceTimeBy(delay1, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up1)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up2)
+        filter::onPointerInput.invokeOverAllPasses(up1)
+        filter::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(up2)
 
         verify(onDoubleTap).invoke(any())
     }
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/LongPressGestureDetectorTest.kt b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/LongPressGestureFilterTest.kt
similarity index 75%
rename from ui/ui-framework/src/test/java/androidx/ui/core/gesture/LongPressGestureDetectorTest.kt
rename to ui/ui-framework/src/test/java/androidx/ui/core/gesture/LongPressGestureFilterTest.kt
index 8cc98de..095b73a 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/LongPressGestureDetectorTest.kt
+++ b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/LongPressGestureFilterTest.kt
@@ -43,28 +43,28 @@
 
 @kotlinx.coroutines.ObsoleteCoroutinesApi
 @RunWith(JUnit4::class)
-class LongPressGestureDetectorTest {
+class LongPressGestureFilterTest {
 
     private val LongPressTimeoutMillis = 100.milliseconds
     @Suppress("DEPRECATION")
     private val testContext = kotlinx.coroutines.test.TestCoroutineContext()
     private val onLongPress: (PxPosition) -> Unit = mock()
     private val customEventDispatcher: CustomEventDispatcher = mock()
-    private lateinit var mRecognizer: LongPressGestureRecognizer
+    private lateinit var filter: LongPressGestureFilter
 
     @Before
     fun setup() {
-        mRecognizer = LongPressGestureRecognizer(testContext)
-        mRecognizer.onLongPress = onLongPress
-        mRecognizer.longPressTimeout = LongPressTimeoutMillis
-        mRecognizer.onInit(customEventDispatcher)
+        filter = LongPressGestureFilter(testContext)
+        filter.onLongPress = onLongPress
+        filter.longPressTimeout = LongPressTimeoutMillis
+        filter.onInit(customEventDispatcher)
     }
 
     // Tests that verify conditions under which onLongPress will not be called.
 
     @Test
     fun onPointerInput_down_eventNotFired() {
-        mRecognizer::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
+        filter::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
 
         verify(onLongPress, never()).invoke(any())
         verify(customEventDispatcher, never()).dispatchCustomEvent(any())
@@ -72,7 +72,7 @@
 
     @Test
     fun onPointerInput_downWithinTimeout_eventNotFired() {
-        mRecognizer::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
+        filter::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
 
         verify(onLongPress, never()).invoke(any())
@@ -84,9 +84,9 @@
         val down = down(0)
         val move = down.moveBy(50.milliseconds, 1f, 1f).consume(1f, 0f)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
 
         verify(onLongPress, never()).invoke(any())
@@ -100,9 +100,9 @@
         val move0 = down0.moveBy(50.milliseconds, 1f, 1f).consume(1f, 0f)
         val move1 = down0.moveBy(50.milliseconds, 0f, 0f)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down0, down1)
+        filter::onPointerInput.invokeOverAllPasses(down0, down1)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move0, move1)
+        filter::onPointerInput.invokeOverAllPasses(move0, move1)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
 
         verify(onLongPress, never()).invoke(any())
@@ -114,9 +114,9 @@
         val down = down(0)
         val up = down.up(50.milliseconds).consumeDownChange()
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up)
+        filter::onPointerInput.invokeOverAllPasses(up)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
 
         verify(onLongPress, never()).invoke(any())
@@ -128,9 +128,9 @@
         val down = down(0)
         val up = down.up(50.milliseconds)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up)
+        filter::onPointerInput.invokeOverAllPasses(up)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
 
         verify(onLongPress, never()).invoke(any())
@@ -150,13 +150,13 @@
 
         // Act
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down0)
+        filter::onPointerInput.invokeOverAllPasses(down0)
 
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up0)
+        filter::onPointerInput.invokeOverAllPasses(up0)
 
         testContext.advanceTimeBy(1, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
 
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
 
@@ -169,9 +169,9 @@
     @Test
     fun onPointerInput_downMoveOutOfBoundsWait_eventNotFired() {
         var pointer = down(0, 0.milliseconds)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.moveTo(50.milliseconds, 1f, 0f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         testContext.advanceTimeBy(100, TimeUnit.MILLISECONDS)
 
         verify(onLongPress, never()).invoke(any())
@@ -182,7 +182,7 @@
 
     @Test
     fun onPointerInput_downBeyondTimeout_eventFiredOnce() {
-        mRecognizer::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
+        filter::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
         testContext.advanceTimeBy(100, TimeUnit.MILLISECONDS)
 
         verify(onLongPress).invoke(any())
@@ -191,7 +191,7 @@
 
     @Test
     fun onPointerInput_2DownBeyondTimeout_eventFiredOnce() {
-        mRecognizer::onPointerInput.invokeOverAllPasses(down(0), down(1))
+        filter::onPointerInput.invokeOverAllPasses(down(0), down(1))
         testContext.advanceTimeBy(100, TimeUnit.MILLISECONDS)
 
         verify(onLongPress).invoke(any())
@@ -201,15 +201,15 @@
     @Test
     fun onPointerInput_downMoveOutOfBoundsWaitUpThenDownWait_eventFiredOnce() {
         var pointer = down(0, 0.milliseconds)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.moveTo(50.milliseconds, 1f, 0f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         testContext.advanceTimeBy(100, TimeUnit.MILLISECONDS)
         pointer = pointer.up(105.milliseconds)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
 
         pointer = down(1, 200.milliseconds)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         testContext.advanceTimeBy(100, TimeUnit.MILLISECONDS)
 
         verify(onLongPress).invoke(any())
@@ -231,17 +231,17 @@
 
         // Act
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(
+        filter::onPointerInput.invokeOverAllPasses(
             down0
         )
 
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(
+        filter::onPointerInput.invokeOverAllPasses(
             move0, down1
         )
 
         testContext.advanceTimeBy(25, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(
+        filter::onPointerInput.invokeOverAllPasses(
             up0, move1
         )
 
@@ -258,9 +258,9 @@
         val down = down(0)
         val move = down.moveBy(50.milliseconds, 1f, 1f)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
 
         verify(onLongPress).invoke(any())
@@ -273,7 +273,7 @@
     fun onPointerInput_down_onLongPressCalledWithDownPosition() {
         val down = down(0, x = 13f, y = 17f)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         testContext.advanceTimeBy(100, TimeUnit.MILLISECONDS)
 
         verify(onLongPress).invoke(PxPosition(13.px, 17.px))
@@ -284,9 +284,9 @@
         val down = down(0, x = 13f, y = 17f)
         val move = down.moveTo(50.milliseconds, 7f, 5f)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
 
         verify(onLongPress).invoke(PxPosition((7).px, 5.px))
@@ -299,9 +299,9 @@
         val move0 = down0.moveBy(50.milliseconds, 0f, 0f)
         val down1 = down(1, 50.milliseconds, 11f, 19f)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down0)
+        filter::onPointerInput.invokeOverAllPasses(down0)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move0, down1)
+        filter::onPointerInput.invokeOverAllPasses(move0, down1)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
 
         verify(onLongPress).invoke(PxPosition(13.px, 17.px))
@@ -317,11 +317,11 @@
         val up0 = move0.up(75.milliseconds)
         val move1 = down1.moveBy(25.milliseconds, 0f, 0f)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down0)
+        filter::onPointerInput.invokeOverAllPasses(down0)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move0, down1)
+        filter::onPointerInput.invokeOverAllPasses(move0, down1)
         testContext.advanceTimeBy(25, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up0, move1)
+        filter::onPointerInput.invokeOverAllPasses(up0, move1)
         testContext.advanceTimeBy(25, TimeUnit.MILLISECONDS)
 
         verify(onLongPress).invoke(PxPosition(11.px, 19.px))
@@ -334,9 +334,9 @@
         val move0 = down0.moveTo(50.milliseconds, 27f, 29f)
         val down1 = down(1, 50.milliseconds, 11f, 19f)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down0)
+        filter::onPointerInput.invokeOverAllPasses(down0)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move0, down1)
+        filter::onPointerInput.invokeOverAllPasses(move0, down1)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
 
         verify(onLongPress).invoke(PxPosition(27.px, 29.px))
@@ -352,11 +352,11 @@
         val up0 = move0.up(50.milliseconds)
         val move1 = down1.moveTo(50.milliseconds, 27f, 23f)
 
-        mRecognizer::onPointerInput.invokeOverAllPasses(down0)
+        filter::onPointerInput.invokeOverAllPasses(down0)
         testContext.advanceTimeBy(25, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move0, down1)
+        filter::onPointerInput.invokeOverAllPasses(move0, down1)
         testContext.advanceTimeBy(25, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up0, move1)
+        filter::onPointerInput.invokeOverAllPasses(up0, move1)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
 
         verify(onLongPress).invoke(PxPosition(27.px, 23.px))
@@ -367,7 +367,7 @@
     @Test
     fun onPointerInput_1Down_notConsumed() {
         val down0 = down(0)
-        val result = mRecognizer::onPointerInput.invokeOverAllPasses(
+        val result = filter::onPointerInput.invokeOverAllPasses(
                 down0
         )
         assertThat(result.consumed.downChange).isFalse()
@@ -379,7 +379,7 @@
         // Arrange
 
         val down0 = down(0, 0.milliseconds)
-        mRecognizer::onPointerInput.invokeOverAllPasses(
+        filter::onPointerInput.invokeOverAllPasses(
                 down0
         )
 
@@ -388,7 +388,7 @@
         testContext.advanceTimeBy(10, TimeUnit.MILLISECONDS)
         val move0 = down0.moveTo(10.milliseconds, 0f, 0f)
         val down1 = down(0, 10.milliseconds)
-        val result = mRecognizer::onPointerInput.invokeOverAllPasses(
+        val result = filter::onPointerInput.invokeOverAllPasses(
                 move0, down1
         )
 
@@ -404,7 +404,7 @@
         // Arrange
 
         val down0 = down(0, 0.milliseconds)
-        mRecognizer::onPointerInput.invokeOverAllPasses(
+        filter::onPointerInput.invokeOverAllPasses(
                 down0
         )
 
@@ -412,7 +412,7 @@
 
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
         val up0 = down0.up(50.milliseconds)
-        val result = mRecognizer::onPointerInput.invokeOverAllPasses(
+        val result = filter::onPointerInput.invokeOverAllPasses(
                 up0
         )
 
@@ -427,7 +427,7 @@
         // Arrange
 
         val down0 = down(0, 0.milliseconds)
-        mRecognizer::onPointerInput.invokeOverAllPasses(
+        filter::onPointerInput.invokeOverAllPasses(
                 down0
         )
 
@@ -435,7 +435,7 @@
 
         testContext.advanceTimeBy(101, TimeUnit.MILLISECONDS)
         val up0 = down0.up(100.milliseconds)
-        val result = mRecognizer.onPointerInput(
+        val result = filter.onPointerInput(
             listOf(up0),
             PointerEventPass.InitialDown,
             IntPxSize(0.ipx, 0.ipx)
@@ -452,16 +452,16 @@
         // Arrange
 
         var pointer = down(0, 0.milliseconds)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
         testContext.advanceTimeBy(50, TimeUnit.MILLISECONDS)
         pointer = pointer.moveTo(50.milliseconds, 5f).consume(1f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
 
         // Act
 
         testContext.advanceTimeBy(51, TimeUnit.MILLISECONDS)
         pointer = pointer.up(100.milliseconds)
-        val result = mRecognizer::onPointerInput.invokeOverAllPasses(pointer)
+        val result = filter::onPointerInput.invokeOverAllPasses(pointer)
 
         // Assert
 
@@ -472,8 +472,8 @@
 
     @Test
     fun onCancel_downCancelBeyondTimeout_eventNotFired() {
-        mRecognizer::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
-        mRecognizer.onCancel()
+        filter::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
+        filter.onCancel()
         testContext.advanceTimeBy(100, TimeUnit.MILLISECONDS)
 
         verify(onLongPress, never()).invoke(any())
@@ -482,9 +482,9 @@
 
     @Test
     fun onCancel_downAlmostTimeoutCancelTimeout_eventNotFired() {
-        mRecognizer::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
+        filter::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer.onCancel()
+        filter.onCancel()
         testContext.advanceTimeBy(1, TimeUnit.MILLISECONDS)
 
         verify(onLongPress, never()).invoke(any())
@@ -493,10 +493,10 @@
 
     @Test
     fun onCancel_downCancelDownTimeExpires_eventFiredOnce() {
-        mRecognizer::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
+        filter::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
         testContext.advanceTimeBy(99, TimeUnit.MILLISECONDS)
-        mRecognizer.onCancel()
-        mRecognizer::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
+        filter.onCancel()
+        filter::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
         testContext.advanceTimeBy(100, TimeUnit.MILLISECONDS)
 
         verify(onLongPress).invoke(any())
@@ -507,8 +507,8 @@
 
     @Test
     fun onCustomEvent_downCustomEventTimeout_eventNotFired() {
-        mRecognizer::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
-        mRecognizer::onCustomEvent.invokeOverAllPasses(LongPressFiredEvent)
+        filter::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
+        filter::onCustomEvent.invokeOverAllPasses(LongPressFiredEvent)
         testContext.advanceTimeBy(100, TimeUnit.MILLISECONDS)
 
         verify(onLongPress, never()).invoke(any())
@@ -517,10 +517,10 @@
 
     @Test
     fun onCustomEvent_downCustomEventTimeoutDownTimeout_eventFiredOnce() {
-        mRecognizer::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
-        mRecognizer::onCustomEvent.invokeOverAllPasses(LongPressFiredEvent)
+        filter::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
+        filter::onCustomEvent.invokeOverAllPasses(LongPressFiredEvent)
         testContext.advanceTimeBy(100, TimeUnit.MILLISECONDS)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
+        filter::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
         testContext.advanceTimeBy(100, TimeUnit.MILLISECONDS)
 
         verify(onLongPress).invoke(any())
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/PressIndicatorGestureDetectorTest.kt b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/PressIndicatorGestureDetectorTest.kt
deleted file mode 100644
index 458840d..0000000
--- a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/PressIndicatorGestureDetectorTest.kt
+++ /dev/null
@@ -1,574 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License")
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.ui.core.gesture
-
-import androidx.ui.core.PointerEventPass
-import androidx.ui.core.consumeDownChange
-import androidx.ui.testutils.consume
-import androidx.ui.testutils.down
-import androidx.ui.testutils.invokeOverAllPasses
-import androidx.ui.testutils.invokeOverPasses
-import androidx.ui.testutils.moveBy
-import androidx.ui.testutils.moveTo
-import androidx.ui.testutils.up
-import androidx.ui.unit.IntPxSize
-import androidx.ui.unit.PxPosition
-import androidx.ui.unit.ipx
-import androidx.ui.unit.milliseconds
-import androidx.ui.unit.px
-import com.nhaarman.mockitokotlin2.any
-import com.nhaarman.mockitokotlin2.inOrder
-import com.nhaarman.mockitokotlin2.mock
-import com.nhaarman.mockitokotlin2.never
-import com.nhaarman.mockitokotlin2.times
-import com.nhaarman.mockitokotlin2.verify
-import com.nhaarman.mockitokotlin2.verifyNoMoreInteractions
-import org.hamcrest.CoreMatchers.`is`
-import org.hamcrest.MatcherAssert.assertThat
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@RunWith(JUnit4::class)
-class PressIndicatorGestureDetectorTest {
-
-    private lateinit var recognizer: PressIndicatorGestureRecognizer
-
-    @Before
-    fun setup() {
-        recognizer = PressIndicatorGestureRecognizer()
-        recognizer.onStart = mock()
-        recognizer.onStop = mock()
-        recognizer.onCancel = mock()
-    }
-
-    // Verification of scenarios where onStart should not be called.
-
-    @Test
-    fun onPointerInput_downConsumed_onStartNotCalled() {
-        recognizer::onPointerInput
-            .invokeOverAllPasses(down(0, 0.milliseconds).consumeDownChange())
-        verify(recognizer.onStart!!, never()).invoke(any())
-    }
-
-    @Test
-    fun onPointerInput_disabledDown_onStartNotCalled() {
-        recognizer.setEnabled(false)
-        recognizer::onPointerInput
-            .invokeOverAllPasses(down(0, 0.milliseconds).consumeDownChange())
-        verify(recognizer.onStart!!, never()).invoke(any())
-    }
-
-    // Verification of scenarios where onStart should be called once.
-
-    @Test
-    fun onPointerInput_down_onStartCalledOnce() {
-        recognizer::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
-        verify(recognizer.onStart!!).invoke(any())
-    }
-
-    @Test
-    fun onPointerInput_downDown_onStartCalledOnce() {
-        var pointer0 = down(0)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0)
-        pointer0 = pointer0.moveTo(1.milliseconds)
-        val pointer1 = down(1, 1.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
-
-        verify(recognizer.onStart!!).invoke(any())
-    }
-
-    @Test
-    fun onPointerInput_2Down1Up1Down_onStartCalledOnce() {
-        var pointer0 = down(0)
-        var pointer1 = down(1)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
-        pointer0 = pointer0.up(100.milliseconds)
-        pointer1 = pointer1.moveTo(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
-        pointer0 = down(0, duration = 200.milliseconds)
-        pointer1 = pointer1.moveTo(200.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
-
-        verify(recognizer.onStart!!).invoke(any())
-    }
-
-    @Test
-    fun onPointerInput_1DownMoveOutside2ndDown_onStartOnlyCalledOnce() {
-        var pointer0 = down(0, x = 0f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, IntPxSize(5.ipx, 5.ipx))
-        pointer0 = pointer0.moveTo(100.milliseconds, 10f, 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, IntPxSize(5.ipx, 5.ipx))
-        pointer0 = pointer0.moveTo(200.milliseconds)
-        val pointer1 = down(1, x = 0f, y = 0f)
-
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
-
-        verify(recognizer.onStart!!).invoke(any())
-    }
-
-    // Verification of scenarios where onStop should not be called.
-
-    @Test
-    fun onPointerInput_downMoveConsumedUp_onStopNotCalled() {
-        var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        pointer = pointer.moveTo(100.milliseconds, 5f).consume(1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        pointer = pointer.up(200.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-
-        verify(recognizer.onStop!!, never()).invoke()
-    }
-
-    @Test
-    fun onPointerInput_downConsumedUp_onStopNotCalled() {
-        var pointer = down(0, 0.milliseconds).consumeDownChange()
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        pointer = pointer.up(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-
-        verify(recognizer.onStop!!, never()).invoke()
-    }
-
-    @Test
-    fun onPointerInput_2DownUp_onStopNotCalled() {
-        var pointer0 = down(0)
-        var pointer1 = down(1)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
-        pointer0 = pointer0.moveTo(100.milliseconds)
-        pointer1 = pointer1.up(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
-
-        verify(recognizer.onStop!!, never()).invoke()
-    }
-
-    @Test
-    fun onPointerInput_downDisabledUp_onStopNotCalled() {
-        var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        recognizer.setEnabled(false)
-        pointer = pointer.up(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-
-        verify(recognizer.onStop!!, never()).invoke()
-    }
-
-    @Test
-    fun onPointerInput_downDisabledEnabledUp_onStopNotCalled() {
-        var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        recognizer.setEnabled(false)
-        recognizer.setEnabled(true)
-        pointer = pointer.up(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-
-        verify(recognizer.onStop!!, never()).invoke()
-    }
-
-    // Verification of scenarios where onStop should be called once.
-
-    @Test
-    fun onPointerInput_downUp_onStopCalledOnce() {
-        var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        pointer = pointer.up(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-
-        verify(recognizer.onStop!!).invoke()
-    }
-
-    @Test
-    fun onPointerInput_downUpConsumed_onStopCalledOnce() {
-        var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        pointer = pointer.up(100.milliseconds).consumeDownChange()
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-
-        verify(recognizer.onStop!!).invoke()
-    }
-
-    @Test
-    fun onPointerInput_downMoveUp_onStopCalledOnce() {
-        var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        pointer = pointer.moveTo(100.milliseconds, 5f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        pointer = pointer.up(200.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-
-        verify(recognizer.onStop!!).invoke()
-    }
-
-    @Test
-    fun onPointerInput_2Down2Up_onStopCalledOnce() {
-        var pointer1 = down(0)
-        var pointer2 = down(1)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
-        pointer1 = pointer1.up(100.milliseconds)
-        pointer2 = pointer2.up(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
-
-        verify(recognizer.onStop!!).invoke()
-    }
-
-    // Verification of scenarios where onCancel should not be called.
-
-    @Test
-    fun onPointerInput_downConsumedMoveConsumed_onCancelNotCalled() {
-        var pointer = down(0, 0.milliseconds).consumeDownChange()
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        pointer = pointer.moveBy(100.milliseconds, 5f).consume(1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-
-        verify(recognizer.onCancel!!, never()).invoke()
-    }
-
-    @Test
-    fun onPointerInput_downUp_onCancelNotCalled() {
-        var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        pointer = pointer.up(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-
-        verify(recognizer.onCancel!!, never()).invoke()
-    }
-
-    @Test
-    fun onPointerInput_downMoveUp_onCancelNotCalled() {
-        var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        pointer = pointer.moveTo(100.milliseconds, 5f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        pointer = pointer.up(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-
-        verify(recognizer.onCancel!!, never()).invoke()
-    }
-
-    @Test
-    fun onPointerInput_2DownOneMoveOutsideOfBounds_onCancelNotCalled() {
-        var pointer0 = down(0, x = 0f, y = 0f)
-        var pointer1 = down(0, x = 4f, y = 4f)
-        recognizer::onPointerInput
-            .invokeOverAllPasses(pointer0, pointer1, size = IntPxSize(5.ipx, 5.ipx))
-        pointer0 = pointer0.moveTo(100.milliseconds, 0f, 0f)
-        pointer1 = pointer1.moveTo(100.milliseconds, 5f, 4f)
-        recognizer::onPointerInput
-            .invokeOverAllPasses(pointer0, pointer1, size = IntPxSize(5.ipx, 5.ipx))
-
-        verify(recognizer.onCancel!!, never()).invoke()
-    }
-
-    @Test
-    fun onPointerInput_notEnabledDownNotEnabled_onCancelNotCalled() {
-        recognizer.setEnabled(false)
-        recognizer::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
-        recognizer.setEnabled(false)
-
-        verify(recognizer.onCancel!!, never()).invoke()
-    }
-
-    // Verification of scenarios where onCancel should be called once.
-
-    @Test
-    fun onPointerInput_downMoveConsumed_onCancelCalledOnce() {
-        var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        pointer = pointer.moveBy(100.milliseconds, 5f).consume(1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-
-        verify(recognizer.onCancel!!).invoke()
-    }
-
-    @Test
-    fun onPointerInput_downMoveConsumedMoveConsumed_onCancelCalledOnce() {
-        var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        pointer = pointer.moveBy(100.milliseconds, 5f).consume(1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        pointer = pointer.moveBy(100.milliseconds, 5f).consume(1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-
-        verify(recognizer.onCancel!!).invoke()
-    }
-
-    @Test
-    fun onPointerInput_2Down2MoveConsumed_onCancelCalledOnce() {
-        var pointer0 = down(0)
-        var pointer1 = down(1)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
-        pointer0 = pointer0.moveBy(100.milliseconds, 5f).consume(1f)
-        pointer1 = pointer1.moveBy(100.milliseconds, 5f).consume(1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
-
-        verify(recognizer.onCancel!!).invoke()
-    }
-
-    @Test
-    fun onPointerInput_2Down1MoveConsumedTheOtherMoveConsume_onCancelCalledOnce() {
-        var pointer0 = down(0)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0)
-        pointer0 = pointer0.moveTo(100.milliseconds)
-        var pointer1 = down(1, duration = 100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
-        pointer0 = pointer0.moveBy(100L.milliseconds, 5f).consume(5f)
-        pointer1 = pointer1.moveBy(100L.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
-        pointer0 = pointer0.moveBy(100L.milliseconds)
-        pointer1 = pointer1.moveBy(100L.milliseconds, 5f).consume(5f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
-
-        verify(recognizer.onCancel!!).invoke()
-    }
-
-    @Test
-    fun onPointerInput_1DownMoveOutsideOfBoundsLeft_onCancelCalledOnce() {
-        var pointer0 = down(0, x = 0f, y = 0f)
-        recognizer::onPointerInput
-            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
-        pointer0 = pointer0.moveTo(100.milliseconds, -1f, 0f)
-        recognizer::onPointerInput
-            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
-
-        verify(recognizer.onCancel!!).invoke()
-    }
-
-    @Test
-    fun onPointerInput_1DownMoveOutsideOfBoundsRight_onCancelCalledOnce() {
-        var pointer0 = down(0, x = 0f, y = 0f)
-        recognizer::onPointerInput
-            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
-        pointer0 = pointer0.moveTo(100.milliseconds, 1f, 0f)
-        recognizer::onPointerInput
-            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
-
-        verify(recognizer.onCancel!!).invoke()
-    }
-
-    @Test
-    fun onPointerInput_1DownMoveOutsideOfBoundsUp_onCancelCalledOnce() {
-        var pointer0 = down(0, x = 0f, y = 0f)
-        recognizer::onPointerInput
-            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
-        pointer0 = pointer0.moveTo(100.milliseconds, 0f, -1f)
-        recognizer::onPointerInput
-            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
-
-        verify(recognizer.onCancel!!).invoke()
-    }
-
-    @Test
-    fun onPointerInput_1DownMoveOutsideOfBoundsDown_onCancelCalledOnce() {
-        var pointer0 = down(0, x = 0f, y = 0f)
-        recognizer::onPointerInput
-            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
-        pointer0 = pointer0.moveTo(100.milliseconds, 0f, 1f)
-        recognizer::onPointerInput
-            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
-
-        verify(recognizer.onCancel!!).invoke()
-    }
-
-    @Test
-    fun onPointerInput_2DownBothMoveOutsideOfBounds_onCancelCalledOnce() {
-        var pointer0 = down(0, x = 0f, y = 4f)
-        var pointer1 = down(1, x = 4f, y = 0f)
-        recognizer::onPointerInput
-            .invokeOverAllPasses(pointer0, pointer1, size = IntPxSize(5.ipx, 5.ipx))
-        pointer0 = pointer0.moveTo(100.milliseconds, 0f, 5f)
-        pointer1 = pointer1.moveTo(100.milliseconds, 5f, 0f)
-        recognizer::onPointerInput
-            .invokeOverAllPasses(pointer0, pointer1, size = IntPxSize(5.ipx, 5.ipx))
-
-        verify(recognizer.onCancel!!).invoke()
-    }
-
-    @Test
-    fun onPointerInput_1DownMoveOutsideBoundsThenInsideThenOutside_onCancelCalledOnce() {
-        var pointer0 = down(0, x = 0f, y = 0f)
-        recognizer::onPointerInput
-            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
-        pointer0 = pointer0.moveTo(100.milliseconds, 0f, 1f)
-        recognizer::onPointerInput
-            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
-        pointer0 = pointer0.moveTo(200.milliseconds, 0f, 0f)
-        recognizer::onPointerInput
-            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
-        pointer0 = pointer0.moveTo(300.milliseconds, 0f, 1f)
-        recognizer::onPointerInput
-            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
-
-        verify(recognizer.onCancel!!).invoke()
-    }
-
-    @Test
-    fun onPointerInput_1DownMoveOutsideBoundsUpTwice_onCancelCalledTwice() {
-        var time = 0L
-
-        repeat(2) {
-            var pointer = down(0, x = 0f, y = 0f)
-            recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
-            pointer = pointer.moveTo(time.milliseconds, 0f, 1f)
-            recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
-            pointer = pointer.up(time.milliseconds)
-            recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
-            time += 100L
-        }
-
-        verify(recognizer.onCancel!!, times(2)).invoke()
-    }
-
-    @Test
-    fun onPointerInput_downDisabled_onCancelCalledOnce() {
-        val pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        recognizer.setEnabled(false)
-
-        verify(recognizer.onCancel!!).invoke()
-    }
-
-    // Verification of correct position returned by onStart.
-
-    @Test
-    fun onPointerInput_down_downPositionIsCorrect() {
-        recognizer::onPointerInput
-            .invokeOverAllPasses(down(0, 0.milliseconds, x = 13f, y = 17f))
-        verify(recognizer.onStart!!).invoke(PxPosition(13.px, 17f.px))
-    }
-
-    // Verification of correct consumption behavior.
-
-    @Test
-    fun onPointerInput_down_downChangeConsumedDuringPostUp() {
-        var pointer = down(0, 0.milliseconds)
-        pointer = recognizer::onPointerInput.invokeOverPasses(
-            pointer,
-            PointerEventPass.InitialDown,
-            PointerEventPass.PreUp,
-            PointerEventPass.PreDown
-        )
-        assertThat(pointer.consumed.downChange, `is`(false))
-
-        pointer = recognizer::onPointerInput.invoke(
-            listOf(pointer),
-            PointerEventPass.PostUp,
-            IntPxSize(0.ipx, 0.ipx)
-        ).first()
-        assertThat(pointer.consumed.downChange, `is`(true))
-    }
-
-    @Test
-    fun onPointerInput_disabledDown_noDownChangeConsumed() {
-        recognizer.setEnabled(false)
-        var pointer = down(0, 0.milliseconds)
-        pointer = recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        assertThat(pointer.consumed.downChange, `is`(false))
-    }
-
-    // Verification of correct cancellation handling.
-
-    @Test
-    fun onCancel_justCancel_noCallbacksCalled() {
-        recognizer.onCancel()
-
-        verifyNoMoreInteractions(recognizer.onStart, recognizer.onStop, recognizer.onCancel)
-    }
-
-    @Test
-    fun onCancel_downConsumedCancel_noCallbacksCalled() {
-        recognizer::onPointerInput
-            .invokeOverAllPasses(down(0, 0.milliseconds).consumeDownChange())
-        recognizer.onCancel()
-
-        verifyNoMoreInteractions(recognizer.onStart, recognizer.onStop, recognizer.onCancel)
-    }
-
-    @Test
-    fun onCancel_downCancel_justStartAndCancelCalledInOrderOnce() {
-        recognizer::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
-        recognizer.onCancel()
-
-        inOrder(recognizer.onStart!!, recognizer.onCancel!!) {
-            verify(recognizer.onStart!!).invoke(any())
-            verify(recognizer.onCancel!!).invoke()
-        }
-        verifyNoMoreInteractions(recognizer.onStart, recognizer.onStop, recognizer.onCancel)
-    }
-
-    @Test
-    fun onCancel_downUpCancel_justStartAndStopCalledInOrderOnce() {
-        var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        pointer = pointer.up(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        recognizer.onCancel()
-
-        inOrder(recognizer.onStart!!, recognizer.onStop!!) {
-            verify(recognizer.onStart!!).invoke(any())
-            verify(recognizer.onStop!!).invoke()
-        }
-        verifyNoMoreInteractions(recognizer.onStart, recognizer.onStop, recognizer.onCancel)
-    }
-
-    @Test
-    fun onCancel_downMoveCancel_justStartAndCancelCalledInOrderOnce() {
-        var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        pointer = pointer.moveTo(50.milliseconds, 1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        recognizer.onCancel()
-
-        inOrder(recognizer.onStart!!, recognizer.onCancel!!) {
-            verify(recognizer.onStart!!).invoke(any())
-            verify(recognizer.onCancel!!).invoke()
-        }
-        verifyNoMoreInteractions(recognizer.onStart, recognizer.onStop, recognizer.onCancel)
-    }
-
-    @Test
-    fun onCancel_downMoveConsumedCancel_justStartAndCancelCalledInOrderOnce() {
-        var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        pointer = pointer.moveTo(50.milliseconds, 1f).consume(1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        recognizer.onCancel()
-
-        inOrder(recognizer.onStart!!, recognizer.onCancel!!) {
-            verify(recognizer.onStart!!).invoke(any())
-            verify(recognizer.onCancel!!).invoke()
-        }
-        verifyNoMoreInteractions(recognizer.onStart, recognizer.onStop, recognizer.onCancel)
-    }
-
-    @Test
-    fun onCancel_downThenCancelThenDown_justStartCancelStartCalledInOrderOnce() {
-        var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        recognizer.onCancel()
-        pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-
-        inOrder(recognizer.onStart!!, recognizer.onCancel!!) {
-            verify(recognizer.onStart!!).invoke(any())
-            verify(recognizer.onCancel!!).invoke()
-            verify(recognizer.onStart!!).invoke(any())
-        }
-        verifyNoMoreInteractions(recognizer.onStart, recognizer.onStop, recognizer.onCancel)
-    }
-}
\ No newline at end of file
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/PressIndicatorGestureFilterTest.kt b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/PressIndicatorGestureFilterTest.kt
new file mode 100644
index 0000000..f5ac282
--- /dev/null
+++ b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/PressIndicatorGestureFilterTest.kt
@@ -0,0 +1,574 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.core.gesture
+
+import androidx.ui.core.PointerEventPass
+import androidx.ui.core.consumeDownChange
+import androidx.ui.testutils.consume
+import androidx.ui.testutils.down
+import androidx.ui.testutils.invokeOverAllPasses
+import androidx.ui.testutils.invokeOverPasses
+import androidx.ui.testutils.moveBy
+import androidx.ui.testutils.moveTo
+import androidx.ui.testutils.up
+import androidx.ui.unit.IntPxSize
+import androidx.ui.unit.PxPosition
+import androidx.ui.unit.ipx
+import androidx.ui.unit.milliseconds
+import androidx.ui.unit.px
+import com.nhaarman.mockitokotlin2.any
+import com.nhaarman.mockitokotlin2.inOrder
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.never
+import com.nhaarman.mockitokotlin2.times
+import com.nhaarman.mockitokotlin2.verify
+import com.nhaarman.mockitokotlin2.verifyNoMoreInteractions
+import org.hamcrest.CoreMatchers.`is`
+import org.hamcrest.MatcherAssert.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class PressIndicatorGestureFilterTest {
+
+    private lateinit var filter: PressIndicatorGestureFilter
+
+    @Before
+    fun setup() {
+        filter = PressIndicatorGestureFilter()
+        filter.onStart = mock()
+        filter.onStop = mock()
+        filter.onCancel = mock()
+    }
+
+    // Verification of scenarios where onStart should not be called.
+
+    @Test
+    fun onPointerInput_downConsumed_onStartNotCalled() {
+        filter::onPointerInput
+            .invokeOverAllPasses(down(0, 0.milliseconds).consumeDownChange())
+        verify(filter.onStart!!, never()).invoke(any())
+    }
+
+    @Test
+    fun onPointerInput_disabledDown_onStartNotCalled() {
+        filter.setEnabled(false)
+        filter::onPointerInput
+            .invokeOverAllPasses(down(0, 0.milliseconds).consumeDownChange())
+        verify(filter.onStart!!, never()).invoke(any())
+    }
+
+    // Verification of scenarios where onStart should be called once.
+
+    @Test
+    fun onPointerInput_down_onStartCalledOnce() {
+        filter::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
+        verify(filter.onStart!!).invoke(any())
+    }
+
+    @Test
+    fun onPointerInput_downDown_onStartCalledOnce() {
+        var pointer0 = down(0)
+        filter::onPointerInput.invokeOverAllPasses(pointer0)
+        pointer0 = pointer0.moveTo(1.milliseconds)
+        val pointer1 = down(1, 1.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
+
+        verify(filter.onStart!!).invoke(any())
+    }
+
+    @Test
+    fun onPointerInput_2Down1Up1Down_onStartCalledOnce() {
+        var pointer0 = down(0)
+        var pointer1 = down(1)
+        filter::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
+        pointer0 = pointer0.up(100.milliseconds)
+        pointer1 = pointer1.moveTo(100.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
+        pointer0 = down(0, duration = 200.milliseconds)
+        pointer1 = pointer1.moveTo(200.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
+
+        verify(filter.onStart!!).invoke(any())
+    }
+
+    @Test
+    fun onPointerInput_1DownMoveOutside2ndDown_onStartOnlyCalledOnce() {
+        var pointer0 = down(0, x = 0f, y = 0f)
+        filter::onPointerInput.invokeOverAllPasses(pointer0, IntPxSize(5.ipx, 5.ipx))
+        pointer0 = pointer0.moveTo(100.milliseconds, 10f, 0f)
+        filter::onPointerInput.invokeOverAllPasses(pointer0, IntPxSize(5.ipx, 5.ipx))
+        pointer0 = pointer0.moveTo(200.milliseconds)
+        val pointer1 = down(1, x = 0f, y = 0f)
+
+        filter::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
+
+        verify(filter.onStart!!).invoke(any())
+    }
+
+    // Verification of scenarios where onStop should not be called.
+
+    @Test
+    fun onPointerInput_downMoveConsumedUp_onStopNotCalled() {
+        var pointer = down(0, 0.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        pointer = pointer.moveTo(100.milliseconds, 5f).consume(1f)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        pointer = pointer.up(200.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+
+        verify(filter.onStop!!, never()).invoke()
+    }
+
+    @Test
+    fun onPointerInput_downConsumedUp_onStopNotCalled() {
+        var pointer = down(0, 0.milliseconds).consumeDownChange()
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        pointer = pointer.up(100.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+
+        verify(filter.onStop!!, never()).invoke()
+    }
+
+    @Test
+    fun onPointerInput_2DownUp_onStopNotCalled() {
+        var pointer0 = down(0)
+        var pointer1 = down(1)
+        filter::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
+        pointer0 = pointer0.moveTo(100.milliseconds)
+        pointer1 = pointer1.up(100.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
+
+        verify(filter.onStop!!, never()).invoke()
+    }
+
+    @Test
+    fun onPointerInput_downDisabledUp_onStopNotCalled() {
+        var pointer = down(0, 0.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        filter.setEnabled(false)
+        pointer = pointer.up(100.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+
+        verify(filter.onStop!!, never()).invoke()
+    }
+
+    @Test
+    fun onPointerInput_downDisabledEnabledUp_onStopNotCalled() {
+        var pointer = down(0, 0.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        filter.setEnabled(false)
+        filter.setEnabled(true)
+        pointer = pointer.up(100.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+
+        verify(filter.onStop!!, never()).invoke()
+    }
+
+    // Verification of scenarios where onStop should be called once.
+
+    @Test
+    fun onPointerInput_downUp_onStopCalledOnce() {
+        var pointer = down(0, 0.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        pointer = pointer.up(100.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+
+        verify(filter.onStop!!).invoke()
+    }
+
+    @Test
+    fun onPointerInput_downUpConsumed_onStopCalledOnce() {
+        var pointer = down(0, 0.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        pointer = pointer.up(100.milliseconds).consumeDownChange()
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+
+        verify(filter.onStop!!).invoke()
+    }
+
+    @Test
+    fun onPointerInput_downMoveUp_onStopCalledOnce() {
+        var pointer = down(0, 0.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        pointer = pointer.moveTo(100.milliseconds, 5f)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        pointer = pointer.up(200.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+
+        verify(filter.onStop!!).invoke()
+    }
+
+    @Test
+    fun onPointerInput_2Down2Up_onStopCalledOnce() {
+        var pointer1 = down(0)
+        var pointer2 = down(1)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        pointer1 = pointer1.up(100.milliseconds)
+        pointer2 = pointer2.up(100.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+
+        verify(filter.onStop!!).invoke()
+    }
+
+    // Verification of scenarios where onCancel should not be called.
+
+    @Test
+    fun onPointerInput_downConsumedMoveConsumed_onCancelNotCalled() {
+        var pointer = down(0, 0.milliseconds).consumeDownChange()
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        pointer = pointer.moveBy(100.milliseconds, 5f).consume(1f)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+
+        verify(filter.onCancel!!, never()).invoke()
+    }
+
+    @Test
+    fun onPointerInput_downUp_onCancelNotCalled() {
+        var pointer = down(0, 0.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        pointer = pointer.up(100.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+
+        verify(filter.onCancel!!, never()).invoke()
+    }
+
+    @Test
+    fun onPointerInput_downMoveUp_onCancelNotCalled() {
+        var pointer = down(0, 0.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        pointer = pointer.moveTo(100.milliseconds, 5f)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        pointer = pointer.up(100.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+
+        verify(filter.onCancel!!, never()).invoke()
+    }
+
+    @Test
+    fun onPointerInput_2DownOneMoveOutsideOfBounds_onCancelNotCalled() {
+        var pointer0 = down(0, x = 0f, y = 0f)
+        var pointer1 = down(0, x = 4f, y = 4f)
+        filter::onPointerInput
+            .invokeOverAllPasses(pointer0, pointer1, size = IntPxSize(5.ipx, 5.ipx))
+        pointer0 = pointer0.moveTo(100.milliseconds, 0f, 0f)
+        pointer1 = pointer1.moveTo(100.milliseconds, 5f, 4f)
+        filter::onPointerInput
+            .invokeOverAllPasses(pointer0, pointer1, size = IntPxSize(5.ipx, 5.ipx))
+
+        verify(filter.onCancel!!, never()).invoke()
+    }
+
+    @Test
+    fun onPointerInput_notEnabledDownNotEnabled_onCancelNotCalled() {
+        filter.setEnabled(false)
+        filter::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
+        filter.setEnabled(false)
+
+        verify(filter.onCancel!!, never()).invoke()
+    }
+
+    // Verification of scenarios where onCancel should be called once.
+
+    @Test
+    fun onPointerInput_downMoveConsumed_onCancelCalledOnce() {
+        var pointer = down(0, 0.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        pointer = pointer.moveBy(100.milliseconds, 5f).consume(1f)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+
+        verify(filter.onCancel!!).invoke()
+    }
+
+    @Test
+    fun onPointerInput_downMoveConsumedMoveConsumed_onCancelCalledOnce() {
+        var pointer = down(0, 0.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        pointer = pointer.moveBy(100.milliseconds, 5f).consume(1f)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        pointer = pointer.moveBy(100.milliseconds, 5f).consume(1f)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+
+        verify(filter.onCancel!!).invoke()
+    }
+
+    @Test
+    fun onPointerInput_2Down2MoveConsumed_onCancelCalledOnce() {
+        var pointer0 = down(0)
+        var pointer1 = down(1)
+        filter::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
+        pointer0 = pointer0.moveBy(100.milliseconds, 5f).consume(1f)
+        pointer1 = pointer1.moveBy(100.milliseconds, 5f).consume(1f)
+        filter::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
+
+        verify(filter.onCancel!!).invoke()
+    }
+
+    @Test
+    fun onPointerInput_2Down1MoveConsumedTheOtherMoveConsume_onCancelCalledOnce() {
+        var pointer0 = down(0)
+        filter::onPointerInput.invokeOverAllPasses(pointer0)
+        pointer0 = pointer0.moveTo(100.milliseconds)
+        var pointer1 = down(1, duration = 100.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
+        pointer0 = pointer0.moveBy(100L.milliseconds, 5f).consume(5f)
+        pointer1 = pointer1.moveBy(100L.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
+        pointer0 = pointer0.moveBy(100L.milliseconds)
+        pointer1 = pointer1.moveBy(100L.milliseconds, 5f).consume(5f)
+        filter::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
+
+        verify(filter.onCancel!!).invoke()
+    }
+
+    @Test
+    fun onPointerInput_1DownMoveOutsideOfBoundsLeft_onCancelCalledOnce() {
+        var pointer0 = down(0, x = 0f, y = 0f)
+        filter::onPointerInput
+            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
+        pointer0 = pointer0.moveTo(100.milliseconds, -1f, 0f)
+        filter::onPointerInput
+            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
+
+        verify(filter.onCancel!!).invoke()
+    }
+
+    @Test
+    fun onPointerInput_1DownMoveOutsideOfBoundsRight_onCancelCalledOnce() {
+        var pointer0 = down(0, x = 0f, y = 0f)
+        filter::onPointerInput
+            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
+        pointer0 = pointer0.moveTo(100.milliseconds, 1f, 0f)
+        filter::onPointerInput
+            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
+
+        verify(filter.onCancel!!).invoke()
+    }
+
+    @Test
+    fun onPointerInput_1DownMoveOutsideOfBoundsUp_onCancelCalledOnce() {
+        var pointer0 = down(0, x = 0f, y = 0f)
+        filter::onPointerInput
+            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
+        pointer0 = pointer0.moveTo(100.milliseconds, 0f, -1f)
+        filter::onPointerInput
+            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
+
+        verify(filter.onCancel!!).invoke()
+    }
+
+    @Test
+    fun onPointerInput_1DownMoveOutsideOfBoundsDown_onCancelCalledOnce() {
+        var pointer0 = down(0, x = 0f, y = 0f)
+        filter::onPointerInput
+            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
+        pointer0 = pointer0.moveTo(100.milliseconds, 0f, 1f)
+        filter::onPointerInput
+            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
+
+        verify(filter.onCancel!!).invoke()
+    }
+
+    @Test
+    fun onPointerInput_2DownBothMoveOutsideOfBounds_onCancelCalledOnce() {
+        var pointer0 = down(0, x = 0f, y = 4f)
+        var pointer1 = down(1, x = 4f, y = 0f)
+        filter::onPointerInput
+            .invokeOverAllPasses(pointer0, pointer1, size = IntPxSize(5.ipx, 5.ipx))
+        pointer0 = pointer0.moveTo(100.milliseconds, 0f, 5f)
+        pointer1 = pointer1.moveTo(100.milliseconds, 5f, 0f)
+        filter::onPointerInput
+            .invokeOverAllPasses(pointer0, pointer1, size = IntPxSize(5.ipx, 5.ipx))
+
+        verify(filter.onCancel!!).invoke()
+    }
+
+    @Test
+    fun onPointerInput_1DownMoveOutsideBoundsThenInsideThenOutside_onCancelCalledOnce() {
+        var pointer0 = down(0, x = 0f, y = 0f)
+        filter::onPointerInput
+            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
+        pointer0 = pointer0.moveTo(100.milliseconds, 0f, 1f)
+        filter::onPointerInput
+            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
+        pointer0 = pointer0.moveTo(200.milliseconds, 0f, 0f)
+        filter::onPointerInput
+            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
+        pointer0 = pointer0.moveTo(300.milliseconds, 0f, 1f)
+        filter::onPointerInput
+            .invokeOverAllPasses(pointer0, IntPxSize(1.ipx, 1.ipx))
+
+        verify(filter.onCancel!!).invoke()
+    }
+
+    @Test
+    fun onPointerInput_1DownMoveOutsideBoundsUpTwice_onCancelCalledTwice() {
+        var time = 0L
+
+        repeat(2) {
+            var pointer = down(0, x = 0f, y = 0f)
+            filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+            pointer = pointer.moveTo(time.milliseconds, 0f, 1f)
+            filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+            pointer = pointer.up(time.milliseconds)
+            filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+            time += 100L
+        }
+
+        verify(filter.onCancel!!, times(2)).invoke()
+    }
+
+    @Test
+    fun onPointerInput_downDisabled_onCancelCalledOnce() {
+        val pointer = down(0, 0.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        filter.setEnabled(false)
+
+        verify(filter.onCancel!!).invoke()
+    }
+
+    // Verification of correct position returned by onStart.
+
+    @Test
+    fun onPointerInput_down_downPositionIsCorrect() {
+        filter::onPointerInput
+            .invokeOverAllPasses(down(0, 0.milliseconds, x = 13f, y = 17f))
+        verify(filter.onStart!!).invoke(PxPosition(13.px, 17f.px))
+    }
+
+    // Verification of correct consumption behavior.
+
+    @Test
+    fun onPointerInput_down_downChangeConsumedDuringPostUp() {
+        var pointer = down(0, 0.milliseconds)
+        pointer = filter::onPointerInput.invokeOverPasses(
+            pointer,
+            PointerEventPass.InitialDown,
+            PointerEventPass.PreUp,
+            PointerEventPass.PreDown
+        )
+        assertThat(pointer.consumed.downChange, `is`(false))
+
+        pointer = filter::onPointerInput.invoke(
+            listOf(pointer),
+            PointerEventPass.PostUp,
+            IntPxSize(0.ipx, 0.ipx)
+        ).first()
+        assertThat(pointer.consumed.downChange, `is`(true))
+    }
+
+    @Test
+    fun onPointerInput_disabledDown_noDownChangeConsumed() {
+        filter.setEnabled(false)
+        var pointer = down(0, 0.milliseconds)
+        pointer = filter::onPointerInput.invokeOverAllPasses(pointer)
+        assertThat(pointer.consumed.downChange, `is`(false))
+    }
+
+    // Verification of correct cancellation handling.
+
+    @Test
+    fun onCancel_justCancel_noCallbacksCalled() {
+        filter.onCancel()
+
+        verifyNoMoreInteractions(filter.onStart, filter.onStop, filter.onCancel)
+    }
+
+    @Test
+    fun onCancel_downConsumedCancel_noCallbacksCalled() {
+        filter::onPointerInput
+            .invokeOverAllPasses(down(0, 0.milliseconds).consumeDownChange())
+        filter.onCancel()
+
+        verifyNoMoreInteractions(filter.onStart, filter.onStop, filter.onCancel)
+    }
+
+    @Test
+    fun onCancel_downCancel_justStartAndCancelCalledInOrderOnce() {
+        filter::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
+        filter.onCancel()
+
+        inOrder(filter.onStart!!, filter.onCancel!!) {
+            verify(filter.onStart!!).invoke(any())
+            verify(filter.onCancel!!).invoke()
+        }
+        verifyNoMoreInteractions(filter.onStart, filter.onStop, filter.onCancel)
+    }
+
+    @Test
+    fun onCancel_downUpCancel_justStartAndStopCalledInOrderOnce() {
+        var pointer = down(0, 0.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        pointer = pointer.up(100.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        filter.onCancel()
+
+        inOrder(filter.onStart!!, filter.onStop!!) {
+            verify(filter.onStart!!).invoke(any())
+            verify(filter.onStop!!).invoke()
+        }
+        verifyNoMoreInteractions(filter.onStart, filter.onStop, filter.onCancel)
+    }
+
+    @Test
+    fun onCancel_downMoveCancel_justStartAndCancelCalledInOrderOnce() {
+        var pointer = down(0, 0.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        pointer = pointer.moveTo(50.milliseconds, 1f)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        filter.onCancel()
+
+        inOrder(filter.onStart!!, filter.onCancel!!) {
+            verify(filter.onStart!!).invoke(any())
+            verify(filter.onCancel!!).invoke()
+        }
+        verifyNoMoreInteractions(filter.onStart, filter.onStop, filter.onCancel)
+    }
+
+    @Test
+    fun onCancel_downMoveConsumedCancel_justStartAndCancelCalledInOrderOnce() {
+        var pointer = down(0, 0.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        pointer = pointer.moveTo(50.milliseconds, 1f).consume(1f)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        filter.onCancel()
+
+        inOrder(filter.onStart!!, filter.onCancel!!) {
+            verify(filter.onStart!!).invoke(any())
+            verify(filter.onCancel!!).invoke()
+        }
+        verifyNoMoreInteractions(filter.onStart, filter.onStop, filter.onCancel)
+    }
+
+    @Test
+    fun onCancel_downThenCancelThenDown_justStartCancelStartCalledInOrderOnce() {
+        var pointer = down(0, 0.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        filter.onCancel()
+        pointer = down(0, 0.milliseconds)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+
+        inOrder(filter.onStart!!, filter.onCancel!!) {
+            verify(filter.onStart!!).invoke(any())
+            verify(filter.onCancel!!).invoke()
+            verify(filter.onStart!!).invoke(any())
+        }
+        verifyNoMoreInteractions(filter.onStart, filter.onStop, filter.onCancel)
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/RawDragGestureDetectorTest.kt b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/RawDragGestureFilterTest.kt
similarity index 79%
rename from ui/ui-framework/src/test/java/androidx/ui/core/gesture/RawDragGestureDetectorTest.kt
rename to ui/ui-framework/src/test/java/androidx/ui/core/gesture/RawDragGestureFilterTest.kt
index 3f6662a..92c4c4e 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/RawDragGestureDetectorTest.kt
+++ b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/RawDragGestureFilterTest.kt
@@ -45,9 +45,9 @@
 // Verify correct behavior with no DragBlocker
 
 @RunWith(JUnit4::class)
-class RawDragGestureDetectorTest {
+class RawDragGestureFilterTest {
 
-    private lateinit var recognizer: RawDragGestureRecognizer
+    private lateinit var filter: RawDragGestureFilter
     private lateinit var dragObserver: MockDragObserver
     private lateinit var log: MutableList<LogItem>
     private var dragStartBlocked = true
@@ -56,9 +56,9 @@
     fun setup() {
         log = mutableListOf()
         dragObserver = MockDragObserver(log)
-        recognizer = RawDragGestureRecognizer()
-        recognizer.canStartDragging = { !dragStartBlocked }
-        recognizer.dragObserver = dragObserver
+        filter = RawDragGestureFilter()
+        filter.canStartDragging = { !dragStartBlocked }
+        filter.dragObserver = dragObserver
     }
 
     // Verify the circumstances under which onStart/OnDrag should not be called.
@@ -67,9 +67,9 @@
     fun onPointerInput_blockedAndMove_onStartAndOnDragNotCalled() {
 
         val down = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         val move = down.moveBy(10.milliseconds, 1f, 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         assertThat(log.filter { it.methodName == "onStart" }).isEmpty()
         assertThat(log.filter { it.methodName == "onDrag" }).isEmpty()
@@ -78,11 +78,11 @@
     @Test
     fun onPointerInput_unblockedNoMove_onStartAndOnDragNotCalled() {
         val down = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         dragStartBlocked = false
 
         val move = down.moveBy(10.milliseconds, 0f, 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         assertThat(log.filter { it.methodName == "onStart" }).isEmpty()
         assertThat(log.filter { it.methodName == "onDrag" }).isEmpty()
@@ -92,11 +92,11 @@
     fun onPointerInput_unblockedMovementConsumed_onStartAndOnDragNotCalled() {
 
         val down1 = down(1)
-        recognizer::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
         dragStartBlocked = false
 
         val move1 = down1.moveBy(10.milliseconds, 1f, 1f).consume(dx = 1f, dy = 1f)
-        recognizer::onPointerInput.invokeOverAllPasses(move1)
+        filter::onPointerInput.invokeOverAllPasses(move1)
 
         assertThat(log.filter { it.methodName == "onStart" }).isEmpty()
         assertThat(log.filter { it.methodName == "onDrag" }).isEmpty()
@@ -107,12 +107,12 @@
 
         val down1 = down(1)
         val down2 = down(2)
-        recognizer::onPointerInput.invokeOverAllPasses(down1, down2)
+        filter::onPointerInput.invokeOverAllPasses(down1, down2)
         dragStartBlocked = false
 
         val move1 = down1.moveBy(10.milliseconds, 1f, 1f)
         val move2 = down2.moveBy(10.milliseconds, -1f, -1f)
-        recognizer::onPointerInput.invokeOverAllPasses(move1, move2)
+        filter::onPointerInput.invokeOverAllPasses(move1, move2)
 
         assertThat(log.filter { it.methodName == "onStart" }).isEmpty()
         assertThat(log.filter { it.methodName == "onDrag" }).isEmpty()
@@ -124,7 +124,7 @@
         // Arrange
 
         val pointers = arrayOf(down(0), down(1), down(2))
-        recognizer::onPointerInput.invokeOverAllPasses(*pointers)
+        filter::onPointerInput.invokeOverAllPasses(*pointers)
         dragStartBlocked = false
 
         // Act
@@ -148,7 +148,7 @@
                 0f,
                 2f
             )
-        recognizer::onPointerInput.invokeOverAllPasses(*pointers)
+        filter::onPointerInput.invokeOverAllPasses(*pointers)
 
         // Assert
         assertThat(log.filter { it.methodName == "onStart" }).isEmpty()
@@ -161,11 +161,11 @@
     fun onPointerInput_unblockedAndMoveOnX_onStartAndOnDragCalledOnce() {
 
         val down = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         dragStartBlocked = false
 
         val move = down.moveBy(10.milliseconds, 1f, 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         assertThat(log.filter { it.methodName == "onStart" }).hasSize(1)
         // onDrag get's called twice because it is called during PostUp and PostDown and nothing
@@ -177,11 +177,11 @@
     fun onPointerInput_unblockedAndMoveOnY_oonStartAndOnDragCalledOnce() {
 
         val down = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         dragStartBlocked = false
 
         val move = down.moveBy(10.milliseconds, 0f, 1f)
-        recognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         assertThat(log.filter { it.methodName == "onStart" }).hasSize(1)
         // onDrag get's called twice because it is called during PostUp and PostDown and nothing
@@ -193,11 +193,11 @@
     fun onPointerInput_unblockedAndMoveConsumedBeyond0_onStartAndOnDragCalledOnce() {
 
         val down = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         dragStartBlocked = false
 
         val move = down.moveBy(10.milliseconds, 1f, 0f).consume(dx = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         assertThat(log.filter { it.methodName == "onStart" }).hasSize(1)
         // onDrag get's called twice because it is called during PostUp and PostDown and nothing
@@ -210,11 +210,11 @@
     @Test
     fun onPointerInput_unblockedMove_onDragCalledWithTotalDistance() {
         var change = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         dragStartBlocked = false
 
         change = change.moveBy(100.milliseconds, 5f, -2f)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
 
         val onDragLog = log.filter { it.methodName == "onDrag" }
         assertThat(onDragLog).hasSize(2)
@@ -230,21 +230,21 @@
         // Arrange
 
         var change = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         dragStartBlocked = false
 
         // Act
 
         change = change.moveBy(100.milliseconds, 3f, -5f)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         change = change.moveBy(100.milliseconds, -3f, 7f)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         change = change.moveBy(100.milliseconds, 11f, 13f)
             .consumePositionChange(5.px, 3.px)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         change = change.moveBy(100.milliseconds, -13f, -11f)
             .consumePositionChange((-3).px, (-5).px)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
 
         // Assert
 
@@ -270,7 +270,7 @@
         var pointer1 = down(0)
         var pointer2 = down(1)
         var pointer3 = down(2)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
         dragStartBlocked = false
 
         pointer1 = pointer1.moveBy(100.milliseconds, 9f, -12f)
@@ -279,7 +279,7 @@
 
         // Act
 
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
 
         // Assert
 
@@ -306,11 +306,11 @@
     @Test
     fun onPointerInput_blockedDownMoveUp_onStopNotCalled() {
         var change = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         change = change.moveTo(10.milliseconds, 1f, 1f)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         change = change.up(20.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
 
         assertThat(log.filter { it.methodName == "onStop" }).hasSize(0)
     }
@@ -318,10 +318,10 @@
     @Test
     fun onPointerInput_unBlockedDownUp_onStopNotCalled() {
         var change = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         dragStartBlocked = false
         change = change.up(20.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
 
         assertThat(log.filter { it.methodName == "onStop" }).hasSize(0)
     }
@@ -330,14 +330,14 @@
     fun onPointerInput_unBlockedDownMoveAverage0Up_onStopNotCalled() {
         var change1 = down(1)
         var change2 = down(2)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         dragStartBlocked = false
         change1 = change1.moveBy(10.milliseconds, 1f, 1f)
         change2 = change2.moveBy(10.milliseconds, -1f, -1f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         change1 = change1.up(20.milliseconds)
         change2 = change2.up(20.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         assertThat(log.filter { it.methodName == "onStop" }).isEmpty()
     }
 
@@ -346,12 +346,12 @@
     @Test
     fun onPointerInput_unblockedDownMoveUp_onStopCalledOnce() {
         var change = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         dragStartBlocked = false
         change = change.moveTo(10.milliseconds, 1f, 1f)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         change = change.up(20.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
 
         assertThat(log.filter { it.methodName == "onStop" }).hasSize(1)
     }
@@ -380,7 +380,7 @@
         log.clear()
 
         var change = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         dragStartBlocked = false
 
         repeat(11) {
@@ -389,11 +389,11 @@
                 incrementPerMilliX,
                 incrementPerMilliY
             )
-            recognizer::onPointerInput.invokeOverAllPasses(change)
+            filter::onPointerInput.invokeOverAllPasses(change)
         }
 
         change = change.up(20.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
 
         val loggedStops = log.filter { it.methodName == "onStop" }
         assertThat(loggedStops).hasSize(1)
@@ -407,7 +407,7 @@
     @Test
     fun onPointerInput_unblockDownMoveUp_callBacksOccurInCorrectOrder() {
         var change = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         dragStartBlocked = false
 
         change = change.moveTo(
@@ -415,9 +415,9 @@
             0f,
             1f
         )
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         change = change.up(20.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
 
         assertThat(log).hasSize(4)
         assertThat(log[0].methodName).isEqualTo("onStart")
@@ -432,7 +432,7 @@
 
     @Test
     fun onPointerInput_down_downNotConsumed() {
-        val result = recognizer::onPointerInput.invokeOverAllPasses(down(0))
+        val result = filter::onPointerInput.invokeOverAllPasses(down(0))
         assertThat(result.consumed.downChange).isFalse()
     }
 
@@ -440,14 +440,14 @@
     fun onPointerInput_blockedDownMove_distanceChangeNotConsumed() {
 
         var change = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         change = change.moveTo(
             10.milliseconds,
             1f,
             0f
         )
         dragObserver.dragConsume = PxPosition(7.ipx, (-11).ipx)
-        var result = recognizer::onPointerInput.invokeOverPasses(
+        var result = filter::onPointerInput.invokeOverPasses(
             change,
             PointerEventPass.InitialDown,
             PointerEventPass.PreUp,
@@ -455,7 +455,7 @@
             PointerEventPass.PostUp
         )
         dragObserver.dragConsume = PxPosition.Origin
-        result = recognizer::onPointerInput.invokeOverPasses(
+        result = filter::onPointerInput.invokeOverPasses(
             result,
             PointerEventPass.InitialDown,
             PointerEventPass.PreUp,
@@ -471,7 +471,7 @@
         dragObserver.dragConsume = PxPosition.Origin
 
         var change = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         dragStartBlocked = false
 
         change = change.moveTo(
@@ -479,7 +479,7 @@
             1f,
             1f
         )
-        val result = recognizer::onPointerInput.invokeOverAllPasses(change)
+        val result = filter::onPointerInput.invokeOverAllPasses(change)
 
         assertThat(result.anyPositionChangeConsumed()).isFalse()
     }
@@ -489,7 +489,7 @@
         dragObserver.dragConsume = null
 
         var change = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         dragStartBlocked = false
 
         change = change.moveTo(
@@ -497,7 +497,7 @@
             1f,
             1f
         )
-        val result = recognizer::onPointerInput.invokeOverAllPasses(change)
+        val result = filter::onPointerInput.invokeOverAllPasses(change)
 
         assertThat(result.anyPositionChangeConsumed()).isFalse()
     }
@@ -505,7 +505,7 @@
     @Test
     fun onPointerInput_moveCallBackConsumes_changeDistanceConsumedByCorrectAmount() {
         var change = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change, IntPxSize(0.ipx, 0.ipx))
+        filter::onPointerInput.invokeOverAllPasses(change, IntPxSize(0.ipx, 0.ipx))
         dragStartBlocked = false
 
         change = change.moveTo(
@@ -514,7 +514,7 @@
             -5f
         )
         dragObserver.dragConsume = PxPosition(7.ipx, (-11).ipx)
-        var result = recognizer::onPointerInput.invokeOverPasses(
+        var result = filter::onPointerInput.invokeOverPasses(
             change,
             PointerEventPass.InitialDown,
             PointerEventPass.PreUp,
@@ -522,7 +522,7 @@
             PointerEventPass.PostUp
         )
         dragObserver.dragConsume = PxPosition.Origin
-        result = recognizer::onPointerInput.invokeOverPasses(
+        result = filter::onPointerInput.invokeOverPasses(
             result,
             PointerEventPass.PostDown
         )
@@ -534,7 +534,7 @@
     @Test
     fun onPointerInput_onStopConsumesUp() {
         var change = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         dragStartBlocked = false
 
         change = change.moveTo(
@@ -542,9 +542,9 @@
             1f,
             0f
         )
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         change = change.up(20.milliseconds)
-        val result = recognizer::onPointerInput.invokeOverAllPasses(change)
+        val result = filter::onPointerInput.invokeOverAllPasses(change)
 
         assertThat(result.consumed.downChange).isTrue()
     }
@@ -552,11 +552,11 @@
     @Test
     fun onPointerInput_move_onStartCalledWithDownPosition() {
         val down = down(0, 0.milliseconds, x = 3f, y = 4f)
-        recognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         dragStartBlocked = false
 
         val move = down.moveBy(Duration(milliseconds = 10), 1f, 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         assertThat(log.first { it.methodName == "onStart" }.pxPosition)
             .isEqualTo(PxPosition(3.px, 4.px))
@@ -567,7 +567,7 @@
         var pointer1 = down(1, x = 1f, y = 2f)
         var pointer2 = down(2, x = 5f, y = 4f)
         var pointer3 = down(3, x = 3f, y = 6f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
         dragStartBlocked = false
 
         pointer1 = pointer1.moveBy(100.milliseconds, 1f, 0f)
@@ -576,7 +576,7 @@
 
         // Act
 
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
 
         assertThat(log.first { it.methodName == "onStart" }.pxPosition)
             // average position
@@ -588,9 +588,9 @@
     @Test
     fun onCancel_downCancel_onCancelNotCalled() {
         val down = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         dragStartBlocked = false
-        recognizer.onCancel()
+        filter.onCancel()
 
         assertThat(log.filter { it.methodName == "onCancel" }).isEmpty()
     }
@@ -598,11 +598,11 @@
     @Test
     fun onCancel_blockedDownMoveCancel_onCancelNotCalled() {
         val down = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         dragStartBlocked = true
         val move = down.moveBy(1.milliseconds, 1f, 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(move)
-        recognizer.onCancel()
+        filter::onPointerInput.invokeOverAllPasses(move)
+        filter.onCancel()
 
         assertThat(log.filter { it.methodName == "onCancel" }).isEmpty()
     }
@@ -612,11 +612,11 @@
     @Test
     fun onCancel_downMoveCancel_onCancelCalledOnce() {
         val down = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         dragStartBlocked = false
         val move = down.moveBy(1.milliseconds, 1f, 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(move)
-        recognizer.onCancel()
+        filter::onPointerInput.invokeOverAllPasses(move)
+        filter.onCancel()
 
         assertThat(log.filter { it.methodName == "onCancel" }).hasSize(1)
     }
@@ -626,15 +626,15 @@
     @Test
     fun onCancel_downCancelDownMove_startPositionIsSecondDown() {
         val down1 = down(1, x = 3f, y = 5f)
-        recognizer::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
         dragStartBlocked = false
-        recognizer.onCancel()
+        filter.onCancel()
 
         val down2 = down(2, x = 7f, y = 11f)
-        recognizer::onPointerInput.invokeOverAllPasses(down2)
+        filter::onPointerInput.invokeOverAllPasses(down2)
 
         val move = down2.moveBy(Duration(milliseconds = 10), 1f, 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         assertThat(log.first { it.methodName == "onStart" }.pxPosition)
             .isEqualTo(PxPosition(7.px, 11.px))
@@ -647,7 +647,7 @@
 
         // Down, move, cancel.
         var change = down(0, duration = 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         dragStartBlocked = false
         repeat(11) {
             change = change.moveBy(
@@ -655,13 +655,13 @@
                 -1f,
                 -1f
             )
-            recognizer::onPointerInput.invokeOverAllPasses(change)
+            filter::onPointerInput.invokeOverAllPasses(change)
         }
-        recognizer.onCancel()
+        filter.onCancel()
 
         // Down, Move, Up
         change = down(1, duration = 200.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         dragStartBlocked = false
         repeat(11) {
             change = change.moveBy(
@@ -669,10 +669,10 @@
                 1f,
                 1f
             )
-            recognizer::onPointerInput.invokeOverAllPasses(change)
+            filter::onPointerInput.invokeOverAllPasses(change)
         }
         change = change.up(310.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
 
         // Assert.
 
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/RawPressStartGestureDetectorTest.kt b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/RawPressStartGestureFilterTest.kt
similarity index 61%
rename from ui/ui-framework/src/test/java/androidx/ui/core/gesture/RawPressStartGestureDetectorTest.kt
rename to ui/ui-framework/src/test/java/androidx/ui/core/gesture/RawPressStartGestureFilterTest.kt
index e21e948..bf25a8a 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/RawPressStartGestureDetectorTest.kt
+++ b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/RawPressStartGestureFilterTest.kt
@@ -43,117 +43,117 @@
 import org.junit.runners.JUnit4
 
 @RunWith(JUnit4::class)
-class RawPressStartGestureDetectorTest {
+class RawPressStartGestureFilterTest {
 
-    private lateinit var recognizer: RawPressStartGestureRecognizer
+    private lateinit var filter: RawPressStartGestureFilter
 
     @Before
     fun setup() {
-        recognizer = RawPressStartGestureRecognizer()
-        recognizer.onPressStart = mock()
+        filter = RawPressStartGestureFilter()
+        filter.onPressStart = mock()
     }
 
     // Verification of scenarios where onPressStart should not be called.
 
     @Test
     fun onPointerInput_downConsumed_onPressStartNotCalled() {
-        recognizer::onPointerInput.invokeOverAllPasses(down(0).consumeDownChange())
-        verify(recognizer.onPressStart, never()).invoke(any())
+        filter::onPointerInput.invokeOverAllPasses(down(0).consumeDownChange())
+        verify(filter.onPressStart, never()).invoke(any())
     }
 
     @Test
     fun onPointerInput_downConsumedDown_onPressStartNotCalled() {
         var pointer1 = down(1, duration = 0.milliseconds).consumeDownChange()
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1)
+        filter::onPointerInput.invokeOverAllPasses(pointer1)
         pointer1 = pointer1.moveBy(10.milliseconds)
         val pointer2 = down(2, duration = 10.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
-        verify(recognizer.onPressStart, never()).invoke(any())
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        verify(filter.onPressStart, never()).invoke(any())
     }
 
     @Test
     fun onPointerInput_disabledDown_onPressStartNotCalled() {
-        recognizer.setEnabled(false)
-        recognizer::onPointerInput.invokeOverAllPasses(down(0))
-        verify(recognizer.onPressStart, never()).invoke(any())
+        filter.setEnabled(false)
+        filter::onPointerInput.invokeOverAllPasses(down(0))
+        verify(filter.onPressStart, never()).invoke(any())
     }
 
     @Test
     fun onPointerInput_disabledDownEnabledDown_onPressStartNotCalled() {
 
-        recognizer.setEnabled(false)
+        filter.setEnabled(false)
         var pointer1 = down(1, duration = 0.milliseconds).consumeDownChange()
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1)
-        recognizer.setEnabled(true)
+        filter::onPointerInput.invokeOverAllPasses(pointer1)
+        filter.setEnabled(true)
         pointer1 = pointer1.moveBy(10.milliseconds)
         val pointer2 = down(2, duration = 10.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
-        verify(recognizer.onPressStart, never()).invoke(any())
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        verify(filter.onPressStart, never()).invoke(any())
     }
 
     // Verification of scenarios where onPressStart should be called once.
 
     @Test
     fun onPointerInput_down_onPressStartCalledOnce() {
-        recognizer::onPointerInput.invokeOverAllPasses(down(0))
-        verify(recognizer.onPressStart).invoke(any())
+        filter::onPointerInput.invokeOverAllPasses(down(0))
+        verify(filter.onPressStart).invoke(any())
     }
 
     @Test
     fun onPointerInput_downDown_onPressStartCalledOnce() {
         var pointer0 = down(0)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0)
+        filter::onPointerInput.invokeOverAllPasses(pointer0)
         pointer0 = pointer0.moveTo(1.milliseconds)
         val pointer1 = down(1, 1.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
+        filter::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
 
-        verify(recognizer.onPressStart).invoke(any())
+        verify(filter.onPressStart).invoke(any())
     }
 
     @Test
     fun onPointerInput_2Down1Up1Down_onPressStartCalledOnce() {
         var pointer0 = down(0)
         var pointer1 = down(1)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
+        filter::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
         pointer0 = pointer0.up(100.milliseconds)
         pointer1 = pointer1.moveTo(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
+        filter::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
         pointer0 = down(0, duration = 200.milliseconds)
         pointer1 = pointer1.moveTo(200.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
+        filter::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
 
-        verify(recognizer.onPressStart).invoke(any())
+        verify(filter.onPressStart).invoke(any())
     }
 
     @Test
     fun onPointerInput_1DownMoveOutside2ndDown_onPressStartOnlyCalledOnce() {
         var pointer0 = down(0, x = 0f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, IntPxSize(5.ipx, 5.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer0, IntPxSize(5.ipx, 5.ipx))
         pointer0 = pointer0.moveTo(100.milliseconds, 10f, 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, IntPxSize(5.ipx, 5.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer0, IntPxSize(5.ipx, 5.ipx))
         pointer0 = pointer0.moveTo(200.milliseconds)
         val pointer1 = down(1, x = 0f, y = 0f)
 
-        recognizer::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
+        filter::onPointerInput.invokeOverAllPasses(pointer0, pointer1)
 
-        verify(recognizer.onPressStart).invoke(any())
+        verify(filter.onPressStart).invoke(any())
     }
 
     // Verification of correct position returned by onPressStart.
 
     @Test
     fun onPointerInput_down_downPositionIsCorrect() {
-        recognizer::onPointerInput.invokeOverAllPasses(down(0, x = 13f, y = 17f))
-        verify(recognizer.onPressStart).invoke(PxPosition(13.px, 17f.px))
+        filter::onPointerInput.invokeOverAllPasses(down(0, x = 13f, y = 17f))
+        verify(filter.onPressStart).invoke(PxPosition(13.px, 17f.px))
     }
 
     // Verification of correct consumption behavior.
 
     @Test
     fun onPointerInput_disabledDown_noDownChangeConsumed() {
-        recognizer.setEnabled(false)
+        filter.setEnabled(false)
         var pointer = down(0)
-        pointer = recognizer::onPointerInput.invokeOverAllPasses(pointer)
+        pointer = filter::onPointerInput.invokeOverAllPasses(pointer)
         assertThat(pointer.consumed.downChange, `is`(false))
     }
 
@@ -161,106 +161,106 @@
 
     @Test
     fun onCancel_justCancel_noCallbacksCalled() {
-        recognizer.onCancel()
+        filter.onCancel()
 
-        verifyNoMoreInteractions(recognizer.onPressStart)
+        verifyNoMoreInteractions(filter.onPressStart)
     }
 
     @Test
     fun onCancel_downCancelDown_onPressStartCalledTwice() {
-        recognizer::onPointerInput.invokeOverAllPasses(down(id = 0, duration = 0.milliseconds))
-        recognizer.onCancel()
-        recognizer::onPointerInput.invokeOverAllPasses(down(id = 0, duration = 1.milliseconds))
+        filter::onPointerInput.invokeOverAllPasses(down(id = 0, duration = 0.milliseconds))
+        filter.onCancel()
+        filter::onPointerInput.invokeOverAllPasses(down(id = 0, duration = 1.milliseconds))
 
-        verify(recognizer.onPressStart, times(2)).invoke(any())
+        verify(filter.onPressStart, times(2)).invoke(any())
     }
 
     // Verification of correct execution pass behavior
 
     @Test
     fun onPointerInput_initialDown_behaviorOccursAtCorrectTime() {
-        recognizer.setExecutionPass(PointerEventPass.InitialDown)
+        filter.setExecutionPass(PointerEventPass.InitialDown)
 
-        val pointer = recognizer::onPointerInput.invokeOverPasses(
+        val pointer = filter::onPointerInput.invokeOverPasses(
             down(0),
             PointerEventPass.InitialDown
         )
 
-        verify(recognizer.onPressStart).invoke(any())
+        verify(filter.onPressStart).invoke(any())
         assertThat(pointer.consumed.downChange, `is`(true))
     }
 
     @Test
     fun onPointerInput_preUp_behaviorOccursAtCorrectTime() {
-        recognizer.setExecutionPass(PointerEventPass.PreUp)
+        filter.setExecutionPass(PointerEventPass.PreUp)
 
-        var pointer = recognizer::onPointerInput.invokeOverPasses(
+        var pointer = filter::onPointerInput.invokeOverPasses(
             down(0),
             PointerEventPass.InitialDown
         )
 
-        verify(recognizer.onPressStart, never()).invoke(any())
+        verify(filter.onPressStart, never()).invoke(any())
         assertThat(pointer.consumed.downChange, `is`(false))
 
-        pointer = recognizer::onPointerInput.invokeOverPasses(
+        pointer = filter::onPointerInput.invokeOverPasses(
             down(1),
             PointerEventPass.PreUp
         )
 
-        verify(recognizer.onPressStart).invoke(any())
+        verify(filter.onPressStart).invoke(any())
         assertThat(pointer.consumed.downChange, `is`(true))
     }
 
     @Test
     fun onPointerInput_preDown_behaviorOccursAtCorrectTime() {
-        recognizer.setExecutionPass(PointerEventPass.PreDown)
+        filter.setExecutionPass(PointerEventPass.PreDown)
 
-        var pointer = recognizer::onPointerInput.invokeOverPasses(
+        var pointer = filter::onPointerInput.invokeOverPasses(
             down(0),
             PointerEventPass.InitialDown,
             PointerEventPass.PreUp
         )
 
-        verify(recognizer.onPressStart, never()).invoke(any())
+        verify(filter.onPressStart, never()).invoke(any())
         assertThat(pointer.consumed.downChange, `is`(false))
 
-        pointer = recognizer::onPointerInput.invokeOverPasses(
+        pointer = filter::onPointerInput.invokeOverPasses(
             down(1),
             PointerEventPass.PreDown
         )
 
-        verify(recognizer.onPressStart).invoke(any())
+        verify(filter.onPressStart).invoke(any())
         assertThat(pointer.consumed.downChange, `is`(true))
     }
 
     @Test
     fun onPointerInput_PostUp_behaviorOccursAtCorrectTime() {
-        recognizer.setExecutionPass(PointerEventPass.PostUp)
+        filter.setExecutionPass(PointerEventPass.PostUp)
 
-        var pointer = recognizer::onPointerInput.invokeOverPasses(
+        var pointer = filter::onPointerInput.invokeOverPasses(
             down(0),
             PointerEventPass.InitialDown,
             PointerEventPass.PreUp,
             PointerEventPass.PreDown
         )
 
-        verify(recognizer.onPressStart, never()).invoke(any())
+        verify(filter.onPressStart, never()).invoke(any())
         assertThat(pointer.consumed.downChange, `is`(false))
 
-        pointer = recognizer::onPointerInput.invokeOverPasses(
+        pointer = filter::onPointerInput.invokeOverPasses(
             down(1),
             PointerEventPass.PostUp
         )
 
-        verify(recognizer.onPressStart).invoke(any())
+        verify(filter.onPressStart).invoke(any())
         assertThat(pointer.consumed.downChange, `is`(true))
     }
 
     @Test
     fun onPointerInput_postDown_behaviorOccursAtCorrectTime() {
-        recognizer.setExecutionPass(PointerEventPass.PostDown)
+        filter.setExecutionPass(PointerEventPass.PostDown)
 
-        var pointer = recognizer::onPointerInput.invokeOverPasses(
+        var pointer = filter::onPointerInput.invokeOverPasses(
             down(0),
             PointerEventPass.InitialDown,
             PointerEventPass.PreUp,
@@ -268,15 +268,15 @@
             PointerEventPass.PostUp
         )
 
-        verify(recognizer.onPressStart, never()).invoke(any())
+        verify(filter.onPressStart, never()).invoke(any())
         assertThat(pointer.consumed.downChange, `is`(false))
 
-        pointer = recognizer::onPointerInput.invokeOverPasses(
+        pointer = filter::onPointerInput.invokeOverPasses(
             down(1),
             PointerEventPass.PostDown
         )
 
-        verify(recognizer.onPressStart).invoke(any())
+        verify(filter.onPressStart).invoke(any())
         assertThat(pointer.consumed.downChange, `is`(true))
     }
 
@@ -287,14 +287,14 @@
     // and the 1st down is already consumed, the gesture detector won't consume the 2nd down.
     @Test
     fun onCancel_downCancelDownConsumedDown_thirdDownNotConsumed() {
-        recognizer::onPointerInput
+        filter::onPointerInput
             .invokeOverAllPasses(down(id = 0, duration = 0.milliseconds))
-        recognizer.onCancel()
+        filter.onCancel()
         var pointer1 = down(id = 1, duration = 10.milliseconds).consumeDownChange()
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1)
+        filter::onPointerInput.invokeOverAllPasses(pointer1)
         pointer1 = pointer1.moveTo(20.milliseconds, 0f, 0f)
         val pointer2 = down(id = 2, duration = 20.milliseconds)
-        val results = recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        val results = filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         assertThat(results[0].consumed.downChange, `is`(false))
         assertThat(results[1].consumed.downChange, `is`(false))
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/RawScaleGestureDetectorTest.kt b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/RawScaleGestureFilterTest.kt
similarity index 80%
rename from ui/ui-framework/src/test/java/androidx/ui/core/gesture/RawScaleGestureDetectorTest.kt
rename to ui/ui-framework/src/test/java/androidx/ui/core/gesture/RawScaleGestureFilterTest.kt
index 273a581..5da5cfd 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/RawScaleGestureDetectorTest.kt
+++ b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/RawScaleGestureFilterTest.kt
@@ -42,9 +42,9 @@
 // Verify correct behavior with no canStartScaling callback.
 
 @RunWith(JUnit4::class)
-class RawScaleGestureDetectorTest {
+class RawScaleGestureFilterTest {
 
-    private lateinit var recognizer: RawScaleGestureRecognizer
+    private lateinit var filter: RawScaleGestureFilter
     private lateinit var scaleObserver: MockScaleObserver
     private lateinit var log: MutableList<LogItem>
     private var scaleStartBlocked = true
@@ -53,9 +53,9 @@
     fun setup() {
         log = mutableListOf()
         scaleObserver = MockScaleObserver(log)
-        recognizer = RawScaleGestureRecognizer()
-        recognizer.canStartScaling = { !scaleStartBlocked }
-        recognizer.scaleObserver = scaleObserver
+        filter = RawScaleGestureFilter()
+        filter.canStartScaling = { !scaleStartBlocked }
+        filter.scaleObserver = scaleObserver
     }
 
     // Verify the circumstances under which onStart/onScale should not be called.
@@ -65,10 +65,10 @@
 
         var pointer1 = down(0, x = 1f, y = 1f)
         var pointer2 = down(1, x = -1f, y = 1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         pointer1 = pointer1.moveBy(10.milliseconds, 1f, 1f)
         pointer2 = pointer1.moveBy(10.milliseconds, -1f, -1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         assertThat(log.filter { it.methodName == "onStart" }).isEmpty()
         assertThat(log.filter { it.methodName == "onScale" }).isEmpty()
@@ -79,12 +79,12 @@
 
         var pointer1 = down(0, x = 1f, y = 1f)
         var pointer2 = down(1, x = -1f, y = 1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         scaleStartBlocked = false
 
         pointer1 = pointer1.moveBy(10.milliseconds, 0f, 0f)
         pointer2 = pointer1.moveBy(10.milliseconds, 0f, 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         assertThat(log.filter { it.methodName == "onStart" }).isEmpty()
         assertThat(log.filter { it.methodName == "onScale" }).isEmpty()
@@ -94,11 +94,11 @@
     fun onPointerInput_1PointerExistsAndMoves_onStartAndOnScaleNotCalled() {
 
         val down1 = down(0)
-        recognizer::onPointerInput.invokeOverAllPasses(down1)
+        filter::onPointerInput.invokeOverAllPasses(down1)
         scaleStartBlocked = false
 
         val move1 = down1.moveBy(10.milliseconds, 1f, 1f)
-        recognizer::onPointerInput.invokeOverAllPasses(move1)
+        filter::onPointerInput.invokeOverAllPasses(move1)
 
         assertThat(log.filter { it.methodName == "onStart" }).isEmpty()
         assertThat(log.filter { it.methodName == "onScale" }).isEmpty()
@@ -132,14 +132,14 @@
         var pointer1 = down(1, x = 1f, y = 1f)
         var pointer2 = down(0, x = 3f, y = 3f)
 
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         scaleStartBlocked = false
 
         // The pointers move and rotate, but the average distance to the center doesn't change, so
         // no scaling occurs.
         pointer1 = pointer1.moveTo(10.milliseconds, 3f, 5f)
         pointer2 = pointer2.moveTo(10.milliseconds, 5f, 3f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         assertThat(log.filter { it.methodName == "onStart" }).isEmpty()
         assertThat(log.filter { it.methodName == "onScale" }).isEmpty()
@@ -175,7 +175,7 @@
         var pointer1 = down(0, x = 1f, y = 2f)
         var pointer2 = down(1, x = 2f, y = 1f)
         var pointer3 = down(2, x = 4f, y = 4f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
         scaleStartBlocked = false
 
         // Act
@@ -185,7 +185,7 @@
         pointer1 = pointer1.moveTo(10.milliseconds, 2f, 5f)
         pointer2 = pointer2.moveTo(10.milliseconds, 4f, 2f)
         pointer3 = pointer3.moveTo(10.milliseconds, 5f, 3f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
 
         // Assert
         assertThat(log.filter { it.methodName == "onStart" }).isEmpty()
@@ -223,7 +223,7 @@
         var pointer2 = down(1, x = 4f, y = 1f)
         var pointer3 = down(2, x = 4f, y = 5f)
         var pointer4 = down(3, x = 6f, y = 3f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3, pointer4)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3, pointer4)
         scaleStartBlocked = false
 
         // Act
@@ -234,7 +234,7 @@
         pointer2 = pointer2.moveTo(10.milliseconds, 4f, 1f)
         pointer3 = pointer3.moveTo(10.milliseconds, 4f, 3f)
         pointer4 = pointer4.moveTo(10.milliseconds, 7f, 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3, pointer4)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3, pointer4)
 
         // Assert
         assertThat(log.filter { it.methodName == "onStart" }).isEmpty()
@@ -268,14 +268,14 @@
 
         var pointer1 = down(0, x = 1f, y = 1f)
         var pointer2 = down(1, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         scaleStartBlocked = false
 
         pointer1 =
             pointer1.moveTo(10.milliseconds, 2f, 2f).consume(-1f, -2f)
         pointer2 =
             pointer2.moveTo(10.milliseconds, 5f, 1f).consume(1f, -2f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         assertThat(log.filter { it.methodName == "onStart" }).isEmpty()
         assertThat(log.filter { it.methodName == "onScale" }).isEmpty()
@@ -288,12 +288,12 @@
 
         var pointer1 = down(0, x = 1f, y = 1f)
         var pointer2 = down(0, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         scaleStartBlocked = false
 
         pointer1 = pointer1.moveBy(10.milliseconds, dx = 1f, dy = 0f)
         pointer2 = pointer2.moveBy(10.milliseconds, dx = 0f, dy = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         assertThat(log.filter { it.methodName == "onStart" }).hasSize(1)
         assertThat(log.filter { it.methodName == "onScale" }).hasSize(1)
@@ -304,12 +304,12 @@
 
         var pointer1 = down(0, x = 1f, y = 1f)
         var pointer2 = down(0, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         scaleStartBlocked = false
 
         pointer1 = pointer1.moveBy(10.milliseconds, dx = 0f, dy = 0f)
         pointer2 = pointer2.moveBy(10.milliseconds, dx = 0f, dy = -1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         assertThat(log.filter { it.methodName == "onStart" }).hasSize(1)
         assertThat(log.filter { it.methodName == "onScale" }).hasSize(1)
@@ -320,12 +320,12 @@
 
         var pointer1 = down(0, x = 1f, y = 1f)
         var pointer2 = down(0, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         scaleStartBlocked = false
 
         pointer1 = pointer1.moveBy(10.milliseconds, dx = 0f, dy = 0f).consume(dx = -1f)
         pointer2 = pointer2.moveBy(10.milliseconds, dx = 0f, dy = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         assertThat(log.filter { it.methodName == "onStart" }).hasSize(1)
         assertThat(log.filter { it.methodName == "onScale" }).hasSize(1)
@@ -336,12 +336,12 @@
 
         var pointer1 = down(0, x = 1f, y = 1f)
         var pointer2 = down(0, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         scaleStartBlocked = false
 
         pointer1 = pointer1.moveBy(10.milliseconds, dx = 0f, dy = 0f).consume(dy = -1f)
         pointer2 = pointer2.moveBy(10.milliseconds, dx = 0f, dy = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         assertThat(log.filter { it.methodName == "onStart" }).hasSize(1)
         assertThat(log.filter { it.methodName == "onScale" }).hasSize(1)
@@ -352,16 +352,16 @@
 
         var pointer1 = down(0, x = 1f, y = 1f)
         var pointer2 = down(0, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         scaleStartBlocked = false
 
         pointer1 = pointer1.moveBy(10.milliseconds, dx = 1f, dy = 0f)
         pointer2 = pointer2.moveBy(10.milliseconds, dx = 0f, dy = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         pointer1 = pointer1.moveBy(10.milliseconds, dx = 1f, dy = 0f)
         pointer2 = pointer2.moveBy(10.milliseconds, dx = 0f, dy = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         assertThat(log.filter { it.methodName == "onStart" }).hasSize(1)
     }
@@ -372,12 +372,12 @@
     fun onPointerInput_2PointersIncreaseDistanceOnXBy50Percent_onScaleCalledWith150Percent() {
         var pointer1 = down(0, x = 0f, y = 0f)
         var pointer2 = down(0, x = 2f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         scaleStartBlocked = false
 
         pointer1 = pointer1.moveTo(10.milliseconds, 0f, 0f)
         pointer2 = pointer2.moveTo(10.milliseconds, 3f, 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         val onScaleLog = log.filter { it.methodName == "onScale" }
         assertThat(onScaleLog).hasSize(1)
@@ -388,12 +388,12 @@
     fun onPointerInput_2PointersIncreaseDistanceOnYBy50Percent_onScaleCalledWith150Percent() {
         var pointer1 = down(0, x = 0f, y = 0f)
         var pointer2 = down(0, x = 0f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         scaleStartBlocked = false
 
         pointer1 = pointer1.moveTo(10.milliseconds, 0f, 0f)
         pointer2 = pointer2.moveTo(10.milliseconds, 0f, 3f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         val onScaleLog = log.filter { it.methodName == "onScale" }
         assertThat(onScaleLog).hasSize(1)
@@ -404,12 +404,12 @@
     fun onPointerInput_2PointersDecreaseDistanceOnXBy50Percent_onScaleCalledWith50Percent() {
         var pointer1 = down(0, x = 0f, y = 0f)
         var pointer2 = down(0, x = 2f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         scaleStartBlocked = false
 
         pointer1 = pointer1.moveTo(10.milliseconds, 0f, 0f)
         pointer2 = pointer2.moveTo(10.milliseconds, 1f, 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         val onScaleLog = log.filter { it.methodName == "onScale" }
         assertThat(onScaleLog).hasSize(1)
@@ -420,12 +420,12 @@
     fun onPointerInput_2PointersDecreaseDistanceOnYBy50Percent_onScaleCalledWith50Percent() {
         var pointer1 = down(0, x = 0f, y = 0f)
         var pointer2 = down(0, x = 0f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         scaleStartBlocked = false
 
         pointer1 = pointer1.moveTo(10.milliseconds, 0f, 0f)
         pointer2 = pointer2.moveTo(10.milliseconds, 0f, 1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         val onScaleLog = log.filter { it.methodName == "onScale" }
         assertThat(onScaleLog).hasSize(1)
@@ -436,12 +436,12 @@
     fun onPointerInput_2PointersIncDistOnBothAxisBy300Percent_onScaleCalledWith400Percent() {
         var pointer1 = down(0, x = 1f, y = 1f)
         var pointer2 = down(0, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         scaleStartBlocked = false
 
         pointer1 = pointer1.moveTo(10.milliseconds, 0f, 0f)
         pointer2 = pointer2.moveTo(10.milliseconds, 4f, 4f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         val onScaleLog = log.filter { it.methodName == "onScale" }
         assertThat(onScaleLog).hasSize(1)
@@ -452,12 +452,12 @@
     fun onPointerInput_2PointersDecDistOnBothAxisBy75Percent_onScaleCalledWith25Percent() {
         var pointer1 = down(0, x = 0f, y = 0f)
         var pointer2 = down(0, x = 4f, y = 4f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         scaleStartBlocked = false
 
         pointer1 = pointer1.moveTo(10.milliseconds, 1f, 1f)
         pointer2 = pointer2.moveTo(10.milliseconds, 2f, 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         val onScaleLog = log.filter { it.methodName == "onScale" }
         assertThat(onScaleLog).hasSize(1)
@@ -471,15 +471,15 @@
 
         var pointer1 = down(0, x = 1f, y = 1f)
         var pointer2 = down(0, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         pointer1 = pointer1.moveBy(10.milliseconds, dx = 1f, dy = 0f)
         pointer2 = pointer2.moveBy(10.milliseconds, dx = 0f, dy = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         pointer1 = pointer1.up(20.milliseconds)
         pointer2 = pointer2.moveBy(0.milliseconds, dx = 0f, dy = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         assertThat(log.filter { it.methodName == "onStop" }).hasSize(0)
     }
@@ -488,14 +488,14 @@
     fun onPointerInput_1PointerDownMoveUp_onStopNotCalled() {
 
         var pointer1 = down(0, x = 1f, y = 1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1)
+        filter::onPointerInput.invokeOverAllPasses(pointer1)
         scaleStartBlocked = false
 
         pointer1 = pointer1.moveBy(10.milliseconds, dx = 1f, dy = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1)
+        filter::onPointerInput.invokeOverAllPasses(pointer1)
 
         pointer1 = pointer1.up(20.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1)
+        filter::onPointerInput.invokeOverAllPasses(pointer1)
 
         assertThat(log.filter { it.methodName == "onStop" }).hasSize(0)
     }
@@ -506,18 +506,18 @@
         var pointer1 = down(0, x = 1f, y = 1f)
         var pointer2 = down(1, x = 1f, y = 2f)
         var pointer3 = down(2, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
         scaleStartBlocked = false
 
         pointer1 = pointer1.moveBy(10.milliseconds, dx = -1f, dy = -1f)
         pointer2 = pointer2.moveBy(10.milliseconds, dx = -1f, dy = 1f)
         pointer3 = pointer3.moveBy(10.milliseconds, dx = 1f, dy = 1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
 
         pointer1 = pointer1.up(20.milliseconds)
         pointer2 = pointer2.moveBy(10.milliseconds, dx = 0f, dy = 0f)
         pointer3 = pointer3.moveBy(10.milliseconds, dx = 0f, dy = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
 
         assertThat(log.filter { it.methodName == "onStop" }).hasSize(0)
     }
@@ -528,14 +528,14 @@
     fun onPointerInput_unblocked2DownMove2Up_onStopCalledOnce() {
         var change1 = down(0, x = 1f, y = 1f)
         var change2 = down(1, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
         change1 = change1.moveTo(10.milliseconds, 0f, 0f)
         change2 = change2.moveTo(10.milliseconds, 3f, 3f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         change1 = change1.up(20.milliseconds)
         change2 = change2.up(20.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
 
         assertThat(log.filter { it.methodName == "onStop" }).hasSize(1)
     }
@@ -544,14 +544,14 @@
     fun onPointerInput_unblocked2DownMove1Up_onStopNotCalled() {
         var change1 = down(0, x = 1f, y = 1f)
         var change2 = down(1, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
         change1 = change1.moveTo(10.milliseconds, 0f, 0f)
         change2 = change2.moveTo(10.milliseconds, 3f, 3f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         change1 = change1.up(20.milliseconds)
         change2 = change2.moveTo(20.milliseconds, 3f, 3f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
 
         assertThat(log.filter { it.methodName == "onStop" }).isEmpty()
     }
@@ -562,14 +562,14 @@
     fun onPointerInput_unblocked2DownMove2Up_callbacksCalledInCorrectOrder() {
         var change1 = down(0, x = 1f, y = 1f)
         var change2 = down(1, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
         change1 = change1.moveTo(10.milliseconds, 0f, 0f)
         change2 = change2.moveTo(10.milliseconds, 3f, 3f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         change1 = change1.up(20.milliseconds)
         change2 = change2.up(20.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
 
         assertThat(log).hasSize(3)
         assertThat(log[0].methodName).isEqualTo("onStart")
@@ -581,7 +581,7 @@
 
     @Test
     fun onPointerInput_1down_downNotConsumed() {
-        val result = recognizer::onPointerInput.invokeOverAllPasses(down(0))
+        val result = filter::onPointerInput.invokeOverAllPasses(down(0))
         assertThat(result.consumed.downChange).isFalse()
     }
 
@@ -589,7 +589,7 @@
     fun onPointerInput_2Down_downNotConsumed() {
         val down1 = down(0, x = 1f, y = 1f)
         val down2 = down(1, x = 2f, y = 2f)
-        val result = recognizer::onPointerInput.invokeOverAllPasses(down1, down2)
+        val result = filter::onPointerInput.invokeOverAllPasses(down1, down2)
 
         assertThat(result.count { !it.consumed.downChange }).isEqualTo(2)
     }
@@ -600,10 +600,10 @@
 
         var change1 = down(0, x = 1f, y = 1f)
         var change2 = down(1, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         change1 = change1.moveTo(10.milliseconds, 0f, 0f)
         change2 = change2.moveTo(10.milliseconds, 3f, 3f)
-        val result = recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        val result = filter::onPointerInput.invokeOverAllPasses(change1, change2)
 
         assertThat(result.count { !it.anyPositionChangeConsumed() }).isEqualTo(2)
     }
@@ -612,11 +612,11 @@
     fun onPointerInput_unblocked2DownMoveCallBackDoesNotConsume_distanceChangeNotConsumed() {
         var change1 = down(0, x = 1f, y = 1f)
         var change2 = down(1, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
         change1 = change1.moveTo(10.milliseconds, 0f, 0f)
         change2 = change2.moveTo(10.milliseconds, 3f, 3f)
-        val result = recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        val result = filter::onPointerInput.invokeOverAllPasses(change1, change2)
 
         assertThat(result.count { !it.anyPositionChangeConsumed() }).isEqualTo(2)
     }
@@ -627,11 +627,11 @@
 
         var change1 = down(0, x = 1f, y = 1f)
         var change2 = down(1, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
         change1 = change1.moveTo(10.milliseconds, 0f, 0f)
         change2 = change2.moveTo(10.milliseconds, 3f, 3f)
-        val result = recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        val result = filter::onPointerInput.invokeOverAllPasses(change1, change2)
 
         assertThat(result.count { !it.anyPositionChangeConsumed() }).isEqualTo(2)
     }
@@ -643,13 +643,13 @@
 
         var change1 = down(0, x = 2f, y = 0f)
         var change2 = down(1, x = 4f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
 
         change1 = change1.moveTo(10.milliseconds, 0f, 0f)
         change2 = change2.moveTo(10.milliseconds, 6f, 0f)
         scaleObserver.resultingScaleChange = 2f
-        var result = recognizer::onPointerInput.invokeOverPasses(
+        var result = filter::onPointerInput.invokeOverPasses(
             listOf(change1, change2),
             listOf(
                 PointerEventPass.InitialDown,
@@ -659,7 +659,7 @@
             )
         )
         scaleObserver.resultingScaleChange = 1f
-        result = recognizer::onPointerInput
+        result = filter::onPointerInput
             .invokeOverPasses(result, listOf(PointerEventPass.PostDown))
 
         // Assert
@@ -677,13 +677,13 @@
 
         var change1 = down(0, x = 0f, y = 2f)
         var change2 = down(1, x = 0f, y = 4f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
 
         change1 = change1.moveTo(10.milliseconds, 0f, 0f)
         change2 = change2.moveTo(10.milliseconds, 0f, 6f)
         scaleObserver.resultingScaleChange = 2f
-        var result = recognizer::onPointerInput.invokeOverPasses(
+        var result = filter::onPointerInput.invokeOverPasses(
             listOf(change1, change2),
             listOf(
                 PointerEventPass.InitialDown,
@@ -693,7 +693,7 @@
             )
         )
         scaleObserver.resultingScaleChange = 1f
-        result = recognizer::onPointerInput
+        result = filter::onPointerInput
             .invokeOverPasses(result, listOf(PointerEventPass.PostDown))
 
         // Assert
@@ -710,11 +710,11 @@
 
         var change1 = down(0, x = 1f, y = 1f)
         var change2 = down(1, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
         change1 = change1.moveTo(10.milliseconds, 0f, 0f)
         change2 = change2.moveTo(10.milliseconds, 3f, 3f)
-        val result = recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        val result = filter::onPointerInput.invokeOverAllPasses(change1, change2)
 
         assertThat(result.first { it.id == PointerId(0) }.consumed.positionChange)
             .isEqualTo(PxPosition(-1.px, -1.px))
@@ -729,13 +729,13 @@
 
         var change1 = down(0, x = 0f, y = 0f)
         var change2 = down(1, x = 8f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
 
         change1 = change1.moveTo(10.milliseconds, 2f, 0f)
         change2 = change2.moveTo(10.milliseconds, 6f, 0f)
         scaleObserver.resultingScaleChange = .75f
-        var result = recognizer::onPointerInput.invokeOverPasses(
+        var result = filter::onPointerInput.invokeOverPasses(
             listOf(change1, change2),
             listOf(
                 PointerEventPass.InitialDown,
@@ -745,7 +745,7 @@
             )
         )
         scaleObserver.resultingScaleChange = 1f
-        result = recognizer::onPointerInput
+        result = filter::onPointerInput
             .invokeOverPasses(result, listOf(PointerEventPass.PostDown))
 
         // Assert
@@ -763,13 +763,13 @@
 
         var change1 = down(0, x = 0f, y = 0f)
         var change2 = down(1, x = 0f, y = 8f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
 
         change1 = change1.moveTo(10.milliseconds, 0f, 2f)
         change2 = change2.moveTo(10.milliseconds, 0f, 6f)
         scaleObserver.resultingScaleChange = .75f
-        var result = recognizer::onPointerInput.invokeOverPasses(
+        var result = filter::onPointerInput.invokeOverPasses(
             listOf(change1, change2),
             listOf(
                 PointerEventPass.InitialDown,
@@ -779,7 +779,7 @@
             )
         )
         scaleObserver.resultingScaleChange = 1f
-        result = recognizer::onPointerInput
+        result = filter::onPointerInput
             .invokeOverPasses(result, listOf(PointerEventPass.PostDown))
 
         // Assert
@@ -796,11 +796,11 @@
 
         var change1 = down(0, x = 0f, y = 0f)
         var change2 = down(1, x = 8f, y = 8f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
         change1 = change1.moveTo(10.milliseconds, 2f, 2f)
         change2 = change2.moveTo(10.milliseconds, 6f, 6f)
-        val result = recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        val result = filter::onPointerInput.invokeOverAllPasses(change1, change2)
 
         assertThat(result[0].consumed.positionChange).isEqualTo(PxPosition(2.px, 2.px))
         assertThat(result[1].consumed.positionChange).isEqualTo(PxPosition(-2.px, -2.px))
@@ -813,13 +813,13 @@
 
         var change1 = down(0, x = 2f, y = 0f)
         var change2 = down(1, x = 4f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
 
         change1 = change1.moveTo(10.milliseconds, 2f, 0f)
         change2 = change2.moveTo(10.milliseconds, 8f, 0f)
         scaleObserver.resultingScaleChange = 2f
-        var result = recognizer::onPointerInput.invokeOverPasses(
+        var result = filter::onPointerInput.invokeOverPasses(
             listOf(change1, change2),
             listOf(
                 PointerEventPass.InitialDown,
@@ -829,7 +829,7 @@
             )
         )
         scaleObserver.resultingScaleChange = 1f
-        result = recognizer::onPointerInput
+        result = filter::onPointerInput
             .invokeOverPasses(
                 result, listOf(PointerEventPass.PostDown)
             )
@@ -849,13 +849,13 @@
 
         var change1 = down(0, x = 0f, y = 2f)
         var change2 = down(1, x = 0f, y = 4f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
 
         change1 = change1.moveTo(10.milliseconds, 0f, 2f)
         change2 = change2.moveTo(10.milliseconds, 0f, 8f)
         scaleObserver.resultingScaleChange = 2f
-        var result = recognizer::onPointerInput.invokeOverPasses(
+        var result = filter::onPointerInput.invokeOverPasses(
             listOf(change1, change2),
             listOf(
                 PointerEventPass.InitialDown,
@@ -865,7 +865,7 @@
             )
         )
         scaleObserver.resultingScaleChange = 1f
-        result = recognizer::onPointerInput
+        result = filter::onPointerInput
             .invokeOverPasses(result, listOf(PointerEventPass.PostDown))
 
         // Assert
@@ -883,13 +883,13 @@
 
         var change1 = down(0, x = 0f, y = 0f)
         var change2 = down(1, x = 8f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
 
         change1 = change1.moveTo(10.milliseconds, 0f, 0f)
         change2 = change2.moveTo(10.milliseconds, 4f, 0f)
         scaleObserver.resultingScaleChange = .75f
-        var result = recognizer::onPointerInput.invokeOverPasses(
+        var result = filter::onPointerInput.invokeOverPasses(
             listOf(change1, change2),
             listOf(
                 PointerEventPass.InitialDown,
@@ -899,7 +899,7 @@
             )
         )
         scaleObserver.resultingScaleChange = 1f
-        result = recognizer::onPointerInput
+        result = filter::onPointerInput
             .invokeOverPasses(result, listOf(PointerEventPass.PostDown))
 
         // Assert
@@ -917,13 +917,13 @@
 
         var change1 = down(0, x = 0f, y = 0f)
         var change2 = down(1, x = 0f, y = 8f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
 
         change1 = change1.moveTo(10.milliseconds, 0f, 0f)
         change2 = change2.moveTo(10.milliseconds, 0f, 4f)
         scaleObserver.resultingScaleChange = .75f
-        var result = recognizer::onPointerInput.invokeOverPasses(
+        var result = filter::onPointerInput.invokeOverPasses(
             listOf(change1, change2),
             listOf(
                 PointerEventPass.InitialDown,
@@ -933,7 +933,7 @@
             )
         )
         scaleObserver.resultingScaleChange = 1f
-        result = recognizer::onPointerInput
+        result = filter::onPointerInput
             .invokeOverPasses(result, listOf(PointerEventPass.PostDown))
 
         // Assert
@@ -951,13 +951,13 @@
 
         var change1 = down(0, x = -1f, y = 0f)
         var change2 = down(1, x = 1f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
 
         change1 = change1.moveTo(10.milliseconds, 0f, -3f)
         change2 = change2.moveTo(10.milliseconds, 0f, 3f)
         scaleObserver.resultingScaleChange = 2f
-        var result = recognizer::onPointerInput.invokeOverPasses(
+        var result = filter::onPointerInput.invokeOverPasses(
             listOf(change1, change2),
             listOf(
                 PointerEventPass.InitialDown,
@@ -967,7 +967,7 @@
             )
         )
         scaleObserver.resultingScaleChange = 1f
-        result = recognizer::onPointerInput
+        result = filter::onPointerInput
             .invokeOverPasses(result, listOf(PointerEventPass.PostDown))
 
         // Assert
@@ -985,13 +985,13 @@
 
         var change1 = down(0, x = -4f, y = 0f)
         var change2 = down(1, x = 4f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
 
         change1 = change1.moveTo(10.milliseconds, 0f, -2f)
         change2 = change2.moveTo(10.milliseconds, 0f, 2f)
         scaleObserver.resultingScaleChange = .75f
-        var result = recognizer::onPointerInput.invokeOverPasses(
+        var result = filter::onPointerInput.invokeOverPasses(
             listOf(change1, change2),
             listOf(
                 PointerEventPass.InitialDown,
@@ -1001,7 +1001,7 @@
             )
         )
         scaleObserver.resultingScaleChange = 1f
-        result = recognizer::onPointerInput
+        result = filter::onPointerInput
             .invokeOverPasses(result, listOf(PointerEventPass.PostDown))
 
         // Assert
@@ -1018,13 +1018,13 @@
 
         var change1 = down(0, x = 1f, y = 1f)
         var change2 = down(1, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         change1 = change1.moveTo(10.milliseconds, 0f, 0f)
         change2 = change2.moveTo(10.milliseconds, 3f, 3f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         change1 = change1.up(20.milliseconds)
         change2 = change2.up(20.milliseconds)
-        val result = recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        val result = filter::onPointerInput.invokeOverAllPasses(change1, change2)
 
         assertThat(result.count { it.consumed.downChange }).isEqualTo(0)
     }
@@ -1035,11 +1035,11 @@
 
         var change1 = down(0, x = 1f, y = 1f)
         var change2 = down(1, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
         change1 = change1.up(20.milliseconds)
         change2 = change2.up(20.milliseconds)
-        val result = recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        val result = filter::onPointerInput.invokeOverAllPasses(change1, change2)
 
         assertThat(result.count { it.consumed.downChange }).isEqualTo(0)
     }
@@ -1048,14 +1048,14 @@
     fun onPointerInput_scale1Up_upChangeConsumed() {
         var change1 = down(0, x = 1f, y = 1f)
         var change2 = down(1, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
         change1 = change1.moveTo(10.milliseconds, 0f, 0f)
         change2 = change2.moveTo(10.milliseconds, 3f, 3f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         change1 = change1.up(20.milliseconds)
         change2 = change2.moveTo(20.milliseconds, 3f, 3f)
-        val result = recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        val result = filter::onPointerInput.invokeOverAllPasses(change1, change2)
 
         assertThat(result.first { it.id == PointerId(0) }.consumed.downChange).isTrue()
     }
@@ -1064,14 +1064,14 @@
     fun onPointerInput_scale2Up_onStopConsumesUp() {
         var change1 = down(0, x = 1f, y = 1f)
         var change2 = down(1, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         scaleStartBlocked = false
         change1 = change1.moveTo(10.milliseconds, 0f, 0f)
         change2 = change2.moveTo(10.milliseconds, 3f, 3f)
-        recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        filter::onPointerInput.invokeOverAllPasses(change1, change2)
         change1 = change1.up(20.milliseconds)
         change2 = change2.up(20.milliseconds)
-        val result = recognizer::onPointerInput.invokeOverAllPasses(change1, change2)
+        val result = filter::onPointerInput.invokeOverAllPasses(change1, change2)
 
         assertThat(result.count { it.consumed.downChange }).isEqualTo(2)
     }
@@ -1081,9 +1081,9 @@
     @Test
     fun onCancel_downCancel_onCancelNotCalled() {
         val down = down(0)
-        recognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         scaleStartBlocked = false
-        recognizer.onCancel()
+        filter.onCancel()
 
         assertThat(log.filter { it.methodName == "onCancel" }).isEmpty()
     }
@@ -1092,12 +1092,12 @@
     fun onCancel_blockedDownMoveCancel_onCancelNotCalled() {
         var pointer1 = down(0, x = 1f, y = 1f)
         var pointer2 = down(0, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         scaleStartBlocked = true
         pointer1 = pointer1.moveBy(10.milliseconds, dx = 1f, dy = 0f)
         pointer2 = pointer2.moveBy(10.milliseconds, dx = 0f, dy = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
-        recognizer.onCancel()
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter.onCancel()
 
         assertThat(log.filter { it.methodName == "onCancel" }).isEmpty()
     }
@@ -1108,12 +1108,12 @@
     fun onCancel_downMoveCancel_onCancelCalledOnce() {
         var pointer1 = down(0, x = 1f, y = 1f)
         var pointer2 = down(0, x = 2f, y = 2f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         scaleStartBlocked = false
         pointer1 = pointer1.moveBy(10.milliseconds, dx = 1f, dy = 0f)
         pointer2 = pointer2.moveBy(10.milliseconds, dx = 0f, dy = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
-        recognizer.onCancel()
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter.onCancel()
 
         assertThat(log.count { it.methodName == "onCancel" }).isEqualTo(1)
     }
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/ScaleSlopExceededGestureDetectorTest.kt b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/ScaleSlopExceededGestureFilterTest.kt
similarity index 87%
rename from ui/ui-framework/src/test/java/androidx/ui/core/gesture/ScaleSlopExceededGestureDetectorTest.kt
rename to ui/ui-framework/src/test/java/androidx/ui/core/gesture/ScaleSlopExceededGestureFilterTest.kt
index 2304cec..a70b309 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/ScaleSlopExceededGestureDetectorTest.kt
+++ b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/ScaleSlopExceededGestureFilterTest.kt
@@ -37,19 +37,19 @@
 private const val TestTouchSlop = 5
 
 @RunWith(JUnit4::class)
-class ScaleSlopExceededGestureDetectorTest {
+class ScaleSlopExceededGestureFilterTest {
 
     private val onScaleSlopExceeded: () -> Unit = { onScaleSlopExceededCount++ }
     private var onScaleSlopExceededCount: Int = 0
-    private lateinit var mRecognizer: ScaleSlopExceededGestureRecognizer
+    private lateinit var filter: ScaleSlopExceededGestureFilter
 
     private val TinyNum = .01f
 
     @Before
     fun setup() {
         onScaleSlopExceededCount = 0
-        mRecognizer = ScaleSlopExceededGestureRecognizer(TestTouchSlop.px)
-        mRecognizer.onScaleSlopExceeded = onScaleSlopExceeded
+        filter = ScaleSlopExceededGestureFilter(TestTouchSlop.px)
+        filter.onScaleSlopExceeded = onScaleSlopExceeded
     }
 
     // Verifies the circumstances under which onScaleSlopExceeded should not be called.
@@ -57,14 +57,14 @@
     @Test
     fun onPointerInputChanges_1PointerMoves10TimesScaleSlopInXAndY_onTouchSlopExceededNotCalled() {
         var pointer = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
 
         pointer = pointer.moveBy(
             Duration(milliseconds = 10),
             TestTouchSlop.toFloat() * 10,
             TestTouchSlop.toFloat() * 10
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
 
         assertThat(onScaleSlopExceededCount).isEqualTo(0)
     }
@@ -458,7 +458,7 @@
         // Arrange
         var pointer1 = down(0, 0.milliseconds, 0f, 0f)
         var pointer2 = down(1, 0.milliseconds, 0f, 50f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         // Act
 
@@ -473,7 +473,7 @@
             10f,
             100f
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         // Translate, rotate and scale down.
         pointer1 = pointer1.moveTo(
@@ -486,7 +486,7 @@
             -40f,
             75f
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         // Translate, rotate and scale up.
         pointer1 = pointer1.moveTo(
@@ -499,7 +499,7 @@
             40f,
             -20f
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         // Translate, rotate and scale down.
         pointer1 = pointer1.moveTo(
@@ -512,7 +512,7 @@
             20f,
             -80f
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         assertThat(onScaleSlopExceededCount).isEqualTo(0)
     }
@@ -522,7 +522,7 @@
         // Arrange
         var pointer1 = down(0, 0.milliseconds, 0f, 0f)
         var pointer2 = down(1, 0.milliseconds, 0f, 20f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         // Act
 
@@ -537,7 +537,7 @@
             0f,
             30 + TinyNum
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         // Under
         pointer1 = pointer1.moveTo(
@@ -550,7 +550,7 @@
             0f,
             30 - TinyNum
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         // Over
         pointer1 = pointer1.moveTo(
@@ -563,7 +563,7 @@
             0f,
             30 + TinyNum
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         assertThat(onScaleSlopExceededCount).isEqualTo(1)
     }
@@ -574,7 +574,7 @@
         // Arrange
         var pointer1 = down(0, 0.milliseconds, 0f, 0f)
         var pointer2 = down(1, 0.milliseconds, 1f, 0f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         // Act
 
@@ -590,7 +590,7 @@
                 1f,
                 0f
             )
-            mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+            filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         }
 
         // Verify that we have not gone over.
@@ -607,7 +607,7 @@
             TinyNum,
             0f
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         // Verify we have gone over.
         assertThat(onScaleSlopExceededCount).isEqualTo(1)
@@ -618,7 +618,7 @@
         // Arrange
         var pointer1 = down(0, 0.milliseconds, 0f, 0f)
         var pointer2 = down(1, 0.milliseconds, 0f, 1f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         // Act
 
@@ -634,7 +634,7 @@
                 0f,
                 1f
             )
-            mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+            filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
         }
 
         // Verify that we have not gone over.
@@ -651,7 +651,7 @@
             0f,
             TinyNum
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         // Verify we have gone over.
         assertThat(onScaleSlopExceededCount).isEqualTo(1)
@@ -666,7 +666,7 @@
 
         var pointer1 = down(0, 0.milliseconds, 0f, 0f)
         var pointer2 = down(1, 0L.milliseconds, 1f, 0f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         pointer1 = pointer1.moveTo(
             10.milliseconds,
@@ -678,15 +678,15 @@
             11f,
             0f
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         // Act
 
-        mRecognizer.onCancel()
+        filter.onCancel()
 
         pointer1 = down(0, 0.milliseconds, 0f, 0f)
         pointer2 = down(1, 0L.milliseconds, 1f, 0f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         pointer1 = pointer1.moveTo(
             10.milliseconds,
@@ -698,7 +698,7 @@
             11f,
             0f
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         // Assert
 
@@ -712,7 +712,7 @@
 
         var pointer1 = down(0, 0.milliseconds, 0f, 0f)
         var pointer2 = down(1, 0L.milliseconds, 1f, 0f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         pointer1 = pointer1.moveTo(
             10.milliseconds,
@@ -724,15 +724,15 @@
             11 + TinyNum,
             0f
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         // Act
 
-        mRecognizer.onCancel()
+        filter.onCancel()
 
         pointer1 = down(0, 0.milliseconds, 0f, 0f)
         pointer2 = down(1, 0L.milliseconds, 1f, 0f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         pointer1 = pointer1.moveTo(
             10.milliseconds,
@@ -744,7 +744,7 @@
             11 + TinyNum,
             0f
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         // Assert
 
@@ -765,7 +765,7 @@
         // Arrange
         var pointer1 = down(0, 0.milliseconds, x1s, y1s)
         var pointer2 = down(1, 0L.milliseconds, x2s, y2s)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         // Act
         pointer1 = pointer1.moveTo(
@@ -778,7 +778,7 @@
             x2e,
             y2e
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         assertThat(onScaleSlopExceededCount).isEqualTo(expectedCound)
     }
@@ -802,7 +802,7 @@
         var pointer1 = down(0, 0.milliseconds, x1s, y1s)
         var pointer2 = down(1, 0.milliseconds, x2s, y2s)
         var pointer3 = down(2, 0.milliseconds, x3s, y3s)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
 
         // Act
         pointer1 = pointer1.moveTo(
@@ -820,7 +820,7 @@
             x3e,
             y3e
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2, pointer3)
 
         assertThat(onScaleSlopExceededCount).isEqualTo(expectedCound)
     }
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/TapGestureDetectorTest.kt b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/TapGestureFilterTest.kt
similarity index 61%
rename from ui/ui-framework/src/test/java/androidx/ui/core/gesture/TapGestureDetectorTest.kt
rename to ui/ui-framework/src/test/java/androidx/ui/core/gesture/TapGestureFilterTest.kt
index 49a0b4ac..94abe3e 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/TapGestureDetectorTest.kt
+++ b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/TapGestureFilterTest.kt
@@ -38,102 +38,102 @@
 import org.junit.runners.JUnit4
 
 @RunWith(JUnit4::class)
-class TapGestureDetectorTest {
+class TapGestureFilterTest {
 
-    private lateinit var recognizer: TapGestureRecognizer
+    private lateinit var filter: TapGestureFilter
 
     @Before
     fun setup() {
-        recognizer = TapGestureRecognizer()
-        recognizer.onTap = mock()
+        filter = TapGestureFilter()
+        filter.onTap = mock()
     }
 
     // Verification for when onReleased should not be called.
 
     @Test
     fun pointerInputHandler_down_onReleaseNotCalled() {
-        recognizer::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
-        verify(recognizer.onTap, never()).invoke()
+        filter::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
+        verify(filter.onTap, never()).invoke()
     }
 
     @Test
     fun pointerInputHandler_downConsumedUp_onReleaseNotCalled() {
         var pointer = down(0, 0.milliseconds).consumeDownChange()
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
         pointer = pointer.up(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
 
-        verify(recognizer.onTap, never()).invoke()
+        verify(filter.onTap, never()).invoke()
     }
 
     @Test
     fun pointerInputHandler_downMoveConsumedUp_onReleaseNotCalled() {
         var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
         pointer = pointer.moveTo(100.milliseconds, 5f).consume(5f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
         pointer = pointer.up(200.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
 
-        verify(recognizer.onTap, never()).invoke()
+        verify(filter.onTap, never()).invoke()
     }
 
     @Test
     fun pointerInputHandler_downUpConsumed_onReleaseNotCalled() {
         var pointer = down(0, 0.milliseconds).consumeDownChange()
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
         pointer = pointer.up(100.milliseconds).consumeDownChange()
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
 
-        verify(recognizer.onTap, never()).invoke()
+        verify(filter.onTap, never()).invoke()
     }
 
     @Test
     fun pointerInputHandler_downMoveOutsideBoundsNegativeXUp_onReleaseNotCalled() {
         var pointer = down(0, 0.milliseconds, x = 0f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.moveTo(50.milliseconds, -1f, 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.up(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
 
-        verify(recognizer.onTap, never()).invoke()
+        verify(filter.onTap, never()).invoke()
     }
 
     @Test
     fun pointerInputHandler_downMoveOutsideBoundsPositiveXUp_onReleaseNotCalled() {
         var pointer = down(0, 0.milliseconds, x = 0f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.moveTo(50.milliseconds, 1f, 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.up(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
 
-        verify(recognizer.onTap, never()).invoke()
+        verify(filter.onTap, never()).invoke()
     }
 
     @Test
     fun pointerInputHandler_downMoveOutsideBoundsNegativeYUp_onReleaseNotCalled() {
         var pointer = down(0, 0.milliseconds, x = 0f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.moveTo(50.milliseconds, 0f, -1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.up(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
 
-        verify(recognizer.onTap, never()).invoke()
+        verify(filter.onTap, never()).invoke()
     }
 
     @Test
     fun pointerInputHandler_downMoveOutsideBoundsPositiveYUp_onReleaseNotCalled() {
         var pointer = down(0, 0.milliseconds, x = 0f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.moveTo(50.milliseconds, 0f, 1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.up(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
 
-        verify(recognizer.onTap, never()).invoke()
+        verify(filter.onTap, never()).invoke()
     }
 
     // Verification for when onReleased should be called.
@@ -141,48 +141,48 @@
     @Test
     fun pointerInputHandler_downUp_onReleaseCalledOnce() {
         var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
         pointer = pointer.up(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
 
-        verify(recognizer.onTap).invoke()
+        verify(filter.onTap).invoke()
     }
 
     @Test
     fun pointerInputHandler_downMoveUp_onReleaseCalledOnce() {
         var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
         pointer = pointer.moveTo(100.milliseconds, 5f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
         pointer = pointer.up(200.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
 
-        verify(recognizer.onTap).invoke()
+        verify(filter.onTap).invoke()
     }
 
     @Test
     fun pointerInputHandler_downMoveOutsideBoundsUpDownUp_onReleaseCalledOnce() {
         var pointer = down(0, 0.milliseconds, x = 0f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.moveTo(50.milliseconds, 0f, 1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.up(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = down(1, duration = 150.milliseconds, x = 0f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.up(200.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
 
-        verify(recognizer.onTap).invoke()
+        verify(filter.onTap).invoke()
     }
 
     // Verification for when the down change should not be consumed.
 
     @Test
     fun pointerInputHandler_consumeDownOnStartIsFalse_downChangeNotConsumed() {
-        recognizer.consumeDownOnStart = false
+        filter.consumeDownOnStart = false
         val pointerEventChange =
-            recognizer::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
+            filter::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
         assertThat(pointerEventChange.consumed.downChange, `is`(false))
     }
 
@@ -191,7 +191,7 @@
     @Test
     fun pointerInputHandler_consumeDownOnStartIsDefault_downChangeConsumed() {
         val pointerEventChange =
-            recognizer::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
+            filter::onPointerInput.invokeOverAllPasses(down(0, 0.milliseconds))
         assertThat(pointerEventChange.consumed.downChange, `is`(true))
     }
 
@@ -200,12 +200,12 @@
     @Test
     fun pointerInputHandler_downMoveOutsideBoundsNegativeXUp_upChangeNotConsumed() {
         var pointer = down(0, 0.milliseconds, x = 0f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.moveTo(50.milliseconds, -1f, 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.up(100.milliseconds)
         val result =
-            recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+            filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
 
         assertThat(result.consumed.downChange, `is`(false))
     }
@@ -213,12 +213,12 @@
     @Test
     fun pointerInputHandler_downMoveOutsideBoundsPositiveXUp_upChangeNotConsumed() {
         var pointer = down(0, 0.milliseconds, x = 0f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.moveTo(50.milliseconds, 1f, 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.up(100.milliseconds)
         val result =
-            recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+            filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
 
         assertThat(result.consumed.downChange, `is`(false))
     }
@@ -226,12 +226,12 @@
     @Test
     fun pointerInputHandler_downMoveOutsideBoundsNegativeYUp_upChangeNotConsumed() {
         var pointer = down(0, 0.milliseconds, x = 0f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.moveTo(50.milliseconds, 0f, -1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.up(100.milliseconds)
         val result =
-            recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+            filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
 
         assertThat(result.consumed.downChange, `is`(false))
     }
@@ -239,13 +239,13 @@
     @Test
     fun pointerInputHandler_downMoveOutsideBoundsPositiveYUp_upChangeNotConsumed() {
         var pointer = down(0, 0.milliseconds, x = 0f, y = 0f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.moveTo(50.milliseconds, 0f, 1f)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+        filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
         pointer = pointer.up(100.milliseconds)
 
         val result =
-            recognizer::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
+            filter::onPointerInput.invokeOverAllPasses(pointer, IntPxSize(1.ipx, 1.ipx))
 
         assertThat(result.consumed.downChange, `is`(false))
     }
@@ -255,9 +255,9 @@
     @Test
     fun pointerInputHandler_upChangeConsumed() {
         var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
         pointer = pointer.up(100.milliseconds)
-        val pointerEventChange = recognizer::onPointerInput.invokeOverAllPasses(pointer)
+        val pointerEventChange = filter::onPointerInput.invokeOverAllPasses(pointer)
         assertThat(pointerEventChange.consumed.downChange, `is`(true))
     }
 
@@ -266,7 +266,7 @@
     @Test
     fun pointerInputHandler_downChangeConsumedDuringPostUp() {
         var pointerEventChange = down(0, 0.milliseconds)
-        pointerEventChange = recognizer::onPointerInput.invokeOverPasses(
+        pointerEventChange = filter::onPointerInput.invokeOverPasses(
             pointerEventChange,
             PointerEventPass.InitialDown,
             PointerEventPass.PreUp,
@@ -274,7 +274,7 @@
         )
         assertThat(pointerEventChange.consumed.downChange, `is`(false))
 
-        pointerEventChange = recognizer::onPointerInput.invokeOverPasses(
+        pointerEventChange = filter::onPointerInput.invokeOverPasses(
             pointerEventChange,
             PointerEventPass.PostUp,
             IntPxSize(0.ipx, 0.ipx)
@@ -285,9 +285,9 @@
     @Test
     fun pointerInputHandler_upChangeConsumedDuringPostUp() {
         val pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
         var pointerEventChange = pointer.up(100.milliseconds)
-        pointerEventChange = recognizer::onPointerInput.invokeOverPasses(
+        pointerEventChange = filter::onPointerInput.invokeOverPasses(
             pointerEventChange,
             PointerEventPass.InitialDown,
             PointerEventPass.PreUp,
@@ -295,7 +295,7 @@
         )
         assertThat(pointerEventChange.consumed.downChange, `is`(false))
 
-        pointerEventChange = recognizer::onPointerInput.invokeOverPasses(
+        pointerEventChange = filter::onPointerInput.invokeOverPasses(
             pointerEventChange,
             PointerEventPass.PostUp,
             IntPxSize(0.ipx, 0.ipx)
@@ -308,11 +308,11 @@
     @Test
     fun cancelationHandler_downCancelUp_onReleaseNotCalled() {
         var pointer = down(0, 0.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
-        recognizer.onCancel()
+        filter::onPointerInput.invokeOverAllPasses(pointer)
+        filter.onCancel()
         pointer = pointer.up(100.milliseconds)
-        recognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
 
-        verify(recognizer.onTap, never()).invoke()
+        verify(filter.onTap, never()).invoke()
     }
 }
\ No newline at end of file
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/TouchSlopExceededGestureDetectorTest.kt b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/TouchSlopExceededGestureFilterTest.kt
similarity index 77%
rename from ui/ui-framework/src/test/java/androidx/ui/core/gesture/TouchSlopExceededGestureDetectorTest.kt
rename to ui/ui-framework/src/test/java/androidx/ui/core/gesture/TouchSlopExceededGestureFilterTest.kt
index 377fdff..1fb74f0 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/gesture/TouchSlopExceededGestureDetectorTest.kt
+++ b/ui/ui-framework/src/test/java/androidx/ui/core/gesture/TouchSlopExceededGestureFilterTest.kt
@@ -40,13 +40,13 @@
 // Test for cases with more than one pointer
 // Test for cases where things are reset when last pointer goes up
 // Verify all methods called during onPostUp
-// Verify default behavior when no callback provided for recognizer or canDrag
+// Verify default behavior when no callback provided for filter or canDrag
 
 // Changing this value will break tests that expect the value to be 10.
 private const val TestTouchSlop = 10
 
 @RunWith(JUnit4::class)
-class TouchSlopExceededGestureDetectorTest {
+class TouchSlopExceededGestureFilterTest {
 
     private val onTouchSlopExceeded: () -> Unit = { onTouchSlopExceededCallCount++ }
     private val canDrag: (Direction) -> Boolean = { direction ->
@@ -56,7 +56,7 @@
     private var onTouchSlopExceededCallCount: Int = 0
     private var canDragReturn = false
     private var canDragDirections: MutableList<Direction> = mutableListOf()
-    private lateinit var mRecognizer: TouchSlopExceededGestureRecognizer
+    private lateinit var filter: TouchSlopExceededGestureFilter
 
     private val TinyNum = .01f
 
@@ -65,26 +65,26 @@
         onTouchSlopExceededCallCount = 0
         canDragReturn = true
         canDragDirections.clear()
-        mRecognizer =
-            TouchSlopExceededGestureRecognizer(TestTouchSlop.px)
-        mRecognizer.canDrag = canDrag
-        mRecognizer.onTouchSlopExceeded = onTouchSlopExceeded
+        filter =
+            TouchSlopExceededGestureFilter(TestTouchSlop.px)
+        filter.canDrag = canDrag
+        filter.onTouchSlopExceeded = onTouchSlopExceeded
     }
 
     // Verify the circumstances under which canDrag should not be called.
 
     @Test
     fun onPointerInputChanges_down_canDragNotCalled() {
-        mRecognizer::onPointerInput.invokeOverAllPasses(down(0))
+        filter::onPointerInput.invokeOverAllPasses(down(0))
         assertThat(canDragDirections).isEmpty()
     }
 
     @Test
     fun onPointerInputChanges_downUp_canDragNotCalled() {
         val down = down(0, duration = 0.milliseconds)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         val up = down.up(10.milliseconds)
-        mRecognizer::onPointerInput.invokeOverAllPasses(up)
+        filter::onPointerInput.invokeOverAllPasses(up)
 
         assertThat(canDragDirections).isEmpty()
     }
@@ -92,9 +92,9 @@
     @Test
     fun onPointerInputChanges_downMoveFullyConsumed_canDragNotCalled() {
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         val move = down.moveBy(Duration(milliseconds = 10), 3f, 5f).consume(3f, 5f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         assertThat(canDragDirections).isEmpty()
     }
@@ -104,9 +104,9 @@
     @Test
     fun onPointerInputChanges_downMove1Dimension_canDragCalledOnce() {
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         val move = down.moveBy(Duration(milliseconds = 10), 3f, 0f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         // Twice because while under touch slop, TouchSlopExceededGestureDetector checks during PostUp and PostDown
         assertThat(canDragDirections).hasSize(2)
@@ -115,9 +115,9 @@
     @Test
     fun onPointerInputChanges_downMove2Dimensions_canDragCalledTwice() {
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         val move = down.moveBy(Duration(milliseconds = 10), 3f, 5f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         // 4 times because while under touch slop, TouchSlopExceededGestureDetector checks during PostUp and
         // PostDown
@@ -127,9 +127,9 @@
     @Test
     fun onPointerInputChanges_downMoveOneDimensionPartiallyConsumed_canDragCalledOnce() {
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         val move = down.moveBy(Duration(milliseconds = 10), 0f, 5f).consume(0f, 4f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         // Twice because while under touch slop, DragGestureDetector checks during PostUp and
         // PostDown
@@ -139,9 +139,9 @@
     @Test
     fun onPointerInputChanges_downMoveTwoDimensionPartiallyConsumed_canDragCalledTwice() {
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         val move = down.moveBy(Duration(milliseconds = 10), 3f, 5f).consume(2f, 4f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         // 4 times because while under touch slop, DragGestureDetector checks during PostUp and
         // PostDown
@@ -153,12 +153,12 @@
         val beyondSlop = TestTouchSlop + TinyNum
 
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         var move = down.moveTo(10.milliseconds, 0f, beyondSlop)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
         repeat(3) {
             move = move.moveBy(Duration(milliseconds = 10), 0f, 1f)
-            mRecognizer::onPointerInput.invokeOverAllPasses(move)
+            filter::onPointerInput.invokeOverAllPasses(move)
         }
 
         // Once because although DragGestureDetector checks during PostUp and PostDown, slop is
@@ -171,11 +171,11 @@
         val thirdSlop = TestTouchSlop / 3
 
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         var move = down
         repeat(3) {
             move = move.moveBy(Duration(milliseconds = 10), 0f, thirdSlop.toFloat())
-            mRecognizer::onPointerInput.invokeOverAllPasses(move)
+            filter::onPointerInput.invokeOverAllPasses(move)
         }
 
         // 6 times because while under touch slop, DragGestureDetector checks during PostUp and
@@ -188,16 +188,16 @@
         val beyondSlop = TestTouchSlop + TinyNum
 
         var event = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(event)
+        filter::onPointerInput.invokeOverAllPasses(event)
         // Out of touch slop region
         event = event.moveBy(Duration(milliseconds = 10), 0f, beyondSlop)
-        mRecognizer::onPointerInput.invokeOverAllPasses(event)
+        filter::onPointerInput.invokeOverAllPasses(event)
         // Back into touch slop region
         event = event.moveBy(Duration(milliseconds = 10), 0f, -beyondSlop)
-        mRecognizer::onPointerInput.invokeOverAllPasses(event)
+        filter::onPointerInput.invokeOverAllPasses(event)
         // Out of touch slop region again
         event = event.moveBy(Duration(milliseconds = 10), 0f, beyondSlop)
-        mRecognizer::onPointerInput.invokeOverAllPasses(event)
+        filter::onPointerInput.invokeOverAllPasses(event)
 
         // Once because although DragGestureDetector checks during PostUp and PostDown, slop is
         // surpassed during PostUp, and thus isn't checked again.
@@ -241,9 +241,9 @@
     ) {
         canDragDirections.clear()
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         val move = down.moveBy(Duration(milliseconds = 10), dx, dy)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         // Everything here is twice because DragGestureDetector checks during PostUp and PostDown.
         assertThat(canDragDirections).hasSize(expectedDirections.size * 2)
@@ -261,13 +261,13 @@
     @Test
     fun onPointerInputChanges_downMoveWithinSlop_onTouchSlopExceededNotCalled() {
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         val move = down.moveBy(
             Duration(milliseconds = 10),
             TestTouchSlop.toFloat(),
             TestTouchSlop.toFloat()
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         assertThat(onTouchSlopExceededCallCount).isEqualTo(0)
     }
@@ -278,13 +278,13 @@
         canDragReturn = false
 
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         val move = down.moveBy(
             Duration(milliseconds = 10),
             beyondSlop,
             beyondSlop
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         assertThat(onTouchSlopExceededCallCount).isEqualTo(0)
     }
@@ -293,10 +293,10 @@
     fun onPointerInputChanges_moveBeyondSlopButConsumeUnder_onTouchSlopExceededNotCalled() {
 
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
 
         val move = down.moveBy(10.milliseconds, TestTouchSlop + TinyNum, 0f).consume(dx = 1f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         // Assert
 
@@ -307,10 +307,10 @@
     fun onPointerInputChanges_moveUnderToPostUpThenModOverInOppDir_onTouchSlopExceededNotCalled() {
 
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
 
         val move = down.moveBy(10.milliseconds, TestTouchSlop.toFloat(), 0f)
-        mRecognizer::onPointerInput.invokeOverPasses(
+        filter::onPointerInput.invokeOverPasses(
             listOf(move),
             listOf(
                 PointerEventPass.InitialDown,
@@ -320,7 +320,7 @@
             )
         )
         val move2 = move.consume(dx = (TestTouchSlop * 2f + TinyNum))
-        mRecognizer::onPointerInput.invokeOverPasses(
+        filter::onPointerInput.invokeOverPasses(
             move2,
             PointerEventPass.PostDown
         )
@@ -338,46 +338,46 @@
         val slop = TestTouchSlop.toFloat()
 
         var change = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
 
         // Go around the border of the touch slop area
 
         // To top left
         change = change.moveTo(10.milliseconds, -slop, -slop)
-        mRecognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         // To bottom left
         change = change.moveTo(20.milliseconds, -slop, slop)
-        mRecognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         // To bottom right
         change = change.moveTo(30.milliseconds, slop, slop)
-        mRecognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         // To top right
         change = change.moveTo(40.milliseconds, slop, -slop)
-        mRecognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
 
         // Jump from corner to opposite corner and back
 
         // To bottom left
         change = change.moveTo(50.milliseconds, -slop, slop)
-        mRecognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         // To top right
         change = change.moveTo(60.milliseconds, slop, -slop)
-        mRecognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
 
         // Move the other diagonal
 
         // To top left
         change = change.moveTo(70.milliseconds, -slop, -slop)
-        mRecognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
 
         // Jump from corner to opposite corner and back
 
         // To bottom right
         change = change.moveTo(80.milliseconds, slop, slop)
-        mRecognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         // To top left
         change = change.moveTo(90.milliseconds, -slop, -slop)
-        mRecognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
 
         assertThat(onTouchSlopExceededCallCount).isEqualTo(0)
     }
@@ -389,13 +389,13 @@
         val beyondSlop = TestTouchSlop + TinyNum
 
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         val move = down.moveBy(
             Duration(milliseconds = 100),
             beyondSlop,
             0f
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         assertThat(onTouchSlopExceededCallCount).isEqualTo(1)
     }
@@ -404,19 +404,19 @@
     fun onPointerInputChanges_movePassedSlopIn2Events_onTouchSlopExceededCallOnce() {
 
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         val move = down.moveBy(
             Duration(milliseconds = 100),
             TestTouchSlop.toFloat(),
             0f
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
         val move2 = down.moveBy(
             Duration(milliseconds = 100),
             1f,
             0f
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(move2)
+        filter::onPointerInput.invokeOverAllPasses(move2)
 
         assertThat(onTouchSlopExceededCallCount).isEqualTo(1)
     }
@@ -426,16 +426,16 @@
         val beyondSlop = TestTouchSlop + TinyNum
 
         var event = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(event)
+        filter::onPointerInput.invokeOverAllPasses(event)
         // Out of touch slop region
         event = event.moveBy(Duration(milliseconds = 10), 0f, beyondSlop)
-        mRecognizer::onPointerInput.invokeOverAllPasses(event)
+        filter::onPointerInput.invokeOverAllPasses(event)
         // Back into touch slop region
         event = event.moveBy(Duration(milliseconds = 10), 0f, -beyondSlop)
-        mRecognizer::onPointerInput.invokeOverAllPasses(event)
+        filter::onPointerInput.invokeOverAllPasses(event)
         // Out of touch slop region again
         event = event.moveBy(Duration(milliseconds = 10), 0f, beyondSlop)
-        mRecognizer::onPointerInput.invokeOverAllPasses(event)
+        filter::onPointerInput.invokeOverAllPasses(event)
 
         assertThat(onTouchSlopExceededCallCount).isEqualTo(1)
     }
@@ -445,9 +445,9 @@
         val beyondSlop = TestTouchSlop + TinyNum
 
         val down = down(0).consumeDownChange()
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
         val move = down.moveBy(Duration(milliseconds = 100), beyondSlop, 0f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         assertThat(onTouchSlopExceededCallCount).isEqualTo(1)
     }
@@ -457,7 +457,7 @@
         val beyondSlop = TestTouchSlop + TinyNum
 
         var change = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         canDragReturn = false
         change = change.moveBy(
             Duration(milliseconds = 10),
@@ -468,13 +468,13 @@
         assertThat(onTouchSlopExceededCallCount).isEqualTo(0)
 
         canDragReturn = true
-        mRecognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
         change = change.moveBy(
             Duration(milliseconds = 10),
             0f,
             -beyondSlop
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(change)
+        filter::onPointerInput.invokeOverAllPasses(change)
 
         assertThat(onTouchSlopExceededCallCount).isEqualTo(1)
     }
@@ -488,7 +488,7 @@
 
         var pointer1 = down(1)
         var pointer2 = down(2)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         // Act
 
@@ -502,7 +502,7 @@
             -beyondSlop,
             0f
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
+        filter::onPointerInput.invokeOverAllPasses(pointer1, pointer2)
 
         // Assert
 
@@ -517,7 +517,7 @@
         val beyondSlop = TestTouchSlop + TinyNum
 
         val pointers = arrayOf(down(0), down(1), down(2))
-        mRecognizer::onPointerInput.invokeOverAllPasses(*pointers)
+        filter::onPointerInput.invokeOverAllPasses(*pointers)
 
         // Act
 
@@ -540,7 +540,7 @@
                 0f,
                 beyondSlop * 2
             )
-        mRecognizer::onPointerInput.invokeOverAllPasses(*pointers)
+        filter::onPointerInput.invokeOverAllPasses(*pointers)
 
         // Assert
 
@@ -555,7 +555,7 @@
         val beyondSlop = TestTouchSlop + TinyNum
 
         val pointers = arrayOf(down(0), down(1), down(2), down(3), down(4))
-        mRecognizer::onPointerInput.invokeOverAllPasses(*pointers)
+        filter::onPointerInput.invokeOverAllPasses(*pointers)
 
         // Act
 
@@ -573,7 +573,7 @@
                 beyondSlop * -1,
                 0f
             )
-        mRecognizer::onPointerInput.invokeOverAllPasses(*pointers)
+        filter::onPointerInput.invokeOverAllPasses(*pointers)
 
         // Assert
 
@@ -588,13 +588,13 @@
         val beyondSlop = TestTouchSlop + TinyNum
 
         var pointer = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
 
         // Act
 
         repeat(5) {
             pointer = pointer.moveBy(100.milliseconds, beyondSlop, beyondSlop)
-            mRecognizer::onPointerInput.invokeOverAllPasses(pointer)
+            filter::onPointerInput.invokeOverAllPasses(pointer)
         }
 
         // Assert
@@ -607,10 +607,10 @@
         val beyondSlop = TestTouchSlop + TinyNum
 
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
 
         val move = down.moveBy(10.milliseconds, 0f, 0f).consume(dx = beyondSlop)
-        mRecognizer::onPointerInput.invokeOverPasses(
+        filter::onPointerInput.invokeOverPasses(
             listOf(move),
             listOf(
                 PointerEventPass.InitialDown,
@@ -630,10 +630,10 @@
         val beyondSlop = TestTouchSlop + TinyNum
 
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
 
         val move = down.moveBy(10.milliseconds, 0f, 0f)
-        mRecognizer::onPointerInput.invokeOverPasses(
+        filter::onPointerInput.invokeOverPasses(
             listOf(move),
             listOf(
                 PointerEventPass.InitialDown,
@@ -644,7 +644,7 @@
         )
 
         val moveConsumed = move.consume(dx = beyondSlop)
-        mRecognizer::onPointerInput.invokeOverPasses(
+        filter::onPointerInput.invokeOverPasses(
             moveConsumed,
             PointerEventPass.PostDown
         )
@@ -660,10 +660,10 @@
         val restOfSlopAndBeyond = TestTouchSlop - halfSlop + TinyNum
 
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
 
         val move = down.moveBy(10.milliseconds, halfSlop.toFloat(), 0f)
-        mRecognizer::onPointerInput.invokeOverPasses(
+        filter::onPointerInput.invokeOverPasses(
             listOf(move),
             listOf(
                 PointerEventPass.InitialDown,
@@ -674,7 +674,7 @@
         )
 
         val moveConsumed = move.consume(dx = -restOfSlopAndBeyond)
-        mRecognizer::onPointerInput.invokeOverPasses(
+        filter::onPointerInput.invokeOverPasses(
             moveConsumed,
             PointerEventPass.PostDown
         )
@@ -689,10 +689,10 @@
         val beyondSlop = TestTouchSlop + TinyNum
 
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
 
         val move = down.moveBy(10.milliseconds, beyondSlop, 0f)
-        mRecognizer::onPointerInput.invokeOverPasses(
+        filter::onPointerInput.invokeOverPasses(
             listOf(move),
             listOf(
                 PointerEventPass.InitialDown,
@@ -712,7 +712,7 @@
     @Test
     fun onPointerInputChanges_1Down_nothingConsumed() {
 
-        val result = mRecognizer::onPointerInput.invokeOverAllPasses(down(0))
+        val result = filter::onPointerInput.invokeOverAllPasses(down(0))
 
         // Assert
 
@@ -725,10 +725,10 @@
     fun onPointerInputChanges_1MoveUnderSlop_nothingConsumed() {
 
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
 
         val move = down.moveBy(10.milliseconds, TestTouchSlop.toFloat(), TestTouchSlop.toFloat())
-        val result = mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        val result = filter::onPointerInput.invokeOverAllPasses(move)
 
         // Assert
 
@@ -741,13 +741,13 @@
     fun onPointerInputChanges_1MoveUnderSlopThenUp_nothingConsumed() {
 
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
 
         val move = down.moveBy(10.milliseconds, TestTouchSlop.toFloat(), TestTouchSlop.toFloat())
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         val up = move.up(20.milliseconds)
-        val result = mRecognizer::onPointerInput.invokeOverAllPasses(up)
+        val result = filter::onPointerInput.invokeOverAllPasses(up)
 
         // Assert
 
@@ -761,10 +761,10 @@
         val beyondSlop = TestTouchSlop + TinyNum
 
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
 
         val move = down.moveBy(10.milliseconds, beyondSlop, beyondSlop)
-        val result = mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        val result = filter::onPointerInput.invokeOverAllPasses(move)
 
         // Assert
 
@@ -778,13 +778,13 @@
         val beyondSlop = TestTouchSlop + TinyNum
 
         val down = down(0)
-        mRecognizer::onPointerInput.invokeOverAllPasses(down)
+        filter::onPointerInput.invokeOverAllPasses(down)
 
         val move = down.moveBy(10.milliseconds, beyondSlop, beyondSlop)
-        mRecognizer::onPointerInput.invokeOverAllPasses(move)
+        filter::onPointerInput.invokeOverAllPasses(move)
 
         val up = move.up(20.milliseconds)
-        val result = mRecognizer::onPointerInput.invokeOverAllPasses(up)
+        val result = filter::onPointerInput.invokeOverAllPasses(up)
 
         // Assert
 
@@ -801,13 +801,13 @@
 
         repeat(2) {
             val down = down(0)
-            mRecognizer::onPointerInput.invokeOverAllPasses(down)
+            filter::onPointerInput.invokeOverAllPasses(down)
 
             val move = down.moveBy(10.milliseconds, beyondSlop, 0f)
-            mRecognizer::onPointerInput.invokeOverAllPasses(move)
+            filter::onPointerInput.invokeOverAllPasses(move)
 
             val up = move.up(20.milliseconds)
-            mRecognizer::onPointerInput.invokeOverAllPasses(up)
+            filter::onPointerInput.invokeOverAllPasses(up)
         }
 
         assertThat(onTouchSlopExceededCallCount).isEqualTo(2)
@@ -822,28 +822,28 @@
         // Arrange
 
         var pointer = down(0, 0.milliseconds, 0f, 0f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
 
         pointer = pointer.moveTo(
             10.milliseconds,
             underSlop,
             0f
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
 
         // Act
 
-        mRecognizer.onCancel()
+        filter.onCancel()
 
         pointer = down(0, 0.milliseconds, 0f, 0f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
 
         pointer = pointer.moveTo(
             10.milliseconds,
             underSlop,
             0f
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
 
         // Assert
 
@@ -857,28 +857,28 @@
         // Arrange
 
         var pointer = down(0, 0.milliseconds, 0f, 0f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
 
         pointer = pointer.moveTo(
             10.milliseconds,
             overSlop,
             0f
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
 
         // Act
 
-        mRecognizer.onCancel()
+        filter.onCancel()
 
         pointer = down(0, 0.milliseconds, 0f, 0f)
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
 
         pointer = pointer.moveTo(
             10.milliseconds,
             overSlop,
             0f
         )
-        mRecognizer::onPointerInput.invokeOverAllPasses(pointer)
+        filter::onPointerInput.invokeOverAllPasses(pointer)
 
         // Assert
 
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/selection/SelectionManagerTest.kt b/ui/ui-framework/src/test/java/androidx/ui/core/selection/SelectionManagerTest.kt
index cb2851e..fa16b81 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/selection/SelectionManagerTest.kt
+++ b/ui/ui-framework/src/test/java/androidx/ui/core/selection/SelectionManagerTest.kt
@@ -20,6 +20,7 @@
 import androidx.ui.core.hapticfeedback.HapticFeedback
 import androidx.ui.core.hapticfeedback.HapticFeedbackType
 import androidx.ui.core.LayoutCoordinates
+import androidx.ui.core.clipboard.ClipboardManager
 import androidx.ui.text.AnnotatedString
 import androidx.ui.text.length
 import androidx.ui.text.style.TextDirection
@@ -69,12 +70,14 @@
         )
 
     private val hapticFeedback = mock<HapticFeedback>()
+    private val clipboardManager = mock<ClipboardManager>()
 
     @Before
     fun setup() {
         selectionRegistrar.subscribe(selectable)
         selectionManager.containerLayoutCoordinates = containerLayoutCoordinates
         selectionManager.hapticFeedBack = hapticFeedback
+        selectionManager.clipboardManager = clipboardManager
     }
 
     @Test
@@ -305,6 +308,45 @@
     }
 
     @Test
+    fun copy_selection_null_not_trigger_clipboardmanager() {
+        selectionManager.selection = null
+
+        selectionManager.copy()
+
+        verify(clipboardManager, times(0)).setText(any())
+    }
+
+    @Test
+    fun copy_selection_not_null_trigger_clipboardmanager_setText() {
+        val text = "Text Demo"
+        val annotatedString = AnnotatedString(text = text)
+        val startOffset = text.indexOf('m')
+        val endOffset = text.indexOf('x')
+        whenever(selectable.getText()).thenReturn(annotatedString)
+        selectionManager.selection = Selection(
+            start = Selection.AnchorInfo(
+                direction = TextDirection.Ltr,
+                offset = startOffset,
+                selectable = selectable),
+            end = Selection.AnchorInfo(
+                direction = TextDirection.Ltr,
+                offset = endOffset,
+                selectable = selectable
+            ),
+            handlesCrossed = true
+        )
+
+        selectionManager.copy()
+
+        verify(clipboardManager, times(1)).setText(
+            annotatedString.subSequence(
+                endOffset,
+                startOffset
+            )
+        )
+    }
+
+    @Test
     fun cancel_selection_calls_getSelection_selection_becomes_null() {
         val fakeSelection =
             Selection(
diff --git a/ui/ui-graphics/api/0.1.0-dev09.txt b/ui/ui-graphics/api/0.1.0-dev09.txt
index d800a61..6e4dbb8 100644
--- a/ui/ui-graphics/api/0.1.0-dev09.txt
+++ b/ui/ui-graphics/api/0.1.0-dev09.txt
@@ -18,6 +18,7 @@
 
   public final class AndroidImageAssetKt {
     method public static androidx.ui.graphics.ImageAsset ImageAsset(int width, int height, androidx.ui.graphics.ImageAssetConfig config = androidx.ui.graphics.ImageAssetConfig.Argb8888, boolean hasAlpha = true, androidx.ui.graphics.colorspace.ColorSpace colorSpace = ColorSpaces.Srgb);
+    method public static android.graphics.Bitmap asAndroidBitmap(androidx.ui.graphics.ImageAsset);
     method public static androidx.ui.graphics.ImageAsset asImageAsset(android.graphics.Bitmap);
     method public static androidx.ui.graphics.ImageAsset imageFromResource(android.content.res.Resources res, int resId);
   }
@@ -252,14 +253,13 @@
     method public androidx.ui.graphics.ImageAssetConfig getConfig();
     method public boolean getHasAlpha();
     method public int getHeight();
-    method public android.graphics.Bitmap getNativeImage();
     method public int getWidth();
     method public void prepareToDraw();
+    method public void readPixels(int[] buffer, int startX = 0, int startY = 0, int width = this.width, int height = this.height, int bufferOffset = 0, int stride = width);
     property public abstract androidx.ui.graphics.colorspace.ColorSpace colorSpace;
     property public abstract androidx.ui.graphics.ImageAssetConfig config;
     property public abstract boolean hasAlpha;
     property public abstract int height;
-    property public abstract android.graphics.Bitmap nativeImage;
     property public abstract int width;
   }
 
@@ -272,6 +272,7 @@
   }
 
   public final class ImageAssetKt {
+    method public static androidx.ui.graphics.PixelMap toPixelMap(androidx.ui.graphics.ImageAsset, int startX = 0, int startY = 0, int width = this.width, int height = this.height, int[] buffer = null(width * height), int bufferOffset = 0, int stride = width);
   }
 
   public final class LinearGradient extends androidx.ui.graphics.ShaderBrush {
@@ -438,6 +439,16 @@
     property public final boolean isRecording;
   }
 
+  public final class PixelMap {
+    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
+    method public operator androidx.ui.graphics.Color get(@IntRange(from=0) int x, @IntRange(from=0) int y);
+    method public int[] getBuffer();
+    method public int getBufferOffset();
+    method public int getHeight();
+    method public int getStride();
+    method public int getWidth();
+  }
+
   public enum PointMode {
     enum_constant public static final androidx.ui.graphics.PointMode lines;
     enum_constant public static final androidx.ui.graphics.PointMode points;
diff --git a/ui/ui-graphics/api/current.txt b/ui/ui-graphics/api/current.txt
index d800a61..6e4dbb8 100644
--- a/ui/ui-graphics/api/current.txt
+++ b/ui/ui-graphics/api/current.txt
@@ -18,6 +18,7 @@
 
   public final class AndroidImageAssetKt {
     method public static androidx.ui.graphics.ImageAsset ImageAsset(int width, int height, androidx.ui.graphics.ImageAssetConfig config = androidx.ui.graphics.ImageAssetConfig.Argb8888, boolean hasAlpha = true, androidx.ui.graphics.colorspace.ColorSpace colorSpace = ColorSpaces.Srgb);
+    method public static android.graphics.Bitmap asAndroidBitmap(androidx.ui.graphics.ImageAsset);
     method public static androidx.ui.graphics.ImageAsset asImageAsset(android.graphics.Bitmap);
     method public static androidx.ui.graphics.ImageAsset imageFromResource(android.content.res.Resources res, int resId);
   }
@@ -252,14 +253,13 @@
     method public androidx.ui.graphics.ImageAssetConfig getConfig();
     method public boolean getHasAlpha();
     method public int getHeight();
-    method public android.graphics.Bitmap getNativeImage();
     method public int getWidth();
     method public void prepareToDraw();
+    method public void readPixels(int[] buffer, int startX = 0, int startY = 0, int width = this.width, int height = this.height, int bufferOffset = 0, int stride = width);
     property public abstract androidx.ui.graphics.colorspace.ColorSpace colorSpace;
     property public abstract androidx.ui.graphics.ImageAssetConfig config;
     property public abstract boolean hasAlpha;
     property public abstract int height;
-    property public abstract android.graphics.Bitmap nativeImage;
     property public abstract int width;
   }
 
@@ -272,6 +272,7 @@
   }
 
   public final class ImageAssetKt {
+    method public static androidx.ui.graphics.PixelMap toPixelMap(androidx.ui.graphics.ImageAsset, int startX = 0, int startY = 0, int width = this.width, int height = this.height, int[] buffer = null(width * height), int bufferOffset = 0, int stride = width);
   }
 
   public final class LinearGradient extends androidx.ui.graphics.ShaderBrush {
@@ -438,6 +439,16 @@
     property public final boolean isRecording;
   }
 
+  public final class PixelMap {
+    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
+    method public operator androidx.ui.graphics.Color get(@IntRange(from=0) int x, @IntRange(from=0) int y);
+    method public int[] getBuffer();
+    method public int getBufferOffset();
+    method public int getHeight();
+    method public int getStride();
+    method public int getWidth();
+  }
+
   public enum PointMode {
     enum_constant public static final androidx.ui.graphics.PointMode lines;
     enum_constant public static final androidx.ui.graphics.PointMode points;
diff --git a/ui/ui-graphics/api/public_plus_experimental_0.1.0-dev09.txt b/ui/ui-graphics/api/public_plus_experimental_0.1.0-dev09.txt
index d800a61..6e4dbb8 100644
--- a/ui/ui-graphics/api/public_plus_experimental_0.1.0-dev09.txt
+++ b/ui/ui-graphics/api/public_plus_experimental_0.1.0-dev09.txt
@@ -18,6 +18,7 @@
 
   public final class AndroidImageAssetKt {
     method public static androidx.ui.graphics.ImageAsset ImageAsset(int width, int height, androidx.ui.graphics.ImageAssetConfig config = androidx.ui.graphics.ImageAssetConfig.Argb8888, boolean hasAlpha = true, androidx.ui.graphics.colorspace.ColorSpace colorSpace = ColorSpaces.Srgb);
+    method public static android.graphics.Bitmap asAndroidBitmap(androidx.ui.graphics.ImageAsset);
     method public static androidx.ui.graphics.ImageAsset asImageAsset(android.graphics.Bitmap);
     method public static androidx.ui.graphics.ImageAsset imageFromResource(android.content.res.Resources res, int resId);
   }
@@ -252,14 +253,13 @@
     method public androidx.ui.graphics.ImageAssetConfig getConfig();
     method public boolean getHasAlpha();
     method public int getHeight();
-    method public android.graphics.Bitmap getNativeImage();
     method public int getWidth();
     method public void prepareToDraw();
+    method public void readPixels(int[] buffer, int startX = 0, int startY = 0, int width = this.width, int height = this.height, int bufferOffset = 0, int stride = width);
     property public abstract androidx.ui.graphics.colorspace.ColorSpace colorSpace;
     property public abstract androidx.ui.graphics.ImageAssetConfig config;
     property public abstract boolean hasAlpha;
     property public abstract int height;
-    property public abstract android.graphics.Bitmap nativeImage;
     property public abstract int width;
   }
 
@@ -272,6 +272,7 @@
   }
 
   public final class ImageAssetKt {
+    method public static androidx.ui.graphics.PixelMap toPixelMap(androidx.ui.graphics.ImageAsset, int startX = 0, int startY = 0, int width = this.width, int height = this.height, int[] buffer = null(width * height), int bufferOffset = 0, int stride = width);
   }
 
   public final class LinearGradient extends androidx.ui.graphics.ShaderBrush {
@@ -438,6 +439,16 @@
     property public final boolean isRecording;
   }
 
+  public final class PixelMap {
+    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
+    method public operator androidx.ui.graphics.Color get(@IntRange(from=0) int x, @IntRange(from=0) int y);
+    method public int[] getBuffer();
+    method public int getBufferOffset();
+    method public int getHeight();
+    method public int getStride();
+    method public int getWidth();
+  }
+
   public enum PointMode {
     enum_constant public static final androidx.ui.graphics.PointMode lines;
     enum_constant public static final androidx.ui.graphics.PointMode points;
diff --git a/ui/ui-graphics/api/public_plus_experimental_current.txt b/ui/ui-graphics/api/public_plus_experimental_current.txt
index d800a61..6e4dbb8 100644
--- a/ui/ui-graphics/api/public_plus_experimental_current.txt
+++ b/ui/ui-graphics/api/public_plus_experimental_current.txt
@@ -18,6 +18,7 @@
 
   public final class AndroidImageAssetKt {
     method public static androidx.ui.graphics.ImageAsset ImageAsset(int width, int height, androidx.ui.graphics.ImageAssetConfig config = androidx.ui.graphics.ImageAssetConfig.Argb8888, boolean hasAlpha = true, androidx.ui.graphics.colorspace.ColorSpace colorSpace = ColorSpaces.Srgb);
+    method public static android.graphics.Bitmap asAndroidBitmap(androidx.ui.graphics.ImageAsset);
     method public static androidx.ui.graphics.ImageAsset asImageAsset(android.graphics.Bitmap);
     method public static androidx.ui.graphics.ImageAsset imageFromResource(android.content.res.Resources res, int resId);
   }
@@ -252,14 +253,13 @@
     method public androidx.ui.graphics.ImageAssetConfig getConfig();
     method public boolean getHasAlpha();
     method public int getHeight();
-    method public android.graphics.Bitmap getNativeImage();
     method public int getWidth();
     method public void prepareToDraw();
+    method public void readPixels(int[] buffer, int startX = 0, int startY = 0, int width = this.width, int height = this.height, int bufferOffset = 0, int stride = width);
     property public abstract androidx.ui.graphics.colorspace.ColorSpace colorSpace;
     property public abstract androidx.ui.graphics.ImageAssetConfig config;
     property public abstract boolean hasAlpha;
     property public abstract int height;
-    property public abstract android.graphics.Bitmap nativeImage;
     property public abstract int width;
   }
 
@@ -272,6 +272,7 @@
   }
 
   public final class ImageAssetKt {
+    method public static androidx.ui.graphics.PixelMap toPixelMap(androidx.ui.graphics.ImageAsset, int startX = 0, int startY = 0, int width = this.width, int height = this.height, int[] buffer = null(width * height), int bufferOffset = 0, int stride = width);
   }
 
   public final class LinearGradient extends androidx.ui.graphics.ShaderBrush {
@@ -438,6 +439,16 @@
     property public final boolean isRecording;
   }
 
+  public final class PixelMap {
+    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
+    method public operator androidx.ui.graphics.Color get(@IntRange(from=0) int x, @IntRange(from=0) int y);
+    method public int[] getBuffer();
+    method public int getBufferOffset();
+    method public int getHeight();
+    method public int getStride();
+    method public int getWidth();
+  }
+
   public enum PointMode {
     enum_constant public static final androidx.ui.graphics.PointMode lines;
     enum_constant public static final androidx.ui.graphics.PointMode points;
diff --git a/ui/ui-graphics/api/restricted_0.1.0-dev09.txt b/ui/ui-graphics/api/restricted_0.1.0-dev09.txt
index d800a61..6e4dbb8 100644
--- a/ui/ui-graphics/api/restricted_0.1.0-dev09.txt
+++ b/ui/ui-graphics/api/restricted_0.1.0-dev09.txt
@@ -18,6 +18,7 @@
 
   public final class AndroidImageAssetKt {
     method public static androidx.ui.graphics.ImageAsset ImageAsset(int width, int height, androidx.ui.graphics.ImageAssetConfig config = androidx.ui.graphics.ImageAssetConfig.Argb8888, boolean hasAlpha = true, androidx.ui.graphics.colorspace.ColorSpace colorSpace = ColorSpaces.Srgb);
+    method public static android.graphics.Bitmap asAndroidBitmap(androidx.ui.graphics.ImageAsset);
     method public static androidx.ui.graphics.ImageAsset asImageAsset(android.graphics.Bitmap);
     method public static androidx.ui.graphics.ImageAsset imageFromResource(android.content.res.Resources res, int resId);
   }
@@ -252,14 +253,13 @@
     method public androidx.ui.graphics.ImageAssetConfig getConfig();
     method public boolean getHasAlpha();
     method public int getHeight();
-    method public android.graphics.Bitmap getNativeImage();
     method public int getWidth();
     method public void prepareToDraw();
+    method public void readPixels(int[] buffer, int startX = 0, int startY = 0, int width = this.width, int height = this.height, int bufferOffset = 0, int stride = width);
     property public abstract androidx.ui.graphics.colorspace.ColorSpace colorSpace;
     property public abstract androidx.ui.graphics.ImageAssetConfig config;
     property public abstract boolean hasAlpha;
     property public abstract int height;
-    property public abstract android.graphics.Bitmap nativeImage;
     property public abstract int width;
   }
 
@@ -272,6 +272,7 @@
   }
 
   public final class ImageAssetKt {
+    method public static androidx.ui.graphics.PixelMap toPixelMap(androidx.ui.graphics.ImageAsset, int startX = 0, int startY = 0, int width = this.width, int height = this.height, int[] buffer = null(width * height), int bufferOffset = 0, int stride = width);
   }
 
   public final class LinearGradient extends androidx.ui.graphics.ShaderBrush {
@@ -438,6 +439,16 @@
     property public final boolean isRecording;
   }
 
+  public final class PixelMap {
+    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
+    method public operator androidx.ui.graphics.Color get(@IntRange(from=0) int x, @IntRange(from=0) int y);
+    method public int[] getBuffer();
+    method public int getBufferOffset();
+    method public int getHeight();
+    method public int getStride();
+    method public int getWidth();
+  }
+
   public enum PointMode {
     enum_constant public static final androidx.ui.graphics.PointMode lines;
     enum_constant public static final androidx.ui.graphics.PointMode points;
diff --git a/ui/ui-graphics/api/restricted_current.txt b/ui/ui-graphics/api/restricted_current.txt
index d800a61..6e4dbb8 100644
--- a/ui/ui-graphics/api/restricted_current.txt
+++ b/ui/ui-graphics/api/restricted_current.txt
@@ -18,6 +18,7 @@
 
   public final class AndroidImageAssetKt {
     method public static androidx.ui.graphics.ImageAsset ImageAsset(int width, int height, androidx.ui.graphics.ImageAssetConfig config = androidx.ui.graphics.ImageAssetConfig.Argb8888, boolean hasAlpha = true, androidx.ui.graphics.colorspace.ColorSpace colorSpace = ColorSpaces.Srgb);
+    method public static android.graphics.Bitmap asAndroidBitmap(androidx.ui.graphics.ImageAsset);
     method public static androidx.ui.graphics.ImageAsset asImageAsset(android.graphics.Bitmap);
     method public static androidx.ui.graphics.ImageAsset imageFromResource(android.content.res.Resources res, int resId);
   }
@@ -252,14 +253,13 @@
     method public androidx.ui.graphics.ImageAssetConfig getConfig();
     method public boolean getHasAlpha();
     method public int getHeight();
-    method public android.graphics.Bitmap getNativeImage();
     method public int getWidth();
     method public void prepareToDraw();
+    method public void readPixels(int[] buffer, int startX = 0, int startY = 0, int width = this.width, int height = this.height, int bufferOffset = 0, int stride = width);
     property public abstract androidx.ui.graphics.colorspace.ColorSpace colorSpace;
     property public abstract androidx.ui.graphics.ImageAssetConfig config;
     property public abstract boolean hasAlpha;
     property public abstract int height;
-    property public abstract android.graphics.Bitmap nativeImage;
     property public abstract int width;
   }
 
@@ -272,6 +272,7 @@
   }
 
   public final class ImageAssetKt {
+    method public static androidx.ui.graphics.PixelMap toPixelMap(androidx.ui.graphics.ImageAsset, int startX = 0, int startY = 0, int width = this.width, int height = this.height, int[] buffer = null(width * height), int bufferOffset = 0, int stride = width);
   }
 
   public final class LinearGradient extends androidx.ui.graphics.ShaderBrush {
@@ -438,6 +439,16 @@
     property public final boolean isRecording;
   }
 
+  public final class PixelMap {
+    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
+    method public operator androidx.ui.graphics.Color get(@IntRange(from=0) int x, @IntRange(from=0) int y);
+    method public int[] getBuffer();
+    method public int getBufferOffset();
+    method public int getHeight();
+    method public int getStride();
+    method public int getWidth();
+  }
+
   public enum PointMode {
     enum_constant public static final androidx.ui.graphics.PointMode lines;
     enum_constant public static final androidx.ui.graphics.PointMode points;
diff --git a/ui/ui-graphics/build.gradle b/ui/ui-graphics/build.gradle
index 3cd3e77..1368034 100644
--- a/ui/ui-graphics/build.gradle
+++ b/ui/ui-graphics/build.gradle
@@ -42,6 +42,7 @@
     testImplementation(JUNIT)
     testImplementation(TRUTH)
 
+    androidTestImplementation project(":ui:ui-graphics:samples")
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ESPRESSO_CORE)
diff --git a/ui/ui-graphics/samples/build.gradle b/ui/ui-graphics/samples/build.gradle
new file mode 100644
index 0000000..134c284
--- /dev/null
+++ b/ui/ui-graphics/samples/build.gradle
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+import static androidx.build.dependencies.DependenciesKt.*
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("AndroidXUiPlugin")
+    id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+    kotlinPlugin project(path: ":compose:compose-compiler")
+
+    implementation(KOTLIN_STDLIB)
+
+    implementation project(":annotation:annotation-sampled")
+
+    implementation project(":compose:compose-runtime")
+    api project(":ui:ui-unit")
+    implementation project(":ui:ui-util")
+    implementation project(":ui:ui-graphics")
+}
+
+android {
+    tasks.withType(KotlinCompile).configureEach {
+        kotlinOptions {
+            useIR = true
+        }
+    }
+}
diff --git a/lifecycle/lifecycle-viewmodel-hilt/src/main/AndroidManifest.xml b/ui/ui-graphics/samples/src/main/AndroidManifest.xml
similarity index 82%
copy from lifecycle/lifecycle-viewmodel-hilt/src/main/AndroidManifest.xml
copy to ui/ui-graphics/samples/src/main/AndroidManifest.xml
index 572f7d0..c6376a4 100644
--- a/lifecycle/lifecycle-viewmodel-hilt/src/main/AndroidManifest.xml
+++ b/ui/ui-graphics/samples/src/main/AndroidManifest.xml
@@ -14,6 +14,4 @@
   limitations under the License.
   -->
 
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="androidx.lifecycle.hilt">
-</manifest>
+<manifest package="androidx.ui.graphics.samples" />
diff --git a/ui/ui-graphics/samples/src/main/java/androidx/ui/graphics/samples/ImageAssetSample.kt b/ui/ui-graphics/samples/src/main/java/androidx/ui/graphics/samples/ImageAssetSample.kt
new file mode 100644
index 0000000..f5cfefd
--- /dev/null
+++ b/ui/ui-graphics/samples/src/main/java/androidx/ui/graphics/samples/ImageAssetSample.kt
@@ -0,0 +1,112 @@
+/*
+ * 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.ui.graphics.samples
+
+import androidx.annotation.Sampled
+import androidx.ui.geometry.Rect
+import androidx.ui.graphics.Canvas
+import androidx.ui.graphics.Color
+import androidx.ui.graphics.ImageAsset
+import androidx.ui.graphics.Paint
+import androidx.ui.graphics.PixelMap
+import androidx.ui.graphics.toPixelMap
+
+/**
+ * Sample showing how to obtain a [PixelMap] to query pixel information
+ * from an underlying [ImageAsset]
+ */
+@Sampled
+fun ImageAssetToPixelMapSample() {
+    val imageAsset = createImageAsset()
+
+    // Sample a 3 by 2 subsection of the given ImageAsset
+    // starting at the coordinate (48, 49)
+    val pixelmap = imageAsset.toPixelMap(
+        startX = 48,
+        startY = 49,
+        width = 3,
+        height = 2
+    )
+
+    // create a histogram to count the number of occurrences of a color within the specified
+    // subsection of the provided ImageAsset
+    val histogram = HashMap<Color, Int>()
+    for (x in 0 until pixelmap.width) {
+        for (y in 0 until pixelmap.height) {
+            val color = pixelmap[x, y]
+            val colorCount = histogram[color] ?: 0
+            histogram[color] = (colorCount + 1)
+        }
+    }
+}
+
+/**
+ * [ImageAsset.readPixels] sample that shows how to create a consumer defined
+ * IntArray to store pixel information and create a PixelMap for querying information
+ * within the buffer
+ */
+@Sampled
+fun ImageAssetReadPixelsSample() {
+    val imageAsset = createImageAsset()
+
+    val buffer = IntArray(20 * 10)
+    imageAsset.readPixels(buffer = buffer,
+        startX = 8,
+        startY = 9,
+        width = 20,
+        height = 10)
+
+    val pixelmap = PixelMap(
+        buffer = buffer,
+        width = 20,
+        height = 10,
+        stride = 20,
+        bufferOffset = 0
+    )
+
+    // create a histogram to count the number of occurrences of a color within the specified
+    // subsection of the provided ImageAsset
+    val histogram = HashMap<Color, Int>()
+    for (x in 0 until pixelmap.width) {
+        for (y in 0 until pixelmap.height) {
+            val color = pixelmap[x, y]
+            val colorCount = histogram[color] ?: 0
+            histogram[color] = (colorCount + 1)
+        }
+    }
+}
+
+private fun createImageAsset(): ImageAsset {
+    val imageAsset = ImageAsset(100, 100)
+    val canvas = Canvas(imageAsset)
+    val paint = Paint()
+
+    // Draw 4 colored squares that are red, blue, green and yellow from the top left, top right
+    // bottom left and bottom right respectively
+    paint.color = Color.Red
+    canvas.drawRect(Rect.fromLTRB(0.0f, 0.0f, 50.0f, 50.0f), paint)
+
+    paint.color = Color.Blue
+    canvas.drawRect(Rect.fromLTRB(50.0f, 0.0f, 100.0f, 50.0f), paint)
+
+    paint.color = Color.Green
+    canvas.drawRect(Rect.fromLTRB(0.0f, 50.0f, 50.0f, 100.0f), paint)
+
+    paint.color = Color.Yellow
+    canvas.drawRect(Rect.fromLTRB(50.0f, 50.0f, 100.0f, 100.0f), paint)
+    return imageAsset
+}
diff --git a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/PathTest.kt b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/PathTest.kt
index 07618fe..eb82f67 100644
--- a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/PathTest.kt
+++ b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/PathTest.kt
@@ -23,7 +23,7 @@
 import androidx.ui.graphics.ImageAsset
 import androidx.ui.graphics.Paint
 import androidx.ui.graphics.Path
-import androidx.ui.graphics.toArgb
+import androidx.ui.graphics.toPixelMap
 import androidx.ui.graphics.vectormath.PI
 import androidx.ui.graphics.vectormath.radians
 import org.junit.Assert.assertEquals
@@ -65,19 +65,20 @@
 
         canvas.drawPath(path2, arcPaint)
 
+        val pixelmap = image.toPixelMap()
         val x = (50.0 * Math.cos(radians(45.0f).toDouble())).toInt()
-        assertEquals(arcColor.toArgb(),
-            image.nativeImage.getPixel(
+        assertEquals(arcColor,
+            pixelmap[
                 width / 2 + x - 1,
                 height / 2 + x - 1
-            )
+            ]
         )
 
-        assertEquals(arcColor.toArgb(),
-            image.nativeImage.getPixel(
+        assertEquals(arcColor,
+            pixelmap[
                 width / 2 - x,
                 height / 2 - x
-            )
+            ]
         )
     }
 }
\ No newline at end of file
diff --git a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/PixelMapTest.kt b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/PixelMapTest.kt
new file mode 100644
index 0000000..5f811b0
--- /dev/null
+++ b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/PixelMapTest.kt
@@ -0,0 +1,95 @@
+/*
+ * 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.ui.graphics
+
+import androidx.test.filters.SmallTest
+import androidx.ui.geometry.Rect
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@SmallTest
+@RunWith(JUnit4::class)
+class PixelMapTest {
+
+    fun createImageAsset(): ImageAsset {
+        val imageAsset = ImageAsset(100, 100)
+        val canvas = Canvas(imageAsset)
+        val paint = Paint().apply { this.color = Color.Red }
+
+        canvas.drawRect(Rect.fromLTRB(0.0f, 0.0f, 50.0f, 50.0f), paint)
+
+        paint.color = Color.Blue
+        canvas.drawRect(Rect.fromLTRB(50.0f, 0.0f, 100.0f, 50.0f), paint)
+
+        paint.color = Color.Green
+        canvas.drawRect(Rect.fromLTRB(0.0f, 50.0f, 50.0f, 100.0f), paint)
+
+        paint.color = Color.Yellow
+        canvas.drawRect(Rect.fromLTRB(50.0f, 50.0f, 100.0f, 100.0f), paint)
+        return imageAsset
+    }
+
+    @Test
+    fun testImageAssetPixelMap() {
+        val imageAsset = createImageAsset()
+        val pixelmap = imageAsset.toPixelMap()
+
+        Assert.assertEquals(Color.Red, pixelmap[0, 0])
+        Assert.assertEquals(Color.Red, pixelmap[49, 0])
+        Assert.assertEquals(Color.Red, pixelmap[0, 49])
+        Assert.assertEquals(Color.Red, pixelmap[49, 49])
+
+        Assert.assertEquals(Color.Blue, pixelmap[50, 0])
+        Assert.assertEquals(Color.Blue, pixelmap[99, 0])
+        Assert.assertEquals(Color.Blue, pixelmap[50, 49])
+        Assert.assertEquals(Color.Blue, pixelmap[99, 49])
+
+        Assert.assertEquals(Color.Green, pixelmap[0, 50])
+        Assert.assertEquals(Color.Green, pixelmap[49, 50])
+        Assert.assertEquals(Color.Green, pixelmap[0, 99])
+        Assert.assertEquals(Color.Green, pixelmap[49, 99])
+
+        Assert.assertEquals(Color.Yellow, pixelmap[50, 50])
+        Assert.assertEquals(Color.Yellow, pixelmap[99, 50])
+        Assert.assertEquals(Color.Yellow, pixelmap[50, 99])
+        Assert.assertEquals(Color.Yellow, pixelmap[99, 99])
+    }
+
+    @Test
+    fun testImageAssetSubsection() {
+        val asset = createImageAsset()
+        val subsectionWidth = 3
+        val subsectionHeight = 2
+        val bufferOffset = 3
+        val pixelmap = asset.toPixelMap(
+            startX = 48,
+            startY = 49,
+            stride = 3,
+            width = 3,
+            height = 2,
+            buffer = IntArray(subsectionWidth * subsectionHeight + bufferOffset),
+            bufferOffset = bufferOffset
+        )
+
+        Assert.assertEquals(Color.Red, pixelmap[1, 0])
+        Assert.assertEquals(Color.Blue, pixelmap[2, 0])
+        Assert.assertEquals(Color.Green, pixelmap[1, 1])
+        Assert.assertEquals(Color.Yellow, pixelmap[2, 1])
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/ImagePainterTest.kt b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/ImagePainterTest.kt
index 40203a1..98f16d1 100644
--- a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/ImagePainterTest.kt
+++ b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/ImagePainterTest.kt
@@ -25,7 +25,7 @@
 import androidx.ui.graphics.ImageAsset
 import androidx.ui.graphics.Paint
 import androidx.ui.graphics.compositeOver
-import androidx.ui.graphics.toArgb
+import androidx.ui.graphics.toPixelMap
 import androidx.ui.unit.Px
 import androidx.ui.unit.PxSize
 import org.junit.Assert.assertEquals
@@ -38,7 +38,7 @@
 @RunWith(JUnit4::class)
 class ImagePainterTest {
 
-    val white = Color.White.toArgb()
+    val white = Color.White
     private val srcSize = PxSize(Px(100.0f), Px(100.0f))
 
     private fun createTestSrcImage(): ImageAsset {
@@ -71,10 +71,11 @@
         val dst = createTestDstImage()
         imagePainter.draw(Canvas(dst), srcSize)
 
-        assertEquals(white, dst.nativeImage.getPixel(195, 5))
-        assertEquals(white, dst.nativeImage.getPixel(195, 195))
-        assertEquals(white, dst.nativeImage.getPixel(5, 195))
-        assertEquals(Color.Red.toArgb(), dst.nativeImage.getPixel(30, 70))
+        val pixelmap = dst.toPixelMap()
+        assertEquals(white, pixelmap[195, 5])
+        assertEquals(white, pixelmap[195, 195])
+        assertEquals(white, pixelmap[5, 195])
+        assertEquals(Color.Red, pixelmap[30, 70])
     }
 
     @Test
@@ -96,7 +97,7 @@
             blue = Color.Red.blue
         ).compositeOver(Color.White)
 
-        val result = Color(dst.nativeImage.getPixel(50, 50))
+        val result = dst.toPixelMap()[50, 50]
         assertEquals(expected.red, result.red, 0.01f)
         assertEquals(expected.green, result.green, 0.01f)
         assertEquals(expected.blue, result.blue, 0.01f)
@@ -113,12 +114,11 @@
             colorFilter = ColorFilter(Color.Cyan, BlendMode.srcIn)
         )
 
-        val argbWhite = Color.White.toArgb()
-        val argbCyan = Color.Cyan.toArgb()
-        assertEquals(argbWhite, dst.nativeImage.getPixel(195, 5))
-        assertEquals(argbWhite, dst.nativeImage.getPixel(195, 195))
-        assertEquals(argbWhite, dst.nativeImage.getPixel(5, 195))
-        assertEquals(argbCyan, dst.nativeImage.getPixel(30, 70))
+        val pixelmap = dst.toPixelMap()
+        assertEquals(Color.White, pixelmap[195, 5])
+        assertEquals(Color.White, pixelmap[195, 195])
+        assertEquals(Color.White, pixelmap[5, 195])
+        assertEquals(Color.Cyan, pixelmap[30, 70])
     }
 
     class LayerFlagCanvas(private val canvas: Canvas) : Canvas by canvas {
diff --git a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/PainterTest.kt b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/PainterTest.kt
index 08b6a38..35843f72 100644
--- a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/PainterTest.kt
+++ b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/PainterTest.kt
@@ -25,7 +25,7 @@
 import androidx.ui.graphics.ImageAsset
 import androidx.ui.graphics.Paint
 import androidx.ui.graphics.compositeOver
-import androidx.ui.graphics.toArgb
+import androidx.ui.graphics.toPixelMap
 import androidx.ui.unit.Px
 import androidx.ui.unit.PxSize
 import org.junit.Assert.assertEquals
@@ -91,7 +91,7 @@
             rtl = true
         )
 
-        assertEquals(Color.Red.toArgb(), image.nativeImage.getPixel(50, 50))
+        assertEquals(Color.Red, image.toPixelMap()[50, 50])
     }
 
     @Test
@@ -127,7 +127,7 @@
             blue = Color.Red.blue
         ).compositeOver(Color.White)
 
-        val result = Color(image.nativeImage.getPixel(50, 50))
+        val result = image.toPixelMap()[50, 50]
         assertEquals(expected.red, result.red, 0.01f)
         assertEquals(expected.green, result.green, 0.01f)
         assertEquals(expected.blue, result.blue, 0.01f)
@@ -179,7 +179,7 @@
             blue = Color.Red.blue
         ).compositeOver(Color.White)
 
-        val result = Color(image.nativeImage.getPixel(50, 50))
+        val result = image.toPixelMap()[50, 50]
         assertEquals(expected.red, result.red, 0.01f)
         assertEquals(expected.green, result.green, 0.01f)
         assertEquals(expected.blue, result.blue, 0.01f)
@@ -213,6 +213,6 @@
         val image = ImageAsset(100, 100)
 
         p.draw(Canvas(image), size, colorFilter = ColorFilter(Color.Blue, BlendMode.srcIn))
-        assertEquals(Color.Blue.toArgb(), image.nativeImage.getPixel(50, 50))
+        assertEquals(Color.Blue, image.toPixelMap()[50, 50])
     }
 }
\ No newline at end of file
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/AndroidCanvas.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/AndroidCanvas.kt
index 2216353..0e7d6f5 100644
--- a/ui/ui-graphics/src/main/java/androidx/ui/graphics/AndroidCanvas.kt
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/AndroidCanvas.kt
@@ -30,7 +30,7 @@
  * to the provided [ImageAsset]
  */
 /* actual */ fun Canvas(image: ImageAsset): Canvas =
-    AndroidCanvas(android.graphics.Canvas(image.nativeImage))
+    AndroidCanvas(android.graphics.Canvas(image.asAndroidBitmap()))
 
 /**
  * Create a new Canvas instance that targets its drawing commands to the provided
@@ -273,7 +273,7 @@
      */
     override fun drawImage(image: ImageAsset, topLeftOffset: Offset, paint: Paint) {
         internalCanvas.drawBitmap(
-            image.nativeImage,
+            image.asAndroidBitmap(),
             topLeftOffset.dx,
             topLeftOffset.dy,
             paint.asFrameworkPaint()
@@ -285,7 +285,7 @@
      */
     override fun drawImageRect(image: ImageAsset, src: Rect, dst: Rect, paint: Paint) {
         internalCanvas.drawBitmap(
-            image.nativeImage,
+            image.asAndroidBitmap(),
             src.toAndroidRect(),
             dst.toAndroidRect(),
             paint.asFrameworkPaint()
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/AndroidImageAsset.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/AndroidImageAsset.kt
index 10a3682..021df4b 100644
--- a/ui/ui-graphics/src/main/java/androidx/ui/graphics/AndroidImageAsset.kt
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/AndroidImageAsset.kt
@@ -24,7 +24,16 @@
 import androidx.annotation.RequiresApi
 import androidx.ui.graphics.colorspace.ColorSpace
 import androidx.ui.graphics.colorspace.ColorSpaces
+import kotlin.UnsupportedOperationException
 
+/**
+ * Create an [ImageAsset] from an image file stored in resources for the application
+ *
+ * @param res Resources object to query the image file from
+ * @param resId Identifier for the image asset to query from [res]
+ *
+ * @return Loaded image file represented as an [ImageAsset]
+ */
 fun imageFromResource(res: Resources, resId: Int): ImageAsset {
     return AndroidImageAsset(BitmapFactory.decodeResource(res, resId))
 }
@@ -67,7 +76,17 @@
     return AndroidImageAsset(bitmap)
 }
 
-internal class AndroidImageAsset(val bitmap: Bitmap) : ImageAsset {
+/**
+ * @Throws UnsupportedOperationException if this [ImageAsset] is not backed by an
+ * android.graphics.Bitmap
+ */
+fun ImageAsset.asAndroidBitmap(): Bitmap =
+    when (this) {
+        is AndroidImageAsset -> bitmap
+        else -> throw UnsupportedOperationException("Unable to obtain android.graphics.Bitmap")
+    }
+
+internal class AndroidImageAsset(internal val bitmap: Bitmap) : ImageAsset {
 
     override val width: Int
         get() = bitmap.width
@@ -85,12 +104,54 @@
             ColorSpaces.Srgb
         }
 
+    override fun readPixels(
+        buffer: IntArray,
+        startX: Int,
+        startY: Int,
+        width: Int,
+        height: Int,
+        bufferOffset: Int,
+        stride: Int
+    ) {
+        // Internal Android implementation that copies the pixels from the underlying
+        // android.graphics.Bitmap if the configuration supports it
+        val androidBitmap = asAndroidBitmap()
+        var recycleTarget = false
+        val targetBitmap =
+            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O ||
+                androidBitmap.config != Bitmap.Config.HARDWARE
+            ) {
+                androidBitmap
+            } else {
+                // Because we are creating a copy for the purposes of reading pixels out of it
+                // be sure to recycle this temporary bitmap when we are finished with it.
+                recycleTarget = true
+
+                // Pixels of a hardware bitmap cannot be queried directly so make a copy
+                // of it into a configuration that can be queried
+                // Passing in false for the isMutable parameter as we only intend to read pixel
+                // information from the bitmap
+                androidBitmap.copy(Bitmap.Config.ARGB_8888, false)
+            }
+
+        targetBitmap.getPixels(
+            buffer,
+            bufferOffset,
+            stride,
+            startX,
+            startY,
+            width,
+            height
+        )
+        // Recycle the target if we are done with it
+        if (recycleTarget) {
+            targetBitmap.recycle()
+        }
+    }
+
     override val hasAlpha: Boolean
         get() = bitmap.hasAlpha()
 
-    override val nativeImage: NativeImageAsset
-        get() = bitmap
-
     override fun prepareToDraw() {
         bitmap.prepareToDraw()
     }
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/ImageAsset.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/ImageAsset.kt
index 15f0193f..fe28044 100644
--- a/ui/ui-graphics/src/main/java/androidx/ui/graphics/ImageAsset.kt
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/ImageAsset.kt
@@ -17,11 +17,7 @@
 package androidx.ui.graphics
 
 import androidx.ui.graphics.colorspace.ColorSpace
-
-/**
- * Handle for the underlying platform primitive for the [ImageAsset] implementation
-  */
-/* expect */ typealias NativeImageAsset = android.graphics.Bitmap
+import androidx.ui.graphics.colorspace.ColorSpaces
 
 /**
  * Graphics object that represents a 2 dimensional array of pixel information represented
@@ -51,9 +47,39 @@
     val config: ImageAssetConfig
 
     /**
-     * Return backing object that implements the ImageAsset interface
+     * Copies the pixel data within the ImageAsset into the given array. Each value is
+     * represented as ARGB values packed into an Int.
+     * The stride parameter allows the caller to allow for gaps in the returned pixels array
+     * between rows. For normal packed, results, the stride value is equivalent to the width of
+     * the [ImageAsset]. The returned colors are non-premultiplied ARGB values in the
+     * [ColorSpaces.Srgb] color space.
+     *
+     * Note this method can block so it is recommended to not invoke this method in performance
+     * critical code paths
+     *
+     * @sample androidx.ui.graphics.samples.ImageAssetReadPixelsSample
+     *
+     * @param buffer The array to store the [ImageAsset]'s colors. By default this allocates an
+     * [IntArray] large enough to store all the pixel information. Consumers of this API are
+     * advised to use the smallest [IntArray] necessary to extract relevant pixel information, that
+     * is the 2 dimensional area of the section of the [ImageAsset] to be queried.
+     *
+     * @param startX The x-coordinate of the first pixel to read from the [ImageAsset]
+     * @param startY The y-coordinate of the first pixel to read from the [ImageAsset]
+     * @param width The number of pixels to read from each row
+     * @param height The number of rows to read
+     * @param bufferOffset The first index to write into the buffer array, this defaults to 0
+     * @param stride The number of entries in [buffer] to skip between rows (must be >= [width]
      */
-    val nativeImage: NativeImageAsset
+    fun readPixels(
+        buffer: IntArray,
+        startX: Int = 0,
+        startY: Int = 0,
+        width: Int = this.width,
+        height: Int = this.height,
+        bufferOffset: Int = 0,
+        stride: Int = width
+    )
 
     /**
      * Builds caches associated with the ImageAsset that are used for drawing it. This method can
@@ -63,6 +89,48 @@
 }
 
 /**
+ * Convenience method to extract pixel information from the given ImageAsset into a [PixelMap]
+ * that supports for querying pixel information based on
+ *
+ * Note this method can block so it is recommended to not invoke this method in performance
+ * critical code paths
+ *
+ * @sample androidx.ui.graphics.samples.ImageAssetToPixelMapSample
+ *
+ * @param startX The x-coordinate of the first pixel to read from the [ImageAsset]
+ * @param startY The y-coordinate of the first pixel to read from the [ImageAsset]
+ * @param width The number of pixels to read from each row
+ * @param height The number of rows to read
+ * @param buffer The array to store the [ImageAsset]'s colors. By default this allocates an
+ * [IntArray] large enough to store all the pixel information. Consumers of this API are
+ * advised to use the smallest [IntArray] necessary to extract relevant pixel information
+ * @param bufferOffset The first index to write into the buffer array, this defaults to 0
+ * @param stride The number of entries in [buffer] to skip between rows (must be >= [width]
+ *
+ * @see ImageAsset.readPixels
+ */
+fun ImageAsset.toPixelMap(
+    startX: Int = 0,
+    startY: Int = 0,
+    width: Int = this.width,
+    height: Int = this.height,
+    buffer: IntArray = IntArray(width * height),
+    bufferOffset: Int = 0,
+    stride: Int = width
+): PixelMap {
+    readPixels(
+        buffer,
+        startX,
+        startY,
+        width,
+        height,
+        bufferOffset,
+        stride
+    )
+    return PixelMap(buffer, width, height, bufferOffset, stride)
+}
+
+/**
  * Possible ImageAsset configurations. An ImageAsset configuration describes
  * how pixels are stored. This affects the quality (color depth) as
  * well as the ability to display transparent/translucent colors.
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/PixelMap.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/PixelMap.kt
new file mode 100644
index 0000000..64e67fb
--- /dev/null
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/PixelMap.kt
@@ -0,0 +1,50 @@
+/*
+ * 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.ui.graphics
+
+/**
+ * Result of a pixel read operation. This contains the [ImageAsset] pixel information represented
+ * as a 1 dimensional array of values that supports queries of pixel values based on the 2
+ * dimensional coordinates of the corresponding [ImageAsset] this was obtained from
+ *
+ * @sample androidx.ui.graphics.samples.ImageAssetReadPixelsSample
+ *
+ * @param buffer IntArray where pixel information is stored as an ARGB value packed into an Int
+ * @param bufferOffset first index in the buffer where pixel information for the [ImageAsset] is
+ * stored
+ * @param width Width of the subsection of the [ImageAsset] this buffer represents
+ * @param height Height of the subsection of the [ImageAsset] this buffer represents
+ * @param stride Number of entries to skip between rows
+ *
+ * @see ImageAsset.readPixels
+ * @See ImageAsset.toPixelMap
+ */
+class PixelMap(
+    val buffer: IntArray,
+    val width: Int,
+    val height: Int,
+    val bufferOffset: Int,
+    val stride: Int
+) {
+    /**
+     * Obtain the color of the pixel at the given coordinate
+     */
+    operator fun get(
+        @androidx.annotation.IntRange(from = 0) x: Int,
+        @androidx.annotation.IntRange(from = 0) y: Int
+    ): Color = Color(buffer[bufferOffset + y * stride + x])
+}
\ No newline at end of file
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/Shader.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/Shader.kt
index fb08759..39b8fb1 100644
--- a/ui/ui-graphics/src/main/java/androidx/ui/graphics/Shader.kt
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/Shader.kt
@@ -106,7 +106,7 @@
 ): Shader {
     return Shader(
         BitmapShader(
-            image.nativeImage,
+            image.asAndroidBitmap(),
             tileModeX.nativeTileMode,
             tileModeY.nativeTileMode
         )
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/colorspace/ColorModel.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/colorspace/ColorModel.kt
index bbb87c7..92d3b77 100644
--- a/ui/ui-graphics/src/main/java/androidx/ui/graphics/colorspace/ColorModel.kt
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/colorspace/ColorModel.kt
@@ -36,7 +36,7 @@
     /**
      * The RGB model is a color model with 3 components that
      * refer to the three additive primiaries: red, green
-     * andd blue.
+     * and blue.
      */
     Rgb(3),
 
diff --git a/ui/ui-layout/api/0.1.0-dev09.txt b/ui/ui-layout/api/0.1.0-dev09.txt
index 91a4bc30..7b0bd94 100644
--- a/ui/ui-layout/api/0.1.0-dev09.txt
+++ b/ui/ui-layout/api/0.1.0-dev09.txt
@@ -2,8 +2,8 @@
 package androidx.ui.layout {
 
   public final class AlignmentLineKt {
-    method public static void AlignmentLineOffset(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp before = 0.dp, androidx.ui.unit.Dp after = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void AlignmentLineOffset(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp before = 0.dp, androidx.ui.unit.Dp after = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public interface Arrangement {
@@ -64,7 +64,7 @@
   }
 
   public final class ColumnKt {
-    method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
+    method public static void Column(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public final class ColumnScope {
@@ -85,7 +85,7 @@
   }
 
   public final class ConstraintLayoutKt {
-    method public static void ConstraintLayout(androidx.ui.layout.ConstraintSet constraintSet, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void ConstraintLayout(androidx.ui.layout.ConstraintSet constraintSet, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class ConstraintSet {
@@ -276,7 +276,7 @@
   }
 
   public final class ContainerKt {
-    method @Deprecated public static void Container(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.EdgeInsets padding = androidx.ui.layout.EdgeInsets(0.dp), androidx.ui.core.Alignment alignment = Alignment.Center, boolean expanded = false, androidx.ui.layout.DpConstraints constraints = androidx.ui.layout.DpConstraints(), androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method @Deprecated public static void Container(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.EdgeInsets padding = androidx.ui.layout.EdgeInsets(0.dp), androidx.ui.core.Alignment alignment = Alignment.Center, boolean expanded = false, androidx.ui.layout.DpConstraints constraints = androidx.ui.layout.DpConstraints(), androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class CrossAxisAlignment {
@@ -632,6 +632,8 @@
     method public static androidx.ui.core.Modifier fillMaxHeight(androidx.ui.core.Modifier);
     method public static androidx.ui.core.Modifier fillMaxSize(androidx.ui.core.Modifier);
     method public static androidx.ui.core.Modifier fillMaxWidth(androidx.ui.core.Modifier);
+    method public static androidx.ui.core.Modifier height(androidx.ui.core.Modifier, androidx.ui.unit.Dp height);
+    method public static androidx.ui.core.Modifier heightIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minHeight = Dp.Unspecified, androidx.ui.unit.Dp maxHeight = Dp.Unspecified);
     method public static androidx.ui.core.Modifier preferredHeight(androidx.ui.core.Modifier, androidx.ui.unit.Dp height);
     method public static androidx.ui.core.Modifier preferredHeightIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minHeight = Dp.Unspecified, androidx.ui.unit.Dp maxHeight = Dp.Unspecified);
     method public static androidx.ui.core.Modifier preferredSize(androidx.ui.core.Modifier, androidx.ui.unit.Dp size);
@@ -640,6 +642,12 @@
     method public static androidx.ui.core.Modifier preferredSizeIn(androidx.ui.core.Modifier, androidx.ui.layout.DpConstraints constraints);
     method public static androidx.ui.core.Modifier preferredWidth(androidx.ui.core.Modifier, androidx.ui.unit.Dp width);
     method public static androidx.ui.core.Modifier preferredWidthIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minWidth = Dp.Unspecified, androidx.ui.unit.Dp maxWidth = Dp.Unspecified);
+    method public static androidx.ui.core.Modifier size(androidx.ui.core.Modifier, androidx.ui.unit.Dp size);
+    method public static androidx.ui.core.Modifier size(androidx.ui.core.Modifier, androidx.ui.unit.Dp width, androidx.ui.unit.Dp height);
+    method public static androidx.ui.core.Modifier sizeIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minWidth = Dp.Unspecified, androidx.ui.unit.Dp minHeight = Dp.Unspecified, androidx.ui.unit.Dp maxWidth = Dp.Unspecified, androidx.ui.unit.Dp maxHeight = Dp.Unspecified);
+    method public static androidx.ui.core.Modifier sizeIn(androidx.ui.core.Modifier, androidx.ui.layout.DpConstraints constraints);
+    method public static androidx.ui.core.Modifier width(androidx.ui.core.Modifier, androidx.ui.unit.Dp width);
+    method public static androidx.ui.core.Modifier widthIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minWidth = Dp.Unspecified, androidx.ui.unit.Dp maxWidth = Dp.Unspecified);
     method public static androidx.ui.core.Modifier wrapContentHeight(androidx.ui.core.Modifier, androidx.ui.core.Alignment align = Center);
     method public static androidx.ui.core.Modifier wrapContentSize(androidx.ui.core.Modifier, androidx.ui.core.Alignment align = Center);
     method public static androidx.ui.core.Modifier wrapContentWidth(androidx.ui.core.Modifier, androidx.ui.core.Alignment align = Center);
@@ -727,7 +735,7 @@
   }
 
   public final class RowKt {
-    method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
+    method public static void Row(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public final class RowScope {
@@ -757,7 +765,7 @@
   }
 
   public final class StackKt {
-    method public static void Stack(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackScope,kotlin.Unit> children);
+    method public static void Stack(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public final class StackScope {
@@ -773,7 +781,8 @@
     method @Deprecated public androidx.ui.core.ParentDataModifier getTopEnd(androidx.ui.layout.LayoutGravity);
     method @Deprecated public androidx.ui.core.ParentDataModifier getTopStart(androidx.ui.layout.LayoutGravity);
     method public androidx.ui.core.Modifier gravity(androidx.ui.core.Modifier, androidx.ui.core.Alignment align);
-    method public androidx.ui.core.Modifier matchParent(androidx.ui.core.Modifier);
+    method @Deprecated public androidx.ui.core.Modifier matchParent(androidx.ui.core.Modifier);
+    method public androidx.ui.core.Modifier matchParentSize(androidx.ui.core.Modifier);
     property @Deprecated public final androidx.ui.core.ParentDataModifier BottomCenter;
     property @Deprecated public final androidx.ui.core.ParentDataModifier BottomEnd;
     property @Deprecated public final androidx.ui.core.ParentDataModifier BottomStart;
diff --git a/ui/ui-layout/api/current.txt b/ui/ui-layout/api/current.txt
index 91a4bc30..7b0bd94 100644
--- a/ui/ui-layout/api/current.txt
+++ b/ui/ui-layout/api/current.txt
@@ -2,8 +2,8 @@
 package androidx.ui.layout {
 
   public final class AlignmentLineKt {
-    method public static void AlignmentLineOffset(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp before = 0.dp, androidx.ui.unit.Dp after = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void AlignmentLineOffset(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp before = 0.dp, androidx.ui.unit.Dp after = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public interface Arrangement {
@@ -64,7 +64,7 @@
   }
 
   public final class ColumnKt {
-    method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
+    method public static void Column(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public final class ColumnScope {
@@ -85,7 +85,7 @@
   }
 
   public final class ConstraintLayoutKt {
-    method public static void ConstraintLayout(androidx.ui.layout.ConstraintSet constraintSet, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void ConstraintLayout(androidx.ui.layout.ConstraintSet constraintSet, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class ConstraintSet {
@@ -276,7 +276,7 @@
   }
 
   public final class ContainerKt {
-    method @Deprecated public static void Container(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.EdgeInsets padding = androidx.ui.layout.EdgeInsets(0.dp), androidx.ui.core.Alignment alignment = Alignment.Center, boolean expanded = false, androidx.ui.layout.DpConstraints constraints = androidx.ui.layout.DpConstraints(), androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method @Deprecated public static void Container(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.EdgeInsets padding = androidx.ui.layout.EdgeInsets(0.dp), androidx.ui.core.Alignment alignment = Alignment.Center, boolean expanded = false, androidx.ui.layout.DpConstraints constraints = androidx.ui.layout.DpConstraints(), androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class CrossAxisAlignment {
@@ -632,6 +632,8 @@
     method public static androidx.ui.core.Modifier fillMaxHeight(androidx.ui.core.Modifier);
     method public static androidx.ui.core.Modifier fillMaxSize(androidx.ui.core.Modifier);
     method public static androidx.ui.core.Modifier fillMaxWidth(androidx.ui.core.Modifier);
+    method public static androidx.ui.core.Modifier height(androidx.ui.core.Modifier, androidx.ui.unit.Dp height);
+    method public static androidx.ui.core.Modifier heightIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minHeight = Dp.Unspecified, androidx.ui.unit.Dp maxHeight = Dp.Unspecified);
     method public static androidx.ui.core.Modifier preferredHeight(androidx.ui.core.Modifier, androidx.ui.unit.Dp height);
     method public static androidx.ui.core.Modifier preferredHeightIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minHeight = Dp.Unspecified, androidx.ui.unit.Dp maxHeight = Dp.Unspecified);
     method public static androidx.ui.core.Modifier preferredSize(androidx.ui.core.Modifier, androidx.ui.unit.Dp size);
@@ -640,6 +642,12 @@
     method public static androidx.ui.core.Modifier preferredSizeIn(androidx.ui.core.Modifier, androidx.ui.layout.DpConstraints constraints);
     method public static androidx.ui.core.Modifier preferredWidth(androidx.ui.core.Modifier, androidx.ui.unit.Dp width);
     method public static androidx.ui.core.Modifier preferredWidthIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minWidth = Dp.Unspecified, androidx.ui.unit.Dp maxWidth = Dp.Unspecified);
+    method public static androidx.ui.core.Modifier size(androidx.ui.core.Modifier, androidx.ui.unit.Dp size);
+    method public static androidx.ui.core.Modifier size(androidx.ui.core.Modifier, androidx.ui.unit.Dp width, androidx.ui.unit.Dp height);
+    method public static androidx.ui.core.Modifier sizeIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minWidth = Dp.Unspecified, androidx.ui.unit.Dp minHeight = Dp.Unspecified, androidx.ui.unit.Dp maxWidth = Dp.Unspecified, androidx.ui.unit.Dp maxHeight = Dp.Unspecified);
+    method public static androidx.ui.core.Modifier sizeIn(androidx.ui.core.Modifier, androidx.ui.layout.DpConstraints constraints);
+    method public static androidx.ui.core.Modifier width(androidx.ui.core.Modifier, androidx.ui.unit.Dp width);
+    method public static androidx.ui.core.Modifier widthIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minWidth = Dp.Unspecified, androidx.ui.unit.Dp maxWidth = Dp.Unspecified);
     method public static androidx.ui.core.Modifier wrapContentHeight(androidx.ui.core.Modifier, androidx.ui.core.Alignment align = Center);
     method public static androidx.ui.core.Modifier wrapContentSize(androidx.ui.core.Modifier, androidx.ui.core.Alignment align = Center);
     method public static androidx.ui.core.Modifier wrapContentWidth(androidx.ui.core.Modifier, androidx.ui.core.Alignment align = Center);
@@ -727,7 +735,7 @@
   }
 
   public final class RowKt {
-    method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
+    method public static void Row(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public final class RowScope {
@@ -757,7 +765,7 @@
   }
 
   public final class StackKt {
-    method public static void Stack(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackScope,kotlin.Unit> children);
+    method public static void Stack(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public final class StackScope {
@@ -773,7 +781,8 @@
     method @Deprecated public androidx.ui.core.ParentDataModifier getTopEnd(androidx.ui.layout.LayoutGravity);
     method @Deprecated public androidx.ui.core.ParentDataModifier getTopStart(androidx.ui.layout.LayoutGravity);
     method public androidx.ui.core.Modifier gravity(androidx.ui.core.Modifier, androidx.ui.core.Alignment align);
-    method public androidx.ui.core.Modifier matchParent(androidx.ui.core.Modifier);
+    method @Deprecated public androidx.ui.core.Modifier matchParent(androidx.ui.core.Modifier);
+    method public androidx.ui.core.Modifier matchParentSize(androidx.ui.core.Modifier);
     property @Deprecated public final androidx.ui.core.ParentDataModifier BottomCenter;
     property @Deprecated public final androidx.ui.core.ParentDataModifier BottomEnd;
     property @Deprecated public final androidx.ui.core.ParentDataModifier BottomStart;
diff --git a/ui/ui-layout/api/public_plus_experimental_0.1.0-dev09.txt b/ui/ui-layout/api/public_plus_experimental_0.1.0-dev09.txt
index 91a4bc30..7b0bd94 100644
--- a/ui/ui-layout/api/public_plus_experimental_0.1.0-dev09.txt
+++ b/ui/ui-layout/api/public_plus_experimental_0.1.0-dev09.txt
@@ -2,8 +2,8 @@
 package androidx.ui.layout {
 
   public final class AlignmentLineKt {
-    method public static void AlignmentLineOffset(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp before = 0.dp, androidx.ui.unit.Dp after = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void AlignmentLineOffset(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp before = 0.dp, androidx.ui.unit.Dp after = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public interface Arrangement {
@@ -64,7 +64,7 @@
   }
 
   public final class ColumnKt {
-    method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
+    method public static void Column(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public final class ColumnScope {
@@ -85,7 +85,7 @@
   }
 
   public final class ConstraintLayoutKt {
-    method public static void ConstraintLayout(androidx.ui.layout.ConstraintSet constraintSet, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void ConstraintLayout(androidx.ui.layout.ConstraintSet constraintSet, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class ConstraintSet {
@@ -276,7 +276,7 @@
   }
 
   public final class ContainerKt {
-    method @Deprecated public static void Container(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.EdgeInsets padding = androidx.ui.layout.EdgeInsets(0.dp), androidx.ui.core.Alignment alignment = Alignment.Center, boolean expanded = false, androidx.ui.layout.DpConstraints constraints = androidx.ui.layout.DpConstraints(), androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method @Deprecated public static void Container(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.EdgeInsets padding = androidx.ui.layout.EdgeInsets(0.dp), androidx.ui.core.Alignment alignment = Alignment.Center, boolean expanded = false, androidx.ui.layout.DpConstraints constraints = androidx.ui.layout.DpConstraints(), androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class CrossAxisAlignment {
@@ -632,6 +632,8 @@
     method public static androidx.ui.core.Modifier fillMaxHeight(androidx.ui.core.Modifier);
     method public static androidx.ui.core.Modifier fillMaxSize(androidx.ui.core.Modifier);
     method public static androidx.ui.core.Modifier fillMaxWidth(androidx.ui.core.Modifier);
+    method public static androidx.ui.core.Modifier height(androidx.ui.core.Modifier, androidx.ui.unit.Dp height);
+    method public static androidx.ui.core.Modifier heightIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minHeight = Dp.Unspecified, androidx.ui.unit.Dp maxHeight = Dp.Unspecified);
     method public static androidx.ui.core.Modifier preferredHeight(androidx.ui.core.Modifier, androidx.ui.unit.Dp height);
     method public static androidx.ui.core.Modifier preferredHeightIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minHeight = Dp.Unspecified, androidx.ui.unit.Dp maxHeight = Dp.Unspecified);
     method public static androidx.ui.core.Modifier preferredSize(androidx.ui.core.Modifier, androidx.ui.unit.Dp size);
@@ -640,6 +642,12 @@
     method public static androidx.ui.core.Modifier preferredSizeIn(androidx.ui.core.Modifier, androidx.ui.layout.DpConstraints constraints);
     method public static androidx.ui.core.Modifier preferredWidth(androidx.ui.core.Modifier, androidx.ui.unit.Dp width);
     method public static androidx.ui.core.Modifier preferredWidthIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minWidth = Dp.Unspecified, androidx.ui.unit.Dp maxWidth = Dp.Unspecified);
+    method public static androidx.ui.core.Modifier size(androidx.ui.core.Modifier, androidx.ui.unit.Dp size);
+    method public static androidx.ui.core.Modifier size(androidx.ui.core.Modifier, androidx.ui.unit.Dp width, androidx.ui.unit.Dp height);
+    method public static androidx.ui.core.Modifier sizeIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minWidth = Dp.Unspecified, androidx.ui.unit.Dp minHeight = Dp.Unspecified, androidx.ui.unit.Dp maxWidth = Dp.Unspecified, androidx.ui.unit.Dp maxHeight = Dp.Unspecified);
+    method public static androidx.ui.core.Modifier sizeIn(androidx.ui.core.Modifier, androidx.ui.layout.DpConstraints constraints);
+    method public static androidx.ui.core.Modifier width(androidx.ui.core.Modifier, androidx.ui.unit.Dp width);
+    method public static androidx.ui.core.Modifier widthIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minWidth = Dp.Unspecified, androidx.ui.unit.Dp maxWidth = Dp.Unspecified);
     method public static androidx.ui.core.Modifier wrapContentHeight(androidx.ui.core.Modifier, androidx.ui.core.Alignment align = Center);
     method public static androidx.ui.core.Modifier wrapContentSize(androidx.ui.core.Modifier, androidx.ui.core.Alignment align = Center);
     method public static androidx.ui.core.Modifier wrapContentWidth(androidx.ui.core.Modifier, androidx.ui.core.Alignment align = Center);
@@ -727,7 +735,7 @@
   }
 
   public final class RowKt {
-    method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
+    method public static void Row(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public final class RowScope {
@@ -757,7 +765,7 @@
   }
 
   public final class StackKt {
-    method public static void Stack(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackScope,kotlin.Unit> children);
+    method public static void Stack(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public final class StackScope {
@@ -773,7 +781,8 @@
     method @Deprecated public androidx.ui.core.ParentDataModifier getTopEnd(androidx.ui.layout.LayoutGravity);
     method @Deprecated public androidx.ui.core.ParentDataModifier getTopStart(androidx.ui.layout.LayoutGravity);
     method public androidx.ui.core.Modifier gravity(androidx.ui.core.Modifier, androidx.ui.core.Alignment align);
-    method public androidx.ui.core.Modifier matchParent(androidx.ui.core.Modifier);
+    method @Deprecated public androidx.ui.core.Modifier matchParent(androidx.ui.core.Modifier);
+    method public androidx.ui.core.Modifier matchParentSize(androidx.ui.core.Modifier);
     property @Deprecated public final androidx.ui.core.ParentDataModifier BottomCenter;
     property @Deprecated public final androidx.ui.core.ParentDataModifier BottomEnd;
     property @Deprecated public final androidx.ui.core.ParentDataModifier BottomStart;
diff --git a/ui/ui-layout/api/public_plus_experimental_current.txt b/ui/ui-layout/api/public_plus_experimental_current.txt
index 91a4bc30..7b0bd94 100644
--- a/ui/ui-layout/api/public_plus_experimental_current.txt
+++ b/ui/ui-layout/api/public_plus_experimental_current.txt
@@ -2,8 +2,8 @@
 package androidx.ui.layout {
 
   public final class AlignmentLineKt {
-    method public static void AlignmentLineOffset(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp before = 0.dp, androidx.ui.unit.Dp after = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void AlignmentLineOffset(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp before = 0.dp, androidx.ui.unit.Dp after = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public interface Arrangement {
@@ -64,7 +64,7 @@
   }
 
   public final class ColumnKt {
-    method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
+    method public static void Column(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public final class ColumnScope {
@@ -85,7 +85,7 @@
   }
 
   public final class ConstraintLayoutKt {
-    method public static void ConstraintLayout(androidx.ui.layout.ConstraintSet constraintSet, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void ConstraintLayout(androidx.ui.layout.ConstraintSet constraintSet, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class ConstraintSet {
@@ -276,7 +276,7 @@
   }
 
   public final class ContainerKt {
-    method @Deprecated public static void Container(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.EdgeInsets padding = androidx.ui.layout.EdgeInsets(0.dp), androidx.ui.core.Alignment alignment = Alignment.Center, boolean expanded = false, androidx.ui.layout.DpConstraints constraints = androidx.ui.layout.DpConstraints(), androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method @Deprecated public static void Container(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.EdgeInsets padding = androidx.ui.layout.EdgeInsets(0.dp), androidx.ui.core.Alignment alignment = Alignment.Center, boolean expanded = false, androidx.ui.layout.DpConstraints constraints = androidx.ui.layout.DpConstraints(), androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class CrossAxisAlignment {
@@ -632,6 +632,8 @@
     method public static androidx.ui.core.Modifier fillMaxHeight(androidx.ui.core.Modifier);
     method public static androidx.ui.core.Modifier fillMaxSize(androidx.ui.core.Modifier);
     method public static androidx.ui.core.Modifier fillMaxWidth(androidx.ui.core.Modifier);
+    method public static androidx.ui.core.Modifier height(androidx.ui.core.Modifier, androidx.ui.unit.Dp height);
+    method public static androidx.ui.core.Modifier heightIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minHeight = Dp.Unspecified, androidx.ui.unit.Dp maxHeight = Dp.Unspecified);
     method public static androidx.ui.core.Modifier preferredHeight(androidx.ui.core.Modifier, androidx.ui.unit.Dp height);
     method public static androidx.ui.core.Modifier preferredHeightIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minHeight = Dp.Unspecified, androidx.ui.unit.Dp maxHeight = Dp.Unspecified);
     method public static androidx.ui.core.Modifier preferredSize(androidx.ui.core.Modifier, androidx.ui.unit.Dp size);
@@ -640,6 +642,12 @@
     method public static androidx.ui.core.Modifier preferredSizeIn(androidx.ui.core.Modifier, androidx.ui.layout.DpConstraints constraints);
     method public static androidx.ui.core.Modifier preferredWidth(androidx.ui.core.Modifier, androidx.ui.unit.Dp width);
     method public static androidx.ui.core.Modifier preferredWidthIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minWidth = Dp.Unspecified, androidx.ui.unit.Dp maxWidth = Dp.Unspecified);
+    method public static androidx.ui.core.Modifier size(androidx.ui.core.Modifier, androidx.ui.unit.Dp size);
+    method public static androidx.ui.core.Modifier size(androidx.ui.core.Modifier, androidx.ui.unit.Dp width, androidx.ui.unit.Dp height);
+    method public static androidx.ui.core.Modifier sizeIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minWidth = Dp.Unspecified, androidx.ui.unit.Dp minHeight = Dp.Unspecified, androidx.ui.unit.Dp maxWidth = Dp.Unspecified, androidx.ui.unit.Dp maxHeight = Dp.Unspecified);
+    method public static androidx.ui.core.Modifier sizeIn(androidx.ui.core.Modifier, androidx.ui.layout.DpConstraints constraints);
+    method public static androidx.ui.core.Modifier width(androidx.ui.core.Modifier, androidx.ui.unit.Dp width);
+    method public static androidx.ui.core.Modifier widthIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minWidth = Dp.Unspecified, androidx.ui.unit.Dp maxWidth = Dp.Unspecified);
     method public static androidx.ui.core.Modifier wrapContentHeight(androidx.ui.core.Modifier, androidx.ui.core.Alignment align = Center);
     method public static androidx.ui.core.Modifier wrapContentSize(androidx.ui.core.Modifier, androidx.ui.core.Alignment align = Center);
     method public static androidx.ui.core.Modifier wrapContentWidth(androidx.ui.core.Modifier, androidx.ui.core.Alignment align = Center);
@@ -727,7 +735,7 @@
   }
 
   public final class RowKt {
-    method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
+    method public static void Row(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public final class RowScope {
@@ -757,7 +765,7 @@
   }
 
   public final class StackKt {
-    method public static void Stack(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackScope,kotlin.Unit> children);
+    method public static void Stack(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public final class StackScope {
@@ -773,7 +781,8 @@
     method @Deprecated public androidx.ui.core.ParentDataModifier getTopEnd(androidx.ui.layout.LayoutGravity);
     method @Deprecated public androidx.ui.core.ParentDataModifier getTopStart(androidx.ui.layout.LayoutGravity);
     method public androidx.ui.core.Modifier gravity(androidx.ui.core.Modifier, androidx.ui.core.Alignment align);
-    method public androidx.ui.core.Modifier matchParent(androidx.ui.core.Modifier);
+    method @Deprecated public androidx.ui.core.Modifier matchParent(androidx.ui.core.Modifier);
+    method public androidx.ui.core.Modifier matchParentSize(androidx.ui.core.Modifier);
     property @Deprecated public final androidx.ui.core.ParentDataModifier BottomCenter;
     property @Deprecated public final androidx.ui.core.ParentDataModifier BottomEnd;
     property @Deprecated public final androidx.ui.core.ParentDataModifier BottomStart;
diff --git a/ui/ui-layout/api/restricted_0.1.0-dev09.txt b/ui/ui-layout/api/restricted_0.1.0-dev09.txt
index 91a4bc30..7b0bd94 100644
--- a/ui/ui-layout/api/restricted_0.1.0-dev09.txt
+++ b/ui/ui-layout/api/restricted_0.1.0-dev09.txt
@@ -2,8 +2,8 @@
 package androidx.ui.layout {
 
   public final class AlignmentLineKt {
-    method public static void AlignmentLineOffset(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp before = 0.dp, androidx.ui.unit.Dp after = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void AlignmentLineOffset(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp before = 0.dp, androidx.ui.unit.Dp after = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public interface Arrangement {
@@ -64,7 +64,7 @@
   }
 
   public final class ColumnKt {
-    method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
+    method public static void Column(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public final class ColumnScope {
@@ -85,7 +85,7 @@
   }
 
   public final class ConstraintLayoutKt {
-    method public static void ConstraintLayout(androidx.ui.layout.ConstraintSet constraintSet, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void ConstraintLayout(androidx.ui.layout.ConstraintSet constraintSet, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class ConstraintSet {
@@ -276,7 +276,7 @@
   }
 
   public final class ContainerKt {
-    method @Deprecated public static void Container(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.EdgeInsets padding = androidx.ui.layout.EdgeInsets(0.dp), androidx.ui.core.Alignment alignment = Alignment.Center, boolean expanded = false, androidx.ui.layout.DpConstraints constraints = androidx.ui.layout.DpConstraints(), androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method @Deprecated public static void Container(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.EdgeInsets padding = androidx.ui.layout.EdgeInsets(0.dp), androidx.ui.core.Alignment alignment = Alignment.Center, boolean expanded = false, androidx.ui.layout.DpConstraints constraints = androidx.ui.layout.DpConstraints(), androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class CrossAxisAlignment {
@@ -632,6 +632,8 @@
     method public static androidx.ui.core.Modifier fillMaxHeight(androidx.ui.core.Modifier);
     method public static androidx.ui.core.Modifier fillMaxSize(androidx.ui.core.Modifier);
     method public static androidx.ui.core.Modifier fillMaxWidth(androidx.ui.core.Modifier);
+    method public static androidx.ui.core.Modifier height(androidx.ui.core.Modifier, androidx.ui.unit.Dp height);
+    method public static androidx.ui.core.Modifier heightIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minHeight = Dp.Unspecified, androidx.ui.unit.Dp maxHeight = Dp.Unspecified);
     method public static androidx.ui.core.Modifier preferredHeight(androidx.ui.core.Modifier, androidx.ui.unit.Dp height);
     method public static androidx.ui.core.Modifier preferredHeightIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minHeight = Dp.Unspecified, androidx.ui.unit.Dp maxHeight = Dp.Unspecified);
     method public static androidx.ui.core.Modifier preferredSize(androidx.ui.core.Modifier, androidx.ui.unit.Dp size);
@@ -640,6 +642,12 @@
     method public static androidx.ui.core.Modifier preferredSizeIn(androidx.ui.core.Modifier, androidx.ui.layout.DpConstraints constraints);
     method public static androidx.ui.core.Modifier preferredWidth(androidx.ui.core.Modifier, androidx.ui.unit.Dp width);
     method public static androidx.ui.core.Modifier preferredWidthIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minWidth = Dp.Unspecified, androidx.ui.unit.Dp maxWidth = Dp.Unspecified);
+    method public static androidx.ui.core.Modifier size(androidx.ui.core.Modifier, androidx.ui.unit.Dp size);
+    method public static androidx.ui.core.Modifier size(androidx.ui.core.Modifier, androidx.ui.unit.Dp width, androidx.ui.unit.Dp height);
+    method public static androidx.ui.core.Modifier sizeIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minWidth = Dp.Unspecified, androidx.ui.unit.Dp minHeight = Dp.Unspecified, androidx.ui.unit.Dp maxWidth = Dp.Unspecified, androidx.ui.unit.Dp maxHeight = Dp.Unspecified);
+    method public static androidx.ui.core.Modifier sizeIn(androidx.ui.core.Modifier, androidx.ui.layout.DpConstraints constraints);
+    method public static androidx.ui.core.Modifier width(androidx.ui.core.Modifier, androidx.ui.unit.Dp width);
+    method public static androidx.ui.core.Modifier widthIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minWidth = Dp.Unspecified, androidx.ui.unit.Dp maxWidth = Dp.Unspecified);
     method public static androidx.ui.core.Modifier wrapContentHeight(androidx.ui.core.Modifier, androidx.ui.core.Alignment align = Center);
     method public static androidx.ui.core.Modifier wrapContentSize(androidx.ui.core.Modifier, androidx.ui.core.Alignment align = Center);
     method public static androidx.ui.core.Modifier wrapContentWidth(androidx.ui.core.Modifier, androidx.ui.core.Alignment align = Center);
@@ -727,7 +735,7 @@
   }
 
   public final class RowKt {
-    method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
+    method public static void Row(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public final class RowScope {
@@ -757,7 +765,7 @@
   }
 
   public final class StackKt {
-    method public static void Stack(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackScope,kotlin.Unit> children);
+    method public static void Stack(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public final class StackScope {
@@ -773,7 +781,8 @@
     method @Deprecated public androidx.ui.core.ParentDataModifier getTopEnd(androidx.ui.layout.LayoutGravity);
     method @Deprecated public androidx.ui.core.ParentDataModifier getTopStart(androidx.ui.layout.LayoutGravity);
     method public androidx.ui.core.Modifier gravity(androidx.ui.core.Modifier, androidx.ui.core.Alignment align);
-    method public androidx.ui.core.Modifier matchParent(androidx.ui.core.Modifier);
+    method @Deprecated public androidx.ui.core.Modifier matchParent(androidx.ui.core.Modifier);
+    method public androidx.ui.core.Modifier matchParentSize(androidx.ui.core.Modifier);
     property @Deprecated public final androidx.ui.core.ParentDataModifier BottomCenter;
     property @Deprecated public final androidx.ui.core.ParentDataModifier BottomEnd;
     property @Deprecated public final androidx.ui.core.ParentDataModifier BottomStart;
diff --git a/ui/ui-layout/api/restricted_current.txt b/ui/ui-layout/api/restricted_current.txt
index 91a4bc30..7b0bd94 100644
--- a/ui/ui-layout/api/restricted_current.txt
+++ b/ui/ui-layout/api/restricted_current.txt
@@ -2,8 +2,8 @@
 package androidx.ui.layout {
 
   public final class AlignmentLineKt {
-    method public static void AlignmentLineOffset(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.unit.Dp before = 0.dp, androidx.ui.unit.Dp after = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void AlignmentLineOffset(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp before = 0.dp, androidx.ui.unit.Dp after = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void CenterAlignmentLine(androidx.ui.core.AlignmentLine alignmentLine, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public interface Arrangement {
@@ -64,7 +64,7 @@
   }
 
   public final class ColumnKt {
-    method public static void Column(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
+    method public static void Column(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.Arrangement.Vertical arrangement = Arrangement.Top, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public final class ColumnScope {
@@ -85,7 +85,7 @@
   }
 
   public final class ConstraintLayoutKt {
-    method public static void ConstraintLayout(androidx.ui.layout.ConstraintSet constraintSet, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public static void ConstraintLayout(androidx.ui.layout.ConstraintSet constraintSet, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class ConstraintSet {
@@ -276,7 +276,7 @@
   }
 
   public final class ContainerKt {
-    method @Deprecated public static void Container(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.EdgeInsets padding = androidx.ui.layout.EdgeInsets(0.dp), androidx.ui.core.Alignment alignment = Alignment.Center, boolean expanded = false, androidx.ui.layout.DpConstraints constraints = androidx.ui.layout.DpConstraints(), androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method @Deprecated public static void Container(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.EdgeInsets padding = androidx.ui.layout.EdgeInsets(0.dp), androidx.ui.core.Alignment alignment = Alignment.Center, boolean expanded = false, androidx.ui.layout.DpConstraints constraints = androidx.ui.layout.DpConstraints(), androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
   public final class CrossAxisAlignment {
@@ -632,6 +632,8 @@
     method public static androidx.ui.core.Modifier fillMaxHeight(androidx.ui.core.Modifier);
     method public static androidx.ui.core.Modifier fillMaxSize(androidx.ui.core.Modifier);
     method public static androidx.ui.core.Modifier fillMaxWidth(androidx.ui.core.Modifier);
+    method public static androidx.ui.core.Modifier height(androidx.ui.core.Modifier, androidx.ui.unit.Dp height);
+    method public static androidx.ui.core.Modifier heightIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minHeight = Dp.Unspecified, androidx.ui.unit.Dp maxHeight = Dp.Unspecified);
     method public static androidx.ui.core.Modifier preferredHeight(androidx.ui.core.Modifier, androidx.ui.unit.Dp height);
     method public static androidx.ui.core.Modifier preferredHeightIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minHeight = Dp.Unspecified, androidx.ui.unit.Dp maxHeight = Dp.Unspecified);
     method public static androidx.ui.core.Modifier preferredSize(androidx.ui.core.Modifier, androidx.ui.unit.Dp size);
@@ -640,6 +642,12 @@
     method public static androidx.ui.core.Modifier preferredSizeIn(androidx.ui.core.Modifier, androidx.ui.layout.DpConstraints constraints);
     method public static androidx.ui.core.Modifier preferredWidth(androidx.ui.core.Modifier, androidx.ui.unit.Dp width);
     method public static androidx.ui.core.Modifier preferredWidthIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minWidth = Dp.Unspecified, androidx.ui.unit.Dp maxWidth = Dp.Unspecified);
+    method public static androidx.ui.core.Modifier size(androidx.ui.core.Modifier, androidx.ui.unit.Dp size);
+    method public static androidx.ui.core.Modifier size(androidx.ui.core.Modifier, androidx.ui.unit.Dp width, androidx.ui.unit.Dp height);
+    method public static androidx.ui.core.Modifier sizeIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minWidth = Dp.Unspecified, androidx.ui.unit.Dp minHeight = Dp.Unspecified, androidx.ui.unit.Dp maxWidth = Dp.Unspecified, androidx.ui.unit.Dp maxHeight = Dp.Unspecified);
+    method public static androidx.ui.core.Modifier sizeIn(androidx.ui.core.Modifier, androidx.ui.layout.DpConstraints constraints);
+    method public static androidx.ui.core.Modifier width(androidx.ui.core.Modifier, androidx.ui.unit.Dp width);
+    method public static androidx.ui.core.Modifier widthIn(androidx.ui.core.Modifier, androidx.ui.unit.Dp minWidth = Dp.Unspecified, androidx.ui.unit.Dp maxWidth = Dp.Unspecified);
     method public static androidx.ui.core.Modifier wrapContentHeight(androidx.ui.core.Modifier, androidx.ui.core.Alignment align = Center);
     method public static androidx.ui.core.Modifier wrapContentSize(androidx.ui.core.Modifier, androidx.ui.core.Alignment align = Center);
     method public static androidx.ui.core.Modifier wrapContentWidth(androidx.ui.core.Modifier, androidx.ui.core.Alignment align = Center);
@@ -727,7 +735,7 @@
   }
 
   public final class RowKt {
-    method public static void Row(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
+    method public static void Row(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.Arrangement.Horizontal arrangement = Arrangement.Start, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public final class RowScope {
@@ -757,7 +765,7 @@
   }
 
   public final class StackKt {
-    method public static void Stack(androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackScope,kotlin.Unit> children);
+    method public static void Stack(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackScope,kotlin.Unit> children);
   }
 
   @androidx.ui.layout.LayoutScopeMarker public final class StackScope {
@@ -773,7 +781,8 @@
     method @Deprecated public androidx.ui.core.ParentDataModifier getTopEnd(androidx.ui.layout.LayoutGravity);
     method @Deprecated public androidx.ui.core.ParentDataModifier getTopStart(androidx.ui.layout.LayoutGravity);
     method public androidx.ui.core.Modifier gravity(androidx.ui.core.Modifier, androidx.ui.core.Alignment align);
-    method public androidx.ui.core.Modifier matchParent(androidx.ui.core.Modifier);
+    method @Deprecated public androidx.ui.core.Modifier matchParent(androidx.ui.core.Modifier);
+    method public androidx.ui.core.Modifier matchParentSize(androidx.ui.core.Modifier);
     property @Deprecated public final androidx.ui.core.ParentDataModifier BottomCenter;
     property @Deprecated public final androidx.ui.core.ParentDataModifier BottomEnd;
     property @Deprecated public final androidx.ui.core.ParentDataModifier BottomStart;
diff --git a/ui/ui-layout/build.gradle b/ui/ui-layout/build.gradle
index f6448ee..1e2e9b2 100644
--- a/ui/ui-layout/build.gradle
+++ b/ui/ui-layout/build.gradle
@@ -39,6 +39,7 @@
     implementation project(":compose:compose-runtime")
     api project(":ui:ui-core")
     implementation project(":ui:ui-framework")
+    implementation project(":ui:ui-text")
     implementation(CONSTRAINT_LAYOUT_SOLVER)
 
     testImplementation(ANDROIDX_TEST_RULES)
diff --git a/ui/ui-layout/integration-tests/layout-demos/build.gradle b/ui/ui-layout/integration-tests/layout-demos/build.gradle
index c321f75..adc7fa9 100644
--- a/ui/ui-layout/integration-tests/layout-demos/build.gradle
+++ b/ui/ui-layout/integration-tests/layout-demos/build.gradle
@@ -36,6 +36,7 @@
     implementation project(":ui:ui-framework")
     implementation project(":ui:ui-layout")
     implementation project(":ui:ui-layout:samples")
+    implementation project(":ui:ui-text-core")
     implementation project(":ui:ui-text")
     implementation project(":ui:ui-foundation")
 }
diff --git a/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/ComplexLayoutDemo.kt b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/ComplexLayoutDemo.kt
index 3d00524..e8b2651e 100644
--- a/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/ComplexLayoutDemo.kt
+++ b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/ComplexLayoutDemo.kt
@@ -17,30 +17,22 @@
 package androidx.ui.layout.demos
 
 import androidx.compose.Composable
-import androidx.ui.core.FirstBaseline
 import androidx.ui.core.Modifier
-import androidx.ui.foundation.Text
+import androidx.ui.foundation.Box
 import androidx.ui.foundation.drawBackground
+import androidx.ui.foundation.drawBorder
 import androidx.ui.graphics.Color
-import androidx.ui.layout.AlignmentLineOffset
-import androidx.ui.layout.Stack
+import androidx.ui.layout.size
 import androidx.ui.unit.dp
 
 @Composable
-private fun AlignmentLineOffsetUsage() {
-    AlignmentLineOffset(
-        FirstBaseline,
-        modifier = Modifier.drawBackground(Color.Gray),
-        before = 20.dp,
-        after = 40.dp
-    ) {
-        Text("Text providing baseline")
-    }
-}
-
-@Composable
 fun ComplexLayoutDemo() {
-    Stack {
-        AlignmentLineOffsetUsage()
-    }
+    Box(
+        Modifier
+            .drawBackground(Color.Blue)
+            .size(100.dp, 100.dp)
+            .drawBorder(1.dp, Color.LightGray)
+            .size(50.dp, 50.dp),
+        backgroundColor = Color.Red
+    )
 }
diff --git a/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/RtlDemo.kt b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/RtlDemo.kt
index e3367b1..3ad2489 100644
--- a/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/RtlDemo.kt
+++ b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/RtlDemo.kt
@@ -149,7 +149,7 @@
 }
 
 @Composable
-private fun LayoutWithConstraints(modifier: Modifier = Modifier.None, text: String) {
+private fun LayoutWithConstraints(modifier: Modifier = Modifier, text: String) {
     WithConstraints(modifier) { constraints, direction ->
         with(DensityAmbient.current) {
             val w = (constraints.maxWidth / 3).toDp()
diff --git a/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/SimpleLayoutDemo.kt b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/SimpleLayoutDemo.kt
index dbd8e85..074a4ac 100644
--- a/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/SimpleLayoutDemo.kt
+++ b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/SimpleLayoutDemo.kt
@@ -120,12 +120,12 @@
 }
 
 @Composable
-private fun PurpleSquare(modifier: Modifier = Modifier.None) {
+private fun PurpleSquare(modifier: Modifier = Modifier) {
     Box(modifier.preferredSize(48.dp), backgroundColor = Color(0xFF6200EE))
 }
 
 @Composable
-private fun CyanSquare(modifier: Modifier = Modifier.None) {
+private fun CyanSquare(modifier: Modifier = Modifier) {
     Box(modifier.preferredSize(24.dp), backgroundColor = Color(0xFF03DAC6))
 }
 
diff --git a/ui/ui-layout/samples/build.gradle b/ui/ui-layout/samples/build.gradle
index c9bab7a..797c971 100644
--- a/ui/ui-layout/samples/build.gradle
+++ b/ui/ui-layout/samples/build.gradle
@@ -36,6 +36,7 @@
     implementation project(":ui:ui-framework")
     implementation project(":ui:ui-layout")
     implementation project(":ui:ui-foundation")
+    implementation project(":ui:ui-text-core")
     implementation project(":ui:ui-text")
 }
 
diff --git a/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/FlexSample.kt b/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/FlexSample.kt
index b63cb3a7..5bc5e5ac 100644
--- a/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/FlexSample.kt
+++ b/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/FlexSample.kt
@@ -18,7 +18,7 @@
 
 import androidx.annotation.Sampled
 import androidx.compose.Composable
-import androidx.ui.core.FirstBaseline
+import androidx.ui.text.FirstBaseline
 import androidx.ui.core.Modifier
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.Text
diff --git a/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/LayoutSample.kt b/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/LayoutSample.kt
index 8374b11..bb5e41f 100644
--- a/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/LayoutSample.kt
+++ b/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/LayoutSample.kt
@@ -33,7 +33,7 @@
 // TODO (popam): remove this and make FlexSamples where it's being used copy-pastable
 @Composable
 fun SizedRectangleWithLines(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     color: Color,
     width: Dp? = null,
     height: Dp? = null
diff --git a/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/SizeModifierSample.kt b/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/SizeModifierSample.kt
index b80f0a6..6e3ce61 100644
--- a/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/SizeModifierSample.kt
+++ b/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/SizeModifierSample.kt
@@ -18,6 +18,7 @@
 
 import androidx.annotation.Sampled
 import androidx.compose.Composable
+import androidx.ui.core.Alignment
 import androidx.ui.core.Modifier
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.ContentGravity
@@ -28,14 +29,61 @@
 import androidx.ui.layout.fillMaxHeight
 import androidx.ui.layout.fillMaxSize
 import androidx.ui.layout.fillMaxWidth
+import androidx.ui.layout.height
 import androidx.ui.layout.preferredHeight
 import androidx.ui.layout.preferredSize
 import androidx.ui.layout.preferredWidth
+import androidx.ui.layout.size
+import androidx.ui.layout.width
 import androidx.ui.unit.dp
 
 @Sampled
 @Composable
 fun SimpleSizeModifier() {
+    // The result is a 50.dp x 50.dp red box centered in a 100.dp x 100.dp space.
+    // Note that although a previous modifier asked it to be 100.dp x 100.dp, this
+    // will not be respected. They would be respected if preferredSize was used instead of size.
+    Box(
+        Modifier
+            .size(100.dp, 100.dp)
+            .size(50.dp, 50.dp),
+        backgroundColor = Color.Red
+    )
+}
+
+@Sampled
+@Composable
+fun SimpleWidthModifier() {
+    // The result is a 50.dp x 50.dp magenta box centered in a 100.dp x 100.dp space.
+    // Note that although a previous modifier asked it to be 100.dp width, this
+    // will not be respected. They would be respected if preferredWidth was used instead of width.
+    Box(
+        Modifier
+            .width(100.dp)
+            .width(50.dp)
+            .aspectRatio(1f),
+        backgroundColor = Color.Magenta
+    )
+}
+
+@Sampled
+@Composable
+fun SimpleHeightModifier() {
+    // The result is a 50.dp x 50.dp blue box centered in a 100.dp x 100.dp space.
+    // Note that although a previous modifier asked it to be 100.dp height, this
+    // will not be respected. They would be respected if preferredHeight was used instead of height.
+    Box(
+        Modifier
+            .height(100.dp)
+            .height(50.dp)
+            .aspectRatio(1f),
+        backgroundColor = Color.Blue
+    )
+}
+
+@Sampled
+@Composable
+fun SimplePreferredSizeModifier() {
     Stack {
         Box(Modifier.preferredSize(100.dp, 100.dp), backgroundColor = Color.Red)
     }
@@ -43,7 +91,7 @@
 
 @Sampled
 @Composable
-fun SimpleWidthModifier() {
+fun SimplePreferredWidthModifier() {
     Stack {
         Box(Modifier.preferredWidth(100.dp).aspectRatio(1f), backgroundColor = Color.Magenta)
     }
@@ -51,7 +99,7 @@
 
 @Sampled
 @Composable
-fun SimpleHeightModifier() {
+fun SimplePreferredHeightModifier() {
     Stack {
         Box(Modifier.preferredHeight(100.dp).aspectRatio(1f), backgroundColor = Color.Blue)
     }
diff --git a/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/StackSample.kt b/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/StackSample.kt
index 98e48e68..5f711ba 100644
--- a/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/StackSample.kt
+++ b/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/StackSample.kt
@@ -34,10 +34,10 @@
     Stack {
         Box(Modifier.fillMaxSize(), backgroundColor = Color.Cyan)
         Box(
-            Modifier.matchParent().padding(top = 20.dp, bottom = 20.dp),
+            Modifier.matchParentSize().padding(top = 20.dp, bottom = 20.dp),
             backgroundColor = Color.Yellow
         )
-        Box(Modifier.matchParent().padding(40.dp), backgroundColor = Color.Magenta)
+        Box(Modifier.matchParentSize().padding(40.dp), backgroundColor = Color.Magenta)
         Box(
             Modifier.gravity(Alignment.Center).preferredSize(300.dp, 300.dp),
             backgroundColor = Color.Green
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/AlignmentLineTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/AlignmentLineTest.kt
index 96f054a..af40a0d 100644
--- a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/AlignmentLineTest.kt
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/AlignmentLineTest.kt
@@ -395,24 +395,26 @@
         val centerSize = Ref<IntPxSize>()
         val childPosition = Ref<PxPosition>()
         show {
-            Layout({
-                CenterAlignmentLine(testLine,
-                    Modifier.saveLayoutInfo(centerSize, Ref(), layoutLatch)
-                ) {
-                    Layout({ },
-                        Modifier.saveLayoutInfo(Ref(), childPosition, layoutLatch)
-                    ) { _, _, _ ->
-                        layout(
-                            childWidth.toIntPx(),
-                            childHeight.toIntPx(),
-                            mapOf(testLine to lineDp.toIntPx())
-                        ) { }
+            Stack {
+                Layout({
+                    CenterAlignmentLine(testLine,
+                        Modifier.saveLayoutInfo(centerSize, Ref(), layoutLatch)
+                    ) {
+                        Layout({ },
+                            Modifier.saveLayoutInfo(Ref(), childPosition, layoutLatch)
+                        ) { _, _, _ ->
+                            layout(
+                                childWidth.toIntPx(),
+                                childHeight.toIntPx(),
+                                mapOf(testLine to lineDp.toIntPx())
+                            ) { }
+                        }
                     }
-                }
-            }) { measurables, _, _ ->
-                val placeable = measurables.first().measure(Constraints()) // Infinite measuring
-                layout(0.ipx, 0.ipx) {
-                    placeable.place(0.ipx, 0.ipx)
+                }) { measurables, _, _ ->
+                    val placeable = measurables.first().measure(Constraints()) // Infinite measuring
+                    layout(placeable.width, placeable.height) {
+                        placeable.place(0.ipx, 0.ipx)
+                    }
                 }
             }
         }
@@ -442,24 +444,26 @@
         val centerSize = Ref<IntPxSize>()
         val childPosition = Ref<PxPosition>()
         show {
-            Layout({
-                CenterAlignmentLine(testLine,
-                    Modifier.saveLayoutInfo(centerSize, Ref(), layoutLatch)
-                ) {
-                    Layout({ },
-                        Modifier.saveLayoutInfo(Ref(), childPosition, layoutLatch)
-                    ) { _, _, _ ->
-                        layout(
-                            childWidth.toIntPx(),
-                            childHeight.toIntPx(),
-                            mapOf(testLine to lineDp.toIntPx())
-                        ) { }
+            Stack {
+                Layout({
+                    CenterAlignmentLine(testLine,
+                        Modifier.saveLayoutInfo(centerSize, Ref(), layoutLatch)
+                    ) {
+                        Layout({ },
+                            Modifier.saveLayoutInfo(Ref(), childPosition, layoutLatch)
+                        ) { _, _, _ ->
+                            layout(
+                                childWidth.toIntPx(),
+                                childHeight.toIntPx(),
+                                mapOf(testLine to lineDp.toIntPx())
+                            ) { }
+                        }
                     }
-                }
-            }) { measurables, _, _ ->
-                val placeable = measurables.first().measure(Constraints()) // Infinite measuring
-                layout(0.ipx, 0.ipx) {
-                    placeable.place(0.ipx, 0.ipx)
+                }) { measurables, _, _ ->
+                    val placeable = measurables.first().measure(Constraints()) // Infinite measuring
+                    layout(placeable.width, placeable.height) {
+                        placeable.place(0.ipx, 0.ipx)
+                    }
                 }
             }
         }
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/ConstraintLayoutTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/ConstraintLayoutTest.kt
index 487a348..188437a 100644
--- a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/ConstraintLayoutTest.kt
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/ConstraintLayoutTest.kt
@@ -24,10 +24,6 @@
 import androidx.ui.core.globalPosition
 import androidx.ui.core.onPositioned
 import androidx.ui.foundation.Box
-import androidx.ui.layout.LayoutAlign
-import androidx.ui.layout.LayoutDirectionModifier
-import androidx.ui.layout.LayoutSize
-import androidx.ui.layout.LayoutWidth
 import androidx.ui.layout.ConstraintLayout
 import androidx.ui.layout.ConstraintSet
 import androidx.ui.layout.aspectRatio
@@ -38,6 +34,7 @@
 import androidx.ui.layout.rtl
 import androidx.ui.layout.wrapContentSize
 import androidx.ui.test.createComposeRule
+import androidx.ui.test.runOnIdleCompose
 import androidx.ui.unit.IntPxSize
 import androidx.ui.unit.PxPosition
 import androidx.ui.unit.dp
@@ -97,7 +94,7 @@
             }
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             // The aspect ratio could not wrap and it is wrap suggested, so it respects constraints.
             assertEquals(
                 (composeTestRule.displayMetrics.widthPixels / 2).ipx,
@@ -157,7 +154,7 @@
             }
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             // The aspect ratio could not wrap and it is wrap suggested, so it respects constraints.
             assertEquals(
                 (composeTestRule.displayMetrics.widthPixels / 2).ipx,
@@ -218,7 +215,7 @@
             }
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             // The aspect ratio could not wrap and it is wrap suggested, so it respects constraints.
             assertEquals(
                 (composeTestRule.displayMetrics.widthPixels / 2).ipx,
@@ -283,7 +280,7 @@
             }
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             // The width of the ConstraintLayout should be twice the width of the aspect ratio box.
             assertEquals(size.toIntPx() * 2, constraintLayoutSize.value!!.width)
             // The height of the ConstraintLayout should be the height of the aspect ratio box.
@@ -346,7 +343,7 @@
         val displayWidth = composeTestRule.displayMetrics.widthPixels.ipx
         val displayHeight = composeTestRule.displayMetrics.heightPixels.ipx
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertEquals(
                 PxPosition((displayWidth - boxSize) / 2, (displayHeight - boxSize) / 2),
                 position[0].value
@@ -407,7 +404,7 @@
         val displayWidth = composeTestRule.displayMetrics.widthPixels.ipx
         val displayHeight = composeTestRule.displayMetrics.heightPixels.ipx
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertEquals(
                 PxPosition((displayWidth - boxSize) / 2, (displayHeight - boxSize) / 2),
                 position[0].value
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/ContainerTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/ContainerTest.kt
index f8a97a5..49972de 100644
--- a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/ContainerTest.kt
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/ContainerTest.kt
@@ -467,7 +467,7 @@
     }
 
     @Composable
-    fun EmptyBox(width: Dp, height: Dp, modifier: Modifier = Modifier.None) {
+    fun EmptyBox(width: Dp, height: Dp, modifier: Modifier = Modifier) {
         Layout(modifier = modifier, children = { }) { _, constraints, _ ->
             layout(
                 width.toIntPx().coerceIn(constraints.minWidth, constraints.maxWidth),
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/IntrinsicTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/IntrinsicTest.kt
index b0d1000..47db3c5 100644
--- a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/IntrinsicTest.kt
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/IntrinsicTest.kt
@@ -475,7 +475,7 @@
 
 @Composable
 private fun FixedIntrinsicsBox(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     minIntrinsicWidth: Dp,
     width: Dp,
     maxIntrinsicWidth: Dp,
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutOffsetTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutOffsetTest.kt
index 38a6ddd..81f206f 100644
--- a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutOffsetTest.kt
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutOffsetTest.kt
@@ -31,6 +31,7 @@
 import androidx.ui.layout.wrapContentSize
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.findByTag
+import androidx.ui.test.runOnIdleCompose
 import androidx.ui.unit.dp
 import androidx.ui.unit.ipx
 import androidx.ui.unit.round
@@ -76,7 +77,7 @@
         }
 
         findByTag("stack").assertExists()
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertEquals(offsetX.toIntPx(), positionX)
             assertEquals(offsetY.toIntPx(), positionY)
         }
@@ -107,7 +108,7 @@
         }
 
         findByTag("stack").assertExists()
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertEquals(containerWidth.toIntPx() - offsetX.toIntPx(), positionX)
             assertEquals(offsetY.toIntPx(), positionY)
         }
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutPaddingTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutPaddingTest.kt
index 873e88f..dfd1be4 100644
--- a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutPaddingTest.kt
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutPaddingTest.kt
@@ -22,12 +22,18 @@
 import androidx.ui.core.Layout
 import androidx.ui.core.LayoutCoordinates
 import androidx.ui.core.Modifier
+import androidx.ui.core.Ref
+import androidx.ui.core.onChildPositioned
 import androidx.ui.core.onPositioned
+import androidx.ui.core.positionInRoot
+import androidx.ui.layout.Column
 import androidx.ui.layout.DpConstraints
 import androidx.ui.layout.LayoutPadding
 import androidx.ui.layout.Row
 import androidx.ui.layout.Stack
 import androidx.ui.layout.aspectRatio
+import androidx.ui.layout.fillMaxSize
+import androidx.ui.layout.ltr
 import androidx.ui.layout.padding
 import androidx.ui.layout.preferredSize
 import androidx.ui.layout.preferredWidth
@@ -41,6 +47,7 @@
 import androidx.ui.unit.min
 import androidx.ui.unit.px
 import androidx.ui.unit.toPx
+import androidx.ui.unit.toPxSize
 import org.junit.Assert
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertTrue
@@ -281,6 +288,48 @@
         assertEquals(IntPxSize(size, size), childSize[2])
     }
 
+    @Test
+    fun testPaddingRtl_whenBetweenLayoutDirectionModifiers() = with(density) {
+        val padding = 50.ipx
+        val size = 300.ipx
+        val paddingDp = padding.toDp()
+        val latch = CountDownLatch(1)
+        val resultPosition = Ref<PxPosition>()
+        val resultSize = Ref<IntPxSize>()
+
+        show {
+            Column(Modifier.rtl) {
+                Stack(Modifier
+                    .preferredSize(size.toDp())
+                    .ltr
+                    .padding(start = paddingDp)
+                    .rtl
+                    .onChildPositioned {
+                        resultPosition.value = it.positionInRoot
+                        resultSize.value = it.size
+                        latch.countDown()
+                    }
+                ) {
+                    Stack(Modifier.fillMaxSize()) {}
+                }
+            }
+        }
+
+        assertTrue(latch.await(1, TimeUnit.SECONDS))
+        val root = findOwnerView()
+        waitForDraw(root)
+        val rootWidth = root.width.ipx
+
+        assertEquals(
+            IntPxSize(size - padding, size).toPxSize(),
+            resultSize.value?.toPxSize()
+        )
+        assertEquals(
+            PxPosition(rootWidth - size + padding, 0.ipx),
+            resultPosition.value
+        )
+    }
+
     private fun testPaddingIsAppliedImplementation(
         padding: Dp,
         paddingContainer: @Composable() (@Composable() () -> Unit) -> Unit
@@ -424,7 +473,7 @@
      * with the same constraints it received.
      */
     @Composable
-    private fun TestBox(modifier: Modifier = Modifier.None, body: @Composable() () -> Unit) {
+    private fun TestBox(modifier: Modifier = Modifier, body: @Composable() () -> Unit) {
         Layout(children = body, modifier = modifier) { measurables, constraints, _ ->
             require(measurables.size == 1) {
                 "TestBox received ${measurables.size} children; must have exactly 1"
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutSizeTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutSizeTest.kt
index 9d3ef14..0eae055 100644
--- a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutSizeTest.kt
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutSizeTest.kt
@@ -19,11 +19,14 @@
 import android.content.res.Resources
 import androidx.compose.Composable
 import androidx.test.filters.SmallTest
+import androidx.ui.core.Alignment
 import androidx.ui.core.Layout
 import androidx.ui.core.LayoutCoordinates
 import androidx.ui.core.Modifier
 import androidx.ui.core.Ref
 import androidx.ui.core.onPositioned
+import androidx.ui.core.setContent
+import androidx.ui.foundation.Box
 import androidx.ui.layout.Column
 import androidx.ui.layout.Row
 import androidx.ui.layout.Stack
@@ -37,6 +40,8 @@
 import androidx.ui.layout.preferredSizeIn
 import androidx.ui.layout.preferredWidth
 import androidx.ui.layout.preferredWidthIn
+import androidx.ui.layout.size
+import androidx.ui.layout.wrapContentSize
 import androidx.ui.unit.Dp
 import androidx.ui.unit.IntPx
 import androidx.ui.unit.IntPxSize
@@ -57,7 +62,7 @@
 class LayoutSizeTest : LayoutTest() {
 
     @Test
-    fun testSize_withWidthSizeModifiers() = with(density) {
+    fun testPreferredSize_withWidthSizeModifiers() = with(density) {
         val sizeDp = 50.dp
         val sizeIpx = sizeDp.toIntPx()
 
@@ -129,7 +134,7 @@
     }
 
     @Test
-    fun testSize_withHeightSizeModifiers() = with(density) {
+    fun testPreferredSize_withHeightSizeModifiers() = with(density) {
         val sizeDp = 10.dp
         val sizeIpx = sizeDp.toIntPx()
 
@@ -201,7 +206,7 @@
     }
 
     @Test
-    fun testSize_withSizeModifiers() = with(density) {
+    fun testPreferredSize_withSizeModifiers() = with(density) {
         val sizeDp = 50.dp
         val sizeIpx = sizeDp.toIntPx()
 
@@ -265,7 +270,7 @@
     }
 
     @Test
-    fun testSizeModifiers_respectMaxConstraint() = with(density) {
+    fun testPreferredSizeModifiers_respectMaxConstraint() = with(density) {
         val sizeDp = 100.dp
         val size = sizeDp.toIntPx()
 
@@ -368,6 +373,48 @@
     }
 
     @Test
+    fun testSize_smallerInLarger() = with(density) {
+        val sizeIpx = 64.ipx
+        val sizeDp = sizeIpx.toDp()
+
+        val positionedLatch = CountDownLatch(1)
+        val boxSize = Ref<IntPxSize>()
+        val boxPosition = Ref<PxPosition>()
+        show {
+            Box(Modifier.wrapContentSize(Alignment.TopStart)
+                .size(sizeDp * 2)
+                .size(sizeDp)
+                .saveLayoutInfo(boxSize, boxPosition, positionedLatch)
+            )
+        }
+        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+        assertEquals(IntPxSize(sizeIpx, sizeIpx), boxSize.value)
+        assertEquals(PxPosition(sizeIpx / 2, sizeIpx / 2), boxPosition.value)
+    }
+
+    @Test
+    fun testSize_largerInSmaller() = with(density) {
+        val sizeIpx = 64.ipx
+        val sizeDp = sizeIpx.toDp()
+
+        val positionedLatch = CountDownLatch(1)
+        val boxSize = Ref<IntPxSize>()
+        val boxPosition = Ref<PxPosition>()
+        show {
+            Box(Modifier.wrapContentSize(Alignment.TopStart)
+                .size(sizeDp)
+                .size(sizeDp * 2)
+                .saveLayoutInfo(boxSize, boxPosition, positionedLatch)
+            )
+        }
+        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+
+        assertEquals(IntPxSize(sizeIpx * 2, sizeIpx * 2), boxSize.value)
+        assertEquals(PxPosition(-sizeIpx / 2, -sizeIpx / 2), boxPosition.value)
+    }
+
+    @Test
     fun testMinWidthModifier_hasCorrectIntrinsicMeasurements() = with(density) {
         testIntrinsics(@Composable {
             Container(Modifier.preferredWidthIn(minWidth = 10.dp)) {
@@ -645,7 +692,7 @@
     }
 
     @Test
-    fun testSizeModifier_hasCorrectIntrinsicMeasurements() = with(density) {
+    fun testPreferredSizeModifier_hasCorrectIntrinsicMeasurements() = with(density) {
         testIntrinsics(@Composable {
             Container(Modifier.preferredSize(40.dp, 50.dp)) {
                 Container(Modifier.aspectRatio(1f)) { }
@@ -697,7 +744,7 @@
         verifyIntrinsicMeasurements(Modifier.fillMaxSize())
     }
 
-    private fun getSize(modifier: Modifier = Modifier.None): IntPxSize {
+    private fun getSize(modifier: Modifier = Modifier): IntPxSize {
         val width = 100.dp
         val height = 80.dp
 
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutTest.kt
index 438a34c..09357e3 100644
--- a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutTest.kt
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/LayoutTest.kt
@@ -205,7 +205,7 @@
     @Composable
     internal fun ConstrainedBox(
         constraints: DpConstraints,
-        modifier: Modifier = Modifier.None,
+        modifier: Modifier = Modifier,
         children: @Composable() () -> Unit
     ) {
         Layout(
@@ -356,7 +356,7 @@
 
     @Composable
     internal fun Container(
-        modifier: Modifier = Modifier.None,
+        modifier: Modifier = Modifier,
         padding: EdgeInsets = EdgeInsets(0.dp),
         alignment: Alignment = Alignment.Center,
         expanded: Boolean = false,
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/OnPositionedTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/OnPositionedTest.kt
index 8d55f59..94cf925 100644
--- a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/OnPositionedTest.kt
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/OnPositionedTest.kt
@@ -27,13 +27,13 @@
 import androidx.ui.core.VerticalAlignmentLine
 import androidx.ui.core.onChildPositioned
 import androidx.ui.core.onPositioned
+import androidx.ui.core.positionInParent
 import androidx.ui.core.positionInRoot
 import androidx.ui.core.setContent
 import androidx.ui.layout.Row
 import androidx.ui.layout.Stack
 import androidx.ui.layout.fillMaxSize
 import androidx.ui.layout.padding
-import androidx.ui.test.positionInParent
 import androidx.ui.unit.Px
 import androidx.ui.unit.PxPosition
 import androidx.ui.unit.dp
@@ -221,7 +221,7 @@
             val modifier = if (needCallback.value) {
                 Modifier.onPositioned { positionedLatch.countDown() }
             } else {
-                Modifier.None
+                Modifier
             }
             Container(modifier, expanded = true) { }
         }
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/RowColumnTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/RowColumnTest.kt
index 8a16a61..f809932 100644
--- a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/RowColumnTest.kt
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/RowColumnTest.kt
@@ -21,7 +21,7 @@
 import androidx.test.filters.SmallTest
 import androidx.ui.core.Alignment
 import androidx.ui.core.Constraints
-import androidx.ui.core.FirstBaseline
+import androidx.ui.text.FirstBaseline
 import androidx.ui.core.HorizontalAlignmentLine
 import androidx.ui.core.Layout
 import androidx.ui.core.LayoutCoordinates
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/StackTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/StackTest.kt
index b714509..8a19ed4 100644
--- a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/StackTest.kt
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/StackTest.kt
@@ -76,7 +76,7 @@
                     }
 
                     Container(
-                        Modifier.matchParent()
+                        Modifier.matchParentSize()
                             .padding(10.dp)
                             .saveLayoutInfo(
                                 positionedChildSize,
@@ -178,7 +178,7 @@
                     ) {
                     }
                     Container(
-                        Modifier.matchParent()
+                        Modifier.matchParentSize()
                             .padding(start = insetDp, top = insetDp)
                             .saveLayoutInfo(childSize[1], childPosition[1], positionedLatch),
                         width = halfSizeDp,
@@ -186,7 +186,7 @@
                     ) {
                     }
                     Container(
-                        Modifier.matchParent()
+                        Modifier.matchParentSize()
                             .padding(end = insetDp, bottom = insetDp)
                             .saveLayoutInfo(childSize[2], childPosition[2], positionedLatch),
                         width = halfSizeDp,
@@ -194,14 +194,14 @@
                     ) {
                     }
                     Container(
-                        Modifier.matchParent()
+                        Modifier.matchParentSize()
                             .padding(start = insetDp, end = insetDp)
                             .saveLayoutInfo(childSize[3], childPosition[3], positionedLatch),
                         width = halfSizeDp,
                         height = halfSizeDp) {
                     }
                     Container(
-                        Modifier.matchParent()
+                        Modifier.matchParentSize()
                             .padding(top = insetDp, bottom = insetDp)
                             .saveLayoutInfo(childSize[4], childPosition[4], positionedLatch),
                         width = halfSizeDp,
@@ -385,7 +385,7 @@
                 ) { }
                 ConstrainedBox(
                     DpConstraints.fixed(200.dp, 200.dp),
-                    Modifier.matchParent().padding(10.dp)
+                    Modifier.matchParentSize().padding(10.dp)
                 ) { }
             }
         }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
@@ -413,7 +413,7 @@
         testIntrinsics(@Composable {
             Stack {
                 ConstrainedBox(
-                    modifier = Modifier.matchParent().padding(10.dp),
+                    modifier = Modifier.matchParentSize().padding(10.dp),
                     constraints = DpConstraints.fixed(200.dp, 200.dp)
                 ) { }
             }
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/TestActivity.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/TestActivity.kt
index 63539c6..1c05782f 100644
--- a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/TestActivity.kt
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/TestActivity.kt
@@ -15,10 +15,10 @@
  */
 package androidx.ui.layout.test
 
-import android.app.Activity
+import androidx.activity.ComponentActivity
 import java.util.concurrent.CountDownLatch
 
-class TestActivity : Activity() {
+class TestActivity : ComponentActivity() {
     var hasFocusLatch = CountDownLatch(1)
 
     override fun onWindowFocusChanged(hasFocus: Boolean) {
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/TextLayoutDirectionModifierTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/TextLayoutDirectionModifierTest.kt
new file mode 100644
index 0000000..4a15fd6
--- /dev/null
+++ b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/TextLayoutDirectionModifierTest.kt
@@ -0,0 +1,83 @@
+/*
+ * 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.ui.layout.test
+
+import androidx.test.filters.SmallTest
+import androidx.ui.text.CoreText
+import androidx.ui.text.CoreTextField
+import androidx.ui.core.LayoutDirection
+import androidx.ui.core.Modifier
+import androidx.ui.input.EditorValue
+import androidx.ui.layout.rtl
+import androidx.ui.text.AnnotatedString
+import androidx.ui.text.TextStyle
+import androidx.ui.text.style.TextOverflow
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+
+@RunWith(JUnit4::class)
+@SmallTest
+class TextLayoutDirectionModifierTest : LayoutTest() {
+
+    @Test
+    fun test_CoreTextField_RtlModifier_changesDirectionTo_Rtl() {
+        val latch = CountDownLatch(1)
+        var layoutDirection: LayoutDirection? = null
+
+        show {
+            CoreTextField(
+                value = EditorValue("..."),
+                modifier = Modifier.rtl,
+                onValueChange = {}
+            ) { result ->
+                layoutDirection = result.layoutInput.layoutDirection
+                latch.countDown()
+            }
+        }
+
+        assertThat(latch.await(1, TimeUnit.SECONDS)).isTrue()
+        assertThat(layoutDirection).isNotNull()
+        assertThat(layoutDirection!!).isEqualTo(LayoutDirection.Rtl)
+    }
+
+    @Test
+    fun test_CoreText_RtlModifier_changesDirectionTo_Rtl() {
+        val latch = CountDownLatch(1)
+        var layoutDirection: LayoutDirection? = null
+        show {
+            CoreText(
+                text = AnnotatedString("..."),
+                modifier = Modifier.rtl,
+                style = TextStyle.Default,
+                softWrap = true,
+                overflow = TextOverflow.Clip,
+                maxLines = 1
+            ) { result ->
+                layoutDirection = result.layoutInput.layoutDirection
+                latch.countDown()
+            }
+        }
+
+        assertThat(latch.await(1, TimeUnit.SECONDS)).isTrue()
+        assertThat(layoutDirection).isNotNull()
+        assertThat(layoutDirection!!).isEqualTo(LayoutDirection.Rtl)
+    }
+}
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/AlignmentLine.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/AlignmentLine.kt
index 823c2c8..a1f76ed 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/AlignmentLine.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/AlignmentLine.kt
@@ -17,6 +17,7 @@
 package androidx.ui.layout
 
 import androidx.compose.Composable
+
 import androidx.ui.core.Alignment
 import androidx.ui.core.AlignmentLine
 import androidx.ui.core.HorizontalAlignmentLine
@@ -46,7 +47,7 @@
 @Composable
 fun AlignmentLineOffset(
     alignmentLine: AlignmentLine,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     before: Dp = 0.dp,
     after: Dp = 0.dp,
     children: @Composable() () -> Unit
@@ -98,7 +99,7 @@
 @Composable
 fun CenterAlignmentLine(
     alignmentLine: AlignmentLine,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() () -> Unit
 ) {
     Layout(children, modifier) { measurables, constraints, _ ->
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/Column.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/Column.kt
index b645166..1fd072d 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/Column.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/Column.kt
@@ -58,7 +58,7 @@
  */
 @Composable
 fun Column(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     arrangement: Arrangement.Vertical = Arrangement.Top,
     children: @Composable() ColumnScope.() -> Unit
 ) {
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/ConstraintLayout.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/ConstraintLayout.kt
index 544706e..9851f61 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/ConstraintLayout.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/ConstraintLayout.kt
@@ -38,7 +38,7 @@
 import androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure
 import androidx.compose.Immutable
 import androidx.ui.core.Constraints
-import androidx.ui.core.FirstBaseline
+import androidx.ui.text.FirstBaseline
 import androidx.ui.core.Measurable
 import androidx.ui.core.Modifier
 import androidx.ui.core.MultiMeasureLayout
@@ -60,7 +60,7 @@
 @Composable
 fun ConstraintLayout(
     constraintSet: ConstraintSet,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() () -> Unit
 ) {
     val measurer = remember { Measurer() }
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/Container.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/Container.kt
index b86d91a..a29e6ac 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/Container.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/Container.kt
@@ -64,7 +64,7 @@
 )
 @Composable
 fun Container(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     padding: EdgeInsets = EdgeInsets(0.dp),
     alignment: Alignment = Alignment.Center,
     expanded: Boolean = false,
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutPadding.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutPadding.kt
index 68af16e..bcdd42b 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutPadding.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutPadding.kt
@@ -159,8 +159,12 @@
         val height = (placeable.height + vertical)
             .coerceIn(constraints.minHeight, constraints.maxHeight)
         return layout(width, height) {
-            // Place will automatically mirror based on the incoming layout direction.
-            placeable.place(start.toIntPx(), top.toIntPx())
+            // TODO (b/153317665) use place() instead when bug is fixed
+            if (layoutDirection == LayoutDirection.Ltr) {
+                placeable.placeAbsolute(start.toIntPx(), top.toIntPx())
+            } else {
+                placeable.placeAbsolute(width - placeable.width - start.toIntPx(), top.toIntPx())
+            }
         }
     }
 }
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutSize.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutSize.kt
index c1350c1..36c7cab 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutSize.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutSize.kt
@@ -51,7 +51,7 @@
  * See [preferredWidthIn], [preferredHeightIn] or [preferredSizeIn] to set a preferred size range.
  *
  * Example usage:
- * @sample androidx.ui.layout.samples.SimpleWidthModifier
+ * @sample androidx.ui.layout.samples.SimplePreferredWidthModifier
  */
 fun Modifier.preferredWidth(width: Dp) = preferredSizeIn(minWidth = width, maxWidth = width)
 
@@ -63,7 +63,7 @@
  * See [preferredWidthIn], [preferredHeightIn] or [preferredSizeIn] to set a preferred size range.
  *
  * Example usage:
- * @sample androidx.ui.layout.samples.SimpleHeightModifier
+ * @sample androidx.ui.layout.samples.SimplePreferredHeightModifier
  */
 fun Modifier.preferredHeight(height: Dp) = preferredSizeIn(minHeight = height, maxHeight = height)
 
@@ -75,7 +75,7 @@
  * See [preferredWidthIn], [preferredHeightIn] or [preferredSizeIn] to set a preferred size range.
  *
  * Example usage:
- * @sample androidx.ui.layout.samples.SimpleSizeModifier
+ * @sample androidx.ui.layout.samples.SimplePreferredSizeModifier
  */
 fun Modifier.preferredSize(size: Dp) = preferredSizeIn(size, size, size, size)
 
@@ -88,7 +88,7 @@
  * See [preferredWidthIn], [preferredHeightIn] or [preferredSizeIn] to set a preferred size range.
  *
  * Example usage:
- * @sample androidx.ui.layout.samples.SimpleSizeModifier
+ * @sample androidx.ui.layout.samples.SimplePreferredSizeModifier
  */
 fun Modifier.preferredSize(width: Dp, height: Dp) = preferredSizeIn(
     minWidth = width,
@@ -148,6 +148,134 @@
 fun Modifier.preferredSizeIn(constraints: DpConstraints) = this + SizeModifier(constraints)
 
 /**
+ * Declare the width of the content to be exactly [width]dp. The incoming measurement
+ * [Constraints] will not override this value. If the content chooses a size that does not
+ * satisfy the incoming [Constraints], the parent layout will be reported a size coerced
+ * in the [Constraints], and the position of the content will be automatically offset to be
+ * centered on the space assigned to the child by the parent layout under the assumption that
+ * [Constraints] were respected.
+ *
+ * See [widthIn] and [sizeIn] to set a size range.
+ * See [preferredWidth] to set a preferred width, which is only respected when the incoming
+ * constraints allow it.
+ *
+ * Example usage:
+ * @sample androidx.ui.layout.samples.SimpleWidthModifier
+ */
+fun Modifier.width(width: Dp) = sizeIn(minWidth = width, maxWidth = width)
+
+/**
+ * Declare the height of the content to be exactly [height]dp. The incoming measurement
+ * [Constraints] will not override this value. If the content chooses a size that does not
+ * satisfy the incoming [Constraints], the parent layout will be reported a size coerced
+ * in the [Constraints], and the position of the content will be automatically offset to be
+ * centered on the space assigned to the child by the parent layout under the assumption that
+ * [Constraints] were respected.
+ *
+ * See [heightIn] and [sizeIn] to set a size range.
+ * See [preferredHeight] to set a preferred height, which is only respected when the incoming
+ * constraints allow it.
+ *
+ * Example usage:
+ * @sample androidx.ui.layout.samples.SimpleHeightModifier
+ */
+fun Modifier.height(height: Dp) = sizeIn(minHeight = height, maxHeight = height)
+
+/**
+ * Declare the size of the content to be exactly [size]dp width and height. The incoming measurement
+ * [Constraints] will not override this value. If the content chooses a size that does not
+ * satisfy the incoming [Constraints], the parent layout will be reported a size coerced
+ * in the [Constraints], and the position of the content will be automatically offset to be
+ * centered on the space assigned to the child by the parent layout under the assumption that
+ * [Constraints] were respected.
+ *
+ * See [sizeIn] to set a size range.
+ * See [preferredSize] to set a preferred size, which is only respected when the incoming
+ * constraints allow it.
+ *
+ * Example usage:
+ * @sample androidx.ui.layout.samples.SimpleSizeModifier
+ */
+fun Modifier.size(size: Dp) = sizeIn(size, size, size, size)
+
+/**
+ * Declare the size of the content to be exactly [width]dp and [height]dp. The incoming measurement
+ * [Constraints] will not override this value. If the content chooses a size that does not
+ * satisfy the incoming [Constraints], the parent layout will be reported a size coerced
+ * in the [Constraints], and the position of the content will be automatically offset to be
+ * centered on the space assigned to the child by the parent layout under the assumption that
+ * [Constraints] were respected.
+ *
+ * See [sizeIn] to set a size range.
+ * See [preferredSize] to set a preferred size, which is only respected when the incoming
+ * constraints allow it.
+ *
+ * Example usage:
+ * @sample androidx.ui.layout.samples.SimpleWidthModifier
+ */
+fun Modifier.size(width: Dp, height: Dp) = sizeIn(
+    minWidth = width,
+    maxWidth = width,
+    minHeight = height,
+    maxHeight = height
+)
+
+/**
+ * Constrain the width of the content to be between [minWidth]dp and [maxWidth]dp.
+ * If the content chooses a size that does not satisfy the incoming [Constraints], the
+ * parent layout will be reported a size coerced in the [Constraints], and the position
+ * of the content will be automatically offset to be centered on the space assigned to
+ * the child by the parent layout under the assumption that [Constraints] were respected.
+ */
+fun Modifier.widthIn(
+    minWidth: Dp = Dp.Unspecified,
+    maxWidth: Dp = Dp.Unspecified
+) = sizeIn(minWidth = minWidth, maxWidth = maxWidth)
+
+/**
+ * Constrain the height of the content to be between [minHeight]dp and [maxHeight]dp.
+ * If the content chooses a size that does not satisfy the incoming [Constraints], the
+ * parent layout will be reported a size coerced in the [Constraints], and the position
+ * of the content will be automatically offset to be centered on the space assigned to
+ * the child by the parent layout under the assumption that [Constraints] were respected.
+ */
+fun Modifier.heightIn(
+    minHeight: Dp = Dp.Unspecified,
+    maxHeight: Dp = Dp.Unspecified
+) = sizeIn(minHeight = minHeight, maxHeight = maxHeight)
+
+/**
+ * Constrain the width of the content to be between [minWidth]dp and [maxWidth]dp, and the
+ * height of the content to be between [minHeight]dp and [maxHeight]dp.
+ * If the content chooses a size that does not satisfy the incoming [Constraints], the
+ * parent layout will be reported a size coerced in the [Constraints], and the position
+ * of the content will be automatically offset to be centered on the space assigned to
+ * the child by the parent layout under the assumption that [Constraints] were respected.
+ */
+fun Modifier.sizeIn(
+    minWidth: Dp = Dp.Unspecified,
+    minHeight: Dp = Dp.Unspecified,
+    maxWidth: Dp = Dp.Unspecified,
+    maxHeight: Dp = Dp.Unspecified
+) = sizeIn(
+    DpConstraints(
+        minWidth = if (minWidth != Dp.Unspecified) minWidth else 0.dp,
+        minHeight = if (minHeight != Dp.Unspecified) minHeight else 0.dp,
+        maxWidth = if (maxWidth != Dp.Unspecified) maxWidth else Dp.Infinity,
+        maxHeight = if (maxHeight != Dp.Unspecified) maxHeight else Dp.Infinity
+    )
+)
+
+/**
+ * Constrain the size of the content to be within [constraints].
+ * If the content chooses a size that does not satisfy the incoming [Constraints], the
+ * parent layout will be reported a size coerced in the [Constraints], and the position
+ * of the content will be automatically offset to be centered on the space assigned to
+ * the child by the parent layout under the assumption that [Constraints] were respected.
+ */
+fun Modifier.sizeIn(constraints: DpConstraints) = this + SizeModifier(constraints, false)
+
+/**
  * Have the content fill the [Constraints.maxWidth] of the incoming measurement constraints
  * by setting the [minimum width][Constraints.minWidth] to be equal to the
  * [maximum width][Constraints.maxWidth]. If the incoming maximum width is [IntPx.Infinity] this
@@ -223,52 +351,50 @@
     BottomEnd -> LayoutAlign.BottomEnd
 }
 
-private data class SizeModifier(private val modifierConstraints: DpConstraints) : LayoutModifier {
+private data class SizeModifier(
+    private val targetConstraints: DpConstraints,
+    private val enforceIncoming: Boolean = true
+) : LayoutModifier {
     override fun Density.modifyConstraints(
         constraints: Constraints,
         layoutDirection: LayoutDirection
-    ) =
-        Constraints(modifierConstraints).enforce(constraints)
+    ) = Constraints(targetConstraints).let { if (enforceIncoming) it.enforce(constraints) else it }
 
     override fun Density.minIntrinsicWidthOf(
         measurable: Measurable,
         height: IntPx,
         layoutDirection: LayoutDirection
-    ): IntPx =
-        measurable.minIntrinsicWidth(height).let {
-            val constraints = Constraints(modifierConstraints)
-            it.coerceIn(constraints.minWidth, constraints.maxWidth)
-        }
+    ) = measurable.minIntrinsicWidth(height).let {
+        val constraints = Constraints(targetConstraints)
+        it.coerceIn(constraints.minWidth, constraints.maxWidth)
+    }
 
     override fun Density.maxIntrinsicWidthOf(
         measurable: Measurable,
         height: IntPx,
         layoutDirection: LayoutDirection
-    ): IntPx =
-        measurable.maxIntrinsicWidth(height).let {
-            val constraints = Constraints(modifierConstraints)
-            it.coerceIn(constraints.minWidth, constraints.maxWidth)
-        }
+    ) = measurable.maxIntrinsicWidth(height).let {
+        val constraints = Constraints(targetConstraints)
+        it.coerceIn(constraints.minWidth, constraints.maxWidth)
+    }
 
     override fun Density.minIntrinsicHeightOf(
         measurable: Measurable,
         width: IntPx,
         layoutDirection: LayoutDirection
-    ): IntPx =
-        measurable.minIntrinsicHeight(width).let {
-            val constraints = Constraints(modifierConstraints)
-            it.coerceIn(constraints.minHeight, constraints.maxHeight)
-        }
+    ) = measurable.minIntrinsicHeight(width).let {
+        val constraints = Constraints(targetConstraints)
+        it.coerceIn(constraints.minHeight, constraints.maxHeight)
+    }
 
     override fun Density.maxIntrinsicHeightOf(
         measurable: Measurable,
         width: IntPx,
         layoutDirection: LayoutDirection
-    ): IntPx =
-        measurable.maxIntrinsicHeight(width).let {
-            val constraints = Constraints(modifierConstraints)
-            it.coerceIn(constraints.minHeight, constraints.maxHeight)
-        }
+    ) = measurable.maxIntrinsicHeight(width).let {
+        val constraints = Constraints(targetConstraints)
+        it.coerceIn(constraints.minHeight, constraints.maxHeight)
+    }
 }
 
 /**
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/Row.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/Row.kt
index 65ad5be..e7732eb 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/Row.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/Row.kt
@@ -58,7 +58,7 @@
  */
 @Composable
 fun Row(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     arrangement: Arrangement.Horizontal = Arrangement.Start,
     children: @Composable() RowScope.() -> Unit
 ) {
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/RowColumnImpl.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/RowColumnImpl.kt
index 5d4f65f..2960fd2 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/RowColumnImpl.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/RowColumnImpl.kt
@@ -45,7 +45,7 @@
 @Composable
 internal fun RowColumnImpl(
     orientation: LayoutOrientation,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     arrangement: Arrangement,
     crossAxisSize: SizeMode,
     crossAxisAlignment: CrossAxisAlignment,
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/Stack.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/Stack.kt
index e4d545c..d859168 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/Stack.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/Stack.kt
@@ -43,7 +43,7 @@
  */
 @Composable
 fun Stack(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() StackScope.() -> Unit
 ) {
     val stackChildren: @Composable() () -> Unit = { StackScope().children() }
@@ -280,6 +280,18 @@
      * Size the element to match the size of the [Stack] after all other content elements have
      * been measured.
      */
+    fun Modifier.matchParentSize() = this + StretchGravityModifier
+
+    /**
+     * Size the element to match the size of the [Stack] after all other content elements have
+     * been measured.
+     *
+     * @deprecated renamed to [matchParentSize].
+     */
+    @Deprecated(
+        "Renamed to matchParentSize for descriptive clarity",
+        replaceWith = ReplaceWith("this.matchParentSize()")
+    )
     fun Modifier.matchParent() = this + StretchGravityModifier
 
     internal companion object {
diff --git a/ui/ui-material/api/0.1.0-dev09.txt b/ui/ui-material/api/0.1.0-dev09.txt
index 1d4baa0..7422fe8 100644
--- a/ui/ui-material/api/0.1.0-dev09.txt
+++ b/ui/ui-material/api/0.1.0-dev09.txt
@@ -12,9 +12,9 @@
   }
 
   public final class AppBarKt {
-    method public static void BottomAppBar(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.material.BottomAppBar.FabConfiguration? fabConfiguration = null, androidx.ui.graphics.Shape? cutoutShape = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
-    method public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> actions = {}, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation);
-    method public static void TopAppBar(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
+    method public static void BottomAppBar(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.material.BottomAppBar.FabConfiguration? fabConfiguration = null, androidx.ui.graphics.Shape? cutoutShape = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
+    method public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> actions = {}, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation);
+    method public static void TopAppBar(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
   }
 
   public final class BottomAppBar {
@@ -32,8 +32,8 @@
   }
 
   public final class BottomNavigationKt {
-    method public static void BottomNavigation(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.BottomNavigationKt.BottomNavigationElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
-    method public static void BottomNavigationItem(kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier.None, boolean alwaysShowLabels = true, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
+    method public static void BottomNavigation(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.BottomNavigationKt.BottomNavigationElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
+    method public static void BottomNavigationItem(kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, boolean alwaysShowLabels = true, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
   }
 
   public final class Button {
@@ -43,18 +43,18 @@
   }
 
   public final class ButtonKt {
-    method public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, androidx.ui.unit.Dp elevation = 2.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
-    method public static inline void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = Border(1.dp, MaterialTheme.colors.onSurface.copy(OutlinedStrokeOpacity)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
-    method public static inline void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = TextButton.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 2.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method public static inline void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = Border(1.dp, MaterialTheme.colors.onSurface.copy(OutlinedStrokeOpacity)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method public static inline void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = TextButton.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
   }
 
   public final class CardKt {
-    method public static void Card(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = medium, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 1.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static void Card(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = medium, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 1.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
   public final class CheckboxKt {
-    method public static void Checkbox(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
-    method public static void TriStateCheckbox(androidx.ui.foundation.selection.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
+    method public static void Checkbox(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
+    method public static void TriStateCheckbox(androidx.ui.foundation.selection.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
   }
 
   public final class ColorKt {
@@ -93,55 +93,13 @@
     property public abstract androidx.ui.graphics.Color surface;
   }
 
-  public final class DataTableChildren {
-    method public void dataRow(boolean selected = false, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectedChange = null, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> content);
-    method public void dataRow(kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.String> text, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.graphics.ImageAsset> icon = { null }, boolean selected = false, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectedChange = null);
-    method public void headerRow(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectAll = null, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> content);
-    method public void headerRow(kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.String> text, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.graphics.ImageAsset> icon = { null }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectAll = null);
-  }
-
-  public final class DataTableKt {
-    method public static void DataTable(int columns, kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Boolean> numeric = { false }, androidx.ui.unit.Dp dataRowHeight = androidx.ui.material.DataTableKt.DataRowHeight, androidx.ui.unit.Dp headerRowHeight = androidx.ui.material.DataTableKt.HeaderRowHeight, androidx.ui.layout.EdgeInsets cellSpacing = androidx.ui.material.DataTableKt.CellSpacing, androidx.ui.foundation.Border border = Border(BorderColor, BorderWidth), androidx.ui.graphics.Color selectedColor = MaterialTheme.colors.primary.copy(0.08), androidx.ui.material.DataTablePagination? pagination = null, androidx.ui.material.DataTableSorting? sorting = null, kotlin.jvm.functions.Function1<? super androidx.ui.material.DataTableChildren,kotlin.Unit> block);
-    method public static androidx.ui.material.DataTablePagination DefaultDataTablePagination(int initialPage = 0, int initialRowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage);
-    method public static androidx.ui.material.DataTableSorting DefaultDataTableSorting(Integer? initialColumn = null, boolean initialAscending = true, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortRequest);
-  }
-
-  public final class DataTablePagination {
-    ctor public DataTablePagination(int page, int rowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onPageChange, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onRowsPerPageChange);
-    method public int component1();
-    method public int component2();
-    method public java.util.List<java.lang.Integer> component3();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> component4();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> component5();
-    method public androidx.ui.material.DataTablePagination copy(int page, int rowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onPageChange, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onRowsPerPageChange);
-    method public java.util.List<java.lang.Integer> getAvailableRowsPerPage();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> getOnPageChange();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> getOnRowsPerPageChange();
-    method public int getPage();
-    method public int getRowsPerPage();
-  }
-
-  public final class DataTableSorting {
-    ctor public DataTableSorting(Integer? column, boolean ascending, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortChange);
-    method public Integer? component1();
-    method public boolean component2();
-    method public java.util.Set<java.lang.Integer> component3();
-    method public kotlin.jvm.functions.Function2<java.lang.Integer,java.lang.Boolean,kotlin.Unit> component4();
-    method public androidx.ui.material.DataTableSorting copy(Integer? column, boolean ascending, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortChange);
-    method public boolean getAscending();
-    method public Integer? getColumn();
-    method public kotlin.jvm.functions.Function2<java.lang.Integer,java.lang.Boolean,kotlin.Unit> getOnSortChange();
-    method public java.util.Set<java.lang.Integer> getSortableColumns();
-  }
-
   public final class DividerKt {
-    method public static void Divider(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.unit.Dp thickness = 1.dp, androidx.ui.unit.Dp startIndent = 0.dp);
+    method public static void Divider(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.unit.Dp thickness = 1.dp, androidx.ui.unit.Dp startIndent = 0.dp);
   }
 
   public final class DrawerKt {
     method public static void BottomDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
     method public static void ModalDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
-    method public static void StaticDrawer(kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent);
   }
 
   public enum DrawerState {
@@ -168,18 +126,23 @@
   }
 
   public final class FloatingActionButtonKt {
-    method public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp);
-    method public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
+    method public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp);
+    method public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
   }
 
   public final class IconButtonKt {
-    method public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
-    method public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
+    method public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
+    method public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
   }
 
   public final class ListItemKt {
-    method public static void ListItem(String text, androidx.ui.graphics.ImageAsset? icon = null, String? secondaryText = null, boolean singleLineSecondaryText = true, String? overlineText = null, String? metaText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null);
-    method public static void ListItem(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? secondaryText = null, boolean singleLineSecondaryText = true, kotlin.jvm.functions.Function0<kotlin.Unit>? overlineText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailing = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null);
+    method public static void ListItem(String text, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, androidx.ui.graphics.ImageAsset? icon = null, String? secondaryText = null, boolean singleLineSecondaryText = true, String? overlineText = null, String? metaText = null);
+    method public static void ListItem(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? secondaryText = null, boolean singleLineSecondaryText = true, kotlin.jvm.functions.Function0<kotlin.Unit>? overlineText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailing = null, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+  }
+
+  public final class MaterialTextFieldKt {
+    method public static void FilledTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> placeholder = emptyContent(), kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, androidx.ui.graphics.Color activeColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color inactiveColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method public static void FilledTextField(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> placeholder = emptyContent(), kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, androidx.ui.graphics.Color activeColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color inactiveColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
   }
 
   public final class MaterialTheme {
@@ -197,10 +160,10 @@
   }
 
   public final class ProgressIndicatorKt {
-    method public static void CircularProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static void CircularProgressIndicator(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static void LinearProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static void LinearProgressIndicator(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void CircularProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void CircularProgressIndicator(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void LinearProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void LinearProgressIndicator(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
   }
 
   public final class RadioButtonKt {
@@ -256,25 +219,16 @@
   }
 
   public final class SliderKt {
-    method public static void Slider(androidx.ui.material.SliderPosition position, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange = { position.value = it }, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> onValueChangeEnd = {}, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static androidx.ui.material.SliderPosition SliderPosition(float initial = 0f, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange = 0.0 .. 1.0, @IntRange(from=0) int steps = 0);
-  }
-
-  public final class SliderPosition {
-    ctor public SliderPosition(float initial, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, @IntRange(from=null) int steps, androidx.animation.AnimationClockObservable animatedClock);
-    method public float getValue();
-    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getValueRange();
-    method public void setValue(float value);
-    property public final float value;
+    method public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange = 0.0 .. 1.0, @IntRange(from=0) int steps = 0, kotlin.jvm.functions.Function0<kotlin.Unit> onValueChangeEnd = {}, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
   }
 
   public final class SnackbarKt {
-    method public static void Snackbar(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? action = null, androidx.ui.core.Modifier modifier = Modifier.None, boolean actionOnNewLine = false, androidx.ui.graphics.Shape shape = small, androidx.ui.unit.Dp elevation = 6.dp);
+    method public static void Snackbar(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? action = null, androidx.ui.core.Modifier modifier = Modifier, boolean actionOnNewLine = false, androidx.ui.graphics.Shape shape = small, androidx.ui.unit.Dp elevation = 6.dp);
     method public static androidx.ui.graphics.Color snackbarPrimaryColorFor(androidx.ui.material.ColorPalette colors);
   }
 
   public final class SurfaceKt {
-    method public static void Surface(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static void Surface(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method public static androidx.ui.graphics.Color getPrimarySurface(androidx.ui.material.ColorPalette);
   }
 
@@ -283,15 +237,15 @@
   }
 
   public final class TabKt {
-    method public static void Tab(kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), kotlin.jvm.functions.Function0<kotlin.Unit> icon = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
-    method public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method public static <T> void TabRow(java.util.List<? extends T> items, int selectedIndex, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), boolean scrollable = false, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.material.TabRow.TabPosition>,kotlin.Unit> indicatorContainer = { tabPositions -> TabRow.IndicatorContainer(tabPositions, selectedIndex, { 
+    method public static void Tab(kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), kotlin.jvm.functions.Function0<kotlin.Unit> icon = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
+    method public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static <T> void TabRow(java.util.List<? extends T> items, int selectedIndex, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), boolean scrollable = false, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.material.TabRow.TabPosition>,kotlin.Unit> indicatorContainer = { tabPositions -> TabRow.IndicatorContainer(tabPositions, selectedIndex, { 
     TabRow.Indicator()
 }) }, kotlin.jvm.functions.Function0<kotlin.Unit> divider = { Divider(1.dp, contentColor().copy(DividerOpacity)) }, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> tab);
   }
 
   public final class TabRow {
-    method public void Indicator(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = contentColor());
+    method public void Indicator(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = contentColor());
     method public void IndicatorContainer(java.util.List<androidx.ui.material.TabRow.TabPosition> tabPositions, int selectedIndex, kotlin.jvm.functions.Function0<kotlin.Unit> indicator);
     field public static final androidx.ui.material.TabRow! INSTANCE;
   }
@@ -313,8 +267,7 @@
   }
 
   public final class Typography {
-    ctor public Typography(androidx.ui.text.TextStyle h1, androidx.ui.text.TextStyle h2, androidx.ui.text.TextStyle h3, androidx.ui.text.TextStyle h4, androidx.ui.text.TextStyle h5, androidx.ui.text.TextStyle h6, androidx.ui.text.TextStyle subtitle1, androidx.ui.text.TextStyle subtitle2, androidx.ui.text.TextStyle body1, androidx.ui.text.TextStyle body2, androidx.ui.text.TextStyle button, androidx.ui.text.TextStyle caption, androidx.ui.text.TextStyle overline);
-    ctor public Typography();
+    ctor public Typography(androidx.ui.text.font.FontFamily defaultFontFamily, androidx.ui.text.TextStyle h1, androidx.ui.text.TextStyle h2, androidx.ui.text.TextStyle h3, androidx.ui.text.TextStyle h4, androidx.ui.text.TextStyle h5, androidx.ui.text.TextStyle h6, androidx.ui.text.TextStyle subtitle1, androidx.ui.text.TextStyle subtitle2, androidx.ui.text.TextStyle body1, androidx.ui.text.TextStyle body2, androidx.ui.text.TextStyle button, androidx.ui.text.TextStyle caption, androidx.ui.text.TextStyle overline);
     method public androidx.ui.text.TextStyle component1();
     method public androidx.ui.text.TextStyle component10();
     method public androidx.ui.text.TextStyle component11();
diff --git a/ui/ui-material/api/current.txt b/ui/ui-material/api/current.txt
index 1d4baa0..7422fe8 100644
--- a/ui/ui-material/api/current.txt
+++ b/ui/ui-material/api/current.txt
@@ -12,9 +12,9 @@
   }
 
   public final class AppBarKt {
-    method public static void BottomAppBar(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.material.BottomAppBar.FabConfiguration? fabConfiguration = null, androidx.ui.graphics.Shape? cutoutShape = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
-    method public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> actions = {}, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation);
-    method public static void TopAppBar(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
+    method public static void BottomAppBar(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.material.BottomAppBar.FabConfiguration? fabConfiguration = null, androidx.ui.graphics.Shape? cutoutShape = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
+    method public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> actions = {}, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation);
+    method public static void TopAppBar(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
   }
 
   public final class BottomAppBar {
@@ -32,8 +32,8 @@
   }
 
   public final class BottomNavigationKt {
-    method public static void BottomNavigation(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.BottomNavigationKt.BottomNavigationElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
-    method public static void BottomNavigationItem(kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier.None, boolean alwaysShowLabels = true, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
+    method public static void BottomNavigation(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.BottomNavigationKt.BottomNavigationElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
+    method public static void BottomNavigationItem(kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, boolean alwaysShowLabels = true, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
   }
 
   public final class Button {
@@ -43,18 +43,18 @@
   }
 
   public final class ButtonKt {
-    method public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, androidx.ui.unit.Dp elevation = 2.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
-    method public static inline void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = Border(1.dp, MaterialTheme.colors.onSurface.copy(OutlinedStrokeOpacity)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
-    method public static inline void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = TextButton.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 2.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method public static inline void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = Border(1.dp, MaterialTheme.colors.onSurface.copy(OutlinedStrokeOpacity)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method public static inline void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = TextButton.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
   }
 
   public final class CardKt {
-    method public static void Card(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = medium, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 1.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static void Card(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = medium, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 1.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
   public final class CheckboxKt {
-    method public static void Checkbox(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
-    method public static void TriStateCheckbox(androidx.ui.foundation.selection.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
+    method public static void Checkbox(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
+    method public static void TriStateCheckbox(androidx.ui.foundation.selection.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
   }
 
   public final class ColorKt {
@@ -93,55 +93,13 @@
     property public abstract androidx.ui.graphics.Color surface;
   }
 
-  public final class DataTableChildren {
-    method public void dataRow(boolean selected = false, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectedChange = null, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> content);
-    method public void dataRow(kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.String> text, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.graphics.ImageAsset> icon = { null }, boolean selected = false, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectedChange = null);
-    method public void headerRow(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectAll = null, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> content);
-    method public void headerRow(kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.String> text, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.graphics.ImageAsset> icon = { null }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectAll = null);
-  }
-
-  public final class DataTableKt {
-    method public static void DataTable(int columns, kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Boolean> numeric = { false }, androidx.ui.unit.Dp dataRowHeight = androidx.ui.material.DataTableKt.DataRowHeight, androidx.ui.unit.Dp headerRowHeight = androidx.ui.material.DataTableKt.HeaderRowHeight, androidx.ui.layout.EdgeInsets cellSpacing = androidx.ui.material.DataTableKt.CellSpacing, androidx.ui.foundation.Border border = Border(BorderColor, BorderWidth), androidx.ui.graphics.Color selectedColor = MaterialTheme.colors.primary.copy(0.08), androidx.ui.material.DataTablePagination? pagination = null, androidx.ui.material.DataTableSorting? sorting = null, kotlin.jvm.functions.Function1<? super androidx.ui.material.DataTableChildren,kotlin.Unit> block);
-    method public static androidx.ui.material.DataTablePagination DefaultDataTablePagination(int initialPage = 0, int initialRowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage);
-    method public static androidx.ui.material.DataTableSorting DefaultDataTableSorting(Integer? initialColumn = null, boolean initialAscending = true, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortRequest);
-  }
-
-  public final class DataTablePagination {
-    ctor public DataTablePagination(int page, int rowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onPageChange, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onRowsPerPageChange);
-    method public int component1();
-    method public int component2();
-    method public java.util.List<java.lang.Integer> component3();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> component4();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> component5();
-    method public androidx.ui.material.DataTablePagination copy(int page, int rowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onPageChange, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onRowsPerPageChange);
-    method public java.util.List<java.lang.Integer> getAvailableRowsPerPage();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> getOnPageChange();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> getOnRowsPerPageChange();
-    method public int getPage();
-    method public int getRowsPerPage();
-  }
-
-  public final class DataTableSorting {
-    ctor public DataTableSorting(Integer? column, boolean ascending, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortChange);
-    method public Integer? component1();
-    method public boolean component2();
-    method public java.util.Set<java.lang.Integer> component3();
-    method public kotlin.jvm.functions.Function2<java.lang.Integer,java.lang.Boolean,kotlin.Unit> component4();
-    method public androidx.ui.material.DataTableSorting copy(Integer? column, boolean ascending, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortChange);
-    method public boolean getAscending();
-    method public Integer? getColumn();
-    method public kotlin.jvm.functions.Function2<java.lang.Integer,java.lang.Boolean,kotlin.Unit> getOnSortChange();
-    method public java.util.Set<java.lang.Integer> getSortableColumns();
-  }
-
   public final class DividerKt {
-    method public static void Divider(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.unit.Dp thickness = 1.dp, androidx.ui.unit.Dp startIndent = 0.dp);
+    method public static void Divider(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.unit.Dp thickness = 1.dp, androidx.ui.unit.Dp startIndent = 0.dp);
   }
 
   public final class DrawerKt {
     method public static void BottomDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
     method public static void ModalDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
-    method public static void StaticDrawer(kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent);
   }
 
   public enum DrawerState {
@@ -168,18 +126,23 @@
   }
 
   public final class FloatingActionButtonKt {
-    method public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp);
-    method public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
+    method public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp);
+    method public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
   }
 
   public final class IconButtonKt {
-    method public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
-    method public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
+    method public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
+    method public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
   }
 
   public final class ListItemKt {
-    method public static void ListItem(String text, androidx.ui.graphics.ImageAsset? icon = null, String? secondaryText = null, boolean singleLineSecondaryText = true, String? overlineText = null, String? metaText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null);
-    method public static void ListItem(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? secondaryText = null, boolean singleLineSecondaryText = true, kotlin.jvm.functions.Function0<kotlin.Unit>? overlineText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailing = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null);
+    method public static void ListItem(String text, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, androidx.ui.graphics.ImageAsset? icon = null, String? secondaryText = null, boolean singleLineSecondaryText = true, String? overlineText = null, String? metaText = null);
+    method public static void ListItem(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? secondaryText = null, boolean singleLineSecondaryText = true, kotlin.jvm.functions.Function0<kotlin.Unit>? overlineText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailing = null, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+  }
+
+  public final class MaterialTextFieldKt {
+    method public static void FilledTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> placeholder = emptyContent(), kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, androidx.ui.graphics.Color activeColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color inactiveColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method public static void FilledTextField(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> placeholder = emptyContent(), kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, androidx.ui.graphics.Color activeColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color inactiveColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
   }
 
   public final class MaterialTheme {
@@ -197,10 +160,10 @@
   }
 
   public final class ProgressIndicatorKt {
-    method public static void CircularProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static void CircularProgressIndicator(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static void LinearProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static void LinearProgressIndicator(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void CircularProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void CircularProgressIndicator(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void LinearProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void LinearProgressIndicator(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
   }
 
   public final class RadioButtonKt {
@@ -256,25 +219,16 @@
   }
 
   public final class SliderKt {
-    method public static void Slider(androidx.ui.material.SliderPosition position, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange = { position.value = it }, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> onValueChangeEnd = {}, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static androidx.ui.material.SliderPosition SliderPosition(float initial = 0f, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange = 0.0 .. 1.0, @IntRange(from=0) int steps = 0);
-  }
-
-  public final class SliderPosition {
-    ctor public SliderPosition(float initial, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, @IntRange(from=null) int steps, androidx.animation.AnimationClockObservable animatedClock);
-    method public float getValue();
-    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getValueRange();
-    method public void setValue(float value);
-    property public final float value;
+    method public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange = 0.0 .. 1.0, @IntRange(from=0) int steps = 0, kotlin.jvm.functions.Function0<kotlin.Unit> onValueChangeEnd = {}, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
   }
 
   public final class SnackbarKt {
-    method public static void Snackbar(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? action = null, androidx.ui.core.Modifier modifier = Modifier.None, boolean actionOnNewLine = false, androidx.ui.graphics.Shape shape = small, androidx.ui.unit.Dp elevation = 6.dp);
+    method public static void Snackbar(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? action = null, androidx.ui.core.Modifier modifier = Modifier, boolean actionOnNewLine = false, androidx.ui.graphics.Shape shape = small, androidx.ui.unit.Dp elevation = 6.dp);
     method public static androidx.ui.graphics.Color snackbarPrimaryColorFor(androidx.ui.material.ColorPalette colors);
   }
 
   public final class SurfaceKt {
-    method public static void Surface(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static void Surface(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method public static androidx.ui.graphics.Color getPrimarySurface(androidx.ui.material.ColorPalette);
   }
 
@@ -283,15 +237,15 @@
   }
 
   public final class TabKt {
-    method public static void Tab(kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), kotlin.jvm.functions.Function0<kotlin.Unit> icon = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
-    method public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method public static <T> void TabRow(java.util.List<? extends T> items, int selectedIndex, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), boolean scrollable = false, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.material.TabRow.TabPosition>,kotlin.Unit> indicatorContainer = { tabPositions -> TabRow.IndicatorContainer(tabPositions, selectedIndex, { 
+    method public static void Tab(kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), kotlin.jvm.functions.Function0<kotlin.Unit> icon = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
+    method public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static <T> void TabRow(java.util.List<? extends T> items, int selectedIndex, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), boolean scrollable = false, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.material.TabRow.TabPosition>,kotlin.Unit> indicatorContainer = { tabPositions -> TabRow.IndicatorContainer(tabPositions, selectedIndex, { 
     TabRow.Indicator()
 }) }, kotlin.jvm.functions.Function0<kotlin.Unit> divider = { Divider(1.dp, contentColor().copy(DividerOpacity)) }, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> tab);
   }
 
   public final class TabRow {
-    method public void Indicator(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = contentColor());
+    method public void Indicator(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = contentColor());
     method public void IndicatorContainer(java.util.List<androidx.ui.material.TabRow.TabPosition> tabPositions, int selectedIndex, kotlin.jvm.functions.Function0<kotlin.Unit> indicator);
     field public static final androidx.ui.material.TabRow! INSTANCE;
   }
@@ -313,8 +267,7 @@
   }
 
   public final class Typography {
-    ctor public Typography(androidx.ui.text.TextStyle h1, androidx.ui.text.TextStyle h2, androidx.ui.text.TextStyle h3, androidx.ui.text.TextStyle h4, androidx.ui.text.TextStyle h5, androidx.ui.text.TextStyle h6, androidx.ui.text.TextStyle subtitle1, androidx.ui.text.TextStyle subtitle2, androidx.ui.text.TextStyle body1, androidx.ui.text.TextStyle body2, androidx.ui.text.TextStyle button, androidx.ui.text.TextStyle caption, androidx.ui.text.TextStyle overline);
-    ctor public Typography();
+    ctor public Typography(androidx.ui.text.font.FontFamily defaultFontFamily, androidx.ui.text.TextStyle h1, androidx.ui.text.TextStyle h2, androidx.ui.text.TextStyle h3, androidx.ui.text.TextStyle h4, androidx.ui.text.TextStyle h5, androidx.ui.text.TextStyle h6, androidx.ui.text.TextStyle subtitle1, androidx.ui.text.TextStyle subtitle2, androidx.ui.text.TextStyle body1, androidx.ui.text.TextStyle body2, androidx.ui.text.TextStyle button, androidx.ui.text.TextStyle caption, androidx.ui.text.TextStyle overline);
     method public androidx.ui.text.TextStyle component1();
     method public androidx.ui.text.TextStyle component10();
     method public androidx.ui.text.TextStyle component11();
diff --git a/ui/ui-material/api/public_plus_experimental_0.1.0-dev09.txt b/ui/ui-material/api/public_plus_experimental_0.1.0-dev09.txt
index 1d4baa0..7422fe8 100644
--- a/ui/ui-material/api/public_plus_experimental_0.1.0-dev09.txt
+++ b/ui/ui-material/api/public_plus_experimental_0.1.0-dev09.txt
@@ -12,9 +12,9 @@
   }
 
   public final class AppBarKt {
-    method public static void BottomAppBar(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.material.BottomAppBar.FabConfiguration? fabConfiguration = null, androidx.ui.graphics.Shape? cutoutShape = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
-    method public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> actions = {}, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation);
-    method public static void TopAppBar(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
+    method public static void BottomAppBar(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.material.BottomAppBar.FabConfiguration? fabConfiguration = null, androidx.ui.graphics.Shape? cutoutShape = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
+    method public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> actions = {}, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation);
+    method public static void TopAppBar(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
   }
 
   public final class BottomAppBar {
@@ -32,8 +32,8 @@
   }
 
   public final class BottomNavigationKt {
-    method public static void BottomNavigation(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.BottomNavigationKt.BottomNavigationElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
-    method public static void BottomNavigationItem(kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier.None, boolean alwaysShowLabels = true, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
+    method public static void BottomNavigation(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.BottomNavigationKt.BottomNavigationElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
+    method public static void BottomNavigationItem(kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, boolean alwaysShowLabels = true, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
   }
 
   public final class Button {
@@ -43,18 +43,18 @@
   }
 
   public final class ButtonKt {
-    method public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, androidx.ui.unit.Dp elevation = 2.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
-    method public static inline void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = Border(1.dp, MaterialTheme.colors.onSurface.copy(OutlinedStrokeOpacity)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
-    method public static inline void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = TextButton.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 2.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method public static inline void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = Border(1.dp, MaterialTheme.colors.onSurface.copy(OutlinedStrokeOpacity)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method public static inline void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = TextButton.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
   }
 
   public final class CardKt {
-    method public static void Card(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = medium, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 1.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static void Card(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = medium, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 1.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
   public final class CheckboxKt {
-    method public static void Checkbox(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
-    method public static void TriStateCheckbox(androidx.ui.foundation.selection.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
+    method public static void Checkbox(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
+    method public static void TriStateCheckbox(androidx.ui.foundation.selection.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
   }
 
   public final class ColorKt {
@@ -93,55 +93,13 @@
     property public abstract androidx.ui.graphics.Color surface;
   }
 
-  public final class DataTableChildren {
-    method public void dataRow(boolean selected = false, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectedChange = null, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> content);
-    method public void dataRow(kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.String> text, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.graphics.ImageAsset> icon = { null }, boolean selected = false, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectedChange = null);
-    method public void headerRow(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectAll = null, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> content);
-    method public void headerRow(kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.String> text, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.graphics.ImageAsset> icon = { null }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectAll = null);
-  }
-
-  public final class DataTableKt {
-    method public static void DataTable(int columns, kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Boolean> numeric = { false }, androidx.ui.unit.Dp dataRowHeight = androidx.ui.material.DataTableKt.DataRowHeight, androidx.ui.unit.Dp headerRowHeight = androidx.ui.material.DataTableKt.HeaderRowHeight, androidx.ui.layout.EdgeInsets cellSpacing = androidx.ui.material.DataTableKt.CellSpacing, androidx.ui.foundation.Border border = Border(BorderColor, BorderWidth), androidx.ui.graphics.Color selectedColor = MaterialTheme.colors.primary.copy(0.08), androidx.ui.material.DataTablePagination? pagination = null, androidx.ui.material.DataTableSorting? sorting = null, kotlin.jvm.functions.Function1<? super androidx.ui.material.DataTableChildren,kotlin.Unit> block);
-    method public static androidx.ui.material.DataTablePagination DefaultDataTablePagination(int initialPage = 0, int initialRowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage);
-    method public static androidx.ui.material.DataTableSorting DefaultDataTableSorting(Integer? initialColumn = null, boolean initialAscending = true, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortRequest);
-  }
-
-  public final class DataTablePagination {
-    ctor public DataTablePagination(int page, int rowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onPageChange, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onRowsPerPageChange);
-    method public int component1();
-    method public int component2();
-    method public java.util.List<java.lang.Integer> component3();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> component4();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> component5();
-    method public androidx.ui.material.DataTablePagination copy(int page, int rowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onPageChange, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onRowsPerPageChange);
-    method public java.util.List<java.lang.Integer> getAvailableRowsPerPage();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> getOnPageChange();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> getOnRowsPerPageChange();
-    method public int getPage();
-    method public int getRowsPerPage();
-  }
-
-  public final class DataTableSorting {
-    ctor public DataTableSorting(Integer? column, boolean ascending, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortChange);
-    method public Integer? component1();
-    method public boolean component2();
-    method public java.util.Set<java.lang.Integer> component3();
-    method public kotlin.jvm.functions.Function2<java.lang.Integer,java.lang.Boolean,kotlin.Unit> component4();
-    method public androidx.ui.material.DataTableSorting copy(Integer? column, boolean ascending, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortChange);
-    method public boolean getAscending();
-    method public Integer? getColumn();
-    method public kotlin.jvm.functions.Function2<java.lang.Integer,java.lang.Boolean,kotlin.Unit> getOnSortChange();
-    method public java.util.Set<java.lang.Integer> getSortableColumns();
-  }
-
   public final class DividerKt {
-    method public static void Divider(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.unit.Dp thickness = 1.dp, androidx.ui.unit.Dp startIndent = 0.dp);
+    method public static void Divider(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.unit.Dp thickness = 1.dp, androidx.ui.unit.Dp startIndent = 0.dp);
   }
 
   public final class DrawerKt {
     method public static void BottomDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
     method public static void ModalDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
-    method public static void StaticDrawer(kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent);
   }
 
   public enum DrawerState {
@@ -168,18 +126,23 @@
   }
 
   public final class FloatingActionButtonKt {
-    method public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp);
-    method public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
+    method public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp);
+    method public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
   }
 
   public final class IconButtonKt {
-    method public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
-    method public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
+    method public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
+    method public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
   }
 
   public final class ListItemKt {
-    method public static void ListItem(String text, androidx.ui.graphics.ImageAsset? icon = null, String? secondaryText = null, boolean singleLineSecondaryText = true, String? overlineText = null, String? metaText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null);
-    method public static void ListItem(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? secondaryText = null, boolean singleLineSecondaryText = true, kotlin.jvm.functions.Function0<kotlin.Unit>? overlineText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailing = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null);
+    method public static void ListItem(String text, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, androidx.ui.graphics.ImageAsset? icon = null, String? secondaryText = null, boolean singleLineSecondaryText = true, String? overlineText = null, String? metaText = null);
+    method public static void ListItem(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? secondaryText = null, boolean singleLineSecondaryText = true, kotlin.jvm.functions.Function0<kotlin.Unit>? overlineText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailing = null, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+  }
+
+  public final class MaterialTextFieldKt {
+    method public static void FilledTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> placeholder = emptyContent(), kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, androidx.ui.graphics.Color activeColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color inactiveColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method public static void FilledTextField(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> placeholder = emptyContent(), kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, androidx.ui.graphics.Color activeColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color inactiveColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
   }
 
   public final class MaterialTheme {
@@ -197,10 +160,10 @@
   }
 
   public final class ProgressIndicatorKt {
-    method public static void CircularProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static void CircularProgressIndicator(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static void LinearProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static void LinearProgressIndicator(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void CircularProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void CircularProgressIndicator(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void LinearProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void LinearProgressIndicator(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
   }
 
   public final class RadioButtonKt {
@@ -256,25 +219,16 @@
   }
 
   public final class SliderKt {
-    method public static void Slider(androidx.ui.material.SliderPosition position, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange = { position.value = it }, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> onValueChangeEnd = {}, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static androidx.ui.material.SliderPosition SliderPosition(float initial = 0f, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange = 0.0 .. 1.0, @IntRange(from=0) int steps = 0);
-  }
-
-  public final class SliderPosition {
-    ctor public SliderPosition(float initial, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, @IntRange(from=null) int steps, androidx.animation.AnimationClockObservable animatedClock);
-    method public float getValue();
-    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getValueRange();
-    method public void setValue(float value);
-    property public final float value;
+    method public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange = 0.0 .. 1.0, @IntRange(from=0) int steps = 0, kotlin.jvm.functions.Function0<kotlin.Unit> onValueChangeEnd = {}, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
   }
 
   public final class SnackbarKt {
-    method public static void Snackbar(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? action = null, androidx.ui.core.Modifier modifier = Modifier.None, boolean actionOnNewLine = false, androidx.ui.graphics.Shape shape = small, androidx.ui.unit.Dp elevation = 6.dp);
+    method public static void Snackbar(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? action = null, androidx.ui.core.Modifier modifier = Modifier, boolean actionOnNewLine = false, androidx.ui.graphics.Shape shape = small, androidx.ui.unit.Dp elevation = 6.dp);
     method public static androidx.ui.graphics.Color snackbarPrimaryColorFor(androidx.ui.material.ColorPalette colors);
   }
 
   public final class SurfaceKt {
-    method public static void Surface(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static void Surface(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method public static androidx.ui.graphics.Color getPrimarySurface(androidx.ui.material.ColorPalette);
   }
 
@@ -283,15 +237,15 @@
   }
 
   public final class TabKt {
-    method public static void Tab(kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), kotlin.jvm.functions.Function0<kotlin.Unit> icon = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
-    method public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method public static <T> void TabRow(java.util.List<? extends T> items, int selectedIndex, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), boolean scrollable = false, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.material.TabRow.TabPosition>,kotlin.Unit> indicatorContainer = { tabPositions -> TabRow.IndicatorContainer(tabPositions, selectedIndex, { 
+    method public static void Tab(kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), kotlin.jvm.functions.Function0<kotlin.Unit> icon = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
+    method public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static <T> void TabRow(java.util.List<? extends T> items, int selectedIndex, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), boolean scrollable = false, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.material.TabRow.TabPosition>,kotlin.Unit> indicatorContainer = { tabPositions -> TabRow.IndicatorContainer(tabPositions, selectedIndex, { 
     TabRow.Indicator()
 }) }, kotlin.jvm.functions.Function0<kotlin.Unit> divider = { Divider(1.dp, contentColor().copy(DividerOpacity)) }, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> tab);
   }
 
   public final class TabRow {
-    method public void Indicator(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = contentColor());
+    method public void Indicator(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = contentColor());
     method public void IndicatorContainer(java.util.List<androidx.ui.material.TabRow.TabPosition> tabPositions, int selectedIndex, kotlin.jvm.functions.Function0<kotlin.Unit> indicator);
     field public static final androidx.ui.material.TabRow! INSTANCE;
   }
@@ -313,8 +267,7 @@
   }
 
   public final class Typography {
-    ctor public Typography(androidx.ui.text.TextStyle h1, androidx.ui.text.TextStyle h2, androidx.ui.text.TextStyle h3, androidx.ui.text.TextStyle h4, androidx.ui.text.TextStyle h5, androidx.ui.text.TextStyle h6, androidx.ui.text.TextStyle subtitle1, androidx.ui.text.TextStyle subtitle2, androidx.ui.text.TextStyle body1, androidx.ui.text.TextStyle body2, androidx.ui.text.TextStyle button, androidx.ui.text.TextStyle caption, androidx.ui.text.TextStyle overline);
-    ctor public Typography();
+    ctor public Typography(androidx.ui.text.font.FontFamily defaultFontFamily, androidx.ui.text.TextStyle h1, androidx.ui.text.TextStyle h2, androidx.ui.text.TextStyle h3, androidx.ui.text.TextStyle h4, androidx.ui.text.TextStyle h5, androidx.ui.text.TextStyle h6, androidx.ui.text.TextStyle subtitle1, androidx.ui.text.TextStyle subtitle2, androidx.ui.text.TextStyle body1, androidx.ui.text.TextStyle body2, androidx.ui.text.TextStyle button, androidx.ui.text.TextStyle caption, androidx.ui.text.TextStyle overline);
     method public androidx.ui.text.TextStyle component1();
     method public androidx.ui.text.TextStyle component10();
     method public androidx.ui.text.TextStyle component11();
diff --git a/ui/ui-material/api/public_plus_experimental_current.txt b/ui/ui-material/api/public_plus_experimental_current.txt
index 1d4baa0..7422fe8 100644
--- a/ui/ui-material/api/public_plus_experimental_current.txt
+++ b/ui/ui-material/api/public_plus_experimental_current.txt
@@ -12,9 +12,9 @@
   }
 
   public final class AppBarKt {
-    method public static void BottomAppBar(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.material.BottomAppBar.FabConfiguration? fabConfiguration = null, androidx.ui.graphics.Shape? cutoutShape = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
-    method public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> actions = {}, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation);
-    method public static void TopAppBar(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
+    method public static void BottomAppBar(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.material.BottomAppBar.FabConfiguration? fabConfiguration = null, androidx.ui.graphics.Shape? cutoutShape = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
+    method public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> actions = {}, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation);
+    method public static void TopAppBar(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
   }
 
   public final class BottomAppBar {
@@ -32,8 +32,8 @@
   }
 
   public final class BottomNavigationKt {
-    method public static void BottomNavigation(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.BottomNavigationKt.BottomNavigationElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
-    method public static void BottomNavigationItem(kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier.None, boolean alwaysShowLabels = true, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
+    method public static void BottomNavigation(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.BottomNavigationKt.BottomNavigationElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
+    method public static void BottomNavigationItem(kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, boolean alwaysShowLabels = true, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
   }
 
   public final class Button {
@@ -43,18 +43,18 @@
   }
 
   public final class ButtonKt {
-    method public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, androidx.ui.unit.Dp elevation = 2.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
-    method public static inline void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = Border(1.dp, MaterialTheme.colors.onSurface.copy(OutlinedStrokeOpacity)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
-    method public static inline void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = TextButton.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 2.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method public static inline void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = Border(1.dp, MaterialTheme.colors.onSurface.copy(OutlinedStrokeOpacity)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method public static inline void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = TextButton.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
   }
 
   public final class CardKt {
-    method public static void Card(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = medium, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 1.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static void Card(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = medium, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 1.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
   public final class CheckboxKt {
-    method public static void Checkbox(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
-    method public static void TriStateCheckbox(androidx.ui.foundation.selection.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
+    method public static void Checkbox(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
+    method public static void TriStateCheckbox(androidx.ui.foundation.selection.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
   }
 
   public final class ColorKt {
@@ -93,55 +93,13 @@
     property public abstract androidx.ui.graphics.Color surface;
   }
 
-  public final class DataTableChildren {
-    method public void dataRow(boolean selected = false, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectedChange = null, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> content);
-    method public void dataRow(kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.String> text, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.graphics.ImageAsset> icon = { null }, boolean selected = false, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectedChange = null);
-    method public void headerRow(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectAll = null, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> content);
-    method public void headerRow(kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.String> text, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.graphics.ImageAsset> icon = { null }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectAll = null);
-  }
-
-  public final class DataTableKt {
-    method public static void DataTable(int columns, kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Boolean> numeric = { false }, androidx.ui.unit.Dp dataRowHeight = androidx.ui.material.DataTableKt.DataRowHeight, androidx.ui.unit.Dp headerRowHeight = androidx.ui.material.DataTableKt.HeaderRowHeight, androidx.ui.layout.EdgeInsets cellSpacing = androidx.ui.material.DataTableKt.CellSpacing, androidx.ui.foundation.Border border = Border(BorderColor, BorderWidth), androidx.ui.graphics.Color selectedColor = MaterialTheme.colors.primary.copy(0.08), androidx.ui.material.DataTablePagination? pagination = null, androidx.ui.material.DataTableSorting? sorting = null, kotlin.jvm.functions.Function1<? super androidx.ui.material.DataTableChildren,kotlin.Unit> block);
-    method public static androidx.ui.material.DataTablePagination DefaultDataTablePagination(int initialPage = 0, int initialRowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage);
-    method public static androidx.ui.material.DataTableSorting DefaultDataTableSorting(Integer? initialColumn = null, boolean initialAscending = true, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortRequest);
-  }
-
-  public final class DataTablePagination {
-    ctor public DataTablePagination(int page, int rowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onPageChange, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onRowsPerPageChange);
-    method public int component1();
-    method public int component2();
-    method public java.util.List<java.lang.Integer> component3();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> component4();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> component5();
-    method public androidx.ui.material.DataTablePagination copy(int page, int rowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onPageChange, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onRowsPerPageChange);
-    method public java.util.List<java.lang.Integer> getAvailableRowsPerPage();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> getOnPageChange();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> getOnRowsPerPageChange();
-    method public int getPage();
-    method public int getRowsPerPage();
-  }
-
-  public final class DataTableSorting {
-    ctor public DataTableSorting(Integer? column, boolean ascending, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortChange);
-    method public Integer? component1();
-    method public boolean component2();
-    method public java.util.Set<java.lang.Integer> component3();
-    method public kotlin.jvm.functions.Function2<java.lang.Integer,java.lang.Boolean,kotlin.Unit> component4();
-    method public androidx.ui.material.DataTableSorting copy(Integer? column, boolean ascending, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortChange);
-    method public boolean getAscending();
-    method public Integer? getColumn();
-    method public kotlin.jvm.functions.Function2<java.lang.Integer,java.lang.Boolean,kotlin.Unit> getOnSortChange();
-    method public java.util.Set<java.lang.Integer> getSortableColumns();
-  }
-
   public final class DividerKt {
-    method public static void Divider(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.unit.Dp thickness = 1.dp, androidx.ui.unit.Dp startIndent = 0.dp);
+    method public static void Divider(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.unit.Dp thickness = 1.dp, androidx.ui.unit.Dp startIndent = 0.dp);
   }
 
   public final class DrawerKt {
     method public static void BottomDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
     method public static void ModalDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
-    method public static void StaticDrawer(kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent);
   }
 
   public enum DrawerState {
@@ -168,18 +126,23 @@
   }
 
   public final class FloatingActionButtonKt {
-    method public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp);
-    method public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
+    method public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp);
+    method public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
   }
 
   public final class IconButtonKt {
-    method public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
-    method public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
+    method public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
+    method public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
   }
 
   public final class ListItemKt {
-    method public static void ListItem(String text, androidx.ui.graphics.ImageAsset? icon = null, String? secondaryText = null, boolean singleLineSecondaryText = true, String? overlineText = null, String? metaText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null);
-    method public static void ListItem(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? secondaryText = null, boolean singleLineSecondaryText = true, kotlin.jvm.functions.Function0<kotlin.Unit>? overlineText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailing = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null);
+    method public static void ListItem(String text, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, androidx.ui.graphics.ImageAsset? icon = null, String? secondaryText = null, boolean singleLineSecondaryText = true, String? overlineText = null, String? metaText = null);
+    method public static void ListItem(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? secondaryText = null, boolean singleLineSecondaryText = true, kotlin.jvm.functions.Function0<kotlin.Unit>? overlineText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailing = null, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+  }
+
+  public final class MaterialTextFieldKt {
+    method public static void FilledTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> placeholder = emptyContent(), kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, androidx.ui.graphics.Color activeColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color inactiveColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method public static void FilledTextField(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> placeholder = emptyContent(), kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, androidx.ui.graphics.Color activeColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color inactiveColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
   }
 
   public final class MaterialTheme {
@@ -197,10 +160,10 @@
   }
 
   public final class ProgressIndicatorKt {
-    method public static void CircularProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static void CircularProgressIndicator(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static void LinearProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static void LinearProgressIndicator(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void CircularProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void CircularProgressIndicator(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void LinearProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void LinearProgressIndicator(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
   }
 
   public final class RadioButtonKt {
@@ -256,25 +219,16 @@
   }
 
   public final class SliderKt {
-    method public static void Slider(androidx.ui.material.SliderPosition position, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange = { position.value = it }, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> onValueChangeEnd = {}, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static androidx.ui.material.SliderPosition SliderPosition(float initial = 0f, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange = 0.0 .. 1.0, @IntRange(from=0) int steps = 0);
-  }
-
-  public final class SliderPosition {
-    ctor public SliderPosition(float initial, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, @IntRange(from=null) int steps, androidx.animation.AnimationClockObservable animatedClock);
-    method public float getValue();
-    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getValueRange();
-    method public void setValue(float value);
-    property public final float value;
+    method public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange = 0.0 .. 1.0, @IntRange(from=0) int steps = 0, kotlin.jvm.functions.Function0<kotlin.Unit> onValueChangeEnd = {}, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
   }
 
   public final class SnackbarKt {
-    method public static void Snackbar(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? action = null, androidx.ui.core.Modifier modifier = Modifier.None, boolean actionOnNewLine = false, androidx.ui.graphics.Shape shape = small, androidx.ui.unit.Dp elevation = 6.dp);
+    method public static void Snackbar(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? action = null, androidx.ui.core.Modifier modifier = Modifier, boolean actionOnNewLine = false, androidx.ui.graphics.Shape shape = small, androidx.ui.unit.Dp elevation = 6.dp);
     method public static androidx.ui.graphics.Color snackbarPrimaryColorFor(androidx.ui.material.ColorPalette colors);
   }
 
   public final class SurfaceKt {
-    method public static void Surface(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static void Surface(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method public static androidx.ui.graphics.Color getPrimarySurface(androidx.ui.material.ColorPalette);
   }
 
@@ -283,15 +237,15 @@
   }
 
   public final class TabKt {
-    method public static void Tab(kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), kotlin.jvm.functions.Function0<kotlin.Unit> icon = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
-    method public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method public static <T> void TabRow(java.util.List<? extends T> items, int selectedIndex, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), boolean scrollable = false, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.material.TabRow.TabPosition>,kotlin.Unit> indicatorContainer = { tabPositions -> TabRow.IndicatorContainer(tabPositions, selectedIndex, { 
+    method public static void Tab(kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), kotlin.jvm.functions.Function0<kotlin.Unit> icon = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
+    method public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static <T> void TabRow(java.util.List<? extends T> items, int selectedIndex, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), boolean scrollable = false, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.material.TabRow.TabPosition>,kotlin.Unit> indicatorContainer = { tabPositions -> TabRow.IndicatorContainer(tabPositions, selectedIndex, { 
     TabRow.Indicator()
 }) }, kotlin.jvm.functions.Function0<kotlin.Unit> divider = { Divider(1.dp, contentColor().copy(DividerOpacity)) }, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> tab);
   }
 
   public final class TabRow {
-    method public void Indicator(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = contentColor());
+    method public void Indicator(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = contentColor());
     method public void IndicatorContainer(java.util.List<androidx.ui.material.TabRow.TabPosition> tabPositions, int selectedIndex, kotlin.jvm.functions.Function0<kotlin.Unit> indicator);
     field public static final androidx.ui.material.TabRow! INSTANCE;
   }
@@ -313,8 +267,7 @@
   }
 
   public final class Typography {
-    ctor public Typography(androidx.ui.text.TextStyle h1, androidx.ui.text.TextStyle h2, androidx.ui.text.TextStyle h3, androidx.ui.text.TextStyle h4, androidx.ui.text.TextStyle h5, androidx.ui.text.TextStyle h6, androidx.ui.text.TextStyle subtitle1, androidx.ui.text.TextStyle subtitle2, androidx.ui.text.TextStyle body1, androidx.ui.text.TextStyle body2, androidx.ui.text.TextStyle button, androidx.ui.text.TextStyle caption, androidx.ui.text.TextStyle overline);
-    ctor public Typography();
+    ctor public Typography(androidx.ui.text.font.FontFamily defaultFontFamily, androidx.ui.text.TextStyle h1, androidx.ui.text.TextStyle h2, androidx.ui.text.TextStyle h3, androidx.ui.text.TextStyle h4, androidx.ui.text.TextStyle h5, androidx.ui.text.TextStyle h6, androidx.ui.text.TextStyle subtitle1, androidx.ui.text.TextStyle subtitle2, androidx.ui.text.TextStyle body1, androidx.ui.text.TextStyle body2, androidx.ui.text.TextStyle button, androidx.ui.text.TextStyle caption, androidx.ui.text.TextStyle overline);
     method public androidx.ui.text.TextStyle component1();
     method public androidx.ui.text.TextStyle component10();
     method public androidx.ui.text.TextStyle component11();
diff --git a/ui/ui-material/api/restricted_0.1.0-dev09.txt b/ui/ui-material/api/restricted_0.1.0-dev09.txt
index 1d4baa0..7422fe8 100644
--- a/ui/ui-material/api/restricted_0.1.0-dev09.txt
+++ b/ui/ui-material/api/restricted_0.1.0-dev09.txt
@@ -12,9 +12,9 @@
   }
 
   public final class AppBarKt {
-    method public static void BottomAppBar(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.material.BottomAppBar.FabConfiguration? fabConfiguration = null, androidx.ui.graphics.Shape? cutoutShape = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
-    method public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> actions = {}, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation);
-    method public static void TopAppBar(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
+    method public static void BottomAppBar(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.material.BottomAppBar.FabConfiguration? fabConfiguration = null, androidx.ui.graphics.Shape? cutoutShape = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
+    method public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> actions = {}, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation);
+    method public static void TopAppBar(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
   }
 
   public final class BottomAppBar {
@@ -32,8 +32,8 @@
   }
 
   public final class BottomNavigationKt {
-    method public static void BottomNavigation(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.BottomNavigationKt.BottomNavigationElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
-    method public static void BottomNavigationItem(kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier.None, boolean alwaysShowLabels = true, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
+    method public static void BottomNavigation(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.BottomNavigationKt.BottomNavigationElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
+    method public static void BottomNavigationItem(kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, boolean alwaysShowLabels = true, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
   }
 
   public final class Button {
@@ -43,18 +43,18 @@
   }
 
   public final class ButtonKt {
-    method public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, androidx.ui.unit.Dp elevation = 2.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
-    method public static inline void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = Border(1.dp, MaterialTheme.colors.onSurface.copy(OutlinedStrokeOpacity)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
-    method public static inline void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = TextButton.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 2.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method public static inline void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = Border(1.dp, MaterialTheme.colors.onSurface.copy(OutlinedStrokeOpacity)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method public static inline void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = TextButton.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
   }
 
   public final class CardKt {
-    method public static void Card(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = medium, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 1.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static void Card(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = medium, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 1.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
   public final class CheckboxKt {
-    method public static void Checkbox(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
-    method public static void TriStateCheckbox(androidx.ui.foundation.selection.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
+    method public static void Checkbox(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
+    method public static void TriStateCheckbox(androidx.ui.foundation.selection.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
   }
 
   public final class ColorKt {
@@ -93,55 +93,13 @@
     property public abstract androidx.ui.graphics.Color surface;
   }
 
-  public final class DataTableChildren {
-    method public void dataRow(boolean selected = false, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectedChange = null, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> content);
-    method public void dataRow(kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.String> text, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.graphics.ImageAsset> icon = { null }, boolean selected = false, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectedChange = null);
-    method public void headerRow(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectAll = null, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> content);
-    method public void headerRow(kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.String> text, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.graphics.ImageAsset> icon = { null }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectAll = null);
-  }
-
-  public final class DataTableKt {
-    method public static void DataTable(int columns, kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Boolean> numeric = { false }, androidx.ui.unit.Dp dataRowHeight = androidx.ui.material.DataTableKt.DataRowHeight, androidx.ui.unit.Dp headerRowHeight = androidx.ui.material.DataTableKt.HeaderRowHeight, androidx.ui.layout.EdgeInsets cellSpacing = androidx.ui.material.DataTableKt.CellSpacing, androidx.ui.foundation.Border border = Border(BorderColor, BorderWidth), androidx.ui.graphics.Color selectedColor = MaterialTheme.colors.primary.copy(0.08), androidx.ui.material.DataTablePagination? pagination = null, androidx.ui.material.DataTableSorting? sorting = null, kotlin.jvm.functions.Function1<? super androidx.ui.material.DataTableChildren,kotlin.Unit> block);
-    method public static androidx.ui.material.DataTablePagination DefaultDataTablePagination(int initialPage = 0, int initialRowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage);
-    method public static androidx.ui.material.DataTableSorting DefaultDataTableSorting(Integer? initialColumn = null, boolean initialAscending = true, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortRequest);
-  }
-
-  public final class DataTablePagination {
-    ctor public DataTablePagination(int page, int rowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onPageChange, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onRowsPerPageChange);
-    method public int component1();
-    method public int component2();
-    method public java.util.List<java.lang.Integer> component3();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> component4();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> component5();
-    method public androidx.ui.material.DataTablePagination copy(int page, int rowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onPageChange, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onRowsPerPageChange);
-    method public java.util.List<java.lang.Integer> getAvailableRowsPerPage();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> getOnPageChange();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> getOnRowsPerPageChange();
-    method public int getPage();
-    method public int getRowsPerPage();
-  }
-
-  public final class DataTableSorting {
-    ctor public DataTableSorting(Integer? column, boolean ascending, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortChange);
-    method public Integer? component1();
-    method public boolean component2();
-    method public java.util.Set<java.lang.Integer> component3();
-    method public kotlin.jvm.functions.Function2<java.lang.Integer,java.lang.Boolean,kotlin.Unit> component4();
-    method public androidx.ui.material.DataTableSorting copy(Integer? column, boolean ascending, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortChange);
-    method public boolean getAscending();
-    method public Integer? getColumn();
-    method public kotlin.jvm.functions.Function2<java.lang.Integer,java.lang.Boolean,kotlin.Unit> getOnSortChange();
-    method public java.util.Set<java.lang.Integer> getSortableColumns();
-  }
-
   public final class DividerKt {
-    method public static void Divider(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.unit.Dp thickness = 1.dp, androidx.ui.unit.Dp startIndent = 0.dp);
+    method public static void Divider(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.unit.Dp thickness = 1.dp, androidx.ui.unit.Dp startIndent = 0.dp);
   }
 
   public final class DrawerKt {
     method public static void BottomDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
     method public static void ModalDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
-    method public static void StaticDrawer(kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent);
   }
 
   public enum DrawerState {
@@ -168,18 +126,23 @@
   }
 
   public final class FloatingActionButtonKt {
-    method public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp);
-    method public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
+    method public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp);
+    method public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
   }
 
   public final class IconButtonKt {
-    method public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
-    method public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
+    method public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
+    method public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
   }
 
   public final class ListItemKt {
-    method public static void ListItem(String text, androidx.ui.graphics.ImageAsset? icon = null, String? secondaryText = null, boolean singleLineSecondaryText = true, String? overlineText = null, String? metaText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null);
-    method public static void ListItem(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? secondaryText = null, boolean singleLineSecondaryText = true, kotlin.jvm.functions.Function0<kotlin.Unit>? overlineText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailing = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null);
+    method public static void ListItem(String text, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, androidx.ui.graphics.ImageAsset? icon = null, String? secondaryText = null, boolean singleLineSecondaryText = true, String? overlineText = null, String? metaText = null);
+    method public static void ListItem(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? secondaryText = null, boolean singleLineSecondaryText = true, kotlin.jvm.functions.Function0<kotlin.Unit>? overlineText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailing = null, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+  }
+
+  public final class MaterialTextFieldKt {
+    method public static void FilledTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> placeholder = emptyContent(), kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, androidx.ui.graphics.Color activeColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color inactiveColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method public static void FilledTextField(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> placeholder = emptyContent(), kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, androidx.ui.graphics.Color activeColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color inactiveColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
   }
 
   public final class MaterialTheme {
@@ -197,10 +160,10 @@
   }
 
   public final class ProgressIndicatorKt {
-    method public static void CircularProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static void CircularProgressIndicator(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static void LinearProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static void LinearProgressIndicator(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void CircularProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void CircularProgressIndicator(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void LinearProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void LinearProgressIndicator(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
   }
 
   public final class RadioButtonKt {
@@ -256,25 +219,16 @@
   }
 
   public final class SliderKt {
-    method public static void Slider(androidx.ui.material.SliderPosition position, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange = { position.value = it }, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> onValueChangeEnd = {}, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static androidx.ui.material.SliderPosition SliderPosition(float initial = 0f, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange = 0.0 .. 1.0, @IntRange(from=0) int steps = 0);
-  }
-
-  public final class SliderPosition {
-    ctor public SliderPosition(float initial, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, @IntRange(from=null) int steps, androidx.animation.AnimationClockObservable animatedClock);
-    method public float getValue();
-    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getValueRange();
-    method public void setValue(float value);
-    property public final float value;
+    method public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange = 0.0 .. 1.0, @IntRange(from=0) int steps = 0, kotlin.jvm.functions.Function0<kotlin.Unit> onValueChangeEnd = {}, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
   }
 
   public final class SnackbarKt {
-    method public static void Snackbar(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? action = null, androidx.ui.core.Modifier modifier = Modifier.None, boolean actionOnNewLine = false, androidx.ui.graphics.Shape shape = small, androidx.ui.unit.Dp elevation = 6.dp);
+    method public static void Snackbar(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? action = null, androidx.ui.core.Modifier modifier = Modifier, boolean actionOnNewLine = false, androidx.ui.graphics.Shape shape = small, androidx.ui.unit.Dp elevation = 6.dp);
     method public static androidx.ui.graphics.Color snackbarPrimaryColorFor(androidx.ui.material.ColorPalette colors);
   }
 
   public final class SurfaceKt {
-    method public static void Surface(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static void Surface(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method public static androidx.ui.graphics.Color getPrimarySurface(androidx.ui.material.ColorPalette);
   }
 
@@ -283,15 +237,15 @@
   }
 
   public final class TabKt {
-    method public static void Tab(kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), kotlin.jvm.functions.Function0<kotlin.Unit> icon = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
-    method public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method public static <T> void TabRow(java.util.List<? extends T> items, int selectedIndex, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), boolean scrollable = false, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.material.TabRow.TabPosition>,kotlin.Unit> indicatorContainer = { tabPositions -> TabRow.IndicatorContainer(tabPositions, selectedIndex, { 
+    method public static void Tab(kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), kotlin.jvm.functions.Function0<kotlin.Unit> icon = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
+    method public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static <T> void TabRow(java.util.List<? extends T> items, int selectedIndex, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), boolean scrollable = false, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.material.TabRow.TabPosition>,kotlin.Unit> indicatorContainer = { tabPositions -> TabRow.IndicatorContainer(tabPositions, selectedIndex, { 
     TabRow.Indicator()
 }) }, kotlin.jvm.functions.Function0<kotlin.Unit> divider = { Divider(1.dp, contentColor().copy(DividerOpacity)) }, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> tab);
   }
 
   public final class TabRow {
-    method public void Indicator(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = contentColor());
+    method public void Indicator(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = contentColor());
     method public void IndicatorContainer(java.util.List<androidx.ui.material.TabRow.TabPosition> tabPositions, int selectedIndex, kotlin.jvm.functions.Function0<kotlin.Unit> indicator);
     field public static final androidx.ui.material.TabRow! INSTANCE;
   }
@@ -313,8 +267,7 @@
   }
 
   public final class Typography {
-    ctor public Typography(androidx.ui.text.TextStyle h1, androidx.ui.text.TextStyle h2, androidx.ui.text.TextStyle h3, androidx.ui.text.TextStyle h4, androidx.ui.text.TextStyle h5, androidx.ui.text.TextStyle h6, androidx.ui.text.TextStyle subtitle1, androidx.ui.text.TextStyle subtitle2, androidx.ui.text.TextStyle body1, androidx.ui.text.TextStyle body2, androidx.ui.text.TextStyle button, androidx.ui.text.TextStyle caption, androidx.ui.text.TextStyle overline);
-    ctor public Typography();
+    ctor public Typography(androidx.ui.text.font.FontFamily defaultFontFamily, androidx.ui.text.TextStyle h1, androidx.ui.text.TextStyle h2, androidx.ui.text.TextStyle h3, androidx.ui.text.TextStyle h4, androidx.ui.text.TextStyle h5, androidx.ui.text.TextStyle h6, androidx.ui.text.TextStyle subtitle1, androidx.ui.text.TextStyle subtitle2, androidx.ui.text.TextStyle body1, androidx.ui.text.TextStyle body2, androidx.ui.text.TextStyle button, androidx.ui.text.TextStyle caption, androidx.ui.text.TextStyle overline);
     method public androidx.ui.text.TextStyle component1();
     method public androidx.ui.text.TextStyle component10();
     method public androidx.ui.text.TextStyle component11();
diff --git a/ui/ui-material/api/restricted_current.txt b/ui/ui-material/api/restricted_current.txt
index 1d4baa0..7422fe8 100644
--- a/ui/ui-material/api/restricted_current.txt
+++ b/ui/ui-material/api/restricted_current.txt
@@ -12,9 +12,9 @@
   }
 
   public final class AppBarKt {
-    method public static void BottomAppBar(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.material.BottomAppBar.FabConfiguration? fabConfiguration = null, androidx.ui.graphics.Shape? cutoutShape = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
-    method public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> actions = {}, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation);
-    method public static void TopAppBar(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
+    method public static void BottomAppBar(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.material.BottomAppBar.FabConfiguration? fabConfiguration = null, androidx.ui.graphics.Shape? cutoutShape = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
+    method public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = null, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> actions = {}, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation);
+    method public static void TopAppBar(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.AppBarKt.TopAppBarElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
   }
 
   public final class BottomAppBar {
@@ -32,8 +32,8 @@
   }
 
   public final class BottomNavigationKt {
-    method public static void BottomNavigation(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.BottomNavigationKt.BottomNavigationElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
-    method public static void BottomNavigationItem(kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier.None, boolean alwaysShowLabels = true, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
+    method public static void BottomNavigation(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = androidx.ui.material.BottomNavigationKt.BottomNavigationElevation, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> content);
+    method public static void BottomNavigationItem(kotlin.jvm.functions.Function0<kotlin.Unit> icon, kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, boolean alwaysShowLabels = true, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
   }
 
   public final class Button {
@@ -43,18 +43,18 @@
   }
 
   public final class ButtonKt {
-    method public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, androidx.ui.unit.Dp elevation = 2.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
-    method public static inline void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = Border(1.dp, MaterialTheme.colors.onSurface.copy(OutlinedStrokeOpacity)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
-    method public static inline void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = TextButton.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 2.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method public static inline void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = Border(1.dp, MaterialTheme.colors.onSurface.copy(OutlinedStrokeOpacity)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = Button.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method public static inline void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, androidx.ui.unit.Dp elevation = 0.dp, androidx.ui.graphics.Shape shape = small, androidx.ui.foundation.Border? border = null, androidx.ui.graphics.Color backgroundColor = Color.Transparent, androidx.ui.graphics.Color contentColor = MaterialTheme.colors.primary, androidx.ui.layout.EdgeInsets innerPadding = TextButton.DefaultInnerPadding, kotlin.jvm.functions.Function0<kotlin.Unit> text);
   }
 
   public final class CardKt {
-    method public static void Card(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = medium, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 1.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static void Card(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = medium, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 1.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
   public final class CheckboxKt {
-    method public static void Checkbox(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
-    method public static void TriStateCheckbox(androidx.ui.foundation.selection.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
+    method public static void Checkbox(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
+    method public static void TriStateCheckbox(androidx.ui.foundation.selection.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.secondary);
   }
 
   public final class ColorKt {
@@ -93,55 +93,13 @@
     property public abstract androidx.ui.graphics.Color surface;
   }
 
-  public final class DataTableChildren {
-    method public void dataRow(boolean selected = false, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectedChange = null, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> content);
-    method public void dataRow(kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.String> text, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.graphics.ImageAsset> icon = { null }, boolean selected = false, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectedChange = null);
-    method public void headerRow(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectAll = null, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> content);
-    method public void headerRow(kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.String> text, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.graphics.ImageAsset> icon = { null }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onSelectAll = null);
-  }
-
-  public final class DataTableKt {
-    method public static void DataTable(int columns, kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Boolean> numeric = { false }, androidx.ui.unit.Dp dataRowHeight = androidx.ui.material.DataTableKt.DataRowHeight, androidx.ui.unit.Dp headerRowHeight = androidx.ui.material.DataTableKt.HeaderRowHeight, androidx.ui.layout.EdgeInsets cellSpacing = androidx.ui.material.DataTableKt.CellSpacing, androidx.ui.foundation.Border border = Border(BorderColor, BorderWidth), androidx.ui.graphics.Color selectedColor = MaterialTheme.colors.primary.copy(0.08), androidx.ui.material.DataTablePagination? pagination = null, androidx.ui.material.DataTableSorting? sorting = null, kotlin.jvm.functions.Function1<? super androidx.ui.material.DataTableChildren,kotlin.Unit> block);
-    method public static androidx.ui.material.DataTablePagination DefaultDataTablePagination(int initialPage = 0, int initialRowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage);
-    method public static androidx.ui.material.DataTableSorting DefaultDataTableSorting(Integer? initialColumn = null, boolean initialAscending = true, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortRequest);
-  }
-
-  public final class DataTablePagination {
-    ctor public DataTablePagination(int page, int rowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onPageChange, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onRowsPerPageChange);
-    method public int component1();
-    method public int component2();
-    method public java.util.List<java.lang.Integer> component3();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> component4();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> component5();
-    method public androidx.ui.material.DataTablePagination copy(int page, int rowsPerPage, java.util.List<java.lang.Integer> availableRowsPerPage, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onPageChange, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onRowsPerPageChange);
-    method public java.util.List<java.lang.Integer> getAvailableRowsPerPage();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> getOnPageChange();
-    method public kotlin.jvm.functions.Function1<java.lang.Integer,kotlin.Unit> getOnRowsPerPageChange();
-    method public int getPage();
-    method public int getRowsPerPage();
-  }
-
-  public final class DataTableSorting {
-    ctor public DataTableSorting(Integer? column, boolean ascending, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortChange);
-    method public Integer? component1();
-    method public boolean component2();
-    method public java.util.Set<java.lang.Integer> component3();
-    method public kotlin.jvm.functions.Function2<java.lang.Integer,java.lang.Boolean,kotlin.Unit> component4();
-    method public androidx.ui.material.DataTableSorting copy(Integer? column, boolean ascending, java.util.Set<java.lang.Integer> sortableColumns, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> onSortChange);
-    method public boolean getAscending();
-    method public Integer? getColumn();
-    method public kotlin.jvm.functions.Function2<java.lang.Integer,java.lang.Boolean,kotlin.Unit> getOnSortChange();
-    method public java.util.Set<java.lang.Integer> getSortableColumns();
-  }
-
   public final class DividerKt {
-    method public static void Divider(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.unit.Dp thickness = 1.dp, androidx.ui.unit.Dp startIndent = 0.dp);
+    method public static void Divider(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.unit.Dp thickness = 1.dp, androidx.ui.unit.Dp startIndent = 0.dp);
   }
 
   public final class DrawerKt {
     method public static void BottomDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
     method public static void ModalDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
-    method public static void StaticDrawer(kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent);
   }
 
   public enum DrawerState {
@@ -168,18 +126,23 @@
   }
 
   public final class FloatingActionButtonKt {
-    method public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp);
-    method public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
+    method public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp);
+    method public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), androidx.ui.unit.Dp elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
   }
 
   public final class IconButtonKt {
-    method public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
-    method public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
+    method public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
+    method public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
   }
 
   public final class ListItemKt {
-    method public static void ListItem(String text, androidx.ui.graphics.ImageAsset? icon = null, String? secondaryText = null, boolean singleLineSecondaryText = true, String? overlineText = null, String? metaText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null);
-    method public static void ListItem(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? secondaryText = null, boolean singleLineSecondaryText = true, kotlin.jvm.functions.Function0<kotlin.Unit>? overlineText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailing = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null);
+    method public static void ListItem(String text, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, androidx.ui.graphics.ImageAsset? icon = null, String? secondaryText = null, boolean singleLineSecondaryText = true, String? overlineText = null, String? metaText = null);
+    method public static void ListItem(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick = null, kotlin.jvm.functions.Function0<kotlin.Unit>? icon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? secondaryText = null, boolean singleLineSecondaryText = true, kotlin.jvm.functions.Function0<kotlin.Unit>? overlineText = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailing = null, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+  }
+
+  public final class MaterialTextFieldKt {
+    method public static void FilledTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> placeholder = emptyContent(), kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, androidx.ui.graphics.Color activeColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color inactiveColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method public static void FilledTextField(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> placeholder = emptyContent(), kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, androidx.ui.graphics.Color activeColor = MaterialTheme.colors.primary, androidx.ui.graphics.Color inactiveColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
   }
 
   public final class MaterialTheme {
@@ -197,10 +160,10 @@
   }
 
   public final class ProgressIndicatorKt {
-    method public static void CircularProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static void CircularProgressIndicator(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static void LinearProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static void LinearProgressIndicator(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void CircularProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void CircularProgressIndicator(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void LinearProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
+    method public static void LinearProgressIndicator(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
   }
 
   public final class RadioButtonKt {
@@ -256,25 +219,16 @@
   }
 
   public final class SliderKt {
-    method public static void Slider(androidx.ui.material.SliderPosition position, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange = { position.value = it }, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> onValueChangeEnd = {}, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
-    method public static androidx.ui.material.SliderPosition SliderPosition(float initial = 0f, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange = 0.0 .. 1.0, @IntRange(from=0) int steps = 0);
-  }
-
-  public final class SliderPosition {
-    ctor public SliderPosition(float initial, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, @IntRange(from=null) int steps, androidx.animation.AnimationClockObservable animatedClock);
-    method public float getValue();
-    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getValueRange();
-    method public void setValue(float value);
-    property public final float value;
+    method public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange = 0.0 .. 1.0, @IntRange(from=0) int steps = 0, kotlin.jvm.functions.Function0<kotlin.Unit> onValueChangeEnd = {}, androidx.ui.graphics.Color color = MaterialTheme.colors.primary);
   }
 
   public final class SnackbarKt {
-    method public static void Snackbar(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? action = null, androidx.ui.core.Modifier modifier = Modifier.None, boolean actionOnNewLine = false, androidx.ui.graphics.Shape shape = small, androidx.ui.unit.Dp elevation = 6.dp);
+    method public static void Snackbar(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit>? action = null, androidx.ui.core.Modifier modifier = Modifier, boolean actionOnNewLine = false, androidx.ui.graphics.Shape shape = small, androidx.ui.unit.Dp elevation = 6.dp);
     method public static androidx.ui.graphics.Color snackbarPrimaryColorFor(androidx.ui.material.ColorPalette colors);
   }
 
   public final class SurfaceKt {
-    method public static void Surface(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static void Surface(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = RectangleShape, androidx.ui.graphics.Color color = MaterialTheme.colors.surface, androidx.ui.graphics.Color contentColor = contentColorFor(color), androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp elevation = 0.dp, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method public static androidx.ui.graphics.Color getPrimarySurface(androidx.ui.material.ColorPalette);
   }
 
@@ -283,15 +237,15 @@
   }
 
   public final class TabKt {
-    method public static void Tab(kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), kotlin.jvm.functions.Function0<kotlin.Unit> icon = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
-    method public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier.None, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method public static <T> void TabRow(java.util.List<? extends T> items, int selectedIndex, androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), boolean scrollable = false, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.material.TabRow.TabPosition>,kotlin.Unit> indicatorContainer = { tabPositions -> TabRow.IndicatorContainer(tabPositions, selectedIndex, { 
+    method public static void Tab(kotlin.jvm.functions.Function0<kotlin.Unit> text = emptyContent(), kotlin.jvm.functions.Function0<kotlin.Unit> icon = emptyContent(), boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color activeColor = contentColor(), androidx.ui.graphics.Color inactiveColor = EmphasisAmbient.current.medium.emphasize(activeColor));
+    method public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onSelected, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static <T> void TabRow(java.util.List<? extends T> items, int selectedIndex, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color backgroundColor = MaterialTheme.colors.primarySurface, androidx.ui.graphics.Color contentColor = contentColorFor(backgroundColor), boolean scrollable = false, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.material.TabRow.TabPosition>,kotlin.Unit> indicatorContainer = { tabPositions -> TabRow.IndicatorContainer(tabPositions, selectedIndex, { 
     TabRow.Indicator()
 }) }, kotlin.jvm.functions.Function0<kotlin.Unit> divider = { Divider(1.dp, contentColor().copy(DividerOpacity)) }, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> tab);
   }
 
   public final class TabRow {
-    method public void Indicator(androidx.ui.core.Modifier modifier = Modifier.None, androidx.ui.graphics.Color color = contentColor());
+    method public void Indicator(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Color color = contentColor());
     method public void IndicatorContainer(java.util.List<androidx.ui.material.TabRow.TabPosition> tabPositions, int selectedIndex, kotlin.jvm.functions.Function0<kotlin.Unit> indicator);
     field public static final androidx.ui.material.TabRow! INSTANCE;
   }
@@ -313,8 +267,7 @@
   }
 
   public final class Typography {
-    ctor public Typography(androidx.ui.text.TextStyle h1, androidx.ui.text.TextStyle h2, androidx.ui.text.TextStyle h3, androidx.ui.text.TextStyle h4, androidx.ui.text.TextStyle h5, androidx.ui.text.TextStyle h6, androidx.ui.text.TextStyle subtitle1, androidx.ui.text.TextStyle subtitle2, androidx.ui.text.TextStyle body1, androidx.ui.text.TextStyle body2, androidx.ui.text.TextStyle button, androidx.ui.text.TextStyle caption, androidx.ui.text.TextStyle overline);
-    ctor public Typography();
+    ctor public Typography(androidx.ui.text.font.FontFamily defaultFontFamily, androidx.ui.text.TextStyle h1, androidx.ui.text.TextStyle h2, androidx.ui.text.TextStyle h3, androidx.ui.text.TextStyle h4, androidx.ui.text.TextStyle h5, androidx.ui.text.TextStyle h6, androidx.ui.text.TextStyle subtitle1, androidx.ui.text.TextStyle subtitle2, androidx.ui.text.TextStyle body1, androidx.ui.text.TextStyle body2, androidx.ui.text.TextStyle button, androidx.ui.text.TextStyle caption, androidx.ui.text.TextStyle overline);
     method public androidx.ui.text.TextStyle component1();
     method public androidx.ui.text.TextStyle component10();
     method public androidx.ui.text.TextStyle component11();
diff --git a/ui/ui-material/build.gradle b/ui/ui-material/build.gradle
index e7f3e4a..45fa431 100644
--- a/ui/ui-material/build.gradle
+++ b/ui/ui-material/build.gradle
@@ -40,6 +40,7 @@
     api project(":ui:ui-core")
     api project(":ui:ui-foundation")
     api project(":ui:ui-material-icons-core")
+    api project(":ui:ui-text-core")
     api project(":ui:ui-text")
     api project(":ui:ui-animation-core")
 
@@ -60,6 +61,7 @@
     androidTestImplementation project(":ui:ui-material:samples")
     androidTestImplementation project(":ui:ui-platform")
     androidTestImplementation project(":ui:ui-test")
+    androidTestImplementation project(":test-screenshot")
 
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
@@ -81,3 +83,12 @@
         useIR = true
     }
 }
+
+// Screenshot tests related setup
+android {
+    defaultConfig {
+        testInstrumentationRunnerArgument("thisisignored", "thisisignored --no-isolated-storage")
+    }
+    sourceSets.androidTest.assets.srcDirs +=
+            project.rootDir.absolutePath + "/../../../golden/ui/ui-material"
+}
diff --git a/ui/ui-material/icons/extended/src/androidTest/java/androidx/ui/material/icons/test/IconComparisonTest.kt b/ui/ui-material/icons/extended/src/androidTest/java/androidx/ui/material/icons/test/IconComparisonTest.kt
index fa199e1..536a6ba0 100644
--- a/ui/ui-material/icons/extended/src/androidTest/java/androidx/ui/material/icons/test/IconComparisonTest.kt
+++ b/ui/ui-material/icons/extended/src/androidTest/java/androidx/ui/material/icons/test/IconComparisonTest.kt
@@ -16,9 +16,9 @@
 
 package androidx.ui.material.icons.test
 
-import android.app.Activity
 import android.graphics.Bitmap
 import android.os.Build
+import androidx.activity.ComponentActivity
 import androidx.compose.Composable
 import androidx.compose.Composition
 import androidx.test.filters.LargeTest
@@ -70,7 +70,7 @@
      * to run this test ~tenfold.
      */
     @get:Rule
-    val activityTestRule = ActivityTestRule(Activity::class.java)
+    val activityTestRule = ActivityTestRule(ComponentActivity::class.java)
 
     @Test
     fun compareVectorAssets() {
diff --git a/ui/ui-material/integration-tests/material-demos/build.gradle b/ui/ui-material/integration-tests/material-demos/build.gradle
index d27fe0a..ae121de 100644
--- a/ui/ui-material/integration-tests/material-demos/build.gradle
+++ b/ui/ui-material/integration-tests/material-demos/build.gradle
@@ -23,7 +23,7 @@
     implementation project(":ui:ui-framework")
     implementation project(":ui:ui-layout")
     implementation project(":ui:ui-material:samples")
-    implementation project(":ui:ui-text")
+    implementation project(":ui:ui-text-core")
     implementation project(":ui:ui-android-view")
     implementation project(":ui:ui-material")
 }
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/ColorPickerDemo.kt b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/ColorPickerDemo.kt
index b8a2e8c..59cf84a 100644
--- a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/ColorPickerDemo.kt
+++ b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/ColorPickerDemo.kt
@@ -31,8 +31,8 @@
 import androidx.ui.core.Modifier
 import androidx.ui.core.WithConstraints
 import androidx.ui.core.drawOpacity
-import androidx.ui.core.gesture.DragGestureDetector
 import androidx.ui.core.gesture.DragObserver
+import androidx.ui.core.gesture.dragGestureFilter
 import androidx.ui.foundation.Border
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.ContentGravity
@@ -51,6 +51,7 @@
 import androidx.ui.graphics.Shader
 import androidx.ui.graphics.SolidColor
 import androidx.ui.graphics.toArgb
+import androidx.ui.graphics.toPixelMap
 import androidx.ui.layout.Column
 import androidx.ui.layout.Row
 import androidx.ui.layout.Spacer
@@ -128,7 +129,7 @@
 // to just get the current position of the pointer, without needing to care about drag behavior /
 // relative positions.
 /**
- * [DragGestureDetector] that only cares about raw positions, where [position] is the position of
+ * [dragGestureFilter] that only cares about raw positions, where [position] is the position of
  * the current / last input event, [onPositionChange] is called with the new position when the
  * pointer moves, and [onDragStateChange] is called when dragging starts / stops.
  */
@@ -158,7 +159,7 @@
         }
     }
 
-    return DragGestureDetector(observer, startDragImmediately = true)
+    return Modifier.dragGestureFilter(observer, startDragImmediately = true)
 }
 
 /**
@@ -341,10 +342,8 @@
 private fun ColorWheel.colorForPosition(position: PxPosition): Color? {
     val x = position.x.value.toInt().coerceAtLeast(0)
     val y = position.y.value.toInt().coerceAtLeast(0)
-    // TODO: b/152061561 use something higher level than the nativeImage for getting
-    // pixel color here
-    with(image.nativeImage) {
+    with(image.toPixelMap()) {
         if (x >= width || y >= height) return null
-        return Color(getPixel(x, y)).takeIf { it.alpha == 1f }
+        return this[x, y].takeIf { it.alpha == 1f }
     }
 }
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/DynamicThemeActivity.kt b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/DynamicThemeActivity.kt
index a7135c1..0dc7751 100644
--- a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/DynamicThemeActivity.kt
+++ b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/DynamicThemeActivity.kt
@@ -16,8 +16,8 @@
 
 package androidx.ui.material.demos
 
-import android.app.Activity
 import android.os.Bundle
+import androidx.activity.ComponentActivity
 import androidx.animation.FastOutSlowInEasing
 import androidx.compose.Composable
 import androidx.compose.Model
@@ -45,7 +45,6 @@
 import androidx.ui.material.Scaffold
 import androidx.ui.material.TopAppBar
 import androidx.ui.material.lightColorPalette
-import androidx.ui.text.TextStyle
 import androidx.ui.unit.dp
 import kotlin.math.round
 
@@ -53,7 +52,7 @@
  * Demo activity that animates the primary, secondary, and background colours in the [MaterialTheme]
  * as the user scrolls. This has the effect of going from a 'light' theme to a 'dark' theme.
  */
-class DynamicThemeActivity : Activity() {
+class DynamicThemeActivity : ComponentActivity() {
     private val scrollFraction = ScrollFraction()
 
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -132,7 +131,7 @@
         backgroundColor = shapeColor,
         gravity = ContentGravity.Center
     ) {
-        Text("Card ${index + 1}", style = TextStyle(color = textColor))
+        Text("Card ${index + 1}", color = textColor)
     }
 }
 
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/MaterialDemos.kt b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/MaterialDemos.kt
index c7c2aaf..86880e7 100644
--- a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/MaterialDemos.kt
+++ b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/MaterialDemos.kt
@@ -24,23 +24,20 @@
 import androidx.ui.material.samples.ModalDrawerSample
 import androidx.ui.material.samples.ScaffoldWithBottomBarAndCutout
 import androidx.ui.material.samples.SideBySideAlertDialogSample
-import androidx.ui.material.samples.SimpleDataTable
-import androidx.ui.material.samples.StaticDrawerSample
 
 val MaterialDemos = DemoCategory("Material", listOf(
     ComposableDemo("AlertDialog") { SideBySideAlertDialogSample() },
     ComposableDemo("App Bars") { AppBarDemo() },
     ComposableDemo("Bottom Navigation") { BottomNavigationDemo() },
     ComposableDemo("Buttons & FABs") { ButtonDemo() },
-    ComposableDemo("Data Table") { SimpleDataTable() },
     DemoCategory("Drawer", listOf(
         ComposableDemo("Modal") { ModalDrawerSample() },
-        ComposableDemo("Bottom") { BottomDrawerSample() },
-        ComposableDemo("Static") { StaticDrawerSample() }
+        ComposableDemo("Bottom") { BottomDrawerSample() }
     )),
     ComposableDemo("Elevation") { ElevationDemo() },
     ComposableDemo("Emphasis") { EmphasisSample() },
     ComposableDemo("ListItems") { ListItemDemo() },
+    ComposableDemo("Material TextFields") { MaterialTextFieldsDemo() },
     ComposableDemo("Material Theme") { MaterialThemeDemo() },
     DemoCategory("Playground", listOf(
         ComposableDemo("Color Picker") { ColorPickerDemo() },
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/MaterialTextField.kt b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/MaterialTextField.kt
new file mode 100644
index 0000000..a73020e
--- /dev/null
+++ b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/MaterialTextField.kt
@@ -0,0 +1,107 @@
+/*
+ * 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.ui.material.demos
+
+import androidx.compose.Composable
+import androidx.compose.getValue
+import androidx.compose.setValue
+import androidx.compose.state
+import androidx.ui.core.DensityAmbient
+import androidx.ui.core.LayoutDirection
+import androidx.ui.core.Modifier
+import androidx.ui.foundation.Box
+import androidx.ui.foundation.Icon
+import androidx.ui.foundation.Text
+import androidx.ui.foundation.TextFieldValue
+import androidx.ui.foundation.currentTextStyle
+import androidx.ui.foundation.drawBackground
+import androidx.ui.graphics.Color
+import androidx.ui.layout.Arrangement
+import androidx.ui.layout.Column
+import androidx.ui.layout.fillMaxHeight
+import androidx.ui.layout.preferredHeightIn
+import androidx.ui.layout.preferredSize
+import androidx.ui.layout.preferredWidth
+import androidx.ui.material.FilledTextField
+import androidx.ui.material.icons.Icons
+import androidx.ui.material.icons.filled.Email
+import androidx.ui.unit.IntPx
+import androidx.ui.unit.dp
+import androidx.ui.unit.ipx
+
+// TODO(soboleva): remove explicit currentTextStyle() from label when b/143464846 is fixed
+@Composable
+fun MaterialTextFieldsDemo() {
+    val space = with(DensityAmbient.current) { 10.dp.toIntPx() }
+    Column(Modifier.fillMaxHeight(), arrangement = arrangeWithSpacer(space)) {
+        var text by state { TextFieldValue() }
+        FilledTextField(
+            value = text,
+            onValueChange = { text = it },
+            label = { Text("Label", style = currentTextStyle()) },
+            modifier = Modifier.preferredWidth(150.dp)
+        )
+
+        FilledTextField(
+            value = text,
+            onValueChange = { text = it },
+            label = { Icon(Icons.Filled.Email) },
+            placeholder = { Text(text = "example@example.com", style = currentTextStyle()) },
+            modifier = Modifier.preferredHeightIn(maxHeight = 150.dp)
+        )
+
+        FilledTextField(
+            value = text,
+            onValueChange = { text = it },
+            label = {
+                Box(Modifier.preferredSize(40.dp, 40.dp).drawBackground(Color.Red))
+            },
+            placeholder = { Text(text = "placeholder", style = currentTextStyle()) }
+        )
+
+        var initialText by state { "Initial text" }
+        FilledTextField(
+            value = initialText,
+            onValueChange = { initialText = it },
+            label = {
+                Text("With initial text", style = currentTextStyle())
+            }
+        )
+
+        FilledTextField(
+            value = initialText,
+            onValueChange = { initialText = it },
+            label = {}
+        )
+    }
+}
+
+private fun arrangeWithSpacer(space: IntPx) = object : Arrangement.Vertical {
+    override fun arrange(
+        totalSize: IntPx,
+        size: List<IntPx>,
+        layoutDirection: LayoutDirection
+    ): List<IntPx> {
+        val positions = mutableListOf<IntPx>()
+        var current = 0.ipx
+        size.forEach {
+            positions.add(current)
+            current += (it + space)
+        }
+        return positions
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-material/integration-tests/material-studies/build.gradle b/ui/ui-material/integration-tests/material-studies/build.gradle
index ba4cf90..f5a50ea 100644
--- a/ui/ui-material/integration-tests/material-studies/build.gradle
+++ b/ui/ui-material/integration-tests/material-studies/build.gradle
@@ -41,7 +41,7 @@
     implementation project(":ui:ui-framework")
     implementation project(":ui:ui-layout")
     implementation project(":ui:ui-animation")
-    implementation project(":ui:ui-text")
+    implementation project(":ui:ui-text-core")
     implementation project(':ui:ui-material')
 }
 
diff --git a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/CommonUi.kt b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/CommonUi.kt
index 927fec9..4382bb5 100644
--- a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/CommonUi.kt
+++ b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/CommonUi.kt
@@ -111,12 +111,12 @@
  * A vertical colored line that is used in a [BaseRow] to differentiate accounts.
  */
 @Composable
-private fun AccountIndicator(color: Color, modifier: Modifier = Modifier.None) {
+private fun AccountIndicator(color: Color, modifier: Modifier = Modifier) {
     Box(modifier.preferredSize(4.dp, 36.dp).drawBackground(color))
 }
 
 @Composable
-fun RallyDivider(modifier: Modifier = Modifier.None) {
+fun RallyDivider(modifier: Modifier = Modifier) {
     Divider(color = MaterialTheme.colors.background, thickness = 1.dp, modifier = modifier)
 }
 
diff --git a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/Icons.kt b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/Icons.kt
index adad8d0..b9c2597 100644
--- a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/Icons.kt
+++ b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/Icons.kt
@@ -40,7 +40,7 @@
 fun Icon(
     vectorImage: VectorAsset,
     tintColor: Color = Color.White,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     size: Dp = 24.dp
 ) {
     Box(
diff --git a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/RallyActivity.kt b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/RallyActivity.kt
index d17d8d0..d04b0fe 100644
--- a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/RallyActivity.kt
+++ b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/RallyActivity.kt
@@ -16,8 +16,8 @@
 
 package androidx.ui.material.studies.rally
 
-import android.app.Activity
 import android.os.Bundle
+import androidx.activity.ComponentActivity
 import androidx.compose.Composable
 import androidx.compose.getValue
 import androidx.compose.setValue
@@ -29,7 +29,7 @@
  * This Activity recreates the Rally Material Study from
  * https://material.io/design/material-studies/rally.html
  */
-class RallyActivity : Activity() {
+class RallyActivity : ComponentActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContent {
diff --git a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/RallyAnimatedCircle.kt b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/RallyAnimatedCircle.kt
index b435d8f..17b4ab1 100644
--- a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/RallyAnimatedCircle.kt
+++ b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/RallyAnimatedCircle.kt
@@ -63,7 +63,7 @@
  * because there will be N dividers of size 1.8 degrees */
 @Composable
 fun AnimatedCircle(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     proportions: List<Float>,
     colors: List<Color>
 ) {
diff --git a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/RallyTheme.kt b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/RallyTheme.kt
index ab225f2..11ba72b 100644
--- a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/RallyTheme.kt
+++ b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/RallyTheme.kt
@@ -40,51 +40,65 @@
     )
     // TODO: Bundle Roboto Condensed and Eczar font files.
     val typography = Typography(
+        defaultFontFamily = FontFamily.Default,
         // Unused
-        h1 = TextStyle(fontFamily = FontFamily.Default,
+        h1 = TextStyle(
             fontWeight = FontWeight.W100,
-            fontSize = 96.sp),
-        h2 = TextStyle(fontFamily = FontFamily.Default,
+            fontSize = 96.sp
+        ),
+        h2 = TextStyle(
             fontWeight = FontWeight.W600,
-            fontSize = 44.sp),
-        h3 = TextStyle(fontFamily = FontFamily.Default,
+            fontSize = 44.sp
+        ),
+        h3 = TextStyle(
             fontWeight = FontWeight.W400,
-            fontSize = 14.sp),
+            fontSize = 14.sp
+        ),
         // Unused
-        h4 = TextStyle(fontFamily = FontFamily.Default,
+        h4 = TextStyle(
             fontWeight = FontWeight.W700,
-            fontSize = 34.sp),
+            fontSize = 34.sp
+        ),
         // Unused
-        h5 = TextStyle(fontFamily = FontFamily.Default,
+        h5 = TextStyle(
             fontWeight = FontWeight.W700,
-            fontSize = 24.sp),
-        h6 = TextStyle(fontFamily = FontFamily.Default, // Eczar
+            fontSize = 24.sp
+        ),
+        // Eczar
+        h6 = TextStyle(
             fontWeight = FontWeight.Normal,
-            fontSize = 18.sp),
-        subtitle1 = TextStyle(fontFamily = FontFamily.Default,
+            fontSize = 18.sp
+        ),
+        subtitle1 = TextStyle(
             fontWeight = FontWeight.W300,
-            fontSize = 14.sp),
-        subtitle2 = TextStyle(fontFamily = FontFamily.Default,
+            fontSize = 14.sp
+        ),
+        subtitle2 = TextStyle(
             fontWeight = FontWeight.W400,
-            fontSize = 14.sp),
-        body1 = TextStyle(fontFamily = FontFamily.Default,
+            fontSize = 14.sp
+        ),
+        body1 = TextStyle(
             fontWeight = FontWeight.Normal,
-            fontSize = 16.sp),
-        body2 = TextStyle(fontFamily = FontFamily.Default,
+            fontSize = 16.sp
+        ),
+        body2 = TextStyle(
             fontWeight = FontWeight.W200,
-            fontSize = 14.sp),
-        button = TextStyle(fontFamily = FontFamily.Default,
+            fontSize = 14.sp
+        ),
+        button = TextStyle(
             fontWeight = FontWeight.W700,
-            fontSize = 14.sp),
+            fontSize = 14.sp
+        ),
         // Unused
-        caption = TextStyle(fontFamily = FontFamily.Default,
+        caption = TextStyle(
             fontWeight = FontWeight.W500,
-            fontSize = 12.sp),
+            fontSize = 12.sp
+        ),
         // Unused
-        overline = TextStyle(fontFamily = FontFamily.Default,
+        overline = TextStyle(
             fontWeight = FontWeight.W500,
-            fontSize = 10.sp)
-
+            fontSize = 10.sp
+        )
     )
     MaterialTheme(colors = colors, typography = typography, content = content)
 }
@@ -99,7 +113,6 @@
     val currentTypography = MaterialTheme.typography
     val dialogTypography = currentTypography.copy(
         body1 = currentTypography.body1.copy(
-            fontFamily = FontFamily.Default,
             fontWeight = FontWeight.Normal,
             fontSize = 20.sp
         ),
diff --git a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/TopAppBar.kt b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/TopAppBar.kt
index fd7c3c0..f67a0f3 100644
--- a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/TopAppBar.kt
+++ b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/TopAppBar.kt
@@ -37,7 +37,6 @@
 import androidx.ui.material.MaterialTheme
 import androidx.ui.material.Surface
 import androidx.ui.material.ripple.ripple
-import androidx.ui.text.TextStyle
 import androidx.ui.unit.dp
 import java.util.Locale
 
@@ -79,7 +78,7 @@
                     Icon(vectorImage = icon, tintColor = tabTintColor)
                     if (selected) {
                         Spacer(Modifier.preferredWidth(12.dp))
-                        Text(text, style = TextStyle(color = tabTintColor))
+                        Text(text, color = tabTintColor)
                     }
                 }
             }
diff --git a/ui/ui-material/samples/build.gradle b/ui/ui-material/samples/build.gradle
index 0cef6f5..8d9036a 100644
--- a/ui/ui-material/samples/build.gradle
+++ b/ui/ui-material/samples/build.gradle
@@ -39,7 +39,7 @@
     implementation project(":ui:ui-framework")
     implementation project(":ui:ui-layout")
     implementation project(":ui:ui-material")
-    implementation project(":ui:ui-text")
+    implementation project(":ui:ui-text-core")
 }
 
 android {
diff --git a/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/DataTableSamples.kt b/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/DataTableSamples.kt
deleted file mode 100644
index 7e7a893..0000000
--- a/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/DataTableSamples.kt
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.ui.material.samples
-
-import androidx.annotation.Sampled
-import androidx.compose.Composable
-import androidx.compose.Model
-import androidx.ui.material.DataTable
-import androidx.ui.material.DefaultDataTablePagination
-import androidx.ui.material.DefaultDataTableSorting
-
-@Model
-private data class Dessert(
-    val name: String,
-    val calories: Int,
-    val fat: Double,
-    val carbs: Int,
-    val protein: Double,
-    val sodium: Int,
-    val calcium: Int,
-    val iron: Int,
-    var selected: Boolean = false
-)
-
-private val headers = listOf(
-    "Dessert",
-    "Calories",
-    "Fat (g)",
-    "Carbs (g)",
-    "Protein (g)",
-    "Sodium (mg)",
-    "Calcium (%)",
-    "Iron (%)"
-)
-
-private val desserts = listOf(
-    Dessert("Frozen yogurt", 159, 6.0, 24, 4.0, 87, 14, 1),
-    Dessert("Ice cream sandwich", 237, 9.0, 37, 4.3, 129, 8, 1),
-    Dessert("Eclair", 262, 16.0, 24, 6.0, 337, 6, 7),
-    Dessert("Cupcake", 305, 3.7, 67, 4.3, 413, 3, 8),
-    Dessert("Gingerbread", 356, 16.0, 49, 3.9, 327, 7, 16),
-    Dessert("Jelly bean", 375, 0.0, 94, 0.0, 50, 0, 0),
-    Dessert("Lollipop", 392, 0.2, 98, 0.0, 38, 0, 2),
-    Dessert("Honeycomb", 408, 3.2, 87, 6.5, 562, 0, 45),
-    Dessert("Donut", 452, 25.0, 51, 4.9, 326, 2, 22),
-    Dessert("KitKat", 518, 26.0, 65, 7.0, 54, 12, 6)
-)
-
-private val extraDesserts = listOf(
-    Dessert("Frozen yogurt", 159, 6.0, 24, 4.0, 87, 14, 1),
-    Dessert("Ice cream sandwich", 237, 9.0, 37, 4.3, 129, 8, 1),
-    Dessert("Eclair", 262, 16.0, 24, 6.0, 337, 6, 7),
-    Dessert("Cupcake", 305, 3.7, 67, 4.3, 413, 3, 8),
-    Dessert("Gingerbread", 356, 16.0, 49, 3.9, 327, 7, 16),
-    Dessert("Jelly bean", 375, 0.0, 94, 0.0, 50, 0, 0),
-    Dessert("Lollipop", 392, 0.2, 98, 0.0, 38, 0, 2),
-    Dessert("Honeycomb", 408, 3.2, 87, 6.5, 562, 0, 45),
-    Dessert("Donut", 452, 25.0, 51, 4.9, 326, 2, 22),
-    Dessert("KitKat", 518, 26.0, 65, 7.0, 54, 12, 6),
-
-    Dessert("Frozen yogurt with sugar", 168, 6.0, 26, 4.0, 87, 14, 1),
-    Dessert("Ice cream sandwich with sugar", 246, 9.0, 39, 4.3, 129, 8, 1),
-    Dessert("Eclair with sugar", 271, 16.0, 26, 6.0, 337, 6, 7),
-    Dessert("Cupcake with sugar", 314, 3.7, 69, 4.3, 413, 3, 8),
-    Dessert("Gingerbread with sugar", 345, 16.0, 51, 3.9, 327, 7, 16),
-    Dessert("Jelly bean with sugar", 364, 0.0, 96, 0.0, 50, 0, 0),
-    Dessert("Lollipop with sugar", 401, 0.2, 100, 0.0, 38, 0, 2),
-    Dessert("Honeycomb with sugar", 417, 3.2, 89, 6.5, 562, 0, 45),
-    Dessert("Donut with sugar", 461, 25.0, 53, 4.9, 326, 2, 22),
-    Dessert("KitKat with sugar", 527, 26.0, 67, 7.0, 54, 12, 6),
-
-    Dessert("Frozen yogurt with honey", 223, 6.0, 36, 4.0, 87, 14, 1),
-    Dessert("Ice cream sandwich with honey", 301, 9.0, 49, 4.3, 129, 8, 1),
-    Dessert("Eclair with honey", 326, 16.0, 36, 6.0, 337, 6, 7),
-    Dessert("Cupcake with honey", 369, 3.7, 79, 4.3, 413, 3, 8),
-    Dessert("Gingerbread with honey", 420, 16.0, 61, 3.9, 327, 7, 16),
-    Dessert("Jelly bean with honey", 439, 0.0, 106, 0.0, 50, 0, 0),
-    Dessert("Lollipop with honey", 456, 0.2, 110, 0.0, 38, 0, 2),
-    Dessert("Honeycomb with honey", 472, 3.2, 99, 6.5, 562, 0, 45),
-    Dessert("Donut with honey", 516, 25.0, 63, 4.9, 326, 2, 22),
-    Dessert("KitKat with honey", 582, 26.0, 77, 7.0, 54, 12, 6),
-
-    Dessert("Frozen yogurt with milk", 262, 8.4, 36, 12.0, 194, 44, 1),
-    Dessert("Ice cream sandwich with milk", 339, 11.4, 49, 12.3, 236, 38, 1),
-    Dessert("Eclair with milk", 365, 18.4, 36, 14.0, 444, 36, 7),
-    Dessert("Cupcake with milk", 408, 6.1, 79, 12.3, 520, 33, 8),
-    Dessert("Gingerbread with milk", 459, 18.4, 61, 11.9, 434, 37, 16),
-    Dessert("Jelly bean with milk", 478, 2.4, 106, 8.0, 157, 30, 0),
-    Dessert("Lollipop with milk", 495, 2.6, 110, 8.0, 145, 30, 2),
-    Dessert("Honeycomb with milk", 511, 5.6, 99, 14.5, 669, 30, 45),
-    Dessert("Donut with milk", 555, 27.4, 63, 12.9, 433, 32, 22),
-    Dessert("KitKat with milk", 621, 28.4, 77, 15.0, 161, 42, 6),
-
-    Dessert("Coconut slice and frozen yogurt", 318, 21.0, 31, 5.5, 96, 14, 7),
-    Dessert("Coconut slice and ice cream sandwich", 396, 24.0, 44, 5.8, 138, 8, 7),
-    Dessert("Coconut slice and eclair", 421, 31.0, 31, 7.5, 346, 6, 13),
-    Dessert("Coconut slice and cupcake", 464, 18.7, 74, 5.8, 422, 3, 14),
-    Dessert("Coconut slice and gingerbread", 515, 31.0, 56, 5.4, 316, 7, 22),
-    Dessert("Coconut slice and jelly bean", 534, 15.0, 101, 1.5, 59, 0, 6),
-    Dessert("Coconut slice and lollipop", 551, 15.2, 105, 1.5, 47, 0, 8),
-    Dessert("Coconut slice and honeycomb", 567, 18.2, 94, 8.0, 571, 0, 51),
-    Dessert("Coconut slice and donut", 611, 40.0, 58, 6.4, 335, 2, 28),
-    Dessert("Coconut slice and KitKat", 677, 41.0, 72, 8.5, 63, 12, 12)
-)
-
-private val mutableDesserts = mutableListOf(
-    Dessert("Frozen yogurt", 159, 6.0, 24, 4.0, 87, 14, 1),
-    Dessert("Ice cream sandwich", 237, 9.0, 37, 4.3, 129, 8, 1),
-    Dessert("Eclair", 262, 16.0, 24, 6.0, 337, 6, 7),
-    Dessert("Cupcake", 305, 3.7, 67, 4.3, 413, 3, 8),
-    Dessert("Gingerbread", 356, 16.0, 49, 3.9, 327, 7, 16),
-    Dessert("Jelly bean", 375, 0.0, 94, 0.0, 50, 0, 0),
-    Dessert("Lollipop", 392, 0.2, 98, 0.0, 38, 0, 2),
-    Dessert("Honeycomb", 408, 3.2, 87, 6.5, 562, 0, 45),
-    Dessert("Donut", 452, 25.0, 51, 4.9, 326, 2, 22),
-    Dessert("KitKat", 518, 26.0, 65, 7.0, 54, 12, 6)
-)
-
-@Sampled
-@Composable
-fun SimpleDataTable() {
-    DataTable(
-        columns = headers.size,
-        numeric = { j -> j != 0 }
-    ) {
-        headerRow(text = { j -> headers[j] })
-
-        desserts.forEach { dessert ->
-            dataRow(
-                text = { j ->
-                    when (j) {
-                        0 -> dessert.name
-                        1 -> dessert.calories.toString()
-                        2 -> dessert.fat.toString()
-                        3 -> dessert.carbs.toString()
-                        4 -> dessert.protein.toString()
-                        5 -> dessert.sodium.toString()
-                        6 -> dessert.calcium.toString() + "%"
-                        else -> dessert.iron.toString() + "%"
-                    }
-                },
-                selected = dessert.selected,
-                onSelectedChange = { dessert.selected = it }
-            )
-        }
-    }
-}
-
-@Sampled
-@Composable
-fun DataTableWithPagination() {
-    DataTable(
-        columns = headers.size,
-        numeric = { j -> j != 0 },
-        pagination = DefaultDataTablePagination(
-            initialPage = 1,
-            initialRowsPerPage = 7,
-            availableRowsPerPage = listOf(7, 14, 28)
-        )
-    ) {
-        headerRow(text = { j -> headers[j] })
-
-        extraDesserts.forEach { dessert ->
-            dataRow(
-                text = { j ->
-                    when (j) {
-                        0 -> dessert.name
-                        1 -> dessert.calories.toString()
-                        2 -> dessert.fat.toString()
-                        3 -> dessert.carbs.toString()
-                        4 -> dessert.protein.toString()
-                        5 -> dessert.sodium.toString()
-                        6 -> dessert.calcium.toString() + "%"
-                        else -> dessert.iron.toString() + "%"
-                    }
-                },
-                selected = dessert.selected,
-                onSelectedChange = { dessert.selected = it }
-            )
-        }
-    }
-}
-
-@Sampled
-@Composable
-fun DataTableWithSorting() {
-    DataTable(
-        columns = headers.size,
-        numeric = { j -> j != 0 },
-        sorting = DefaultDataTableSorting(
-            sortableColumns = setOf(1, 2, 3, 4, 5, 6, 7),
-            onSortRequest = { sortColumn, ascending ->
-                mutableDesserts.sortWith(object : Comparator<Dessert> {
-                    override fun compare(p0: Dessert, p1: Dessert): Int {
-                        val comparison = when (sortColumn) {
-                            0 -> compareValues(p0.name, p1.name)
-                            1 -> compareValues(p0.calories, p1.calories)
-                            2 -> compareValues(p0.fat, p1.fat)
-                            3 -> compareValues(p0.carbs, p1.carbs)
-                            4 -> compareValues(p0.protein, p1.protein)
-                            5 -> compareValues(p0.sodium, p1.sodium)
-                            6 -> compareValues(p0.calcium, p1.calcium)
-                            else -> compareValues(p0.iron, p1.iron)
-                        }
-                        return if (ascending) comparison else -comparison
-                    }
-                })
-            }
-        )
-    ) {
-        headerRow(text = { j -> headers[j] })
-
-        mutableDesserts.forEach { dessert ->
-            dataRow(
-                text = { j ->
-                    when (j) {
-                        0 -> dessert.name
-                        1 -> dessert.calories.toString()
-                        2 -> dessert.fat.toString()
-                        3 -> dessert.carbs.toString()
-                        4 -> dessert.protein.toString()
-                        5 -> dessert.sodium.toString()
-                        6 -> dessert.calcium.toString() + "%"
-                        else -> dessert.iron.toString() + "%"
-                    }
-                },
-                selected = dessert.selected,
-                onSelectedChange = { dessert.selected = it }
-            )
-        }
-    }
-}
diff --git a/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/DrawerSamples.kt b/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/DrawerSamples.kt
index c4782f6..51431bb 100644
--- a/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/DrawerSamples.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/DrawerSamples.kt
@@ -23,37 +23,19 @@
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.ContentGravity
 import androidx.ui.foundation.Text
-import androidx.ui.foundation.drawBackground
-import androidx.ui.graphics.Color
 import androidx.ui.layout.Column
-import androidx.ui.layout.Row
 import androidx.ui.layout.Spacer
 import androidx.ui.layout.fillMaxHeight
 import androidx.ui.layout.fillMaxSize
-import androidx.ui.layout.fillMaxWidth
 import androidx.ui.layout.preferredHeight
-import androidx.ui.layout.preferredWidth
 import androidx.ui.material.BottomDrawerLayout
 import androidx.ui.material.Button
 import androidx.ui.material.DrawerState
 import androidx.ui.material.ModalDrawerLayout
-import androidx.ui.material.StaticDrawer
 import androidx.ui.unit.dp
 
 @Sampled
 @Composable
-fun StaticDrawerSample() {
-    Row(Modifier.fillMaxWidth()) {
-        StaticDrawer {
-            Text("Drawer Content")
-        }
-        Box(Modifier.fillMaxHeight().preferredWidth(1.dp).drawBackground(Color.Black))
-        Text("Rest of App")
-    }
-}
-
-@Sampled
-@Composable
 fun ModalDrawerSample() {
     val (state, onStateChange) = state { DrawerState.Closed }
     val appContentText =
diff --git a/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/SliderSample.kt b/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/SliderSample.kt
index 1d81b8b..b1d57c4 100644
--- a/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/SliderSample.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/SliderSample.kt
@@ -18,23 +18,28 @@
 
 import androidx.annotation.Sampled
 import androidx.compose.Composable
+import androidx.compose.getValue
+import androidx.compose.setValue
+import androidx.compose.state
 import androidx.ui.graphics.Color
 import androidx.ui.material.Slider
-import androidx.ui.material.SliderPosition
 
 @Sampled
 @Composable
 fun SliderSample() {
-    Slider(SliderPosition())
+    var sliderPosition by state { 0f }
+    Slider(value = sliderPosition, onValueChange = { sliderPosition = it })
 }
 
 @Sampled
 @Composable
 fun StepsSliderSample() {
-    val position = SliderPosition(
-        initial = 0f,
+    var sliderPosition by state { 0f }
+    Slider(
+        value = sliderPosition,
+        onValueChange = { sliderPosition = it },
         valueRange = 0f..100f,
-        steps = 5
+        steps = 5,
+        color = Color.Black
     )
-    Slider(position, color = Color.Black)
 }
\ No newline at end of file
diff --git a/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/ThemeSamples.kt b/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/ThemeSamples.kt
index e1d9ba69..aa55d62 100644
--- a/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/ThemeSamples.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/ThemeSamples.kt
@@ -32,7 +32,6 @@
 import androidx.ui.material.darkColorPalette
 import androidx.ui.material.lightColorPalette
 import androidx.ui.text.TextStyle
-import androidx.ui.text.font.FontFamily
 import androidx.ui.text.font.FontWeight
 import androidx.ui.unit.sp
 
@@ -50,12 +49,14 @@
     val colors = if (isSystemInDarkTheme()) darkColors else lightColors
 
     val typography = Typography(
-        h1 = TextStyle(fontFamily = FontFamily.Default,
+        h1 = TextStyle(
             fontWeight = FontWeight.W100,
-            fontSize = 96.sp),
-        button = TextStyle(fontFamily = FontFamily.Default,
+            fontSize = 96.sp
+        ),
+        button = TextStyle(
             fontWeight = FontWeight.W600,
-            fontSize = 14.sp)
+            fontSize = 14.sp
+        )
     )
 
     MaterialTheme(colors = colors, typography = typography) {
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/AppBarTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/AppBarTest.kt
index 6f3f62c..0f002cd 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/AppBarTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/AppBarTest.kt
@@ -18,7 +18,7 @@
 
 import androidx.compose.Composable
 import androidx.test.filters.SmallTest
-import androidx.ui.core.LastBaseline
+import androidx.ui.text.LastBaseline
 import androidx.ui.core.LayoutCoordinates
 import androidx.ui.core.Modifier
 import androidx.ui.core.globalPosition
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/BottomNavigationTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/BottomNavigationTest.kt
index 9671718..1077cd6 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/BottomNavigationTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/BottomNavigationTest.kt
@@ -16,7 +16,7 @@
 package androidx.ui.material
 
 import androidx.test.filters.LargeTest
-import androidx.ui.core.LastBaseline
+import androidx.ui.text.LastBaseline
 import androidx.ui.core.LayoutCoordinates
 import androidx.ui.core.Modifier
 import androidx.ui.core.globalPosition
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/ButtonTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/ButtonTest.kt
index 98881cf..115c972 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/ButtonTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/ButtonTest.kt
@@ -47,6 +47,7 @@
 import androidx.ui.test.doClick
 import androidx.ui.test.findByTag
 import androidx.ui.test.findByText
+import androidx.ui.test.runOnIdleCompose
 import androidx.ui.text.TextStyle
 import androidx.ui.unit.Dp
 import androidx.ui.unit.PxPosition
@@ -126,7 +127,7 @@
         findByText(text)
             .doClick()
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(counter).isEqualTo(1)
         }
     }
@@ -194,7 +195,7 @@
         findByTag(button1Tag)
             .doClick()
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(button1Counter).isEqualTo(1)
             assertThat(button2Counter).isEqualTo(0)
         }
@@ -202,7 +203,7 @@
         findByTag(button2Tag)
             .doClick()
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(button1Counter).isEqualTo(1)
             assertThat(button2Counter).isEqualTo(1)
         }
@@ -245,9 +246,7 @@
     fun buttonTest_ContainedButtonPropagateDefaultTextStyle() {
         composeTestRule.setMaterialContent {
             Button(onClick = {}) {
-                val style = MaterialTheme.typography.button
-                    .copy(color = MaterialTheme.colors.onPrimary)
-                assertThat(currentTextStyle()).isEqualTo(style)
+                assertThat(currentTextStyle()).isEqualTo(MaterialTheme.typography.button)
             }
         }
     }
@@ -256,9 +255,7 @@
     fun buttonTest_OutlinedButtonPropagateDefaultTextStyle() {
         composeTestRule.setMaterialContent {
             OutlinedButton(onClick = {}) {
-                val style = MaterialTheme.typography.button
-                    .copy(color = MaterialTheme.colors.primary)
-                assertThat(currentTextStyle()).isEqualTo(style)
+                assertThat(currentTextStyle()).isEqualTo(MaterialTheme.typography.button)
             }
         }
     }
@@ -267,9 +264,7 @@
     fun buttonTest_TextButtonPropagateDefaultTextStyle() {
         composeTestRule.setMaterialContent {
             TextButton(onClick = {}) {
-                val style = MaterialTheme.typography.button
-                    .copy(color = MaterialTheme.colors.primary)
-                assertThat(currentTextStyle()).isEqualTo(style)
+                assertThat(currentTextStyle()).isEqualTo(MaterialTheme.typography.button)
             }
         }
     }
@@ -342,7 +337,7 @@
             }
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             val topLeft = childCoordinates!!.localToGlobal(PxPosition.Origin).x -
                     parentCoordinates!!.localToGlobal(PxPosition.Origin).x
             val currentPadding = with(composeTestRule.density) {
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxScreenshotTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxScreenshotTest.kt
new file mode 100644
index 0000000..48a507b
--- /dev/null
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxScreenshotTest.kt
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.ui.material
+
+import android.os.Build
+import androidx.compose.state
+import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
+import androidx.test.screenshot.AndroidXScreenshotTestRule
+import androidx.test.screenshot.assertAgainstGolden
+import androidx.ui.core.Alignment
+import androidx.ui.core.Modifier
+import androidx.ui.layout.wrapContentSize
+import androidx.ui.test.captureToBitmap
+import androidx.ui.test.createComposeRule
+import androidx.ui.test.doClick
+import androidx.ui.test.find
+import androidx.ui.test.isToggleable
+import androidx.ui.test.runOnIdleCompose
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@LargeTest
+@RunWith(JUnit4::class)
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+class CheckboxScreenshotTest {
+
+    @get:Rule
+    val composeTestRule = createComposeRule()
+
+    @get:Rule
+    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
+
+    val wrap = Modifier.wrapContentSize(Alignment.TopStart)
+
+    @Test
+    fun checkBoxTest_checked() {
+        composeTestRule.setMaterialContent {
+            Checkbox(modifier = wrap, checked = true, onCheckedChange = { })
+        }
+        find(isToggleable())
+            .captureToBitmap()
+            .assertAgainstGolden(screenshotRule, "checkbox_checked")
+    }
+
+    @Test
+    fun checkBoxTest_unchecked() {
+        composeTestRule.setMaterialContent {
+            Checkbox(modifier = wrap, checked = false, onCheckedChange = { })
+        }
+        find(isToggleable())
+            .captureToBitmap()
+            .assertAgainstGolden(screenshotRule, "checkbox_unchecked")
+    }
+
+    @Test
+    fun checkBoxTest_unchecked_animateToChecked() {
+        composeTestRule.setMaterialContent {
+            val isChecked = state { false }
+            Checkbox(modifier = wrap, checked = isChecked.value,
+                onCheckedChange = { isChecked.value = it })
+        }
+
+        composeTestRule.clockTestRule.pauseClock()
+
+        find(isToggleable())
+            .doClick()
+
+        runOnIdleCompose { }
+
+        // TODO(b/152402882): Advancing animation once (by 220ms) yields different result than this
+        composeTestRule.clockTestRule.advanceClock(100)
+        runOnIdleCompose { }
+        composeTestRule.clockTestRule.advanceClock(120)
+
+        find(isToggleable())
+            .captureToBitmap()
+            .assertAgainstGolden(screenshotRule, "checkbox_animateToChecked")
+    }
+
+    @Test
+    fun checkBoxTest_checked_animateToUnchecked() {
+        composeTestRule.setMaterialContent {
+            val isChecked = state { true }
+            Checkbox(modifier = wrap, checked = isChecked.value,
+                onCheckedChange = { isChecked.value = it })
+        }
+
+        composeTestRule.clockTestRule.pauseClock()
+
+        find(isToggleable())
+            .doClick()
+
+        runOnIdleCompose { }
+
+        // TODO(b/152402882): Advancing animation once (by 220ms) yields different result than this
+        composeTestRule.clockTestRule.advanceClock(100)
+        runOnIdleCompose { }
+        composeTestRule.clockTestRule.advanceClock(120)
+
+        find(isToggleable())
+            .captureToBitmap()
+            .assertAgainstGolden(screenshotRule, "checkbox_animateToUnchecked")
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/DrawerTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/DrawerTest.kt
index acc6cfd..0219b37 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/DrawerTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/DrawerTest.kt
@@ -32,6 +32,8 @@
 import androidx.ui.test.doGesture
 import androidx.ui.test.findByTag
 import androidx.ui.test.globalBounds
+import androidx.ui.test.runOnIdleCompose
+import androidx.ui.test.runOnUiThread
 import androidx.ui.test.sendClick
 import androidx.ui.unit.IntPx
 import androidx.ui.unit.IntPxSize
@@ -71,7 +73,7 @@
                 })
             }, bodyContent = emptyContent())
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(position!!.x.value).isEqualTo(0f)
         }
     }
@@ -87,7 +89,7 @@
             }, bodyContent = emptyContent())
         }
         val width = composeTestRule.displayMetrics.widthPixels
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(position!!.x.round().value).isEqualTo(-width)
         }
     }
@@ -125,7 +127,7 @@
         val height = composeTestRule.displayMetrics.heightPixels
         // temporary calculation of landscape screen
         val expectedHeight = if (width > height) 0 else (height / 2f).roundToInt()
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(position!!.y.round().value).isEqualTo(expectedHeight)
         }
     }
@@ -141,23 +143,12 @@
             }, bodyContent = emptyContent())
         }
         val height = composeTestRule.displayMetrics.heightPixels
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(position!!.y.round().value).isEqualTo(height)
         }
     }
 
     @Test
-    fun staticDrawer_testWidth_whenOpened() {
-        composeTestRule
-            .setMaterialContentAndCollectSizes {
-                StaticDrawer {
-                    Box(Modifier.fillMaxSize())
-                }
-            }
-            .assertWidthEqualsTo(256.dp)
-    }
-
-    @Test
     @Ignore("failing in postsubmit, fix in b/148751721")
     fun modalDrawer_openAndClose() {
         var contentWidth: IntPx? = null
@@ -194,7 +185,7 @@
 
         // When the drawer state is set to Opened
         openedLatch = CountDownLatch(1)
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             drawerState.state = DrawerState.Opened
         }
         // Then the drawer should be opened
@@ -202,7 +193,7 @@
 
         // When the drawer state is set to Closed
         closedLatch = CountDownLatch(1)
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             drawerState.state = DrawerState.Closed
         }
         // Then the drawer should be closed
@@ -236,7 +227,7 @@
         // Click in the middle of the drawer (which is the middle of the body)
         findByTag("Drawer").doGesture { sendClick() }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(drawerClicks).isEqualTo(0)
             assertThat(bodyClicks).isEqualTo(1)
 
@@ -251,7 +242,7 @@
             sendClick(PxPosition(left, centerY))
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(drawerClicks).isEqualTo(1)
             assertThat(bodyClicks).isEqualTo(1)
         }
@@ -296,7 +287,7 @@
 
         // When the drawer state is set to Opened
         openedLatch = CountDownLatch(1)
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             drawerState.state = DrawerState.Opened
         }
         // Then the drawer should be opened
@@ -304,7 +295,7 @@
 
         // When the drawer state is set to Closed
         closedLatch = CountDownLatch(1)
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             drawerState.state = DrawerState.Closed
         }
         // Then the drawer should be closed
@@ -338,12 +329,12 @@
         // Click in the middle of the drawer (which is the middle of the body)
         findByTag("Drawer").doGesture { sendClick() }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(drawerClicks).isEqualTo(0)
             assertThat(bodyClicks).isEqualTo(1)
         }
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             drawerState.state = DrawerState.Opened
         }
         sleep(100) // TODO(147586311): remove this sleep when opening the drawer triggers a wait
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/EmphasisTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/EmphasisTest.kt
index 4d74a90..4325388 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/EmphasisTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/EmphasisTest.kt
@@ -18,7 +18,6 @@
 
 import androidx.test.filters.MediumTest
 import androidx.ui.foundation.contentColor
-import androidx.ui.foundation.currentTextStyle
 import androidx.ui.graphics.Color
 import androidx.ui.test.createComposeRule
 import com.google.common.truth.Truth.assertThat
@@ -59,7 +58,6 @@
                     val onSurface = MaterialTheme.colors.onSurface
 
                     assertThat(contentColor()).isEqualTo(onSurface)
-                    assertThat(currentTextStyle().color).isEqualTo(onSurface)
                 }
             }
         }
@@ -77,7 +75,6 @@
                         )
 
                         assertThat(contentColor()).isEqualTo(modifiedOnSurface)
-                        assertThat(currentTextStyle().color).isEqualTo(modifiedOnSurface)
                     }
                 }
             }
@@ -96,7 +93,6 @@
                         )
 
                         assertThat(contentColor()).isEqualTo(modifiedOnSurface)
-                        assertThat(currentTextStyle().color).isEqualTo(modifiedOnSurface)
                     }
                 }
             }
@@ -115,7 +111,6 @@
                         )
 
                         assertThat(contentColor()).isEqualTo(modifiedOnSurface)
-                        assertThat(currentTextStyle().color).isEqualTo(modifiedOnSurface)
                     }
                 }
             }
@@ -130,7 +125,6 @@
                     val onPrimary = MaterialTheme.colors.onPrimary
 
                     assertThat(contentColor()).isEqualTo(onPrimary)
-                    assertThat(currentTextStyle().color).isEqualTo(onPrimary)
                 }
             }
         }
@@ -148,7 +142,6 @@
                         )
 
                         assertThat(contentColor()).isEqualTo(modifiedOnPrimary)
-                        assertThat(currentTextStyle().color).isEqualTo(modifiedOnPrimary)
                     }
                 }
             }
@@ -167,7 +160,6 @@
                         )
 
                         assertThat(contentColor()).isEqualTo(modifiedOnPrimary)
-                        assertThat(currentTextStyle().color).isEqualTo(modifiedOnPrimary)
                     }
                 }
             }
@@ -186,7 +178,6 @@
                         )
 
                         assertThat(contentColor()).isEqualTo(modifiedOnPrimary)
-                        assertThat(currentTextStyle().color).isEqualTo(modifiedOnPrimary)
                     }
                 }
             }
@@ -199,7 +190,6 @@
             MaterialTheme(colors) {
                 Surface(contentColor = Color.Yellow) {
                     assertThat(contentColor()).isEqualTo(Color.Yellow)
-                    assertThat(currentTextStyle().color).isEqualTo(Color.Yellow)
                 }
             }
         }
@@ -220,7 +210,6 @@
                         val modifiedColor = contentColor.copy(alpha = expectedAlpha)
 
                         assertThat(contentColor()).isEqualTo(modifiedColor)
-                        assertThat(currentTextStyle().color).isEqualTo(modifiedColor)
                     }
                 }
             }
@@ -242,7 +231,6 @@
                         val modifiedColor = contentColor.copy(alpha = expectedAlpha)
 
                         assertThat(contentColor()).isEqualTo(modifiedColor)
-                        assertThat(currentTextStyle().color).isEqualTo(modifiedColor)
                     }
                 }
             }
@@ -264,7 +252,6 @@
                         val modifiedColor = contentColor.copy(alpha = expectedAlpha)
 
                         assertThat(contentColor()).isEqualTo(modifiedColor)
-                        assertThat(currentTextStyle().color).isEqualTo(modifiedColor)
                     }
                 }
             }
@@ -286,7 +273,6 @@
                         val modifiedColor = contentColor.copy(alpha = expectedAlpha)
 
                         assertThat(contentColor()).isEqualTo(modifiedColor)
-                        assertThat(currentTextStyle().color).isEqualTo(modifiedColor)
                     }
                 }
             }
@@ -308,7 +294,6 @@
                         val modifiedColor = contentColor.copy(alpha = expectedAlpha)
 
                         assertThat(contentColor()).isEqualTo(modifiedColor)
-                        assertThat(currentTextStyle().color).isEqualTo(modifiedColor)
                     }
                 }
             }
@@ -330,7 +315,6 @@
                         val modifiedColor = contentColor.copy(alpha = expectedAlpha)
 
                         assertThat(contentColor()).isEqualTo(modifiedColor)
-                        assertThat(currentTextStyle().color).isEqualTo(modifiedColor)
                     }
                 }
             }
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/FloatingActionButtonTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/FloatingActionButtonTest.kt
index 0a8a55c..3d52786 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/FloatingActionButtonTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/FloatingActionButtonTest.kt
@@ -39,6 +39,7 @@
 import androidx.ui.test.doClick
 import androidx.ui.test.findByTag
 import androidx.ui.test.findByText
+import androidx.ui.test.runOnIdleCompose
 import androidx.ui.unit.dp
 import androidx.ui.unit.round
 import com.google.common.truth.Truth.assertThat
@@ -89,7 +90,7 @@
         findByText(text)
             .doClick()
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(counter).isEqualTo(1)
         }
     }
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/LayoutCoordinatesHelper.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/GoldenCommon.kt
similarity index 66%
copy from ui/ui-test/src/main/java/androidx/ui/test/LayoutCoordinatesHelper.kt
copy to ui/ui-material/src/androidTest/java/androidx/ui/material/GoldenCommon.kt
index b09b72c..437ffa4 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/LayoutCoordinatesHelper.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/GoldenCommon.kt
@@ -14,13 +14,6 @@
  * limitations under the License.
  */
 
-package androidx.ui.test
+package androidx.ui.material
 
-import androidx.ui.core.LayoutCoordinates
-import androidx.ui.unit.PxPosition
-
-/**
- * Returns the position relative to the parent Layout
- */
-val LayoutCoordinates.positionInParent: PxPosition
-    get() = parentCoordinates?.childToLocal(this, PxPosition.Origin) ?: PxPosition.Origin
\ No newline at end of file
+internal const val GOLDEN_MATERIAL = "ui/ui-material"
\ No newline at end of file
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/IconButtonTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/IconButtonTest.kt
index c6ce9f2..3722f51 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/IconButtonTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/IconButtonTest.kt
@@ -20,6 +20,7 @@
 import androidx.ui.core.LayoutCoordinates
 import androidx.ui.core.Modifier
 import androidx.ui.core.onPositioned
+import androidx.ui.core.positionInParent
 import androidx.ui.foundation.Box
 import androidx.ui.layout.preferredSize
 import androidx.ui.material.samples.IconButtonSample
@@ -30,7 +31,6 @@
 import androidx.ui.test.doClick
 import androidx.ui.test.find
 import androidx.ui.test.isToggleable
-import androidx.ui.test.positionInParent
 import androidx.ui.unit.dp
 import androidx.ui.unit.toPx
 import com.google.common.truth.Truth
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/ListItemTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/ListItemTest.kt
index 892480f..456dd83 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/ListItemTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/ListItemTest.kt
@@ -17,7 +17,7 @@
 package androidx.ui.material
 
 import androidx.test.filters.SmallTest
-import androidx.ui.core.FirstBaseline
+import androidx.ui.text.FirstBaseline
 import androidx.ui.core.LayoutCoordinates
 import androidx.ui.core.Modifier
 import androidx.ui.core.Ref
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/MaterialTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/MaterialTest.kt
index e12d482..62c780b 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/MaterialTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/MaterialTest.kt
@@ -22,12 +22,13 @@
 import androidx.ui.test.BigTestConstraints
 import androidx.ui.test.CollectedSizes
 import androidx.ui.test.ComposeTestRule
+import androidx.ui.test.runOnIdleCompose
 import androidx.ui.test.setContentAndGetPixelSize
 import androidx.ui.unit.Density
 import androidx.ui.unit.PxSize
 
 fun ComposeTestRule.setMaterialContent(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     composable: @Composable() () -> Unit
 ) {
     setContent {
@@ -42,7 +43,7 @@
     }
 }
 fun ComposeTestRule.setMaterialContentAndCollectSizes(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     parentConstraints: DpConstraints = BigTestConstraints,
     children: @Composable() () -> Unit
 ): CollectedSizes {
@@ -51,7 +52,7 @@
 }
 
 fun ComposeTestRule.setMaterialContentAndGetPixelSize(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     parentConstraints: DpConstraints = BigTestConstraints,
     children: @Composable() () -> Unit
 ): PxSize = setContentAndGetPixelSize(
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/ProgressIndicatorTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/ProgressIndicatorTest.kt
index 5875298..ebe01e3 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/ProgressIndicatorTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/ProgressIndicatorTest.kt
@@ -22,6 +22,7 @@
 import androidx.ui.test.assertValueEquals
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.findByTag
+import androidx.ui.test.runOnUiThread
 import androidx.ui.unit.dp
 import org.junit.Rule
 import org.junit.Test
@@ -59,7 +60,7 @@
             .assertIsDisplayed()
             .assertValueEquals("0.0")
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             state.progress = 0.5f
         }
 
@@ -104,7 +105,7 @@
             .assertIsDisplayed()
             .assertValueEquals("0.0")
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             state.progress = 0.5f
         }
 
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/RippleTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/RippleTest.kt
index 4b15ea4..c59ee11 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/RippleTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/RippleTest.kt
@@ -49,6 +49,8 @@
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.doClick
 import androidx.ui.test.findByTag
+import androidx.ui.test.runOnIdleCompose
+import androidx.ui.test.runOnUiThread
 import androidx.ui.unit.Density
 import androidx.ui.unit.Dp
 import androidx.ui.unit.IntPxSize
@@ -248,7 +250,7 @@
         // wait for drawEffect to be called
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
-        composeTestRule.runOnUiThread { emit = false }
+        runOnUiThread { emit = false }
 
         // wait for dispose to be called
         assertTrue(disposeLatch.await(1, TimeUnit.SECONDS))
@@ -321,11 +323,11 @@
         assertThat(rippleAnimationTime).isGreaterThan(prevValue)
         prevValue = rippleAnimationTime
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             emit = false
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             // wait for the dispose to be applied
         }
 
@@ -437,7 +439,7 @@
         assertEquals(Color.Yellow, actualColor)
 
         drawLatch = CountDownLatch(1)
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             colorState = Color.Green
         }
 
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/ScaffoldTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/ScaffoldTest.kt
index 7ba30e9..739addb 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/ScaffoldTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/ScaffoldTest.kt
@@ -21,6 +21,7 @@
 import androidx.ui.core.Modifier
 import androidx.ui.core.TestTag
 import androidx.ui.core.onPositioned
+import androidx.ui.core.positionInParent
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.Icon
 import androidx.ui.foundation.Text
@@ -35,7 +36,7 @@
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.doGesture
 import androidx.ui.test.findByTag
-import androidx.ui.test.positionInParent
+import androidx.ui.test.runOnUiThread
 import androidx.ui.test.sendSwipeLeft
 import androidx.ui.test.sendSwipeRight
 import androidx.ui.unit.IntPxSize
@@ -196,7 +197,7 @@
         }
         assertThat(drawerChildPosition.x).isLessThan(0.px)
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             scaffoldState.isDrawerGesturesEnabled = true
         }
 
@@ -242,11 +243,11 @@
             }
         }
         assertThat(drawerChildPosition.x).isLessThan(0.px)
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             scaffoldState.drawerState = DrawerState.Opened
         }
         assertThat(drawerChildPosition.x).isLessThan(0.px)
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             scaffoldState.drawerState = DrawerState.Closed
         }
         assertThat(drawerChildPosition.x).isLessThan(0.px)
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/SliderTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/SliderTest.kt
index 240279a..3806b4c 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/SliderTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/SliderTest.kt
@@ -16,16 +16,16 @@
 
 package androidx.ui.material
 
-import androidx.animation.ManualAnimationClock
-import androidx.compose.FrameManager.framed
+import androidx.compose.mutableStateOf
 import androidx.test.filters.MediumTest
 import androidx.ui.core.TestTag
 import androidx.ui.layout.DpConstraints
 import androidx.ui.test.assertValueEquals
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.findByTag
+import androidx.ui.test.runOnIdleCompose
+import androidx.ui.test.runOnUiThread
 import androidx.ui.unit.dp
-import org.junit.Assert.assertTrue
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -34,68 +34,56 @@
 @MediumTest
 @RunWith(JUnit4::class)
 class SliderTest {
+    private val tag = "slider"
 
     @get:Rule
     val composeTestRule = createComposeRule(disableTransitions = true)
 
     @Test
-    fun sliderPosition_defaultConstructor() {
-        framed {
-            val position = SliderPosition(animatedClock = ManualAnimationClock(0))
-            assertTrue(position.startValue == 0f)
-            assertTrue(position.endValue == 1f)
-            assertTrue(position.value == 0f)
-            assertTrue(position.tickFractions.isEmpty())
-        }
-    }
-
-    @Test
     fun sliderPosition_valueCoercion() {
-        framed {
-            val position = SliderPosition(animatedClock = ManualAnimationClock(0))
-            assertTrue(position.value == 0f)
-            assertTrue(position.endValue == 1f)
-            position.value = 2f
-            assertTrue(position.value == 1f)
-            assertTrue(position.startValue == 0f)
-            position.value = -10f
-            assertTrue(position.value == 0f)
+        val state = mutableStateOf(0f)
+        composeTestRule.setContent {
+            TestTag(tag = tag) {
+                Slider(
+                    value = state.value,
+                    onValueChange = { state.value = it },
+                    valueRange = 0f..1f
+                )
+            }
         }
-    }
-
-    @Test
-    fun sliderPosition_reversedRange() {
-        val pos = SliderPosition(
-            initial = 0f,
-            valueRange = 10f..0f,
-            animatedClock = ManualAnimationClock(0)
-        )
-        assertTrue(pos.startValue == 10f)
-        assertTrue(pos.endValue == 0f)
+        runOnIdleCompose {
+            state.value = 2f
+        }
+        findByTag(tag).assertValueEquals("1.0")
+        runOnIdleCompose {
+            state.value = -123145f
+        }
+        findByTag(tag).assertValueEquals("0.0")
     }
 
     @Test(expected = IllegalArgumentException::class)
     fun sliderPosition_stepsThrowWhenLessThanZero() {
-        SliderPosition(steps = -1, animatedClock = ManualAnimationClock(0))
+        composeTestRule.setContent {
+            Slider(value = 0f, onValueChange = {}, steps = -1)
+        }
     }
 
     @Test
     fun slider_semantics() {
-        val tag = "slider"
-        val position = SliderPosition(animatedClock = ManualAnimationClock(0))
+        val state = mutableStateOf(0f)
 
         composeTestRule
             .setMaterialContent {
                 TestTag(tag = tag) {
-                    Slider(position)
+                    Slider(value = state.value, onValueChange = { state.value = it })
                 }
             }
 
         findByTag(tag)
             .assertValueEquals("0.0")
 
-        composeTestRule.runOnUiThread {
-            position.value = 0.5f
+        runOnUiThread {
+            state.value = 0.5f
         }
 
         findByTag(tag)
@@ -104,12 +92,11 @@
 
     @Test
     fun slider_sizes() {
-        val position = SliderPosition(animatedClock = ManualAnimationClock(0))
-
+        val state = mutableStateOf(0f)
         composeTestRule
             .setMaterialContentAndCollectSizes(
                 parentConstraints = DpConstraints(maxWidth = 100.dp, maxHeight = 100.dp)
-            ) { Slider(position) }
+            ) { Slider(value = state.value, onValueChange = { state.value = it }) }
             .assertHeightEqualsTo(48.dp)
             .assertWidthEqualsTo(100.dp)
     }
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/SnackbarTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/SnackbarTest.kt
index 373a4ef0..fd95f50 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/SnackbarTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/SnackbarTest.kt
@@ -20,13 +20,14 @@
 import androidx.compose.Providers
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
-import androidx.ui.core.FirstBaseline
-import androidx.ui.core.LastBaseline
+import androidx.ui.text.FirstBaseline
+import androidx.ui.text.LastBaseline
 import androidx.ui.core.LayoutCoordinates
 import androidx.ui.core.Modifier
 import androidx.ui.core.TestTag
 import androidx.ui.core.globalPosition
 import androidx.ui.core.onPositioned
+import androidx.ui.core.positionInParent
 import androidx.ui.foundation.Text
 import androidx.ui.foundation.shape.corner.CutCornerShape
 import androidx.ui.graphics.Color
@@ -40,7 +41,6 @@
 import androidx.ui.test.doClick
 import androidx.ui.test.findByTag
 import androidx.ui.test.findByText
-import androidx.ui.test.positionInParent
 import androidx.ui.unit.IntPx
 import androidx.ui.unit.PxPosition
 import androidx.ui.unit.dp
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/SurfaceContentColorTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/SurfaceContentColorTest.kt
index 9bbba1e..3396117 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/SurfaceContentColorTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/SurfaceContentColorTest.kt
@@ -18,7 +18,6 @@
 
 import androidx.test.filters.MediumTest
 import androidx.ui.foundation.contentColor
-import androidx.ui.foundation.currentTextStyle
 import androidx.ui.graphics.Color
 import androidx.ui.test.createComposeRule
 import com.google.common.truth.Truth.assertThat
@@ -39,10 +38,7 @@
         composeTestRule.setContent {
             MaterialTheme {
                 Surface(color = MaterialTheme.colors.primary) {
-                    assertThat(contentColor())
-                        .isEqualTo(MaterialTheme.colors.onPrimary)
-                    assertThat(currentTextStyle().color)
-                        .isEqualTo(MaterialTheme.colors.onPrimary)
+                    assertThat(contentColor()).isEqualTo(MaterialTheme.colors.onPrimary)
                 }
             }
         }
@@ -53,10 +49,7 @@
         composeTestRule.setContent {
             MaterialTheme {
                 Surface(color = MaterialTheme.colors.secondary) {
-                    assertThat(contentColor())
-                        .isEqualTo(MaterialTheme.colors.onSecondary)
-                    assertThat(currentTextStyle().color)
-                        .isEqualTo(MaterialTheme.colors.onSecondary)
+                    assertThat(contentColor()).isEqualTo(MaterialTheme.colors.onSecondary)
                 }
             }
         }
@@ -67,10 +60,7 @@
         composeTestRule.setContent {
             MaterialTheme {
                 Surface(color = MaterialTheme.colors.background) {
-                    assertThat(contentColor())
-                        .isEqualTo(MaterialTheme.colors.onBackground)
-                    assertThat(currentTextStyle().color)
-                        .isEqualTo(MaterialTheme.colors.onBackground)
+                    assertThat(contentColor()).isEqualTo(MaterialTheme.colors.onBackground)
                 }
             }
         }
@@ -81,10 +71,7 @@
         composeTestRule.setContent {
             MaterialTheme {
                 Surface(color = MaterialTheme.colors.surface) {
-                    assertThat(contentColor())
-                        .isEqualTo(MaterialTheme.colors.onSurface)
-                    assertThat(currentTextStyle().color)
-                        .isEqualTo(MaterialTheme.colors.onSurface)
+                    assertThat(contentColor()).isEqualTo(MaterialTheme.colors.onSurface)
                 }
             }
         }
@@ -96,7 +83,6 @@
             MaterialTheme {
                 Surface(color = Color.Yellow) {
                     assertThat(contentColor()).isEqualTo(Color.Black)
-                    assertThat(currentTextStyle().color).isEqualTo(Color.Black)
                 }
             }
         }
@@ -111,10 +97,7 @@
                     // This surface should inherit the parent contentColor, as yellow is not part
                     // of the theme
                     Surface(color = Color.Yellow) {
-                        assertThat(contentColor())
-                            .isEqualTo(MaterialTheme.colors.onSurface)
-                        assertThat(currentTextStyle().color)
-                            .isEqualTo(MaterialTheme.colors.onSurface)
+                        assertThat(contentColor()).isEqualTo(MaterialTheme.colors.onSurface)
                     }
                 }
             }
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/TabTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/TabTest.kt
index e57bf81..b74419e 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/TabTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/TabTest.kt
@@ -20,7 +20,7 @@
 import androidx.compose.setValue
 import androidx.compose.state
 import androidx.test.filters.LargeTest
-import androidx.ui.core.LastBaseline
+import androidx.ui.text.LastBaseline
 import androidx.ui.core.LayoutCoordinates
 import androidx.ui.core.Modifier
 import androidx.ui.core.onChildPositioned
@@ -44,6 +44,7 @@
 import androidx.ui.test.doClick
 import androidx.ui.test.findAll
 import androidx.ui.test.isInMutuallyExclusiveGroup
+import androidx.ui.test.runOnIdleCompose
 import androidx.ui.unit.Px
 import androidx.ui.unit.PxPosition
 import androidx.ui.unit.dp
@@ -162,7 +163,7 @@
 
         // Indicator should now be placed in the bottom left of the second tab, so its x coordinate
         // should be in the middle of the TabRow
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             with(composeTestRule.density) {
                 val indicatorPositionX = indicatorCoords.localToGlobal(PxPosition.Origin).x
                 val expectedPositionX = tabRowWidth / 2
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/AppBar.kt b/ui/ui-material/src/main/java/androidx/ui/material/AppBar.kt
index ae44e64..160c9f0 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/AppBar.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/AppBar.kt
@@ -18,7 +18,7 @@
 import androidx.compose.Composable
 import androidx.compose.Immutable
 import androidx.ui.core.DensityAmbient
-import androidx.ui.core.LastBaseline
+import androidx.ui.text.LastBaseline
 import androidx.ui.core.Modifier
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.ContentGravity
@@ -80,7 +80,7 @@
 @Composable
 fun TopAppBar(
     title: @Composable() () -> Unit,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     navigationIcon: @Composable() (() -> Unit)? = null,
     actions: @Composable() RowScope.() -> Unit = {},
     backgroundColor: Color = MaterialTheme.colors.primarySurface,
@@ -141,7 +141,7 @@
  */
 @Composable
 fun TopAppBar(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     backgroundColor: Color = MaterialTheme.colors.primarySurface,
     contentColor: Color = contentColorFor(backgroundColor),
     elevation: Dp = TopAppBarElevation,
@@ -234,7 +234,7 @@
  */
 @Composable
 fun BottomAppBar(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     backgroundColor: Color = MaterialTheme.colors.primarySurface,
     contentColor: Color = contentColorFor(backgroundColor),
     fabConfiguration: FabConfiguration? = null,
@@ -499,7 +499,7 @@
     contentColor: Color,
     elevation: Dp,
     shape: Shape,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     children: @Composable() RowScope.() -> Unit
 ) {
     Surface(
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/BottomNavigation.kt b/ui/ui-material/src/main/java/androidx/ui/material/BottomNavigation.kt
index 6e7dad4..ecb492d 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/BottomNavigation.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/BottomNavigation.kt
@@ -20,10 +20,11 @@
 import androidx.animation.TweenBuilder
 import androidx.annotation.FloatRange
 import androidx.compose.Composable
+import androidx.compose.Providers
 import androidx.compose.emptyContent
 import androidx.ui.animation.animate
 import androidx.ui.core.Constraints
-import androidx.ui.core.LastBaseline
+import androidx.ui.text.LastBaseline
 import androidx.ui.core.Layout
 import androidx.ui.core.MeasureScope
 import androidx.ui.core.Modifier
@@ -31,8 +32,8 @@
 import androidx.ui.core.drawOpacity
 import androidx.ui.core.tag
 import androidx.ui.foundation.Box
+import androidx.ui.foundation.ContentColorAmbient
 import androidx.ui.foundation.ContentGravity
-import androidx.ui.foundation.ProvideContentColor
 import androidx.ui.foundation.ProvideTextStyle
 import androidx.ui.foundation.contentColor
 import androidx.ui.foundation.selection.MutuallyExclusiveSetItem
@@ -80,7 +81,7 @@
  */
 @Composable
 fun BottomNavigation(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     backgroundColor: Color = MaterialTheme.colors.primarySurface,
     contentColor: Color = contentColorFor(backgroundColor),
     elevation: Dp = BottomNavigationElevation,
@@ -131,7 +132,7 @@
     text: @Composable() () -> Unit = emptyContent(),
     selected: Boolean,
     onSelected: () -> Unit,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     alwaysShowLabels: Boolean = true,
     activeColor: Color = contentColor(),
     inactiveColor: Color = EmphasisAmbient.current.medium.emphasize(activeColor)
@@ -186,7 +187,7 @@
 
     val color = lerp(inactiveColor, activeColor, animationProgress)
 
-    ProvideContentColor(color) {
+    Providers(ContentColorAmbient provides color) {
         content(animationProgress)
     }
 }
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Button.kt b/ui/ui-material/src/main/java/androidx/ui/material/Button.kt
index 2e3e673..e449964 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Button.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Button.kt
@@ -66,7 +66,7 @@
 @Composable
 fun Button(
     onClick: () -> Unit,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     enabled: Boolean = true,
     elevation: Dp = 2.dp,
     shape: Shape = MaterialTheme.shapes.small,
@@ -144,7 +144,7 @@
 @Composable
 inline fun OutlinedButton(
     noinline onClick: () -> Unit,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     enabled: Boolean = true,
     elevation: Dp = 0.dp,
     shape: Shape = MaterialTheme.shapes.small,
@@ -200,7 +200,7 @@
 @Composable
 inline fun TextButton(
     noinline onClick: () -> Unit,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     enabled: Boolean = true,
     elevation: Dp = 0.dp,
     shape: Shape = MaterialTheme.shapes.small,
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Card.kt b/ui/ui-material/src/main/java/androidx/ui/material/Card.kt
index 3fff503..160ddad 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Card.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Card.kt
@@ -42,7 +42,7 @@
  */
 @Composable
 fun Card(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     shape: Shape = MaterialTheme.shapes.medium,
     color: Color = MaterialTheme.colors.surface,
     contentColor: Color = contentColorFor(color),
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Checkbox.kt b/ui/ui-material/src/main/java/androidx/ui/material/Checkbox.kt
index 4c070c27..7c9791c 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Checkbox.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Checkbox.kt
@@ -24,9 +24,9 @@
 import androidx.ui.animation.ColorPropKey
 import androidx.ui.animation.Transition
 import androidx.ui.core.Modifier
+import androidx.ui.core.DrawScope
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.Canvas
-import androidx.ui.foundation.CanvasScope
 import androidx.ui.foundation.ContentGravity
 import androidx.ui.foundation.selection.ToggleableState
 import androidx.ui.foundation.selection.TriStateToggleable
@@ -66,7 +66,7 @@
     checked: Boolean,
     onCheckedChange: (Boolean) -> Unit,
     enabled: Boolean = true,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     color: Color = MaterialTheme.colors.secondary
 ) {
     TriStateCheckbox(
@@ -102,7 +102,7 @@
     state: ToggleableState,
     onClick: () -> Unit,
     enabled: Boolean = true,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     color: Color = MaterialTheme.colors.secondary
 ) {
     Semantics(container = true, mergeAllDescendants = true) {
@@ -146,7 +146,7 @@
     }
 }
 
-private fun CanvasScope.drawBox(
+private fun DrawScope.drawBox(
     color: Color,
     innerRadiusFraction: Float,
     paint: Paint
@@ -208,7 +208,7 @@
     }
 }
 
-private fun CanvasScope.drawCheck(
+private fun DrawScope.drawCheck(
     checkFraction: Float,
     crossCenterGravitation: Float,
     paint: Paint
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/DataTable.kt b/ui/ui-material/src/main/java/androidx/ui/material/DataTable.kt
deleted file mode 100644
index 04d4589..0000000
--- a/ui/ui-material/src/main/java/androidx/ui/material/DataTable.kt
+++ /dev/null
@@ -1,581 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.ui.material
-
-import androidx.compose.Composable
-import androidx.compose.state
-import androidx.ui.core.Alignment
-import androidx.ui.core.Constraints
-import androidx.ui.core.Layout
-import androidx.ui.core.Modifier
-import androidx.ui.core.tag
-import androidx.ui.foundation.Border
-import androidx.ui.foundation.Box
-import androidx.ui.foundation.Clickable
-import androidx.ui.foundation.ContentGravity
-import androidx.ui.foundation.Image
-import androidx.ui.foundation.ProvideTextStyle
-import androidx.ui.foundation.Text
-import androidx.ui.foundation.drawBackground
-import androidx.ui.foundation.drawBorders
-import androidx.ui.foundation.selection.ToggleableState
-import androidx.ui.graphics.Color
-import androidx.ui.graphics.ImageAsset
-import androidx.ui.layout.Arrangement
-import androidx.ui.layout.Column
-import androidx.ui.layout.EdgeInsets
-import androidx.ui.layout.Row
-import androidx.ui.layout.RowAlign
-import androidx.ui.layout.Spacer
-import androidx.ui.layout.Table
-import androidx.ui.layout.TableColumnWidth
-import androidx.ui.layout.fillMaxSize
-import androidx.ui.layout.preferredHeight
-import androidx.ui.layout.preferredWidth
-import androidx.ui.material.ripple.ripple
-import androidx.ui.text.TextStyle
-import androidx.ui.text.font.FontWeight
-import androidx.ui.unit.Dp
-import androidx.ui.unit.IntPx
-import androidx.ui.unit.dp
-
-/**
- * Pagination configuration for a [DataTable].
- */
-data class DataTablePagination(
-    /**
-     * The index of the current page (starting from zero).
-     */
-    val page: Int,
-
-    /**
-     * The number of rows to show on each page.
-     */
-    val rowsPerPage: Int,
-
-    /**
-     * The options to offer for the number of rows per page.
-     *
-     * The current value of [rowsPerPage] must be in this list.
-     */
-    val availableRowsPerPage: List<Int>,
-
-    /**
-     * Invoked when the user switches to another page.
-     */
-    val onPageChange: (Int) -> Unit,
-
-    /**
-     * Invoked when the user selects a different number of rows per page.
-     */
-    val onRowsPerPageChange: (Int) -> Unit
-)
-
-/**
- * Creates a pagination configuration for [DataTable] with the given initial values.
- *
- * Example usage:
- *
- * @sample androidx.ui.material.samples.DataTableWithPagination
- */
-@Composable
-fun DefaultDataTablePagination(
-    initialPage: Int = 0,
-    initialRowsPerPage: Int,
-    availableRowsPerPage: List<Int>
-): DataTablePagination {
-    val page = state { initialPage }
-    val rowsPerPage = state { initialRowsPerPage }
-    return DataTablePagination(
-        page = page.value,
-        rowsPerPage = rowsPerPage.value,
-        availableRowsPerPage = availableRowsPerPage,
-        onPageChange = { page.value = it },
-        onRowsPerPageChange = { rowsPerPage.value = it }
-    )
-}
-
-/**
- * Sorting configuration for a [DataTable].
- */
-data class DataTableSorting(
-    /**
-     * The index of the current column, if any, by which the data is sorted.
-     *
-     * When this is null, it implies that the table's sort order does not correspond to any of the
-     * columns. Setting this to a non-null value will display a sort indicator next to that column.
-     */
-    val column: Int?,
-
-    /**
-     * Whether the column specified by [column], if non-null, is sorted in ascending order.
-     */
-    val ascending: Boolean,
-
-    /**
-     * The columns by which the data can be sorted.
-     *
-     * The current value of [column], if non-null, must be in this set.
-     */
-    val sortableColumns: Set<Int>,
-
-    /**
-     * Called when the user asks to sort the table.
-     */
-    val onSortChange: (column: Int, ascending: Boolean) -> Unit
-)
-
-/**
- * Creates a sorting configuration for [DataTable] with the given initial values.
- *
- * Example usage:
- *
- * @sample androidx.ui.material.samples.DataTableWithSorting
- */
-@Composable
-fun DefaultDataTableSorting(
-    initialColumn: Int? = null,
-    initialAscending: Boolean = true,
-    sortableColumns: Set<Int>,
-    onSortRequest: (column: Int, ascending: Boolean) -> Unit
-): DataTableSorting {
-    val column = state { initialColumn }
-    val ascending = state { initialAscending }
-    return DataTableSorting(
-        column = column.value,
-        ascending = ascending.value,
-        sortableColumns = sortableColumns,
-        onSortChange = { newColumn, newAscending ->
-            column.value = newColumn
-            ascending.value = newAscending
-            onSortRequest(newColumn, newAscending)
-        }
-    )
-}
-
-/**
- * Collects information about the children of a [DataTable] when
- * its body is executed with a [DataTableChildren] as argument.
- */
-class DataTableChildren internal constructor() {
-    internal var header: HeaderRowInfo? = null
-    internal val rows = mutableListOf<DataRowInfo>()
-
-    /**
-     * Creates a data row in a [DataTable] with the given content.
-     *
-     * If [onSelectedChange] is non-null for any row in the table, then a checkbox is shown at the
-     * start of each row. The checkbox will be checked if and only if the row is selected (true).
-     *
-     * @param selected Whether this row is selected.
-     * @param onSelectedChange Called when a user selects or unselects this row.
-     */
-    fun dataRow(
-        selected: Boolean = false,
-        onSelectedChange: ((Boolean) -> Unit)? = null,
-        content: @Composable() (index: Int) -> Unit
-    ) {
-        rows += DataRowInfo(content, selected, onSelectedChange)
-    }
-
-    /**
-     * Creates a data row in a [DataTable] with a [text] and an optional [icon].
-     *
-     * If [onSelectedChange] is non-null for any row in the table, then a checkbox is shown at the
-     * start of each row. The checkbox will be checked if and only if the row is selected (true).
-     *
-     * @param text Text to display in each cell.
-     * @param icon Optional image to draw to the left of the text in each cell.
-     * @param selected Whether this row is selected.
-     * @param onSelectedChange Called when a user selects or unselects this row.
-     */
-    fun dataRow(
-        text: (index: Int) -> String,
-        icon: (index: Int) -> ImageAsset? = { null },
-        selected: Boolean = false,
-        onSelectedChange: ((Boolean) -> Unit)? = null
-    ) {
-        val content: @Composable() (Int) -> Unit = { j ->
-            val image = icon(j)
-            if (image == null) {
-                Text(text = text(j))
-            } else {
-                Row {
-                    Image(asset = image)
-                    Spacer(DataTableWidthSpacerModifier)
-                    Text(text = text(j))
-                }
-            }
-        }
-        rows += DataRowInfo(content, selected, onSelectedChange)
-    }
-
-    /**
-     * Creates a header row in a [DataTable] with the given content.
-     *
-     * Note that the [onSelectAll] callback may be null, in which case the default behaviour will
-     * be used, i.e. select or unselect all selectable rows using their onSelectedChange callbacks.
-     *
-     * @param onSelectAll Called when a user selects or unselects all rows using the 'all' checkbox.
-     */
-    fun headerRow(
-        onSelectAll: ((Boolean) -> Unit)? = null,
-        content: @Composable() (index: Int) -> Unit
-    ) {
-        header = HeaderRowInfo(content, onSelectAll)
-    }
-
-    /**
-     * Creates a header row in a [DataTable] with a [text] and an optional [icon].
-     *
-     * Note that the [onSelectAll] callback may be null, in which case the default behaviour will
-     * be used, i.e. select or unselect all selectable rows using their onSelectedChange callbacks.
-     *
-     * @param text Text to display in each column header
-     * @param icon Optional image to draw to the left of the text in each column header.
-     * @param onSelectAll Called when a user selects or unselects all rows using the 'all' checkbox.
-     */
-    fun headerRow(
-        text: (index: Int) -> String,
-        icon: (index: Int) -> ImageAsset? = { null },
-        onSelectAll: ((Boolean) -> Unit)? = null
-    ) {
-        val content: @Composable() (Int) -> Unit = { j ->
-            val image = icon(j)
-            if (image == null) {
-                Text(text = text(j))
-            } else {
-                Row {
-                    Image(asset = image)
-                    Spacer(DataTableWidthSpacerModifier)
-                    Text(text = text(j))
-                }
-            }
-        }
-        header = HeaderRowInfo(content, onSelectAll)
-    }
-}
-
-/**
- * Configuration for the data row of a [DataTable].
- */
-internal data class DataRowInfo(
-    val content: @Composable() (index: Int) -> Unit,
-    val selected: Boolean,
-    val onSelectedChange: ((Boolean) -> Unit)?
-)
-
-/**
- * Configuration for the header row of a [DataTable].
- */
-internal data class HeaderRowInfo(
-    val content: @Composable() (index: Int) -> Unit,
-    val onSelectAll: ((Boolean) -> Unit)?
-)
-
-/**
- * Data tables display information in a grid-like format of rows and columns. They organize
- * information in a way that’s easy to scan, so that users can look for patterns and insights.
- *
- * Example usage:
- *
- * @sample androidx.ui.material.samples.SimpleDataTable
- *
- * To make a data table paginated, you must provide a [pagination] configuration:
- *
- * @sample androidx.ui.material.samples.DataTableWithPagination
- *
- * To enable sorting when clicking on the column headers, provide a [sorting] configuration:
- *
- * @sample androidx.ui.material.samples.DataTableWithSorting
- *
- * @param columns The number of columns in the table.
- * @param numeric Whether the given column represents numeric data.
- * @param dataRowHeight The height of each row (excluding the header row).
- * @param headerRowHeight The height of the header row.
- * @param cellSpacing The padding to apply around each cell.
- * @param border [Border] class that specifies border appearance, such as size or color.
- * @param selectedColor The color used to indicate selected rows.
- * @param pagination Contains the pagination configuration. To disable pagination, set this to null.
- * @param sorting Contains the sorting configuration. To disable sorting, set this to null.
- */
-@Composable
-fun DataTable(
-    columns: Int,
-    numeric: (Int) -> Boolean = { false },
-    dataRowHeight: Dp = DataRowHeight,
-    headerRowHeight: Dp = HeaderRowHeight,
-    cellSpacing: EdgeInsets = CellSpacing,
-    border: Border = Border(color = BorderColor, size = BorderWidth),
-    selectedColor: Color = MaterialTheme.colors.primary.copy(alpha = 0.08f),
-    pagination: DataTablePagination? = null,
-    sorting: DataTableSorting? = null,
-    block: DataTableChildren.() -> Unit
-) {
-    val scope = DataTableChildren()
-    scope.block()
-    val rows = scope.rows
-    val header = scope.header
-
-    val selectableRows = rows.filter { it.onSelectedChange != null }
-    val showCheckboxes = selectableRows.isNotEmpty()
-
-    val visibleRows = if (pagination == null) {
-        rows
-    } else {
-        rows.drop(pagination.rowsPerPage * pagination.page).take(pagination.rowsPerPage)
-    }
-
-    val table = @Composable {
-        Table(
-            columns = columns + if (showCheckboxes) 1 else 0,
-            alignment = { j ->
-                if (numeric(j - if (showCheckboxes) 1 else 0)) {
-                    Alignment.CenterEnd
-                } else {
-                    Alignment.CenterStart
-                }
-            },
-            columnWidth = { j ->
-                if (showCheckboxes && j == 0) {
-                    TableColumnWidth.Wrap
-                } else {
-                    TableColumnWidth.Wrap.flexible(flex = 1f)
-                }
-            }
-        ) {
-            // Table borders
-            drawBorders(defaultBorder = border) {
-                allHorizontal()
-            }
-
-            // Header row
-            if (header != null) {
-                tableRow {
-                    if (showCheckboxes) {
-                        Box(
-                            Modifier.preferredHeight(headerRowHeight),
-                            paddingStart = cellSpacing.left,
-                            paddingTop = cellSpacing.top,
-                            paddingEnd = cellSpacing.right,
-                            paddingBottom = cellSpacing.bottom,
-                            gravity = ContentGravity.Center
-                        ) {
-                            val parentState = when (selectableRows.count { it.selected }) {
-                                selectableRows.size -> ToggleableState.On
-                                0 -> ToggleableState.Off
-                                else -> ToggleableState.Indeterminate
-                            }
-                            TriStateCheckbox(state = parentState, onClick = {
-                                val newValue = parentState != ToggleableState.On
-                                if (header.onSelectAll != null) {
-                                    header.onSelectAll.invoke(newValue)
-                                } else {
-                                    rows.forEach { it.onSelectedChange?.invoke(newValue) }
-                                }
-                            })
-                        }
-                    }
-                    for (j in 0 until columns) {
-                        Box(
-                            Modifier.preferredHeight(headerRowHeight),
-                            paddingStart = cellSpacing.left,
-                            paddingTop = cellSpacing.top,
-                            paddingEnd = cellSpacing.right,
-                            paddingBottom = cellSpacing.bottom,
-                            gravity = ContentGravity.Center
-                        ) {
-                            var fontWeight = FontWeight.W500
-                            var onSort = {}
-                            var enabled = false
-                            var headerDecoration: @Composable() (() -> Unit)? = null
-
-                            if (sorting != null && sorting.sortableColumns.contains(j)) {
-                                if (sorting.column == j) {
-                                    fontWeight = FontWeight.Bold
-                                    onSort = {
-                                        sorting.onSortChange(j, !sorting.ascending)
-                                    }
-                                    enabled = true
-                                    headerDecoration = {
-                                        // TODO(calintat): Replace with animated arrow icons.
-                                        Text(text = if (sorting.ascending) "↑" else "↓")
-                                        Spacer(DataTableWidthSpacerModifier)
-                                    }
-                                } else {
-                                    onSort = {
-                                        sorting.onSortChange(j, true)
-                                    }
-                                }
-                            }
-
-                            ProvideTextStyle(TextStyle(fontWeight = fontWeight)) {
-                                Clickable(
-                                    onClick = onSort,
-                                    enabled = enabled,
-                                    modifier = Modifier.ripple()
-                                ) {
-                                    Row {
-                                        headerDecoration?.invoke()
-                                        header.content(index = j)
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-
-            // Data rows
-            visibleRows.forEach { row ->
-                tableRow {
-                    if (showCheckboxes) {
-                        Box(
-                            Modifier.preferredHeight(dataRowHeight),
-                            paddingStart = cellSpacing.left,
-                            paddingTop = cellSpacing.top,
-                            paddingEnd = cellSpacing.right,
-                            paddingBottom = cellSpacing.bottom,
-                            gravity = ContentGravity.Center
-                        ) {
-                            Checkbox(row.selected, row.onSelectedChange ?: {})
-                        }
-                    }
-                    for (j in 0 until columns) {
-                        Box(
-                            Modifier.preferredHeight(dataRowHeight),
-                            paddingStart = cellSpacing.left,
-                            paddingTop = cellSpacing.top,
-                            paddingEnd = cellSpacing.right,
-                            paddingBottom = cellSpacing.bottom,
-                            gravity = ContentGravity.Center
-                        ) {
-                            row.content(index = j)
-                        }
-                    }
-                }
-            }
-
-            // Data rows ripples
-            tableDecoration(overlay = false) {
-                val children = @Composable {
-                    visibleRows.forEachIndexed { index, row ->
-                        if (row.onSelectedChange == null) return@forEachIndexed
-                        Clickable(
-                            onClick = { row.onSelectedChange.invoke(!row.selected) },
-                            modifier = Modifier.tag(index).ripple()
-                        ) {
-                            val color = if (row.selected) selectedColor else Color.Transparent
-                            Box(Modifier.fillMaxSize().drawBackground(color))
-                        }
-                    }
-                }
-                Layout(children) { measurables, constraints, _ ->
-                    layout(constraints.maxWidth, constraints.maxHeight) {
-                        measurables.forEach { measurable ->
-                            val i = measurable.tag as Int
-                            val placeable = measurable.measure(
-                                Constraints.fixed(
-                                    width = constraints.maxWidth,
-                                    height = verticalOffsets[i + 2] - verticalOffsets[i + 1]
-                                )
-                            )
-                            placeable.placeAbsolute(
-                                x = IntPx.Zero,
-                                y = verticalOffsets[i + 1]
-                            )
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    if (pagination == null) {
-        table()
-    } else {
-        Column {
-            table()
-            Box(
-                Modifier.preferredHeight(dataRowHeight),
-                paddingStart = cellSpacing.left,
-                paddingTop = cellSpacing.top,
-                paddingEnd = cellSpacing.right,
-                paddingBottom = cellSpacing.bottom,
-                gravity = ContentGravity.Center
-            ) {
-                Row(Modifier.fillMaxSize(), arrangement = Arrangement.End) {
-                    val pages = (rows.size - 1) / pagination.rowsPerPage + 1
-                    val startRow = pagination.rowsPerPage * pagination.page
-                    val endRow = (startRow + pagination.rowsPerPage).coerceAtMost(rows.size)
-                    val center = Modifier.gravity(RowAlign.Center)
-
-                    // TODO(calintat): Replace this with a dropdown menu whose items are taken
-                    //  from availableRowsPerPage (filtered to those that are in the range
-                    //  0 until rows.size). When an item is selected, it should invoke
-                    //  onRowsPerPageChange with the appropriate value.
-                    Text(text = "Rows per page: ${pagination.rowsPerPage}", modifier = center)
-
-                    Spacer(DataTableTextSpacerModifier)
-
-                    Text(text = "${startRow + 1}-$endRow of ${rows.size}", modifier = center)
-
-                    Spacer(DataTableTextSpacerModifier)
-
-                    // TODO(calintat): Replace this with an image button with chevron_left icon.
-                    Box(center) {
-                        Clickable(
-                            onClick = {
-                                val newPage = pagination.page - 1
-                                if (newPage >= 0)
-                                    pagination.onPageChange.invoke(newPage)
-                            },
-                            modifier = Modifier.ripple()
-                        ) {
-                            Text(text = "Prev")
-                        }
-                    }
-
-                    Spacer(DataTableNextSpacerModifier)
-
-                    // TODO(calintat): Replace this with an image button with chevron_right icon.
-                    Box(center) {
-                        Clickable(
-                            onClick = {
-                                val newPage = pagination.page + 1
-                                if (newPage < pages)
-                                    pagination.onPageChange.invoke(newPage)
-                            },
-                            modifier = Modifier.ripple()
-                        ) {
-                            Text(text = "Next")
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-
-private val DataRowHeight = 52.dp
-private val HeaderRowHeight = 56.dp
-private val CellSpacing = EdgeInsets(left = 16.dp, right = 16.dp)
-private val BorderColor = Color(0xFFC6C6C6)
-private val BorderWidth = 1.dp
-private val DataTableWidthSpacerModifier = Modifier.preferredWidth(2.dp)
-private val DataTableTextSpacerModifier = Modifier.preferredWidth(32.dp)
-private val DataTableNextSpacerModifier = Modifier.preferredWidth(24.dp)
\ No newline at end of file
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Divider.kt b/ui/ui-material/src/main/java/androidx/ui/material/Divider.kt
index b765b2c..03f7d13d 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Divider.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Divider.kt
@@ -36,7 +36,7 @@
  */
 @Composable
 fun Divider(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     color: Color = MaterialTheme.colors.surface,
     thickness: Dp = 1.dp,
     startIndent: Dp = 0.dp
@@ -44,7 +44,7 @@
     val indentMod = if (startIndent.value != 0f) {
         Modifier.padding(start = startIndent)
     } else {
-        Modifier.None
+        Modifier
     }
     Box(modifier.plus(indentMod).fillMaxWidth().preferredHeight(thickness).drawBackground(color))
 }
\ No newline at end of file
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt b/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt
index 14d5d16..8574f6a 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt
@@ -35,10 +35,8 @@
 import androidx.ui.graphics.PaintingStyle
 import androidx.ui.layout.DpConstraints
 import androidx.ui.layout.Stack
-import androidx.ui.layout.fillMaxHeight
 import androidx.ui.layout.fillMaxSize
 import androidx.ui.layout.preferredSizeIn
-import androidx.ui.layout.preferredWidth
 import androidx.ui.material.internal.StateDraggable
 import androidx.ui.unit.IntPx
 import androidx.ui.unit.Px
@@ -66,30 +64,9 @@
 /**
  * Navigation drawers provide access to destinations in your app.
  *
- * Standard navigation drawers allow interaction with both screen content and the drawer
- * at the same time. They can be used on tablet and desktop,
- * but they are not suitable for mobile due to limited screen size.
- *
- * See [ModalDrawerLayout] and [BottomDrawerLayout] for more mobile friendly options.
- *
- * @sample androidx.ui.material.samples.StaticDrawerSample
- *
- * @param drawerContent composable that represents content inside the drawer
- */
-@Composable
-fun StaticDrawer(
-    drawerContent: @Composable() () -> Unit
-) {
-    Box(StaticDrawerModifier, children = drawerContent)
-}
-
-/**
- * Navigation drawers provide access to destinations in your app.
- *
  * Modal navigation drawers block interaction with the rest of an app’s content with a scrim.
  * They are elevated above most of the app’s UI and don’t affect the screen’s layout grid.
  *
- * See [StaticDrawer] for always visible drawer, suitable for tablet or desktop.
  * See [BottomDrawerLayout] for a layout that introduces a bottom drawer, suitable when
  * using bottom navigation.
  *
@@ -157,7 +134,6 @@
  * These drawers open upon tapping the navigation menu icon in the bottom app bar.
  * They are only for use on mobile.
  *
- * See [StaticDrawer] for always visible drawer, suitable for tablet or desktop
  * See [ModalDrawerLayout] for a layout that introduces a classic from-the-side drawer.
  *
  * @sample androidx.ui.material.samples.BottomDrawerSample
@@ -339,7 +315,6 @@
 private const val ScrimDefaultOpacity = 0.32f
 private val VerticalDrawerPadding = 56.dp
 
-private val StaticDrawerModifier = Modifier.preferredWidth(256.dp).fillMaxHeight()
 private const val DrawerStiffness = 1000f
 
 private val AnimationBuilder =
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Emphasis.kt b/ui/ui-material/src/main/java/androidx/ui/material/Emphasis.kt
index b169e01..d603340 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Emphasis.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Emphasis.kt
@@ -20,8 +20,9 @@
 import androidx.compose.Ambient
 import androidx.compose.Composable
 import androidx.compose.Immutable
+import androidx.compose.Providers
 import androidx.compose.staticAmbientOf
-import androidx.ui.foundation.ProvideContentColor
+import androidx.ui.foundation.ContentColorAmbient
 import androidx.ui.foundation.contentColor
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.luminance
@@ -98,7 +99,7 @@
 @Composable
 fun ProvideEmphasis(emphasis: Emphasis, content: @Composable() () -> Unit) {
     val emphasizedColor = emphasis.emphasize(contentColor())
-    ProvideContentColor(emphasizedColor, content)
+    Providers(ContentColorAmbient provides emphasizedColor, children = content)
 }
 
 /**
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/FloatingActionButton.kt b/ui/ui-material/src/main/java/androidx/ui/material/FloatingActionButton.kt
index 7dac4a00..855c416 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/FloatingActionButton.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/FloatingActionButton.kt
@@ -67,7 +67,7 @@
 @Composable
 fun FloatingActionButton(
     onClick: () -> Unit,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     shape: Shape = MaterialTheme.shapes.small.copy(CornerSize(percent = 50)),
     backgroundColor: Color = MaterialTheme.colors.primary,
     contentColor: Color = contentColorFor(backgroundColor),
@@ -122,7 +122,7 @@
 fun ExtendedFloatingActionButton(
     text: @Composable() () -> Unit,
     onClick: () -> Unit,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     icon: @Composable() (() -> Unit)? = null,
     shape: Shape = MaterialTheme.shapes.small.copy(CornerSize(percent = 50)),
     backgroundColor: Color = MaterialTheme.colors.primary,
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/IconButton.kt b/ui/ui-material/src/main/java/androidx/ui/material/IconButton.kt
index 9f273a1..8a06075 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/IconButton.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/IconButton.kt
@@ -48,7 +48,7 @@
 @Composable
 fun IconButton(
     onClick: () -> Unit,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     icon: @Composable() () -> Unit
 ) {
     Clickable(onClick, Modifier.ripple(bounded = false, radius = RippleRadius)) {
@@ -79,7 +79,7 @@
     checked: Boolean,
     onCheckedChange: (Boolean) -> Unit,
     enabled: Boolean = true,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     icon: @Composable() () -> Unit
 ) {
     Toggleable(
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/ListItem.kt b/ui/ui-material/src/main/java/androidx/ui/material/ListItem.kt
index 0363a16..d84a3ba 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/ListItem.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/ListItem.kt
@@ -18,8 +18,8 @@
 
 import androidx.compose.Composable
 import androidx.ui.core.Alignment
-import androidx.ui.core.FirstBaseline
-import androidx.ui.core.LastBaseline
+import androidx.ui.text.FirstBaseline
+import androidx.ui.text.LastBaseline
 import androidx.ui.core.Layout
 import androidx.ui.core.Modifier
 import androidx.ui.foundation.Box
@@ -57,23 +57,25 @@
  * @sample androidx.ui.material.samples.ThreeLineListItems
  *
  * @param text The primary text of the list item
+ * @param modifier Modifier to be applied to the list item
+ * @param onClick Callback to be invoked when the list item is clicked
  * @param icon The leading supporting visual of the list item
  * @param secondaryText The secondary text of the list item
  * @param singleLineSecondaryText Whether the secondary text is single line
  * @param overlineText The text displayed above the primary text
  * @param metaText The meta text to be displayed in the trailing position
- * @param onClick Callback to be invoked when the list item is clicked
  */
 @Composable
 fun ListItem(
     text: String,
+    modifier: Modifier = Modifier,
+    onClick: (() -> Unit)? = null,
     icon: ImageAsset? = null,
     secondaryText: String? = null,
     // TODO(popam): find a way to remove this
     singleLineSecondaryText: Boolean = true,
     overlineText: String? = null,
-    metaText: String? = null,
-    onClick: (() -> Unit)? = null
+    metaText: String? = null
 ) {
     val iconComposable: @Composable() (() -> Unit)? = icon?.let {
         { Image(it) }
@@ -94,13 +96,14 @@
         { Text(it, maxLines = 1, overflow = TextOverflow.Ellipsis) }
     }
     ListItem(
-        textComposable,
+        modifier,
+        onClick,
         iconComposable,
         secondaryTextComposable,
         singleLineSecondaryText,
         overlineTextComposable,
         metaTextComposable,
-        onClick
+        textComposable
     )
 }
 
@@ -115,23 +118,25 @@
  * - three-line items
  * @sample androidx.ui.material.samples.ThreeLineListItems
  *
- * @param text The primary text of the list item
+ * @param modifier Modifier to be applied to the list item
+ * @param onClick Callback to be invoked when the list item is clicked
  * @param icon The leading supporting visual of the list item
  * @param secondaryText The secondary text of the list item
  * @param singleLineSecondaryText Whether the secondary text is single line
  * @param overlineText The text displayed above the primary text
  * @param trailing The trailing meta text or meta icon of the list item
- * @param onClick Callback to be invoked when the list item is clicked
+ * @param text The primary text of the list item
  */
 @Composable
 fun ListItem(
-    text: @Composable() (() -> Unit),
+    modifier: Modifier = Modifier,
+    onClick: (() -> Unit)? = null,
     icon: @Composable() (() -> Unit)? = null,
     secondaryText: @Composable() (() -> Unit)? = null,
     singleLineSecondaryText: Boolean = true,
     overlineText: @Composable() (() -> Unit)? = null,
     trailing: @Composable() (() -> Unit)? = null,
-    onClick: (() -> Unit)? = null
+    text: @Composable() (() -> Unit)
 ) {
     val emphasisLevels = EmphasisAmbient.current
     val typography = MaterialTheme.typography
@@ -148,6 +153,7 @@
             styledSecondaryText == null
         ) {
             TwoLine.ListItem(
+                modifier,
                 icon,
                 styledText,
                 styledSecondaryText,
@@ -156,6 +162,7 @@
             )
         } else {
             ThreeLine.ListItem(
+                modifier,
                 icon,
                 styledText,
                 styledSecondaryText,
@@ -252,6 +259,7 @@
 
     @Composable
     fun ListItem(
+        modifier: Modifier = Modifier,
         icon: @Composable() (() -> Unit)?,
         text: @Composable() (() -> Unit),
         secondaryText: @Composable() (() -> Unit)?,
@@ -259,8 +267,8 @@
         trailing: @Composable() (() -> Unit)?
     ) {
         val minHeight = if (icon == null) MinHeight else MinHeightWithIcon
-        Row(Modifier.preferredHeightIn(minHeight = minHeight)) {
-            val modifier = Modifier.weight(1f)
+        Row(modifier.preferredHeightIn(minHeight = minHeight)) {
+            val columnModifier = Modifier.weight(1f)
                 .padding(start = ContentLeftPadding, end = ContentRightPadding)
 
             if (icon != null) {
@@ -280,7 +288,7 @@
             if (overlineText != null) {
                 BaselinesOffsetColumn(
                     listOf(OverlineBaselineOffset, OverlineToPrimaryBaselineOffset),
-                    modifier
+                    columnModifier
                 ) {
                     overlineText()
                     text()
@@ -299,7 +307,7 @@
                             PrimaryToSecondaryBaselineOffsetNoIcon
                         }
                     ),
-                    modifier
+                    columnModifier
                 ) {
                     text()
                     secondaryText!!()
@@ -345,13 +353,14 @@
 
     @Composable
     fun ListItem(
+        modifier: Modifier = Modifier,
         icon: @Composable() (() -> Unit)?,
         text: @Composable() (() -> Unit),
         secondaryText: @Composable() (() -> Unit),
         overlineText: @Composable() (() -> Unit)?,
         trailing: @Composable() (() -> Unit)?
     ) {
-        Row(Modifier.preferredHeightIn(minHeight = MinHeight)) {
+        Row(modifier.preferredHeightIn(minHeight = MinHeight)) {
             if (icon != null) {
                 val minSize = IconLeftPadding + IconMinPaddedWidth
                 Box(
@@ -396,7 +405,7 @@
 @Composable
 private fun BaselinesOffsetColumn(
     offsets: List<Dp>,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     content: @Composable() () -> Unit
 ) {
     Layout(content, modifier) { measurables, constraints, _ ->
@@ -438,7 +447,7 @@
 @Composable
 private fun OffsetToBaselineOrCenter(
     offset: Dp,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     content: @Composable() () -> Unit
 ) {
     Layout(content, modifier) { measurables, constraints, _ ->
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/MaterialTextField.kt b/ui/ui-material/src/main/java/androidx/ui/material/MaterialTextField.kt
new file mode 100644
index 0000000..2b48d0f
--- /dev/null
+++ b/ui/ui-material/src/main/java/androidx/ui/material/MaterialTextField.kt
@@ -0,0 +1,585 @@
+/*
+ * 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.ui.material
+
+import androidx.animation.FloatPropKey
+import androidx.animation.TransitionSpec
+import androidx.animation.TweenBuilder
+import androidx.animation.transitionDefinition
+import androidx.compose.Composable
+import androidx.compose.Providers
+import androidx.compose.emptyContent
+import androidx.compose.getValue
+import androidx.compose.remember
+import androidx.compose.setValue
+import androidx.compose.state
+import androidx.compose.stateFor
+import androidx.ui.animation.ColorPropKey
+import androidx.ui.animation.DpPropKey
+import androidx.ui.animation.Transition
+import androidx.ui.core.Alignment
+import androidx.ui.core.FocusManagerAmbient
+import androidx.ui.text.FirstBaseline
+import androidx.ui.text.LastBaseline
+import androidx.ui.core.Layout
+import androidx.ui.core.Modifier
+import androidx.ui.core.Placeable
+import androidx.ui.core.drawBehind
+import androidx.ui.core.offset
+import androidx.ui.core.tag
+import androidx.ui.foundation.Box
+import androidx.ui.foundation.Clickable
+import androidx.ui.foundation.ContentColorAmbient
+import androidx.ui.foundation.ProvideTextStyle
+import androidx.ui.foundation.Text
+import androidx.ui.foundation.TextField
+import androidx.ui.foundation.TextFieldValue
+import androidx.ui.foundation.currentTextStyle
+import androidx.ui.foundation.shape.corner.ZeroCornerSize
+import androidx.ui.geometry.Offset
+import androidx.ui.graphics.Color
+import androidx.ui.graphics.Paint
+import androidx.ui.graphics.Shape
+import androidx.ui.layout.padding
+import androidx.ui.layout.preferredSizeIn
+import androidx.ui.material.ripple.ripple
+import androidx.ui.text.TextRange
+import androidx.ui.text.TextStyle
+import androidx.ui.text.lerp
+import androidx.ui.unit.Dp
+import androidx.ui.unit.IntPx
+import androidx.ui.unit.IntPxSize
+import androidx.ui.unit.dp
+import androidx.ui.unit.max
+import java.util.UUID
+
+/**
+ * Material Design implementation of the
+ * [Material Filled TextField](https://material.io/components/text-fields/#filled-text-field)
+ *
+ * @param value the input text to be shown in the text field
+ * @param onValueChange the callback that is triggered when the input service updates the text. An
+ * updated text comes as a parameter of the callback
+ * If you want to observe the cursor location or selection range, use a FilledTextField override
+ * with the [TextFieldValue] parameter instead
+ * @param textStyle the style to be applied to the input text. The default [textStyle] uses the
+ * [currentTextStyle] defined by a theme.
+ * @param label the label to be displayed inside the text field container. The default text style
+ * for internal [Text] is [Typography.caption] when the text field is in focus and
+ * [Typography.subtitle1] when text field is not in focus.
+ * @param placeholder the optional placeholder to be displayed when the text field is in focus and
+ * the input text is empty. The default text style for internal [Text] is [Typography.subtitle1].
+ * @param onFocusChange the callback triggered when the text field gets or loses the focus.
+ * If the boolean parameter value is `true`, it means the text field has a focus, and vice versa.
+ * @param activeColor the color of the label and bottom indicator when the text field is in focus
+ * @param inactiveColor the color of the input text or placeholder when the text field is in
+ * focus, and the color of label and bottom indicator when the text field is not in focus
+ * @param backgroundColor the background color of the text field's container. To a color provided
+ * here there will be applied a transparency alpha defined by Material Design specifications
+ * @param shape the shape of the text field's container
+ */
+@Composable
+fun FilledTextField(
+    value: String,
+    onValueChange: (String) -> Unit,
+    modifier: Modifier = Modifier,
+    textStyle: TextStyle = currentTextStyle(),
+    label: @Composable() () -> Unit,
+    placeholder: @Composable() () -> Unit = emptyContent(),
+    onFocusChange: (Boolean) -> Unit = {},
+    activeColor: Color = MaterialTheme.colors.primary,
+    inactiveColor: Color = MaterialTheme.colors.onSurface,
+    backgroundColor: Color = MaterialTheme.colors.onSurface,
+    shape: Shape =
+        MaterialTheme.shapes.small.copy(bottomLeft = ZeroCornerSize, bottomRight = ZeroCornerSize)
+) {
+    var textFieldValue by state { TextFieldValue() }
+    if (textFieldValue.text != value) {
+        val newSelection = TextRange(
+            textFieldValue.selection.start.coerceIn(0, value.length),
+            textFieldValue.selection.end.coerceIn(0, value.length)
+        )
+        textFieldValue = TextFieldValue(text = value, selection = newSelection)
+    }
+    FilledTextFieldImpl(
+        value = textFieldValue,
+        onValueChange = {
+            val previousValue = textFieldValue.text
+            textFieldValue = it
+            if (previousValue != it.text) {
+                onValueChange(it.text)
+            }
+        },
+        modifier = modifier,
+        textStyle = textStyle,
+        label = label,
+        placeholder = placeholder,
+        onFocusChange = onFocusChange,
+        activeColor = activeColor,
+        inactiveColor = inactiveColor,
+        backgroundColor = backgroundColor,
+        shape = shape
+    )
+}
+
+/**
+ * Material Design implementation of the
+ * [Material Filled TextField](https://material.io/components/text-fields/#filled-text-field)
+ *
+ * @param value the input [TextFieldValue] to be shown in the text field
+ * @param onValueChange the callback that is triggered when the input service updates the text,
+ * selection or cursor. An updated [TextFieldValue] comes as a parameter of the callback
+ * If you only want to observe the text change, use a [FilledTextField] override with the String
+ * parameter instead
+ * @param textStyle the style to be applied to the input text. The default [textStyle] uses the
+ * [currentTextStyle] defined by a theme.
+ * @param label the label to be displayed inside the text field container. The default text style
+ * for internal [Text] is [Typography.caption] when the text field is in focus and
+ * [Typography.subtitle1] when text field is not in focus.
+ * @param placeholder the optional placeholder to be displayed when the text field is in focus and
+ * the input text is empty. The default text style for internal [Text] is [Typography.subtitle1].
+ * @param onFocusChange the callback triggered when the text field gets or loses the focus.
+ * If the boolean parameter value is `true`, it means the text field has a focus, and vice versa.
+ * @param activeColor the color of the label and bottom indicator when the text field is in focus
+ * @param inactiveColor the color of the input text or placeholder when the text field is in
+ * focus, and the color of label and bottom indicator when the text field is not in focus
+ * @param backgroundColor the background color of the text field's container. To a color provided
+ * here there will be applied a transparency alpha defined by Material Design specifications
+ * @param shape the shape of the text field's container
+ */
+@Composable
+fun FilledTextField(
+    value: TextFieldValue,
+    onValueChange: (TextFieldValue) -> Unit,
+    modifier: Modifier = Modifier,
+    textStyle: TextStyle = currentTextStyle(),
+    label: @Composable() () -> Unit,
+    placeholder: @Composable() () -> Unit = emptyContent(),
+    onFocusChange: (Boolean) -> Unit = {},
+    activeColor: Color = MaterialTheme.colors.primary,
+    inactiveColor: Color = MaterialTheme.colors.onSurface,
+    backgroundColor: Color = MaterialTheme.colors.onSurface,
+    shape: Shape =
+        MaterialTheme.shapes.small.copy(bottomLeft = ZeroCornerSize, bottomRight = ZeroCornerSize)
+) {
+    FilledTextFieldImpl(
+        value = value,
+        onValueChange = onValueChange,
+        modifier = modifier,
+        textStyle = textStyle,
+        label = label,
+        placeholder = placeholder,
+        onFocusChange = onFocusChange,
+        activeColor = activeColor,
+        inactiveColor = inactiveColor,
+        backgroundColor = backgroundColor,
+        shape = shape
+    )
+}
+
+/**
+ * Implementation of the [FilledTextField]
+ */
+@Composable
+private fun FilledTextFieldImpl(
+    value: TextFieldValue,
+    onValueChange: (TextFieldValue) -> Unit,
+    modifier: Modifier,
+    textStyle: TextStyle,
+    label: @Composable() () -> Unit,
+    placeholder: @Composable() () -> Unit,
+    // TODO (b/152968058) finalise this API
+    onFocusChange: (Boolean) -> Unit,
+    activeColor: Color,
+    inactiveColor: Color,
+    backgroundColor: Color,
+    shape: Shape
+) {
+    val focusIdentifier = remember { UUID.randomUUID().toString() }
+    var shouldFocus by state { false }
+    var focused by state { false }
+    val inputState = stateFor(value.text, focused) {
+        when {
+            focused -> InputPhase.Focused
+            value.text.isEmpty() -> InputPhase.UnfocusedEmpty
+            else -> InputPhase.UnfocusedNotEmpty
+        }
+    }
+
+    val decoratedPlaceholder = @Composable {
+        if (inputState.value == InputPhase.Focused && value.text.isEmpty()) {
+            Decoration(
+                contentColor = inactiveColor,
+                typography = MaterialTheme.typography.subtitle1,
+                emphasis = EmphasisAmbient.current.medium,
+                children = placeholder
+            )
+        }
+    }
+    val decoratedTextField = @Composable { tagModifier: Modifier ->
+        Decoration(
+            contentColor = inactiveColor,
+            typography = MaterialTheme.typography.subtitle1,
+            emphasis = EmphasisAmbient.current.high
+        ) {
+            TextField(
+                value = value,
+                modifier = tagModifier,
+                textStyle = textStyle,
+                onValueChange = onValueChange,
+                onFocus = {
+                    focused = true
+                    onFocusChange(true)
+                },
+                onBlur = {
+                    focused = false
+                    onFocusChange(false)
+                },
+                focusIdentifier = focusIdentifier
+            )
+        }
+    }
+
+    val textFieldModifier = Modifier.preferredSizeIn(
+        minWidth = TextFieldMinWidth,
+        minHeight = TextFieldMinHeight
+    ) + modifier
+
+    Surface(
+        modifier = textFieldModifier,
+        shape = shape,
+        color = backgroundColor.copy(alpha = ContainerAlpha)
+    ) {
+        Clickable(onClick = { shouldFocus = true }, modifier = Modifier.ripple(false)) {
+            if (shouldFocus) {
+                FocusManagerAmbient.current.requestFocusById(focusIdentifier)
+                shouldFocus = false
+            }
+
+            val emphasisLevels = EmphasisAmbient.current
+            val emphasizedActiveColor = emphasisLevels.high.emphasize(activeColor)
+            val labelInactiveColor = emphasisLevels.medium.emphasize(inactiveColor)
+            val indicatorInactiveColor = inactiveColor.copy(alpha = IndicatorInactiveAlpha)
+
+            TextFieldTransitionScope.transition(
+                inputState = inputState.value,
+                activeColor = emphasizedActiveColor,
+                labelInactiveColor = labelInactiveColor,
+                indicatorInactiveColor = indicatorInactiveColor
+            ) { labelProgress, labelColor, indicatorWidth, indicatorColor ->
+                // TODO(soboleva): figure out how this will play with the textStyle provided in label slot
+                val labelAnimatedStyle = lerp(
+                    MaterialTheme.typography.subtitle1,
+                    MaterialTheme.typography.caption,
+                    labelProgress
+                )
+                val decoratedLabel = @Composable {
+                    Decoration(
+                        contentColor = labelColor,
+                        typography = labelAnimatedStyle,
+                        children = label
+                    )
+                }
+                val paddingAndIndicator = Modifier
+                    .drawIndicatorLine(indicatorWidth, indicatorColor)
+                    .padding(start = TextHorizontalPadding, end = TextHorizontalPadding)
+                TextFieldLayout(
+                    animationProgress = labelProgress,
+                    modifier = paddingAndIndicator,
+                    placeholder = decoratedPlaceholder,
+                    label = decoratedLabel,
+                    textField = decoratedTextField
+                )
+            }
+        }
+    }
+}
+
+/**
+ * Sets content color, typography and emphasis for [children] composable
+ */
+@Composable
+private fun Decoration(
+    contentColor: Color,
+    typography: TextStyle,
+    emphasis: Emphasis? = null,
+    children: @Composable() () -> Unit
+) {
+    ProvideTextStyle(typography) {
+        Providers(ContentColorAmbient provides contentColor) {
+            if (emphasis != null) {
+                ProvideEmphasis(emphasis, children)
+            } else {
+                children()
+            }
+        }
+    }
+}
+
+/**
+ * Layout of the text field, label and placeholder
+ */
+@Composable
+private fun TextFieldLayout(
+    animationProgress: Float,
+    modifier: Modifier,
+    placeholder: @Composable() () -> Unit,
+    label: @Composable() () -> Unit,
+    textField: @Composable() (Modifier) -> Unit
+) {
+    Layout(
+        children = {
+            Box(modifier = Modifier.tag(PlaceholderTag), children = placeholder)
+            Box(modifier = Modifier.tag(LabelTag), children = label)
+            textField(Modifier.tag(TextFieldTag))
+        },
+        modifier = modifier
+    ) { measurables, constraints, _ ->
+        val placeholderPlaceable =
+            measurables.find { it.tag == PlaceholderTag }?.measure(constraints)
+
+        val baseLineOffset = FirstBaselineOffset.toIntPx()
+
+        val labelConstraints = constraints
+            .offset(vertical = -LastBaselineOffset.toIntPx())
+            .copy(minWidth = IntPx.Zero, minHeight = IntPx.Zero)
+        val labelPlaceable = measurables.first { it.tag == LabelTag }.measure(labelConstraints)
+        val labelBaseline = labelPlaceable[LastBaseline] ?: labelPlaceable.height
+        val labelEndPosition = (baseLineOffset - labelBaseline).coerceAtLeast(IntPx.Zero)
+        val effectiveLabelBaseline = max(labelBaseline, baseLineOffset)
+
+        val textfieldPlaceable = measurables
+            .first { it.tag == TextFieldTag }
+            .measure(labelConstraints.offset(vertical = -effectiveLabelBaseline))
+        val textfieldFirstBaseline = requireNotNull(textfieldPlaceable[FirstBaseline]) {
+            "No text first baseline."
+        }
+        val textfieldLastBaseline = requireNotNull(textfieldPlaceable[LastBaseline]) {
+            "No text last baseline."
+        }
+        val textfieldPositionY = effectiveLabelBaseline + baseLineOffset - textfieldFirstBaseline
+
+        val width = max(textfieldPlaceable.width, constraints.minWidth)
+        val height = max(
+            textfieldPositionY + textfieldLastBaseline + LastBaselineOffset.toIntPx(),
+            constraints.minHeight
+        )
+
+        layout(width, height) {
+            // Text field and label are placed with respect to the baseline offsets.
+            // But if label is empty, then the text field should be centered vertically.
+            if (labelPlaceable.width != IntPx.Zero) {
+                placeLabelAndTextfield(
+                    width,
+                    height,
+                    textfieldPlaceable,
+                    labelPlaceable,
+                    labelEndPosition,
+                    textfieldPositionY,
+                    animationProgress
+                )
+            } else {
+                placeTextfield(width, height, textfieldPlaceable)
+            }
+            placeholderPlaceable?.place(IntPx.Zero, textfieldPositionY)
+        }
+    }
+}
+
+/**
+ * A draw modifier that draws a bottom indicator line
+ */
+@Composable
+private fun Modifier.drawIndicatorLine(lineWidth: Dp, color: Color): Modifier {
+    val paint = remember { Paint() }
+    return drawBehind {
+        val strokeWidth = lineWidth.value * density
+        paint.strokeWidth = strokeWidth
+        paint.color = color
+        val y = size.height.value - strokeWidth / 2
+        drawLine(
+            Offset(0f, y),
+            Offset(size.width.value, y),
+            paint
+        )
+    }
+}
+
+/**
+ * Places a text field and a label with respect to the baseline offsets
+ */
+private fun Placeable.PlacementScope.placeLabelAndTextfield(
+    width: IntPx,
+    height: IntPx,
+    textfieldPlaceable: Placeable,
+    labelPlaceable: Placeable,
+    labelEndPosition: IntPx,
+    textPosition: IntPx,
+    animationProgress: Float
+) {
+    val labelCenterPosition = Alignment.CenterStart.align(
+        IntPxSize(
+            width - labelPlaceable.width,
+            height - labelPlaceable.height
+        )
+    )
+    val labelDistance = labelCenterPosition.y - labelEndPosition
+    val labelPositionY =
+        labelCenterPosition.y - labelDistance * animationProgress
+    labelPlaceable.place(IntPx.Zero, labelPositionY)
+
+    textfieldPlaceable.place(IntPx.Zero, textPosition)
+}
+
+/**
+ * Places a text field center vertically
+ */
+private fun Placeable.PlacementScope.placeTextfield(
+    width: IntPx,
+    height: IntPx,
+    textPlaceable: Placeable
+) {
+    val textCenterPosition = Alignment.CenterStart.align(
+        IntPxSize(
+            width - textPlaceable.width,
+            height - textPlaceable.height
+        )
+    )
+    textPlaceable.place(IntPx.Zero, textCenterPosition.y)
+}
+
+private object TextFieldTransitionScope {
+    private val LabelColorProp = ColorPropKey()
+    private val LabelProgressProp = FloatPropKey()
+    private val IndicatorColorProp = ColorPropKey()
+    private val IndicatorWidthProp = DpPropKey()
+
+    @Composable
+    fun transition(
+        inputState: InputPhase,
+        activeColor: Color,
+        labelInactiveColor: Color,
+        indicatorInactiveColor: Color,
+        children: @Composable() (
+            labelProgress: Float,
+            labelColor: Color,
+            indicatorWidth: Dp,
+            indicatorColor: Color
+        ) -> Unit
+    ) {
+        val definition = remember(activeColor, labelInactiveColor, indicatorInactiveColor) {
+            generateLabelTransitionDefinition(
+                activeColor,
+                labelInactiveColor,
+                indicatorInactiveColor
+            )
+        }
+        Transition(definition = definition, toState = inputState) { state ->
+            children(
+                state[LabelProgressProp],
+                state[LabelColorProp],
+                state[IndicatorWidthProp],
+                state[IndicatorColorProp]
+            )
+        }
+    }
+
+    private fun generateLabelTransitionDefinition(
+        activeColor: Color,
+        labelInactiveColor: Color,
+        indicatorInactiveColor: Color
+    ) = transitionDefinition {
+        state(InputPhase.Focused) {
+            this[LabelColorProp] = activeColor
+            this[IndicatorColorProp] = activeColor
+            this[LabelProgressProp] = 1f
+            this[IndicatorWidthProp] = IndicatorFocusedWidth
+        }
+        state(InputPhase.UnfocusedEmpty) {
+            this[LabelColorProp] = labelInactiveColor
+            this[IndicatorColorProp] = indicatorInactiveColor
+            this[LabelProgressProp] = 0f
+            this[IndicatorWidthProp] = IndicatorUnfocusedWidth
+        }
+        state(InputPhase.UnfocusedNotEmpty) {
+            this[LabelColorProp] = labelInactiveColor
+            this[IndicatorColorProp] = indicatorInactiveColor
+            this[LabelProgressProp] = 1f
+            this[IndicatorWidthProp] = 1.dp
+        }
+
+        transition(fromState = InputPhase.Focused, toState = InputPhase.UnfocusedEmpty) {
+            labelTransition()
+            indicatorTransition()
+        }
+        transition(fromState = InputPhase.Focused, toState = InputPhase.UnfocusedNotEmpty) {
+            indicatorTransition()
+        }
+        transition(fromState = InputPhase.UnfocusedNotEmpty, toState = InputPhase.Focused) {
+            indicatorTransition()
+        }
+        transition(fromState = InputPhase.UnfocusedEmpty, toState = InputPhase.Focused) {
+            labelTransition()
+            indicatorTransition()
+        }
+        // below states are needed to support case when a single state is used to control multiple
+        // text fields.
+        transition(fromState = InputPhase.UnfocusedNotEmpty, toState = InputPhase.UnfocusedEmpty) {
+            labelTransition()
+        }
+        transition(fromState = InputPhase.UnfocusedEmpty, toState = InputPhase.UnfocusedNotEmpty) {
+            labelTransition()
+        }
+    }
+
+    private fun TransitionSpec<InputPhase>.indicatorTransition() {
+        IndicatorColorProp using tweenAnimation()
+        IndicatorWidthProp using tweenAnimation()
+    }
+    private fun TransitionSpec<InputPhase>.labelTransition() {
+        LabelColorProp using tweenAnimation()
+        LabelProgressProp using tweenAnimation()
+    }
+    private fun <T> tweenAnimation() = TweenBuilder<T>().apply { duration = AnimationDuration }
+}
+
+/**
+ * An internal state used to animate a label and an indicator.
+ */
+private enum class InputPhase {
+    // Text field is focused
+    Focused,
+    // Text field is not focused and input text is empty
+    UnfocusedEmpty,
+    // Text field is not focused but input text is not empty
+    UnfocusedNotEmpty
+}
+
+private const val TextFieldTag = "TextField"
+private const val PlaceholderTag = "Hint"
+private const val LabelTag = "Label"
+
+private const val AnimationDuration = 150
+private val IndicatorUnfocusedWidth = 1.dp
+private val IndicatorFocusedWidth = 2.dp
+private const val IndicatorInactiveAlpha = 0.42f
+private const val ContainerAlpha = 0.12f
+private val TextFieldMinHeight = 56.dp
+private val TextFieldMinWidth = 280.dp
+private val FirstBaselineOffset = 20.dp
+private val TextHorizontalPadding = 16.dp
+private val LastBaselineOffset = 16.dp
\ No newline at end of file
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/ProgressIndicator.kt b/ui/ui-material/src/main/java/androidx/ui/material/ProgressIndicator.kt
index 27e1d0ec..93ca09c 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/ProgressIndicator.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/ProgressIndicator.kt
@@ -28,8 +28,8 @@
 import androidx.ui.animation.Transition
 import androidx.ui.core.DensityAmbient
 import androidx.ui.core.Modifier
+import androidx.ui.core.DrawScope
 import androidx.ui.foundation.Canvas
-import androidx.ui.foundation.CanvasScope
 import androidx.ui.foundation.DeterminateProgressIndicator
 import androidx.ui.geometry.Offset
 import androidx.ui.geometry.Rect
@@ -54,7 +54,7 @@
 @Composable
 fun LinearProgressIndicator(
     @FloatRange(from = 0.0, to = 1.0) progress: Float,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     color: Color = MaterialTheme.colors.primary
 ) {
     DeterminateProgressIndicator(progress = progress) {
@@ -78,7 +78,7 @@
  */
 @Composable
 fun LinearProgressIndicator(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     color: Color = MaterialTheme.colors.primary
 ) {
     Transition(
@@ -107,7 +107,7 @@
     }
 }
 
-private fun CanvasScope.drawLinearIndicator(
+private fun DrawScope.drawLinearIndicator(
     startFraction: Float,
     endFraction: Float,
     paint: Paint
@@ -124,7 +124,7 @@
     drawLine(Offset(barStart, yOffset), Offset(barEnd, yOffset), paint)
 }
 
-private fun CanvasScope.drawLinearIndicatorBackground(paint: Paint) =
+private fun DrawScope.drawLinearIndicatorBackground(paint: Paint) =
     drawLinearIndicator(0f, 1f, paint)
 
 /**
@@ -138,7 +138,7 @@
 @Composable
 fun CircularProgressIndicator(
     @FloatRange(from = 0.0, to = 1.0) progress: Float,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     color: Color = MaterialTheme.colors.primary
 ) {
     DeterminateProgressIndicator(progress = progress) {
@@ -163,7 +163,7 @@
  */
 @Composable
 fun CircularProgressIndicator(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     color: Color = MaterialTheme.colors.primary
 ) {
     val paint = paint(color, StrokeCap.square)
@@ -195,7 +195,7 @@
     }
 }
 
-private fun CanvasScope.drawCircularIndicator(startAngle: Float, sweep: Float, paint: Paint) {
+private fun DrawScope.drawCircularIndicator(startAngle: Float, sweep: Float, paint: Paint) {
     val diameter = size.width.value
     // To draw this circle we need a rect with edges that line up with the midpoint of the stroke.
     // To do this we need to remove half the stroke width from the total diameter for both sides.
@@ -211,13 +211,13 @@
     drawArc(rect, startAngle, sweep, false, paint)
 }
 
-private fun CanvasScope.drawDeterminateCircularIndicator(
+private fun DrawScope.drawDeterminateCircularIndicator(
     startAngle: Float,
     sweep: Float,
     paint: Paint
 ) = drawCircularIndicator(startAngle, sweep, paint)
 
-private fun CanvasScope.drawIndeterminateCircularIndicator(
+private fun DrawScope.drawIndeterminateCircularIndicator(
     startAngle: Float,
     sweep: Float,
     paint: Paint
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/RadioButton.kt b/ui/ui-material/src/main/java/androidx/ui/material/RadioButton.kt
index 2712777..083dbab 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/RadioButton.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/RadioButton.kt
@@ -24,9 +24,9 @@
 import androidx.ui.animation.DpPropKey
 import androidx.ui.animation.Transition
 import androidx.ui.core.Modifier
+import androidx.ui.core.DrawScope
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.Canvas
-import androidx.ui.foundation.CanvasScope
 import androidx.ui.foundation.Text
 import androidx.ui.foundation.selection.MutuallyExclusiveSetItem
 import androidx.ui.geometry.Offset
@@ -106,6 +106,10 @@
     }
 }
 
+/**
+ * Scope of [RadioGroup] to grant access to [RadioGroupItem] and others. This scope will be
+ * provided automatically to the children of [RadioGroup].
+ */
 @Stable
 class RadioGroupScope internal constructor() {
 
@@ -220,7 +224,7 @@
     }
 }
 
-private fun CanvasScope.drawRadio(
+private fun DrawScope.drawRadio(
     color: Color,
     outerRadius: Dp,
     innerRadius: Dp,
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Scaffold.kt b/ui/ui-material/src/main/java/androidx/ui/material/Scaffold.kt
index f6393c1..8aa20f3 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Scaffold.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Scaffold.kt
@@ -194,7 +194,7 @@
         DockedBottomBar(
             modifier = modifier,
             fabPosition = fabPos,
-            fab = { FabContainer(fabPos, Modifier.None, scaffoldState, fab) },
+            fab = { FabContainer(fabPos, Modifier, scaffoldState, fab) },
             bottomBar = { BottomBarContainer(scaffoldState, bottomBar) }
         )
     } else {
@@ -310,7 +310,7 @@
  * Default slot implementation for Scaffold slots content
  */
 @Composable
-private fun ScaffoldSlot(modifier: Modifier = Modifier.None, content: @Composable() () -> Unit) {
+private fun ScaffoldSlot(modifier: Modifier = Modifier, content: @Composable() () -> Unit) {
     Stack(modifier) { content() }
 }
 
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Slider.kt b/ui/ui-material/src/main/java/androidx/ui/material/Slider.kt
index 3afdce9..f691613 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Slider.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Slider.kt
@@ -16,6 +16,8 @@
 
 package androidx.ui.material
 
+import android.annotation.SuppressLint
+import androidx.animation.AnimatedFloat
 import androidx.animation.AnimationClockObservable
 import androidx.animation.AnimationEndReason
 import androidx.animation.TargetAnimation
@@ -24,14 +26,13 @@
 import androidx.compose.Composable
 import androidx.compose.remember
 import androidx.compose.state
-import androidx.ui.animation.AnimatedFloatModel
 import androidx.ui.animation.asDisposableClock
 import androidx.ui.core.Alignment
 import androidx.ui.core.AnimationClockAmbient
 import androidx.ui.core.DensityAmbient
 import androidx.ui.core.Modifier
 import androidx.ui.core.WithConstraints
-import androidx.ui.core.gesture.PressIndicatorGestureDetector
+import androidx.ui.core.gesture.pressIndicatorGestureFilter
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.Canvas
 import androidx.ui.foundation.animation.FlingConfig
@@ -62,94 +63,6 @@
 import kotlin.math.abs
 
 /**
- * Create and [remember] the state for a [Slider] based on the parameters, using the
- * [ambient animation clock][AnimationClockAmbient].
- *
- * @param initial initial value for the Slider when created. If outside of range provided,
- * initial position will be coerced to this range
- * @param valueRange range of values that Slider value can take
- * @param steps if greater than 0, specifies the amounts of discrete values, evenly distributed
- * between across the whole value range. If 0, slider will behave as a continuous slider and allow
- * to choose any value from the range specified
- */
-@Composable
-fun SliderPosition(
-    initial: Float = 0f,
-    valueRange: ClosedFloatingPointRange<Float> = 0f..1f,
-    @IntRange(from = 0) steps: Int = 0
-): SliderPosition {
-    val clock = AnimationClockAmbient.current.asDisposableClock()
-    return remember(initial, valueRange, steps, clock) {
-        SliderPosition(initial, valueRange, steps, clock)
-    }
-}
-
-/**
- * State for [Slider] that represents the Slider value, its bounds and optional amount of steps
- * evenly distributed across the Slider range.
- *
- * @param initial initial value for the Slider when created. If outside of range provided,
- * initial position will be coerced to this range
- * @param valueRange range of values that Slider value can take
- * @param steps if greater than 0, specifies the amounts of discrete values, evenly distributed
- * between across the whole value range. If 0, slider will behave as a continuous slider and allow
- * to choose any value from the range specified
- */
-class SliderPosition(
-    initial: Float = 0f,
-    val valueRange: ClosedFloatingPointRange<Float> = 0f..1f,
-    @IntRange(from = 0) steps: Int = 0,
-    animatedClock: AnimationClockObservable
-) {
-
-    internal val startValue: Float = valueRange.start
-    internal val endValue: Float = valueRange.endInclusive
-
-    init {
-        require(steps >= 0) {
-            "steps should be >= 0"
-        }
-    }
-
-    /**
-     * Current Slider value. If set outside of range provided, value will be coerced to this range
-     */
-    var value: Float
-        get() = scale(startPx, endPx, holder.value, startValue, endValue)
-        set(value) {
-            holder.snapTo(scale(startValue, endValue, value, startPx, endPx))
-        }
-
-    private var endPx = Float.MAX_VALUE
-    private var startPx = Float.MIN_VALUE
-
-    internal fun setBounds(min: Float, max: Float) {
-        if (startPx == min && endPx == max) return
-        val newValue = scale(startPx, endPx, holder.value, min, max)
-        startPx = min
-        endPx = max
-        holder.setBounds(min, max)
-        anchorsPx = tickFractions.map {
-            lerp(
-                startPx,
-                endPx,
-                it
-            )
-        }
-        holder.snapTo(newValue)
-    }
-
-    internal val holder =
-        AnimatedFloatModel(scale(startValue, endValue, initial, startPx, endPx), animatedClock)
-
-    internal val tickFractions: List<Float> =
-        if (steps == 0) emptyList() else List(steps + 2) { it.toFloat() / (steps + 1) }
-
-    internal var anchorsPx: List<Float> = emptyList()
-        private set
-}
-
-/**
  * Sliders allow users to make selections from a range of values.
  *
  * Sliders reflect a range of values along a bar, from which users may select a single value.
@@ -160,16 +73,20 @@
  *
  * @sample androidx.ui.material.samples.SliderSample
  *
- * You can allow the user to choose only between predefined set of values by providing
- * discrete values in [SliderPosition].
- *
- * You can do it by specifying the amount of steps between min and max values:
+ * You can allow the user to choose only between predefined set of values by specifying the amount
+ * of steps between min and max values:
  *
  * @sample androidx.ui.material.samples.StepsSliderSample
  *
- * @param position [SliderPosition] object to represent value of the Slider
+ * @param value current value of the Slider. If outside of [valueRange] provided, value will be
+ * coerced to this range.
  * @param onValueChange lambda in which value should be updated
  * @param modifier modifiers for the Slider layout
+ * @param valueRange range of values that Slider value can take. Passed [value] will be coerced to
+ * this range
+ * @param steps if greater than 0, specifies the amounts of discrete values, evenly distributed
+ * between across the whole value range. If 0, slider will behave as a continuous slider and allow
+ * to choose any value from the range specified
  * @param onValueChangeEnd lambda to be invoked when value change has ended. This callback
  * shouldn't be used to update the slider value (use [onValueChange] for that), but rather to
  * know when the user has completed selecting a new value by ending a drag or a click.
@@ -177,12 +94,20 @@
  */
 @Composable
 fun Slider(
-    position: SliderPosition,
-    onValueChange: (Float) -> Unit = { position.value = it },
-    modifier: Modifier = Modifier.None,
+    value: Float,
+    onValueChange: (Float) -> Unit,
+    modifier: Modifier = Modifier,
+    valueRange: ClosedFloatingPointRange<Float> = 0f..1f,
+    @IntRange(from = 0) steps: Int = 0,
     onValueChangeEnd: () -> Unit = {},
     color: Color = MaterialTheme.colors.primary
 ) {
+    val clock = AnimationClockAmbient.current.asDisposableClock()
+    val position = remember(valueRange, steps) {
+        SliderPosition(value, valueRange, steps, clock, onValueChange)
+    }
+    position.onValueChange = onValueChange
+    position.scaledValue = value
     Semantics(container = true, mergeAllDescendants = true) {
         Box(modifier = modifier) {
             WithConstraints { constraints, _ ->
@@ -190,18 +115,10 @@
                 val minPx = 0f
                 position.setBounds(minPx, maxPx)
 
-                fun Float.toSliderPosition(): Float =
-                    scale(minPx, maxPx, this, position.startValue, position.endValue)
-
-                val flingConfig =
-                    if (position.anchorsPx.isNotEmpty()) {
-                        SliderFlingConfig(position, position.anchorsPx) { endValue ->
-                            onValueChange(endValue.toSliderPosition())
-                            onValueChangeEnd()
-                        }
-                    } else {
-                        null
-                    }
+                val flingConfig = SliderFlingConfig(position, position.anchorsPx) { endValue ->
+                    position.holder.snapTo(endValue)
+                    onValueChangeEnd()
+                }
                 val gestureEndAction = { velocity: Float ->
                     if (flingConfig != null) {
                         position.holder.fling(flingConfig, velocity)
@@ -210,9 +127,9 @@
                     }
                 }
                 val pressed = state { false }
-                val press = PressIndicatorGestureDetector(
+                val press = Modifier.pressIndicatorGestureFilter(
                     onStart = { pos ->
-                        onValueChange(pos.x.value.toSliderPosition())
+                        position.holder.snapTo(pos.x.value)
                         pressed.value = true
                     },
                     onStop = {
@@ -223,9 +140,9 @@
                 val drag = Modifier.draggable(
                     dragDirection = DragDirection.Horizontal,
                     onDragDeltaConsumptionRequested = { delta ->
-                        val old = position.holder.value
-                        onValueChange((position.holder.value + delta).toSliderPosition())
-                        position.holder.value - old
+                        position.holder.snapTo(position.holder.value + delta)
+                        // consume all so slider won't participate in nested scrolling
+                        delta
                     },
                     onDragStarted = { pressed.value = true },
                     onDragStopped = { velocity ->
@@ -234,7 +151,14 @@
                     },
                     startDragImmediately = position.holder.isRunning
                 )
-                SliderImpl(position, color, maxPx, pressed.value, modifier = press + drag)
+                val coerced = value.coerceIn(position.startValue, position.endValue)
+                val fraction = calcFraction(position.startValue, position.endValue, coerced)
+                Semantics(container = true, properties = { accessibilityValue = "$coerced" }) {
+                    SliderImpl(
+                        fraction, position.tickFractions, color, maxPx, pressed.value,
+                        modifier = press.plus(drag)
+                    )
+                }
             }
         }
     }
@@ -242,7 +166,8 @@
 
 @Composable
 private fun SliderImpl(
-    position: SliderPosition,
+    positionFraction: Float,
+    tickFractions: List<Float>,
     color: Color,
     width: Float,
     pressed: Boolean,
@@ -251,22 +176,19 @@
     val widthDp = with(DensityAmbient.current) {
         width.px.toDp()
     }
-    Semantics(container = true, properties = { accessibilityValue = "${position.value}" }) {
-        Stack(modifier + DefaultSliderConstraints) {
-            val thumbSize = ThumbRadius * 2
-            val fraction = with(position) { calcFraction(startValue, endValue, this.value) }
-            val offset = (widthDp - thumbSize) * fraction
-            val center = Modifier.gravity(Alignment.CenterStart)
-            Track(center.fillMaxSize(), color, position)
-            Box(center.padding(start = offset)) {
-                Surface(
-                    shape = CircleShape,
-                    color = color,
-                    elevation = if (pressed) 6.dp else 1.dp,
-                    modifier = Modifier.ripple(bounded = false)
-                ) {
-                    Spacer(Modifier.preferredSize(thumbSize, thumbSize))
-                }
+    Stack(modifier + DefaultSliderConstraints) {
+        val thumbSize = ThumbRadius * 2
+        val offset = (widthDp - thumbSize) * positionFraction
+        val center = Modifier.gravity(Alignment.CenterStart)
+        Track(center.fillMaxSize(), color, positionFraction, tickFractions)
+        Box(center.padding(start = offset)) {
+            Surface(
+                shape = CircleShape,
+                color = color,
+                elevation = if (pressed) 6.dp else 1.dp,
+                modifier = Modifier.ripple(bounded = false)
+            ) {
+                Spacer(Modifier.preferredSize(thumbSize, thumbSize))
             }
         }
     }
@@ -276,7 +198,8 @@
 private fun Track(
     modifier: Modifier,
     color: Color,
-    position: SliderPosition
+    positionFraction: Float,
+    tickFractions: List<Float>
 ) {
     val activeTickColor = MaterialTheme.colors.onPrimary.copy(alpha = TickColorAlpha)
     val inactiveTickColor = color.copy(alpha = TickColorAlpha)
@@ -289,7 +212,6 @@
     }
     Canvas(modifier) {
         paint.strokeWidth = TrackHeight.toPx().value
-        val fraction = with(position) { calcFraction(startValue, endValue, this.value) }
         val parentRect = size.toRect()
         val thumbPx = ThumbRadius.toPx().value
         val centerHeight = size.height.value / 2
@@ -298,12 +220,12 @@
         paint.color = color.copy(alpha = InactiveTrackColorAlpha)
         drawLine(sliderStart, sliderMax, paint)
         val sliderValue = Offset(
-            sliderStart.dx + (sliderMax.dx - sliderStart.dx) * fraction,
+            sliderStart.dx + (sliderMax.dx - sliderStart.dx) * positionFraction,
             centerHeight
         )
         paint.color = color
         drawLine(sliderStart, sliderValue, paint)
-        position.tickFractions.groupBy { it > fraction }.forEach { (afterFraction, list) ->
+        tickFractions.groupBy { it > positionFraction }.forEach { (afterFraction, list) ->
             paint.color = if (afterFraction) inactiveTickColor else activeTickColor
             val points = list.map {
                 Offset(Offset.lerp(sliderStart, sliderMax, it).dx, centerHeight)
@@ -326,21 +248,106 @@
     value: SliderPosition,
     anchors: List<Float>,
     onSuccessfulEnd: (Float) -> Unit
-): FlingConfig {
-    val adjustTarget: (Float) -> TargetAnimation? = { _ ->
-        val now = value.holder.value
-        val point = anchors.minBy { abs(it - now) }
-        val adjusted = point ?: now
-        TargetAnimation(adjusted, SliderToTickAnimation)
+): FlingConfig? {
+    if (anchors.isEmpty()) {
+        return null
+    } else {
+        val adjustTarget: (Float) -> TargetAnimation? = { _ ->
+            val now = value.holder.value
+            val point = anchors.minBy { abs(it - now) }
+            val adjusted = point ?: now
+            TargetAnimation(adjusted, SliderToTickAnimation)
+        }
+        return FlingConfig(
+            adjustTarget = adjustTarget,
+            onAnimationEnd = { reason, endValue, _ ->
+                if (reason != AnimationEndReason.Interrupted) {
+                    onSuccessfulEnd(endValue)
+                }
+            }
+        )
     }
-    return FlingConfig(
-        adjustTarget = adjustTarget,
-        onAnimationEnd = { reason, endValue, _ ->
-            if (reason != AnimationEndReason.Interrupted) {
-                onSuccessfulEnd(endValue)
+}
+
+/**
+ * Internal state for [Slider] that represents the Slider value, its bounds and optional amount of
+ * steps evenly distributed across the Slider range.
+ *
+ * @param initial initial value for the Slider when created. If outside of range provided,
+ * initial position will be coerced to this range
+ * @param valueRange range of values that Slider value can take
+ * @param steps if greater than 0, specifies the amounts of discrete values, evenly distributed
+ * between across the whole value range. If 0, slider will behave as a continuous slider and allow
+ * to choose any value from the range specified
+ */
+private class SliderPosition(
+    initial: Float = 0f,
+    val valueRange: ClosedFloatingPointRange<Float> = 0f..1f,
+    @IntRange(from = 0) steps: Int = 0,
+    animatedClock: AnimationClockObservable,
+    var onValueChange: (Float) -> Unit
+) {
+
+    internal val startValue: Float = valueRange.start
+    internal val endValue: Float = valueRange.endInclusive
+
+    init {
+        require(steps >= 0) {
+            "steps should be >= 0"
+        }
+    }
+
+    internal var scaledValue: Float = initial
+        set(value) {
+            val scaled = scale(startValue, endValue, value, startPx, endPx)
+            // floating point error due to rescaling
+            if ((scaled - holder.value) > floatPointMistakeCorrection) {
+                holder.snapTo(scaled)
             }
         }
-    )
+
+    private val floatPointMistakeCorrection = (valueRange.endInclusive - valueRange.start) / 100
+
+    private var endPx = Float.MAX_VALUE
+    private var startPx = Float.MIN_VALUE
+
+    internal fun setBounds(min: Float, max: Float) {
+        if (startPx == min && endPx == max) return
+        val newValue = scale(startPx, endPx, holder.value, min, max)
+        startPx = min
+        endPx = max
+        holder.setBounds(min, max)
+        anchorsPx = tickFractions.map {
+            lerp(startPx, endPx, it)
+        }
+        holder.snapTo(newValue)
+    }
+
+    internal val tickFractions: List<Float> =
+        if (steps == 0) emptyList() else List(steps + 2) { it.toFloat() / (steps + 1) }
+
+    internal var anchorsPx: List<Float> = emptyList()
+        private set
+
+    @SuppressLint("UnnecessaryLambdaCreation")
+    internal val holder =
+        CallbackBasedAnimatedFloat(
+            scale(startValue, endValue, initial, startPx, endPx),
+            animatedClock
+        ) { onValueChange(scale(startPx, endPx, it, startValue, endValue)) }
+}
+
+private class CallbackBasedAnimatedFloat(
+    initial: Float,
+    clock: AnimationClockObservable,
+    var onValue: (Float) -> Unit
+) : AnimatedFloat(clock) {
+
+    override var value = initial
+        set(value) {
+            onValue(value)
+            field = value
+        }
 }
 
 private val ThumbRadius = 10.dp
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Snackbar.kt b/ui/ui-material/src/main/java/androidx/ui/material/Snackbar.kt
index 3d0296a..a57dacf 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Snackbar.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Snackbar.kt
@@ -17,8 +17,8 @@
 package androidx.ui.material
 
 import androidx.compose.Composable
-import androidx.ui.core.FirstBaseline
-import androidx.ui.core.LastBaseline
+import androidx.ui.text.FirstBaseline
+import androidx.ui.text.LastBaseline
 import androidx.ui.core.Layout
 import androidx.ui.core.Modifier
 import androidx.ui.core.tag
@@ -66,7 +66,7 @@
 fun Snackbar(
     text: @Composable() () -> Unit,
     action: @Composable() (() -> Unit)? = null,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     actionOnNewLine: Boolean = false,
     shape: Shape = MaterialTheme.shapes.small,
     elevation: Dp = 6.dp
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Surface.kt b/ui/ui-material/src/main/java/androidx/ui/material/Surface.kt
index 2c74a69..3d8a3c7 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Surface.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Surface.kt
@@ -17,12 +17,13 @@
 package androidx.ui.material
 
 import androidx.compose.Composable
+import androidx.compose.Providers
 import androidx.ui.core.Layout
 import androidx.ui.core.Modifier
 import androidx.ui.core.clip
 import androidx.ui.core.drawShadow
 import androidx.ui.foundation.Border
-import androidx.ui.foundation.ProvideContentColor
+import androidx.ui.foundation.ContentColorAmbient
 import androidx.ui.foundation.ProvideTextStyle
 import androidx.ui.foundation.Text
 import androidx.ui.foundation.drawBackground
@@ -78,7 +79,7 @@
  */
 @Composable
 fun Surface(
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     shape: Shape = RectangleShape,
     color: Color = MaterialTheme.colors.surface,
     contentColor: Color = contentColorFor(color),
@@ -88,14 +89,14 @@
 ) {
     SurfaceLayout(
         modifier.drawShadow(shape = shape, elevation = elevation, clipToOutline = false)
-            .plus(if (border != null) Modifier.drawBorder(border, shape) else Modifier.None)
+            .plus(if (border != null) Modifier.drawBorder(border, shape) else Modifier)
             .drawBackground(
                 color = getBackgroundColorForElevation(color, elevation),
                 shape = shape
             )
             .clip(shape)
     ) {
-        ProvideContentColor(contentColor, content)
+        Providers(ContentColorAmbient provides contentColor, children = content)
     }
 }
 
@@ -116,7 +117,7 @@
  */
 // TODO("Andrey: Should be replaced with some basic layout implementation when we have it")
 @Composable
-private fun SurfaceLayout(modifier: Modifier = Modifier.None, children: @Composable() () -> Unit) {
+private fun SurfaceLayout(modifier: Modifier = Modifier, children: @Composable() () -> Unit) {
     Layout(children, modifier) { measurables, constraints, _ ->
         if (measurables.size > 1) {
             throw IllegalStateException("Surface can have only one direct measurable child!")
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Switch.kt b/ui/ui-material/src/main/java/androidx/ui/material/Switch.kt
index 78d139f..c6e29a0 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Switch.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Switch.kt
@@ -21,8 +21,8 @@
 import androidx.compose.Composable
 import androidx.ui.core.DensityAmbient
 import androidx.ui.core.Modifier
+import androidx.ui.core.DrawScope
 import androidx.ui.foundation.Canvas
-import androidx.ui.foundation.CanvasScope
 import androidx.ui.foundation.gestures.DragDirection
 import androidx.ui.foundation.selection.Toggleable
 import androidx.ui.geometry.Offset
@@ -116,7 +116,7 @@
     }
 }
 
-private fun CanvasScope.drawTrack(trackColor: Color) {
+private fun DrawScope.drawTrack(trackColor: Color) {
     val paint = Paint().apply {
         isAntiAlias = true
         color = trackColor
@@ -134,7 +134,7 @@
     )
 }
 
-private fun CanvasScope.drawThumb(position: Float, thumbColor: Color) {
+private fun DrawScope.drawThumb(position: Float, thumbColor: Color) {
     val paint = Paint().apply {
         isAntiAlias = true
         color = thumbColor
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Tab.kt b/ui/ui-material/src/main/java/androidx/ui/material/Tab.kt
index 29bdd0f6..5d25bfa 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Tab.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Tab.kt
@@ -20,6 +20,7 @@
 import androidx.animation.LinearEasing
 import androidx.animation.transitionDefinition
 import androidx.compose.Composable
+import androidx.compose.Providers
 import androidx.compose.emptyContent
 import androidx.compose.getValue
 import androidx.compose.remember
@@ -31,17 +32,17 @@
 import androidx.ui.core.Alignment
 import androidx.ui.core.Constraints
 import androidx.ui.core.DensityAmbient
-import androidx.ui.core.FirstBaseline
-import androidx.ui.core.LastBaseline
+import androidx.ui.text.FirstBaseline
+import androidx.ui.text.LastBaseline
 import androidx.ui.core.Layout
 import androidx.ui.core.Modifier
 import androidx.ui.core.Placeable
 import androidx.ui.core.WithConstraints
 import androidx.ui.core.tag
 import androidx.ui.foundation.Box
+import androidx.ui.foundation.ContentColorAmbient
 import androidx.ui.foundation.ContentGravity
 import androidx.ui.foundation.HorizontalScroller
-import androidx.ui.foundation.ProvideContentColor
 import androidx.ui.foundation.ProvideTextStyle
 import androidx.ui.foundation.ScrollerPosition
 import androidx.ui.foundation.contentColor
@@ -137,7 +138,7 @@
 fun <T> TabRow(
     items: List<T>,
     selectedIndex: Int,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     backgroundColor: Color = MaterialTheme.colors.primarySurface,
     contentColor: Color = contentColorFor(backgroundColor),
     scrollable: Boolean = false,
@@ -200,7 +201,7 @@
             tabs(Modifier.weight(1f))
         }
         Box(Modifier.gravity(Alignment.BottomCenter).fillMaxWidth(), children = divider)
-        Box(Modifier.matchParent()) {
+        Box(Modifier.matchParentSize()) {
             indicatorContainer(tabPositions)
         }
     }
@@ -409,7 +410,7 @@
      * @param color color of the indicator
      */
     @Composable
-    fun Indicator(modifier: Modifier = Modifier.None, color: Color = contentColor()) {
+    fun Indicator(modifier: Modifier = Modifier, color: Color = contentColor()) {
         Box(modifier.fillMaxWidth().preferredHeight(IndicatorHeight).drawBackground(color))
     }
 
@@ -479,7 +480,7 @@
     icon: @Composable() () -> Unit = emptyContent(),
     selected: Boolean,
     onSelected: () -> Unit,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     activeColor: Color = contentColor(),
     inactiveColor: Color = EmphasisAmbient.current.medium.emphasize(activeColor)
 ) {
@@ -512,7 +513,7 @@
 fun Tab(
     selected: Boolean,
     onSelected: () -> Unit,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     content: @Composable() () -> Unit
 ) {
     MutuallyExclusiveSetItem(
@@ -528,7 +529,7 @@
 
 /**
  * [Transition] defining how the tint color for a tab animates, when a new tab is selected. This
- * component uses [ProvideContentColor] to provide an interpolated value between [activeColor]
+ * component uses [ContentColorAmbient] to provide an interpolated value between [activeColor]
  * and [inactiveColor] depending on the animation status.
  */
 @Composable
@@ -565,7 +566,7 @@
         }
     }
     Transition(transitionDefinition, selected) { state ->
-        ProvideContentColor(state[TabTintColor], children = content)
+        Providers(ContentColorAmbient provides state[TabTintColor], children = content)
     }
 }
 
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Typography.kt b/ui/ui-material/src/main/java/androidx/ui/material/Typography.kt
index cfd73c2..8eb265e 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Typography.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Typography.kt
@@ -16,73 +16,188 @@
 
 package androidx.ui.material
 
+import androidx.compose.Immutable
 import androidx.compose.staticAmbientOf
 import androidx.ui.text.TextStyle
 import androidx.ui.text.font.FontFamily
 import androidx.ui.text.font.FontWeight
 import androidx.ui.unit.sp
-import androidx.ui.text.font.fontFamily
 
 /**
- * Data class holding typography definitions as defined by the [Material typography specification](https://material.io/design/typography/the-type-system.html#type-scale).
+ * Class holding typography definitions as defined by the [Material typography specification](https://material.io/design/typography/the-type-system.html#type-scale).
+ *
+ * @property h1 h1 is the largest headline, reserved for short, important text or numerals.
+ * For headlines, you can choose an expressive font, such as a display, handwritten, or script
+ * style. These unconventional font designs have details and intricacy that help attract the eye.
+ * @property h2 h2 is the second largest headline, reserved for short, important text or numerals.
+ * For headlines, you can choose an expressive font, such as a display, handwritten, or script
+ * style. These unconventional font designs have details and intricacy that help attract the eye.
+ * @property h3 h3 is the third largest headline, reserved for short, important text or numerals.
+ * For headlines, you can choose an expressive font, such as a display, handwritten, or script
+ * style. These unconventional font designs have details and intricacy that help attract the eye.
+ * @property h4 h4 is the fourth largest headline, reserved for short, important text or numerals.
+ * For headlines, you can choose an expressive font, such as a display, handwritten, or script
+ * style. These unconventional font designs have details and intricacy that help attract the eye.
+ * @property h5 h5 is the fifth largest headline, reserved for short, important text or numerals.
+ * For headlines, you can choose an expressive font, such as a display, handwritten, or script
+ * style. These unconventional font designs have details and intricacy that help attract the eye.
+ * @property h6 h6 is the sixth largest headline, reserved for short, important text or numerals.
+ * For headlines, you can choose an expressive font, such as a display, handwritten, or script
+ * style. These unconventional font designs have details and intricacy that help attract the eye.
+ * @property subtitle1 subtitle1 is the largest subtitle, and is typically reserved for
+ * medium-emphasis text that is shorter in length. Serif or sans serif typefaces work well for
+ * subtitles.
+ * @property subtitle2 subtitle2 is the smallest subtitle, and is typically reserved for
+ * medium-emphasis text that is shorter in length. Serif or sans serif typefaces work well for
+ * subtitles.
+ * @property body1 body1 is the largest body, and is typically used for long-form writing as it
+ * works well for small text sizes. For longer sections of text, a serif or sans serif typeface
+ * is recommended.
+ * @property body2 body2 is the smallest body, and is typically used for long-form writing as it
+ * works well for small text sizes. For longer sections of text, a serif or sans serif typeface
+ * is recommended.
+ * @property button button text is a call to action used in different types of buttons (such as
+ * text, outlined and contained buttons) and in tabs, dialogs, and cards. Button text is
+ * typically sans serif, using all caps text.
+ * @property caption caption is one of the smallest font sizes. It is used sparingly to
+ * annotate imagery or to introduce a headline.
+ * @property overline overline is one of the smallest font sizes. It is used sparingly to
+ * annotate imagery or to introduce a headline.
  */
-data class Typography(
-    // TODO(clara): case
-    // TODO(clara): letter spacing (specs don't match)
-    // TODO(clara): b/123001228 need a font abstraction layer
-    val h1: TextStyle = TextStyle(
-        fontFamily = FontFamily.Default,
-        fontWeight = FontWeight.W100,
-        fontSize = 96.sp),
-    val h2: TextStyle = TextStyle(
-        fontFamily = FontFamily.Default,
-        fontWeight = FontWeight.W100,
-        fontSize = 60.sp),
-    val h3: TextStyle = TextStyle(
-        fontFamily = FontFamily.Default,
-        fontWeight = FontWeight.Normal,
-        fontSize = 48.sp),
-    val h4: TextStyle = TextStyle(
-        fontFamily = FontFamily.Default,
-        fontWeight = FontWeight.Normal,
-        fontSize = 34.sp),
-    val h5: TextStyle = TextStyle(
-        fontFamily = FontFamily.Default,
-        fontWeight = FontWeight.Normal,
-        fontSize = 24.sp),
-    val h6: TextStyle = TextStyle(
-        fontFamily = FontFamily.Default,
-        fontWeight = FontWeight.W500,
-        fontSize = 20.sp),
-    val subtitle1: TextStyle = TextStyle(
-        fontFamily = FontFamily.Default,
-        fontWeight = FontWeight.Normal,
-        fontSize = 16.sp),
-    val subtitle2: TextStyle = TextStyle(
-        fontFamily = FontFamily.Default,
-        fontWeight = FontWeight.W500,
-        fontSize = 14.sp),
-    val body1: TextStyle = TextStyle(
-        fontFamily = FontFamily.Default,
-        fontWeight = FontWeight.Normal,
-        fontSize = 16.sp),
-    val body2: TextStyle = TextStyle(
-        fontFamily = FontFamily.Default,
-        fontWeight = FontWeight.Normal,
-        fontSize = 14.sp),
-    val button: TextStyle = TextStyle(
-        fontFamily = FontFamily.Default,
-        fontWeight = FontWeight.W500,
-        fontSize = 14.sp),
-    val caption: TextStyle = TextStyle(
-        fontFamily = FontFamily.Default,
-        fontWeight = FontWeight.Normal,
-        fontSize = 12.sp),
-    val overline: TextStyle = TextStyle(
-        fontFamily = FontFamily.Default,
-        fontWeight = FontWeight.Normal,
-        fontSize = 10.sp)
-)
+@Immutable
+data class Typography internal constructor(
+    val h1: TextStyle,
+    val h2: TextStyle,
+    val h3: TextStyle,
+    val h4: TextStyle,
+    val h5: TextStyle,
+    val h6: TextStyle,
+    val subtitle1: TextStyle,
+    val subtitle2: TextStyle,
+    val body1: TextStyle,
+    val body2: TextStyle,
+    val button: TextStyle,
+    val caption: TextStyle,
+    val overline: TextStyle
+) {
+    /**
+     * Constructor to create a [Typography]. For information on the types of style defined in
+     * this constructor, see the property documentation for [Typography].
+     *
+     * @param defaultFontFamily the default [FontFamily] to be used for [TextStyle]s provided in
+     * this constructor. This default will be used if the [FontFamily] on the [TextStyle] is `null`.
+     * @param h1 h1 is the largest headline, reserved for short, important text or numerals.
+     * @param h2 h2 is the second largest headline, reserved for short, important text or numerals.
+     * @param h3 h3 is the third largest headline, reserved for short, important text or numerals.
+     * @param h4 h4 is the fourth largest headline, reserved for short, important text or numerals.
+     * @param h5 h5 is the fifth largest headline, reserved for short, important text or numerals.
+     * @param h6 h6 is the sixth largest headline, reserved for short, important text or numerals.
+     * @param subtitle1 subtitle1 is the largest subtitle, and is typically reserved for
+     * medium-emphasis text that is shorter in length.
+     * @param subtitle2 subtitle2 is the smallest subtitle, and is typically reserved for
+     * medium-emphasis text that is shorter in length.
+     * @param body1 body1 is the largest body, and is typically used for long-form writing as it
+     * works well for small text sizes.
+     * @param body2 body2 is the smallest body, and is typically used for long-form writing as it
+     * works well for small text sizes.
+     * @param button button text is a call to action used in different types of buttons (such as
+     * text, outlined and contained buttons) and in tabs, dialogs, and cards.
+     * @param caption caption is one of the smallest font sizes. It is used sparingly to annotate
+     * imagery or to introduce a headline.
+     * @param overline overline is one of the smallest font sizes. It is used sparingly to annotate
+     * imagery or to introduce a headline.
+     */
+    constructor(
+        defaultFontFamily: FontFamily = FontFamily.Default,
+        h1: TextStyle = TextStyle(
+            fontWeight = FontWeight.Light,
+            fontSize = 96.sp,
+            letterSpacing = (-1.5).sp
+        ),
+        h2: TextStyle = TextStyle(
+            fontWeight = FontWeight.Light,
+            fontSize = 60.sp,
+            letterSpacing = (-0.5).sp
+        ),
+        h3: TextStyle = TextStyle(
+            fontWeight = FontWeight.Normal,
+            fontSize = 48.sp,
+            letterSpacing = 0.sp
+        ),
+        h4: TextStyle = TextStyle(
+            fontWeight = FontWeight.Normal,
+            fontSize = 34.sp,
+            letterSpacing = 0.25.sp
+        ),
+        h5: TextStyle = TextStyle(
+            fontWeight = FontWeight.Normal,
+            fontSize = 24.sp,
+            letterSpacing = 0.sp
+        ),
+        h6: TextStyle = TextStyle(
+            fontWeight = FontWeight.Medium,
+            fontSize = 20.sp,
+            letterSpacing = 0.15.sp
+        ),
+        subtitle1: TextStyle = TextStyle(
+            fontWeight = FontWeight.Normal,
+            fontSize = 16.sp,
+            letterSpacing = 0.15.sp
+        ),
+        subtitle2: TextStyle = TextStyle(
+            fontWeight = FontWeight.Medium,
+            fontSize = 14.sp,
+            letterSpacing = 0.1.sp
+        ),
+        body1: TextStyle = TextStyle(
+            fontWeight = FontWeight.Normal,
+            fontSize = 16.sp,
+            letterSpacing = 0.5.sp
+        ),
+        body2: TextStyle = TextStyle(
+            fontWeight = FontWeight.Normal,
+            fontSize = 14.sp,
+            letterSpacing = 0.25.sp
+        ),
+        button: TextStyle = TextStyle(
+            fontWeight = FontWeight.Medium,
+            fontSize = 14.sp,
+            letterSpacing = 1.25.sp
+        ),
+        caption: TextStyle = TextStyle(
+            fontWeight = FontWeight.Normal,
+            fontSize = 12.sp,
+            letterSpacing = 0.4.sp
+        ),
+        overline: TextStyle = TextStyle(
+            fontWeight = FontWeight.Normal,
+            fontSize = 10.sp,
+            letterSpacing = 1.5.sp
+        )
+    ) : this(
+        h1 = h1.withDefaultFontFamily(defaultFontFamily),
+        h2 = h2.withDefaultFontFamily(defaultFontFamily),
+        h3 = h3.withDefaultFontFamily(defaultFontFamily),
+        h4 = h4.withDefaultFontFamily(defaultFontFamily),
+        h5 = h5.withDefaultFontFamily(defaultFontFamily),
+        h6 = h6.withDefaultFontFamily(defaultFontFamily),
+        subtitle1 = subtitle1.withDefaultFontFamily(defaultFontFamily),
+        subtitle2 = subtitle2.withDefaultFontFamily(defaultFontFamily),
+        body1 = body1.withDefaultFontFamily(defaultFontFamily),
+        body2 = body2.withDefaultFontFamily(defaultFontFamily),
+        button = button.withDefaultFontFamily(defaultFontFamily),
+        caption = caption.withDefaultFontFamily(defaultFontFamily),
+        overline = overline.withDefaultFontFamily(defaultFontFamily)
+    )
+}
+
+/**
+ * @return [this] if there is a [FontFamily] defined, otherwise copies [this] with [default] as
+ * the [FontFamily].
+ */
+private fun TextStyle.withDefaultFontFamily(default: FontFamily): TextStyle {
+    return if (fontFamily != null) this else copy(fontFamily = default)
+}
 
 /**
  * This Ambient holds on to the current definition of typography for this application as described
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/ripple/Ripple.kt b/ui/ui-material/src/main/java/androidx/ui/material/ripple/Ripple.kt
index 3ddf5a2..7ed727c 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/ripple/Ripple.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/ripple/Ripple.kt
@@ -33,20 +33,20 @@
 import androidx.ui.core.Constraints
 import androidx.ui.core.DensityAmbient
 import androidx.ui.core.DrawModifier
+import androidx.ui.core.ContentDrawScope
 import androidx.ui.core.LayoutDirection
 import androidx.ui.core.LayoutModifier
 import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.PressIndicatorGestureDetector
-import androidx.ui.graphics.Canvas
+import androidx.ui.core.gesture.pressIndicatorGestureFilter
 import androidx.ui.graphics.Color
 import androidx.ui.unit.Density
 import androidx.ui.unit.Dp
 import androidx.ui.unit.IntPxSize
 import androidx.ui.unit.PxPosition
-import androidx.ui.unit.PxSize
 import androidx.ui.unit.center
 import androidx.ui.unit.ipx
 import androidx.ui.unit.toPxSize
+import androidx.ui.util.fastForEach
 
 /**
  * Ripple is a [Modifier] which draws the visual indicator for a pressed state.
@@ -81,7 +81,7 @@
     val theme = RippleThemeAmbient.current
     rippleModifier.color = (color ?: theme.defaultColor()).copy(alpha = theme.opacity())
 
-    val pressIndicator = PressIndicatorGestureDetector(
+    val pressIndicator = Modifier.pressIndicatorGestureFilter(
         onStart = { position ->
             if (enabled && transitionsEnabled) {
                 rippleModifier.handleStart(position, theme.factory, density, bounded, radius, clock)
@@ -144,9 +144,9 @@
         currentEffect = null
     }
 
-    override fun draw(density: Density, drawContent: () -> Unit, canvas: Canvas, size: PxSize) {
+    override fun ContentDrawScope.draw() {
         drawContent()
-        effects.forEach { it.draw(canvas, this.size, color) }
+        effects.fastForEach { it.draw(this, this@RippleModifier.size, color) }
     }
 
     override fun onEnter() {
@@ -154,7 +154,7 @@
     }
 
     override fun onLeave() {
-        effects.forEach { it.dispose() }
+        effects.fastForEach { it.dispose() }
         effects.clear()
         currentEffect = null
     }
diff --git a/ui/ui-platform/api/0.1.0-dev09.txt b/ui/ui-platform/api/0.1.0-dev09.txt
index e07ed9b..a01595e 100644
--- a/ui/ui-platform/api/0.1.0-dev09.txt
+++ b/ui/ui-platform/api/0.1.0-dev09.txt
@@ -78,14 +78,14 @@
     ctor public DrawNode();
     method public boolean getNeedsPaint();
     method public kotlin.jvm.functions.Function3<androidx.ui.unit.Density,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? getOnPaint();
-    method public kotlin.jvm.functions.Function3<androidx.ui.core.DrawReceiver,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? getOnPaintWithChildren();
+    method public kotlin.jvm.functions.Function3<androidx.ui.core.ContentDrawScope,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? getOnPaintWithChildren();
     method public void invalidate();
     method public void setNeedsPaint(boolean p);
     method public void setOnPaint(kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit>? value);
-    method public void setOnPaintWithChildren(kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit>? value);
+    method public void setOnPaintWithChildren(kotlin.jvm.functions.Function3<? super androidx.ui.core.ContentDrawScope,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit>? value);
     property public final boolean needsPaint;
     property public final kotlin.jvm.functions.Function3<androidx.ui.unit.Density,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? onPaint;
-    property public final kotlin.jvm.functions.Function3<androidx.ui.core.DrawReceiver,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? onPaintWithChildren;
+    property public final kotlin.jvm.functions.Function3<androidx.ui.core.ContentDrawScope,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? onPaintWithChildren;
   }
 
   public final class FocusNode extends androidx.ui.core.ComponentNode {
@@ -108,7 +108,7 @@
 
   public final class LayoutNode extends androidx.ui.core.ComponentNode implements androidx.ui.core.Measurable {
     ctor public LayoutNode();
-    method public void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.Density density);
+    method public void draw(androidx.ui.graphics.Canvas canvas);
     method public boolean getAffectsParentSize();
     method public androidx.ui.unit.IntPx? getAlignmentLine(androidx.ui.core.AlignmentLine line);
     method @Deprecated public boolean getCanMultiMeasure();
@@ -202,9 +202,6 @@
     method public Void minIntrinsicWidth(androidx.ui.unit.Density density, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, androidx.ui.unit.IntPx h, androidx.ui.core.LayoutDirection layoutDirection);
   }
 
-  public final class LayoutNodeWrapperKt {
-  }
-
   public final class ModelObserver {
     ctor public ModelObserver(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> commitExecutor);
     method public void clear(Object target);
@@ -227,9 +224,10 @@
   public interface Owner {
     method public androidx.ui.unit.IntPxPosition calculatePosition();
     method public void callDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.core.ComponentNode node, androidx.ui.unit.PxSize parentSize);
-    method public androidx.ui.core.OwnedLayer createLayer(androidx.ui.core.DrawLayerModifier drawLayerModifier, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.Density,kotlin.Unit> drawBlock, kotlin.jvm.functions.Function0<kotlin.Unit> invalidateParentLayer);
+    method public androidx.ui.core.OwnedLayer createLayer(androidx.ui.core.DrawLayerModifier drawLayerModifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.Canvas,kotlin.Unit> drawBlock, kotlin.jvm.functions.Function0<kotlin.Unit> invalidateParentLayer);
     method public androidx.ui.autofill.Autofill? getAutofill();
     method public androidx.ui.autofill.AutofillTree getAutofillTree();
+    method public androidx.ui.core.clipboard.ClipboardManager getClipboardManager();
     method public kotlin.jvm.functions.Function0<kotlin.Unit> getConfigurationChangeObserver();
     method public androidx.ui.unit.Density getDensity();
     method public androidx.ui.text.font.Font.ResourceLoader getFontLoader();
@@ -256,6 +254,7 @@
     method public void setOnSavedStateRegistryAvailable(kotlin.jvm.functions.Function1<? super androidx.ui.savedinstancestate.UiSavedStateRegistry,kotlin.Unit> callback);
     property public abstract androidx.ui.autofill.Autofill? autofill;
     property public abstract androidx.ui.autofill.AutofillTree autofillTree;
+    property public abstract androidx.ui.core.clipboard.ClipboardManager clipboardManager;
     property public abstract kotlin.jvm.functions.Function0<kotlin.Unit> configurationChangeObserver;
     property public abstract androidx.ui.unit.Density density;
     property public abstract androidx.ui.text.font.Font.ResourceLoader fontLoader;
@@ -291,13 +290,6 @@
     property public final kotlin.jvm.functions.Function3<java.util.List<androidx.ui.core.PointerInputChange>,androidx.ui.core.PointerEventPass,androidx.ui.unit.IntPxSize,java.util.List<androidx.ui.core.PointerInputChange>> pointerInputHandler;
   }
 
-  public final class Ref<T> {
-    ctor public Ref();
-    method public T? getValue();
-    method public void setValue(T? p);
-    property public final T? value;
-  }
-
   public final class SavedStateDelegateKt {
   }
 
@@ -315,8 +307,24 @@
 
 }
 
+package androidx.ui.core.clipboard {
+
+  public final class AndroidClipboardManagerKt {
+  }
+
+  public interface ClipboardManager {
+    method public androidx.ui.text.AnnotatedString? getText();
+    method public void setText(androidx.ui.text.AnnotatedString annotatedString);
+  }
+
+}
+
 package androidx.ui.core.focus {
 
+  public final class FocusModifierImplKt {
+    method public static androidx.ui.focus.FocusModifier createFocusModifier(androidx.ui.focus.FocusDetailedState focusDetailedState);
+  }
+
   public final class FocusNodeUtilsKt {
     method public static void initializeFocusState(androidx.ui.core.FocusNode);
   }
diff --git a/ui/ui-platform/api/current.txt b/ui/ui-platform/api/current.txt
index e07ed9b..a01595e 100644
--- a/ui/ui-platform/api/current.txt
+++ b/ui/ui-platform/api/current.txt
@@ -78,14 +78,14 @@
     ctor public DrawNode();
     method public boolean getNeedsPaint();
     method public kotlin.jvm.functions.Function3<androidx.ui.unit.Density,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? getOnPaint();
-    method public kotlin.jvm.functions.Function3<androidx.ui.core.DrawReceiver,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? getOnPaintWithChildren();
+    method public kotlin.jvm.functions.Function3<androidx.ui.core.ContentDrawScope,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? getOnPaintWithChildren();
     method public void invalidate();
     method public void setNeedsPaint(boolean p);
     method public void setOnPaint(kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit>? value);
-    method public void setOnPaintWithChildren(kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit>? value);
+    method public void setOnPaintWithChildren(kotlin.jvm.functions.Function3<? super androidx.ui.core.ContentDrawScope,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit>? value);
     property public final boolean needsPaint;
     property public final kotlin.jvm.functions.Function3<androidx.ui.unit.Density,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? onPaint;
-    property public final kotlin.jvm.functions.Function3<androidx.ui.core.DrawReceiver,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? onPaintWithChildren;
+    property public final kotlin.jvm.functions.Function3<androidx.ui.core.ContentDrawScope,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? onPaintWithChildren;
   }
 
   public final class FocusNode extends androidx.ui.core.ComponentNode {
@@ -108,7 +108,7 @@
 
   public final class LayoutNode extends androidx.ui.core.ComponentNode implements androidx.ui.core.Measurable {
     ctor public LayoutNode();
-    method public void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.Density density);
+    method public void draw(androidx.ui.graphics.Canvas canvas);
     method public boolean getAffectsParentSize();
     method public androidx.ui.unit.IntPx? getAlignmentLine(androidx.ui.core.AlignmentLine line);
     method @Deprecated public boolean getCanMultiMeasure();
@@ -202,9 +202,6 @@
     method public Void minIntrinsicWidth(androidx.ui.unit.Density density, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, androidx.ui.unit.IntPx h, androidx.ui.core.LayoutDirection layoutDirection);
   }
 
-  public final class LayoutNodeWrapperKt {
-  }
-
   public final class ModelObserver {
     ctor public ModelObserver(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> commitExecutor);
     method public void clear(Object target);
@@ -227,9 +224,10 @@
   public interface Owner {
     method public androidx.ui.unit.IntPxPosition calculatePosition();
     method public void callDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.core.ComponentNode node, androidx.ui.unit.PxSize parentSize);
-    method public androidx.ui.core.OwnedLayer createLayer(androidx.ui.core.DrawLayerModifier drawLayerModifier, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.Density,kotlin.Unit> drawBlock, kotlin.jvm.functions.Function0<kotlin.Unit> invalidateParentLayer);
+    method public androidx.ui.core.OwnedLayer createLayer(androidx.ui.core.DrawLayerModifier drawLayerModifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.Canvas,kotlin.Unit> drawBlock, kotlin.jvm.functions.Function0<kotlin.Unit> invalidateParentLayer);
     method public androidx.ui.autofill.Autofill? getAutofill();
     method public androidx.ui.autofill.AutofillTree getAutofillTree();
+    method public androidx.ui.core.clipboard.ClipboardManager getClipboardManager();
     method public kotlin.jvm.functions.Function0<kotlin.Unit> getConfigurationChangeObserver();
     method public androidx.ui.unit.Density getDensity();
     method public androidx.ui.text.font.Font.ResourceLoader getFontLoader();
@@ -256,6 +254,7 @@
     method public void setOnSavedStateRegistryAvailable(kotlin.jvm.functions.Function1<? super androidx.ui.savedinstancestate.UiSavedStateRegistry,kotlin.Unit> callback);
     property public abstract androidx.ui.autofill.Autofill? autofill;
     property public abstract androidx.ui.autofill.AutofillTree autofillTree;
+    property public abstract androidx.ui.core.clipboard.ClipboardManager clipboardManager;
     property public abstract kotlin.jvm.functions.Function0<kotlin.Unit> configurationChangeObserver;
     property public abstract androidx.ui.unit.Density density;
     property public abstract androidx.ui.text.font.Font.ResourceLoader fontLoader;
@@ -291,13 +290,6 @@
     property public final kotlin.jvm.functions.Function3<java.util.List<androidx.ui.core.PointerInputChange>,androidx.ui.core.PointerEventPass,androidx.ui.unit.IntPxSize,java.util.List<androidx.ui.core.PointerInputChange>> pointerInputHandler;
   }
 
-  public final class Ref<T> {
-    ctor public Ref();
-    method public T? getValue();
-    method public void setValue(T? p);
-    property public final T? value;
-  }
-
   public final class SavedStateDelegateKt {
   }
 
@@ -315,8 +307,24 @@
 
 }
 
+package androidx.ui.core.clipboard {
+
+  public final class AndroidClipboardManagerKt {
+  }
+
+  public interface ClipboardManager {
+    method public androidx.ui.text.AnnotatedString? getText();
+    method public void setText(androidx.ui.text.AnnotatedString annotatedString);
+  }
+
+}
+
 package androidx.ui.core.focus {
 
+  public final class FocusModifierImplKt {
+    method public static androidx.ui.focus.FocusModifier createFocusModifier(androidx.ui.focus.FocusDetailedState focusDetailedState);
+  }
+
   public final class FocusNodeUtilsKt {
     method public static void initializeFocusState(androidx.ui.core.FocusNode);
   }
diff --git a/ui/ui-platform/api/public_plus_experimental_0.1.0-dev09.txt b/ui/ui-platform/api/public_plus_experimental_0.1.0-dev09.txt
index 41b41f4..495533c 100644
--- a/ui/ui-platform/api/public_plus_experimental_0.1.0-dev09.txt
+++ b/ui/ui-platform/api/public_plus_experimental_0.1.0-dev09.txt
@@ -79,14 +79,14 @@
     ctor public DrawNode();
     method public boolean getNeedsPaint();
     method public kotlin.jvm.functions.Function3<androidx.ui.unit.Density,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? getOnPaint();
-    method public kotlin.jvm.functions.Function3<androidx.ui.core.DrawReceiver,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? getOnPaintWithChildren();
+    method public kotlin.jvm.functions.Function3<androidx.ui.core.ContentDrawScope,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? getOnPaintWithChildren();
     method public void invalidate();
     method public void setNeedsPaint(boolean p);
     method public void setOnPaint(kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit>? value);
-    method public void setOnPaintWithChildren(kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit>? value);
+    method public void setOnPaintWithChildren(kotlin.jvm.functions.Function3<? super androidx.ui.core.ContentDrawScope,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit>? value);
     property public final boolean needsPaint;
     property public final kotlin.jvm.functions.Function3<androidx.ui.unit.Density,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? onPaint;
-    property public final kotlin.jvm.functions.Function3<androidx.ui.core.DrawReceiver,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? onPaintWithChildren;
+    property public final kotlin.jvm.functions.Function3<androidx.ui.core.ContentDrawScope,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? onPaintWithChildren;
   }
 
   public final class FocusNode extends androidx.ui.core.ComponentNode {
@@ -109,7 +109,7 @@
 
   public final class LayoutNode extends androidx.ui.core.ComponentNode implements androidx.ui.core.Measurable {
     ctor public LayoutNode();
-    method public void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.Density density);
+    method public void draw(androidx.ui.graphics.Canvas canvas);
     method public boolean getAffectsParentSize();
     method public androidx.ui.unit.IntPx? getAlignmentLine(androidx.ui.core.AlignmentLine line);
     method @Deprecated public boolean getCanMultiMeasure();
@@ -203,9 +203,6 @@
     method public Void minIntrinsicWidth(androidx.ui.unit.Density density, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, androidx.ui.unit.IntPx h, androidx.ui.core.LayoutDirection layoutDirection);
   }
 
-  public final class LayoutNodeWrapperKt {
-  }
-
   public final class ModelObserver {
     ctor public ModelObserver(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> commitExecutor);
     method public void clear(Object target);
@@ -228,9 +225,10 @@
   public interface Owner {
     method public androidx.ui.unit.IntPxPosition calculatePosition();
     method public void callDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.core.ComponentNode node, androidx.ui.unit.PxSize parentSize);
-    method public androidx.ui.core.OwnedLayer createLayer(androidx.ui.core.DrawLayerModifier drawLayerModifier, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.Density,kotlin.Unit> drawBlock, kotlin.jvm.functions.Function0<kotlin.Unit> invalidateParentLayer);
+    method public androidx.ui.core.OwnedLayer createLayer(androidx.ui.core.DrawLayerModifier drawLayerModifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.Canvas,kotlin.Unit> drawBlock, kotlin.jvm.functions.Function0<kotlin.Unit> invalidateParentLayer);
     method public androidx.ui.autofill.Autofill? getAutofill();
     method public androidx.ui.autofill.AutofillTree getAutofillTree();
+    method public androidx.ui.core.clipboard.ClipboardManager getClipboardManager();
     method public kotlin.jvm.functions.Function0<kotlin.Unit> getConfigurationChangeObserver();
     method public androidx.ui.unit.Density getDensity();
     method public androidx.ui.text.font.Font.ResourceLoader getFontLoader();
@@ -258,6 +256,7 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setShowLayoutBounds(boolean p);
     property public abstract androidx.ui.autofill.Autofill? autofill;
     property public abstract androidx.ui.autofill.AutofillTree autofillTree;
+    property public abstract androidx.ui.core.clipboard.ClipboardManager clipboardManager;
     property public abstract kotlin.jvm.functions.Function0<kotlin.Unit> configurationChangeObserver;
     property public abstract androidx.ui.unit.Density density;
     property public abstract androidx.ui.text.font.Font.ResourceLoader fontLoader;
@@ -293,13 +292,6 @@
     property public final kotlin.jvm.functions.Function3<java.util.List<androidx.ui.core.PointerInputChange>,androidx.ui.core.PointerEventPass,androidx.ui.unit.IntPxSize,java.util.List<androidx.ui.core.PointerInputChange>> pointerInputHandler;
   }
 
-  public final class Ref<T> {
-    ctor public Ref();
-    method public T? getValue();
-    method public void setValue(T? p);
-    property public final T? value;
-  }
-
   public final class SavedStateDelegateKt {
   }
 
@@ -317,8 +309,24 @@
 
 }
 
+package androidx.ui.core.clipboard {
+
+  public final class AndroidClipboardManagerKt {
+  }
+
+  public interface ClipboardManager {
+    method public androidx.ui.text.AnnotatedString? getText();
+    method public void setText(androidx.ui.text.AnnotatedString annotatedString);
+  }
+
+}
+
 package androidx.ui.core.focus {
 
+  public final class FocusModifierImplKt {
+    method public static androidx.ui.focus.FocusModifier createFocusModifier(androidx.ui.focus.FocusDetailedState focusDetailedState);
+  }
+
   public final class FocusNodeUtilsKt {
     method public static void initializeFocusState(androidx.ui.core.FocusNode);
   }
diff --git a/ui/ui-platform/api/public_plus_experimental_current.txt b/ui/ui-platform/api/public_plus_experimental_current.txt
index 41b41f4..495533c 100644
--- a/ui/ui-platform/api/public_plus_experimental_current.txt
+++ b/ui/ui-platform/api/public_plus_experimental_current.txt
@@ -79,14 +79,14 @@
     ctor public DrawNode();
     method public boolean getNeedsPaint();
     method public kotlin.jvm.functions.Function3<androidx.ui.unit.Density,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? getOnPaint();
-    method public kotlin.jvm.functions.Function3<androidx.ui.core.DrawReceiver,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? getOnPaintWithChildren();
+    method public kotlin.jvm.functions.Function3<androidx.ui.core.ContentDrawScope,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? getOnPaintWithChildren();
     method public void invalidate();
     method public void setNeedsPaint(boolean p);
     method public void setOnPaint(kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit>? value);
-    method public void setOnPaintWithChildren(kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit>? value);
+    method public void setOnPaintWithChildren(kotlin.jvm.functions.Function3<? super androidx.ui.core.ContentDrawScope,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit>? value);
     property public final boolean needsPaint;
     property public final kotlin.jvm.functions.Function3<androidx.ui.unit.Density,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? onPaint;
-    property public final kotlin.jvm.functions.Function3<androidx.ui.core.DrawReceiver,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? onPaintWithChildren;
+    property public final kotlin.jvm.functions.Function3<androidx.ui.core.ContentDrawScope,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? onPaintWithChildren;
   }
 
   public final class FocusNode extends androidx.ui.core.ComponentNode {
@@ -109,7 +109,7 @@
 
   public final class LayoutNode extends androidx.ui.core.ComponentNode implements androidx.ui.core.Measurable {
     ctor public LayoutNode();
-    method public void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.Density density);
+    method public void draw(androidx.ui.graphics.Canvas canvas);
     method public boolean getAffectsParentSize();
     method public androidx.ui.unit.IntPx? getAlignmentLine(androidx.ui.core.AlignmentLine line);
     method @Deprecated public boolean getCanMultiMeasure();
@@ -203,9 +203,6 @@
     method public Void minIntrinsicWidth(androidx.ui.unit.Density density, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, androidx.ui.unit.IntPx h, androidx.ui.core.LayoutDirection layoutDirection);
   }
 
-  public final class LayoutNodeWrapperKt {
-  }
-
   public final class ModelObserver {
     ctor public ModelObserver(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> commitExecutor);
     method public void clear(Object target);
@@ -228,9 +225,10 @@
   public interface Owner {
     method public androidx.ui.unit.IntPxPosition calculatePosition();
     method public void callDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.core.ComponentNode node, androidx.ui.unit.PxSize parentSize);
-    method public androidx.ui.core.OwnedLayer createLayer(androidx.ui.core.DrawLayerModifier drawLayerModifier, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.Density,kotlin.Unit> drawBlock, kotlin.jvm.functions.Function0<kotlin.Unit> invalidateParentLayer);
+    method public androidx.ui.core.OwnedLayer createLayer(androidx.ui.core.DrawLayerModifier drawLayerModifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.Canvas,kotlin.Unit> drawBlock, kotlin.jvm.functions.Function0<kotlin.Unit> invalidateParentLayer);
     method public androidx.ui.autofill.Autofill? getAutofill();
     method public androidx.ui.autofill.AutofillTree getAutofillTree();
+    method public androidx.ui.core.clipboard.ClipboardManager getClipboardManager();
     method public kotlin.jvm.functions.Function0<kotlin.Unit> getConfigurationChangeObserver();
     method public androidx.ui.unit.Density getDensity();
     method public androidx.ui.text.font.Font.ResourceLoader getFontLoader();
@@ -258,6 +256,7 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setShowLayoutBounds(boolean p);
     property public abstract androidx.ui.autofill.Autofill? autofill;
     property public abstract androidx.ui.autofill.AutofillTree autofillTree;
+    property public abstract androidx.ui.core.clipboard.ClipboardManager clipboardManager;
     property public abstract kotlin.jvm.functions.Function0<kotlin.Unit> configurationChangeObserver;
     property public abstract androidx.ui.unit.Density density;
     property public abstract androidx.ui.text.font.Font.ResourceLoader fontLoader;
@@ -293,13 +292,6 @@
     property public final kotlin.jvm.functions.Function3<java.util.List<androidx.ui.core.PointerInputChange>,androidx.ui.core.PointerEventPass,androidx.ui.unit.IntPxSize,java.util.List<androidx.ui.core.PointerInputChange>> pointerInputHandler;
   }
 
-  public final class Ref<T> {
-    ctor public Ref();
-    method public T? getValue();
-    method public void setValue(T? p);
-    property public final T? value;
-  }
-
   public final class SavedStateDelegateKt {
   }
 
@@ -317,8 +309,24 @@
 
 }
 
+package androidx.ui.core.clipboard {
+
+  public final class AndroidClipboardManagerKt {
+  }
+
+  public interface ClipboardManager {
+    method public androidx.ui.text.AnnotatedString? getText();
+    method public void setText(androidx.ui.text.AnnotatedString annotatedString);
+  }
+
+}
+
 package androidx.ui.core.focus {
 
+  public final class FocusModifierImplKt {
+    method public static androidx.ui.focus.FocusModifier createFocusModifier(androidx.ui.focus.FocusDetailedState focusDetailedState);
+  }
+
   public final class FocusNodeUtilsKt {
     method public static void initializeFocusState(androidx.ui.core.FocusNode);
   }
diff --git a/ui/ui-platform/api/restricted_0.1.0-dev09.txt b/ui/ui-platform/api/restricted_0.1.0-dev09.txt
index 9f7ac2e..bc9caab 100644
--- a/ui/ui-platform/api/restricted_0.1.0-dev09.txt
+++ b/ui/ui-platform/api/restricted_0.1.0-dev09.txt
@@ -18,6 +18,12 @@
     property public abstract android.view.View view;
   }
 
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class AndroidOwner.Companion {
+    method public kotlin.jvm.functions.Function1<androidx.ui.core.AndroidOwner,kotlin.Unit>? getOnAndroidOwnerCreatedCallback();
+    method public void setOnAndroidOwnerCreatedCallback(kotlin.jvm.functions.Function1<? super androidx.ui.core.AndroidOwner,kotlin.Unit>? p);
+    property public final kotlin.jvm.functions.Function1<androidx.ui.core.AndroidOwner,kotlin.Unit>? onAndroidOwnerCreatedCallback;
+  }
+
   public final class AndroidOwnerKt {
     method public static androidx.ui.core.AndroidOwner createOwner(android.content.Context context);
   }
@@ -79,14 +85,14 @@
     ctor public DrawNode();
     method public boolean getNeedsPaint();
     method public kotlin.jvm.functions.Function3<androidx.ui.unit.Density,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? getOnPaint();
-    method public kotlin.jvm.functions.Function3<androidx.ui.core.DrawReceiver,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? getOnPaintWithChildren();
+    method public kotlin.jvm.functions.Function3<androidx.ui.core.ContentDrawScope,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? getOnPaintWithChildren();
     method public void invalidate();
     method public void setNeedsPaint(boolean p);
     method public void setOnPaint(kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit>? value);
-    method public void setOnPaintWithChildren(kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit>? value);
+    method public void setOnPaintWithChildren(kotlin.jvm.functions.Function3<? super androidx.ui.core.ContentDrawScope,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit>? value);
     property public final boolean needsPaint;
     property public final kotlin.jvm.functions.Function3<androidx.ui.unit.Density,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? onPaint;
-    property public final kotlin.jvm.functions.Function3<androidx.ui.core.DrawReceiver,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? onPaintWithChildren;
+    property public final kotlin.jvm.functions.Function3<androidx.ui.core.ContentDrawScope,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? onPaintWithChildren;
   }
 
   public final class FocusNode extends androidx.ui.core.ComponentNode {
@@ -109,7 +115,7 @@
 
   public final class LayoutNode extends androidx.ui.core.ComponentNode implements androidx.ui.core.Measurable {
     ctor public LayoutNode();
-    method public void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.Density density);
+    method public void draw(androidx.ui.graphics.Canvas canvas);
     method public boolean getAffectsParentSize();
     method public androidx.ui.unit.IntPx? getAlignmentLine(androidx.ui.core.AlignmentLine line);
     method @Deprecated public boolean getCanMultiMeasure();
@@ -203,9 +209,6 @@
     method public Void minIntrinsicWidth(androidx.ui.unit.Density density, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, androidx.ui.unit.IntPx h, androidx.ui.core.LayoutDirection layoutDirection);
   }
 
-  public final class LayoutNodeWrapperKt {
-  }
-
   public final class ModelObserver {
     ctor public ModelObserver(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> commitExecutor);
     method public void clear(Object target);
@@ -230,9 +233,10 @@
   public interface Owner {
     method public androidx.ui.unit.IntPxPosition calculatePosition();
     method public void callDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.core.ComponentNode node, androidx.ui.unit.PxSize parentSize);
-    method public androidx.ui.core.OwnedLayer createLayer(androidx.ui.core.DrawLayerModifier drawLayerModifier, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.Density,kotlin.Unit> drawBlock, kotlin.jvm.functions.Function0<kotlin.Unit> invalidateParentLayer);
+    method public androidx.ui.core.OwnedLayer createLayer(androidx.ui.core.DrawLayerModifier drawLayerModifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.Canvas,kotlin.Unit> drawBlock, kotlin.jvm.functions.Function0<kotlin.Unit> invalidateParentLayer);
     method public androidx.ui.autofill.Autofill? getAutofill();
     method public androidx.ui.autofill.AutofillTree getAutofillTree();
+    method public androidx.ui.core.clipboard.ClipboardManager getClipboardManager();
     method public kotlin.jvm.functions.Function0<kotlin.Unit> getConfigurationChangeObserver();
     method public androidx.ui.unit.Density getDensity();
     method public androidx.ui.text.font.Font.ResourceLoader getFontLoader();
@@ -260,6 +264,7 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setShowLayoutBounds(boolean p);
     property public abstract androidx.ui.autofill.Autofill? autofill;
     property public abstract androidx.ui.autofill.AutofillTree autofillTree;
+    property public abstract androidx.ui.core.clipboard.ClipboardManager clipboardManager;
     property public abstract kotlin.jvm.functions.Function0<kotlin.Unit> configurationChangeObserver;
     property public abstract androidx.ui.unit.Density density;
     property public abstract androidx.ui.text.font.Font.ResourceLoader fontLoader;
@@ -295,13 +300,6 @@
     property public final kotlin.jvm.functions.Function3<java.util.List<androidx.ui.core.PointerInputChange>,androidx.ui.core.PointerEventPass,androidx.ui.unit.IntPxSize,java.util.List<androidx.ui.core.PointerInputChange>> pointerInputHandler;
   }
 
-  public final class Ref<T> {
-    ctor public Ref();
-    method public T? getValue();
-    method public void setValue(T? p);
-    property public final T? value;
-  }
-
   public final class SavedStateDelegateKt {
   }
 
@@ -319,8 +317,24 @@
 
 }
 
+package androidx.ui.core.clipboard {
+
+  public final class AndroidClipboardManagerKt {
+  }
+
+  public interface ClipboardManager {
+    method public androidx.ui.text.AnnotatedString? getText();
+    method public void setText(androidx.ui.text.AnnotatedString annotatedString);
+  }
+
+}
+
 package androidx.ui.core.focus {
 
+  public final class FocusModifierImplKt {
+    method public static androidx.ui.focus.FocusModifier createFocusModifier(androidx.ui.focus.FocusDetailedState focusDetailedState);
+  }
+
   public final class FocusNodeUtilsKt {
     method public static void initializeFocusState(androidx.ui.core.FocusNode);
   }
diff --git a/ui/ui-platform/api/restricted_current.txt b/ui/ui-platform/api/restricted_current.txt
index 9f7ac2e..bc9caab 100644
--- a/ui/ui-platform/api/restricted_current.txt
+++ b/ui/ui-platform/api/restricted_current.txt
@@ -18,6 +18,12 @@
     property public abstract android.view.View view;
   }
 
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class AndroidOwner.Companion {
+    method public kotlin.jvm.functions.Function1<androidx.ui.core.AndroidOwner,kotlin.Unit>? getOnAndroidOwnerCreatedCallback();
+    method public void setOnAndroidOwnerCreatedCallback(kotlin.jvm.functions.Function1<? super androidx.ui.core.AndroidOwner,kotlin.Unit>? p);
+    property public final kotlin.jvm.functions.Function1<androidx.ui.core.AndroidOwner,kotlin.Unit>? onAndroidOwnerCreatedCallback;
+  }
+
   public final class AndroidOwnerKt {
     method public static androidx.ui.core.AndroidOwner createOwner(android.content.Context context);
   }
@@ -79,14 +85,14 @@
     ctor public DrawNode();
     method public boolean getNeedsPaint();
     method public kotlin.jvm.functions.Function3<androidx.ui.unit.Density,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? getOnPaint();
-    method public kotlin.jvm.functions.Function3<androidx.ui.core.DrawReceiver,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? getOnPaintWithChildren();
+    method public kotlin.jvm.functions.Function3<androidx.ui.core.ContentDrawScope,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? getOnPaintWithChildren();
     method public void invalidate();
     method public void setNeedsPaint(boolean p);
     method public void setOnPaint(kotlin.jvm.functions.Function3<? super androidx.ui.unit.Density,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit>? value);
-    method public void setOnPaintWithChildren(kotlin.jvm.functions.Function3<? super androidx.ui.core.DrawReceiver,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit>? value);
+    method public void setOnPaintWithChildren(kotlin.jvm.functions.Function3<? super androidx.ui.core.ContentDrawScope,? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit>? value);
     property public final boolean needsPaint;
     property public final kotlin.jvm.functions.Function3<androidx.ui.unit.Density,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? onPaint;
-    property public final kotlin.jvm.functions.Function3<androidx.ui.core.DrawReceiver,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? onPaintWithChildren;
+    property public final kotlin.jvm.functions.Function3<androidx.ui.core.ContentDrawScope,androidx.ui.graphics.Canvas,androidx.ui.unit.PxSize,kotlin.Unit>? onPaintWithChildren;
   }
 
   public final class FocusNode extends androidx.ui.core.ComponentNode {
@@ -109,7 +115,7 @@
 
   public final class LayoutNode extends androidx.ui.core.ComponentNode implements androidx.ui.core.Measurable {
     ctor public LayoutNode();
-    method public void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.Density density);
+    method public void draw(androidx.ui.graphics.Canvas canvas);
     method public boolean getAffectsParentSize();
     method public androidx.ui.unit.IntPx? getAlignmentLine(androidx.ui.core.AlignmentLine line);
     method @Deprecated public boolean getCanMultiMeasure();
@@ -203,9 +209,6 @@
     method public Void minIntrinsicWidth(androidx.ui.unit.Density density, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, androidx.ui.unit.IntPx h, androidx.ui.core.LayoutDirection layoutDirection);
   }
 
-  public final class LayoutNodeWrapperKt {
-  }
-
   public final class ModelObserver {
     ctor public ModelObserver(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> commitExecutor);
     method public void clear(Object target);
@@ -230,9 +233,10 @@
   public interface Owner {
     method public androidx.ui.unit.IntPxPosition calculatePosition();
     method public void callDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.core.ComponentNode node, androidx.ui.unit.PxSize parentSize);
-    method public androidx.ui.core.OwnedLayer createLayer(androidx.ui.core.DrawLayerModifier drawLayerModifier, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.Density,kotlin.Unit> drawBlock, kotlin.jvm.functions.Function0<kotlin.Unit> invalidateParentLayer);
+    method public androidx.ui.core.OwnedLayer createLayer(androidx.ui.core.DrawLayerModifier drawLayerModifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.Canvas,kotlin.Unit> drawBlock, kotlin.jvm.functions.Function0<kotlin.Unit> invalidateParentLayer);
     method public androidx.ui.autofill.Autofill? getAutofill();
     method public androidx.ui.autofill.AutofillTree getAutofillTree();
+    method public androidx.ui.core.clipboard.ClipboardManager getClipboardManager();
     method public kotlin.jvm.functions.Function0<kotlin.Unit> getConfigurationChangeObserver();
     method public androidx.ui.unit.Density getDensity();
     method public androidx.ui.text.font.Font.ResourceLoader getFontLoader();
@@ -260,6 +264,7 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setShowLayoutBounds(boolean p);
     property public abstract androidx.ui.autofill.Autofill? autofill;
     property public abstract androidx.ui.autofill.AutofillTree autofillTree;
+    property public abstract androidx.ui.core.clipboard.ClipboardManager clipboardManager;
     property public abstract kotlin.jvm.functions.Function0<kotlin.Unit> configurationChangeObserver;
     property public abstract androidx.ui.unit.Density density;
     property public abstract androidx.ui.text.font.Font.ResourceLoader fontLoader;
@@ -295,13 +300,6 @@
     property public final kotlin.jvm.functions.Function3<java.util.List<androidx.ui.core.PointerInputChange>,androidx.ui.core.PointerEventPass,androidx.ui.unit.IntPxSize,java.util.List<androidx.ui.core.PointerInputChange>> pointerInputHandler;
   }
 
-  public final class Ref<T> {
-    ctor public Ref();
-    method public T? getValue();
-    method public void setValue(T? p);
-    property public final T? value;
-  }
-
   public final class SavedStateDelegateKt {
   }
 
@@ -319,8 +317,24 @@
 
 }
 
+package androidx.ui.core.clipboard {
+
+  public final class AndroidClipboardManagerKt {
+  }
+
+  public interface ClipboardManager {
+    method public androidx.ui.text.AnnotatedString? getText();
+    method public void setText(androidx.ui.text.AnnotatedString annotatedString);
+  }
+
+}
+
 package androidx.ui.core.focus {
 
+  public final class FocusModifierImplKt {
+    method public static androidx.ui.focus.FocusModifier createFocusModifier(androidx.ui.focus.FocusDetailedState focusDetailedState);
+  }
+
   public final class FocusNodeUtilsKt {
     method public static void initializeFocusState(androidx.ui.core.FocusNode);
   }
diff --git a/ui/ui-platform/build.gradle b/ui/ui-platform/build.gradle
index 6425939..35dfc84 100644
--- a/ui/ui-platform/build.gradle
+++ b/ui/ui-platform/build.gradle
@@ -37,7 +37,7 @@
 
     implementation project(":compose:compose-runtime")
     api project(":ui:ui-core")
-    api project(":ui:ui-text")
+    api project(":ui:ui-text-core")
     implementation project(":ui:ui-util")
     implementation project(":ui:ui-saved-instance-state")
 
@@ -63,7 +63,7 @@
         exclude group: 'org.mockito' // to keep control on the mockito version
     }
 
-    androidTestImplementation project(":ui:ui-framework")
+    androidTestImplementation project(":ui:ui-foundation")
     androidTestImplementation project(":ui:ui-platform:samples")
     androidTestImplementation project(":ui:ui-test")
 }
diff --git a/ui/ui-platform/src/androidTest/java/androidx/ui/core/AndroidComposeViewTest.kt b/ui/ui-platform/src/androidTest/java/androidx/ui/core/AndroidComposeViewTest.kt
index a028dd80..9d3171e 100644
--- a/ui/ui-platform/src/androidTest/java/androidx/ui/core/AndroidComposeViewTest.kt
+++ b/ui/ui-platform/src/androidTest/java/androidx/ui/core/AndroidComposeViewTest.kt
@@ -25,7 +25,9 @@
 import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import androidx.ui.autofill.AndroidAutofill
+import androidx.ui.autofill.Autofill
 import androidx.ui.autofill.AutofillNode
+import androidx.ui.autofill.AutofillTree
 import androidx.ui.autofill.AutofillType
 import androidx.ui.test.android.fake.FakeViewStructure
 import androidx.ui.test.createComposeRule
@@ -43,33 +45,36 @@
     val composeTestRule = createComposeRule()
 
     private val PACKAGE_NAME = "androidx.ui.platform.test"
-    private lateinit var owner: Owner
-    private lateinit var composeView: ViewGroup
+    private var autofill: Autofill? = null
+    private lateinit var autofillTree: AutofillTree
+    private lateinit var ownerView: ViewGroup
 
     @Before
     fun setup() {
         composeTestRule.setContent {
-            owner = OwnerAmbient.current
-            composeView = owner as ViewGroup
+            @Suppress("DEPRECATION")
+            ownerView = OwnerAmbient.current as ViewGroup
+            autofill = AutofillAmbient.current
+            autofillTree = AutofillTreeAmbient.current
         }
     }
 
     @SdkSuppress(maxSdkVersion = 25)
     @Test
     fun autofillAmbient_belowApi26_isNull() {
-        assertThat(owner.autofill).isNull()
+        assertThat(autofill).isNull()
     }
 
     @SdkSuppress(minSdkVersion = 26)
     @Test
     fun autofillAmbient_isNotNull() {
-        assertThat(owner.autofill).isNotNull()
+        assertThat(autofill).isNotNull()
     }
 
     @SdkSuppress(minSdkVersion = 26)
     @Test
     fun autofillAmbient_returnsAnInstanceOfAndroidAutofill() {
-        assertThat(owner.autofill).isInstanceOf(AndroidAutofill::class.java)
+        assertThat(autofill).isInstanceOf(AndroidAutofill::class.java)
     }
 
     @SdkSuppress(minSdkVersion = 26)
@@ -82,10 +87,10 @@
             autofillTypes = listOf(AutofillType.Name),
             boundingBox = Rect(0, 0, 0, 0)
         )
-        owner.autofillTree += autofillNode
+        autofillTree += autofillNode
 
         // Act.
-        composeView.onProvideAutofillVirtualStructure(viewStructure, 0)
+        ownerView.onProvideAutofillVirtualStructure(viewStructure, 0)
 
         // Assert.
         assertThat(viewStructure).isEqualTo(FakeViewStructure().apply {
@@ -113,10 +118,10 @@
         val autofillValues = SparseArray<AutofillValue>().apply {
             append(autofillNode.id, AutofillValue.forText(expectedValue))
         }
-        owner.autofillTree += autofillNode
+        autofillTree += autofillNode
 
         // Act.
-        composeView.autofill(autofillValues)
+        ownerView.autofill(autofillValues)
 
         // Assert.
         assertThat(autofilledValue).isEqualTo(expectedValue)
diff --git a/ui/ui-platform/src/androidTest/java/androidx/ui/core/focus/CaptureFocusTest.kt b/ui/ui-platform/src/androidTest/java/androidx/ui/core/focus/CaptureFocusTest.kt
new file mode 100644
index 0000000..63ac2d2
--- /dev/null
+++ b/ui/ui-platform/src/androidTest/java/androidx/ui/core/focus/CaptureFocusTest.kt
@@ -0,0 +1,124 @@
+/*
+ * 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.ui.core.focus
+
+import androidx.test.filters.SmallTest
+import androidx.ui.focus.FocusDetailedState.Active
+import androidx.ui.focus.FocusDetailedState.ActiveParent
+import androidx.ui.focus.FocusDetailedState.Captured
+import androidx.ui.focus.FocusDetailedState.Disabled
+import androidx.ui.focus.FocusDetailedState.Inactive
+import androidx.ui.foundation.Box
+import androidx.ui.test.createComposeRule
+import androidx.ui.test.runOnUiThread
+import com.google.common.truth.Truth
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@SmallTest
+@RunWith(JUnit4::class)
+class CaptureFocusTest {
+    @get:Rule
+    val composeTestRule = createComposeRule()
+
+    @Test
+    fun active_captureFocus_changesStateToCaptured() {
+        runOnUiThread {
+            // Arrange.
+            val focusModifier = createFocusModifier(Active).also {
+                composeTestRule.setContent { Box(modifier = it) }
+            }
+
+            // Act.
+            val success = focusModifier.captureFocus()
+
+            // Assert.
+            Truth.assertThat(success).isTrue()
+            Truth.assertThat(focusModifier.focusDetailedState).isEqualTo(Captured)
+        }
+    }
+
+    @Test
+    fun activeParent_captureFocus_retainsStateAsActiveParent() {
+        runOnUiThread {
+            // Arrange.
+            val focusModifier = createFocusModifier(ActiveParent).also {
+                composeTestRule.setContent { Box(modifier = it) }
+            }
+
+            // Act.
+            val success = focusModifier.captureFocus()
+
+            // Assert.
+            Truth.assertThat(success).isFalse()
+            Truth.assertThat(focusModifier.focusDetailedState).isEqualTo(ActiveParent)
+        }
+    }
+
+    @Test
+    fun captured_captureFocus_retainsStateAsCaptured() {
+        runOnUiThread {
+            // Arrange.
+            val focusModifier = createFocusModifier(Captured).also {
+                composeTestRule.setContent { Box(modifier = it) }
+            }
+
+            // Act.
+            val success = focusModifier.captureFocus()
+
+            // Assert.
+            Truth.assertThat(success).isTrue()
+            Truth.assertThat(focusModifier.focusDetailedState).isEqualTo(Captured)
+        }
+    }
+
+    @Test
+    fun disabled_captureFocus_retainsStateAsDisabled() {
+        runOnUiThread {
+            // Arrange.
+            val focusModifier = createFocusModifier(Disabled).also {
+                composeTestRule.setContent { Box(modifier = it) }
+            }
+
+            // Act.
+            val success = focusModifier.captureFocus()
+
+            // Assert.
+            Truth.assertThat(success).isFalse()
+            Truth.assertThat(focusModifier.focusDetailedState).isEqualTo(Disabled)
+        }
+    }
+
+    @Test
+    fun inactive_captureFocus_retainsStateAsInactive() {
+        runOnUiThread {
+            // Arrange.
+            val focusModifier = createFocusModifier(Inactive).also {
+                composeTestRule.setContent { Box(modifier = it) }
+            }
+
+            // Act.
+            val success = focusModifier.captureFocus()
+
+            // Assert.
+            Truth.assertThat(success).isFalse()
+            Truth.assertThat(focusModifier.focusDetailedState).isEqualTo(Inactive)
+        }
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-platform/src/androidTest/java/androidx/ui/core/focus/FindFocusableChildrenTest.kt b/ui/ui-platform/src/androidTest/java/androidx/ui/core/focus/FindFocusableChildrenTest.kt
new file mode 100644
index 0000000..f630a48
--- /dev/null
+++ b/ui/ui-platform/src/androidTest/java/androidx/ui/core/focus/FindFocusableChildrenTest.kt
@@ -0,0 +1,105 @@
+/*
+ * 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.ui.core.focus
+
+import androidx.test.filters.SmallTest
+import androidx.ui.core.Modifier
+import androidx.ui.focus.FocusDetailedState
+import androidx.ui.foundation.Box
+import androidx.ui.foundation.drawBackground
+import androidx.ui.graphics.Color.Companion.Red
+import androidx.ui.test.createComposeRule
+import androidx.ui.test.runOnUiThread
+import com.google.common.truth.Truth
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@SmallTest
+@RunWith(JUnit4::class)
+class FindFocusableChildrenTest {
+    @get:Rule
+    val composeTestRule = createComposeRule()
+
+    @Test
+    fun returnsFirstFocusNodeInModifierChain() {
+        runOnUiThread {
+            // Arrange.
+            // layoutNode--focusNode1--focusNode2--focusNode3
+            val focusModifier1 = createFocusModifier(FocusDetailedState.Inactive)
+            val focusModifier2 = createFocusModifier(FocusDetailedState.Inactive)
+            val focusModifier3 = createFocusModifier(FocusDetailedState.Inactive)
+            composeTestRule.setContent {
+                Box(modifier = focusModifier1 + focusModifier2 + focusModifier3)
+            }
+
+            // Act.
+            val focusableChildren = focusModifier1.focusNode.focusableChildren()
+
+            // Assert.
+            Truth.assertThat(focusableChildren).containsExactly(focusModifier2.focusNode)
+        }
+    }
+
+    @Test
+    fun skipsNonFocusNodesAndReturnsFirstFocusNodeInModifierChain() {
+        runOnUiThread {
+            // Arrange.
+            // layoutNode--focusNode1--nonFocusNode--focusNode2
+            val focusModifier1 = createFocusModifier(FocusDetailedState.Inactive)
+            val focusModifier2 = createFocusModifier(FocusDetailedState.Inactive)
+            composeTestRule.setContent {
+                Box(modifier = focusModifier1 + Modifier.drawBackground(Red) + focusModifier2)
+            }
+
+            // Act.
+            val focusableChildren = focusModifier1.focusNode.focusableChildren()
+
+            // Assert.
+            Truth.assertThat(focusableChildren).containsExactly(focusModifier2.focusNode)
+        }
+    }
+
+    @Test
+    fun returnsFirstFocusChildOfEachChildLayoutNode() {
+        runOnUiThread {
+            // Arrange.
+            // parentLayoutNode--parentFocusNode
+            //       |___________________________________
+            //       |                                   |
+            // childLayoutNode1--focusNode1          childLayoutNode2--focusNode2--focusNode3
+            val parentFocusModifier = createFocusModifier(FocusDetailedState.Inactive)
+            val focusModifier1 = createFocusModifier(FocusDetailedState.Inactive)
+            val focusModifier2 = createFocusModifier(FocusDetailedState.Inactive)
+            val focusModifier3 = createFocusModifier(FocusDetailedState.Inactive)
+            composeTestRule.setContent {
+                Box(modifier = parentFocusModifier) {
+                    Box(modifier = focusModifier1)
+                    Box(modifier = focusModifier2 + focusModifier3)
+                }
+            }
+
+            // Act.
+            val focusableChildren = parentFocusModifier.focusNode.focusableChildren()
+
+            // Assert.
+            Truth.assertThat(focusableChildren)
+                .containsExactly(focusModifier1.focusNode, focusModifier2.focusNode)
+        }
+    }
+}
diff --git a/ui/ui-platform/src/androidTest/java/androidx/ui/core/focus/FindParentFocusNodeTest.kt b/ui/ui-platform/src/androidTest/java/androidx/ui/core/focus/FindParentFocusNodeTest.kt
new file mode 100644
index 0000000..5bb81b2
--- /dev/null
+++ b/ui/ui-platform/src/androidTest/java/androidx/ui/core/focus/FindParentFocusNodeTest.kt
@@ -0,0 +1,177 @@
+/*
+ * 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.ui.core.focus
+
+import androidx.test.filters.SmallTest
+import androidx.ui.core.Modifier
+import androidx.ui.focus.FocusDetailedState
+import androidx.ui.focus.FocusDetailedState.Inactive
+import androidx.ui.foundation.Box
+import androidx.ui.foundation.drawBackground
+import androidx.ui.graphics.Color.Companion.Red
+import androidx.ui.test.createComposeRule
+import androidx.ui.test.runOnUiThread
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@SmallTest
+@RunWith(JUnit4::class)
+class FindParentFocusNodeTest {
+    @get:Rule
+    val composeTestRule = createComposeRule()
+
+    @Test
+    fun noParentReturnsNull() {
+        runOnUiThread {
+            // Arrange.
+            val focusModifier = createFocusModifier(FocusDetailedState.Inactive).also {
+                composeTestRule.setContent { Box(modifier = it) }
+            }
+
+            // Act.
+            val rootFocusNode = focusModifier.focusNode.findParentFocusNode()!!
+                .findParentFocusNode()
+
+            // Assert.
+            assertThat(rootFocusNode).isNull()
+        }
+    }
+
+    @Test
+    fun returnsImmediateParentFromModifierChain() {
+        runOnUiThread {
+            // Arrange.
+            // focusNode1--focusNode2--focusNode3--focusNode4--focusNode5
+            val modifier1 = createFocusModifier(Inactive)
+            val modifier2 = createFocusModifier(Inactive)
+            val modifier3 = createFocusModifier(Inactive)
+            val modifier4 = createFocusModifier(Inactive)
+            val modifier5 = createFocusModifier(Inactive)
+            composeTestRule.setContent {
+                Box(modifier = modifier1 + modifier2 + modifier3 + modifier4 + modifier5) {}
+            }
+
+            // Act.
+            val parent = modifier3.focusNode.findParentFocusNode()
+
+            // Assert.
+            assertThat(parent).isEqualTo(modifier2.focusNode)
+        }
+    }
+
+    @Test
+    fun returnsImmediateParentFromModifierChain_ignoresNonFocusModifiers() {
+        runOnUiThread {
+            // Arrange.
+            // focusNode1--focusNode2--nonFocusNode--focusNode3
+            val modifier1 = createFocusModifier(Inactive)
+            val modifier2 = createFocusModifier(Inactive)
+            val modifier3 = createFocusModifier(Inactive)
+            composeTestRule.setContent {
+                Box(modifier = modifier1 + modifier2 + Modifier.drawBackground(Red) + modifier3)
+            }
+
+            // Act.
+            val parent = modifier3.focusNode.findParentFocusNode()
+
+            // Assert.
+            assertThat(parent).isEqualTo(modifier2.focusNode)
+        }
+    }
+
+    @Test
+    fun returnsLastFocusParentFromParentLayoutNode() {
+        runOnUiThread {
+            // Arrange.
+            // parentLayoutNode--parentFocusNode1--parentFocusNode2
+            //       |
+            // layoutNode--focusNode
+            val parentFocusModifier1 = createFocusModifier(Inactive)
+            val parentFocusModifier2 = createFocusModifier(Inactive)
+            val focusModifier = createFocusModifier(Inactive)
+            composeTestRule.setContent {
+                Box(modifier = parentFocusModifier1 + parentFocusModifier2) {
+                    Box(modifier = focusModifier)
+                }
+            }
+
+            // Act.
+            val parent = focusModifier.focusNode.findParentFocusNode()
+
+            // Assert.
+            assertThat(parent).isEqualTo(parentFocusModifier2.focusNode)
+        }
+    }
+
+    @Test
+    fun returnsImmediateParent() {
+        runOnUiThread {
+            // Arrange.
+            // grandparentLayoutNode--grandparentFocusNode
+            //       |
+            // parentLayoutNode--parentFocusNode
+            //       |
+            // layoutNode--focusNode
+            val grandparentFocusModifier = createFocusModifier(Inactive)
+            val parentFocusModifier = createFocusModifier(Inactive)
+            val focusModifier = createFocusModifier(Inactive)
+            composeTestRule.setContent {
+                Box(modifier = grandparentFocusModifier) {
+                    Box(modifier = parentFocusModifier) {
+                        Box(modifier = focusModifier)
+                    }
+                }
+            }
+
+            // Act.
+            val parent = focusModifier.focusNode.findParentFocusNode()
+
+            // Assert.
+            assertThat(parent).isEqualTo(parentFocusModifier.focusNode)
+        }
+    }
+
+    @Test
+    fun ignoresIntermediateLayoutNodesThatDontHaveFocusNodes() {
+        runOnUiThread {
+            // Arrange.
+            // grandparentLayoutNode--grandparentFocusNode
+            //       |
+            // parentLayoutNode
+            //       |
+            // layoutNode--focusNode
+            val grandparentFocusModifier = createFocusModifier(Inactive)
+            val focusModifier = createFocusModifier(Inactive)
+            composeTestRule.setContent {
+                Box(modifier = grandparentFocusModifier) {
+                    Box {
+                        Box(modifier = focusModifier)
+                    }
+                }
+            }
+
+            // Act.
+            val parent = focusModifier.focusNode.findParentFocusNode()
+
+            // Assert.
+            assertThat(parent).isEqualTo(grandparentFocusModifier.focusNode)
+        }
+    }
+}
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/LayoutCoordinatesHelper.kt b/ui/ui-platform/src/androidTest/java/androidx/ui/core/focus/FocusTestUtils.kt
similarity index 64%
copy from ui/ui-test/src/main/java/androidx/ui/test/LayoutCoordinatesHelper.kt
copy to ui/ui-platform/src/androidTest/java/androidx/ui/core/focus/FocusTestUtils.kt
index b09b72c..f470758 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/LayoutCoordinatesHelper.kt
+++ b/ui/ui-platform/src/androidTest/java/androidx/ui/core/focus/FocusTestUtils.kt
@@ -14,13 +14,14 @@
  * limitations under the License.
  */
 
-package androidx.ui.test
+package androidx.ui.core.focus
 
-import androidx.ui.core.LayoutCoordinates
-import androidx.ui.unit.PxPosition
+import androidx.ui.focus.FocusModifier
 
-/**
- * Returns the position relative to the parent Layout
- */
-val LayoutCoordinates.positionInParent: PxPosition
-    get() = parentCoordinates?.childToLocal(this, PxPosition.Origin) ?: PxPosition.Origin
\ No newline at end of file
+internal val FocusModifier.focusNode get() = (this as FocusModifierImpl).focusNode!!
+
+internal var FocusModifier.focusedChild
+    get() = (this as FocusModifierImpl).focusedChild
+    set(value) {
+        (this as FocusModifierImpl).focusedChild = value
+    }
\ No newline at end of file
diff --git a/ui/ui-platform/src/androidTest/java/androidx/ui/core/focus/FreeFocusTest.kt b/ui/ui-platform/src/androidTest/java/androidx/ui/core/focus/FreeFocusTest.kt
new file mode 100644
index 0000000..2913959
--- /dev/null
+++ b/ui/ui-platform/src/androidTest/java/androidx/ui/core/focus/FreeFocusTest.kt
@@ -0,0 +1,124 @@
+/*
+ * 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.ui.core.focus
+
+import androidx.test.filters.SmallTest
+import androidx.ui.focus.FocusDetailedState.Active
+import androidx.ui.focus.FocusDetailedState.ActiveParent
+import androidx.ui.focus.FocusDetailedState.Captured
+import androidx.ui.focus.FocusDetailedState.Disabled
+import androidx.ui.focus.FocusDetailedState.Inactive
+import androidx.ui.foundation.Box
+import androidx.ui.test.createComposeRule
+import androidx.ui.test.runOnUiThread
+import com.google.common.truth.Truth
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@SmallTest
+@RunWith(JUnit4::class)
+class FreeFocusTest {
+    @get:Rule
+    val composeTestRule = createComposeRule()
+
+    @Test
+    fun active_freeFocus_retainFocusAsActive() {
+        runOnUiThread {
+            // Arrange.
+            val focusModifier = createFocusModifier(Active).also {
+                composeTestRule.setContent { Box(modifier = it) }
+            }
+
+            // Act.
+            val success = focusModifier.freeFocus()
+
+            // Assert.
+            Truth.assertThat(success).isFalse()
+            Truth.assertThat(focusModifier.focusDetailedState).isEqualTo(Active)
+        }
+    }
+
+    @Test
+    fun activeParent_freeFocus_retainFocusAsActiveParent() {
+        runOnUiThread {
+            // Arrange.
+            val focusModifier = createFocusModifier(ActiveParent).also {
+                composeTestRule.setContent { Box(modifier = it) }
+            }
+
+            // Act.
+            val success = focusModifier.freeFocus()
+
+            // Assert.
+            Truth.assertThat(success).isFalse()
+            Truth.assertThat(focusModifier.focusDetailedState).isEqualTo(ActiveParent)
+        }
+    }
+
+    @Test
+    fun captured_freeFocus_changesStateToActive() {
+        runOnUiThread {
+            // Arrange.
+            val focusModifier = createFocusModifier(Captured).also {
+                composeTestRule.setContent { Box(modifier = it) }
+            }
+
+            // Act.
+            val success = focusModifier.freeFocus()
+
+            // Assert.
+            Truth.assertThat(success).isTrue()
+            Truth.assertThat(focusModifier.focusDetailedState).isEqualTo(Active)
+        }
+    }
+
+    @Test
+    fun disabled_freeFocus_retainFocusAsDisabled() {
+        runOnUiThread {
+            // Arrange.
+            val focusModifier = createFocusModifier(Disabled).also {
+                composeTestRule.setContent { Box(modifier = it) }
+            }
+
+            // Act.
+            val success = focusModifier.freeFocus()
+
+            // Assert.
+            Truth.assertThat(success).isFalse()
+            Truth.assertThat(focusModifier.focusDetailedState).isEqualTo(Disabled)
+        }
+    }
+
+    @Test
+    fun inactive_freeFocus_retainFocusAsInactive() {
+        runOnUiThread {
+            // Arrange.
+            val focusModifier = createFocusModifier(Inactive).also {
+                composeTestRule.setContent { Box(modifier = it) }
+            }
+
+            // Act.
+            val success = focusModifier.freeFocus()
+
+            // Assert.
+            Truth.assertThat(success).isFalse()
+            Truth.assertThat(focusModifier.focusDetailedState).isEqualTo(Inactive)
+        }
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-platform/src/androidTest/java/androidx/ui/core/focus/RequestFocusTest.kt b/ui/ui-platform/src/androidTest/java/androidx/ui/core/focus/RequestFocusTest.kt
new file mode 100644
index 0000000..8f72d8fb
--- /dev/null
+++ b/ui/ui-platform/src/androidTest/java/androidx/ui/core/focus/RequestFocusTest.kt
@@ -0,0 +1,513 @@
+/*
+ * 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.ui.core.focus
+
+import androidx.test.filters.SmallTest
+import androidx.ui.focus.FocusDetailedState.Active
+import androidx.ui.focus.FocusDetailedState.ActiveParent
+import androidx.ui.focus.FocusDetailedState.Captured
+import androidx.ui.focus.FocusDetailedState.Disabled
+import androidx.ui.focus.FocusDetailedState.Inactive
+import androidx.ui.foundation.Box
+import androidx.ui.test.createComposeRule
+import androidx.ui.test.runOnUiThread
+
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@SmallTest
+@RunWith(Parameterized::class)
+class RequestFocusTest(val propagateFocus: Boolean) {
+    @get:Rule
+    val composeTestRule = createComposeRule()
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "propagateFocus = {0}")
+        fun initParameters() = listOf(true, false)
+    }
+
+    @Test
+    fun active_isUnchanged() {
+        runOnUiThread {
+            // Arrange.
+            val focusModifier = createFocusModifier(Active).also {
+                composeTestRule.setContent { Box(modifier = it) }
+            }
+
+            // Act.
+            focusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            assertThat(focusModifier.focusDetailedState).isEqualTo(Active)
+        }
+    }
+
+    @Test
+    fun captured_isUnchanged() {
+        runOnUiThread {
+            // Arrange.
+            val focusModifier = createFocusModifier(Captured).also {
+                composeTestRule.setContent { Box(modifier = it) }
+            }
+
+            // Act.
+            focusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            assertThat(focusModifier.focusDetailedState).isEqualTo(Captured)
+        }
+    }
+
+    @Test
+    fun disabled_isUnchanged() {
+        runOnUiThread {
+            // Arrange.
+            val focusModifier = createFocusModifier(Disabled).also {
+                composeTestRule.setContent { Box(modifier = it) }
+            }
+
+            // Act.
+            focusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            assertThat(focusModifier.focusDetailedState).isEqualTo(Disabled)
+        }
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun activeParent_withNoFocusedChild_throwsException() {
+        runOnUiThread {
+            // Arrange.
+            val focusModifier = createFocusModifier(ActiveParent).also {
+                composeTestRule.setContent { Box(modifier = it) }
+            }
+
+            // Act.
+            focusModifier.focusNode.requestFocus(propagateFocus)
+        }
+    }
+
+    @Test
+    fun activeParent_propagateFocus() {
+        runOnUiThread {
+            // Arrange.
+            val focusModifier = createFocusModifier(ActiveParent)
+            val childFocusModifier = createFocusModifier(Active)
+            composeTestRule.setContent {
+                Box(modifier = focusModifier) {
+                    Box(modifier = childFocusModifier)
+                }
+            }
+            focusModifier.focusedChild = childFocusModifier.focusNode
+
+            // Act.
+            focusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            when (propagateFocus) {
+                true -> {
+                    // Unchanged.
+                    assertThat(focusModifier.focusDetailedState).isEqualTo(ActiveParent)
+                    assertThat(childFocusModifier.focusDetailedState).isEqualTo(Active)
+                }
+                false -> {
+                    assertThat(focusModifier.focusDetailedState).isEqualTo(Active)
+                    assertThat(focusModifier.focusedChild).isNull()
+                    assertThat(childFocusModifier.focusDetailedState).isEqualTo(Inactive)
+                }
+            }
+        }
+    }
+
+    @Test
+    fun inactiveRoot_propagateFocusSendsRequestToOwner_systemCanGrantFocus() {
+        runOnUiThread {
+            // Arrange.
+            val rootFocusModifier = createFocusModifier(Inactive).also {
+                composeTestRule.setContent { Box(modifier = it) }
+            }
+
+            // Act.
+            rootFocusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            assertThat(rootFocusModifier.focusDetailedState).isEqualTo(Active)
+        }
+    }
+
+    @Test
+    fun inactiveRootWithChildren_propagateFocusSendsRequestToOwner_systemCanGrantFocus() {
+        runOnUiThread {
+            // Arrange.
+            val rootFocusModifier = createFocusModifier(Inactive)
+            val childFocusModifier = createFocusModifier(Inactive)
+            composeTestRule.setContent {
+                Box(modifier = rootFocusModifier) {
+                    Box(modifier = childFocusModifier)
+                }
+            }
+
+            // Act.
+            rootFocusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            when (propagateFocus) {
+                true -> {
+                    // Unchanged.
+                    assertThat(rootFocusModifier.focusDetailedState).isEqualTo(ActiveParent)
+                    assertThat(childFocusModifier.focusDetailedState).isEqualTo(Active)
+                }
+                false -> {
+                    assertThat(rootFocusModifier.focusDetailedState).isEqualTo(Active)
+                    assertThat(childFocusModifier.focusDetailedState).isEqualTo(Inactive)
+                }
+            }
+        }
+    }
+
+    @Test
+    fun inactiveNonRootWithChilcren() {
+        runOnUiThread {
+            // Arrange.
+            val parentFocusModifier = createFocusModifier(Active)
+            val focusModifier = createFocusModifier(Inactive)
+            val childFocusModifier = createFocusModifier(Inactive)
+            composeTestRule.setContent {
+                Box(modifier = parentFocusModifier) {
+                    Box(modifier = focusModifier) {
+                        Box(modifier = childFocusModifier)
+                    }
+                }
+            }
+
+            // Act.
+            focusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            when (propagateFocus) {
+                true -> {
+                    assertThat(parentFocusModifier.focusDetailedState).isEqualTo(ActiveParent)
+                    assertThat(focusModifier.focusDetailedState).isEqualTo(ActiveParent)
+                    assertThat(childFocusModifier.focusDetailedState).isEqualTo(Active)
+                }
+                false -> {
+                    assertThat(parentFocusModifier.focusDetailedState).isEqualTo(ActiveParent)
+                    assertThat(focusModifier.focusDetailedState).isEqualTo(Active)
+                    assertThat(childFocusModifier.focusDetailedState).isEqualTo(Inactive)
+                }
+            }
+        }
+    }
+
+    @Test
+    fun rootNode() {
+        runOnUiThread {
+            // Arrange.
+            val rootFocusModifier = createFocusModifier(Inactive).also {
+                composeTestRule.setContent { Box(modifier = it) }
+            }
+
+            // Act.
+            rootFocusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            assertThat(rootFocusModifier.focusDetailedState).isEqualTo(Active)
+        }
+    }
+
+    @Test
+    fun rootNodeWithChildren() {
+        runOnUiThread {
+            // Arrange.
+            val rootFocusModifier = createFocusModifier(Inactive)
+            val childFocusModifier = createFocusModifier(Inactive)
+            composeTestRule.setContent {
+                Box(modifier = rootFocusModifier) {
+                    Box(modifier = childFocusModifier)
+                }
+            }
+
+            // Act.
+            rootFocusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            when (propagateFocus) {
+                true -> assertThat(rootFocusModifier.focusDetailedState).isEqualTo(ActiveParent)
+                false -> assertThat(rootFocusModifier.focusDetailedState).isEqualTo(Active)
+            }
+        }
+    }
+
+    @Test
+    fun parentNodeWithNoFocusedAncestor() {
+        runOnUiThread {
+            // Arrange.
+            val grandParentFocusModifier = createFocusModifier(Inactive)
+            val parentFocusModifier = createFocusModifier(Inactive)
+            val childFocusModifier = createFocusModifier(Inactive)
+            composeTestRule.setContent {
+                Box(modifier = grandParentFocusModifier) {
+                    Box(modifier = parentFocusModifier) {
+                        Box(modifier = childFocusModifier)
+                    }
+                }
+            }
+
+            // Act.
+            parentFocusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            when (propagateFocus) {
+                true -> assertThat(parentFocusModifier.focusDetailedState).isEqualTo(ActiveParent)
+                false -> assertThat(parentFocusModifier.focusDetailedState).isEqualTo(Active)
+            }
+        }
+    }
+
+    @Test
+    fun parentNodeWithNoFocusedAncestor_childRequestsFocus() {
+        runOnUiThread {
+            // Arrange.
+            val grandParentFocusModifier = createFocusModifier(Inactive)
+            val parentFocusModifier = createFocusModifier(Inactive)
+            val childFocusModifier = createFocusModifier(Inactive)
+            composeTestRule.setContent {
+                Box(modifier = grandParentFocusModifier) {
+                    Box(modifier = parentFocusModifier) {
+                        Box(modifier = childFocusModifier)
+                    }
+                }
+            }
+
+            // Act.
+            childFocusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            assertThat(parentFocusModifier.focusDetailedState).isEqualTo(ActiveParent)
+        }
+    }
+
+    @Test
+    fun childNodeWithNoFocusedAncestor() {
+        runOnUiThread {
+            // Arrange.
+            val grandParentFocusModifier = createFocusModifier(Inactive)
+            val parentFocusModifier = createFocusModifier(Inactive)
+            val childFocusModifier = createFocusModifier(Inactive)
+            composeTestRule.setContent {
+                Box(modifier = grandParentFocusModifier) {
+                    Box(modifier = parentFocusModifier) {
+                        Box(modifier = childFocusModifier)
+                    }
+                }
+            }
+
+            // Act.
+            childFocusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            assertThat(childFocusModifier.focusDetailedState).isEqualTo(Active)
+        }
+    }
+
+    @Test
+    fun requestFocus_parentIsFocused() {
+        runOnUiThread {
+            // Arrange.
+            val parentFocusModifier = createFocusModifier(Active)
+            val focusModifier = createFocusModifier(Inactive)
+            composeTestRule.setContent {
+                Box(modifier = parentFocusModifier) {
+                    Box(modifier = focusModifier)
+                }
+            }
+
+            // After executing requestFocus, siblingNode will be 'Active'.
+            focusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            assertThat(parentFocusModifier.focusDetailedState).isEqualTo(ActiveParent)
+            assertThat(focusModifier.focusDetailedState).isEqualTo(Active)
+        }
+    }
+
+    @Test
+    fun requestFocus_childIsFocused() {
+        runOnUiThread {
+            // Arrange.
+            val parentFocusModifier = createFocusModifier(ActiveParent)
+            val focusModifier = createFocusModifier(Active)
+            composeTestRule.setContent {
+                Box(modifier = parentFocusModifier) {
+                    Box(modifier = focusModifier)
+                }
+            }
+            parentFocusModifier.focusedChild = focusModifier.focusNode
+
+            // Act.
+            parentFocusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            when (propagateFocus) {
+                true -> {
+                    assertThat(parentFocusModifier.focusDetailedState).isEqualTo(ActiveParent)
+                    assertThat(focusModifier.focusDetailedState).isEqualTo(Active)
+                }
+                false -> {
+                    assertThat(parentFocusModifier.focusDetailedState).isEqualTo(Active)
+                    assertThat(focusModifier.focusDetailedState).isEqualTo(Inactive)
+                }
+            }
+        }
+    }
+
+    @Test
+    fun requestFocus_childHasCapturedFocus() {
+        runOnUiThread {
+            // Arrange.
+            val parentFocusModifier = createFocusModifier(ActiveParent)
+            val focusModifier = createFocusModifier(Captured)
+            composeTestRule.setContent {
+                Box(modifier = parentFocusModifier) {
+                    Box(modifier = focusModifier)
+                }
+            }
+            parentFocusModifier.focusedChild = focusModifier.focusNode
+
+            // Act.
+            parentFocusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            assertThat(parentFocusModifier.focusDetailedState).isEqualTo(ActiveParent)
+            assertThat(focusModifier.focusDetailedState).isEqualTo(Captured)
+        }
+    }
+
+    @Test
+    fun requestFocus_siblingIsFocused() {
+        runOnUiThread {
+            // Arrange.
+            val parentFocusModifier = createFocusModifier(ActiveParent)
+            val focusModifier = createFocusModifier(Inactive)
+            val siblingModifier = createFocusModifier(Active)
+            composeTestRule.setContent {
+                Box(modifier = parentFocusModifier) {
+                    Box(modifier = focusModifier)
+                    Box(modifier = siblingModifier)
+                }
+            }
+            parentFocusModifier.focusedChild = siblingModifier.focusNode
+
+            // Act.
+            focusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            assertThat(parentFocusModifier.focusDetailedState).isEqualTo(ActiveParent)
+            assertThat(focusModifier.focusDetailedState).isEqualTo(Active)
+            assertThat(siblingModifier.focusDetailedState).isEqualTo(Inactive)
+        }
+    }
+
+    @Test
+    fun requestFocus_siblingHasCapturedFocused() {
+        runOnUiThread {
+            // Arrange.
+            val parentFocusModifier = createFocusModifier(ActiveParent)
+            val focusModifier = createFocusModifier(Inactive)
+            val siblingModifier = createFocusModifier(Captured)
+            composeTestRule.setContent {
+                Box(modifier = parentFocusModifier) {
+                    Box(modifier = focusModifier)
+                    Box(modifier = siblingModifier)
+                }
+            }
+            parentFocusModifier.focusedChild = siblingModifier.focusNode
+
+            // Act.
+            focusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            assertThat(parentFocusModifier.focusDetailedState).isEqualTo(ActiveParent)
+            assertThat(focusModifier.focusDetailedState).isEqualTo(Inactive)
+            assertThat(siblingModifier.focusDetailedState).isEqualTo(Captured)
+        }
+    }
+
+    @Test
+    fun requestFocus_cousinIsFocused() {
+        runOnUiThread {
+            // Arrange.
+            val grandParentModifier = createFocusModifier(ActiveParent)
+            val parentModifier = createFocusModifier(Inactive)
+            val focusModifier = createFocusModifier(Inactive)
+            val auntModifier = createFocusModifier(ActiveParent)
+            val cousinModifier = createFocusModifier(Active)
+            composeTestRule.setContent {
+                Box(modifier = grandParentModifier) {
+                    Box(modifier = parentModifier) {
+                        Box(modifier = focusModifier)
+                    }
+                    Box(modifier = auntModifier) {
+                        Box(modifier = cousinModifier)
+                    }
+                }
+            }
+            grandParentModifier.focusedChild = auntModifier.focusNode
+            auntModifier.focusedChild = cousinModifier.focusNode
+
+            // Verify Setup.
+            assertThat(cousinModifier.focusDetailedState).isEqualTo(Active)
+            assertThat(focusModifier.focusDetailedState).isEqualTo(Inactive)
+
+            // Act.
+            focusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            assertThat(cousinModifier.focusDetailedState).isEqualTo(Inactive)
+            assertThat(focusModifier.focusDetailedState).isEqualTo(Active)
+        }
+    }
+
+    @Test
+    fun requestFocus_grandParentIsFocused() {
+        runOnUiThread {
+            // Arrange.
+            val grandParentModifier = createFocusModifier(Active)
+            val parentModifier = createFocusModifier(Inactive)
+            val focusModifier = createFocusModifier(Inactive)
+            composeTestRule.setContent {
+                Box(modifier = grandParentModifier) {
+                    Box(modifier = parentModifier) {
+                        Box(modifier = focusModifier)
+                    }
+                }
+            }
+
+            // Act.
+            focusModifier.focusNode.requestFocus(propagateFocus)
+
+            // Assert.
+            assertThat(grandParentModifier.focusDetailedState).isEqualTo(ActiveParent)
+            assertThat(parentModifier.focusDetailedState).isEqualTo(ActiveParent)
+            assertThat(focusModifier.focusDetailedState).isEqualTo(Active)
+        }
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/AndroidOwner.kt b/ui/ui-platform/src/main/java/androidx/ui/core/AndroidOwner.kt
index 44b440d..546b225 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/AndroidOwner.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/AndroidOwner.kt
@@ -31,6 +31,7 @@
 import android.view.autofill.AutofillValue
 import android.view.inputmethod.EditorInfo
 import android.view.inputmethod.InputConnection
+import androidx.annotation.RestrictTo
 import androidx.ui.autofill.AndroidAutofill
 import androidx.ui.autofill.Autofill
 import androidx.ui.autofill.AutofillTree
@@ -39,12 +40,17 @@
 import androidx.ui.autofill.registerCallback
 import androidx.ui.autofill.unregisterCallback
 import androidx.ui.core.Owner.Companion.enableExtraAssertions
+import androidx.ui.core.clipboard.AndroidClipboardManager
+import androidx.ui.core.clipboard.ClipboardManager
+import androidx.ui.core.focus.FocusModifierImpl
 import androidx.ui.core.hapticfeedback.AndroidHapticFeedback
 import androidx.ui.core.hapticfeedback.HapticFeedback
 import androidx.ui.core.pointerinput.MotionEventAdapter
 import androidx.ui.core.pointerinput.PointerInputEventProcessor
 import androidx.ui.core.semantics.SemanticsOwner
 import androidx.ui.core.text.AndroidFontResourceLoader
+import androidx.ui.focus.FocusDetailedState.Inactive
+import androidx.ui.focus.FocusDetailedState.Active
 import androidx.ui.graphics.Canvas
 import androidx.ui.input.TextInputService
 import androidx.ui.input.TextInputServiceAndroid
@@ -57,12 +63,15 @@
 import androidx.ui.unit.ipx
 import androidx.ui.unit.max
 import androidx.ui.util.trace
+import org.jetbrains.annotations.TestOnly
 import java.lang.reflect.Method
 
 /***
  * This function creates an instance of [AndroidOwner]
  */
-fun createOwner(context: Context): AndroidOwner = AndroidComposeView(context)
+fun createOwner(context: Context): AndroidOwner = AndroidComposeView(context).also {
+    AndroidOwner.onAndroidOwnerCreatedCallback?.invoke(it)
+}
 
 @TargetApi(Build.VERSION_CODES.LOLLIPOP)
 internal class AndroidComposeView constructor(context: Context) :
@@ -73,10 +82,12 @@
     override var density = Density(context)
         private set
 
+    private val focusModifier: FocusModifierImpl = FocusModifierImpl(Inactive)
+
     override val root = LayoutNode().also {
         it.measureBlocks = RootMeasureBlocks
         it.layoutDirection = context.getLayoutDirection()
-        it.modifier = Modifier.drawLayer(clipToBounds = false)
+        it.modifier = Modifier.drawLayer(clipToBounds = false) + focusModifier
     }
 
     // LayoutNodes that need measure and layout
@@ -127,6 +138,21 @@
         }
         private set
 
+    override fun dispatchWindowFocusChanged(hasFocus: Boolean) {
+        if (hasFocus) {
+            focusModifier.focusDetailedState = Active
+            // TODO(b/152535715): propagate focus to children based on child focusability.
+        } else {
+            // If this view lost focus, clear focus from the children. For now we clear focus
+            // from the children by requesting focus on the parent.
+            // TODO(b/151335411): use clearFocus() instead.
+            focusModifier.apply {
+                requestFocus()
+                focusDetailedState = Inactive
+            }
+        }
+    }
+
     /**
      * Flag to indicate that we're currently measuring.
      */
@@ -464,20 +490,24 @@
                     val onPaintWithChildren = node.onPaintWithChildren
                     if (onPaintWithChildren != null) {
                         val ownerData = node.ownerData
-                        val receiver: DrawReceiverImpl
+                        val receiver: DrawScopeImpl
                         if (ownerData == null) {
-                            receiver = DrawReceiverImpl(node, canvas, parentSize, density)
+                            receiver = DrawScopeImpl(node, canvas, parentSize, density)
                             node.ownerData = receiver
                         } else {
-                            receiver = ownerData as DrawReceiverImpl
+                            receiver = ownerData as DrawScopeImpl
                             receiver.childDrawn = false
                             receiver.canvas = canvas
-                            receiver.parentSize = parentSize
+                            receiver.size = parentSize
                             receiver.currentDensity = density
                         }
                         onPaintWithChildren(receiver, canvas, parentSize)
                         if (!receiver.childDrawn) {
-                            receiver.drawChildren()
+                            with(receiver) {
+                                with(density) {
+                                    drawContent()
+                                }
+                            }
                         }
                     } else {
                         val onPaint = node.onPaint!!
@@ -489,7 +519,7 @@
                     if (node.isPlaced) {
                         require(!node.needsRemeasure) { "$node is not measured, draw requested" }
                         require(!node.needsRelayout) { "$node is not laid out, draw requested" }
-                        node.draw(canvas, density)
+                        node.draw(canvas)
                     }
                 }
                 else -> node.visitChildren {
@@ -501,7 +531,7 @@
 
     override fun createLayer(
         drawLayerModifier: DrawLayerModifier,
-        drawBlock: (Canvas, Density) -> Unit,
+        drawBlock: (Canvas) -> Unit,
         invalidateParentLayer: () -> Unit
     ): OwnedLayer {
         val layer = if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P || isInEditMode()) {
@@ -530,7 +560,7 @@
         // we don't have to observe here because the root has a layer modifier
         // that will observe all children. The AndroidComposeView has only the
         // root, so it doesn't have to invalidate itself based on model changes.
-        root.draw(uiCanvas, density)
+        root.draw(uiCanvas)
 
         if (dirtyLayers.isNotEmpty()) {
             for (i in 0 until dirtyLayers.size) {
@@ -611,6 +641,11 @@
     override val hapticFeedBack: HapticFeedback =
         AndroidHapticFeedback(this)
 
+    /**
+     * Provide clipboard manager to the user. Use the Android version of clipboard manager.
+     */
+    override val clipboardManager: ClipboardManager = AndroidClipboardManager(context)
+
     override fun onCheckIsTextEditor(): Boolean = textInputServiceAndroid.isEditorFocused()
 
     override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection? =
@@ -661,24 +696,21 @@
         onRestoreInstanceState(superState)
     }
 
-    private inner class DrawReceiverImpl(
+    private inner class DrawScopeImpl(
         private val drawNode: DrawNode,
         var canvas: Canvas,
-        var parentSize: PxSize,
+        override var size: PxSize,
         var currentDensity: Density
-    ) : DrawReceiver {
+    ) : Canvas by canvas, Density by currentDensity, ContentDrawScope {
         internal var childDrawn = false
 
-        override val density: Float get() = currentDensity.density
-        override val fontScale: Float get() = currentDensity.fontScale
-
-        override fun drawChildren() {
+        override fun drawContent() {
             if (childDrawn) {
-                throw IllegalStateException("Cannot call drawChildren() twice within Draw element")
+                throw IllegalStateException("Cannot call drawContent() twice within Draw element")
             }
             childDrawn = true
             drawNode.visitChildren { child ->
-                callDraw(canvas, child, parentSize)
+                callDraw(canvas, child, size)
             }
         }
     }
@@ -792,6 +824,19 @@
      * from the hierarchy.
      */
     fun removeAndroidView(view: View)
+
+    /** @suppress */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    companion object {
+        /**
+         * Called after an [AndroidOwner] is created. Used by AndroidComposeTestRule to keep
+         * track of all attached [AndroidComposeView]s. Not to be set or used by any other
+         * component.
+         */
+        var onAndroidOwnerCreatedCallback: ((AndroidOwner) -> Unit)? = null
+            @TestOnly
+            set
+    }
 }
 
 private class ConstraintRange(val min: IntPx, val max: IntPx)
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/ComponentNodes.kt b/ui/ui-platform/src/main/java/androidx/ui/core/ComponentNodes.kt
index 4ef8f86..afc27ec 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/ComponentNodes.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/ComponentNodes.kt
@@ -15,6 +15,8 @@
  */
 package androidx.ui.core
 
+import androidx.ui.core.focus.FocusModifierImpl
+import androidx.ui.core.focus.ModifiedFocusNode
 import androidx.ui.core.focus.findParentFocusNode
 import androidx.ui.core.focus.ownerHasFocus
 import androidx.ui.core.focus.requestFocusForOwner
@@ -28,6 +30,7 @@
 import androidx.ui.focus.FocusDetailedState.Captured
 import androidx.ui.focus.FocusDetailedState.Disabled
 import androidx.ui.focus.FocusDetailedState.Inactive
+import androidx.ui.focus.FocusModifier
 import androidx.ui.graphics.Canvas
 import androidx.ui.unit.Density
 import androidx.ui.unit.IntPx
@@ -652,7 +655,7 @@
  * Backing node for the Draw component.
  */
 class DrawNode : ComponentNode() {
-    var onPaintWithChildren: (DrawReceiver.(canvas: Canvas, parentSize: PxSize) -> Unit)? = null
+    var onPaintWithChildren: (ContentDrawScope.(canvas: Canvas, parentSize: PxSize) -> Unit)? = null
         set(value) {
             field = value
             invalidate()
@@ -1025,7 +1028,7 @@
     /**
      * The [Modifier] currently applied to this node.
      */
-    var modifier: Modifier = Modifier.None
+    var modifier: Modifier = Modifier
         set(value) {
             if (value == field) return
             field = value
@@ -1055,6 +1058,10 @@
                     wrapper = LayerWrapper(wrapper, mod)
                     outerLayerModifier = mod
                 }
+                if (mod is FocusModifier) {
+                    require(mod is FocusModifierImpl)
+                    wrapper = ModifiedFocusNode(wrapper, mod).also { mod.focusNode = it }
+                }
                 if (mod is PointerInputModifier) {
                     wrapper = PointerInputDelegatingWrapper(wrapper, mod)
                 }
@@ -1192,7 +1199,7 @@
         }
     }
 
-    fun draw(canvas: Canvas, density: Density) = layoutNodeWrapper.draw(canvas, density)
+    fun draw(canvas: Canvas) = layoutNodeWrapper.draw(canvas)
 
     /**
      * Carries out a hit test on the [PointerInputModifier]s associated with this [LayoutNode] and
@@ -1588,10 +1595,6 @@
     insertAt(count, child)
 }
 
-class Ref<T> {
-    var value: T? = null
-}
-
 /**
  * Executes [block] on first level of [LayoutNode] descendants of this ComponentNode.
  */
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/DelegatingLayoutNodeWrapper.kt b/ui/ui-platform/src/main/java/androidx/ui/core/DelegatingLayoutNodeWrapper.kt
new file mode 100644
index 0000000..085b9d2
--- /dev/null
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/DelegatingLayoutNodeWrapper.kt
@@ -0,0 +1,120 @@
+/*
+ * 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.ui.core
+
+import androidx.ui.core.focus.ModifiedFocusNode
+import androidx.ui.core.pointerinput.PointerInputFilter
+import androidx.ui.graphics.Canvas
+import androidx.ui.unit.IntPx
+import androidx.ui.unit.IntPxPosition
+import androidx.ui.unit.PxPosition
+import androidx.ui.unit.round
+import androidx.ui.unit.toPx
+
+/**
+ * [LayoutNodeWrapper] with default implementations for methods.
+ */
+internal open class DelegatingLayoutNodeWrapper(
+    override val wrapped: LayoutNodeWrapper
+) : LayoutNodeWrapper(wrapped.layoutNode) {
+    override val providedAlignmentLines: Set<AlignmentLine>
+        get() = wrapped.providedAlignmentLines
+
+    private var _isAttached = true
+    override val isAttached: Boolean
+        get() = _isAttached && layoutNode.isAttached()
+
+    init {
+        wrapped.wrappedBy = this
+    }
+
+    override fun draw(canvas: Canvas) {
+        withPositionTranslation(canvas) {
+            wrapped.draw(canvas)
+        }
+    }
+
+    override fun hitTest(
+        pointerPositionRelativeToScreen: PxPosition,
+        hitPointerInputFilters: MutableList<PointerInputFilter>
+    ): Boolean {
+        if (isGlobalPointerInBounds(pointerPositionRelativeToScreen)) {
+            return wrapped.hitTest(pointerPositionRelativeToScreen, hitPointerInputFilters)
+        } else {
+            // Anything out of bounds of ourselves can't be hit.
+            return false
+        }
+    }
+
+    override fun get(line: AlignmentLine): IntPx? {
+        val value = wrapped[line] ?: return null
+        val px = value.toPx()
+        val pos = wrapped.toParentPosition(PxPosition(px, px))
+        return if (line is HorizontalAlignmentLine) pos.y.round() else pos.y.round()
+    }
+
+    override fun place(position: IntPxPosition) {
+        this.position = position
+        measureResult.placeChildren(layoutNode.layoutDirection!!)
+    }
+
+    override fun performMeasure(constraints: Constraints): Placeable {
+        val placeable = wrapped.measure(constraints)
+        measureResult = object : MeasureScope.MeasureResult {
+            override val width: IntPx = wrapped.measureResult.width
+            override val height: IntPx = wrapped.measureResult.height
+            override val alignmentLines: Map<AlignmentLine, IntPx> = emptyMap()
+            override fun placeChildren(layoutDirection: LayoutDirection) {
+                placeable.placeAbsolute(-apparentToRealOffset)
+            }
+        }
+        return this
+    }
+
+    override fun findLayer(): OwnedLayer? {
+        return wrappedBy?.findLayer()
+    }
+
+    override fun findFocusWrapperWrappingThisWrapper() =
+        wrappedBy?.findFocusWrapperWrappingThisWrapper()
+
+    override fun findFocusWrapperWrappedByThisWrapper() =
+        wrapped.findFocusWrapperWrappedByThisWrapper()
+
+    override fun findLastFocusWrapper(): ModifiedFocusNode? {
+        var lastFocusWrapper: ModifiedFocusNode? = null
+
+        // Find last focus wrapper for the current layout node.
+        var next: ModifiedFocusNode? = findFocusWrapperWrappedByThisWrapper()
+        while (next != null) {
+            lastFocusWrapper = next
+            next = next.wrapped.findFocusWrapperWrappedByThisWrapper()
+        }
+        return lastFocusWrapper
+    }
+
+    override fun minIntrinsicWidth(height: IntPx) = wrapped.minIntrinsicWidth(height)
+    override fun maxIntrinsicWidth(height: IntPx) = wrapped.maxIntrinsicWidth(height)
+    override fun minIntrinsicHeight(width: IntPx) = wrapped.minIntrinsicHeight(width)
+    override fun maxIntrinsicHeight(width: IntPx) = wrapped.maxIntrinsicHeight(width)
+    override val parentData: Any? get() = wrapped.parentData
+
+    override fun detach() {
+        _isAttached = false
+        wrapped.detach()
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/InnerPlaceable.kt b/ui/ui-platform/src/main/java/androidx/ui/core/InnerPlaceable.kt
new file mode 100644
index 0000000..30179e0
--- /dev/null
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/InnerPlaceable.kt
@@ -0,0 +1,180 @@
+/*
+ * 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.ui.core
+
+import androidx.ui.core.focus.ModifiedFocusNode
+import androidx.ui.core.pointerinput.PointerInputFilter
+import androidx.ui.graphics.Canvas
+import androidx.ui.graphics.Color
+import androidx.ui.graphics.Paint
+import androidx.ui.graphics.PaintingStyle
+import androidx.ui.unit.Density
+import androidx.ui.unit.IntPx
+import androidx.ui.unit.IntPxPosition
+import androidx.ui.unit.PxPosition
+import androidx.ui.unit.toPxSize
+import androidx.ui.util.fastAny
+import androidx.ui.util.fastForEach
+
+internal class InnerPlaceable(
+    layoutNode: LayoutNode
+) : LayoutNodeWrapper(layoutNode), Density by layoutNode.measureScope {
+
+    override val providedAlignmentLines: Set<AlignmentLine>
+        get() = layoutNode.providedAlignmentLines.keys
+    override val isAttached: Boolean
+        get() = layoutNode.isAttached()
+
+    override fun performMeasure(constraints: Constraints): Placeable {
+        val measureResult = layoutNode.measureBlocks.measure(
+            layoutNode.measureScope,
+            layoutNode.layoutChildren,
+            constraints,
+            layoutNode.layoutDirection!!
+        )
+        layoutNode.handleMeasureResult(measureResult)
+        return this
+    }
+
+    override val parentData: Any?
+        @Suppress("DEPRECATION")
+        get() = if (layoutNode.handlesParentData) {
+            layoutNode.parentDataNode?.value
+        } else {
+            layoutNode.parentDataNode?.value
+                ?: layoutNode.layoutChildren
+                    .firstOrNull { it.layoutNodeWrapper.parentData != null }?.parentData
+        }
+
+    override fun findLayer(): OwnedLayer? {
+        return wrappedBy?.findLayer()
+    }
+
+    override fun findFocusWrapperWrappingThisWrapper() =
+        wrappedBy?.findFocusWrapperWrappingThisWrapper()
+
+    override fun findFocusWrapperWrappedByThisWrapper() = null
+
+    override fun findLastFocusWrapper(): ModifiedFocusNode? = findFocusWrapperWrappingThisWrapper()
+
+    override fun minIntrinsicWidth(height: IntPx): IntPx {
+        return layoutNode.measureBlocks.minIntrinsicWidth(
+            layoutNode.measureScope,
+            layoutNode.layoutChildren,
+            height,
+            layoutNode.layoutDirection!!
+        )
+    }
+
+    override fun minIntrinsicHeight(width: IntPx): IntPx {
+        return layoutNode.measureBlocks.minIntrinsicHeight(
+            layoutNode.measureScope,
+            layoutNode.layoutChildren,
+            width,
+            layoutNode.layoutDirection!!
+        )
+    }
+
+    override fun maxIntrinsicWidth(height: IntPx): IntPx {
+        return layoutNode.measureBlocks.maxIntrinsicWidth(
+            layoutNode.measureScope,
+            layoutNode.layoutChildren,
+            height,
+            layoutNode.layoutDirection!!
+        )
+    }
+
+    override fun maxIntrinsicHeight(width: IntPx): IntPx {
+        return layoutNode.measureBlocks.maxIntrinsicHeight(
+            layoutNode.measureScope,
+            layoutNode.layoutChildren,
+            width,
+            layoutNode.layoutDirection!!
+        )
+    }
+
+    override fun place(position: IntPxPosition) {
+        layoutNode.isPlaced = true
+        val wasMoved = position != this.position
+        this.position = position
+        if (wasMoved) {
+            layoutNode.owner?.onPositionChange(layoutNode)
+        }
+        layoutNode.layout()
+    }
+
+    override operator fun get(line: AlignmentLine): IntPx? {
+        return layoutNode.calculateAlignmentLines()[line]
+    }
+
+    override fun draw(canvas: Canvas) {
+        withPositionTranslation(canvas) {
+            val owner = layoutNode.requireOwner()
+            val sizePx = measuredSize.toPxSize()
+            layoutNode.zIndexSortedChildren.fastForEach { child ->
+                owner.callDraw(canvas, child, sizePx)
+            }
+            if (owner.showLayoutBounds) {
+                drawBorder(canvas, innerBoundsPaint)
+            }
+        }
+    }
+
+    override fun hitTest(
+        pointerPositionRelativeToScreen: PxPosition,
+        hitPointerInputFilters: MutableList<PointerInputFilter>
+    ): Boolean {
+        if (isGlobalPointerInBounds(pointerPositionRelativeToScreen)) {
+            // Any because as soon as true is returned, we know we have found a hit path and we must
+            //  not add PointerInputFilters on different paths so we should not even go looking.
+            return layoutNode.children.reversed().fastAny { child ->
+                callHitTest(child, pointerPositionRelativeToScreen, hitPointerInputFilters)
+            }
+        } else {
+            // Anything out of bounds of ourselves can't be hit.
+            return false
+        }
+    }
+
+    override fun detach() {
+        // Do nothing. InnerPlaceable only is detached when the LayoutNode is detached.
+    }
+
+    internal companion object {
+        val innerBoundsPaint = Paint().also { paint ->
+            paint.color = Color.Red
+            paint.strokeWidth = 1f
+            paint.style = PaintingStyle.stroke
+        }
+
+        private fun callHitTest(
+            node: ComponentNode,
+            globalPoint: PxPosition,
+            hitPointerInputFilters: MutableList<PointerInputFilter>
+        ): Boolean {
+            if (node is LayoutNode) {
+                return node.hitTest(globalPoint, hitPointerInputFilters)
+            } else {
+                // Any because as soon as true is returned, we know we have found a hit path and we must
+                // not add PointerInputFilters on different paths so we should not even go looking.
+                return node.children.reversed().fastAny { child ->
+                    callHitTest(child, globalPoint, hitPointerInputFilters)
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/LayerWrapper.kt b/ui/ui-platform/src/main/java/androidx/ui/core/LayerWrapper.kt
new file mode 100644
index 0000000..6a24b0e
--- /dev/null
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/LayerWrapper.kt
@@ -0,0 +1,106 @@
+/*
+ * 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.ui.core
+
+import android.graphics.RectF
+import androidx.ui.graphics.Canvas
+import androidx.ui.unit.IntPxPosition
+import androidx.ui.unit.PxPosition
+import androidx.ui.unit.px
+
+internal class LayerWrapper(
+    wrapped: LayoutNodeWrapper,
+    val drawLayerModifier: DrawLayerModifier
+) : DelegatingLayoutNodeWrapper(wrapped) {
+    private var _layer: OwnedLayer? = null
+    private var layerDestroyed = false
+
+    private val invalidateParentLayer: () -> Unit = {
+        wrappedBy?.findLayer()?.invalidate()
+    }
+
+    val layer: OwnedLayer
+        get() {
+            return _layer ?: layoutNode.requireOwner().createLayer(
+                drawLayerModifier,
+                wrapped::draw,
+                invalidateParentLayer
+            ).also {
+                _layer = it
+                invalidateParentLayer()
+            }
+        }
+
+    // TODO(mount): This cache isn't thread safe at all.
+    private var positionCache: FloatArray? = null
+
+    override fun performMeasure(constraints: Constraints): Placeable {
+        val placeable = super.performMeasure(constraints)
+        layer.resize(measuredSize)
+        return placeable
+    }
+
+    override fun place(position: IntPxPosition) {
+        super.place(position)
+        layer.move(position)
+    }
+
+    override fun draw(canvas: Canvas) {
+        layer.drawLayer(canvas)
+    }
+
+    override fun detach() {
+        super.detach()
+        _layer?.destroy()
+    }
+
+    override fun findLayer(): OwnedLayer? {
+        return layer
+    }
+
+    override fun toParentPosition(position: PxPosition): PxPosition {
+        val matrix = layer.getMatrix()
+        if (!matrix.isIdentity) {
+            val x = position.x.value
+            val y = position.y.value
+            val cache = positionCache
+            val point = if (cache != null) {
+                cache[0] = x
+                cache[1] = y
+                cache
+            } else {
+                floatArrayOf(x, y).also { positionCache = it }
+            }
+            matrix.mapPoints(point)
+            return super.toParentPosition(PxPosition(point[0].px, point[1].px))
+        } else {
+            return super.toParentPosition(position)
+        }
+    }
+
+    override fun rectInParent(bounds: RectF) {
+        if ((drawLayerModifier.clipToBounds ||
+                    (drawLayerModifier.clipToOutline && drawLayerModifier.outlineShape != null)) &&
+            !bounds.intersect(0f, 0f, size.width.value.toFloat(), size.height.value.toFloat())
+        ) {
+            bounds.setEmpty()
+        }
+        val matrix = layer.getMatrix()
+        matrix.mapRect(bounds)
+        return super.rectInParent(bounds)
+    }
+}
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/LayoutNodeWrapper.kt b/ui/ui-platform/src/main/java/androidx/ui/core/LayoutNodeWrapper.kt
index 6d60180..0d7e892 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/LayoutNodeWrapper.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/LayoutNodeWrapper.kt
@@ -21,40 +21,35 @@
 import android.graphics.RectF
 import androidx.ui.core.focus.ModifiedFocusNode
 import androidx.ui.core.pointerinput.PointerInputFilter
-import androidx.ui.core.pointerinput.PointerInputModifier
 import androidx.ui.geometry.Rect
 import androidx.ui.graphics.Canvas
-import androidx.ui.graphics.Color
 import androidx.ui.graphics.Paint
-import androidx.ui.graphics.PaintingStyle
-import androidx.ui.unit.Density
-import androidx.ui.unit.IntPx
 import androidx.ui.unit.IntPxPosition
 import androidx.ui.unit.IntPxSize
 import androidx.ui.unit.PxBounds
 import androidx.ui.unit.PxPosition
 import androidx.ui.unit.px
-import androidx.ui.unit.round
-import androidx.ui.unit.toPx
 import androidx.ui.unit.toPxPosition
-import androidx.ui.unit.toPxSize
-import androidx.ui.util.fastAny
-import androidx.ui.util.fastForEach
 
 /**
  * Measurable and Placeable type that has a position.
  */
-internal sealed class LayoutNodeWrapper(
+internal abstract class LayoutNodeWrapper(
     internal val layoutNode: LayoutNode
 ) : Placeable(), Measurable, LayoutCoordinates {
     internal open val wrapped: LayoutNodeWrapper? = null
     internal var wrappedBy: LayoutNodeWrapper? = null
-    open var position = IntPxPosition.Origin
+    var position = IntPxPosition.Origin
 
-    private var dirtySize: Boolean = false
+    protected var dirtySize: Boolean = false
     fun hasDirtySize(): Boolean = dirtySize || (wrapped?.hasDirtySize() ?: false)
     // TODO(popam): avoid allocation here
-    final override val size: IntPxSize get() = IntPxSize(measureResult.width, measureResult.height)
+    final override val measuredSize: IntPxSize
+        get() = IntPxSize(measureResult.width, measureResult.height)
+    // Size exposed to LayoutCoordinates.
+    final override val size: IntPxSize get() = measuredSize
+
+    final override var measurementConstraints = Constraints()
 
     private var _measureResult: MeasureScope.MeasureResult? = null
     var measureResult: MeasureScope.MeasureResult
@@ -84,9 +79,22 @@
         //  so calling this is expensive.  Would be nice to cache data such that this is cheap.
         val localPointerPosition = globalToLocal(globalPointerPosition)
         return localPointerPosition.x.value >= 0 &&
-                localPointerPosition.x < size.width &&
+                localPointerPosition.x < measuredSize.width &&
                 localPointerPosition.y.value >= 0 &&
-                localPointerPosition.y < size.height
+                localPointerPosition.y < measuredSize.height
+    }
+
+    /**
+     * Measures the modified child.
+     */
+    abstract fun performMeasure(constraints: Constraints): Placeable
+
+    /**
+     * Measures the modified child.
+     */
+    final override fun measure(constraints: Constraints): Placeable {
+        measurementConstraints = constraints
+        return performMeasure(constraints)
     }
 
     /**
@@ -105,7 +113,7 @@
     /**
      * Draws the content of the LayoutNode
      */
-    abstract fun draw(canvas: Canvas, density: Density)
+    abstract fun draw(canvas: Canvas)
 
     /**
      * Executes a hit test on any appropriate type associated with this [LayoutNodeWrapper].
@@ -190,8 +198,8 @@
         val rect = Rect(
             left = 0.5f,
             top = 0.5f,
-            right = size.width.value.toFloat() - 0.5f,
-            bottom = size.height.value.toFloat() - 0.5f
+            right = measuredSize.width.value.toFloat() - 0.5f,
+            bottom = measuredSize.height.value.toFloat() - 0.5f
         )
         canvas.drawRect(rect, paint)
     }
@@ -297,536 +305,3 @@
         const val UnmeasuredError = "Asking for measurement result of unmeasured layout modifier"
     }
 }
-
-/**
- * [LayoutNodeWrapper] with default implementations for methods.
- */
-internal open class DelegatingLayoutNodeWrapper(
-    override val wrapped: LayoutNodeWrapper
-) : LayoutNodeWrapper(wrapped.layoutNode) {
-    override val providedAlignmentLines: Set<AlignmentLine>
-        get() = wrapped.providedAlignmentLines
-
-    private var _isAttached = true
-    override val isAttached: Boolean
-        get() = _isAttached && layoutNode.isAttached()
-
-    init {
-        wrapped.wrappedBy = this
-    }
-
-    override fun draw(canvas: Canvas, density: Density) {
-        withPositionTranslation(canvas) {
-            wrapped.draw(canvas, density)
-        }
-    }
-
-    override fun hitTest(
-        pointerPositionRelativeToScreen: PxPosition,
-        hitPointerInputFilters: MutableList<PointerInputFilter>
-    ): Boolean {
-        if (isGlobalPointerInBounds(pointerPositionRelativeToScreen)) {
-            return wrapped.hitTest(pointerPositionRelativeToScreen, hitPointerInputFilters)
-        } else {
-            // Anything out of bounds of ourselves can't be hit.
-            return false
-        }
-    }
-
-    override fun get(line: AlignmentLine): IntPx? {
-        val value = wrapped[line] ?: return null
-        val px = value.toPx()
-        val pos = wrapped.toParentPosition(PxPosition(px, px))
-        return if (line is HorizontalAlignmentLine) pos.y.round() else pos.y.round()
-    }
-
-    override fun place(position: IntPxPosition) {
-        this.position = position
-        measureResult.placeChildren(layoutNode.layoutDirection!!)
-    }
-
-    override fun measure(constraints: Constraints): Placeable {
-        val placeable = wrapped.measure(constraints)
-        measureResult = object : MeasureScope.MeasureResult {
-            override val width: IntPx = wrapped.measureResult.width
-            override val height: IntPx = wrapped.measureResult.height
-            override val alignmentLines: Map<AlignmentLine, IntPx> = emptyMap()
-            override fun placeChildren(layoutDirection: LayoutDirection) {
-                placeable.placeAbsolute(IntPxPosition.Origin)
-            }
-        }
-        return this
-    }
-
-    override fun findLayer(): OwnedLayer? {
-        return wrappedBy?.findLayer()
-    }
-
-    override fun findFocusWrapperWrappingThisWrapper() =
-        wrappedBy?.findFocusWrapperWrappingThisWrapper()
-
-    override fun findFocusWrapperWrappedByThisWrapper() =
-        wrapped.findFocusWrapperWrappedByThisWrapper()
-
-    override fun findLastFocusWrapper(): ModifiedFocusNode? {
-        var lastFocusWrapper: ModifiedFocusNode? = null
-
-        // Find last focus wrapper for the current layout node.
-        var next: ModifiedFocusNode? = findFocusWrapperWrappedByThisWrapper()
-        while (next != null) {
-            lastFocusWrapper = next
-            next = next.wrapped.findFocusWrapperWrappedByThisWrapper()
-        }
-        return lastFocusWrapper
-    }
-
-    override fun minIntrinsicWidth(height: IntPx) = wrapped.minIntrinsicWidth(height)
-    override fun maxIntrinsicWidth(height: IntPx) = wrapped.maxIntrinsicWidth(height)
-    override fun minIntrinsicHeight(width: IntPx) = wrapped.minIntrinsicHeight(width)
-    override fun maxIntrinsicHeight(width: IntPx) = wrapped.maxIntrinsicHeight(width)
-    override val parentData: Any? get() = wrapped.parentData
-
-    override fun detach() {
-        _isAttached = false
-        wrapped.detach()
-    }
-}
-
-internal class InnerPlaceable(
-    layoutNode: LayoutNode
-) : LayoutNodeWrapper(layoutNode), Density by layoutNode.measureScope {
-
-    override val providedAlignmentLines: Set<AlignmentLine>
-        get() = layoutNode.providedAlignmentLines.keys
-    override val isAttached: Boolean
-        get() = layoutNode.isAttached()
-
-    override fun measure(constraints: Constraints): Placeable {
-        val measureResult = layoutNode.measureBlocks.measure(
-            layoutNode.measureScope,
-            layoutNode.layoutChildren,
-            constraints,
-            layoutNode.layoutDirection!!
-        )
-        layoutNode.handleMeasureResult(measureResult)
-        return this
-    }
-
-    override val parentData: Any?
-        @Suppress("DEPRECATION")
-        get() = if (layoutNode.handlesParentData) {
-            layoutNode.parentDataNode?.value
-        } else {
-            layoutNode.parentDataNode?.value
-                ?: layoutNode.layoutChildren
-                    .firstOrNull { it.layoutNodeWrapper.parentData != null }?.parentData
-        }
-
-    override fun findLayer(): OwnedLayer? {
-        return wrappedBy?.findLayer()
-    }
-
-    override fun findFocusWrapperWrappingThisWrapper() =
-        wrappedBy?.findFocusWrapperWrappingThisWrapper()
-
-    override fun findFocusWrapperWrappedByThisWrapper() = null
-
-    override fun findLastFocusWrapper(): ModifiedFocusNode? = findFocusWrapperWrappingThisWrapper()
-
-    override fun minIntrinsicWidth(height: IntPx): IntPx {
-        return layoutNode.measureBlocks.minIntrinsicWidth(
-            layoutNode.measureScope,
-            layoutNode.layoutChildren,
-            height,
-            layoutNode.layoutDirection!!
-        )
-    }
-
-    override fun minIntrinsicHeight(width: IntPx): IntPx {
-        return layoutNode.measureBlocks.minIntrinsicHeight(
-            layoutNode.measureScope,
-            layoutNode.layoutChildren,
-            width,
-            layoutNode.layoutDirection!!
-        )
-    }
-
-    override fun maxIntrinsicWidth(height: IntPx): IntPx {
-        return layoutNode.measureBlocks.maxIntrinsicWidth(
-            layoutNode.measureScope,
-            layoutNode.layoutChildren,
-            height,
-            layoutNode.layoutDirection!!
-        )
-    }
-
-    override fun maxIntrinsicHeight(width: IntPx): IntPx {
-        return layoutNode.measureBlocks.maxIntrinsicHeight(
-            layoutNode.measureScope,
-            layoutNode.layoutChildren,
-            width,
-            layoutNode.layoutDirection!!
-        )
-    }
-
-    override fun place(position: IntPxPosition) {
-        layoutNode.isPlaced = true
-        val wasMoved = position != this.position
-        this.position = position
-        if (wasMoved) {
-            layoutNode.owner?.onPositionChange(layoutNode)
-        }
-        layoutNode.layout()
-    }
-
-    override operator fun get(line: AlignmentLine): IntPx? {
-        return layoutNode.calculateAlignmentLines()[line]
-    }
-
-    override fun draw(canvas: Canvas, density: Density) {
-        withPositionTranslation(canvas) {
-            val owner = layoutNode.requireOwner()
-            val sizePx = size.toPxSize()
-            layoutNode.zIndexSortedChildren.fastForEach { child ->
-                owner.callDraw(canvas, child, sizePx)
-            }
-            if (owner.showLayoutBounds) {
-                drawBorder(canvas, innerBoundsPaint)
-            }
-        }
-    }
-
-    override fun hitTest(
-        pointerPositionRelativeToScreen: PxPosition,
-        hitPointerInputFilters: MutableList<PointerInputFilter>
-    ): Boolean {
-        if (isGlobalPointerInBounds(pointerPositionRelativeToScreen)) {
-            // Any because as soon as true is returned, we know we have found a hit path and we must
-            //  not add PointerInputFilters on different paths so we should not even go looking.
-            return layoutNode.children.reversed().fastAny { child ->
-                callHitTest(child, pointerPositionRelativeToScreen, hitPointerInputFilters)
-            }
-        } else {
-            // Anything out of bounds of ourselves can't be hit.
-            return false
-        }
-    }
-
-    override fun detach() {
-        // Do nothing. InnerPlaceable only is detached when the LayoutNode is detached.
-    }
-
-    internal companion object {
-        val innerBoundsPaint = Paint().also { paint ->
-            paint.color = Color.Red
-            paint.strokeWidth = 1f
-            paint.style = PaintingStyle.stroke
-        }
-    }
-}
-
-private fun callHitTest(
-    node: ComponentNode,
-    globalPoint: PxPosition,
-    hitPointerInputFilters: MutableList<PointerInputFilter>
-): Boolean {
-    if (node is LayoutNode) {
-        return node.hitTest(globalPoint, hitPointerInputFilters)
-    } else {
-        // Any because as soon as true is returned, we know we have found a hit path and we must
-        // not add PointerInputFilters on different paths so we should not even go looking.
-        return node.children.reversed().fastAny { child ->
-            callHitTest(child, globalPoint, hitPointerInputFilters)
-        }
-    }
-}
-
-internal class ModifiedParentDataNode(
-    wrapped: LayoutNodeWrapper,
-    val parentDataModifier: ParentDataModifier
-) : DelegatingLayoutNodeWrapper(wrapped) {
-    override val parentData: Any?
-        get() = with(parentDataModifier) {
-            /**
-             * ParentData provided through the parentData node will override the data provided
-             * through a modifier
-             */
-            layoutNode.parentDataNode?.value
-                ?: layoutNode.measureScope.modifyParentData(wrapped.parentData)
-        }
-}
-
-internal class ModifiedLayoutNode2(
-    wrapped: LayoutNodeWrapper,
-    val layoutModifier: LayoutModifier2
-) : DelegatingLayoutNodeWrapper(wrapped) {
-
-    override fun measure(constraints: Constraints): Placeable = with(layoutModifier) {
-        updateLayoutDirection()
-        measureResult =
-            layoutNode.measureScope.measure(wrapped, constraints, layoutNode.layoutDirection!!)
-        this@ModifiedLayoutNode2
-    }
-
-    override fun minIntrinsicWidth(height: IntPx): IntPx = with(layoutModifier) {
-        updateLayoutDirection()
-        layoutNode.measureScope.minIntrinsicWidth(wrapped, height, layoutNode.layoutDirection!!)
-    }
-
-    override fun maxIntrinsicWidth(height: IntPx): IntPx = with(layoutModifier) {
-        updateLayoutDirection()
-        layoutNode.measureScope.maxIntrinsicWidth(wrapped, height, layoutNode.layoutDirection!!)
-    }
-
-    override fun minIntrinsicHeight(width: IntPx): IntPx = with(layoutModifier) {
-        updateLayoutDirection()
-        layoutNode.measureScope.minIntrinsicHeight(wrapped, width, layoutNode.layoutDirection!!)
-    }
-
-    override fun maxIntrinsicHeight(width: IntPx): IntPx = with(layoutModifier) {
-        updateLayoutDirection()
-        layoutNode.measureScope.maxIntrinsicHeight(wrapped, width, layoutNode.layoutDirection!!)
-    }
-
-    override operator fun get(line: AlignmentLine): IntPx? =
-        measureResult.alignmentLines.getOrElse(line, { wrapped[line] })
-
-    override fun draw(canvas: Canvas, density: Density) {
-        withPositionTranslation(canvas) {
-            wrapped.draw(canvas, density)
-            if (layoutNode.requireOwner().showLayoutBounds) {
-                drawBorder(canvas, modifierBoundsPaint)
-            }
-        }
-    }
-
-    internal companion object {
-        val modifierBoundsPaint = Paint().also { paint ->
-            paint.color = Color.Blue
-            paint.strokeWidth = 1f
-            paint.style = PaintingStyle.stroke
-        }
-    }
-
-    private fun updateLayoutDirection() {
-        // TODO(popam): add support to change layout direction in the layout DSL
-    }
-}
-
-@Suppress("Deprecation")
-internal class ModifiedLayoutNode(
-    wrapped: LayoutNodeWrapper,
-    val layoutModifier: LayoutModifier
-) : DelegatingLayoutNodeWrapper(wrapped) {
-    override fun measure(constraints: Constraints): Placeable = with(layoutModifier) {
-        updateLayoutDirection()
-        val placeable = wrapped.measure(
-            layoutNode.measureScope.modifyConstraints(constraints, layoutNode.layoutDirection!!)
-        )
-        val size = layoutNode.measureScope.modifySize(
-            constraints,
-            layoutNode.layoutDirection!!,
-            placeable.size
-        )
-        val wrappedPosition = with(layoutModifier) {
-            layoutNode.measureScope.modifyPosition(
-                placeable.size,
-                size,
-                layoutNode.layoutDirection!!
-            )
-        }
-        measureResult = object : MeasureScope.MeasureResult {
-            override val width: IntPx = size.width
-            override val height: IntPx = size.height
-            override val alignmentLines: Map<AlignmentLine, IntPx> = emptyMap()
-            override fun placeChildren(layoutDirection: LayoutDirection) {
-                placeable.placeAbsolute(wrappedPosition)
-            }
-        }
-        this@ModifiedLayoutNode
-    }
-
-    override fun minIntrinsicWidth(height: IntPx): IntPx = with(layoutModifier) {
-        updateLayoutDirection()
-        layoutNode.measureScope.minIntrinsicWidthOf(wrapped, height, layoutNode.layoutDirection!!)
-    }
-
-    override fun maxIntrinsicWidth(height: IntPx): IntPx = with(layoutModifier) {
-        updateLayoutDirection()
-        layoutNode.measureScope.maxIntrinsicWidthOf(wrapped, height, layoutNode.layoutDirection!!)
-    }
-
-    override fun minIntrinsicHeight(width: IntPx): IntPx = with(layoutModifier) {
-        updateLayoutDirection()
-        layoutNode.measureScope.minIntrinsicHeightOf(wrapped, width, layoutNode.layoutDirection!!)
-    }
-
-    override fun maxIntrinsicHeight(width: IntPx): IntPx = with(layoutModifier) {
-        updateLayoutDirection()
-        layoutNode.measureScope.maxIntrinsicHeightOf(wrapped, width, layoutNode.layoutDirection!!)
-    }
-
-    override operator fun get(line: AlignmentLine): IntPx? = with(layoutModifier) {
-        return layoutNode.measureScope.modifyAlignmentLine(
-            line,
-            super.get(line),
-            layoutNode.layoutDirection!!
-        )
-    }
-
-    override fun draw(canvas: Canvas, density: Density) {
-        withPositionTranslation(canvas) {
-            wrapped.draw(canvas, density)
-            if (layoutNode.requireOwner().showLayoutBounds) {
-                drawBorder(canvas, modifierBoundsPaint)
-            }
-        }
-    }
-
-    internal companion object {
-        val modifierBoundsPaint = Paint().also { paint ->
-            paint.color = Color.Blue
-            paint.strokeWidth = 1f
-            paint.style = PaintingStyle.stroke
-        }
-    }
-
-    private fun updateLayoutDirection() = with(layoutModifier) {
-        val modifiedLayoutDirection =
-            layoutNode.measureScope.modifyLayoutDirection(layoutNode.layoutDirection!!)
-        layoutNode.layoutDirection = modifiedLayoutDirection
-    }
-}
-
-internal class ModifiedDrawNode(
-    wrapped: LayoutNodeWrapper,
-    val drawModifier: DrawModifier
-) : DelegatingLayoutNodeWrapper(wrapped), () -> Unit {
-    private var density: Density? = null
-    private var canvas: Canvas? = null
-
-    override fun draw(canvas: Canvas, density: Density) {
-        withPositionTranslation(canvas) {
-            this.density = density
-            this.canvas = canvas
-            val pxSize = size.toPxSize()
-            drawModifier.draw(density, this, canvas, pxSize)
-            this.density = null
-            this.canvas = null
-        }
-    }
-
-    // This is the implementation of drawContent()
-    override fun invoke() {
-        wrapped.draw(canvas!!, density!!)
-    }
-}
-
-internal class PointerInputDelegatingWrapper(
-    wrapped: LayoutNodeWrapper,
-    private val pointerInputModifier: PointerInputModifier
-) : DelegatingLayoutNodeWrapper(wrapped) {
-
-    init {
-        pointerInputModifier.pointerInputFilter.layoutCoordinates = this
-    }
-
-    override fun hitTest(
-        pointerPositionRelativeToScreen: PxPosition,
-        hitPointerInputFilters: MutableList<PointerInputFilter>
-    ): Boolean {
-        if (isGlobalPointerInBounds(pointerPositionRelativeToScreen)) {
-            // If we were hit, add the pointerInputFilter and keep looking to see if anything
-            // further down the tree is also hit and return true.
-            hitPointerInputFilters.add(pointerInputModifier.pointerInputFilter)
-            super.hitTest(pointerPositionRelativeToScreen, hitPointerInputFilters)
-            return true
-        } else {
-            // Anything out of bounds of ourselves can't be hit.
-            return false
-        }
-    }
-}
-
-internal class LayerWrapper(
-    wrapped: LayoutNodeWrapper,
-    val drawLayerModifier: DrawLayerModifier
-) : DelegatingLayoutNodeWrapper(wrapped) {
-    private var _layer: OwnedLayer? = null
-    private var layerDestroyed = false
-
-    private val invalidateParentLayer: () -> Unit = {
-        wrappedBy?.findLayer()?.invalidate()
-    }
-
-    val layer: OwnedLayer
-        get() {
-            return _layer ?: layoutNode.requireOwner().createLayer(
-                drawLayerModifier,
-                wrapped::draw,
-                invalidateParentLayer
-            ).also {
-                _layer = it
-                invalidateParentLayer()
-            }
-        }
-
-    // TODO(mount): This cache isn't thread safe at all.
-    private var positionCache: FloatArray? = null
-
-    override fun measure(constraints: Constraints): Placeable {
-        val placeable = super.measure(constraints)
-        layer.resize(size)
-        return placeable
-    }
-
-    override fun place(position: IntPxPosition) {
-        super.place(position)
-        layer.move(position)
-    }
-
-    override fun draw(canvas: Canvas, density: Density) {
-        layer.drawLayer(canvas)
-    }
-
-    override fun detach() {
-        super.detach()
-        _layer?.destroy()
-    }
-
-    override fun findLayer(): OwnedLayer? {
-        return layer
-    }
-
-    override fun toParentPosition(position: PxPosition): PxPosition {
-        val matrix = layer.getMatrix()
-        if (!matrix.isIdentity) {
-            val x = position.x.value
-            val y = position.y.value
-            val cache = positionCache
-            val point = if (cache != null) {
-                cache[0] = x
-                cache[1] = y
-                cache
-            } else {
-                floatArrayOf(x, y).also { positionCache = it }
-            }
-            matrix.mapPoints(point)
-            return super.toParentPosition(PxPosition(point[0].px, point[1].px))
-        } else {
-            return super.toParentPosition(position)
-        }
-    }
-
-    override fun rectInParent(bounds: RectF) {
-        if ((drawLayerModifier.clipToBounds ||
-                    (drawLayerModifier.clipToOutline && drawLayerModifier.outlineShape != null)) &&
-            !bounds.intersect(0f, 0f, size.width.value.toFloat(), size.height.value.toFloat())
-        ) {
-            bounds.setEmpty()
-        }
-        val matrix = layer.getMatrix()
-        matrix.mapRect(bounds)
-        return super.rectInParent(bounds)
-    }
-}
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/ModifiedDrawNode.kt b/ui/ui-platform/src/main/java/androidx/ui/core/ModifiedDrawNode.kt
new file mode 100644
index 0000000..32a34b1
--- /dev/null
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/ModifiedDrawNode.kt
@@ -0,0 +1,153 @@
+/*
+ * 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.ui.core
+
+import androidx.ui.geometry.Offset
+import androidx.ui.geometry.RRect
+import androidx.ui.geometry.Rect
+import androidx.ui.graphics.BlendMode
+import androidx.ui.graphics.Canvas
+import androidx.ui.graphics.ClipOp
+import androidx.ui.graphics.ImageAsset
+import androidx.ui.graphics.NativeCanvas
+import androidx.ui.graphics.Paint
+import androidx.ui.graphics.Path
+import androidx.ui.graphics.Picture
+import androidx.ui.graphics.PointMode
+import androidx.ui.graphics.Vertices
+import androidx.ui.graphics.vectormath.Matrix4
+import androidx.ui.unit.PxSize
+import androidx.ui.unit.toPxSize
+
+internal class ModifiedDrawNode(
+    wrapped: LayoutNodeWrapper,
+    private val drawModifier: DrawModifier
+) : DelegatingLayoutNodeWrapper(wrapped) {
+    private val drawScope = DrawScopeImpl()
+    private var canvas: Canvas? = null
+
+    override fun performMeasure(constraints: Constraints): Placeable {
+        val thisPlaceable = super.performMeasure(constraints)
+        if (dirtySize) {
+            // In case there is a layer between this modifier and the layout node.
+            findLayer()?.invalidate()
+        }
+        return thisPlaceable
+    }
+
+    // This is not thread safe
+    override fun draw(canvas: Canvas) {
+        withPositionTranslation(canvas) {
+            this.canvas = canvas
+            with(drawScope) {
+                with(drawModifier) { draw() }
+            }
+            this.canvas = null
+        }
+    }
+
+    inner class DrawScopeImpl() : ContentDrawScope {
+        override fun drawContent() {
+            wrapped.draw(canvas!!)
+        }
+
+        override val density: Float
+            get() = layoutNode.requireOwner().density.density
+
+        override val fontScale: Float
+            get() = layoutNode.requireOwner().density.fontScale
+
+        override val size: PxSize
+            get() = this@ModifiedDrawNode.measuredSize.toPxSize()
+
+        override val nativeCanvas: NativeCanvas
+            get() = canvas!!.nativeCanvas
+
+        override fun save() = canvas!!.save()
+
+        override fun restore() = canvas!!.restore()
+
+        override fun saveLayer(bounds: Rect, paint: Paint) = canvas!!.saveLayer(bounds, paint)
+
+        override fun translate(dx: Float, dy: Float) = canvas!!.translate(dx, dy)
+
+        override fun scale(sx: Float, sy: Float) = canvas!!.scale(sx, sy)
+
+        override fun rotate(degrees: Float) = canvas!!.rotate(degrees)
+
+        override fun skew(sx: Float, sy: Float) = canvas!!.skew(sx, sy)
+
+        override fun concat(matrix4: Matrix4) = canvas!!.concat(matrix4)
+
+        override fun clipRect(rect: Rect, clipOp: ClipOp) = canvas!!.clipRect(rect, clipOp)
+
+        override fun clipRRect(rrect: RRect) = canvas!!.clipRRect(rrect)
+
+        override fun clipPath(path: Path) = canvas!!.clipPath(path)
+
+        override fun drawLine(p1: Offset, p2: Offset, paint: Paint) =
+            canvas!!.drawLine(p1, p2, paint)
+
+        override fun drawRect(rect: Rect, paint: Paint) = canvas!!.drawRect(rect, paint)
+
+        override fun drawRoundRect(
+            left: Float,
+            top: Float,
+            right: Float,
+            bottom: Float,
+            radiusX: Float,
+            radiusY: Float,
+            paint: Paint
+        ) = canvas!!.drawRoundRect(left, top, right, bottom, radiusX, radiusY, paint)
+
+        override fun drawOval(rect: Rect, paint: Paint) = canvas!!.drawOval(rect, paint)
+
+        override fun drawCircle(center: Offset, radius: Float, paint: Paint) =
+            canvas!!.drawCircle(center, radius, paint)
+
+        override fun drawArc(
+            rect: Rect,
+            startAngle: Float,
+            sweepAngle: Float,
+            useCenter: Boolean,
+            paint: Paint
+        ) = canvas!!.drawArc(rect, startAngle, sweepAngle, useCenter, paint)
+
+        override fun drawPath(path: Path, paint: Paint) = canvas!!.drawPath(path, paint)
+
+        override fun drawImage(image: ImageAsset, topLeftOffset: Offset, paint: Paint) =
+            canvas!!.drawImage(image, topLeftOffset, paint)
+
+        override fun drawImageRect(image: ImageAsset, src: Rect, dst: Rect, paint: Paint) =
+            canvas!!.drawImageRect(image, src, dst, paint)
+
+        override fun drawPicture(picture: Picture) = canvas!!.drawPicture(picture)
+
+        override fun drawPoints(pointMode: PointMode, points: List<Offset>, paint: Paint) =
+            canvas!!.drawPoints(pointMode, points, paint)
+
+        override fun drawRawPoints(pointMode: PointMode, points: FloatArray, paint: Paint) =
+            canvas!!.drawRawPoints(pointMode, points, paint)
+
+        override fun drawVertices(vertices: Vertices, blendMode: BlendMode, paint: Paint) =
+            canvas!!.drawVertices(vertices, blendMode, paint)
+
+        override fun enableZ() = canvas!!.enableZ()
+
+        override fun disableZ() = canvas!!.disableZ()
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/ModifiedLayoutNode.kt b/ui/ui-platform/src/main/java/androidx/ui/core/ModifiedLayoutNode.kt
new file mode 100644
index 0000000..771f436
--- /dev/null
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/ModifiedLayoutNode.kt
@@ -0,0 +1,166 @@
+/*
+ * 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.ui.core
+
+import androidx.ui.graphics.Canvas
+import androidx.ui.graphics.Color
+import androidx.ui.graphics.Paint
+import androidx.ui.graphics.PaintingStyle
+import androidx.ui.unit.IntPx
+import androidx.ui.unit.IntPxSize
+
+internal class ModifiedLayoutNode2(
+    wrapped: LayoutNodeWrapper,
+    val layoutModifier: LayoutModifier2
+) : DelegatingLayoutNodeWrapper(wrapped) {
+
+    override fun performMeasure(constraints: Constraints): Placeable = with(layoutModifier) {
+        updateLayoutDirection()
+        measureResult =
+            layoutNode.measureScope.measure(wrapped, constraints, layoutNode.layoutDirection!!)
+        this@ModifiedLayoutNode2
+    }
+
+    override fun minIntrinsicWidth(height: IntPx): IntPx = with(layoutModifier) {
+        updateLayoutDirection()
+        layoutNode.measureScope.minIntrinsicWidth(wrapped, height, layoutNode.layoutDirection!!)
+    }
+
+    override fun maxIntrinsicWidth(height: IntPx): IntPx = with(layoutModifier) {
+        updateLayoutDirection()
+        layoutNode.measureScope.maxIntrinsicWidth(wrapped, height, layoutNode.layoutDirection!!)
+    }
+
+    override fun minIntrinsicHeight(width: IntPx): IntPx = with(layoutModifier) {
+        updateLayoutDirection()
+        layoutNode.measureScope.minIntrinsicHeight(wrapped, width, layoutNode.layoutDirection!!)
+    }
+
+    override fun maxIntrinsicHeight(width: IntPx): IntPx = with(layoutModifier) {
+        updateLayoutDirection()
+        layoutNode.measureScope.maxIntrinsicHeight(wrapped, width, layoutNode.layoutDirection!!)
+    }
+
+    override operator fun get(line: AlignmentLine): IntPx? =
+        measureResult.alignmentLines.getOrElse(line, { wrapped[line] })
+
+    override fun draw(canvas: Canvas) {
+        withPositionTranslation(canvas) {
+            wrapped.draw(canvas)
+            if (layoutNode.requireOwner().showLayoutBounds) {
+                drawBorder(canvas, modifierBoundsPaint)
+            }
+        }
+    }
+
+    internal companion object {
+        val modifierBoundsPaint = Paint().also { paint ->
+            paint.color = Color.Blue
+            paint.strokeWidth = 1f
+            paint.style = PaintingStyle.stroke
+        }
+    }
+
+    private fun updateLayoutDirection() {
+        // TODO(popam): add support to change layout direction in the layout DSL
+    }
+}
+
+@Suppress("Deprecation")
+internal class ModifiedLayoutNode(
+    wrapped: LayoutNodeWrapper,
+    val layoutModifier: LayoutModifier
+) : DelegatingLayoutNodeWrapper(wrapped) {
+    override fun performMeasure(constraints: Constraints): Placeable = with(layoutModifier) {
+        updateLayoutDirection()
+        val placeable = wrapped.measure(
+            layoutNode.measureScope.modifyConstraints(constraints, layoutNode.layoutDirection!!)
+        )
+        val size = layoutNode.measureScope.modifySize(
+            constraints,
+            layoutNode.layoutDirection!!,
+            IntPxSize(placeable.width, placeable.height)
+        )
+        val wrappedPosition = with(layoutModifier) {
+            layoutNode.measureScope.modifyPosition(
+                IntPxSize(placeable.width, placeable.height),
+                size,
+                layoutNode.layoutDirection!!
+            )
+        }
+        measureResult = object : MeasureScope.MeasureResult {
+            override val width: IntPx = size.width
+            override val height: IntPx = size.height
+            override val alignmentLines: Map<AlignmentLine, IntPx> = emptyMap()
+            override fun placeChildren(layoutDirection: LayoutDirection) {
+                placeable.placeAbsolute(wrappedPosition)
+            }
+        }
+        this@ModifiedLayoutNode
+    }
+
+    override fun minIntrinsicWidth(height: IntPx): IntPx = with(layoutModifier) {
+        updateLayoutDirection()
+        layoutNode.measureScope.minIntrinsicWidthOf(wrapped, height, layoutNode.layoutDirection!!)
+    }
+
+    override fun maxIntrinsicWidth(height: IntPx): IntPx = with(layoutModifier) {
+        updateLayoutDirection()
+        layoutNode.measureScope.maxIntrinsicWidthOf(wrapped, height, layoutNode.layoutDirection!!)
+    }
+
+    override fun minIntrinsicHeight(width: IntPx): IntPx = with(layoutModifier) {
+        updateLayoutDirection()
+        layoutNode.measureScope.minIntrinsicHeightOf(wrapped, width, layoutNode.layoutDirection!!)
+    }
+
+    override fun maxIntrinsicHeight(width: IntPx): IntPx = with(layoutModifier) {
+        updateLayoutDirection()
+        layoutNode.measureScope.maxIntrinsicHeightOf(wrapped, width, layoutNode.layoutDirection!!)
+    }
+
+    override operator fun get(line: AlignmentLine): IntPx? = with(layoutModifier) {
+        return layoutNode.measureScope.modifyAlignmentLine(
+            line,
+            super.get(line),
+            layoutNode.layoutDirection!!
+        )
+    }
+
+    override fun draw(canvas: Canvas) {
+        withPositionTranslation(canvas) {
+            wrapped.draw(canvas)
+            if (layoutNode.requireOwner().showLayoutBounds) {
+                drawBorder(canvas, modifierBoundsPaint)
+            }
+        }
+    }
+
+    internal companion object {
+        val modifierBoundsPaint = Paint().also { paint ->
+            paint.color = Color.Blue
+            paint.strokeWidth = 1f
+            paint.style = PaintingStyle.stroke
+        }
+    }
+
+    private fun updateLayoutDirection() = with(layoutModifier) {
+        val modifiedLayoutDirection =
+            layoutNode.measureScope.modifyLayoutDirection(layoutNode.layoutDirection!!)
+        layoutNode.layoutDirection = modifiedLayoutDirection
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/ModifiedParentDataNode.kt b/ui/ui-platform/src/main/java/androidx/ui/core/ModifiedParentDataNode.kt
new file mode 100644
index 0000000..fcfb44f
--- /dev/null
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/ModifiedParentDataNode.kt
@@ -0,0 +1,32 @@
+/*
+ * 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.ui.core
+
+internal class ModifiedParentDataNode(
+    wrapped: LayoutNodeWrapper,
+    val parentDataModifier: ParentDataModifier
+) : DelegatingLayoutNodeWrapper(wrapped) {
+    override val parentData: Any?
+        get() = with(parentDataModifier) {
+            /**
+             * ParentData provided through the parentData node will override the data provided
+             * through a modifier
+             */
+            layoutNode.parentDataNode?.value
+                ?: layoutNode.measureScope.modifyParentData(wrapped.parentData)
+        }
+}
\ No newline at end of file
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/Owner.kt b/ui/ui-platform/src/main/java/androidx/ui/core/Owner.kt
index e25871f..09a406c 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/Owner.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/Owner.kt
@@ -18,6 +18,7 @@
 import androidx.annotation.RestrictTo
 import androidx.ui.autofill.Autofill
 import androidx.ui.autofill.AutofillTree
+import androidx.ui.core.clipboard.ClipboardManager
 import androidx.ui.core.hapticfeedback.HapticFeedback
 import androidx.ui.core.semantics.SemanticsOwner
 import androidx.ui.graphics.Canvas
@@ -54,6 +55,11 @@
     val hapticFeedBack: HapticFeedback
 
     /**
+     * Provide clipboard manager to the user. Use the Android version of clipboard manager.
+     */
+    val clipboardManager: ClipboardManager
+
+    /**
      *  A data structure used to store autofill information. It is used by components that want to
      *  provide autofill semantics.
      *  TODO(ralu): Replace with SemanticsTree. This is a temporary hack until we have a semantics
@@ -186,7 +192,7 @@
      */
     fun createLayer(
         drawLayerModifier: DrawLayerModifier,
-        drawBlock: (Canvas, Density) -> Unit,
+        drawBlock: (Canvas) -> Unit,
         invalidateParentLayer: () -> Unit
     ): OwnedLayer
 
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/PointerInputDelegatingWrapper.kt b/ui/ui-platform/src/main/java/androidx/ui/core/PointerInputDelegatingWrapper.kt
new file mode 100644
index 0000000..28b37a8
--- /dev/null
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/PointerInputDelegatingWrapper.kt
@@ -0,0 +1,47 @@
+/*
+ * 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.ui.core
+
+import androidx.ui.core.pointerinput.PointerInputFilter
+import androidx.ui.core.pointerinput.PointerInputModifier
+import androidx.ui.unit.PxPosition
+
+internal class PointerInputDelegatingWrapper(
+    wrapped: LayoutNodeWrapper,
+    private val pointerInputModifier: PointerInputModifier
+) : DelegatingLayoutNodeWrapper(wrapped) {
+
+    init {
+        pointerInputModifier.pointerInputFilter.layoutCoordinates = this
+    }
+
+    override fun hitTest(
+        pointerPositionRelativeToScreen: PxPosition,
+        hitPointerInputFilters: MutableList<PointerInputFilter>
+    ): Boolean {
+        if (isGlobalPointerInBounds(pointerPositionRelativeToScreen)) {
+            // If we were hit, add the pointerInputFilter and keep looking to see if anything
+            // further down the tree is also hit and return true.
+            hitPointerInputFilters.add(pointerInputModifier.pointerInputFilter)
+            super.hitTest(pointerPositionRelativeToScreen, hitPointerInputFilters)
+            return true
+        } else {
+            // Anything out of bounds of ourselves can't be hit.
+            return false
+        }
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/RenderNodeLayer.kt b/ui/ui-platform/src/main/java/androidx/ui/core/RenderNodeLayer.kt
index df4faa13..0f7d0d2 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/RenderNodeLayer.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/RenderNodeLayer.kt
@@ -20,7 +20,6 @@
 import android.graphics.Matrix
 import android.graphics.RenderNode
 import androidx.ui.graphics.Canvas
-import androidx.ui.unit.Density
 import androidx.ui.unit.IntPxPosition
 import androidx.ui.unit.IntPxSize
 import androidx.ui.unit.toPxSize
@@ -32,7 +31,7 @@
 internal class RenderNodeLayer(
     val ownerView: AndroidComposeView,
     val drawLayerModifier: DrawLayerModifier,
-    val drawBlock: (Canvas, Density) -> Unit,
+    val drawBlock: (Canvas) -> Unit,
     val invalidateParentLayer: () -> Unit
 ) : OwnedLayer {
     /**
@@ -126,7 +125,7 @@
                 canvas.disableZ()
             }
         } else {
-            drawBlock(canvas, ownerView.density)
+            drawBlock(canvas)
         }
         isDirty = false
     }
@@ -144,7 +143,7 @@
                 uiCanvas.clipPath(clipPath!!)
             }
             ownerView.observeLayerModelReads(this) {
-                drawBlock(uiCanvas, ownerView.density)
+                drawBlock(uiCanvas)
             }
             if (manuallyClip) {
                 uiCanvas.restore()
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/ViewLayer.kt b/ui/ui-platform/src/main/java/androidx/ui/core/ViewLayer.kt
index 059d32f..54dc040 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/ViewLayer.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/ViewLayer.kt
@@ -21,7 +21,6 @@
 import android.view.ViewOutlineProvider
 import androidx.ui.graphics.Canvas
 import androidx.ui.graphics.Path
-import androidx.ui.unit.Density
 import androidx.ui.unit.IntPxPosition
 import androidx.ui.unit.IntPxSize
 import androidx.ui.unit.toPxSize
@@ -35,7 +34,7 @@
     val ownerView: AndroidComposeView,
     val container: ViewLayerContainer,
     val drawLayerModifier: DrawLayerModifier,
-    val drawBlock: (Canvas, Density) -> Unit,
+    val drawBlock: (Canvas) -> Unit,
     val invalidateParentLayer: () -> Unit
 ) : View(ownerView.context), OwnedLayer {
     private val outlineResolver = OutlineResolver(ownerView.density)
@@ -153,7 +152,7 @@
             uiCanvas.clipPath(clipPath)
         }
         ownerView.observeLayerModelReads(this) {
-            drawBlock(uiCanvas, ownerView.density)
+            drawBlock(uiCanvas)
         }
         if (clipPath != null) {
             uiCanvas.restore()
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/clipboard/AndroidClipboardManager.kt b/ui/ui-platform/src/main/java/androidx/ui/core/clipboard/AndroidClipboardManager.kt
new file mode 100644
index 0000000..add5b41
--- /dev/null
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/clipboard/AndroidClipboardManager.kt
@@ -0,0 +1,57 @@
+/*
+ * 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.ui.core.clipboard
+
+import android.content.ClipData
+import android.content.Context
+import androidx.ui.text.AnnotatedString
+
+private const val PLAIN_TEXT_LABEL = "plain text"
+
+/**
+ * Android implementation for [ClipboardManager].
+ */
+internal class AndroidClipboardManager(context: Context) : ClipboardManager {
+    private val clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as
+            android.content.ClipboardManager
+
+    override fun setText(annotatedString: AnnotatedString) {
+        clipboardManager.setPrimaryClip(
+            ClipData.newPlainText(
+                PLAIN_TEXT_LABEL,
+                convertAnnotatedStringToCharSequence(annotatedString)
+            )
+        )
+    }
+
+    override fun getText(): AnnotatedString? {
+        return if (clipboardManager.hasPrimaryClip())
+            convertCharSequenceToAnnotatedString(clipboardManager.primaryClip!!.getItemAt(0).text)
+        else null
+    }
+
+    private fun convertCharSequenceToAnnotatedString(charSequence: CharSequence?):
+            AnnotatedString? {
+        if (charSequence == null) return null
+        return AnnotatedString(text = charSequence.toString())
+    }
+
+    private fun convertAnnotatedStringToCharSequence(annotatedString: AnnotatedString):
+            CharSequence? {
+        return annotatedString.text
+    }
+}
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/clipboard/ClipboardManager.kt b/ui/ui-platform/src/main/java/androidx/ui/core/clipboard/ClipboardManager.kt
new file mode 100644
index 0000000..7608444
--- /dev/null
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/clipboard/ClipboardManager.kt
@@ -0,0 +1,40 @@
+/*
+ * 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.ui.core.clipboard
+
+import androidx.ui.text.AnnotatedString
+
+/**
+ * Interface for managing the Clipboard.
+ */
+interface ClipboardManager {
+    /**
+     * This method put the text into the Clipboard.
+     *
+     * @param annotatedString The [AnnotatedString] to be put into Clipboard.
+     */
+    fun setText(annotatedString: AnnotatedString)
+
+    /**
+     * This method get the text from the Clipboard.
+     *
+     * @return The text in the Clipboard.
+     * It could be null due to 2 reasons: 1. Clipboard is empty; 2. Cannot convert the
+     * [CharSequence] text in Clipboard to [AnnotatedString].
+     */
+    fun getText(): AnnotatedString?
+}
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/focus/FocusModifierImpl.kt b/ui/ui-platform/src/main/java/androidx/ui/core/focus/FocusModifierImpl.kt
new file mode 100644
index 0000000..7e49169
--- /dev/null
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/focus/FocusModifierImpl.kt
@@ -0,0 +1,51 @@
+/*
+ * 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.ui.core.focus
+
+import androidx.compose.Model
+import androidx.ui.focus.FocusDetailedState
+import androidx.ui.focus.FocusModifier
+
+fun createFocusModifier(focusDetailedState: FocusDetailedState): FocusModifier =
+    FocusModifierImpl(focusDetailedState)
+
+@Model
+internal class FocusModifierImpl(
+    override var focusDetailedState: FocusDetailedState,
+    var focusNode: ModifiedFocusNode? = null
+) : FocusModifier {
+
+    var focusedChild: ModifiedFocusNode? = null
+
+    override fun requestFocus() {
+        val focusNode = focusNode
+        requireNotNull(focusNode)
+        focusNode.requestFocus()
+    }
+
+    override fun captureFocus(): Boolean {
+        val focusNode = focusNode
+        requireNotNull(focusNode)
+        return focusNode.captureFocus()
+    }
+
+    override fun freeFocus(): Boolean {
+        val focusNode = focusNode
+        requireNotNull(focusNode)
+        return focusNode.freeFocus()
+    }
+}
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/focus/FocusNodeUtils.kt b/ui/ui-platform/src/main/java/androidx/ui/core/focus/FocusNodeUtils.kt
index 7497057..3e440a3 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/focus/FocusNodeUtils.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/focus/FocusNodeUtils.kt
@@ -48,7 +48,9 @@
 
 internal fun LayoutNode.focusableChildren(): List<ModifiedFocusNode> {
     val focusableChildren = mutableListOf<ModifiedFocusNode>()
-    layoutNodeWrapper.findFocusWrapperWrappingThisWrapper()?.let { focusableChildren.add(it) }
+    // TODO(b/152529395): Write a test for LayoutNode.focusableChildren(). We were calling the wrong
+    //  function on [LayoutNodeWrapper] but no test caught this.
+    layoutNodeWrapper.findFocusWrapperWrappedByThisWrapper()?.let { focusableChildren.add(it) }
         ?: layoutChildren.forEach { layout -> focusableChildren.addAll(layout.focusableChildren()) }
     return focusableChildren
 }
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/focus/ModifiedFocusNode.kt b/ui/ui-platform/src/main/java/androidx/ui/core/focus/ModifiedFocusNode.kt
index 36fc85a..17e267b 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/focus/ModifiedFocusNode.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/focus/ModifiedFocusNode.kt
@@ -23,12 +23,10 @@
 import androidx.ui.focus.FocusDetailedState.Disabled
 import androidx.ui.focus.FocusDetailedState.Inactive
 
-internal class ModifiedFocusNode(wrapped: LayoutNodeWrapper) :
-    DelegatingLayoutNodeWrapper(wrapped) {
-    var focusState = Inactive
-
-    // Internal for access by tests.
-    internal var focusedChild: ModifiedFocusNode? = null
+internal class ModifiedFocusNode(
+    wrapped: LayoutNodeWrapper,
+    val focusModifier: FocusModifierImpl
+) : DelegatingLayoutNodeWrapper(wrapped) {
 
     /**
      * Request focus for this node.
@@ -40,10 +38,10 @@
      * [FocusNode][ModifiedFocusNode]'s parent [FocusNode][ModifiedFocusNode].
      */
     fun requestFocus(propagateFocus: Boolean = true) {
-        when (focusState) {
+        when (focusModifier.focusDetailedState) {
             Active, Captured, Disabled -> return
             ActiveParent -> {
-                val focusedChild = focusedChild
+                val focusedChild = focusModifier.focusedChild
                 requireNotNull(focusedChild)
 
                 /** We don't need to do anything if [propagateFocus] is true,
@@ -75,9 +73,9 @@
      *
      * @return true if the focus was successfully captured. False otherwise.
      */
-    fun captureFocus() = when (focusState) {
+    fun captureFocus() = when (focusModifier.focusDetailedState) {
         Active, Captured -> {
-            focusState = Captured
+            focusModifier.focusDetailedState = Captured
             true
         }
         else -> false
@@ -91,8 +89,8 @@
      * @return true if the captured focus was released. If the node is not in the [Captured]
      * state. this function returns false to indicate that this operation was a no-op.
      */
-    fun freeFocus() = if (focusState == Captured) {
-        focusState = Active
+    fun freeFocus() = if (focusModifier.focusDetailedState == Captured) {
+        focusModifier.focusDetailedState = Active
         true
     } else {
         false
@@ -117,10 +115,10 @@
 
         if (focusedCandidate == null || !propagateFocus) {
             // No Focused Children, or we don't want to propagate focus to children.
-            focusState = Active
+            focusModifier.focusDetailedState = Active
         } else {
-            focusState = ActiveParent
-            focusedChild = focusedCandidate
+            focusModifier.focusDetailedState = ActiveParent
+            focusModifier.focusedChild = focusedCandidate
             focusedCandidate.grantFocus(propagateFocus)
         }
     }
@@ -132,10 +130,10 @@
      * clear focus from one of its child [ModifiedFocusNode]s.
      */
     private fun clearFocus(): Boolean {
-        return when (focusState) {
+        return when (focusModifier.focusDetailedState) {
             Active -> {
-                focusState = Inactive
-                findParentFocusNode()?.focusedChild = null
+                focusModifier.focusDetailedState = Inactive
+                findParentFocusNode()?.focusModifier?.focusedChild = null
                 true
             }
             /**
@@ -144,7 +142,7 @@
              */
             ActiveParent -> {
                 if (clearFocusFromChildren()) {
-                    focusState = Active
+                    focusModifier.focusDetailedState = Active
                     clearFocus()
                 } else {
                     false
@@ -165,9 +163,9 @@
     }
 
     private fun clearFocusFromChildren(): Boolean {
-        require(focusState == ActiveParent)
+        require(focusModifier.focusDetailedState == ActiveParent)
 
-        val focusedChild = focusedChild
+        val focusedChild = focusModifier.focusedChild
         requireNotNull(focusedChild)
 
         return focusedChild.clearFocus()
@@ -190,13 +188,13 @@
             error("Non child node cannot request focus.")
         }
 
-        return when (focusState) {
+        return when (focusModifier.focusDetailedState) {
             /**
              * If this node is [Active], it can give focus to the requesting child.
              */
             Active -> {
-                focusState = ActiveParent
-                focusedChild = childNode
+                focusModifier.focusDetailedState = ActiveParent
+                focusModifier.focusedChild = childNode
                 childNode.grantFocus(propagateFocus)
                 true
             }
@@ -205,9 +203,10 @@
              * remove focus from the currently focused child and grant it to the requesting child.
              */
             ActiveParent -> {
-                val previouslyFocusedNode = focusedChild ?: error("no focusedChild found")
+                val previouslyFocusedNode = focusModifier.focusedChild
+                requireNotNull(previouslyFocusedNode)
                 if (previouslyFocusedNode.clearFocus()) {
-                    focusedChild = childNode
+                    focusModifier.focusedChild = childNode
                     childNode.grantFocus(propagateFocus)
                     true
                 } else {
@@ -224,7 +223,7 @@
                 if (focusParent == null) {
                     // If the owner successfully gains focus, proceed otherwise return false.
                     if (requestFocusForOwner()) {
-                        focusState = Active
+                        focusModifier.focusDetailedState = Active
                         requestFocusForChild(childNode, propagateFocus)
                     } else {
                         false
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/text/AndroidFontResourceLoader.kt b/ui/ui-platform/src/main/java/androidx/ui/core/text/AndroidFontResourceLoader.kt
index fec3cd7..8796454 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/text/AndroidFontResourceLoader.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/text/AndroidFontResourceLoader.kt
@@ -20,7 +20,6 @@
 import android.graphics.Typeface
 import androidx.core.content.res.ResourcesCompat
 import androidx.ui.text.font.Font
-import androidx.ui.text.font.font
 import androidx.ui.text.font.ResourceFont
 
 /**
diff --git a/ui/ui-platform/src/test/java/androidx/ui/autofill/AndroidAutofillTest.kt b/ui/ui-platform/src/test/java/androidx/ui/autofill/AndroidAutofillTest.kt
index 553974f..75eab0a 100644
--- a/ui/ui-platform/src/test/java/androidx/ui/autofill/AndroidAutofillTest.kt
+++ b/ui/ui-platform/src/test/java/androidx/ui/autofill/AndroidAutofillTest.kt
@@ -53,6 +53,7 @@
 
     @Before
     fun setup() {
+        @Suppress("DEPRECATION") // Robolectric.setupActivity is deprecated
         val activity = Robolectric.setupActivity(Activity::class.java)
         view = View(activity)
         activity.setContentView(view)
diff --git a/ui/ui-platform/src/test/java/androidx/ui/autofill/AndroidPerformAutofillTest.kt b/ui/ui-platform/src/test/java/androidx/ui/autofill/AndroidPerformAutofillTest.kt
index f559223..582d792 100644
--- a/ui/ui-platform/src/test/java/androidx/ui/autofill/AndroidPerformAutofillTest.kt
+++ b/ui/ui-platform/src/test/java/androidx/ui/autofill/AndroidPerformAutofillTest.kt
@@ -41,6 +41,7 @@
 
     @Before
     fun setup() {
+        @Suppress("DEPRECATION") // Robolectric.setupActivity is deprecated
         val activity = Robolectric.setupActivity(Activity::class.java)
         val view = View(activity)
         activity.setContentView(view)
diff --git a/ui/ui-platform/src/test/java/androidx/ui/autofill/AndroidPopulateViewStructureTest.kt b/ui/ui-platform/src/test/java/androidx/ui/autofill/AndroidPopulateViewStructureTest.kt
index 9071352..41efdf0 100644
--- a/ui/ui-platform/src/test/java/androidx/ui/autofill/AndroidPopulateViewStructureTest.kt
+++ b/ui/ui-platform/src/test/java/androidx/ui/autofill/AndroidPopulateViewStructureTest.kt
@@ -42,6 +42,7 @@
 
     @Before
     fun setup() {
+        @Suppress("DEPRECATION") // Robolectric.setupActivity is deprecated
         val activity = Robolectric.setupActivity(Activity::class.java)
         val view = View(activity)
         activity.setContentView(view)
diff --git a/ui/ui-platform/src/test/java/androidx/ui/core/ComponentNodeTest.kt b/ui/ui-platform/src/test/java/androidx/ui/core/ComponentNodeTest.kt
index a416d98..d6595de 100644
--- a/ui/ui-platform/src/test/java/androidx/ui/core/ComponentNodeTest.kt
+++ b/ui/ui-platform/src/test/java/androidx/ui/core/ComponentNodeTest.kt
@@ -464,9 +464,9 @@
 
     @Test
     fun testPxGlobalToLocal() {
-        val node0 = LayoutNode()
+        val node0 = ZeroSizedLayoutNode()
         node0.attach(mockOwner())
-        val node1 = LayoutNode()
+        val node1 = ZeroSizedLayoutNode()
         node0.insertAt(0, node1)
 
         val x0 = 100.ipx
@@ -489,9 +489,9 @@
 
     @Test
     fun testIntPxGlobalToLocal() {
-        val node0 = LayoutNode()
+        val node0 = ZeroSizedLayoutNode()
         node0.attach(mockOwner())
-        val node1 = LayoutNode()
+        val node1 = ZeroSizedLayoutNode()
         node0.insertAt(0, node1)
 
         val x0 = 100.ipx
@@ -514,9 +514,9 @@
 
     @Test
     fun testPxLocalToGlobal() {
-        val node0 = LayoutNode()
+        val node0 = ZeroSizedLayoutNode()
         node0.attach(mockOwner())
-        val node1 = LayoutNode()
+        val node1 = ZeroSizedLayoutNode()
         node0.insertAt(0, node1)
 
         val x0 = 100.ipx
@@ -539,9 +539,9 @@
 
     @Test
     fun testIntPxLocalToGlobal() {
-        val node0 = LayoutNode()
+        val node0 = ZeroSizedLayoutNode()
         node0.attach(mockOwner())
-        val node1 = LayoutNode()
+        val node1 = ZeroSizedLayoutNode()
         node0.insertAt(0, node1)
 
         val x0 = 100.ipx
@@ -564,7 +564,7 @@
 
     @Test
     fun testPxLocalToGlobalUsesOwnerPosition() {
-        val node = LayoutNode()
+        val node = ZeroSizedLayoutNode()
         node.attach(mockOwner(IntPxPosition(20.ipx, 20.ipx)))
         node.place(100.ipx, 10.ipx)
 
@@ -575,7 +575,7 @@
 
     @Test
     fun testIntPxLocalToGlobalUsesOwnerPosition() {
-        val node = LayoutNode()
+        val node = ZeroSizedLayoutNode()
         node.attach(mockOwner(IntPxPosition(20.ipx, 20.ipx)))
         node.place(100.ipx, 10.ipx)
 
@@ -586,9 +586,9 @@
 
     @Test
     fun testChildToLocal() {
-        val node0 = LayoutNode()
+        val node0 = ZeroSizedLayoutNode()
         node0.attach(mockOwner())
-        val node1 = LayoutNode()
+        val node1 = ZeroSizedLayoutNode()
         node0.insertAt(0, node1)
 
         val x1 = 50.ipx
@@ -647,9 +647,9 @@
 
     @Test
     fun testPositionRelativeToRoot() {
-        val parent = LayoutNode()
+        val parent = ZeroSizedLayoutNode()
         parent.attach(mockOwner())
-        val child = LayoutNode()
+        val child = ZeroSizedLayoutNode()
         parent.insertAt(0, child)
         parent.place(-100.ipx, 10.ipx)
         child.place(50.ipx, 80.ipx)
@@ -663,7 +663,7 @@
     fun testPositionRelativeToRootIsNotAffectedByOwnerPosition() {
         val parent = LayoutNode()
         parent.attach(mockOwner(IntPxPosition(20.ipx, 20.ipx)))
-        val child = LayoutNode()
+        val child = ZeroSizedLayoutNode()
         parent.insertAt(0, child)
         child.place(50.ipx, 80.ipx)
 
@@ -674,9 +674,9 @@
 
     @Test
     fun testPositionRelativeToAncestorWithParent() {
-        val parent = LayoutNode()
+        val parent = ZeroSizedLayoutNode()
         parent.attach(mockOwner())
-        val child = LayoutNode()
+        val child = ZeroSizedLayoutNode()
         parent.insertAt(0, child)
         parent.place(-100.ipx, 10.ipx)
         child.place(50.ipx, 80.ipx)
@@ -688,10 +688,10 @@
 
     @Test
     fun testPositionRelativeToAncestorWithGrandParent() {
-        val grandParent = LayoutNode()
+        val grandParent = ZeroSizedLayoutNode()
         grandParent.attach(mockOwner())
-        val parent = LayoutNode()
-        val child = LayoutNode()
+        val parent = ZeroSizedLayoutNode()
+        val child = ZeroSizedLayoutNode()
         grandParent.insertAt(0, parent)
         parent.insertAt(0, child)
         grandParent.place(-7.ipx, 17.ipx)
@@ -778,7 +778,7 @@
     @Test
     fun coordinatesAttachedWhenLayoutNodeAttached() {
         val layoutNode = LayoutNode()
-        val drawModifier = draw { _, _ -> }
+        val drawModifier = Modifier.drawBehind { }
         layoutNode.modifier = drawModifier
         assertFalse(layoutNode.coordinates.isAttached)
         assertFalse(layoutNode.coordinates.isAttached)
@@ -794,13 +794,13 @@
     @Test
     fun layoutNodeWrapperAttachedWhenLayoutNodeAttached() {
         val layoutNode = LayoutNode()
-        val drawModifier = draw { _, _ -> }
+        val drawModifier = Modifier.drawBehind { }
         layoutNode.modifier = drawModifier
         val layoutNodeWrapper = layoutNode.layoutNodeWrapper
         assertFalse(layoutNodeWrapper.isAttached)
         layoutNode.attach(mockOwner())
         assertTrue(layoutNodeWrapper.isAttached)
-        layoutNode.modifier = draw { _, _ -> }
+        layoutNode.modifier = Modifier.drawBehind { }
         assertFalse(layoutNodeWrapper.isAttached)
         assertTrue(layoutNode.coordinates.isAttached)
         assertTrue(layoutNode.coordinates.isAttached)
@@ -810,7 +810,7 @@
     fun layoutNodeWrapperParentCoordinates() {
         val layoutNode = LayoutNode()
         val layoutNode2 = LayoutNode()
-        val drawModifier = draw { _, _ -> }
+        val drawModifier = Modifier.drawBehind { }
         layoutNode.modifier = drawModifier
         layoutNode2.insertAt(0, layoutNode)
         layoutNode2.attach(mockOwner())
@@ -1640,9 +1640,9 @@
     }
 
     private fun createSimpleLayout(): Triple<LayoutNode, ComponentNode, ComponentNode> {
-        val layoutNode = LayoutNode()
-        val child1 = LayoutNode()
-        val child2 = LayoutNode()
+        val layoutNode = ZeroSizedLayoutNode()
+        val child1 = ZeroSizedLayoutNode()
+        val child2 = ZeroSizedLayoutNode()
         layoutNode.insertAt(0, child1)
         layoutNode.insertAt(1, child2)
         return Triple(layoutNode, child1, child2)
@@ -1661,7 +1661,7 @@
         return layoutNodes
     }
 
-    private fun LayoutNode(x: Int, y: Int, x2: Int, y2: Int, modifier: Modifier = Modifier.None) =
+    private fun LayoutNode(x: Int, y: Int, x2: Int, y2: Int, modifier: Modifier = Modifier) =
         LayoutNode().apply {
             this.modifier = modifier
             layoutDirection = LayoutDirection.Ltr
@@ -1674,6 +1674,8 @@
             place(x.ipx, y.ipx)
         }
 
+    private fun ZeroSizedLayoutNode() = LayoutNode(0, 0, 0, 0)
+
     private class PointerInputModifierImpl(override val pointerInputFilter: PointerInputFilter) :
         PointerInputModifier
 }
diff --git a/ui/ui-platform/src/test/java/androidx/ui/core/focus/CaptureFocusTest.kt b/ui/ui-platform/src/test/java/androidx/ui/core/focus/CaptureFocusTest.kt
deleted file mode 100644
index 128631b..0000000
--- a/ui/ui-platform/src/test/java/androidx/ui/core/focus/CaptureFocusTest.kt
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.ui.core.focus
-
-import androidx.test.filters.SmallTest
-import androidx.ui.core.InnerPlaceable
-import androidx.ui.core.LayoutNode
-import androidx.ui.focus.FocusDetailedState.Active
-import androidx.ui.focus.FocusDetailedState.ActiveParent
-import androidx.ui.focus.FocusDetailedState.Captured
-import androidx.ui.focus.FocusDetailedState.Disabled
-import androidx.ui.focus.FocusDetailedState.Inactive
-import com.google.common.truth.Truth
-import org.junit.Test
-
-@SmallTest
-class CaptureFocusTest {
-
-    private val focusNode = ModifiedFocusNode(InnerPlaceable(LayoutNode()))
-
-    @Test
-    fun active_captureFocus_changesStateToCaptured() {
-        // Arrange.
-        focusNode.focusState = Active
-
-        // Act.
-        val success = focusNode.captureFocus()
-
-        // Assert.
-        Truth.assertThat(success).isTrue()
-        Truth.assertThat(focusNode.focusState).isEqualTo(Captured)
-    }
-
-    @Test
-    fun activeParent_captureFocus_retainsStateAsActiveParent() {
-        // Arrange.
-        focusNode.focusState = ActiveParent
-
-        // Act.
-        val success = focusNode.captureFocus()
-
-        // Assert.
-        Truth.assertThat(success).isFalse()
-        Truth.assertThat(focusNode.focusState).isEqualTo(ActiveParent)
-    }
-
-    @Test
-    fun captured_captureFocus_retainsStateAsCaptured() {
-        // Arrange.
-        focusNode.focusState = Captured
-
-        // Act.
-        val success = focusNode.captureFocus()
-
-        // Assert.
-        Truth.assertThat(success).isTrue()
-        Truth.assertThat(focusNode.focusState).isEqualTo(Captured)
-    }
-
-    @Test
-    fun disabled_captureFocus_retainsStateAsDisabled() {
-        // Arrange.
-        focusNode.focusState = Disabled
-
-        // Act.
-        val success = focusNode.captureFocus()
-
-        // Assert.
-        Truth.assertThat(success).isFalse()
-        Truth.assertThat(focusNode.focusState).isEqualTo(Disabled)
-    }
-
-    @Test
-    fun inactive_captureFocus_retainsStateAsInactive() {
-        // Arrange.
-        focusNode.focusState = Inactive
-
-        // Act.
-        val success = focusNode.captureFocus()
-
-        // Assert.
-        Truth.assertThat(success).isFalse()
-        Truth.assertThat(focusNode.focusState).isEqualTo(Inactive)
-    }
-}
\ No newline at end of file
diff --git a/ui/ui-platform/src/test/java/androidx/ui/core/focus/FindFocusableChildrenTest.kt b/ui/ui-platform/src/test/java/androidx/ui/core/focus/FindFocusableChildrenTest.kt
deleted file mode 100644
index 5c9ce9b3..0000000
--- a/ui/ui-platform/src/test/java/androidx/ui/core/focus/FindFocusableChildrenTest.kt
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.ui.core.focus
-
-import androidx.test.filters.SmallTest
-import androidx.ui.core.InnerPlaceable
-import androidx.ui.core.LayoutModifier
-import androidx.ui.core.LayoutNode
-import androidx.ui.core.ModifiedLayoutNode
-import com.google.common.truth.Truth
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@SmallTest
-@RunWith(JUnit4::class)
-class FindFocusableChildrenTest {
-    @Test
-    fun returnsFirstFocusNodeInModifierChain() {
-        // Arrange.
-        // layoutNode--focusNode1--focusNode2--focusNode3
-        val layoutNode = LayoutNode()
-        val focusNode3 = ModifiedFocusNode(InnerPlaceable(LayoutNode()))
-        val focusNode2 = ModifiedFocusNode(focusNode3)
-        val focusNode1 = ModifiedFocusNode(focusNode2)
-        layoutNode.layoutNodeWrapper = focusNode1
-
-        // Act.
-        val focusableChildren = focusNode1.focusableChildren()
-
-        // Assert.
-        Truth.assertThat(focusableChildren).containsExactly(focusNode2)
-    }
-
-    @Test
-    fun skipsNonFocusNodesAndReturnsFirstFocusNodeInModifierChain() {
-        // Arrange.
-        // layoutNode--focusNode1--nonFocusNode--focusNode2
-        val layoutNode = LayoutNode()
-        val focusNode2 = ModifiedFocusNode(InnerPlaceable(layoutNode))
-        val nonFocusNode = ModifiedLayoutNode(focusNode2, LayoutModifierTestImpl())
-        val focusNode1 = ModifiedFocusNode(nonFocusNode)
-        layoutNode.layoutNodeWrapper = focusNode1
-
-        // Act.
-        val focusableChildren = focusNode1.focusableChildren()
-
-        // Assert.
-        Truth.assertThat(focusableChildren).containsExactly(focusNode2)
-    }
-
-    @Test
-    fun returnsFirstFocusChildOfEachChildLayoutNode() {
-        // Arrange.
-        // parentLayoutNode--parentFocusNode
-        //       |___________________________________
-        //       |                                   |
-        // childLayoutNode1--focusNode1          childLayoutNode2--focusNode2--focusNode3
-        val parentLayoutNode = LayoutNode()
-        val parentFocusNode = ModifiedFocusNode(InnerPlaceable(parentLayoutNode))
-        parentLayoutNode.layoutNodeWrapper = parentFocusNode
-
-        val childLayoutNode1 = LayoutNode()
-        val focusNode1 = ModifiedFocusNode(InnerPlaceable(childLayoutNode1))
-        childLayoutNode1.layoutNodeWrapper = focusNode1
-        parentLayoutNode.insertAt(0, childLayoutNode1)
-
-        val childLayoutNode2 = LayoutNode()
-        val focusNode3 = ModifiedFocusNode(InnerPlaceable(childLayoutNode2))
-        val focusNode2 = ModifiedFocusNode(focusNode3)
-        childLayoutNode2.layoutNodeWrapper = focusNode2
-        parentLayoutNode.insertAt(1, childLayoutNode2)
-
-        Truth.assertThat(parentLayoutNode.children).hasSize(2)
-        Truth.assertThat(parentLayoutNode.layoutChildren).hasSize(2)
-
-        // Act.
-        val focusableChildren = parentFocusNode.focusableChildren()
-
-        // Assert.
-        Truth.assertThat(focusableChildren).containsExactly(focusNode1, focusNode2)
-    }
-
-    private class LayoutModifierTestImpl : LayoutModifier
-}
diff --git a/ui/ui-platform/src/test/java/androidx/ui/core/focus/FindParentFocusNodeTest.kt b/ui/ui-platform/src/test/java/androidx/ui/core/focus/FindParentFocusNodeTest.kt
deleted file mode 100644
index 8a5c5e8..0000000
--- a/ui/ui-platform/src/test/java/androidx/ui/core/focus/FindParentFocusNodeTest.kt
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.ui.core.focus
-
-import androidx.test.filters.SmallTest
-import androidx.ui.core.InnerPlaceable
-import androidx.ui.core.LayoutModifier
-import androidx.ui.core.LayoutNode
-import androidx.ui.core.ModifiedLayoutNode
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@SmallTest
-@RunWith(JUnit4::class)
-class FindParentFocusNodeTest {
-
-    @Test
-    fun noParentReturnsNull() {
-        // Arrange.
-        val layoutNode = LayoutNode()
-        val focusNode = ModifiedFocusNode(InnerPlaceable(layoutNode))
-        layoutNode.layoutNodeWrapper = focusNode
-
-        // Act.
-        val parentFousNode = focusNode.findParentFocusNode()
-
-        // Assert.
-        assertThat(parentFousNode).isNull()
-    }
-
-    @Test
-    fun returnsImmediateParentFromModifierChain() {
-        // Arrange.
-        // focusNode1--focusNode2--focusNode3--focusNode4--focusNode5
-        val focusNode5 = ModifiedFocusNode(InnerPlaceable(LayoutNode()))
-        val focusNode4 = ModifiedFocusNode(focusNode5)
-        val focusNode3 = ModifiedFocusNode(focusNode4)
-        val focusNode2 = ModifiedFocusNode(focusNode3)
-        val focusNode1 = ModifiedFocusNode(focusNode2)
-
-        // Act.
-        val parent = focusNode3.findParentFocusNode()
-
-        // Assert.
-        assertThat(parent).isEqualTo(focusNode2)
-    }
-
-    @Test
-    fun returnsImmediateParentFromModifierChain_ignoresNonFocusModifiers() {
-        // Arrange.
-        // focusNode1--focusNode2--nonFocusNode--focusNode3
-        val focusNode3 = ModifiedFocusNode(InnerPlaceable(LayoutNode()))
-        val nonFocusNode = ModifiedLayoutNode(focusNode3, LayoutModifierTestImpl())
-        val focusNode2 = ModifiedFocusNode(nonFocusNode)
-        val focusNode1 = ModifiedFocusNode(focusNode2)
-
-        // Act.
-        val parent = focusNode3.findParentFocusNode()
-
-        // Assert.
-        assertThat(parent).isEqualTo(focusNode2)
-    }
-
-    @Test
-    fun returnsLastFocusParentFromParentLayoutNode() {
-        // Arrange.
-        // parentLayoutNode--parentFocusNode1--parentFocusNode2
-        //       |
-        // layoutNode--focusNode
-        val parentLayoutNode = LayoutNode()
-        val parentFocusNode2 = ModifiedFocusNode(InnerPlaceable(parentLayoutNode))
-        val parentFocusNode1 = ModifiedFocusNode(parentFocusNode2)
-        parentLayoutNode.layoutNodeWrapper = parentFocusNode1
-
-        val layoutNode = LayoutNode()
-        val focusNode = ModifiedFocusNode(InnerPlaceable(layoutNode))
-        layoutNode.layoutNodeWrapper = focusNode
-
-        parentLayoutNode.insertAt(0, layoutNode)
-
-        // Act.
-        val parent = focusNode.findParentFocusNode()
-
-        // Assert.
-        assertThat(parent).isEqualTo(parentFocusNode2)
-    }
-
-    @Test
-    fun returnsImmediateParent() {
-        // Arrange.
-        // grandparentLayoutNode--grandparentFocusNode
-        //       |
-        // parentLayoutNode--parentFocusNode
-        //       |
-        // layoutNode--focusNode
-        val grandparentLayoutNode = LayoutNode()
-        val grandparentFocusNode = ModifiedFocusNode(InnerPlaceable(grandparentLayoutNode))
-        grandparentLayoutNode.layoutNodeWrapper = grandparentFocusNode
-
-        val parentLayoutNode = LayoutNode()
-        val parentFocusNode = ModifiedFocusNode(InnerPlaceable(parentLayoutNode))
-        parentLayoutNode.layoutNodeWrapper = parentFocusNode
-
-        val layoutNode = LayoutNode()
-        val focusNode = ModifiedFocusNode(InnerPlaceable(layoutNode))
-        layoutNode.layoutNodeWrapper = focusNode
-
-        parentLayoutNode.insertAt(0, layoutNode)
-        grandparentLayoutNode.insertAt(0, parentLayoutNode)
-
-        // Act.
-        val parent = focusNode.findParentFocusNode()
-
-        // Assert.
-        assertThat(parent).isEqualTo(parentFocusNode)
-    }
-
-    @Test
-    fun ignoresIntermediateLayoutNodesThatDontHaveFocusNodes() {
-        // Arrange.
-        // grandparentLayoutNode--grandparentFocusNode
-        //       |
-        // parentLayoutNode
-        //       |
-        // layoutNode--focusNode
-        val grandparentLayoutNode = LayoutNode()
-        val grandparentFocusNode = ModifiedFocusNode(InnerPlaceable(grandparentLayoutNode))
-        grandparentLayoutNode.layoutNodeWrapper = grandparentFocusNode
-
-        val parentLayoutNode = LayoutNode()
-
-        val layoutNode = LayoutNode()
-        val focusNode = ModifiedFocusNode(InnerPlaceable(layoutNode))
-        layoutNode.layoutNodeWrapper = focusNode
-
-        parentLayoutNode.insertAt(0, layoutNode)
-        grandparentLayoutNode.insertAt(0, parentLayoutNode)
-
-        // Act.
-        val parent = focusNode.findParentFocusNode()
-
-        // Assert.
-        assertThat(parent).isEqualTo(grandparentFocusNode)
-    }
-
-    @Suppress("Deprecation")
-    private class LayoutModifierTestImpl : LayoutModifier
-}
diff --git a/ui/ui-platform/src/test/java/androidx/ui/core/focus/FreeFocusTest.kt b/ui/ui-platform/src/test/java/androidx/ui/core/focus/FreeFocusTest.kt
deleted file mode 100644
index 8501656..0000000
--- a/ui/ui-platform/src/test/java/androidx/ui/core/focus/FreeFocusTest.kt
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.ui.core.focus
-
-import androidx.test.filters.SmallTest
-import androidx.ui.core.InnerPlaceable
-import androidx.ui.core.LayoutNode
-import androidx.ui.focus.FocusDetailedState
-import com.google.common.truth.Truth
-import org.junit.Test
-
-@SmallTest
-class FreeFocusTest {
-
-    private val focusNode = ModifiedFocusNode(InnerPlaceable(LayoutNode()))
-
-    @Test
-    fun active_freeFocus_retainFocusAsActive() {
-        // Arrange.
-        focusNode.focusState = FocusDetailedState.Active
-
-        // Act.
-        val success = focusNode.freeFocus()
-
-        // Assert.
-        Truth.assertThat(success).isFalse()
-        Truth.assertThat(focusNode.focusState).isEqualTo(FocusDetailedState.Active)
-    }
-
-    @Test
-    fun activeParent_freeFocus_retainFocusAsActiveParent() {
-        // Arrange.
-        focusNode.focusState = FocusDetailedState.ActiveParent
-
-        // Act.
-        val success = focusNode.freeFocus()
-
-        // Assert.
-        Truth.assertThat(success).isFalse()
-        Truth.assertThat(focusNode.focusState).isEqualTo(FocusDetailedState.ActiveParent)
-    }
-
-    @Test
-    fun captured_freeFocus_changesStateToActive() {
-        // Arrange.
-        focusNode.focusState = FocusDetailedState.Captured
-
-        // Act.
-        val success = focusNode.freeFocus()
-
-        // Assert.
-        Truth.assertThat(success).isTrue()
-        Truth.assertThat(focusNode.focusState).isEqualTo(FocusDetailedState.Active)
-    }
-
-    @Test
-    fun disabled_freeFocus_retainFocusAsDisabled() {
-        // Arrange.
-        focusNode.focusState = FocusDetailedState.Disabled
-
-        // Act.
-        val success = focusNode.freeFocus()
-
-        // Assert.
-        Truth.assertThat(success).isFalse()
-        Truth.assertThat(focusNode.focusState).isEqualTo(FocusDetailedState.Disabled)
-    }
-
-    @Test
-    fun inactive_freeFocus_retainFocusAsInactive() {
-        // Arrange.
-        focusNode.focusState = FocusDetailedState.Inactive
-
-        // Act.
-        val success = focusNode.freeFocus()
-
-        // Assert.
-        Truth.assertThat(success).isFalse()
-        Truth.assertThat(focusNode.focusState).isEqualTo(FocusDetailedState.Inactive)
-    }
-}
\ No newline at end of file
diff --git a/ui/ui-platform/src/test/java/androidx/ui/core/focus/RequestFocusTest.kt b/ui/ui-platform/src/test/java/androidx/ui/core/focus/RequestFocusTest.kt
deleted file mode 100644
index c810cb7..0000000
--- a/ui/ui-platform/src/test/java/androidx/ui/core/focus/RequestFocusTest.kt
+++ /dev/null
@@ -1,599 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.ui.core.focus
-
-import androidx.test.filters.SmallTest
-import androidx.ui.core.InnerPlaceable
-import androidx.ui.core.LayoutNode
-import androidx.ui.core.Owner
-import androidx.ui.focus.FocusDetailedState.Active
-import androidx.ui.focus.FocusDetailedState.ActiveParent
-import androidx.ui.focus.FocusDetailedState.Captured
-import androidx.ui.focus.FocusDetailedState.Disabled
-import androidx.ui.focus.FocusDetailedState.Inactive
-
-import com.google.common.truth.Truth.assertThat
-import com.nhaarman.mockitokotlin2.whenever
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
-import org.mockito.Mockito.mock
-
-@SmallTest
-@RunWith(Parameterized::class)
-class RequestFocusTest(val propagateFocus: Boolean) {
-    lateinit var owner: Owner
-
-    @Before
-    fun setup() {
-        owner = mock(Owner::class.java)
-    }
-
-    companion object {
-        @JvmStatic
-        @Parameterized.Parameters(name = "propagateFocus = {0}")
-        fun initParameters() = listOf(true, false)
-    }
-
-    @Test
-    fun active_isUnchanged() {
-        // Arrange.
-        val focusNode = createFocusNode().apply {
-            focusState = Active
-        }
-
-        // Act.
-        focusNode.requestFocus(propagateFocus)
-
-        // Assert.
-        assertThat(focusNode.focusState).isEqualTo(Active)
-    }
-
-    @Test
-    fun captured_isUnchanged() {
-        // Arrange.
-        val focusNode = createFocusNode().apply {
-            focusState = Captured
-        }
-
-        // Act.
-        focusNode.requestFocus(propagateFocus)
-
-        // Assert.
-        assertThat(focusNode.focusState).isEqualTo(Captured)
-    }
-
-    @Test
-    fun disabled_isUnchanged() {
-        // Arrange.
-        val focusNode = createFocusNode().apply {
-            focusState = Disabled
-        }
-
-        // Act.
-        focusNode.requestFocus(propagateFocus)
-
-        // Assert.
-        assertThat(focusNode.focusState).isEqualTo(Disabled)
-    }
-
-    @Test(expected = IllegalArgumentException::class)
-    fun activeParent_withNoFocusedChild_throwsException() {
-        // Arrange.
-        val focusNode = createFocusNode().apply {
-            focusState = ActiveParent
-        }
-
-        // Act.
-        focusNode.requestFocus(propagateFocus)
-    }
-
-    @Test
-    fun activeParent_propagateFocus() {
-        // Arrange.
-        val child = createFocusNode().apply {
-            focusState = Active
-        }
-        val focusNode = createFocusNode().apply {
-            focusState = ActiveParent
-            layoutNode.insertAt(0, child.layoutNode)
-            layoutNode.layoutNodeWrapper = this
-            focusedChild = child
-        }
-
-        // Act.
-        focusNode.requestFocus(propagateFocus)
-
-        // Assert.
-        when (propagateFocus) {
-            true -> {
-                // Unchanged.
-                assertThat(focusNode.focusState).isEqualTo(ActiveParent)
-                assertThat(child.focusState).isEqualTo(Active)
-            }
-            false -> {
-                assertThat(focusNode.focusState).isEqualTo(Active)
-                assertThat(focusNode.focusedChild).isNull()
-                assertThat(child.focusState).isEqualTo(Inactive)
-            }
-        }
-    }
-
-    @Test
-    fun inactive_root_propagateFocusSendsRequestToOwner_systemCannotGrantFocus() {
-        // Arrange.
-        whenever(owner.requestFocus()).thenReturn(false)
-        val rootFocusNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.attach(owner)
-            focusState = Inactive
-        }
-
-        // Act.
-        rootFocusNode.requestFocus(propagateFocus)
-
-        // Assert.
-        assertThat(rootFocusNode.focusState).isEqualTo(Inactive)
-    }
-
-    @Test
-    fun inactiveRoot_propagateFocusSendsRequestToOwner_systemCanGrantFocus() {
-        // Arrange.
-        whenever(owner.requestFocus()).thenReturn(true)
-        val rootFocusNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.attach(owner)
-            focusState = Inactive
-        }
-
-        // Act.
-        rootFocusNode.requestFocus(propagateFocus)
-
-        // Assert.
-        assertThat(rootFocusNode.focusState).isEqualTo(Active)
-    }
-
-    @Test
-    fun inactiveRootWithChildren_propagateFocusSendsRequestToOwner_systemCanGrantFocus() {
-        // Arrange.
-        whenever(owner.requestFocus()).thenReturn(true)
-        val child = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            focusState = Inactive
-        }
-        val rootFocusNode = createFocusNode().apply {
-            layoutNode.insertAt(0, child.layoutNode)
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.attach(owner)
-            focusState = Inactive
-        }
-
-        // Act.
-        rootFocusNode.requestFocus(propagateFocus)
-
-        // Assert.
-        when (propagateFocus) {
-            true -> {
-                // Unchanged.
-                assertThat(rootFocusNode.focusState).isEqualTo(ActiveParent)
-                assertThat(child.focusState).isEqualTo(Active)
-            }
-            false -> {
-                assertThat(rootFocusNode.focusState).isEqualTo(Active)
-                assertThat(child.focusState).isEqualTo(Inactive)
-            }
-        }
-    }
-
-    @Test
-    fun inactiveNonRootWithChilcren() {
-        // Arrange.
-        whenever(owner.requestFocus()).thenReturn(true)
-        val child = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            focusState = Inactive
-        }
-        val focusNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.insertAt(0, child.layoutNode)
-            focusState = Inactive
-        }
-        val parent = createFocusNode().apply {
-            layoutNode.insertAt(0, focusNode.layoutNode)
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.attach(owner)
-            focusState = Active
-        }
-
-        // Act.
-        focusNode.requestFocus(propagateFocus)
-
-        // Assert.
-        when (propagateFocus) {
-            true -> {
-                assertThat(parent.focusState).isEqualTo(ActiveParent)
-                assertThat(focusNode.focusState).isEqualTo(ActiveParent)
-                assertThat(child.focusState).isEqualTo(Active)
-            }
-            false -> {
-                assertThat(parent.focusState).isEqualTo(ActiveParent)
-                assertThat(focusNode.focusState).isEqualTo(Active)
-                assertThat(child.focusState).isEqualTo(Inactive)
-            }
-        }
-    }
-
-    @Test
-    fun rootNode() {
-        // Arrange.
-        whenever(owner.requestFocus()).thenReturn(true)
-        val rootNode = createFocusNode().apply {
-            layoutNode.attach(owner)
-        }
-
-        // Act.
-        rootNode.requestFocus(propagateFocus)
-
-        // Assert.
-        assertThat(rootNode.focusState).isEqualTo(Active)
-    }
-
-    @Test
-    fun rootNodeWithChildren() {
-        // Arrange.
-        whenever(owner.requestFocus()).thenReturn(true)
-        val childNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            focusState = Inactive
-        }
-        val rootNode = createFocusNode().apply {
-            layoutNode.insertAt(0, childNode.layoutNode)
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.attach(owner)
-        }
-
-        // Act.
-        rootNode.requestFocus(propagateFocus)
-
-        // Assert.
-        when (propagateFocus) {
-            true -> assertThat(rootNode.focusState).isEqualTo(ActiveParent)
-            false -> assertThat(rootNode.focusState).isEqualTo(Active)
-        }
-    }
-
-    @Test
-    fun parentNodeWithNoFocusedAncestor() {
-        // Arrange.
-        whenever(owner.requestFocus()).thenReturn(true)
-        val childNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            focusState = Inactive
-        }
-        val parentNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.insertAt(0, childNode.layoutNode)
-            focusState = Inactive
-        }
-        val grandparentNode = createFocusNode().apply {
-            layoutNode.insertAt(0, parentNode.layoutNode)
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.attach(owner)
-            focusState = Inactive
-        }
-
-        // Act.
-        parentNode.requestFocus(propagateFocus)
-
-        // Assert.
-        when (propagateFocus) {
-            true -> assertThat(parentNode.focusState).isEqualTo(ActiveParent)
-            false -> assertThat(parentNode.focusState).isEqualTo(Active)
-        }
-    }
-
-    @Test
-    fun parentNodeWithNoFocusedAncestor_childRequestsFocus() {
-        // Arrange.
-        whenever(owner.requestFocus()).thenReturn(true)
-        val childNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            focusState = Inactive
-        }
-        val parentNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.insertAt(0, childNode.layoutNode)
-            focusState = Inactive
-        }
-        val grandparentNode = createFocusNode().apply {
-            layoutNode.insertAt(0, parentNode.layoutNode)
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.attach(owner)
-            focusState = Inactive
-        }
-
-        // Act.
-        childNode.requestFocus(propagateFocus)
-
-        // Assert.
-        assertThat(parentNode.focusState).isEqualTo(ActiveParent)
-    }
-
-    @Test
-    fun childNodeWithNoFocusedAncestor() {
-        // Arrange.
-        whenever(owner.requestFocus()).thenReturn(true)
-        val childNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            focusState = Inactive
-        }
-        val parentNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.insertAt(0, childNode.layoutNode)
-            focusState = Inactive
-        }
-        val grandparentNode = createFocusNode().apply {
-            layoutNode.insertAt(0, parentNode.layoutNode)
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.attach(owner)
-            focusState = Inactive
-        }
-
-        // Act.
-        childNode.requestFocus(propagateFocus)
-
-        // Assert.
-        assertThat(childNode.focusState).isEqualTo(Active)
-    }
-
-    @Test
-    fun requestFocus_parentIsFocused() {
-        // Arrange.
-        val focusNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            focusState = Inactive
-        }
-        val parentNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.insertAt(0, focusNode.layoutNode)
-            layoutNode.attach(owner)
-            focusState = Active
-        }
-
-        // Verify Setup.
-        assertThat(parentNode.focusState).isEqualTo(Active)
-        assertThat(focusNode.focusState).isEqualTo(Inactive)
-
-        // After executing requestFocus, siblingNode will be 'Active'.
-        focusNode.requestFocus(propagateFocus)
-
-        // Assert.
-        assertThat(parentNode.focusState).isEqualTo(ActiveParent)
-        assertThat(focusNode.focusState).isEqualTo(Active)
-    }
-
-    @Test
-    fun requestFocus_childIsFocused() {
-        // Arrange.
-        val focusNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            focusState = Active
-        }
-        val parentNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.insertAt(0, focusNode.layoutNode)
-            focusedChild = focusNode
-            focusState = ActiveParent
-        }
-
-        // Verify Setup.
-        assertThat(parentNode.focusState).isEqualTo(ActiveParent)
-        assertThat(focusNode.focusState).isEqualTo(Active)
-
-        // Act.
-        parentNode.requestFocus(propagateFocus)
-
-        // Assert.
-        when (propagateFocus) {
-            true -> {
-                assertThat(parentNode.focusState).isEqualTo(ActiveParent)
-                assertThat(focusNode.focusState).isEqualTo(Active)
-            }
-            false -> {
-                assertThat(parentNode.focusState).isEqualTo(Active)
-                assertThat(focusNode.focusState).isEqualTo(Inactive)
-            }
-        }
-    }
-
-    @Test
-    fun requestFocus_childHasCapturedFocus() {
-        // Arrange.
-        val focusNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            focusState = Captured
-        }
-        val parentNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.insertAt(0, focusNode.layoutNode)
-            focusedChild = focusNode
-            focusState = ActiveParent
-        }
-
-        // Verify Setup.
-        assertThat(parentNode.focusState).isEqualTo(ActiveParent)
-        assertThat(focusNode.focusState).isEqualTo(Captured)
-
-        // Act.
-        parentNode.requestFocus(propagateFocus)
-
-        // Assert.
-        assertThat(parentNode.focusState).isEqualTo(ActiveParent)
-        assertThat(focusNode.focusState).isEqualTo(Captured)
-    }
-
-    @Test
-    fun requestFocus_siblingIsFocused() {
-        // Arrange.
-        val focusNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            focusState = Inactive
-        }
-        val siblingNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            focusState = Active
-        }
-        val parentNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.insertAt(0, focusNode.layoutNode)
-            layoutNode.insertAt(1, siblingNode.layoutNode)
-            layoutNode.attach(owner)
-            focusedChild = siblingNode
-            focusState = ActiveParent
-        }
-
-        // Verify Setup.
-        assertThat(parentNode.focusState).isEqualTo(ActiveParent)
-        assertThat(focusNode.focusState).isEqualTo(Inactive)
-        assertThat(siblingNode.focusState).isEqualTo(Active)
-
-        // Act.
-        focusNode.requestFocus(propagateFocus)
-
-        // Assert.
-        assertThat(parentNode.focusState).isEqualTo(ActiveParent)
-        assertThat(focusNode.focusState).isEqualTo(Active)
-        assertThat(siblingNode.focusState).isEqualTo(Inactive)
-    }
-
-    @Test
-    fun requestFocus_siblingHasCapturedFocused() {
-        // Arrange.
-        val focusNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            focusState = Inactive
-        }
-        val siblingNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            focusState = Captured
-        }
-        val parentNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.insertAt(0, focusNode.layoutNode)
-            layoutNode.insertAt(1, siblingNode.layoutNode)
-            layoutNode.attach(owner)
-            focusedChild = siblingNode
-            focusState = ActiveParent
-        }
-
-        // Verify Setup.
-        assertThat(parentNode.focusState).isEqualTo(ActiveParent)
-        assertThat(focusNode.focusState).isEqualTo(Inactive)
-        assertThat(siblingNode.focusState).isEqualTo(Captured)
-
-        // Act.
-        focusNode.requestFocus(propagateFocus)
-
-        // Assert.
-        assertThat(parentNode.focusState).isEqualTo(ActiveParent)
-        assertThat(focusNode.focusState).isEqualTo(Inactive)
-        assertThat(siblingNode.focusState).isEqualTo(Captured)
-    }
-
-    @Test
-    fun requestFocus_cousinIsFocused() {
-        // Arrange.
-        val focusNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            focusState = Inactive
-        }
-
-        val cousinNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            focusState = Active
-        }
-
-        val parentNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.insertAt(0, focusNode.layoutNode)
-            focusState = Inactive
-        }
-        val auntNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.insertAt(0, cousinNode.layoutNode)
-            focusedChild = cousinNode
-            focusState = ActiveParent
-        }
-
-        val grandparentNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.insertAt(0, parentNode.layoutNode)
-            layoutNode.insertAt(1, auntNode.layoutNode)
-            layoutNode.attach(owner)
-            focusedChild = auntNode
-            focusState = ActiveParent
-        }
-
-        // Verify Setup.
-        assertThat(cousinNode.focusState).isEqualTo(Active)
-        assertThat(focusNode.focusState).isEqualTo(Inactive)
-
-        // Act.
-        focusNode.requestFocus(propagateFocus)
-
-        // Assert.
-        assertThat(cousinNode.focusState).isEqualTo(Inactive)
-        assertThat(focusNode.focusState).isEqualTo(Active)
-    }
-
-    @Test
-    fun requestFocus_grandParentIsFocused() {
-        // Arrange.
-        whenever(owner.requestFocus()).thenReturn(true)
-        val focusNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            focusState = Inactive
-        }
-        val parentNode = createFocusNode().apply {
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.insertAt(0, focusNode.layoutNode)
-            focusState = Inactive
-        }
-        val grandparentNode = createFocusNode().apply {
-            layoutNode.insertAt(0, parentNode.layoutNode)
-            layoutNode.layoutNodeWrapper = this
-            layoutNode.attach(owner)
-            focusState = Active
-        }
-
-        // Verify Setup.
-        assertThat(grandparentNode.focusState).isEqualTo(Active)
-        assertThat(parentNode.focusState).isEqualTo(Inactive)
-        assertThat(focusNode.focusState).isEqualTo(Inactive)
-
-        // Act.
-        focusNode.requestFocus(propagateFocus)
-
-        // Assert.
-        assertThat(grandparentNode.focusState).isEqualTo(ActiveParent)
-        assertThat(parentNode.focusState).isEqualTo(ActiveParent)
-        assertThat(focusNode.focusState).isEqualTo(Active)
-    }
-
-    private fun createFocusNode() = ModifiedFocusNode(InnerPlaceable(LayoutNode()))
-}
\ No newline at end of file
diff --git a/ui/ui-platform/src/test/java/androidx/ui/core/pointerinput/PointerInputEventProcessorTest.kt b/ui/ui-platform/src/test/java/androidx/ui/core/pointerinput/PointerInputEventProcessorTest.kt
index 613f792..66ff665 100644
--- a/ui/ui-platform/src/test/java/androidx/ui/core/pointerinput/PointerInputEventProcessorTest.kt
+++ b/ui/ui-platform/src/test/java/androidx/ui/core/pointerinput/PointerInputEventProcessorTest.kt
@@ -1930,7 +1930,6 @@
         // Arrange
 
         val pointerInputFilter: PointerInputFilter = spy()
-        val cancelHandler: () -> Unit = spy()
         val layoutNode = LayoutNode(
             0, 0, 500, 500,
             PointerInputModifierImpl(pointerInputFilter)
@@ -2307,7 +2306,7 @@
         // Act
 
         pointerInputEventProcessor.process(down)
-        childLayoutNode.modifier = Modifier.None
+        childLayoutNode.modifier = Modifier
         pointerInputEventProcessor.process(up)
 
         // Assert
@@ -2358,7 +2357,7 @@
         // Act
 
         pointerInputEventProcessor.process(down)
-        childLayoutNode.modifier = Modifier.None
+        childLayoutNode.modifier = Modifier
         pointerInputEventProcessor.process(up)
 
         // Assert
diff --git a/ui/ui-platform/src/test/java/androidx/ui/core/pointerinput/TestUtils.kt b/ui/ui-platform/src/test/java/androidx/ui/core/pointerinput/TestUtils.kt
index c17700e..0e80752 100644
--- a/ui/ui-platform/src/test/java/androidx/ui/core/pointerinput/TestUtils.kt
+++ b/ui/ui-platform/src/test/java/androidx/ui/core/pointerinput/TestUtils.kt
@@ -51,7 +51,7 @@
     }
 }
 
-internal fun LayoutNode(x: Int, y: Int, x2: Int, y2: Int, modifier: Modifier = Modifier.None) =
+internal fun LayoutNode(x: Int, y: Int, x2: Int, y2: Int, modifier: Modifier = Modifier) =
     LayoutNode().apply {
         this.modifier = modifier
         layoutDirection = LayoutDirection.Ltr
diff --git a/ui/ui-saved-instance-state/src/androidTest/java/androidx/ui/savedinstancestate/ActivityRecreationTest.kt b/ui/ui-saved-instance-state/src/androidTest/java/androidx/ui/savedinstancestate/ActivityRecreationTest.kt
index 85df4a3..2556467 100644
--- a/ui/ui-saved-instance-state/src/androidTest/java/androidx/ui/savedinstancestate/ActivityRecreationTest.kt
+++ b/ui/ui-saved-instance-state/src/androidTest/java/androidx/ui/savedinstancestate/ActivityRecreationTest.kt
@@ -16,11 +16,11 @@
 
 package androidx.ui.savedinstancestate
 
-import android.app.Activity
 import android.os.Bundle
 import android.view.ViewGroup
 import android.widget.FrameLayout
 import android.widget.LinearLayout
+import androidx.activity.ComponentActivity
 import androidx.compose.remember
 import androidx.lifecycle.Lifecycle
 import androidx.test.core.app.ActivityScenario
@@ -100,7 +100,7 @@
     }
 }
 
-class RecreationTest1Activity : Activity() {
+class RecreationTest1Activity : ComponentActivity() {
 
     lateinit var array: IntArray
 
@@ -112,7 +112,7 @@
     }
 }
 
-class RecreationTest2Activity : Activity() {
+class RecreationTest2Activity : ComponentActivity() {
 
     lateinit var array: IntArray
 
@@ -124,7 +124,7 @@
     }
 }
 
-class RecreationTest3Activity : Activity() {
+class RecreationTest3Activity : ComponentActivity() {
 
     lateinit var array1: IntArray
     lateinit var array2: IntArray
diff --git a/ui/ui-saved-instance-state/src/androidTest/java/androidx/ui/savedinstancestate/RememberSavedInstanceStateTest.kt b/ui/ui-saved-instance-state/src/androidTest/java/androidx/ui/savedinstancestate/RememberSavedInstanceStateTest.kt
index fbceaf5..37fe664 100644
--- a/ui/ui-saved-instance-state/src/androidTest/java/androidx/ui/savedinstancestate/RememberSavedInstanceStateTest.kt
+++ b/ui/ui-saved-instance-state/src/androidTest/java/androidx/ui/savedinstancestate/RememberSavedInstanceStateTest.kt
@@ -24,6 +24,8 @@
 import androidx.test.filters.MediumTest
 import androidx.ui.test.StateRestorationTester
 import androidx.ui.test.createComposeRule
+import androidx.ui.test.runOnIdleCompose
+import androidx.ui.test.runOnUiThread
 import com.google.common.truth.Truth.assertThat
 import org.junit.Assert.assertTrue
 import org.junit.Rule
@@ -53,7 +55,7 @@
 
         assertThat(array).isEqualTo(intArrayOf(0))
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             array!![0] = 1
             // we null it to ensure recomposition happened
             array = null
@@ -75,7 +77,7 @@
 
         assertThat(holder).isEqualTo(Holder(0))
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             holder!!.value = 1
             // we null it to ensure recomposition happened
             holder = null
@@ -184,7 +186,7 @@
 
         val latch = CountDownLatch(1)
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             registryFactory = {
                 object : DelegateRegistry(it) {
                     override fun registerProvider(key: String, valueProvider: () -> Any?) {
@@ -231,7 +233,7 @@
         assertTrue(registerLatch.await(1, TimeUnit.SECONDS))
         registerLatch = CountDownLatch(1)
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             key = "key2"
         }
 
@@ -252,7 +254,7 @@
 
         val latch = CountDownLatch(1)
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             saver = Saver(
                 save = {
                     latch.countDown()
@@ -288,7 +290,7 @@
             }
         }
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             // assert that unregister is not yet called
             assertThat(latch.count).isEqualTo(1)
             doEmit = false
diff --git a/ui/ui-saved-instance-state/src/androidTest/java/androidx/ui/savedinstancestate/SavedInstanceStateTest.kt b/ui/ui-saved-instance-state/src/androidTest/java/androidx/ui/savedinstancestate/SavedInstanceStateTest.kt
index e0ceb57..95d45aa 100644
--- a/ui/ui-saved-instance-state/src/androidTest/java/androidx/ui/savedinstancestate/SavedInstanceStateTest.kt
+++ b/ui/ui-saved-instance-state/src/androidTest/java/androidx/ui/savedinstancestate/SavedInstanceStateTest.kt
@@ -20,6 +20,8 @@
 import androidx.test.filters.MediumTest
 import androidx.ui.test.StateRestorationTester
 import androidx.ui.test.createComposeRule
+import androidx.ui.test.runOnIdleCompose
+import androidx.ui.test.runOnUiThread
 import com.google.common.truth.Truth.assertThat
 import org.junit.Rule
 import org.junit.Test
@@ -42,7 +44,7 @@
             state = savedInstanceState { 0 }
         }
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             assertThat(state!!.value).isEqualTo(0)
 
             state!!.value = 1
@@ -52,7 +54,7 @@
 
         restorationTester.emulateSavedInstanceStateRestore()
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             assertThat(state!!.value).isEqualTo(1)
         }
     }
@@ -66,7 +68,7 @@
             }
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(state!!.value).isEqualTo(Holder(0))
 
             state!!.value.value = 1
@@ -76,7 +78,7 @@
 
         restorationTester.emulateSavedInstanceStateRestore()
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(state!!.value).isEqualTo(Holder(1))
         }
     }
diff --git a/ui/ui-test-font/OWNERS b/ui/ui-test-font/OWNERS
new file mode 100644
index 0000000..73261b9
--- /dev/null
+++ b/ui/ui-test-font/OWNERS
@@ -0,0 +1,4 @@
+haoyuchang@google.com
+qqd@google.com
+nona@google.com
+siyamed@google.com
\ No newline at end of file
diff --git a/ui/ui-test-font/build.gradle b/ui/ui-test-font/build.gradle
new file mode 100644
index 0000000..38d00de
--- /dev/null
+++ b/ui/ui-test-font/build.gradle
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import androidx.build.LibraryGroups
+import androidx.build.LibraryVersions
+import androidx.build.Publish
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("AndroidXUiPlugin")
+}
+
+androidx {
+    name = "AndroidX UI Test Font resources"
+    publish = Publish.SNAPSHOT_AND_RELEASE
+    mavenVersion = LibraryVersions.UI
+    mavenGroup = LibraryGroups.UI
+    inceptionYear = "2020"
+    description = "Fonts designed for testing text capabilities"
+}
diff --git a/ui/ui-text/src/androidTest/font_ttx/kern_font.ttx b/ui/ui-test-font/src/font_ttx/kern_font.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/kern_font.ttx
rename to ui/ui-test-font/src/font_ttx/kern_font.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/sample_font.ttx b/ui/ui-test-font/src/font_ttx/sample_font.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/sample_font.ttx
rename to ui/ui-test-font/src/font_ttx/sample_font.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/test_100_italic.ttx b/ui/ui-test-font/src/font_ttx/test_100_italic.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/test_100_italic.ttx
rename to ui/ui-test-font/src/font_ttx/test_100_italic.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/test_100_regular.ttx b/ui/ui-test-font/src/font_ttx/test_100_regular.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/test_100_regular.ttx
rename to ui/ui-test-font/src/font_ttx/test_100_regular.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/test_200_italic.ttx b/ui/ui-test-font/src/font_ttx/test_200_italic.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/test_200_italic.ttx
rename to ui/ui-test-font/src/font_ttx/test_200_italic.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/test_200_regular.ttx b/ui/ui-test-font/src/font_ttx/test_200_regular.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/test_200_regular.ttx
rename to ui/ui-test-font/src/font_ttx/test_200_regular.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/test_300_italic.ttx b/ui/ui-test-font/src/font_ttx/test_300_italic.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/test_300_italic.ttx
rename to ui/ui-test-font/src/font_ttx/test_300_italic.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/test_300_regular.ttx b/ui/ui-test-font/src/font_ttx/test_300_regular.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/test_300_regular.ttx
rename to ui/ui-test-font/src/font_ttx/test_300_regular.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/test_400_italic.ttx b/ui/ui-test-font/src/font_ttx/test_400_italic.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/test_400_italic.ttx
rename to ui/ui-test-font/src/font_ttx/test_400_italic.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/test_400_regular.ttx b/ui/ui-test-font/src/font_ttx/test_400_regular.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/test_400_regular.ttx
rename to ui/ui-test-font/src/font_ttx/test_400_regular.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/test_500_italic.ttx b/ui/ui-test-font/src/font_ttx/test_500_italic.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/test_500_italic.ttx
rename to ui/ui-test-font/src/font_ttx/test_500_italic.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/test_500_regular.ttx b/ui/ui-test-font/src/font_ttx/test_500_regular.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/test_500_regular.ttx
rename to ui/ui-test-font/src/font_ttx/test_500_regular.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/test_600_italic.ttx b/ui/ui-test-font/src/font_ttx/test_600_italic.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/test_600_italic.ttx
rename to ui/ui-test-font/src/font_ttx/test_600_italic.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/test_600_regular.ttx b/ui/ui-test-font/src/font_ttx/test_600_regular.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/test_600_regular.ttx
rename to ui/ui-test-font/src/font_ttx/test_600_regular.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/test_700_italic.ttx b/ui/ui-test-font/src/font_ttx/test_700_italic.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/test_700_italic.ttx
rename to ui/ui-test-font/src/font_ttx/test_700_italic.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/test_700_regular.ttx b/ui/ui-test-font/src/font_ttx/test_700_regular.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/test_700_regular.ttx
rename to ui/ui-test-font/src/font_ttx/test_700_regular.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/test_800_italic.ttx b/ui/ui-test-font/src/font_ttx/test_800_italic.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/test_800_italic.ttx
rename to ui/ui-test-font/src/font_ttx/test_800_italic.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/test_800_regular.ttx b/ui/ui-test-font/src/font_ttx/test_800_regular.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/test_800_regular.ttx
rename to ui/ui-test-font/src/font_ttx/test_800_regular.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/test_900_italic.ttx b/ui/ui-test-font/src/font_ttx/test_900_italic.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/test_900_italic.ttx
rename to ui/ui-test-font/src/font_ttx/test_900_italic.ttx
diff --git a/ui/ui-text/src/androidTest/font_ttx/test_900_regular.ttx b/ui/ui-test-font/src/font_ttx/test_900_regular.ttx
similarity index 100%
rename from ui/ui-text/src/androidTest/font_ttx/test_900_regular.ttx
rename to ui/ui-test-font/src/font_ttx/test_900_regular.ttx
diff --git a/ui/ui-test-font/src/main/AndroidManifest.xml b/ui/ui-test-font/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f6cc38b
--- /dev/null
+++ b/ui/ui-test-font/src/main/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.ui.text.font.test">
+</manifest>
diff --git a/ui/ui-text/src/androidTest/res/font/invalid_font.ttf b/ui/ui-test-font/src/main/res/font/invalid_font.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/invalid_font.ttf
rename to ui/ui-test-font/src/main/res/font/invalid_font.ttf
diff --git a/ui/ui-text/src/androidTest/res/font/kern_font.ttf b/ui/ui-test-font/src/main/res/font/kern_font.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/kern_font.ttf
rename to ui/ui-test-font/src/main/res/font/kern_font.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/sample_font.ttf b/ui/ui-test-font/src/main/res/font/sample_font.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/sample_font.ttf
rename to ui/ui-test-font/src/main/res/font/sample_font.ttf
Binary files differ
diff --git a/ui/ui-framework/src/androidTest/res/font/sample_font2.ttf b/ui/ui-test-font/src/main/res/font/sample_font2.ttf
similarity index 100%
rename from ui/ui-framework/src/androidTest/res/font/sample_font2.ttf
rename to ui/ui-test-font/src/main/res/font/sample_font2.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/test_100_italic.ttf b/ui/ui-test-font/src/main/res/font/test_100_italic.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/test_100_italic.ttf
rename to ui/ui-test-font/src/main/res/font/test_100_italic.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/test_100_regular.ttf b/ui/ui-test-font/src/main/res/font/test_100_regular.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/test_100_regular.ttf
rename to ui/ui-test-font/src/main/res/font/test_100_regular.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/test_200_italic.ttf b/ui/ui-test-font/src/main/res/font/test_200_italic.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/test_200_italic.ttf
rename to ui/ui-test-font/src/main/res/font/test_200_italic.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/test_200_regular.ttf b/ui/ui-test-font/src/main/res/font/test_200_regular.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/test_200_regular.ttf
rename to ui/ui-test-font/src/main/res/font/test_200_regular.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/test_300_italic.ttf b/ui/ui-test-font/src/main/res/font/test_300_italic.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/test_300_italic.ttf
rename to ui/ui-test-font/src/main/res/font/test_300_italic.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/test_300_regular.ttf b/ui/ui-test-font/src/main/res/font/test_300_regular.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/test_300_regular.ttf
rename to ui/ui-test-font/src/main/res/font/test_300_regular.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/test_400_italic.ttf b/ui/ui-test-font/src/main/res/font/test_400_italic.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/test_400_italic.ttf
rename to ui/ui-test-font/src/main/res/font/test_400_italic.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/test_400_regular.ttf b/ui/ui-test-font/src/main/res/font/test_400_regular.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/test_400_regular.ttf
rename to ui/ui-test-font/src/main/res/font/test_400_regular.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/test_500_italic.ttf b/ui/ui-test-font/src/main/res/font/test_500_italic.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/test_500_italic.ttf
rename to ui/ui-test-font/src/main/res/font/test_500_italic.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/test_500_regular.ttf b/ui/ui-test-font/src/main/res/font/test_500_regular.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/test_500_regular.ttf
rename to ui/ui-test-font/src/main/res/font/test_500_regular.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/test_600_italic.ttf b/ui/ui-test-font/src/main/res/font/test_600_italic.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/test_600_italic.ttf
rename to ui/ui-test-font/src/main/res/font/test_600_italic.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/test_600_regular.ttf b/ui/ui-test-font/src/main/res/font/test_600_regular.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/test_600_regular.ttf
rename to ui/ui-test-font/src/main/res/font/test_600_regular.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/test_700_italic.ttf b/ui/ui-test-font/src/main/res/font/test_700_italic.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/test_700_italic.ttf
rename to ui/ui-test-font/src/main/res/font/test_700_italic.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/test_700_regular.ttf b/ui/ui-test-font/src/main/res/font/test_700_regular.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/test_700_regular.ttf
rename to ui/ui-test-font/src/main/res/font/test_700_regular.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/test_800_italic.ttf b/ui/ui-test-font/src/main/res/font/test_800_italic.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/test_800_italic.ttf
rename to ui/ui-test-font/src/main/res/font/test_800_italic.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/test_800_regular.ttf b/ui/ui-test-font/src/main/res/font/test_800_regular.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/test_800_regular.ttf
rename to ui/ui-test-font/src/main/res/font/test_800_regular.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/test_900_italic.ttf b/ui/ui-test-font/src/main/res/font/test_900_italic.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/test_900_italic.ttf
rename to ui/ui-test-font/src/main/res/font/test_900_italic.ttf
Binary files differ
diff --git a/ui/ui-text/src/androidTest/res/font/test_900_regular.ttf b/ui/ui-test-font/src/main/res/font/test_900_regular.ttf
similarity index 100%
rename from ui/ui-text/src/androidTest/res/font/test_900_regular.ttf
rename to ui/ui-test-font/src/main/res/font/test_900_regular.ttf
Binary files differ
diff --git a/ui/ui-test/api/0.1.0-dev09.txt b/ui/ui-test/api/0.1.0-dev09.txt
index dcef6b4..ef94ca5 100644
--- a/ui/ui-test/api/0.1.0-dev09.txt
+++ b/ui/ui-test/api/0.1.0-dev09.txt
@@ -120,8 +120,6 @@
     method public androidx.ui.test.AnimationClockTestRule getClockTestRule();
     method public androidx.ui.unit.Density getDensity();
     method public android.util.DisplayMetrics getDisplayMetrics();
-    method public <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
-    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
     method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
     property public abstract androidx.ui.test.AnimationClockTestRule clockTestRule;
     property public abstract androidx.ui.unit.Density density;
@@ -208,10 +206,6 @@
     method public static androidx.ui.core.semantics.SemanticsConfiguration createFullSemantics(Boolean? isEnabled = null, String? value = null, androidx.ui.foundation.selection.ToggleableState? toggleableState = null, Boolean? inMutuallyExclusiveGroup = null, Boolean? isSelected = null);
   }
 
-  public final class LayoutCoordinatesHelperKt {
-    method public static androidx.ui.unit.PxPosition getPositionInParent(androidx.ui.core.LayoutCoordinates);
-  }
-
   public final class OutputKt {
     method public static String dumpToString(androidx.ui.test.SemanticsNodeInteraction);
     method public static String dumpToString(java.util.Collection<androidx.ui.test.SemanticsNodeInteraction>);
@@ -260,6 +254,8 @@
   }
 
   public final class SynchronizationKt {
+    method public static <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
+    method public static <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
   }
 
   public interface TestAnimationClock extends androidx.animation.AnimationClockObservable {
@@ -277,15 +273,15 @@
 package androidx.ui.test.android {
 
   public final class AndroidComposeTestCaseRunnerKt {
-    method public static <T extends androidx.ui.test.ComposeTestCase> androidx.ui.test.ComposeBenchmarkScope<T> createAndroidComposeBenchmarkRunner(kotlin.jvm.functions.Function0<? extends T> testCaseFactory, android.app.Activity activity);
+    method public static <T extends androidx.ui.test.ComposeTestCase> androidx.ui.test.ComposeBenchmarkScope<T> createAndroidComposeBenchmarkRunner(kotlin.jvm.functions.Function0<? extends T> testCaseFactory, androidx.activity.ComponentActivity activity);
   }
 
   public final class AndroidComposeTestCaseSetup implements androidx.ui.test.ComposeTestCaseSetup {
-    ctor public AndroidComposeTestCaseSetup(androidx.ui.test.ComposeTestRule testRule, androidx.ui.test.ComposeTestCase testCase, android.app.Activity activity);
+    ctor public AndroidComposeTestCaseSetup(androidx.ui.test.ComposeTestCase testCase, androidx.activity.ComponentActivity activity);
     method public void performTestWithEventsControl(kotlin.jvm.functions.Function1<? super androidx.ui.test.ComposeExecutionControl,kotlin.Unit> block);
   }
 
-  public final class AndroidComposeTestRule<T extends android.app.Activity> implements androidx.ui.test.ComposeTestRule {
+  public final class AndroidComposeTestRule<T extends androidx.activity.ComponentActivity> implements androidx.ui.test.ComposeTestRule {
     ctor public AndroidComposeTestRule(Class<T> activityClass, boolean disableTransitions);
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description? description);
     method @RequiresApi(android.os.Build.VERSION_CODES.O) public android.graphics.Bitmap captureScreenOnIdle();
@@ -295,8 +291,6 @@
     method public androidx.ui.test.AnimationClockTestRule getClockTestRule();
     method public androidx.ui.unit.Density getDensity();
     method public android.util.DisplayMetrics getDisplayMetrics();
-    method public <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
-    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
     method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
     property public final androidx.test.rule.ActivityTestRule<T> activityTestRule;
     property public androidx.ui.test.AnimationClockTestRule clockTestRule;
@@ -310,7 +304,7 @@
   }
 
   public final class AndroidComposeTestRuleKt {
-    method public static inline <reified T extends android.app.Activity> androidx.ui.test.android.AndroidComposeTestRule<T> AndroidComposeTestRule(boolean disableTransitions = false);
+    method public static inline <reified T extends androidx.activity.ComponentActivity> androidx.ui.test.android.AndroidComposeTestRule<T> AndroidComposeTestRule(boolean disableTransitions = false);
   }
 
   public final class ComposeIdlingResourceKt {
diff --git a/ui/ui-test/api/current.txt b/ui/ui-test/api/current.txt
index dcef6b4..ef94ca5 100644
--- a/ui/ui-test/api/current.txt
+++ b/ui/ui-test/api/current.txt
@@ -120,8 +120,6 @@
     method public androidx.ui.test.AnimationClockTestRule getClockTestRule();
     method public androidx.ui.unit.Density getDensity();
     method public android.util.DisplayMetrics getDisplayMetrics();
-    method public <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
-    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
     method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
     property public abstract androidx.ui.test.AnimationClockTestRule clockTestRule;
     property public abstract androidx.ui.unit.Density density;
@@ -208,10 +206,6 @@
     method public static androidx.ui.core.semantics.SemanticsConfiguration createFullSemantics(Boolean? isEnabled = null, String? value = null, androidx.ui.foundation.selection.ToggleableState? toggleableState = null, Boolean? inMutuallyExclusiveGroup = null, Boolean? isSelected = null);
   }
 
-  public final class LayoutCoordinatesHelperKt {
-    method public static androidx.ui.unit.PxPosition getPositionInParent(androidx.ui.core.LayoutCoordinates);
-  }
-
   public final class OutputKt {
     method public static String dumpToString(androidx.ui.test.SemanticsNodeInteraction);
     method public static String dumpToString(java.util.Collection<androidx.ui.test.SemanticsNodeInteraction>);
@@ -260,6 +254,8 @@
   }
 
   public final class SynchronizationKt {
+    method public static <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
+    method public static <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
   }
 
   public interface TestAnimationClock extends androidx.animation.AnimationClockObservable {
@@ -277,15 +273,15 @@
 package androidx.ui.test.android {
 
   public final class AndroidComposeTestCaseRunnerKt {
-    method public static <T extends androidx.ui.test.ComposeTestCase> androidx.ui.test.ComposeBenchmarkScope<T> createAndroidComposeBenchmarkRunner(kotlin.jvm.functions.Function0<? extends T> testCaseFactory, android.app.Activity activity);
+    method public static <T extends androidx.ui.test.ComposeTestCase> androidx.ui.test.ComposeBenchmarkScope<T> createAndroidComposeBenchmarkRunner(kotlin.jvm.functions.Function0<? extends T> testCaseFactory, androidx.activity.ComponentActivity activity);
   }
 
   public final class AndroidComposeTestCaseSetup implements androidx.ui.test.ComposeTestCaseSetup {
-    ctor public AndroidComposeTestCaseSetup(androidx.ui.test.ComposeTestRule testRule, androidx.ui.test.ComposeTestCase testCase, android.app.Activity activity);
+    ctor public AndroidComposeTestCaseSetup(androidx.ui.test.ComposeTestCase testCase, androidx.activity.ComponentActivity activity);
     method public void performTestWithEventsControl(kotlin.jvm.functions.Function1<? super androidx.ui.test.ComposeExecutionControl,kotlin.Unit> block);
   }
 
-  public final class AndroidComposeTestRule<T extends android.app.Activity> implements androidx.ui.test.ComposeTestRule {
+  public final class AndroidComposeTestRule<T extends androidx.activity.ComponentActivity> implements androidx.ui.test.ComposeTestRule {
     ctor public AndroidComposeTestRule(Class<T> activityClass, boolean disableTransitions);
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description? description);
     method @RequiresApi(android.os.Build.VERSION_CODES.O) public android.graphics.Bitmap captureScreenOnIdle();
@@ -295,8 +291,6 @@
     method public androidx.ui.test.AnimationClockTestRule getClockTestRule();
     method public androidx.ui.unit.Density getDensity();
     method public android.util.DisplayMetrics getDisplayMetrics();
-    method public <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
-    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
     method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
     property public final androidx.test.rule.ActivityTestRule<T> activityTestRule;
     property public androidx.ui.test.AnimationClockTestRule clockTestRule;
@@ -310,7 +304,7 @@
   }
 
   public final class AndroidComposeTestRuleKt {
-    method public static inline <reified T extends android.app.Activity> androidx.ui.test.android.AndroidComposeTestRule<T> AndroidComposeTestRule(boolean disableTransitions = false);
+    method public static inline <reified T extends androidx.activity.ComponentActivity> androidx.ui.test.android.AndroidComposeTestRule<T> AndroidComposeTestRule(boolean disableTransitions = false);
   }
 
   public final class ComposeIdlingResourceKt {
diff --git a/ui/ui-test/api/public_plus_experimental_0.1.0-dev09.txt b/ui/ui-test/api/public_plus_experimental_0.1.0-dev09.txt
index dcef6b4..ef94ca5 100644
--- a/ui/ui-test/api/public_plus_experimental_0.1.0-dev09.txt
+++ b/ui/ui-test/api/public_plus_experimental_0.1.0-dev09.txt
@@ -120,8 +120,6 @@
     method public androidx.ui.test.AnimationClockTestRule getClockTestRule();
     method public androidx.ui.unit.Density getDensity();
     method public android.util.DisplayMetrics getDisplayMetrics();
-    method public <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
-    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
     method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
     property public abstract androidx.ui.test.AnimationClockTestRule clockTestRule;
     property public abstract androidx.ui.unit.Density density;
@@ -208,10 +206,6 @@
     method public static androidx.ui.core.semantics.SemanticsConfiguration createFullSemantics(Boolean? isEnabled = null, String? value = null, androidx.ui.foundation.selection.ToggleableState? toggleableState = null, Boolean? inMutuallyExclusiveGroup = null, Boolean? isSelected = null);
   }
 
-  public final class LayoutCoordinatesHelperKt {
-    method public static androidx.ui.unit.PxPosition getPositionInParent(androidx.ui.core.LayoutCoordinates);
-  }
-
   public final class OutputKt {
     method public static String dumpToString(androidx.ui.test.SemanticsNodeInteraction);
     method public static String dumpToString(java.util.Collection<androidx.ui.test.SemanticsNodeInteraction>);
@@ -260,6 +254,8 @@
   }
 
   public final class SynchronizationKt {
+    method public static <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
+    method public static <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
   }
 
   public interface TestAnimationClock extends androidx.animation.AnimationClockObservable {
@@ -277,15 +273,15 @@
 package androidx.ui.test.android {
 
   public final class AndroidComposeTestCaseRunnerKt {
-    method public static <T extends androidx.ui.test.ComposeTestCase> androidx.ui.test.ComposeBenchmarkScope<T> createAndroidComposeBenchmarkRunner(kotlin.jvm.functions.Function0<? extends T> testCaseFactory, android.app.Activity activity);
+    method public static <T extends androidx.ui.test.ComposeTestCase> androidx.ui.test.ComposeBenchmarkScope<T> createAndroidComposeBenchmarkRunner(kotlin.jvm.functions.Function0<? extends T> testCaseFactory, androidx.activity.ComponentActivity activity);
   }
 
   public final class AndroidComposeTestCaseSetup implements androidx.ui.test.ComposeTestCaseSetup {
-    ctor public AndroidComposeTestCaseSetup(androidx.ui.test.ComposeTestRule testRule, androidx.ui.test.ComposeTestCase testCase, android.app.Activity activity);
+    ctor public AndroidComposeTestCaseSetup(androidx.ui.test.ComposeTestCase testCase, androidx.activity.ComponentActivity activity);
     method public void performTestWithEventsControl(kotlin.jvm.functions.Function1<? super androidx.ui.test.ComposeExecutionControl,kotlin.Unit> block);
   }
 
-  public final class AndroidComposeTestRule<T extends android.app.Activity> implements androidx.ui.test.ComposeTestRule {
+  public final class AndroidComposeTestRule<T extends androidx.activity.ComponentActivity> implements androidx.ui.test.ComposeTestRule {
     ctor public AndroidComposeTestRule(Class<T> activityClass, boolean disableTransitions);
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description? description);
     method @RequiresApi(android.os.Build.VERSION_CODES.O) public android.graphics.Bitmap captureScreenOnIdle();
@@ -295,8 +291,6 @@
     method public androidx.ui.test.AnimationClockTestRule getClockTestRule();
     method public androidx.ui.unit.Density getDensity();
     method public android.util.DisplayMetrics getDisplayMetrics();
-    method public <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
-    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
     method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
     property public final androidx.test.rule.ActivityTestRule<T> activityTestRule;
     property public androidx.ui.test.AnimationClockTestRule clockTestRule;
@@ -310,7 +304,7 @@
   }
 
   public final class AndroidComposeTestRuleKt {
-    method public static inline <reified T extends android.app.Activity> androidx.ui.test.android.AndroidComposeTestRule<T> AndroidComposeTestRule(boolean disableTransitions = false);
+    method public static inline <reified T extends androidx.activity.ComponentActivity> androidx.ui.test.android.AndroidComposeTestRule<T> AndroidComposeTestRule(boolean disableTransitions = false);
   }
 
   public final class ComposeIdlingResourceKt {
diff --git a/ui/ui-test/api/public_plus_experimental_current.txt b/ui/ui-test/api/public_plus_experimental_current.txt
index dcef6b4..ef94ca5 100644
--- a/ui/ui-test/api/public_plus_experimental_current.txt
+++ b/ui/ui-test/api/public_plus_experimental_current.txt
@@ -120,8 +120,6 @@
     method public androidx.ui.test.AnimationClockTestRule getClockTestRule();
     method public androidx.ui.unit.Density getDensity();
     method public android.util.DisplayMetrics getDisplayMetrics();
-    method public <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
-    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
     method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
     property public abstract androidx.ui.test.AnimationClockTestRule clockTestRule;
     property public abstract androidx.ui.unit.Density density;
@@ -208,10 +206,6 @@
     method public static androidx.ui.core.semantics.SemanticsConfiguration createFullSemantics(Boolean? isEnabled = null, String? value = null, androidx.ui.foundation.selection.ToggleableState? toggleableState = null, Boolean? inMutuallyExclusiveGroup = null, Boolean? isSelected = null);
   }
 
-  public final class LayoutCoordinatesHelperKt {
-    method public static androidx.ui.unit.PxPosition getPositionInParent(androidx.ui.core.LayoutCoordinates);
-  }
-
   public final class OutputKt {
     method public static String dumpToString(androidx.ui.test.SemanticsNodeInteraction);
     method public static String dumpToString(java.util.Collection<androidx.ui.test.SemanticsNodeInteraction>);
@@ -260,6 +254,8 @@
   }
 
   public final class SynchronizationKt {
+    method public static <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
+    method public static <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
   }
 
   public interface TestAnimationClock extends androidx.animation.AnimationClockObservable {
@@ -277,15 +273,15 @@
 package androidx.ui.test.android {
 
   public final class AndroidComposeTestCaseRunnerKt {
-    method public static <T extends androidx.ui.test.ComposeTestCase> androidx.ui.test.ComposeBenchmarkScope<T> createAndroidComposeBenchmarkRunner(kotlin.jvm.functions.Function0<? extends T> testCaseFactory, android.app.Activity activity);
+    method public static <T extends androidx.ui.test.ComposeTestCase> androidx.ui.test.ComposeBenchmarkScope<T> createAndroidComposeBenchmarkRunner(kotlin.jvm.functions.Function0<? extends T> testCaseFactory, androidx.activity.ComponentActivity activity);
   }
 
   public final class AndroidComposeTestCaseSetup implements androidx.ui.test.ComposeTestCaseSetup {
-    ctor public AndroidComposeTestCaseSetup(androidx.ui.test.ComposeTestRule testRule, androidx.ui.test.ComposeTestCase testCase, android.app.Activity activity);
+    ctor public AndroidComposeTestCaseSetup(androidx.ui.test.ComposeTestCase testCase, androidx.activity.ComponentActivity activity);
     method public void performTestWithEventsControl(kotlin.jvm.functions.Function1<? super androidx.ui.test.ComposeExecutionControl,kotlin.Unit> block);
   }
 
-  public final class AndroidComposeTestRule<T extends android.app.Activity> implements androidx.ui.test.ComposeTestRule {
+  public final class AndroidComposeTestRule<T extends androidx.activity.ComponentActivity> implements androidx.ui.test.ComposeTestRule {
     ctor public AndroidComposeTestRule(Class<T> activityClass, boolean disableTransitions);
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description? description);
     method @RequiresApi(android.os.Build.VERSION_CODES.O) public android.graphics.Bitmap captureScreenOnIdle();
@@ -295,8 +291,6 @@
     method public androidx.ui.test.AnimationClockTestRule getClockTestRule();
     method public androidx.ui.unit.Density getDensity();
     method public android.util.DisplayMetrics getDisplayMetrics();
-    method public <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
-    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
     method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
     property public final androidx.test.rule.ActivityTestRule<T> activityTestRule;
     property public androidx.ui.test.AnimationClockTestRule clockTestRule;
@@ -310,7 +304,7 @@
   }
 
   public final class AndroidComposeTestRuleKt {
-    method public static inline <reified T extends android.app.Activity> androidx.ui.test.android.AndroidComposeTestRule<T> AndroidComposeTestRule(boolean disableTransitions = false);
+    method public static inline <reified T extends androidx.activity.ComponentActivity> androidx.ui.test.android.AndroidComposeTestRule<T> AndroidComposeTestRule(boolean disableTransitions = false);
   }
 
   public final class ComposeIdlingResourceKt {
diff --git a/ui/ui-test/api/restricted_0.1.0-dev09.txt b/ui/ui-test/api/restricted_0.1.0-dev09.txt
index dcef6b4..ef94ca5 100644
--- a/ui/ui-test/api/restricted_0.1.0-dev09.txt
+++ b/ui/ui-test/api/restricted_0.1.0-dev09.txt
@@ -120,8 +120,6 @@
     method public androidx.ui.test.AnimationClockTestRule getClockTestRule();
     method public androidx.ui.unit.Density getDensity();
     method public android.util.DisplayMetrics getDisplayMetrics();
-    method public <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
-    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
     method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
     property public abstract androidx.ui.test.AnimationClockTestRule clockTestRule;
     property public abstract androidx.ui.unit.Density density;
@@ -208,10 +206,6 @@
     method public static androidx.ui.core.semantics.SemanticsConfiguration createFullSemantics(Boolean? isEnabled = null, String? value = null, androidx.ui.foundation.selection.ToggleableState? toggleableState = null, Boolean? inMutuallyExclusiveGroup = null, Boolean? isSelected = null);
   }
 
-  public final class LayoutCoordinatesHelperKt {
-    method public static androidx.ui.unit.PxPosition getPositionInParent(androidx.ui.core.LayoutCoordinates);
-  }
-
   public final class OutputKt {
     method public static String dumpToString(androidx.ui.test.SemanticsNodeInteraction);
     method public static String dumpToString(java.util.Collection<androidx.ui.test.SemanticsNodeInteraction>);
@@ -260,6 +254,8 @@
   }
 
   public final class SynchronizationKt {
+    method public static <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
+    method public static <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
   }
 
   public interface TestAnimationClock extends androidx.animation.AnimationClockObservable {
@@ -277,15 +273,15 @@
 package androidx.ui.test.android {
 
   public final class AndroidComposeTestCaseRunnerKt {
-    method public static <T extends androidx.ui.test.ComposeTestCase> androidx.ui.test.ComposeBenchmarkScope<T> createAndroidComposeBenchmarkRunner(kotlin.jvm.functions.Function0<? extends T> testCaseFactory, android.app.Activity activity);
+    method public static <T extends androidx.ui.test.ComposeTestCase> androidx.ui.test.ComposeBenchmarkScope<T> createAndroidComposeBenchmarkRunner(kotlin.jvm.functions.Function0<? extends T> testCaseFactory, androidx.activity.ComponentActivity activity);
   }
 
   public final class AndroidComposeTestCaseSetup implements androidx.ui.test.ComposeTestCaseSetup {
-    ctor public AndroidComposeTestCaseSetup(androidx.ui.test.ComposeTestRule testRule, androidx.ui.test.ComposeTestCase testCase, android.app.Activity activity);
+    ctor public AndroidComposeTestCaseSetup(androidx.ui.test.ComposeTestCase testCase, androidx.activity.ComponentActivity activity);
     method public void performTestWithEventsControl(kotlin.jvm.functions.Function1<? super androidx.ui.test.ComposeExecutionControl,kotlin.Unit> block);
   }
 
-  public final class AndroidComposeTestRule<T extends android.app.Activity> implements androidx.ui.test.ComposeTestRule {
+  public final class AndroidComposeTestRule<T extends androidx.activity.ComponentActivity> implements androidx.ui.test.ComposeTestRule {
     ctor public AndroidComposeTestRule(Class<T> activityClass, boolean disableTransitions);
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description? description);
     method @RequiresApi(android.os.Build.VERSION_CODES.O) public android.graphics.Bitmap captureScreenOnIdle();
@@ -295,8 +291,6 @@
     method public androidx.ui.test.AnimationClockTestRule getClockTestRule();
     method public androidx.ui.unit.Density getDensity();
     method public android.util.DisplayMetrics getDisplayMetrics();
-    method public <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
-    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
     method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
     property public final androidx.test.rule.ActivityTestRule<T> activityTestRule;
     property public androidx.ui.test.AnimationClockTestRule clockTestRule;
@@ -310,7 +304,7 @@
   }
 
   public final class AndroidComposeTestRuleKt {
-    method public static inline <reified T extends android.app.Activity> androidx.ui.test.android.AndroidComposeTestRule<T> AndroidComposeTestRule(boolean disableTransitions = false);
+    method public static inline <reified T extends androidx.activity.ComponentActivity> androidx.ui.test.android.AndroidComposeTestRule<T> AndroidComposeTestRule(boolean disableTransitions = false);
   }
 
   public final class ComposeIdlingResourceKt {
diff --git a/ui/ui-test/api/restricted_current.txt b/ui/ui-test/api/restricted_current.txt
index dcef6b4..ef94ca5 100644
--- a/ui/ui-test/api/restricted_current.txt
+++ b/ui/ui-test/api/restricted_current.txt
@@ -120,8 +120,6 @@
     method public androidx.ui.test.AnimationClockTestRule getClockTestRule();
     method public androidx.ui.unit.Density getDensity();
     method public android.util.DisplayMetrics getDisplayMetrics();
-    method public <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
-    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
     method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
     property public abstract androidx.ui.test.AnimationClockTestRule clockTestRule;
     property public abstract androidx.ui.unit.Density density;
@@ -208,10 +206,6 @@
     method public static androidx.ui.core.semantics.SemanticsConfiguration createFullSemantics(Boolean? isEnabled = null, String? value = null, androidx.ui.foundation.selection.ToggleableState? toggleableState = null, Boolean? inMutuallyExclusiveGroup = null, Boolean? isSelected = null);
   }
 
-  public final class LayoutCoordinatesHelperKt {
-    method public static androidx.ui.unit.PxPosition getPositionInParent(androidx.ui.core.LayoutCoordinates);
-  }
-
   public final class OutputKt {
     method public static String dumpToString(androidx.ui.test.SemanticsNodeInteraction);
     method public static String dumpToString(java.util.Collection<androidx.ui.test.SemanticsNodeInteraction>);
@@ -260,6 +254,8 @@
   }
 
   public final class SynchronizationKt {
+    method public static <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
+    method public static <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
   }
 
   public interface TestAnimationClock extends androidx.animation.AnimationClockObservable {
@@ -277,15 +273,15 @@
 package androidx.ui.test.android {
 
   public final class AndroidComposeTestCaseRunnerKt {
-    method public static <T extends androidx.ui.test.ComposeTestCase> androidx.ui.test.ComposeBenchmarkScope<T> createAndroidComposeBenchmarkRunner(kotlin.jvm.functions.Function0<? extends T> testCaseFactory, android.app.Activity activity);
+    method public static <T extends androidx.ui.test.ComposeTestCase> androidx.ui.test.ComposeBenchmarkScope<T> createAndroidComposeBenchmarkRunner(kotlin.jvm.functions.Function0<? extends T> testCaseFactory, androidx.activity.ComponentActivity activity);
   }
 
   public final class AndroidComposeTestCaseSetup implements androidx.ui.test.ComposeTestCaseSetup {
-    ctor public AndroidComposeTestCaseSetup(androidx.ui.test.ComposeTestRule testRule, androidx.ui.test.ComposeTestCase testCase, android.app.Activity activity);
+    ctor public AndroidComposeTestCaseSetup(androidx.ui.test.ComposeTestCase testCase, androidx.activity.ComponentActivity activity);
     method public void performTestWithEventsControl(kotlin.jvm.functions.Function1<? super androidx.ui.test.ComposeExecutionControl,kotlin.Unit> block);
   }
 
-  public final class AndroidComposeTestRule<T extends android.app.Activity> implements androidx.ui.test.ComposeTestRule {
+  public final class AndroidComposeTestRule<T extends androidx.activity.ComponentActivity> implements androidx.ui.test.ComposeTestRule {
     ctor public AndroidComposeTestRule(Class<T> activityClass, boolean disableTransitions);
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description? description);
     method @RequiresApi(android.os.Build.VERSION_CODES.O) public android.graphics.Bitmap captureScreenOnIdle();
@@ -295,8 +291,6 @@
     method public androidx.ui.test.AnimationClockTestRule getClockTestRule();
     method public androidx.ui.unit.Density getDensity();
     method public android.util.DisplayMetrics getDisplayMetrics();
-    method public <T> T! runOnIdleCompose(kotlin.jvm.functions.Function0<? extends T> action);
-    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
     method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
     property public final androidx.test.rule.ActivityTestRule<T> activityTestRule;
     property public androidx.ui.test.AnimationClockTestRule clockTestRule;
@@ -310,7 +304,7 @@
   }
 
   public final class AndroidComposeTestRuleKt {
-    method public static inline <reified T extends android.app.Activity> androidx.ui.test.android.AndroidComposeTestRule<T> AndroidComposeTestRule(boolean disableTransitions = false);
+    method public static inline <reified T extends androidx.activity.ComponentActivity> androidx.ui.test.android.AndroidComposeTestRule<T> AndroidComposeTestRule(boolean disableTransitions = false);
   }
 
   public final class ComposeIdlingResourceKt {
diff --git a/ui/ui-test/build.gradle b/ui/ui-test/build.gradle
index 8c07a6d..027cb85 100644
--- a/ui/ui-test/build.gradle
+++ b/ui/ui-test/build.gradle
@@ -31,6 +31,8 @@
 dependencies {
     kotlinPlugin project(path: ":compose:compose-compiler")
 
+    api "androidx.activity:activity:1.2.0-alpha02"
+
     implementation(KOTLIN_STDLIB)
     implementation(ANDROIDX_TEST_RULES)
     implementation(ANDROIDX_TEST_RUNNER)
@@ -46,6 +48,8 @@
     implementation project(":ui:ui-platform")
     implementation project(":ui:ui-util")
     implementation project(":ui:ui-saved-instance-state")
+    implementation "androidx.activity:activity:1.2.0-alpha02"
+    implementation "androidx.lifecycle:lifecycle-runtime:2.3.0-alpha01"
 
     testImplementation(TRUTH)
 
diff --git a/ui/ui-test/src/androidTest/AndroidManifest.xml b/ui/ui-test/src/androidTest/AndroidManifest.xml
index 7d6f531..86cb9d3 100644
--- a/ui/ui-test/src/androidTest/AndroidManifest.xml
+++ b/ui/ui-test/src/androidTest/AndroidManifest.xml
@@ -17,6 +17,8 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="androidx.ui.test.test">
     <application>
+        <activity android:name="androidx.activity.ComponentActivity"
+            android:theme="@style/TestTheme"/>
         <activity android:name="androidx.ui.test.CustomActivity"
             android:theme="@android:style/Theme.Material.NoActionBar.Fullscreen"/>
         <activity android:name="androidx.ui.test.ActivityWithActionBar" />
@@ -24,5 +26,7 @@
         <activity android:name="androidx.ui.test.MultipleActivitiesFindTest$Activity2" />
         <activity android:name="androidx.ui.test.MultipleActivitiesClickTest$Activity1" />
         <activity android:name="androidx.ui.test.MultipleActivitiesClickTest$Activity2" />
+        <activity android:name="androidx.ui.test.MultipleActivitiesFirstDrawTest$Activity1" />
+        <activity android:name="androidx.ui.test.MultipleActivitiesFirstDrawTest$Activity2" />
     </application>
 </manifest>
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/AnimationSynchronizationTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/AnimationSynchronizationTest.kt
index 8c1a749..e68065c 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/AnimationSynchronizationTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/AnimationSynchronizationTest.kt
@@ -27,7 +27,6 @@
 import androidx.compose.remember
 import androidx.test.espresso.Espresso.onIdle
 import androidx.test.filters.LargeTest
-import androidx.test.filters.MediumTest
 import androidx.ui.animation.Transition
 import androidx.ui.core.Modifier
 import androidx.ui.foundation.Box
@@ -39,7 +38,6 @@
 import androidx.ui.layout.fillMaxSize
 import androidx.ui.test.android.ComposeIdlingResource
 import com.google.common.truth.Truth.assertThat
-import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 
@@ -60,17 +58,16 @@
 
     @get:Rule
     val composeTestRule = createComposeRule()
-    private val clockTestRule = composeTestRule.clockTestRule
 
     /**
-     * High level test to only verify that [ComposeTestRule.runOnIdleCompose] awaits animations.
+     * High level test to only verify that [runOnIdleCompose] awaits animations.
      */
     @Test
     fun testRunOnIdleCompose() {
         val animationState = mutableStateOf(AnimationStates.From)
         composeTestRule.setContent { Ui(animationState) }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             // Kick off the animation
             animationRunning = true
             animationState.value = AnimationStates.To
@@ -79,7 +76,7 @@
         // Verify that animation is kicked off
         assertThat(animationRunning).isTrue()
         // Wait until it is finished
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             // Verify it was finished
             assertThat(animationRunning).isFalse()
         }
@@ -93,7 +90,7 @@
         val animationState = mutableStateOf(AnimationStates.From)
         composeTestRule.setContent { Ui(animationState) }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             // Kick off the animation
             animationRunning = true
             animationState.value = AnimationStates.To
@@ -121,7 +118,7 @@
         val animationState = mutableStateOf(AnimationStates.From)
         composeTestRule.setContent { Ui(animationState) }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             // Record idleness after this frame is committed. The mutation we're about to make
             // will trigger a commit of the frame, which is posted at the front of the handler's
             // queue. By posting a message at the front of the queue here, it will be executed
@@ -165,85 +162,6 @@
         assertThat(wasIdleAfterRecompose).isFalse()
     }
 
-    /**
-     * Tests if advancing the clock manually works when the clock is paused, and that idleness is
-     * reported correctly when doing that.
-     */
-    @Test
-    @MediumTest
-    fun testAnimation_manuallyAdvanceClock_paused() {
-        clockTestRule.pauseClock()
-
-        val animationState = mutableStateOf(AnimationStates.From)
-        composeTestRule.setContent { Ui(animationState) }
-
-        composeTestRule.runOnIdleCompose {
-            recordedAnimatedValues.clear()
-
-            // Kick off the animation
-            animationRunning = true
-            animationState.value = AnimationStates.To
-
-            // Changes need to trickle down the animation system, so compose should be non-idle
-            assertThat(ComposeIdlingResource.isIdle()).isFalse()
-        }
-
-        // Await recomposition
-        onIdle()
-
-        // Did one recomposition, but no animation frames
-        assertThat(recordedAnimatedValues).isEqualTo(listOf(0f))
-
-        // Animation doesn't actually start until the next frame.
-        // Advance by 0ms to force dispatching of a frame time.
-        composeTestRule.runOnIdleCompose {
-            // Advance clock on main thread so we can assert Compose is not idle afterwards
-            clockTestRule.advanceClock(0)
-            assertThat(ComposeIdlingResource.isIdle()).isFalse()
-        }
-
-        // Await start animation frame
-        onIdle()
-
-        // Did start animation frame
-        assertThat(recordedAnimatedValues).isEqualTo(listOf(0f, 0f))
-
-        // Advance first half of the animation (.5 sec)
-        composeTestRule.runOnIdleCompose {
-            clockTestRule.advanceClock(500)
-            assertThat(ComposeIdlingResource.isIdle()).isFalse()
-        }
-
-        // Await next animation frame
-        onIdle()
-
-        // Did one animation frame
-        assertThat(recordedAnimatedValues).isEqualTo(listOf(0f, 0f, 25f))
-
-        // Advance second half of the animation (.5 sec)
-        composeTestRule.runOnIdleCompose {
-            clockTestRule.advanceClock(500)
-            assertThat(ComposeIdlingResource.isIdle()).isFalse()
-        }
-
-        // Await next animation frame
-        onIdle()
-
-        // Did last animation frame
-        assertThat(recordedAnimatedValues).isEqualTo(listOf(0f, 0f, 25f, 50f))
-    }
-
-    /**
-     * Tests if advancing the clock manually works when the clock is resumed, and that idleness
-     * is reported correctly when doing that.
-     */
-    @Test
-    @MediumTest
-    @Ignore("b/150357516: not yet implemented")
-    fun testAnimation_manuallyAdvanceClock_resumed() {
-        // TODO(b/150357516): Test advancing the clock while it is resumed
-    }
-
     private fun Handler.pollUntil(condition: () -> Boolean, onDone: () -> Unit) {
         object : Runnable {
             override fun run() {
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/CustomActivityTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/CustomActivityTest.kt
index 82237df..e789401 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/CustomActivityTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/CustomActivityTest.kt
@@ -16,8 +16,8 @@
 
 package androidx.ui.test
 
-import android.app.Activity
 import android.os.Bundle
+import androidx.activity.ComponentActivity
 import androidx.test.filters.MediumTest
 import androidx.ui.core.setContent
 import androidx.ui.foundation.Text
@@ -30,7 +30,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 
-class CustomActivity : Activity() {
+class CustomActivity : ComponentActivity() {
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/FirstDrawTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/FirstDrawTest.kt
new file mode 100644
index 0000000..72368a2
--- /dev/null
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/FirstDrawTest.kt
@@ -0,0 +1,101 @@
+/*
+ * 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.ui.test
+
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import androidx.activity.ComponentActivity
+import androidx.test.espresso.Espresso.onIdle
+import androidx.test.filters.MediumTest
+import androidx.ui.core.Modifier
+import androidx.ui.core.setContent
+import androidx.ui.foundation.Box
+import androidx.ui.foundation.Canvas
+import androidx.ui.graphics.Color
+import androidx.ui.test.android.AndroidComposeTestRule
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+
+@MediumTest
+class FirstDrawTest {
+
+    @get:Rule
+    val testRule = AndroidComposeTestRule(ComponentActivity::class.java)
+
+    /**
+     * Tests that the compose tree has been drawn at least once when [onIdle] finishes.
+     */
+    @Test
+    fun waitsForFirstDraw() {
+        var drawn = false
+        testRule.setContent {
+            Canvas(Modifier) {
+                drawn = true
+            }
+        }
+        onIdle()
+        assertThat(drawn).isTrue()
+    }
+
+    /**
+     * Tests that [onIdle] doesn't timeout when the compose tree is completely off-screen and
+     * will hence not be drawn.
+     */
+    @Test
+    fun waitsForOutOfBoundsComposeView() {
+        var drawn = false
+
+        val activity = testRule.activityTestRule.activity
+        activity.runOnUiThread {
+
+            // Set the compose content in a FrameLayout that is completely placed out of the
+            // screen, and enforce clipToPadding in case clipping will prevent the clipped
+            // content from being drawn.
+
+            val root = object : FrameLayout(activity) {
+                override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
+                    // Place our child out of bounds
+                    getChildAt(0).layout(-200, 0, -100, 100)
+                }
+            }.apply {
+                // Enforce clipping:
+                setPadding(1, 1, 1, 1)
+                clipToPadding = true
+            }
+
+            val outOfBoundsView = FrameLayout(activity).apply {
+                layoutParams = ViewGroup.MarginLayoutParams(100, 100)
+            }
+
+            root.addView(outOfBoundsView)
+            activity.setContentView(root)
+            outOfBoundsView.setContent {
+                // If you see this box when running the test, the test is setup incorrectly
+                Box(Modifier, backgroundColor = Color.Yellow)
+                Canvas(Modifier) {
+                    drawn = true
+                }
+            }
+        }
+
+        // onIdle shouldn't timeout
+        onIdle()
+        // The compose view was off-screen, so it hasn't drawn yet
+        assertThat(drawn).isFalse()
+    }
+}
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/IsDisplayedTests.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/IsDisplayedTests.kt
index 166fbec..31fbe9c 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/IsDisplayedTests.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/IsDisplayedTests.kt
@@ -110,13 +110,8 @@
             }
 
             val thirdNode = @Composable {
-                Layout({
+                Stack {
                     lastNode()
-                }) { measurables, constraints, _ ->
-                    val placeable = measurables[0].measure(constraints)
-                    layout(0.ipx, 0.ipx) {
-                        placeable.place(0.ipx, 0.ipx)
-                    }
                 }
             }
 
@@ -126,7 +121,7 @@
                 }) { measurables, constraints, _ ->
                     if (model.value) {
                         val placeable = measurables[0].measure(constraints)
-                        layout(0.ipx, 0.ipx) {
+                        layout(placeable.width, placeable.height) {
                             placeable.place(0.ipx, 0.ipx)
                         }
                     } else {
@@ -141,7 +136,7 @@
                 }) { measurables, constraints, _ ->
                     if (model.value) {
                         val placeable = measurables[0].measure(constraints)
-                        layout(0.ipx, 0.ipx) {
+                        layout(placeable.width, placeable.height) {
                             placeable.place(0.ipx, 0.ipx)
                         }
                     } else {
@@ -157,7 +152,7 @@
         findByText("Foo")
             .assertIsDisplayed()
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             model.value = false
         }
 
@@ -217,14 +212,14 @@
             }
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             Assert.assertTrue(!wasScrollToCalled)
         }
 
         findByTag(tag)
             .doScrollTo()
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             Assert.assertTrue(wasScrollToCalled)
         }
     }
@@ -272,7 +267,7 @@
             }
         }
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(currentScrollPositionY).isEqualTo(0.px)
             assertThat(currentScrollPositionX).isEqualTo(0.px)
         }
@@ -280,7 +275,7 @@
         findByTag(tag)
             .doScrollTo() // scroll to third element
 
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             val expected = elementHeight * 2
             assertThat(currentScrollPositionY).isEqualTo(expected)
             assertThat(currentScrollPositionX).isEqualTo(0.px)
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/MultipleActivitiesClickTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/MultipleActivitiesClickTest.kt
index 5e62bb0..7c39e18 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/MultipleActivitiesClickTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/MultipleActivitiesClickTest.kt
@@ -19,6 +19,7 @@
 import android.app.Activity
 import android.content.Intent
 import android.os.Bundle
+import androidx.activity.ComponentActivity
 import androidx.test.runner.lifecycle.ActivityLifecycleMonitorRegistry
 import androidx.test.runner.lifecycle.Stage
 import androidx.ui.core.setContent
@@ -52,7 +53,7 @@
     // instrumentation we use in our test setup supports this though, so it is safe to do here.
     private fun getCurrentActivity(): Activity {
         var currentActivity: Activity? = null
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             currentActivity = ActivityLifecycleMonitorRegistry.getInstance()
                 .getActivitiesInStage(Stage.RESUMED).first()
         }
@@ -62,7 +63,7 @@
     class Activity1 : ClickRecordingActivity("activity1")
     class Activity2 : ClickRecordingActivity("activity2")
 
-    open class ClickRecordingActivity(private val tag: String) : Activity() {
+    open class ClickRecordingActivity(private val tag: String) : ComponentActivity() {
         val recorder = PointerInputRecorder()
 
         override fun onCreate(savedInstanceState: Bundle?) {
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/MultipleActivitiesFindTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/MultipleActivitiesFindTest.kt
index 1348b24..58ec765 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/MultipleActivitiesFindTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/MultipleActivitiesFindTest.kt
@@ -16,9 +16,9 @@
 
 package androidx.ui.test
 
-import android.app.Activity
 import android.content.Intent
 import android.os.Bundle
+import androidx.activity.ComponentActivity
 import androidx.ui.core.Modifier
 import androidx.ui.core.setContent
 import androidx.ui.foundation.Box
@@ -43,12 +43,12 @@
     class Activity1 : TaggedActivity("activity1")
     class Activity2 : TaggedActivity("activity2")
 
-    open class TaggedActivity(private val tag: String) : Activity() {
+    open class TaggedActivity(private val tag: String) : ComponentActivity() {
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
             setContent {
                 Semantics(container = true, properties = { testTag = tag }) {
-                    Box(Modifier.None)
+                    Box(Modifier)
                 }
             }
         }
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/MultipleActivitiesFirstDrawTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/MultipleActivitiesFirstDrawTest.kt
new file mode 100644
index 0000000..0f9e155
--- /dev/null
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/MultipleActivitiesFirstDrawTest.kt
@@ -0,0 +1,57 @@
+/*
+ * 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.ui.test
+
+import android.content.Intent
+import android.os.Bundle
+import androidx.activity.ComponentActivity
+import androidx.test.espresso.Espresso
+import androidx.test.filters.MediumTest
+import androidx.ui.core.Modifier
+import androidx.ui.core.setContent
+import androidx.ui.foundation.Box
+import androidx.ui.test.android.AndroidComposeTestRule
+import org.junit.Rule
+import org.junit.Test
+
+@MediumTest
+class MultipleActivitiesFirstDrawTest {
+
+    @get:Rule
+    val testRule = AndroidComposeTestRule(Activity1::class.java)
+
+    @Test
+    fun test() {
+        Espresso.onIdle()
+        // doesn't timeout
+    }
+
+    class Activity1 : ComponentActivity() {
+        override fun onCreate(savedInstanceState: Bundle?) {
+            super.onCreate(savedInstanceState)
+            setContent { Box(Modifier) }
+            startActivity(Intent(this, Activity2::class.java))
+        }
+    }
+
+    class Activity2 : ComponentActivity() {
+        override fun onCreate(savedInstanceState: Bundle?) {
+            super.onCreate(savedInstanceState)
+            setContent { Box(Modifier) }
+        }
+    }
+}
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/MultipleComposeRootsTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/MultipleComposeRootsTest.kt
index 5e62cc9..5f6c8d2 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/MultipleComposeRootsTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/MultipleComposeRootsTest.kt
@@ -16,10 +16,10 @@
 
 package androidx.ui.test
 
-import android.app.Activity
 import android.widget.FrameLayout
 import android.widget.LinearLayout
 import android.widget.TextView
+import androidx.activity.ComponentActivity
 import androidx.compose.Model
 import androidx.test.espresso.Espresso
 import androidx.test.espresso.assertion.ViewAssertions.matches
@@ -60,7 +60,7 @@
 class MultipleComposeRootsTest {
 
     @get:Rule
-    val activityTestRule = ActivityTestRule<Activity>(Activity::class.java)
+    val activityTestRule = ActivityTestRule<ComponentActivity>(ComponentActivity::class.java)
 
     @get:Rule
     val disableTransitions = DisableTransitions()
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/SendClickTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/SendClickTest.kt
index e06a6a0..825e6de 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/SendClickTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/SendClickTest.kt
@@ -16,10 +16,10 @@
 
 package androidx.ui.test
 
-import android.app.Activity
 import android.os.Bundle
 import android.view.Gravity
 import android.widget.FrameLayout
+import androidx.activity.ComponentActivity
 import androidx.compose.Composable
 import androidx.compose.Composition
 import androidx.test.filters.MediumTest
@@ -60,7 +60,7 @@
 )
 
 // The presence of an ActionBar follows from the theme set in AndroidManifest.xml
-class ActivityWithActionBar : Activity() {
+class ActivityWithActionBar : ComponentActivity() {
     private lateinit var composeHolder: FrameLayout
     private var composition: Composition? = null
 
@@ -88,7 +88,7 @@
     }
 }
 
-private fun <T : Activity> AndroidComposeTestRule<T>.setContent(
+private fun <T : ComponentActivity> AndroidComposeTestRule<T>.setContent(
     recordedClicks: MutableList<ClickData>
 ) {
     val activity = activityTestRule.activity
@@ -147,14 +147,14 @@
 @RunWith(Parameterized::class)
 class SendClickWithoutArgumentsTest(config: TestConfig) {
     data class TestConfig(
-        val activityClass: Class<out Activity>
+        val activityClass: Class<out ComponentActivity>
     )
 
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
         fun createTestSet(): List<TestConfig> = listOf(
-            TestConfig(Activity::class.java),
+            TestConfig(ComponentActivity::class.java),
             TestConfig(ActivityWithActionBar::class.java)
         )
     }
@@ -173,7 +173,7 @@
         findByTag("${tag}$last").doGesture { sendClick() }
 
         // Then each component has registered a click
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(recordedClicks).isEqualTo(
                 listOf(
                     ClickData(first, center),
@@ -189,7 +189,7 @@
 class SendClickWithArgumentsTest(private val config: TestConfig) {
     data class TestConfig(
         val position: PxPosition,
-        val activityClass: Class<out Activity>
+        val activityClass: Class<out ComponentActivity>
     )
 
     companion object {
@@ -199,7 +199,7 @@
             return mutableListOf<TestConfig>().apply {
                 for (x in listOf(0.px, squareSize - 1.px)) {
                     for (y in listOf(0.px, squareSize - 1.px)) {
-                        add(TestConfig(PxPosition(x, y), Activity::class.java))
+                        add(TestConfig(PxPosition(x, y), ComponentActivity::class.java))
                         add(TestConfig(PxPosition(x, y), ActivityWithActionBar::class.java))
                     }
                 }
@@ -221,7 +221,7 @@
         findByTag("${tag}$last").doGesture { sendClick(config.position) }
 
         // Then each component has registered a click
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(recordedClicks).isEqualTo(
                 listOf(
                     ClickData(first, config.position),
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/SendDoubleClickTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/SendDoubleClickTest.kt
index b2ca650..b356638 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/SendDoubleClickTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/SendDoubleClickTest.kt
@@ -19,8 +19,9 @@
 import androidx.compose.Composable
 import androidx.test.filters.MediumTest
 import androidx.ui.core.DensityAmbient
+import androidx.ui.core.Modifier
 import androidx.ui.core.TestTag
-import androidx.ui.core.gesture.DoubleTapGestureDetector
+import androidx.ui.core.gesture.doubleTapGestureFilter
 import androidx.ui.core.pointerinput.PointerInputModifier
 import androidx.ui.foundation.Box
 import androidx.ui.graphics.Color
@@ -54,7 +55,7 @@
             Semantics(container = true) {
                 with(DensityAmbient.current) {
                     Box(
-                        DoubleTapGestureDetector(onDoubleTap)
+                        Modifier.doubleTapGestureFilter(onDoubleTap)
                             .plus(pointerInputRecorder)
                             .preferredSize(width.toDp(), height.toDp()),
                         backgroundColor = Color.Yellow
@@ -95,7 +96,7 @@
         // When we inject a double click
         findByTag(tag).doGesture { sendDoubleClick() }
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             // Then we record 1 double click
             assertThat(recordedDoubleClicks).hasSize(1)
             // at the expected position
@@ -170,7 +171,7 @@
         // When we inject a double click
         findByTag(tag).doGesture { sendDoubleClick(config.position) }
 
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             // Then we record 1 double click
             assertThat(recordedDoubleClicks).hasSize(1)
             // at the expected position
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/SendLongClickTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/SendLongClickTest.kt
index 2c5f152..e7b21a7 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/SendLongClickTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/SendLongClickTest.kt
@@ -22,7 +22,7 @@
 import androidx.ui.core.DensityAmbient
 import androidx.ui.core.Modifier
 import androidx.ui.core.TestTag
-import androidx.ui.core.gesture.LongPressGestureDetector
+import androidx.ui.core.gesture.longPressGestureFilter
 import androidx.ui.core.gesture.LongPressTimeout
 import androidx.ui.foundation.Box
 import androidx.ui.graphics.Color
@@ -58,7 +58,7 @@
             Semantics(container = true) {
                 with(DensityAmbient.current) {
                     Box(
-                        LongPressGestureDetector(onLongPress)
+                        Modifier.longPressGestureFilter(onLongPress)
                             .plus(recorder)
                             .preferredSize(width.toDp(), height.toDp()),
                         backgroundColor = Color.Yellow
@@ -101,7 +101,7 @@
         assertThat(recordedLongClicks).hasSize(1)
 
         // And all events are at the click location
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             recorder.run {
                 assertTimestampsAreIncreasing()
                 assertOnlyLastEventIsUp()
@@ -160,7 +160,7 @@
         assertThat(recordedLongClicks).hasSize(1)
 
         // And all events are at the click location
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             recorder.run {
                 assertTimestampsAreIncreasing()
                 assertOnlyLastEventIsUp()
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/SendSwipeTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/SendSwipeTest.kt
index ef6a79b..8bdb5e9 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/SendSwipeTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/SendSwipeTest.kt
@@ -72,7 +72,7 @@
     fun swipeUp() {
         composeTestRule.setContent { Ui(Modifier.wrapContentSize(Alignment.TopStart)) }
         findByTag(tag).doGesture { sendSwipeUp() }
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             recorder.run {
                 assertTimestampsAreIncreasing()
                 assertOnlyLastEventIsUp()
@@ -85,7 +85,7 @@
     fun swipeDown() {
         composeTestRule.setContent { Ui(Modifier.wrapContentSize(Alignment.TopEnd)) }
         findByTag(tag).doGesture { sendSwipeDown() }
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             recorder.run {
                 assertTimestampsAreIncreasing()
                 assertOnlyLastEventIsUp()
@@ -98,7 +98,7 @@
     fun swipeLeft() {
         composeTestRule.setContent { Ui(Modifier.wrapContentSize(Alignment.BottomEnd)) }
         findByTag(tag).doGesture { sendSwipeLeft() }
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             recorder.run {
                 assertTimestampsAreIncreasing()
                 assertOnlyLastEventIsUp()
@@ -111,7 +111,7 @@
     fun swipeRight() {
         composeTestRule.setContent { Ui(Modifier.wrapContentSize(Alignment.BottomStart)) }
         findByTag(tag).doGesture { sendSwipeRight() }
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             recorder.run {
                 assertTimestampsAreIncreasing()
                 assertOnlyLastEventIsUp()
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/SendSwipeVelocityTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/SendSwipeVelocityTest.kt
index f96ac05..7836d19 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/SendSwipeVelocityTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/SendSwipeVelocityTest.kt
@@ -167,7 +167,7 @@
     fun swipeWithVelocity() {
         composeTestRule.setContent { Ui() }
         findByTag(tag).doGesture { sendSwipeWithVelocity(start, end, velocity, duration) }
-        composeTestRule.runOnUiThread {
+        runOnUiThread {
             recorder.run {
                 val durationMs = duration.inMilliseconds()
                 val minimumEventSize = max(2, (durationMs / eventPeriod).toInt())
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/SynchronizationMethodsTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/SynchronizationMethodsTest.kt
index 2775031..a2c7d34 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/SynchronizationMethodsTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/SynchronizationMethodsTest.kt
@@ -28,7 +28,7 @@
 
     @Test
     fun runOnUiThread() {
-        val result = runOnUiThreadInternal { "Hello" }
+        val result = runOnUiThread { "Hello" }
         assertThat(result).isEqualTo("Hello")
     }
 
@@ -36,19 +36,19 @@
     fun runOnUiThread_void() {
         var called = false
 
-        runOnUiThreadInternal { called = true }
+        runOnUiThread { called = true }
         assertThat(called).isTrue()
     }
 
     @Test
     fun runOnUiThread_nullable() {
-        val result: String? = runOnUiThreadInternal { null }
+        val result: String? = runOnUiThread { null }
         assertThat(result).isEqualTo(null)
     }
 
     @Test
     fun runOnIdleCompose() {
-        val result = runOnIdleComposeInternal { "Hello" }
+        val result = runOnIdleCompose { "Hello" }
         assertThat(result).isEqualTo("Hello")
     }
 
@@ -56,13 +56,13 @@
     fun runOnIdleCompose_void() {
         var called = false
 
-        runOnIdleComposeInternal { called = true }
+        runOnIdleCompose { called = true }
         assertThat(called).isTrue()
     }
 
     @Test
     fun runOnIdleCompose_nullable() {
-        val result: String? = runOnIdleComposeInternal { null }
+        val result: String? = runOnIdleCompose { null }
         assertThat(result).isEqualTo(null)
     }
 }
\ No newline at end of file
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/TestAnimationClockTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/TestAnimationClockTest.kt
new file mode 100644
index 0000000..53e20fd
--- /dev/null
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/TestAnimationClockTest.kt
@@ -0,0 +1,179 @@
+/*
+ * 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.ui.test
+
+import androidx.animation.FloatPropKey
+import androidx.animation.LinearEasing
+import androidx.animation.transitionDefinition
+import androidx.compose.Composable
+import androidx.compose.State
+import androidx.compose.mutableStateOf
+import androidx.compose.remember
+import androidx.test.espresso.Espresso.onIdle
+import androidx.test.filters.MediumTest
+import androidx.ui.animation.Transition
+import androidx.ui.core.Modifier
+import androidx.ui.foundation.Box
+import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.drawBackground
+import androidx.ui.geometry.Rect
+import androidx.ui.graphics.Color
+import androidx.ui.graphics.Paint
+import androidx.ui.layout.fillMaxSize
+import androidx.ui.test.android.ComposeIdlingResource
+import com.google.common.truth.Truth.assertThat
+import org.junit.Ignore
+import org.junit.Rule
+import org.junit.Test
+
+class TestAnimationClockTest {
+
+    private var animationRunning = false
+    private val recordedAnimatedValues = mutableListOf<Float>()
+    private var hasRecomposed = false
+
+    @get:Rule
+    val composeTestRule = createComposeRule()
+    private val clockTestRule = composeTestRule.clockTestRule
+
+    /**
+     * Tests if advancing the clock manually works when the clock is paused, and that idleness is
+     * reported correctly when doing that.
+     */
+    @Test
+    @MediumTest
+    fun testAnimation_manuallyAdvanceClock_paused_singleStep() {
+        clockTestRule.pauseClock()
+
+        val animationState = mutableStateOf(AnimationStates.From)
+        composeTestRule.setContent { Ui(animationState) }
+
+        runOnIdleCompose {
+            recordedAnimatedValues.clear()
+
+            // Kick off the animation
+            animationRunning = true
+            animationState.value = AnimationStates.To
+
+            // Changes need to trickle down the animation system, so compose should be non-idle
+            assertThat(ComposeIdlingResource.isIdle()).isFalse()
+        }
+
+        // Await recomposition
+        onIdle()
+
+        // Did one recomposition, but no animation frames
+        assertThat(recordedAnimatedValues).isEqualTo(listOf(0f))
+
+        // Animation doesn't actually start until the next frame.
+        // Advance by 0ms to force dispatching of a frame time.
+        runOnIdleCompose {
+            // Advance clock on main thread so we can assert Compose is not idle afterwards
+            clockTestRule.advanceClock(0)
+            assertThat(ComposeIdlingResource.isIdle()).isFalse()
+        }
+
+        // Await start animation frame
+        onIdle()
+
+        // Did start animation frame
+        assertThat(recordedAnimatedValues).isEqualTo(listOf(0f, 0f))
+
+        // Advance first half of the animation (.5 sec)
+        runOnIdleCompose {
+            clockTestRule.advanceClock(500)
+            assertThat(ComposeIdlingResource.isIdle()).isFalse()
+        }
+
+        // Await next animation frame
+        onIdle()
+
+        // Did one animation frame
+        assertThat(recordedAnimatedValues).isEqualTo(listOf(0f, 0f, 25f))
+
+        // Advance second half of the animation (.5 sec)
+        runOnIdleCompose {
+            clockTestRule.advanceClock(500)
+            assertThat(ComposeIdlingResource.isIdle()).isFalse()
+        }
+
+        // Await next animation frame
+        onIdle()
+
+        // Did last animation frame
+        assertThat(recordedAnimatedValues).isEqualTo(listOf(0f, 0f, 25f, 50f))
+    }
+
+    /**
+     * Tests if advancing the clock manually works when the clock is resumed, and that idleness
+     * is reported correctly when doing that.
+     */
+    @Test
+    @MediumTest
+    @Ignore("b/150357516: not yet implemented")
+    fun testAnimation_manuallyAdvanceClock_resumed_singleStep() {
+        // TODO(b/150357516): Test advancing the clock while it is resumed
+    }
+
+    @Composable
+    private fun Ui(animationState: State<AnimationStates>) {
+        val paint = remember { Paint().also { it.color = Color.Cyan } }
+        val rect = remember { Rect.fromLTWH(0f, 0f, 50f, 50f) }
+
+        hasRecomposed = true
+        Box(modifier = Modifier.drawBackground(Color.Yellow).fillMaxSize()) {
+            hasRecomposed = true
+            Transition(
+                definition = animationDefinition,
+                toState = animationState.value,
+                onStateChangeFinished = { animationRunning = false }
+            ) { state ->
+                hasRecomposed = true
+                Canvas(modifier = Modifier.fillMaxSize()) {
+                    val xValue = state[x]
+                    recordedAnimatedValues.add(xValue)
+                    drawRect(rect.translate(xValue, 0f), paint)
+                }
+            }
+        }
+    }
+
+    private val x = FloatPropKey()
+
+    private enum class AnimationStates {
+        From,
+        To
+    }
+
+    private val animationDefinition = transitionDefinition {
+        state(AnimationStates.From) {
+            this[x] = 0f
+        }
+        state(AnimationStates.To) {
+            this[x] = 50f
+        }
+        transition(AnimationStates.From to AnimationStates.To) {
+            x using tween {
+                easing = LinearEasing
+                duration = 1000L.toInt()
+            }
+        }
+        transition(AnimationStates.To to AnimationStates.From) {
+            x using snap()
+        }
+    }
+}
diff --git a/ui/ui-test/src/main/AndroidManifest.xml b/ui/ui-test/src/main/AndroidManifest.xml
index 0b23e10..4236581 100644
--- a/ui/ui-test/src/main/AndroidManifest.xml
+++ b/ui/ui-test/src/main/AndroidManifest.xml
@@ -18,7 +18,7 @@
 
     <application>
         <activity
-            android:name="android.app.Activity"
+            android:name="androidx.activity.ComponentActivity"
             android:theme="@style/TestTheme" />
     </application>
 </manifest>
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/Actions.kt b/ui/ui-test/src/main/java/androidx/ui/test/Actions.kt
index 27a6fd3..d4ec0cb 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/Actions.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/Actions.kt
@@ -16,8 +16,6 @@
 
 package androidx.ui.test
 
-import android.os.Handler
-import android.os.Looper
 import androidx.ui.core.findClosestParentNode
 import androidx.ui.core.findLastLayoutChild
 import androidx.ui.semantics.AccessibilityAction
@@ -25,9 +23,6 @@
 import androidx.ui.semantics.SemanticsPropertyKey
 import androidx.ui.unit.PxPosition
 import androidx.ui.unit.px
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
-import java.util.concurrent.TimeoutException
 
 /**
  * Performs a click action on the given component.
@@ -153,26 +148,3 @@
 ) {
     callSemanticsAction(key) { it.invoke() }
 }
-
-// TODO(pavlis): We could expose this to the developers to avoid their dependency on TestRules
-// After that we can build runOnIdleCompose on top of this and move that out of ComposeTestRule
-private fun runOnUiThread(action: () -> Unit) {
-    if (Looper.myLooper() == Looper.getMainLooper()) {
-        action.invoke()
-        return
-    }
-
-    val latch = CountDownLatch(1)
-    val handler = Handler(Looper.getMainLooper())
-    handler.post(object : Runnable {
-        override fun run() {
-            action.invoke()
-            latch.countDown()
-        }
-    })
-
-    val success = latch.await(1_000, TimeUnit.MILLISECONDS)
-    if (!success) {
-        throw TimeoutException("Timeout has occurred when waiting for an action to be performed.")
-    }
-}
\ No newline at end of file
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/BitmapHelpers.kt b/ui/ui-test/src/main/java/androidx/ui/test/BitmapHelpers.kt
index 7d2349a..355031f 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/BitmapHelpers.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/BitmapHelpers.kt
@@ -106,19 +106,12 @@
         }
     }
 
-    val pixels = IntArray(width * height)
-    getPixels(pixels, 0, width, 0, 0, width, height)
-
     for (x in 0 until width) {
         for (y in 0 until height) {
             val pxPos = IntPxPosition(x.ipx, y.ipx)
-            val color = Color(pixels[width * y + x])
             val expectedClr = expectedColorProvider(pxPos)
-            if (expectedClr != null && expectedClr != color) {
-                throw AssertionError(
-                    "Comparison failed for $pxPos: expected $expectedClr $ " +
-                            "but received $color"
-                )
+            if (expectedClr != null) {
+                assertPixelColor(expectedClr, x, y)
             }
         }
     }
@@ -135,10 +128,10 @@
 ) {
     val color = Color(getPixel(x, y))
     val errorString = error(color)
-    assertEquals(errorString, expected.red, color.red, 0.01f)
-    assertEquals(errorString, expected.green, color.green, 0.01f)
-    assertEquals(errorString, expected.blue, color.blue, 0.01f)
-    assertEquals(errorString, expected.alpha, color.alpha, 0.01f)
+    assertEquals(errorString, expected.red, color.red, 0.02f)
+    assertEquals(errorString, expected.green, color.green, 0.02f)
+    assertEquals(errorString, expected.blue, color.blue, 0.02f)
+    assertEquals(errorString, expected.alpha, color.alpha, 0.02f)
 }
 
 /**
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/ComposeTestRule.kt b/ui/ui-test/src/main/java/androidx/ui/test/ComposeTestRule.kt
index 986e02b..5ab95df 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/ComposeTestRule.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/ComposeTestRule.kt
@@ -16,10 +16,10 @@
 
 package androidx.ui.test
 
-import android.app.Activity
 import android.graphics.Bitmap
 import android.os.Build
 import android.util.DisplayMetrics
+import androidx.activity.ComponentActivity
 import androidx.annotation.RequiresApi
 import androidx.compose.Composable
 import androidx.ui.unit.Density
@@ -68,22 +68,6 @@
     fun forGivenTestCase(testCase: ComposeTestCase): ComposeTestCaseSetup
 
     /**
-     * Runs the given action on the UI thread.
-     *
-     * This method is blocking until the action is complete.
-     */
-    fun <T> runOnUiThread(action: () -> T): T
-
-    /**
-     * Executes the given action in the same way as [runOnUiThread] but also makes sure Compose
-     * is idle before executing it. This is great place for doing your assertions on shared
-     * variables.
-     *
-     * This method is blocking until the action is complete.
-     */
-    fun <T> runOnIdleCompose(action: () -> T): T
-
-    /**
      * Takes screenshot of the Activity's window after Compose UI gets idle.
      *
      * This function blocks until complete.
@@ -127,5 +111,5 @@
  * androidTest/AndroidManifest.xml).
  */
 fun createComposeRule(disableTransitions: Boolean = false): ComposeTestRule {
-    return AndroidComposeTestRule(Activity::class.java, disableTransitions)
+    return AndroidComposeTestRule(ComponentActivity::class.java, disableTransitions)
 }
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/StateRestorationTester.kt b/ui/ui-test/src/main/java/androidx/ui/test/StateRestorationTester.kt
index 69371db..a58cc8c 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/StateRestorationTester.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/StateRestorationTester.kt
@@ -67,13 +67,13 @@
         val registry = checkNotNull(registry) {
             "setContent should be called first!"
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             registry.saveStateAndDisposeChildren()
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             registry.emitChildrenWithRestoredState()
         }
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             // we just wait for the children to be emitted
         }
     }
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/Synchronization.kt b/ui/ui-test/src/main/java/androidx/ui/test/Synchronization.kt
index 2a067f8..71899c0 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/Synchronization.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/Synchronization.kt
@@ -16,6 +16,7 @@
 
 package androidx.ui.test
 
+import android.annotation.SuppressLint
 import android.os.Looper
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.ui.test.android.SynchronizedTreeCollector
@@ -27,7 +28,8 @@
  *
  * This method is blocking until the action is complete.
  */
-internal fun <T> runOnUiThreadInternal(action: () -> T): T {
+@SuppressLint("DocumentExceptions")
+fun <T> runOnUiThread(action: () -> T): T {
     if (Looper.myLooper() == Looper.getMainLooper()) {
         return action()
     }
@@ -49,9 +51,9 @@
  *
  * This method is blocking until the action is complete.
  */
-internal fun <T> runOnIdleComposeInternal(action: () -> T): T {
+fun <T> runOnIdleCompose(action: () -> T): T {
     // Method below make sure that compose is idle.
     SynchronizedTreeCollector.waitForIdle()
     // Execute the action on ui thread in a blocking way.
-    return runOnUiThreadInternal(action)
+    return runOnUiThread(action)
 }
\ No newline at end of file
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidComposeTestCaseRunner.kt b/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidComposeTestCaseRunner.kt
index a2c4cf8..619ddcd 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidComposeTestCaseRunner.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidComposeTestCaseRunner.kt
@@ -29,6 +29,7 @@
 import android.view.View
 import android.view.ViewGroup
 import android.widget.ImageView
+import androidx.activity.ComponentActivity
 import androidx.compose.Composition
 import androidx.compose.FrameManager
 import androidx.compose.Recomposer
@@ -48,14 +49,14 @@
  */
 fun <T : ComposeTestCase> createAndroidComposeBenchmarkRunner(
     testCaseFactory: () -> T,
-    activity: Activity
+    activity: ComponentActivity
 ): ComposeBenchmarkScope<T> {
     return AndroidComposeTestCaseRunner(testCaseFactory, activity)
 }
 
 internal class AndroidComposeTestCaseRunner<T : ComposeTestCase>(
     private val testCaseFactory: () -> T,
-    private val activity: Activity
+    private val activity: ComponentActivity
 ) : ComposeBenchmarkScope<T> {
 
     override val measuredWidth: Int
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidComposeTestCaseSetup.kt b/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidComposeTestCaseSetup.kt
index cadc7da..d2bbb1f 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidComposeTestCaseSetup.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidComposeTestCaseSetup.kt
@@ -16,20 +16,19 @@
 
 package androidx.ui.test.android
 
-import android.app.Activity
+import androidx.activity.ComponentActivity
 import androidx.ui.test.ComposeTestCase
 import androidx.ui.test.ComposeExecutionControl
 import androidx.ui.test.ComposeTestCaseSetup
-import androidx.ui.test.ComposeTestRule
+import androidx.ui.test.runOnUiThread
 import androidx.ui.test.setupContent
 
 class AndroidComposeTestCaseSetup(
-    private val testRule: ComposeTestRule,
     private val testCase: ComposeTestCase,
-    private val activity: Activity
+    private val activity: ComponentActivity
 ) : ComposeTestCaseSetup {
     override fun performTestWithEventsControl(block: ComposeExecutionControl.() -> Unit) {
-        testRule.runOnUiThread {
+        runOnUiThread {
             // TODO: Ensure that no composition exists at this stage!
             val runner = AndroidComposeTestCaseRunner({ testCase }, activity)
             var cause: Throwable? = null
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidComposeTestRule.kt b/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidComposeTestRule.kt
index 422951d..ca1b9ba 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidComposeTestRule.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidComposeTestRule.kt
@@ -16,27 +16,28 @@
 
 package androidx.ui.test.android
 
-import android.app.Activity
 import android.graphics.Bitmap
 import android.os.Build
 import android.os.Handler
 import android.os.Looper
 import android.util.DisplayMetrics
 import android.util.SparseArray
+import android.view.View
 import android.view.ViewGroup
 import android.view.ViewTreeObserver
+import androidx.activity.ComponentActivity
 import androidx.annotation.RequiresApi
 import androidx.compose.Composable
 import androidx.test.rule.ActivityTestRule
 import androidx.ui.animation.transitionsEnabled
+import androidx.ui.core.AndroidOwner
 import androidx.ui.core.setContent
 import androidx.ui.geometry.Rect
 import androidx.ui.test.AnimationClockTestRule
 import androidx.ui.test.ComposeTestCase
 import androidx.ui.test.ComposeTestCaseSetup
 import androidx.ui.test.ComposeTestRule
-import androidx.ui.test.runOnIdleComposeInternal
-import androidx.ui.test.runOnUiThreadInternal
+import androidx.ui.test.runOnUiThread
 import androidx.ui.unit.Density
 import org.junit.runner.Description
 import org.junit.runners.model.Statement
@@ -53,7 +54,7 @@
  * If you don't care about specific activity and just want to test composables in general, see
  * [AndroidComposeTestRule].
  */
-inline fun <reified T : Activity> AndroidComposeTestRule(
+inline fun <reified T : ComponentActivity> AndroidComposeTestRule(
     disableTransitions: Boolean = false
 ): AndroidComposeTestRule<T> {
     // TODO(b/138993381): By launching custom activities we are losing control over what content is
@@ -66,7 +67,7 @@
 /**
  * Android specific implementation of [ComposeTestRule].
  */
-class AndroidComposeTestRule<T : Activity>(
+class AndroidComposeTestRule<T : ComponentActivity>(
     activityClass: Class<T>,
     private val disableTransitions: Boolean = false
 ) : ComposeTestRule {
@@ -83,20 +84,9 @@
         activityTestRule.activity.resources.displayMetrics
 
     override fun apply(base: Statement, description: Description?): Statement {
-        return clockTestRule.apply(
-            activityTestRule.apply(AndroidComposeStatement(base), description),
-            description
-        )
-    }
-
-    override fun <T> runOnUiThread(action: () -> T): T {
-        // TODO: Rename to runOnUiThread and use it everywhere instead of this method
-        return runOnUiThreadInternal(action)
-    }
-
-    override fun <T> runOnIdleCompose(action: () -> T): T {
-        // TODO: Rename to runOnIdleCompose and use it everywhere instead of this method
-        return runOnIdleComposeInternal(action)
+        val activityTestRuleStatement = activityTestRule.apply(base, description)
+        val composeTestRuleStatement = AndroidComposeStatement(activityTestRuleStatement)
+        return clockTestRule.apply(composeTestRuleStatement, description)
     }
 
     /**
@@ -143,7 +133,6 @@
             }
         }
         return AndroidComposeTestCaseSetup(
-            this,
             testCase,
             activityTestRule.activity
         )
@@ -151,7 +140,6 @@
 
     override fun forGivenTestCase(testCase: ComposeTestCase): ComposeTestCaseSetup {
         return AndroidComposeTestCaseSetup(
-            this,
             testCase,
             activityTestRule.activity
         )
@@ -171,34 +159,64 @@
         return captureRegionToBitmap(screenRect, handler, activityTestRule.activity.window)
     }
 
+    private fun onAndroidOwnerCreated(owner: AndroidOwner) {
+        owner.view.addOnAttachStateChangeListener(OwnerAttachedListener(owner))
+    }
+
     inner class AndroidComposeStatement(
         private val base: Statement
     ) : Statement() {
         override fun evaluate() {
-            transitionsEnabled = !disableTransitions
-            ComposeIdlingResource.registerSelfIntoEspresso()
+            beforeEvaluate()
             try {
                 base.evaluate()
             } finally {
-                transitionsEnabled = true
-                // Dispose the content
-                if (disposeContentHook != null) {
-                    runOnUiThread {
-                        // NOTE: currently, calling dispose after an exception that happened during
-                        // composition is not a safe call. Compose runtime should fix this, and then
-                        // this call will be okay. At the moment, however, calling this could
-                        // itself produce an exception which will then obscure the original
-                        // exception. To fix this, we will just wrap this call in a try/catch of
-                        // its own
-                        try {
-                            disposeContentHook!!()
-                        } catch (e: Exception) {
-                            // ignore
-                        }
-                        disposeContentHook = null
+                afterEvaluate()
+            }
+        }
+
+        private fun beforeEvaluate() {
+            transitionsEnabled = !disableTransitions
+            AndroidOwner.onAndroidOwnerCreatedCallback = ::onAndroidOwnerCreated
+            registerComposeWithEspresso()
+        }
+
+        private fun afterEvaluate() {
+            transitionsEnabled = true
+            AndroidOwner.onAndroidOwnerCreatedCallback = null
+            // Dispose the content
+            if (disposeContentHook != null) {
+                runOnUiThread {
+                    // NOTE: currently, calling dispose after an exception that happened during
+                    // composition is not a safe call. Compose runtime should fix this, and then
+                    // this call will be okay. At the moment, however, calling this could
+                    // itself produce an exception which will then obscure the original
+                    // exception. To fix this, we will just wrap this call in a try/catch of
+                    // its own
+                    try {
+                        disposeContentHook!!()
+                    } catch (e: Exception) {
+                        // ignore
                     }
+                    disposeContentHook = null
                 }
             }
         }
     }
-}
\ No newline at end of file
+
+    private class OwnerAttachedListener(
+        private val owner: AndroidOwner
+    ) : View.OnAttachStateChangeListener {
+
+        // Note: owner.view === view, because the owner _is_ the view,
+        // and this listener is only referenced from within the view.
+
+        override fun onViewAttachedToWindow(view: View) {
+            AndroidOwnerRegistry.registerOwner(owner)
+        }
+
+        override fun onViewDetachedFromWindow(view: View) {
+            AndroidOwnerRegistry.unregisterOwner(owner)
+        }
+    }
+}
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidOwnerRegistry.kt b/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidOwnerRegistry.kt
new file mode 100644
index 0000000..3a436d0
--- /dev/null
+++ b/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidOwnerRegistry.kt
@@ -0,0 +1,106 @@
+/*
+ * 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.ui.test.android
+
+import android.view.View
+import android.view.ViewTreeObserver
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.ViewTreeLifecycleOwner
+import androidx.ui.core.AndroidOwner
+import java.util.Collections
+import java.util.WeakHashMap
+
+/**
+ * Registry where all [AndroidOwner]s should be registered while they are attached to the window.
+ * This registry is used by the testing library to query the owners's state.
+ */
+internal object AndroidOwnerRegistry {
+    private val owners = Collections.newSetFromMap(WeakHashMap<AndroidOwner, Boolean>())
+    private val notYetDrawn = Collections.newSetFromMap(WeakHashMap<AndroidOwner, Boolean>())
+    private var onDrawnCallback: (() -> Unit)? = null
+
+    /**
+     * Returns if all registered owners have finished at least one draw call.
+     */
+    fun haveAllDrawn(): Boolean {
+        return notYetDrawn.all {
+            val lifecycleOwner = ViewTreeLifecycleOwner.get(it.view) ?: return false
+            lifecycleOwner.lifecycle.currentState != Lifecycle.State.RESUMED
+        }
+    }
+
+    /**
+     * Adds a [callback] to be called when all registered [AndroidOwner]s have drawn at least
+     * once. The callback will be removed after it is called.
+     */
+    fun setOnDrawnCallback(callback: (() -> Unit)?) {
+        onDrawnCallback = callback
+    }
+
+    /**
+     * Registers the [owner] in this registry. Must be called from [View.onAttachedToWindow].
+     */
+    internal fun registerOwner(owner: AndroidOwner) {
+        owners.add(owner)
+        notYetDrawn.add(owner)
+        owner.view.viewTreeObserver.addOnDrawListener(FirstDrawListener(owner))
+    }
+
+    /**
+     * Unregisters the [owner] from this registry. Must be called from [View.onDetachedFromWindow].
+     */
+    internal fun unregisterOwner(owner: AndroidOwner) {
+        owners.remove(owner)
+        notYetDrawn.remove(owner)
+        dispatchOnDrawn()
+    }
+
+    /**
+     * Should be called when a registered owner has drawn for the first time. Can be called after
+     * subsequent draws as well, but that is not required.
+     */
+    private fun notifyOwnerDrawn(owner: AndroidOwner) {
+        notYetDrawn.remove(owner)
+        dispatchOnDrawn()
+    }
+
+    private fun dispatchOnDrawn() {
+        if (haveAllDrawn()) {
+            onDrawnCallback?.invoke()
+            onDrawnCallback = null
+        }
+    }
+
+    private class FirstDrawListener(private val owner: AndroidOwner) :
+        ViewTreeObserver.OnDrawListener {
+        private var invoked = false
+
+        override fun onDraw() {
+            if (!invoked) {
+                invoked = true
+                owner.view.post {
+                    // the view was drawn
+                    notifyOwnerDrawn(owner)
+                    val viewTreeObserver = owner.view.viewTreeObserver
+                    if (viewTreeObserver.isAlive) {
+                        viewTreeObserver.removeOnDrawListener(this)
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidSemanticsTreeInteraction.kt b/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidSemanticsTreeInteraction.kt
index 56c0903..e9b0ce1 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidSemanticsTreeInteraction.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidSemanticsTreeInteraction.kt
@@ -22,6 +22,7 @@
 import android.os.Handler
 import android.os.Looper
 import androidx.annotation.RequiresApi
+
 import androidx.ui.core.semantics.SemanticsNode
 import androidx.ui.test.SemanticsPredicate
 import androidx.ui.test.SemanticsTreeInteraction
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidTestAnimationClock.kt b/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidTestAnimationClock.kt
index 397a45c..2a17242 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidTestAnimationClock.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/android/AndroidTestAnimationClock.kt
@@ -21,7 +21,7 @@
 import androidx.animation.ManualAnimationClock
 import androidx.ui.test.AnimationClockTestRule
 import androidx.ui.test.TestAnimationClock
-import androidx.ui.test.runOnUiThreadInternal
+import androidx.ui.test.runOnUiThread
 
 /**
  * An animation clock driven by an external time source, that can be queried for idleness and has
@@ -42,7 +42,7 @@
      * If not initializing on the main thread, a message will be posted on the main thread to
      * fetch the Choreographer, and initialization blocks until that fetch is completed.
      */
-    private val mainChoreographer: Choreographer = runOnUiThreadInternal {
+    private val mainChoreographer: Choreographer = runOnUiThread {
         Choreographer.getInstance()
     }
 
@@ -90,7 +90,7 @@
     }
 
     override fun advanceClock(milliseconds: Long) {
-        runOnUiThreadInternal {
+        runOnUiThread {
             advanceClockOnMainThread(milliseconds)
         }
     }
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/android/ComposeIdlingResource.kt b/ui/ui-test/src/main/java/androidx/ui/test/android/ComposeIdlingResource.kt
index 089aabd..bcbac41 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/android/ComposeIdlingResource.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/android/ComposeIdlingResource.kt
@@ -24,7 +24,8 @@
 import androidx.test.espresso.IdlingRegistry
 import androidx.test.espresso.IdlingResource
 import androidx.ui.test.TestAnimationClock
-import androidx.ui.test.runOnUiThreadInternal
+import androidx.ui.test.runOnUiThread
+import java.util.concurrent.atomic.AtomicBoolean
 
 /**
  * Register compose's idling check to Espresso.
@@ -36,6 +37,7 @@
  */
 fun registerComposeWithEspresso() {
     ComposeIdlingResource.registerSelfIntoEspresso()
+    FirstDrawIdlingResource.registerSelfIntoEspresso()
 }
 
 /**
@@ -43,6 +45,7 @@
  */
 fun unregisterComposeFromEspresso() {
     ComposeIdlingResource.unregisterSelfFromEspresso()
+    FirstDrawIdlingResource.unregisterSelfFromEspresso()
 }
 
 /**
@@ -67,14 +70,10 @@
  * [AndroidComposeTestRule]. If you for some reasons want to only use Espresso but still have it
  * wait for Compose being idle you can register this yourself via [registerSelfIntoEspresso].
  */
-internal object ComposeIdlingResource : IdlingResource {
+internal object ComposeIdlingResource : BaseIdlingResource() {
 
     override fun getName(): String = "ComposeIdlingResource"
 
-    private var callback: IdlingResource.ResourceCallback? = null
-
-    private var isRegistered = false
-
     private var isIdleCheckScheduled = false
 
     private val clocks = mutableSetOf<TestAnimationClock>()
@@ -85,7 +84,7 @@
      * Returns whether or not Compose is idle, without starting to poll if it is not.
      */
     fun isIdle(): Boolean {
-        return runOnUiThreadInternal {
+        return runOnUiThread {
             !(inFrame && currentFrame().hasPendingChanges()) &&
                     !Recomposer.hasPendingChanges() &&
                     areAllClocksIdle()
@@ -111,9 +110,7 @@
             handler.post {
                 isIdleCheckScheduled = false
                 if (isIdle()) {
-                    if (callback != null) {
-                        callback!!.onTransitionToIdle()
-                    }
+                    transitionToIdle()
                 } else {
                     scheduleIdleCheck()
                 }
@@ -121,36 +118,6 @@
         }
     }
 
-    override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback?) {
-        this.callback = callback
-    }
-
-    /**
-     * Registers this resource into Espresso.
-     *
-     * Can be called multiple times.
-     */
-    internal fun registerSelfIntoEspresso() {
-        if (isRegistered) {
-            return
-        }
-        IdlingRegistry.getInstance().register(ComposeIdlingResource)
-        isRegistered = true
-    }
-
-    /**
-     * Unregisters this resource from Espresso.
-     *
-     * Can be called multiple times.
-     */
-    internal fun unregisterSelfFromEspresso() {
-        if (!isRegistered) {
-            return
-        }
-        IdlingRegistry.getInstance().unregister(ComposeIdlingResource)
-        isRegistered = false
-    }
-
     internal fun registerTestClock(clock: TestAnimationClock) {
         synchronized(clocks) {
             clocks.add(clock)
@@ -169,3 +136,55 @@
         }
     }
 }
+
+private object FirstDrawIdlingResource : BaseIdlingResource() {
+    override fun getName(): String = "FirstDrawIdlingResource"
+
+    override fun isIdleNow(): Boolean {
+        return AndroidOwnerRegistry.haveAllDrawn().also {
+            if (!it) {
+                AndroidOwnerRegistry.setOnDrawnCallback(::transitionToIdle)
+            }
+        }
+    }
+
+    override fun unregisterSelfFromEspresso() {
+        super.unregisterSelfFromEspresso()
+        AndroidOwnerRegistry.setOnDrawnCallback(null)
+    }
+}
+
+internal sealed class BaseIdlingResource : IdlingResource {
+    private val isRegistered = AtomicBoolean(false)
+    private var resourceCallback: IdlingResource.ResourceCallback? = null
+
+    final override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback?) {
+        resourceCallback = callback
+    }
+
+    protected fun transitionToIdle() {
+        resourceCallback?.onTransitionToIdle()
+    }
+
+    /**
+     * Registers this resource into Espresso.
+     *
+     * Can be called multiple times.
+     */
+    internal fun registerSelfIntoEspresso() {
+        if (isRegistered.compareAndSet(false, true)) {
+            IdlingRegistry.getInstance().register(this)
+        }
+    }
+
+    /**
+     * Unregisters this resource from Espresso.
+     *
+     * Can be called multiple times.
+     */
+    internal open fun unregisterSelfFromEspresso() {
+        if (isRegistered.compareAndSet(true, false)) {
+            IdlingRegistry.getInstance().unregister(this)
+        }
+    }
+}
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/android/SynchronizedTreeCollector.kt b/ui/ui-test/src/main/java/androidx/ui/test/android/SynchronizedTreeCollector.kt
index c52c590..cb7dc86 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/android/SynchronizedTreeCollector.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/android/SynchronizedTreeCollector.kt
@@ -49,7 +49,7 @@
      * surfaces only in incorrect tests.
      */
     internal fun collectOwners(): CollectedOwners {
-        ComposeIdlingResource.registerSelfIntoEspresso()
+        registerComposeWithEspresso()
         val rootSearcher = RootSearcher()
 
         // Use Espresso to iterate over all roots and find all SemanticsTreeProviders
@@ -74,7 +74,7 @@
      * surfaces only in incorrect tests.
      */
     internal fun waitForIdle() {
-        ComposeIdlingResource.registerSelfIntoEspresso()
+        registerComposeWithEspresso()
         Espresso.onIdle()
     }
 
diff --git a/ui/ui-android-text/OWNERS b/ui/ui-text-android/OWNERS
similarity index 100%
rename from ui/ui-android-text/OWNERS
rename to ui/ui-text-android/OWNERS
diff --git a/ui/ui-android-text/api/0.1.0-dev01.txt b/ui/ui-text-android/api/0.1.0-dev01.txt
similarity index 100%
rename from ui/ui-android-text/api/0.1.0-dev01.txt
rename to ui/ui-text-android/api/0.1.0-dev01.txt
diff --git a/ui/ui-android-text/api/0.1.0-dev02.txt b/ui/ui-text-android/api/0.1.0-dev02.txt
similarity index 100%
rename from ui/ui-android-text/api/0.1.0-dev02.txt
rename to ui/ui-text-android/api/0.1.0-dev02.txt
diff --git a/ui/ui-android-text/api/0.1.0-dev03.txt b/ui/ui-text-android/api/0.1.0-dev03.txt
similarity index 100%
rename from ui/ui-android-text/api/0.1.0-dev03.txt
rename to ui/ui-text-android/api/0.1.0-dev03.txt
diff --git a/ui/ui-android-text/api/0.1.0-dev04.txt b/ui/ui-text-android/api/0.1.0-dev04.txt
similarity index 100%
rename from ui/ui-android-text/api/0.1.0-dev04.txt
rename to ui/ui-text-android/api/0.1.0-dev04.txt
diff --git a/ui/ui-android-text/api/0.1.0-dev05.txt b/ui/ui-text-android/api/0.1.0-dev05.txt
similarity index 100%
rename from ui/ui-android-text/api/0.1.0-dev05.txt
rename to ui/ui-text-android/api/0.1.0-dev05.txt
diff --git a/ui/ui-android-text/api/0.1.0-dev08.txt b/ui/ui-text-android/api/0.1.0-dev08.txt
similarity index 100%
rename from ui/ui-android-text/api/0.1.0-dev08.txt
rename to ui/ui-text-android/api/0.1.0-dev08.txt
diff --git a/ui/ui-android-text/api/0.1.0-dev09.txt b/ui/ui-text-android/api/0.1.0-dev09.txt
similarity index 100%
rename from ui/ui-android-text/api/0.1.0-dev09.txt
rename to ui/ui-text-android/api/0.1.0-dev09.txt
diff --git a/ui/ui-android-text/api/current.txt b/ui/ui-text-android/api/current.txt
similarity index 100%
rename from ui/ui-android-text/api/current.txt
rename to ui/ui-text-android/api/current.txt
diff --git a/ui/ui-android-text/api/public_plus_experimental_0.1.0-dev01.txt b/ui/ui-text-android/api/public_plus_experimental_0.1.0-dev01.txt
similarity index 100%
rename from ui/ui-android-text/api/public_plus_experimental_0.1.0-dev01.txt
rename to ui/ui-text-android/api/public_plus_experimental_0.1.0-dev01.txt
diff --git a/ui/ui-android-text/api/public_plus_experimental_0.1.0-dev02.txt b/ui/ui-text-android/api/public_plus_experimental_0.1.0-dev02.txt
similarity index 100%
rename from ui/ui-android-text/api/public_plus_experimental_0.1.0-dev02.txt
rename to ui/ui-text-android/api/public_plus_experimental_0.1.0-dev02.txt
diff --git a/ui/ui-android-text/api/public_plus_experimental_0.1.0-dev03.txt b/ui/ui-text-android/api/public_plus_experimental_0.1.0-dev03.txt
similarity index 100%
rename from ui/ui-android-text/api/public_plus_experimental_0.1.0-dev03.txt
rename to ui/ui-text-android/api/public_plus_experimental_0.1.0-dev03.txt
diff --git a/ui/ui-android-text/api/public_plus_experimental_0.1.0-dev04.txt b/ui/ui-text-android/api/public_plus_experimental_0.1.0-dev04.txt
similarity index 100%
rename from ui/ui-android-text/api/public_plus_experimental_0.1.0-dev04.txt
rename to ui/ui-text-android/api/public_plus_experimental_0.1.0-dev04.txt
diff --git a/ui/ui-android-text/api/public_plus_experimental_0.1.0-dev05.txt b/ui/ui-text-android/api/public_plus_experimental_0.1.0-dev05.txt
similarity index 100%
rename from ui/ui-android-text/api/public_plus_experimental_0.1.0-dev05.txt
rename to ui/ui-text-android/api/public_plus_experimental_0.1.0-dev05.txt
diff --git a/ui/ui-android-text/api/public_plus_experimental_0.1.0-dev08.txt b/ui/ui-text-android/api/public_plus_experimental_0.1.0-dev08.txt
similarity index 100%
rename from ui/ui-android-text/api/public_plus_experimental_0.1.0-dev08.txt
rename to ui/ui-text-android/api/public_plus_experimental_0.1.0-dev08.txt
diff --git a/ui/ui-android-text/api/public_plus_experimental_0.1.0-dev09.txt b/ui/ui-text-android/api/public_plus_experimental_0.1.0-dev09.txt
similarity index 100%
rename from ui/ui-android-text/api/public_plus_experimental_0.1.0-dev09.txt
rename to ui/ui-text-android/api/public_plus_experimental_0.1.0-dev09.txt
diff --git a/ui/ui-android-text/api/public_plus_experimental_current.txt b/ui/ui-text-android/api/public_plus_experimental_current.txt
similarity index 100%
rename from ui/ui-android-text/api/public_plus_experimental_current.txt
rename to ui/ui-text-android/api/public_plus_experimental_current.txt
diff --git a/ui/ui-text/api/res-0.1.0-dev01.txt b/ui/ui-text-android/api/res-0.1.0-dev01.txt
similarity index 100%
copy from ui/ui-text/api/res-0.1.0-dev01.txt
copy to ui/ui-text-android/api/res-0.1.0-dev01.txt
diff --git a/ui/ui-text/api/res-0.1.0-dev02.txt b/ui/ui-text-android/api/res-0.1.0-dev02.txt
similarity index 100%
copy from ui/ui-text/api/res-0.1.0-dev02.txt
copy to ui/ui-text-android/api/res-0.1.0-dev02.txt
diff --git a/ui/ui-text/api/res-0.1.0-dev03.txt b/ui/ui-text-android/api/res-0.1.0-dev03.txt
similarity index 100%
copy from ui/ui-text/api/res-0.1.0-dev03.txt
copy to ui/ui-text-android/api/res-0.1.0-dev03.txt
diff --git a/ui/ui-text/api/res-0.1.0-dev04.txt b/ui/ui-text-android/api/res-0.1.0-dev04.txt
similarity index 100%
copy from ui/ui-text/api/res-0.1.0-dev04.txt
copy to ui/ui-text-android/api/res-0.1.0-dev04.txt
diff --git a/ui/ui-text/api/res-0.1.0-dev05.txt b/ui/ui-text-android/api/res-0.1.0-dev05.txt
similarity index 100%
copy from ui/ui-text/api/res-0.1.0-dev05.txt
copy to ui/ui-text-android/api/res-0.1.0-dev05.txt
diff --git a/ui/ui-text/api/res-0.1.0-dev06.txt b/ui/ui-text-android/api/res-0.1.0-dev06.txt
similarity index 100%
copy from ui/ui-text/api/res-0.1.0-dev06.txt
copy to ui/ui-text-android/api/res-0.1.0-dev06.txt
diff --git a/ui/ui-text/api/res-0.1.0-dev07.txt b/ui/ui-text-android/api/res-0.1.0-dev07.txt
similarity index 100%
copy from ui/ui-text/api/res-0.1.0-dev07.txt
copy to ui/ui-text-android/api/res-0.1.0-dev07.txt
diff --git a/ui/ui-text/api/res-0.1.0-dev08.txt b/ui/ui-text-android/api/res-0.1.0-dev08.txt
similarity index 100%
copy from ui/ui-text/api/res-0.1.0-dev08.txt
copy to ui/ui-text-android/api/res-0.1.0-dev08.txt
diff --git a/ui/ui-android-text/api/res-0.1.0-dev09.txt b/ui/ui-text-android/api/res-0.1.0-dev09.txt
similarity index 100%
rename from ui/ui-android-text/api/res-0.1.0-dev09.txt
rename to ui/ui-text-android/api/res-0.1.0-dev09.txt
diff --git a/ui/ui-android-text/api/restricted_0.1.0-dev01.txt b/ui/ui-text-android/api/restricted_0.1.0-dev01.txt
similarity index 100%
rename from ui/ui-android-text/api/restricted_0.1.0-dev01.txt
rename to ui/ui-text-android/api/restricted_0.1.0-dev01.txt
diff --git a/ui/ui-android-text/api/restricted_0.1.0-dev02.txt b/ui/ui-text-android/api/restricted_0.1.0-dev02.txt
similarity index 100%
rename from ui/ui-android-text/api/restricted_0.1.0-dev02.txt
rename to ui/ui-text-android/api/restricted_0.1.0-dev02.txt
diff --git a/ui/ui-android-text/api/restricted_0.1.0-dev03.txt b/ui/ui-text-android/api/restricted_0.1.0-dev03.txt
similarity index 100%
rename from ui/ui-android-text/api/restricted_0.1.0-dev03.txt
rename to ui/ui-text-android/api/restricted_0.1.0-dev03.txt
diff --git a/ui/ui-android-text/api/restricted_0.1.0-dev04.txt b/ui/ui-text-android/api/restricted_0.1.0-dev04.txt
similarity index 100%
rename from ui/ui-android-text/api/restricted_0.1.0-dev04.txt
rename to ui/ui-text-android/api/restricted_0.1.0-dev04.txt
diff --git a/ui/ui-android-text/api/restricted_0.1.0-dev05.txt b/ui/ui-text-android/api/restricted_0.1.0-dev05.txt
similarity index 100%
rename from ui/ui-android-text/api/restricted_0.1.0-dev05.txt
rename to ui/ui-text-android/api/restricted_0.1.0-dev05.txt
diff --git a/ui/ui-android-text/api/restricted_0.1.0-dev08.txt b/ui/ui-text-android/api/restricted_0.1.0-dev08.txt
similarity index 100%
rename from ui/ui-android-text/api/restricted_0.1.0-dev08.txt
rename to ui/ui-text-android/api/restricted_0.1.0-dev08.txt
diff --git a/ui/ui-android-text/api/restricted_0.1.0-dev09.txt b/ui/ui-text-android/api/restricted_0.1.0-dev09.txt
similarity index 100%
rename from ui/ui-android-text/api/restricted_0.1.0-dev09.txt
rename to ui/ui-text-android/api/restricted_0.1.0-dev09.txt
diff --git a/ui/ui-android-text/api/restricted_current.txt b/ui/ui-text-android/api/restricted_current.txt
similarity index 100%
rename from ui/ui-android-text/api/restricted_current.txt
rename to ui/ui-text-android/api/restricted_current.txt
diff --git a/ui/ui-android-text/build.gradle b/ui/ui-text-android/build.gradle
similarity index 94%
rename from ui/ui-android-text/build.gradle
rename to ui/ui-text-android/build.gradle
index 52b6371..a0e1e39 100644
--- a/ui/ui-android-text/build.gradle
+++ b/ui/ui-text-android/build.gradle
@@ -36,6 +36,8 @@
     testImplementation(ANDROIDX_TEST_RUNNER)
     testImplementation(JUNIT)
 
+    androidTestImplementation "androidx.core:core:1.0.2"
+    androidTestImplementation project(":ui:ui-test-font")
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
diff --git a/ui/ui-android-text/src/androidTest/AndroidManifest.xml b/ui/ui-text-android/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from ui/ui-android-text/src/androidTest/AndroidManifest.xml
rename to ui/ui-text-android/src/androidTest/AndroidManifest.xml
diff --git a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/BoringLayoutFactoryTest.kt b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/BoringLayoutFactoryTest.kt
similarity index 100%
rename from ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/BoringLayoutFactoryTest.kt
rename to ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/BoringLayoutFactoryTest.kt
diff --git a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/LayoutIntrinsicsTest.kt b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/LayoutIntrinsicsTest.kt
similarity index 92%
rename from ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/LayoutIntrinsicsTest.kt
rename to ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/LayoutIntrinsicsTest.kt
index 602d44e..8ff64e7 100644
--- a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/LayoutIntrinsicsTest.kt
+++ b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/LayoutIntrinsicsTest.kt
@@ -16,14 +16,15 @@
 
 package androidx.ui.text.platform
 
-import android.graphics.Typeface
 import android.text.BoringLayout
 import android.text.SpannableString
 import android.text.Spanned
 import android.text.TextPaint
 import android.text.style.BulletSpan
+import androidx.core.content.res.ResourcesCompat
 import androidx.test.filters.SmallTest
 import androidx.test.platform.app.InstrumentationRegistry
+import androidx.ui.text.font.test.R
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -33,8 +34,7 @@
 @SmallTest
 class LayoutIntrinsicsTest {
     val instrumentation = InstrumentationRegistry.getInstrumentation()
-    val typeface = Typeface.createFromAsset(
-        instrumentation.context.assets, "sample_font.ttf")!!
+    val typeface = ResourcesCompat.getFont(instrumentation.context, R.font.sample_font)!!
 
     @Test
     fun boringMetrics_returns_nonnull_for_boring_text() {
diff --git a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/StaticLayoutFactoryTest.kt b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/StaticLayoutFactoryTest.kt
similarity index 98%
rename from ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/StaticLayoutFactoryTest.kt
rename to ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/StaticLayoutFactoryTest.kt
index 7b82981..4d515c5 100644
--- a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/StaticLayoutFactoryTest.kt
+++ b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/StaticLayoutFactoryTest.kt
@@ -21,9 +21,11 @@
 import android.text.TextDirectionHeuristics
 import android.text.TextPaint
 import android.text.TextUtils
+import androidx.core.content.res.ResourcesCompat
 import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import androidx.test.platform.app.InstrumentationRegistry
+import androidx.ui.text.font.test.R
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
 import org.junit.Test
@@ -40,10 +42,7 @@
     @Before
     fun setUp() {
         val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
-        sampleFont = Typeface.createFromAsset(
-            instrumentation.getContext().getAssets(),
-            "sample_font.ttf"
-        )
+        sampleFont = ResourcesCompat.getFont(instrumentation.context, R.font.sample_font)!!
     }
 
     @Test
diff --git a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/TextLayoutSpanTest.kt b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/TextLayoutSpanTest.kt
similarity index 97%
rename from ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/TextLayoutSpanTest.kt
rename to ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/TextLayoutSpanTest.kt
index c966edb..78b2609 100644
--- a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/TextLayoutSpanTest.kt
+++ b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/TextLayoutSpanTest.kt
@@ -21,8 +21,10 @@
 import android.text.Spanned
 import android.text.TextPaint
 import android.text.style.ScaleXSpan
+import androidx.core.content.res.ResourcesCompat
 import androidx.test.filters.SmallTest
 import androidx.test.platform.app.InstrumentationRegistry
+import androidx.ui.text.font.test.R
 import androidx.ui.text.platform.style.BaselineShiftSpan
 import androidx.ui.text.platform.style.SkewXSpan
 import com.google.common.truth.Truth.assertThat
@@ -47,8 +49,7 @@
         // 2. The LTR/RTL characters are rendered as ▶/◀.
         // 3. The fontMetrics passed to TextPaint has descend - ascend equal to 1.2 * fontSize.
         // 4. The fontMetrics passed to TextPaint has ascend equal to fontSize.
-        sampleTypeface = Typeface.createFromAsset(
-            instrumentation.context.assets, "sample_font.ttf")!!
+        sampleTypeface = ResourcesCompat.getFont(instrumentation.context, R.font.sample_font)!!
     }
 
     @Test
diff --git a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/TextLayoutTest.kt b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/TextLayoutTest.kt
similarity index 98%
rename from ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/TextLayoutTest.kt
rename to ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/TextLayoutTest.kt
index 2a6d0a7..6660782 100644
--- a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/TextLayoutTest.kt
+++ b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/TextLayoutTest.kt
@@ -23,8 +23,10 @@
 import android.text.Spanned
 import android.text.StaticLayout
 import android.text.TextPaint
+import androidx.core.content.res.ResourcesCompat
 import androidx.test.filters.SmallTest
 import androidx.test.platform.app.InstrumentationRegistry
+import androidx.ui.text.font.test.R
 import androidx.ui.text.platform.style.BaselineShiftSpan
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
@@ -44,8 +46,7 @@
         // 1. The width of most of visible characters equals to font size.
         // 2. The LTR/RTL characters are rendered as ▶/◀.
         // 3. The fontMetrics passed to TextPaint has descend - ascend equal to 1.2 * fontSize.
-        sampleTypeface = Typeface.createFromAsset(
-            instrumentation.context.assets, "sample_font.ttf")!!
+        sampleTypeface = ResourcesCompat.getFont(instrumentation.context, R.font.sample_font)!!
     }
 
     @Test
diff --git a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/selection/WordBoundaryTest.kt b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/selection/WordBoundaryTest.kt
similarity index 100%
rename from ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/selection/WordBoundaryTest.kt
rename to ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/selection/WordBoundaryTest.kt
diff --git a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/selection/WordIteratorTest.kt b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/selection/WordIteratorTest.kt
similarity index 100%
rename from ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/selection/WordIteratorTest.kt
rename to ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/selection/WordIteratorTest.kt
diff --git a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/style/BaselineShiftSpanTest.kt b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/style/BaselineShiftSpanTest.kt
similarity index 100%
rename from ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/style/BaselineShiftSpanTest.kt
rename to ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/style/BaselineShiftSpanTest.kt
diff --git a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/style/FontFeatureSpanTest.kt b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/style/FontFeatureSpanTest.kt
similarity index 100%
rename from ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/style/FontFeatureSpanTest.kt
rename to ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/style/FontFeatureSpanTest.kt
diff --git a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/style/LetterSpacingSpanEmTest.kt b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/style/LetterSpacingSpanEmTest.kt
similarity index 100%
rename from ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/style/LetterSpacingSpanEmTest.kt
rename to ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/style/LetterSpacingSpanEmTest.kt
diff --git a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/style/LetterSpacingSpanPxTest.kt b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/style/LetterSpacingSpanPxTest.kt
similarity index 100%
rename from ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/style/LetterSpacingSpanPxTest.kt
rename to ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/style/LetterSpacingSpanPxTest.kt
diff --git a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/style/PlaceholderSpanTest.kt b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/style/PlaceholderSpanTest.kt
similarity index 100%
rename from ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/style/PlaceholderSpanTest.kt
rename to ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/style/PlaceholderSpanTest.kt
diff --git a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/style/ShadowSpanTest.kt b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/style/ShadowSpanTest.kt
similarity index 100%
rename from ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/style/ShadowSpanTest.kt
rename to ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/style/ShadowSpanTest.kt
diff --git a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/style/SkewXSpanTest.kt b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/style/SkewXSpanTest.kt
similarity index 100%
rename from ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/style/SkewXSpanTest.kt
rename to ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/style/SkewXSpanTest.kt
diff --git a/ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/style/TypefaceSpanTest.kt b/ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/style/TypefaceSpanTest.kt
similarity index 100%
rename from ui/ui-android-text/src/androidTest/java/androidx/ui/text/platform/style/TypefaceSpanTest.kt
rename to ui/ui-text-android/src/androidTest/java/androidx/ui/text/platform/style/TypefaceSpanTest.kt
diff --git a/ui/ui-android-text/src/main/AndroidManifest.xml b/ui/ui-text-android/src/main/AndroidManifest.xml
similarity index 100%
rename from ui/ui-android-text/src/main/AndroidManifest.xml
rename to ui/ui-text-android/src/main/AndroidManifest.xml
diff --git a/ui/ui-android-text/src/main/java/androidx/ui/text/platform/BoringLayoutFactory.kt b/ui/ui-text-android/src/main/java/androidx/ui/text/platform/BoringLayoutFactory.kt
similarity index 100%
rename from ui/ui-android-text/src/main/java/androidx/ui/text/platform/BoringLayoutFactory.kt
rename to ui/ui-text-android/src/main/java/androidx/ui/text/platform/BoringLayoutFactory.kt
diff --git a/ui/ui-android-text/src/main/java/androidx/ui/text/platform/CharSequenceCharacterIterator.kt b/ui/ui-text-android/src/main/java/androidx/ui/text/platform/CharSequenceCharacterIterator.kt
similarity index 100%
rename from ui/ui-android-text/src/main/java/androidx/ui/text/platform/CharSequenceCharacterIterator.kt
rename to ui/ui-text-android/src/main/java/androidx/ui/text/platform/CharSequenceCharacterIterator.kt
diff --git a/ui/ui-android-text/src/main/java/androidx/ui/text/platform/LayoutCompat.kt b/ui/ui-text-android/src/main/java/androidx/ui/text/platform/LayoutCompat.kt
similarity index 100%
rename from ui/ui-android-text/src/main/java/androidx/ui/text/platform/LayoutCompat.kt
rename to ui/ui-text-android/src/main/java/androidx/ui/text/platform/LayoutCompat.kt
diff --git a/ui/ui-android-text/src/main/java/androidx/ui/text/platform/LayoutIntrinsics.kt b/ui/ui-text-android/src/main/java/androidx/ui/text/platform/LayoutIntrinsics.kt
similarity index 100%
rename from ui/ui-android-text/src/main/java/androidx/ui/text/platform/LayoutIntrinsics.kt
rename to ui/ui-text-android/src/main/java/androidx/ui/text/platform/LayoutIntrinsics.kt
diff --git a/ui/ui-android-text/src/main/java/androidx/ui/text/platform/StaticLayoutFactory.kt b/ui/ui-text-android/src/main/java/androidx/ui/text/platform/StaticLayoutFactory.kt
similarity index 100%
rename from ui/ui-android-text/src/main/java/androidx/ui/text/platform/StaticLayoutFactory.kt
rename to ui/ui-text-android/src/main/java/androidx/ui/text/platform/StaticLayoutFactory.kt
diff --git a/ui/ui-android-text/src/main/java/androidx/ui/text/platform/TextLayout.kt b/ui/ui-text-android/src/main/java/androidx/ui/text/platform/TextLayout.kt
similarity index 100%
rename from ui/ui-android-text/src/main/java/androidx/ui/text/platform/TextLayout.kt
rename to ui/ui-text-android/src/main/java/androidx/ui/text/platform/TextLayout.kt
diff --git a/ui/ui-android-text/src/main/java/androidx/ui/text/platform/selection/WordBoundary.kt b/ui/ui-text-android/src/main/java/androidx/ui/text/platform/selection/WordBoundary.kt
similarity index 100%
rename from ui/ui-android-text/src/main/java/androidx/ui/text/platform/selection/WordBoundary.kt
rename to ui/ui-text-android/src/main/java/androidx/ui/text/platform/selection/WordBoundary.kt
diff --git a/ui/ui-android-text/src/main/java/androidx/ui/text/platform/selection/WordIterator.kt b/ui/ui-text-android/src/main/java/androidx/ui/text/platform/selection/WordIterator.kt
similarity index 100%
rename from ui/ui-android-text/src/main/java/androidx/ui/text/platform/selection/WordIterator.kt
rename to ui/ui-text-android/src/main/java/androidx/ui/text/platform/selection/WordIterator.kt
diff --git a/ui/ui-android-text/src/main/java/androidx/ui/text/platform/style/BaselineShiftSpan.kt b/ui/ui-text-android/src/main/java/androidx/ui/text/platform/style/BaselineShiftSpan.kt
similarity index 100%
rename from ui/ui-android-text/src/main/java/androidx/ui/text/platform/style/BaselineShiftSpan.kt
rename to ui/ui-text-android/src/main/java/androidx/ui/text/platform/style/BaselineShiftSpan.kt
diff --git a/ui/ui-android-text/src/main/java/androidx/ui/text/platform/style/FontFeatureSpan.kt b/ui/ui-text-android/src/main/java/androidx/ui/text/platform/style/FontFeatureSpan.kt
similarity index 100%
rename from ui/ui-android-text/src/main/java/androidx/ui/text/platform/style/FontFeatureSpan.kt
rename to ui/ui-text-android/src/main/java/androidx/ui/text/platform/style/FontFeatureSpan.kt
diff --git a/ui/ui-android-text/src/main/java/androidx/ui/text/platform/style/LetterSpacingSpanEm.kt b/ui/ui-text-android/src/main/java/androidx/ui/text/platform/style/LetterSpacingSpanEm.kt
similarity index 100%
rename from ui/ui-android-text/src/main/java/androidx/ui/text/platform/style/LetterSpacingSpanEm.kt
rename to ui/ui-text-android/src/main/java/androidx/ui/text/platform/style/LetterSpacingSpanEm.kt
diff --git a/ui/ui-android-text/src/main/java/androidx/ui/text/platform/style/LetterSpacingSpanPx.kt b/ui/ui-text-android/src/main/java/androidx/ui/text/platform/style/LetterSpacingSpanPx.kt
similarity index 100%
rename from ui/ui-android-text/src/main/java/androidx/ui/text/platform/style/LetterSpacingSpanPx.kt
rename to ui/ui-text-android/src/main/java/androidx/ui/text/platform/style/LetterSpacingSpanPx.kt
diff --git a/ui/ui-android-text/src/main/java/androidx/ui/text/platform/style/LineHeightSpan.kt b/ui/ui-text-android/src/main/java/androidx/ui/text/platform/style/LineHeightSpan.kt
similarity index 100%
rename from ui/ui-android-text/src/main/java/androidx/ui/text/platform/style/LineHeightSpan.kt
rename to ui/ui-text-android/src/main/java/androidx/ui/text/platform/style/LineHeightSpan.kt
diff --git a/ui/ui-android-text/src/main/java/androidx/ui/text/platform/style/PlaceholderSpan.kt b/ui/ui-text-android/src/main/java/androidx/ui/text/platform/style/PlaceholderSpan.kt
similarity index 100%
rename from ui/ui-android-text/src/main/java/androidx/ui/text/platform/style/PlaceholderSpan.kt
rename to ui/ui-text-android/src/main/java/androidx/ui/text/platform/style/PlaceholderSpan.kt
diff --git a/ui/ui-android-text/src/main/java/androidx/ui/text/platform/style/ShadowSpan.kt b/ui/ui-text-android/src/main/java/androidx/ui/text/platform/style/ShadowSpan.kt
similarity index 100%
rename from ui/ui-android-text/src/main/java/androidx/ui/text/platform/style/ShadowSpan.kt
rename to ui/ui-text-android/src/main/java/androidx/ui/text/platform/style/ShadowSpan.kt
diff --git a/ui/ui-android-text/src/main/java/androidx/ui/text/platform/style/SkewXSpan.kt b/ui/ui-text-android/src/main/java/androidx/ui/text/platform/style/SkewXSpan.kt
similarity index 100%
rename from ui/ui-android-text/src/main/java/androidx/ui/text/platform/style/SkewXSpan.kt
rename to ui/ui-text-android/src/main/java/androidx/ui/text/platform/style/SkewXSpan.kt
diff --git a/ui/ui-android-text/src/main/java/androidx/ui/text/platform/style/TypefaceSpan.kt b/ui/ui-text-android/src/main/java/androidx/ui/text/platform/style/TypefaceSpan.kt
similarity index 100%
rename from ui/ui-android-text/src/main/java/androidx/ui/text/platform/style/TypefaceSpan.kt
rename to ui/ui-text-android/src/main/java/androidx/ui/text/platform/style/TypefaceSpan.kt
diff --git a/ui/ui-text-core/OWNERS b/ui/ui-text-core/OWNERS
new file mode 100644
index 0000000..8cd9c61
--- /dev/null
+++ b/ui/ui-text-core/OWNERS
@@ -0,0 +1,12 @@
+pavlis@google.com
+adamp@google.com
+mount@google.com
+popam@google.com
+andreykulikov@google.com
+ryanmentley@google.com
+shepshapard@google.com
+njawad@google.com
+haoyuchang@google.com
+nona@google.com
+siyamed@google.com
+qqd@google.com
diff --git a/ui/ui-text/api/0.1.0-dev01.txt b/ui/ui-text-core/api/0.1.0-dev01.txt
similarity index 100%
rename from ui/ui-text/api/0.1.0-dev01.txt
rename to ui/ui-text-core/api/0.1.0-dev01.txt
diff --git a/ui/ui-text/api/0.1.0-dev02.txt b/ui/ui-text-core/api/0.1.0-dev02.txt
similarity index 100%
rename from ui/ui-text/api/0.1.0-dev02.txt
rename to ui/ui-text-core/api/0.1.0-dev02.txt
diff --git a/ui/ui-text/api/0.1.0-dev03.txt b/ui/ui-text-core/api/0.1.0-dev03.txt
similarity index 100%
rename from ui/ui-text/api/0.1.0-dev03.txt
rename to ui/ui-text-core/api/0.1.0-dev03.txt
diff --git a/ui/ui-text/api/0.1.0-dev04.txt b/ui/ui-text-core/api/0.1.0-dev04.txt
similarity index 100%
rename from ui/ui-text/api/0.1.0-dev04.txt
rename to ui/ui-text-core/api/0.1.0-dev04.txt
diff --git a/ui/ui-text/api/0.1.0-dev05.txt b/ui/ui-text-core/api/0.1.0-dev05.txt
similarity index 100%
rename from ui/ui-text/api/0.1.0-dev05.txt
rename to ui/ui-text-core/api/0.1.0-dev05.txt
diff --git a/ui/ui-text/api/0.1.0-dev06.txt b/ui/ui-text-core/api/0.1.0-dev06.txt
similarity index 100%
rename from ui/ui-text/api/0.1.0-dev06.txt
rename to ui/ui-text-core/api/0.1.0-dev06.txt
diff --git a/ui/ui-text/api/0.1.0-dev07.txt b/ui/ui-text-core/api/0.1.0-dev07.txt
similarity index 100%
rename from ui/ui-text/api/0.1.0-dev07.txt
rename to ui/ui-text-core/api/0.1.0-dev07.txt
diff --git a/ui/ui-text/api/0.1.0-dev08.txt b/ui/ui-text-core/api/0.1.0-dev08.txt
similarity index 100%
rename from ui/ui-text/api/0.1.0-dev08.txt
rename to ui/ui-text-core/api/0.1.0-dev08.txt
diff --git a/ui/ui-text-core/api/0.1.0-dev09.txt b/ui/ui-text-core/api/0.1.0-dev09.txt
new file mode 100644
index 0000000..1df7e9d0
--- /dev/null
+++ b/ui/ui-text-core/api/0.1.0-dev09.txt
@@ -0,0 +1,926 @@
+// Signature format: 3.0
+package androidx.ui.input {
+
+  public final class BackspaceKeyEditOp implements androidx.ui.input.EditOperation {
+    ctor public BackspaceKeyEditOp();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class CommitTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public CommitTextEditOp(String text, int newCursorPosition);
+    method public String component1();
+    method public int component2();
+    method public androidx.ui.input.CommitTextEditOp copy(String text, int newCursorPosition);
+    method public int getNewCursorPosition();
+    method public String getText();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public DeleteSurroundingTextEditOp(int beforeLength, int afterLength);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.DeleteSurroundingTextEditOp copy(int beforeLength, int afterLength);
+    method public int getAfterLength();
+    method public int getBeforeLength();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextInCodePointsEditOp implements androidx.ui.input.EditOperation {
+    ctor public DeleteSurroundingTextInCodePointsEditOp(int beforeLength, int afterLength);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.DeleteSurroundingTextInCodePointsEditOp copy(int beforeLength, int afterLength);
+    method public int getAfterLength();
+    method public int getBeforeLength();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public interface EditOperation {
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class EditingBuffer {
+    ctor public EditingBuffer(String initialText, androidx.ui.text.TextRange initialSelection);
+    field public static final int NOWHERE = -1; // 0xffffffff
+  }
+
+  public final class EditorValue {
+    ctor public EditorValue(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
+    ctor public EditorValue();
+    method public String component1();
+    method public androidx.ui.text.TextRange component2();
+    method public androidx.ui.text.TextRange? component3();
+    method public androidx.ui.input.EditorValue copy(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
+    method public androidx.ui.text.TextRange? getComposition();
+    method public String getSelectedText();
+    method public androidx.ui.text.TextRange getSelection();
+    method public String getText();
+    method public String getTextAfterSelection(int maxChars);
+    method public String getTextBeforeSelection(int maxChars);
+  }
+
+  public final class FinishComposingTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public FinishComposingTextEditOp();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public enum ImeAction {
+    enum_constant public static final androidx.ui.input.ImeAction Done;
+    enum_constant public static final androidx.ui.input.ImeAction Go;
+    enum_constant public static final androidx.ui.input.ImeAction Next;
+    enum_constant public static final androidx.ui.input.ImeAction NoAction;
+    enum_constant public static final androidx.ui.input.ImeAction Previous;
+    enum_constant public static final androidx.ui.input.ImeAction Search;
+    enum_constant public static final androidx.ui.input.ImeAction Send;
+    enum_constant public static final androidx.ui.input.ImeAction Unspecified;
+  }
+
+  public interface InputEventListener {
+    method public void onEditOperations(java.util.List<? extends androidx.ui.input.EditOperation> editOps);
+    method public void onImeAction(androidx.ui.input.ImeAction imeAction);
+  }
+
+  public enum KeyboardType {
+    enum_constant public static final androidx.ui.input.KeyboardType Ascii;
+    enum_constant public static final androidx.ui.input.KeyboardType Email;
+    enum_constant public static final androidx.ui.input.KeyboardType Number;
+    enum_constant public static final androidx.ui.input.KeyboardType NumberPassword;
+    enum_constant public static final androidx.ui.input.KeyboardType Password;
+    enum_constant public static final androidx.ui.input.KeyboardType Phone;
+    enum_constant public static final androidx.ui.input.KeyboardType Text;
+    enum_constant public static final androidx.ui.input.KeyboardType Uri;
+  }
+
+  public final class MoveCursorEditOp implements androidx.ui.input.EditOperation {
+    ctor public MoveCursorEditOp(int amount);
+    method public int component1();
+    method public androidx.ui.input.MoveCursorEditOp copy(int amount);
+    method public int getAmount();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public interface OffsetMap {
+    method public int originalToTransformed(int offset);
+    method public int transformedToOriginal(int offset);
+    field public static final androidx.ui.input.OffsetMap.Companion! Companion;
+  }
+
+  public static final class OffsetMap.Companion {
+    method public androidx.ui.input.OffsetMap getIdentityOffsetMap();
+    property public final androidx.ui.input.OffsetMap identityOffsetMap;
+  }
+
+  public final class PasswordVisualTransformation implements androidx.ui.input.VisualTransformation {
+    ctor public PasswordVisualTransformation(char mask);
+    ctor public PasswordVisualTransformation();
+    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+    method public char getMask();
+  }
+
+  public interface PlatformTextInputService {
+    method public void hideSoftwareKeyboard();
+    method public void notifyFocusedRect(androidx.ui.geometry.Rect rect);
+    method public void onStateUpdated(androidx.ui.input.EditorValue model);
+    method public void showSoftwareKeyboard();
+    method public void startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput();
+  }
+
+  public final class SetComposingRegionEditOp implements androidx.ui.input.EditOperation {
+    ctor public SetComposingRegionEditOp(int start, int end);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.SetComposingRegionEditOp copy(int start, int end);
+    method public int getEnd();
+    method public int getStart();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class SetComposingTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public SetComposingTextEditOp(String text, int newCursorPosition);
+    method public String component1();
+    method public int component2();
+    method public androidx.ui.input.SetComposingTextEditOp copy(String text, int newCursorPosition);
+    method public int getNewCursorPosition();
+    method public String getText();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class SetSelectionEditOp implements androidx.ui.input.EditOperation {
+    ctor public SetSelectionEditOp(int start, int end);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.SetSelectionEditOp copy(int start, int end);
+    method public int getEnd();
+    method public int getStart();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public class TextInputService {
+    ctor public TextInputService(androidx.ui.input.PlatformTextInputService platformTextInputService);
+    method public void hideSoftwareKeyboard(int token);
+    method public void notifyFocusedRect(int token, androidx.ui.geometry.Rect rect);
+    method public void onStateUpdated(int token, androidx.ui.input.EditorValue model);
+    method public void showSoftwareKeyboard(int token);
+    method public int startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput(int token);
+  }
+
+  public final class TextInputServiceKt {
+    field public static final int INVALID_SESSION = -1; // 0xffffffff
+    field public static final int NO_SESSION = 0; // 0x0
+  }
+
+  public final class TransformedText {
+    ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+    method public androidx.ui.text.AnnotatedString component1();
+    method public androidx.ui.input.OffsetMap component2();
+    method public androidx.ui.input.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+    method public androidx.ui.input.OffsetMap getOffsetMap();
+    method public androidx.ui.text.AnnotatedString getTransformedText();
+  }
+
+  public interface VisualTransformation {
+    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+  }
+
+}
+
+package androidx.ui.text {
+
+  public final class AnnotatedString {
+    ctor public AnnotatedString(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles);
+    method public String component1();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> component2();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> component3();
+    method public androidx.ui.text.AnnotatedString copy(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> annotations);
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> getParagraphStyles();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> getSpanStyles();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> getStringAnnotations(String scope, int start, int end);
+    method public String getText();
+    method public operator androidx.ui.text.AnnotatedString plus(androidx.ui.text.AnnotatedString other);
+  }
+
+  public static final class AnnotatedString.Builder {
+    ctor public AnnotatedString.Builder(int capacity);
+    ctor public AnnotatedString.Builder();
+    ctor public AnnotatedString.Builder(String text);
+    ctor public AnnotatedString.Builder(androidx.ui.text.AnnotatedString text);
+    method public void addAnnotationString(String scope, String annotation, int start, int end);
+    method public void addStyle(androidx.ui.text.SpanStyle style, int start, int end);
+    method public void addStyle(androidx.ui.text.ParagraphStyle style, int start, int end);
+    method public void append(String text);
+    method public void append(char p);
+    method public void append(androidx.ui.text.AnnotatedString text);
+    method public int getLength();
+    method public void pop();
+    method public void pop(int index);
+    method public int pushStringAnnotation(String scope, String annotation);
+    method public int pushStyle(androidx.ui.text.SpanStyle style);
+    method public int pushStyle(androidx.ui.text.ParagraphStyle style);
+    method public androidx.ui.text.AnnotatedString toAnnotatedString();
+    property public final int length;
+  }
+
+  public static final class AnnotatedString.Item<T> {
+    ctor public AnnotatedString.Item(T! item, int start, int end, String scope);
+    ctor public AnnotatedString.Item(T! item, int start, int end);
+    method public T! component1();
+    method public int component2();
+    method public int component3();
+    method public String component4();
+    method public androidx.ui.text.AnnotatedString.Item<T> copy(T! item, int start, int end, String scope);
+    method public int getEnd();
+    method public T! getItem();
+    method public String getScope();
+    method public int getStart();
+  }
+
+  public final class AnnotatedStringKt {
+    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.SpanStyle spanStyle, androidx.ui.text.ParagraphStyle? paragraphStyle = null);
+    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.ParagraphStyle paragraphStyle);
+    method public static inline androidx.ui.text.AnnotatedString AnnotatedString(kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
+    method public static androidx.ui.text.AnnotatedString capitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static androidx.ui.text.AnnotatedString decapitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static int getLength(androidx.ui.text.AnnotatedString);
+    method public static androidx.ui.text.AnnotatedString subSequence(androidx.ui.text.AnnotatedString, int start, int end);
+    method public static androidx.ui.text.AnnotatedString toLowerCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static androidx.ui.text.AnnotatedString toUpperCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
+    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
+  }
+
+  public final class Locale {
+    ctor public Locale(String languageTag);
+    method public String getLanguage();
+    method public String getRegion();
+    method public String getScript();
+    method public String toLanguageTag();
+    property public final String language;
+    property public final String region;
+    property public final String script;
+    field public static final androidx.ui.text.Locale.Companion! Companion;
+  }
+
+  public static final class Locale.Companion {
+    method public androidx.ui.text.Locale getCurrent();
+    property public final androidx.ui.text.Locale current;
+  }
+
+  public final class LocaleList implements java.util.Collection<androidx.ui.text.Locale> kotlin.jvm.internal.markers.KMappedMarker {
+    ctor public LocaleList(java.util.List<androidx.ui.text.Locale> localeList);
+    ctor public LocaleList(String languageTags);
+    ctor public LocaleList(androidx.ui.text.Locale... locales);
+    method public java.util.List<androidx.ui.text.Locale> component1();
+    method public operator boolean contains(androidx.ui.text.Locale element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public androidx.ui.text.LocaleList copy(java.util.List<androidx.ui.text.Locale> localeList);
+    method public operator androidx.ui.text.Locale get(int i);
+    method public java.util.List<androidx.ui.text.Locale> getLocaleList();
+    method public int getSize();
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.ui.text.Locale> iterator();
+    property public int size;
+    field public static final androidx.ui.text.LocaleList.Companion! Companion;
+  }
+
+  public static final class LocaleList.Companion {
+    method public androidx.ui.text.LocaleList getCurrent();
+    property public final androidx.ui.text.LocaleList current;
+  }
+
+  public final class MultiParagraph {
+    ctor public MultiParagraph(androidx.ui.text.MultiParagraphIntrinsics intrinsics, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints);
+    ctor public MultiParagraph(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
+    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public androidx.ui.text.MultiParagraphIntrinsics getIntrinsics();
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineForOffset(int offset);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public int getMaxLines();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
+    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
+    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public androidx.ui.text.TextRange getWordBoundary(int offset);
+    method public void paint(androidx.ui.graphics.Canvas canvas);
+    property public final boolean didExceedMaxLines;
+    property public final float firstBaseline;
+    property public final float height;
+    property public final float lastBaseline;
+    property public final int lineCount;
+    property public final float maxIntrinsicWidth;
+    property public final float minIntrinsicWidth;
+    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
+    property public final float width;
+  }
+
+  public final class MultiParagraphIntrinsics implements androidx.ui.text.ParagraphIntrinsics {
+    ctor public MultiParagraphIntrinsics(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public androidx.ui.text.AnnotatedString getAnnotatedString();
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
+    property public float maxIntrinsicWidth;
+    property public float minIntrinsicWidth;
+  }
+
+  public final class MultiParagraphIntrinsicsKt {
+  }
+
+  public final class MultiParagraphKt {
+  }
+
+  public interface Paragraph {
+    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
+    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineForOffset(int offset);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
+    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
+    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public androidx.ui.text.TextRange getWordBoundary(int offset);
+    method public void paint(androidx.ui.graphics.Canvas canvas);
+    property public abstract boolean didExceedMaxLines;
+    property public abstract float firstBaseline;
+    property public abstract float height;
+    property public abstract float lastBaseline;
+    property public abstract int lineCount;
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+    property public abstract java.util.List<androidx.ui.geometry.Rect> placeholderRects;
+    property public abstract float width;
+  }
+
+  public final class ParagraphConstraints {
+    ctor public ParagraphConstraints(float width);
+    method public float component1();
+    method public androidx.ui.text.ParagraphConstraints copy(float width);
+    method public float getWidth();
+  }
+
+  public interface ParagraphIntrinsics {
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+  }
+
+  public final class ParagraphIntrinsicsKt {
+    method public static androidx.ui.text.ParagraphIntrinsics ParagraphIntrinsics(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+  }
+
+  public final class ParagraphKt {
+    method public static androidx.ui.text.Paragraph Paragraph(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public static androidx.ui.text.Paragraph Paragraph(androidx.ui.text.ParagraphIntrinsics paragraphIntrinsics, int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints);
+  }
+
+  public final class ParagraphStyle {
+    ctor public ParagraphStyle(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    ctor public ParagraphStyle();
+    method public androidx.ui.text.style.TextAlign? component1();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? component2();
+    method public androidx.ui.unit.TextUnit component3();
+    method public androidx.ui.text.style.TextIndent? component4();
+    method public androidx.ui.text.ParagraphStyle copy(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    method public androidx.ui.unit.TextUnit getLineHeight();
+    method public androidx.ui.text.style.TextAlign? getTextAlign();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
+    method public androidx.ui.text.style.TextIndent? getTextIndent();
+    method public androidx.ui.text.ParagraphStyle merge(androidx.ui.text.ParagraphStyle? other = null);
+  }
+
+  public final class ParagraphStyleKt {
+    method public static androidx.ui.text.ParagraphStyle lerp(androidx.ui.text.ParagraphStyle start, androidx.ui.text.ParagraphStyle stop, float fraction);
+  }
+
+  public final class Placeholder {
+    ctor public Placeholder(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
+    method public androidx.ui.unit.TextUnit component1();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.PlaceholderVerticalAlign component3();
+    method public androidx.ui.text.Placeholder copy(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
+    method public androidx.ui.unit.TextUnit getHeight();
+    method public androidx.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
+    method public androidx.ui.unit.TextUnit getWidth();
+  }
+
+  public enum PlaceholderVerticalAlign {
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign AboveBaseline;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Bottom;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Center;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextBottom;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextCenter;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextTop;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Top;
+  }
+
+  public final class SpanStyle {
+    ctor public SpanStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
+    ctor public SpanStyle();
+    method public androidx.ui.graphics.Color? component1();
+    method public androidx.ui.text.style.TextGeometricTransform? component10();
+    method public androidx.ui.text.LocaleList? component11();
+    method public androidx.ui.graphics.Color? component12();
+    method public androidx.ui.text.style.TextDecoration? component13();
+    method public androidx.ui.graphics.Shadow? component14();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.font.FontWeight? component3();
+    method public androidx.ui.text.font.FontStyle? component4();
+    method public androidx.ui.text.font.FontSynthesis? component5();
+    method public androidx.ui.text.font.FontFamily? component6();
+    method public String? component7();
+    method public androidx.ui.unit.TextUnit component8();
+    method public androidx.ui.text.style.BaselineShift? component9();
+    method public androidx.ui.text.SpanStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
+    method public androidx.ui.graphics.Color? getBackground();
+    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
+    method public androidx.ui.graphics.Color? getColor();
+    method public androidx.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public androidx.ui.unit.TextUnit getFontSize();
+    method public androidx.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.ui.text.font.FontWeight? getFontWeight();
+    method public androidx.ui.unit.TextUnit getLetterSpacing();
+    method public androidx.ui.text.LocaleList? getLocaleList();
+    method public androidx.ui.graphics.Shadow? getShadow();
+    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
+    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
+    method public androidx.ui.text.SpanStyle merge(androidx.ui.text.SpanStyle? other = null);
+  }
+
+  public final class SpanStyleKt {
+    method public static androidx.ui.text.SpanStyle lerp(androidx.ui.text.SpanStyle start, androidx.ui.text.SpanStyle stop, float fraction);
+  }
+
+  public final class StringKt {
+    method public static String capitalize(String, androidx.ui.text.Locale locale);
+    method public static String capitalize(String, androidx.ui.text.LocaleList localeList);
+    method public static String decapitalize(String, androidx.ui.text.Locale locale);
+    method public static String decapitalize(String, androidx.ui.text.LocaleList localeList);
+    method public static String toLowerCase(String, androidx.ui.text.Locale locale);
+    method public static String toLowerCase(String, androidx.ui.text.LocaleList localeList);
+    method public static String toUpperCase(String, androidx.ui.text.Locale locale);
+    method public static String toUpperCase(String, androidx.ui.text.LocaleList localeList);
+  }
+
+  public final class TextLayoutHelperKt {
+  }
+
+  public final class TextLayoutInput {
+    ctor public TextLayoutInput(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
+    method public androidx.ui.text.AnnotatedString component1();
+    method public androidx.ui.core.Constraints component10();
+    method public androidx.ui.text.TextStyle component2();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> component3();
+    method public int component4();
+    method public boolean component5();
+    method public androidx.ui.text.style.TextOverflow component6();
+    method public androidx.ui.unit.Density component7();
+    method public androidx.ui.core.LayoutDirection component8();
+    method public androidx.ui.text.font.Font.ResourceLoader component9();
+    method public androidx.ui.text.TextLayoutInput copy(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
+    method public androidx.ui.core.Constraints getConstraints();
+    method public androidx.ui.unit.Density getDensity();
+    method public androidx.ui.core.LayoutDirection getLayoutDirection();
+    method public int getMaxLines();
+    method public androidx.ui.text.style.TextOverflow getOverflow();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
+    method public androidx.ui.text.font.Font.ResourceLoader getResourceLoader();
+    method public boolean getSoftWrap();
+    method public androidx.ui.text.TextStyle getStyle();
+    method public androidx.ui.text.AnnotatedString getText();
+  }
+
+  public final class TextLayoutResult {
+    method public androidx.ui.text.TextLayoutInput component1();
+    method public androidx.ui.unit.IntPxSize component3();
+    method public androidx.ui.text.TextLayoutResult copy(androidx.ui.text.TextLayoutInput layoutInput, androidx.ui.text.MultiParagraph multiParagraph, androidx.ui.unit.IntPxSize size);
+    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
+    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidOverflowHeight();
+    method public boolean getDidOverflowWidth();
+    method public androidx.ui.unit.Px getFirstBaseline();
+    method public boolean getHasVisualOverflow();
+    method public androidx.ui.unit.Px getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public androidx.ui.unit.Px getLastBaseline();
+    method public androidx.ui.text.TextLayoutInput getLayoutInput();
+    method public androidx.ui.unit.Px getLineBottom(int lineIndex);
+    method public int getLineForOffset(int offset);
+    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
+    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
+    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
+    method public androidx.ui.unit.IntPxSize getSize();
+    method public androidx.ui.text.TextRange getWordBoundary(int offset);
+    property public final boolean didOverflowHeight;
+    property public final boolean didOverflowWidth;
+    property public final androidx.ui.unit.Px firstBaseline;
+    property public final boolean hasVisualOverflow;
+    property public final androidx.ui.unit.Px lastBaseline;
+    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
+  }
+
+  public final class TextPainter {
+    method public void paint(androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
+    field public static final androidx.ui.text.TextPainter! INSTANCE;
+  }
+
+  public final class TextRange {
+    ctor public TextRange(int start, int end);
+    method public int component1();
+    method public int component2();
+    method public operator boolean contains(androidx.ui.text.TextRange other);
+    method public operator boolean contains(int offset);
+    method public androidx.ui.text.TextRange copy(int start, int end);
+    method public boolean getCollapsed();
+    method public int getEnd();
+    method public int getLength();
+    method public int getMax();
+    method public int getMin();
+    method public int getStart();
+    method public boolean intersects(androidx.ui.text.TextRange other);
+    property public final boolean collapsed;
+    property public final int length;
+    property public final int max;
+    property public final int min;
+  }
+
+  public final class TextRangeKt {
+    method public static String substring(CharSequence, androidx.ui.text.TextRange range);
+  }
+
+  public final class TextStyle {
+    ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    ctor public TextStyle();
+    method public androidx.ui.graphics.Color? component1();
+    method public androidx.ui.text.style.TextGeometricTransform? component10();
+    method public androidx.ui.text.LocaleList? component11();
+    method public androidx.ui.graphics.Color? component12();
+    method public androidx.ui.text.style.TextDecoration? component13();
+    method public androidx.ui.graphics.Shadow? component14();
+    method public androidx.ui.text.style.TextAlign? component15();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? component16();
+    method public androidx.ui.unit.TextUnit component17();
+    method public androidx.ui.text.style.TextIndent? component18();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.font.FontWeight? component3();
+    method public androidx.ui.text.font.FontStyle? component4();
+    method public androidx.ui.text.font.FontSynthesis? component5();
+    method public androidx.ui.text.font.FontFamily? component6();
+    method public String? component7();
+    method public androidx.ui.unit.TextUnit component8();
+    method public androidx.ui.text.style.BaselineShift? component9();
+    method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    method public androidx.ui.graphics.Color? getBackground();
+    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
+    method public androidx.ui.graphics.Color? getColor();
+    method public androidx.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public androidx.ui.unit.TextUnit getFontSize();
+    method public androidx.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.ui.text.font.FontWeight? getFontWeight();
+    method public androidx.ui.unit.TextUnit getLetterSpacing();
+    method public androidx.ui.unit.TextUnit getLineHeight();
+    method public androidx.ui.text.LocaleList? getLocaleList();
+    method public androidx.ui.graphics.Shadow? getShadow();
+    method public androidx.ui.text.style.TextAlign? getTextAlign();
+    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
+    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
+    method public androidx.ui.text.style.TextIndent? getTextIndent();
+    method public androidx.ui.text.TextStyle merge(androidx.ui.text.TextStyle? other = null);
+    method public androidx.ui.text.TextStyle merge(androidx.ui.text.SpanStyle other);
+    method public androidx.ui.text.TextStyle merge(androidx.ui.text.ParagraphStyle other);
+    method public androidx.ui.text.ParagraphStyle toParagraphStyle();
+    method public androidx.ui.text.SpanStyle toSpanStyle();
+    field public static final androidx.ui.text.TextStyle.Companion! Companion;
+  }
+
+  public static final class TextStyle.Companion {
+    method public androidx.ui.text.TextStyle getDefault();
+    property public final androidx.ui.text.TextStyle Default;
+  }
+
+  public final class TextStyleKt {
+    method public static androidx.ui.text.TextStyle lerp(androidx.ui.text.TextStyle start, androidx.ui.text.TextStyle stop, float fraction);
+    method public static androidx.ui.text.TextStyle resolveDefaults(androidx.ui.text.TextStyle style, androidx.ui.core.LayoutDirection direction);
+  }
+
+  public interface Typeface {
+    method public androidx.ui.text.font.FontFamily getFontFamily();
+    property public abstract androidx.ui.text.font.FontFamily fontFamily;
+  }
+
+  public final class TypefaceKt {
+    method public static androidx.ui.text.Typeface typefaceFromFontFamily(android.content.Context context, androidx.ui.text.font.FontFamily fontFamily, java.util.List<? extends kotlin.Pair<androidx.ui.text.font.FontWeight,? extends androidx.ui.text.font.FontStyle>>? necessaryStyles = null);
+  }
+
+}
+
+package androidx.ui.text.font {
+
+  public abstract sealed class FileBasedFontFamily extends androidx.ui.text.font.FontFamily {
+  }
+
+  public interface Font {
+    method public androidx.ui.text.font.FontStyle getStyle();
+    method public androidx.ui.text.font.FontWeight getWeight();
+    property public abstract androidx.ui.text.font.FontStyle style;
+    property public abstract androidx.ui.text.font.FontWeight weight;
+  }
+
+  public static interface Font.ResourceLoader {
+    method public Object load(androidx.ui.text.font.Font font);
+  }
+
+  public abstract sealed class FontFamily {
+    method public final boolean getCanLoadSynchronously();
+    field public static final androidx.ui.text.font.FontFamily.Companion! Companion;
+  }
+
+  public static final class FontFamily.Companion {
+    method public androidx.ui.text.font.GenericFontFamily getCursive();
+    method public androidx.ui.text.font.SystemFontFamily getDefault();
+    method public androidx.ui.text.font.GenericFontFamily getMonospace();
+    method public androidx.ui.text.font.GenericFontFamily getSansSerif();
+    method public androidx.ui.text.font.GenericFontFamily getSerif();
+    property public final androidx.ui.text.font.GenericFontFamily Cursive;
+    property public final androidx.ui.text.font.SystemFontFamily Default;
+    property public final androidx.ui.text.font.GenericFontFamily Monospace;
+    property public final androidx.ui.text.font.GenericFontFamily SansSerif;
+    property public final androidx.ui.text.font.GenericFontFamily Serif;
+  }
+
+  public final class FontFamilyKt {
+    method public static androidx.ui.text.font.FontListFontFamily fontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
+    method public static androidx.ui.text.font.FontListFontFamily fontFamily(androidx.ui.text.font.Font... fonts);
+    method public static androidx.ui.text.font.LoadedFontFamily fontFamily(androidx.ui.text.Typeface typeface);
+  }
+
+  public final class FontKt {
+    method public static androidx.ui.text.font.FontListFontFamily asFontFamily(androidx.ui.text.font.Font);
+    method public static androidx.ui.text.font.Font font(int resId, androidx.ui.text.font.FontWeight weight = FontWeight.Normal, androidx.ui.text.font.FontStyle style = androidx.ui.text.font.FontStyle.Normal);
+  }
+
+  public final class FontListFontFamily extends androidx.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.ui.text.font.Font> {
+    ctor public FontListFontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
+    method public java.util.List<androidx.ui.text.font.Font> component1();
+    method public boolean contains(androidx.ui.text.font.Font element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public androidx.ui.text.font.FontListFontFamily copy(java.util.List<? extends androidx.ui.text.font.Font> fonts);
+    method public androidx.ui.text.font.Font get(int index);
+    method public java.util.List<androidx.ui.text.font.Font> getFonts();
+    method public int getSize();
+    method public int indexOf(androidx.ui.text.font.Font element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.ui.text.font.Font> iterator();
+    method public int lastIndexOf(androidx.ui.text.font.Font element);
+    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator();
+    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator(int index);
+    method public java.util.List<androidx.ui.text.font.Font> subList(int fromIndex, int toIndex);
+  }
+
+  public enum FontStyle {
+    enum_constant public static final androidx.ui.text.font.FontStyle Italic;
+    enum_constant public static final androidx.ui.text.font.FontStyle Normal;
+  }
+
+  public enum FontSynthesis {
+    enum_constant public static final androidx.ui.text.font.FontSynthesis All;
+    enum_constant public static final androidx.ui.text.font.FontSynthesis None;
+    enum_constant public static final androidx.ui.text.font.FontSynthesis Style;
+    enum_constant public static final androidx.ui.text.font.FontSynthesis Weight;
+  }
+
+  public final class FontWeight implements java.lang.Comparable<androidx.ui.text.font.FontWeight> {
+    method public int compareTo(androidx.ui.text.font.FontWeight other);
+    method public androidx.ui.text.font.FontWeight copy(int weight);
+    field public static final androidx.ui.text.font.FontWeight.Companion! Companion;
+  }
+
+  public static final class FontWeight.Companion {
+    method public androidx.ui.text.font.FontWeight getBlack();
+    method public androidx.ui.text.font.FontWeight getBold();
+    method public androidx.ui.text.font.FontWeight getExtraBold();
+    method public androidx.ui.text.font.FontWeight getExtraLight();
+    method public androidx.ui.text.font.FontWeight getLight();
+    method public androidx.ui.text.font.FontWeight getMedium();
+    method public androidx.ui.text.font.FontWeight getNormal();
+    method public androidx.ui.text.font.FontWeight getSemiBold();
+    method public androidx.ui.text.font.FontWeight getThin();
+    method public androidx.ui.text.font.FontWeight getW100();
+    method public androidx.ui.text.font.FontWeight getW200();
+    method public androidx.ui.text.font.FontWeight getW300();
+    method public androidx.ui.text.font.FontWeight getW400();
+    method public androidx.ui.text.font.FontWeight getW500();
+    method public androidx.ui.text.font.FontWeight getW600();
+    method public androidx.ui.text.font.FontWeight getW700();
+    method public androidx.ui.text.font.FontWeight getW800();
+    method public androidx.ui.text.font.FontWeight getW900();
+    property public final androidx.ui.text.font.FontWeight Black;
+    property public final androidx.ui.text.font.FontWeight Bold;
+    property public final androidx.ui.text.font.FontWeight ExtraBold;
+    property public final androidx.ui.text.font.FontWeight ExtraLight;
+    property public final androidx.ui.text.font.FontWeight Light;
+    property public final androidx.ui.text.font.FontWeight Medium;
+    property public final androidx.ui.text.font.FontWeight Normal;
+    property public final androidx.ui.text.font.FontWeight SemiBold;
+    property public final androidx.ui.text.font.FontWeight Thin;
+    property public final androidx.ui.text.font.FontWeight W100;
+    property public final androidx.ui.text.font.FontWeight W200;
+    property public final androidx.ui.text.font.FontWeight W300;
+    property public final androidx.ui.text.font.FontWeight W400;
+    property public final androidx.ui.text.font.FontWeight W500;
+    property public final androidx.ui.text.font.FontWeight W600;
+    property public final androidx.ui.text.font.FontWeight W700;
+    property public final androidx.ui.text.font.FontWeight W800;
+    property public final androidx.ui.text.font.FontWeight W900;
+  }
+
+  public final class FontWeightKt {
+    method public static androidx.ui.text.font.FontWeight lerp(androidx.ui.text.font.FontWeight start, androidx.ui.text.font.FontWeight stop, float fraction);
+  }
+
+  public final class GenericFontFamily extends androidx.ui.text.font.SystemFontFamily {
+    method public String getName();
+  }
+
+  public final class LoadedFontFamily extends androidx.ui.text.font.FontFamily {
+    ctor public LoadedFontFamily(androidx.ui.text.Typeface typeface);
+    method public androidx.ui.text.Typeface component1();
+    method public androidx.ui.text.font.LoadedFontFamily copy(androidx.ui.text.Typeface typeface);
+    method public androidx.ui.text.Typeface getTypeface();
+  }
+
+  public final class ResourceFont implements androidx.ui.text.font.Font {
+    ctor public ResourceFont(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
+    method public int component1();
+    method public androidx.ui.text.font.FontWeight component2();
+    method public androidx.ui.text.font.FontStyle component3();
+    method public androidx.ui.text.font.ResourceFont copy(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
+    method public int getResId();
+    method public androidx.ui.text.font.FontStyle getStyle();
+    method public androidx.ui.text.font.FontWeight getWeight();
+  }
+
+  public abstract sealed class SystemFontFamily extends androidx.ui.text.font.FontFamily {
+  }
+
+}
+
+package androidx.ui.text.platform {
+
+  public final class AndroidParagraphHelperKt {
+  }
+
+  public final class AndroidParagraphKt {
+  }
+
+  public final class PlatformLocaleKt {
+  }
+
+}
+
+package androidx.ui.text.style {
+
+  public final class BaselineShift {
+    ctor public BaselineShift(float multiplier);
+    method public float component1();
+    method public androidx.ui.text.style.BaselineShift copy(float multiplier);
+    method public float getMultiplier();
+    field public static final androidx.ui.text.style.BaselineShift.Companion! Companion;
+  }
+
+  public static final class BaselineShift.Companion {
+    method public androidx.ui.text.style.BaselineShift getNone();
+    method public androidx.ui.text.style.BaselineShift getSubscript();
+    method public androidx.ui.text.style.BaselineShift getSuperscript();
+    property public final androidx.ui.text.style.BaselineShift None;
+    property public final androidx.ui.text.style.BaselineShift Subscript;
+    property public final androidx.ui.text.style.BaselineShift Superscript;
+  }
+
+  public final class BaselineShiftKt {
+    method public static androidx.ui.text.style.BaselineShift lerp(androidx.ui.text.style.BaselineShift start, androidx.ui.text.style.BaselineShift stop, float fraction);
+  }
+
+  public enum TextAlign {
+    enum_constant public static final androidx.ui.text.style.TextAlign Center;
+    enum_constant public static final androidx.ui.text.style.TextAlign End;
+    enum_constant public static final androidx.ui.text.style.TextAlign Justify;
+    enum_constant public static final androidx.ui.text.style.TextAlign Left;
+    enum_constant public static final androidx.ui.text.style.TextAlign Right;
+    enum_constant public static final androidx.ui.text.style.TextAlign Start;
+  }
+
+  public final class TextDecoration {
+    method public int component1();
+    method public boolean contains(androidx.ui.text.style.TextDecoration other);
+    method public androidx.ui.text.style.TextDecoration copy(int mask);
+    method public int getMask();
+    field public static final androidx.ui.text.style.TextDecoration.Companion! Companion;
+  }
+
+  public static final class TextDecoration.Companion {
+    method public androidx.ui.text.style.TextDecoration combine(java.util.List<androidx.ui.text.style.TextDecoration> decorations);
+    method public androidx.ui.text.style.TextDecoration getLineThrough();
+    method public androidx.ui.text.style.TextDecoration getNone();
+    method public androidx.ui.text.style.TextDecoration getUnderline();
+    property public final androidx.ui.text.style.TextDecoration LineThrough;
+    property public final androidx.ui.text.style.TextDecoration None;
+    property public final androidx.ui.text.style.TextDecoration Underline;
+  }
+
+  public enum TextDirection {
+    enum_constant public static final androidx.ui.text.style.TextDirection Ltr;
+    enum_constant public static final androidx.ui.text.style.TextDirection Rtl;
+  }
+
+  public enum TextDirectionAlgorithm {
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrLtr;
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrRtl;
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceLtr;
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceRtl;
+  }
+
+  public final class TextGeometricTransform {
+    ctor public TextGeometricTransform(float scaleX, float skewX);
+    ctor public TextGeometricTransform();
+    method public float component1();
+    method public float component2();
+    method public androidx.ui.text.style.TextGeometricTransform copy(float scaleX, float skewX);
+    method public float getScaleX();
+    method public float getSkewX();
+    field public static final androidx.ui.text.style.TextGeometricTransform.Companion! Companion;
+  }
+
+  public static final class TextGeometricTransform.Companion {
+  }
+
+  public final class TextGeometricTransformKt {
+    method public static androidx.ui.text.style.TextGeometricTransform lerp(androidx.ui.text.style.TextGeometricTransform start, androidx.ui.text.style.TextGeometricTransform stop, float fraction);
+  }
+
+  public final class TextIndent {
+    ctor public TextIndent(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
+    ctor public TextIndent();
+    method public androidx.ui.unit.TextUnit component1();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.style.TextIndent copy(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
+    method public androidx.ui.unit.TextUnit getFirstLine();
+    method public androidx.ui.unit.TextUnit getRestLine();
+    field public static final androidx.ui.text.style.TextIndent.Companion! Companion;
+  }
+
+  public static final class TextIndent.Companion {
+    method public androidx.ui.text.style.TextIndent getNone();
+    property public final androidx.ui.text.style.TextIndent None;
+  }
+
+  public final class TextIndentKt {
+    method public static androidx.ui.text.style.TextIndent lerp(androidx.ui.text.style.TextIndent start, androidx.ui.text.style.TextIndent stop, float fraction);
+  }
+
+  public enum TextOverflow {
+    enum_constant public static final androidx.ui.text.style.TextOverflow Clip;
+    enum_constant public static final androidx.ui.text.style.TextOverflow Ellipsis;
+  }
+
+}
+
diff --git a/ui/ui-text/api/api_lint.ignore b/ui/ui-text-core/api/api_lint.ignore
similarity index 100%
rename from ui/ui-text/api/api_lint.ignore
rename to ui/ui-text-core/api/api_lint.ignore
diff --git a/ui/ui-text-core/api/current.txt b/ui/ui-text-core/api/current.txt
new file mode 100644
index 0000000..1df7e9d0
--- /dev/null
+++ b/ui/ui-text-core/api/current.txt
@@ -0,0 +1,926 @@
+// Signature format: 3.0
+package androidx.ui.input {
+
+  public final class BackspaceKeyEditOp implements androidx.ui.input.EditOperation {
+    ctor public BackspaceKeyEditOp();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class CommitTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public CommitTextEditOp(String text, int newCursorPosition);
+    method public String component1();
+    method public int component2();
+    method public androidx.ui.input.CommitTextEditOp copy(String text, int newCursorPosition);
+    method public int getNewCursorPosition();
+    method public String getText();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public DeleteSurroundingTextEditOp(int beforeLength, int afterLength);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.DeleteSurroundingTextEditOp copy(int beforeLength, int afterLength);
+    method public int getAfterLength();
+    method public int getBeforeLength();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextInCodePointsEditOp implements androidx.ui.input.EditOperation {
+    ctor public DeleteSurroundingTextInCodePointsEditOp(int beforeLength, int afterLength);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.DeleteSurroundingTextInCodePointsEditOp copy(int beforeLength, int afterLength);
+    method public int getAfterLength();
+    method public int getBeforeLength();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public interface EditOperation {
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class EditingBuffer {
+    ctor public EditingBuffer(String initialText, androidx.ui.text.TextRange initialSelection);
+    field public static final int NOWHERE = -1; // 0xffffffff
+  }
+
+  public final class EditorValue {
+    ctor public EditorValue(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
+    ctor public EditorValue();
+    method public String component1();
+    method public androidx.ui.text.TextRange component2();
+    method public androidx.ui.text.TextRange? component3();
+    method public androidx.ui.input.EditorValue copy(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
+    method public androidx.ui.text.TextRange? getComposition();
+    method public String getSelectedText();
+    method public androidx.ui.text.TextRange getSelection();
+    method public String getText();
+    method public String getTextAfterSelection(int maxChars);
+    method public String getTextBeforeSelection(int maxChars);
+  }
+
+  public final class FinishComposingTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public FinishComposingTextEditOp();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public enum ImeAction {
+    enum_constant public static final androidx.ui.input.ImeAction Done;
+    enum_constant public static final androidx.ui.input.ImeAction Go;
+    enum_constant public static final androidx.ui.input.ImeAction Next;
+    enum_constant public static final androidx.ui.input.ImeAction NoAction;
+    enum_constant public static final androidx.ui.input.ImeAction Previous;
+    enum_constant public static final androidx.ui.input.ImeAction Search;
+    enum_constant public static final androidx.ui.input.ImeAction Send;
+    enum_constant public static final androidx.ui.input.ImeAction Unspecified;
+  }
+
+  public interface InputEventListener {
+    method public void onEditOperations(java.util.List<? extends androidx.ui.input.EditOperation> editOps);
+    method public void onImeAction(androidx.ui.input.ImeAction imeAction);
+  }
+
+  public enum KeyboardType {
+    enum_constant public static final androidx.ui.input.KeyboardType Ascii;
+    enum_constant public static final androidx.ui.input.KeyboardType Email;
+    enum_constant public static final androidx.ui.input.KeyboardType Number;
+    enum_constant public static final androidx.ui.input.KeyboardType NumberPassword;
+    enum_constant public static final androidx.ui.input.KeyboardType Password;
+    enum_constant public static final androidx.ui.input.KeyboardType Phone;
+    enum_constant public static final androidx.ui.input.KeyboardType Text;
+    enum_constant public static final androidx.ui.input.KeyboardType Uri;
+  }
+
+  public final class MoveCursorEditOp implements androidx.ui.input.EditOperation {
+    ctor public MoveCursorEditOp(int amount);
+    method public int component1();
+    method public androidx.ui.input.MoveCursorEditOp copy(int amount);
+    method public int getAmount();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public interface OffsetMap {
+    method public int originalToTransformed(int offset);
+    method public int transformedToOriginal(int offset);
+    field public static final androidx.ui.input.OffsetMap.Companion! Companion;
+  }
+
+  public static final class OffsetMap.Companion {
+    method public androidx.ui.input.OffsetMap getIdentityOffsetMap();
+    property public final androidx.ui.input.OffsetMap identityOffsetMap;
+  }
+
+  public final class PasswordVisualTransformation implements androidx.ui.input.VisualTransformation {
+    ctor public PasswordVisualTransformation(char mask);
+    ctor public PasswordVisualTransformation();
+    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+    method public char getMask();
+  }
+
+  public interface PlatformTextInputService {
+    method public void hideSoftwareKeyboard();
+    method public void notifyFocusedRect(androidx.ui.geometry.Rect rect);
+    method public void onStateUpdated(androidx.ui.input.EditorValue model);
+    method public void showSoftwareKeyboard();
+    method public void startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput();
+  }
+
+  public final class SetComposingRegionEditOp implements androidx.ui.input.EditOperation {
+    ctor public SetComposingRegionEditOp(int start, int end);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.SetComposingRegionEditOp copy(int start, int end);
+    method public int getEnd();
+    method public int getStart();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class SetComposingTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public SetComposingTextEditOp(String text, int newCursorPosition);
+    method public String component1();
+    method public int component2();
+    method public androidx.ui.input.SetComposingTextEditOp copy(String text, int newCursorPosition);
+    method public int getNewCursorPosition();
+    method public String getText();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class SetSelectionEditOp implements androidx.ui.input.EditOperation {
+    ctor public SetSelectionEditOp(int start, int end);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.SetSelectionEditOp copy(int start, int end);
+    method public int getEnd();
+    method public int getStart();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public class TextInputService {
+    ctor public TextInputService(androidx.ui.input.PlatformTextInputService platformTextInputService);
+    method public void hideSoftwareKeyboard(int token);
+    method public void notifyFocusedRect(int token, androidx.ui.geometry.Rect rect);
+    method public void onStateUpdated(int token, androidx.ui.input.EditorValue model);
+    method public void showSoftwareKeyboard(int token);
+    method public int startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput(int token);
+  }
+
+  public final class TextInputServiceKt {
+    field public static final int INVALID_SESSION = -1; // 0xffffffff
+    field public static final int NO_SESSION = 0; // 0x0
+  }
+
+  public final class TransformedText {
+    ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+    method public androidx.ui.text.AnnotatedString component1();
+    method public androidx.ui.input.OffsetMap component2();
+    method public androidx.ui.input.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+    method public androidx.ui.input.OffsetMap getOffsetMap();
+    method public androidx.ui.text.AnnotatedString getTransformedText();
+  }
+
+  public interface VisualTransformation {
+    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+  }
+
+}
+
+package androidx.ui.text {
+
+  public final class AnnotatedString {
+    ctor public AnnotatedString(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles);
+    method public String component1();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> component2();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> component3();
+    method public androidx.ui.text.AnnotatedString copy(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> annotations);
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> getParagraphStyles();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> getSpanStyles();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> getStringAnnotations(String scope, int start, int end);
+    method public String getText();
+    method public operator androidx.ui.text.AnnotatedString plus(androidx.ui.text.AnnotatedString other);
+  }
+
+  public static final class AnnotatedString.Builder {
+    ctor public AnnotatedString.Builder(int capacity);
+    ctor public AnnotatedString.Builder();
+    ctor public AnnotatedString.Builder(String text);
+    ctor public AnnotatedString.Builder(androidx.ui.text.AnnotatedString text);
+    method public void addAnnotationString(String scope, String annotation, int start, int end);
+    method public void addStyle(androidx.ui.text.SpanStyle style, int start, int end);
+    method public void addStyle(androidx.ui.text.ParagraphStyle style, int start, int end);
+    method public void append(String text);
+    method public void append(char p);
+    method public void append(androidx.ui.text.AnnotatedString text);
+    method public int getLength();
+    method public void pop();
+    method public void pop(int index);
+    method public int pushStringAnnotation(String scope, String annotation);
+    method public int pushStyle(androidx.ui.text.SpanStyle style);
+    method public int pushStyle(androidx.ui.text.ParagraphStyle style);
+    method public androidx.ui.text.AnnotatedString toAnnotatedString();
+    property public final int length;
+  }
+
+  public static final class AnnotatedString.Item<T> {
+    ctor public AnnotatedString.Item(T! item, int start, int end, String scope);
+    ctor public AnnotatedString.Item(T! item, int start, int end);
+    method public T! component1();
+    method public int component2();
+    method public int component3();
+    method public String component4();
+    method public androidx.ui.text.AnnotatedString.Item<T> copy(T! item, int start, int end, String scope);
+    method public int getEnd();
+    method public T! getItem();
+    method public String getScope();
+    method public int getStart();
+  }
+
+  public final class AnnotatedStringKt {
+    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.SpanStyle spanStyle, androidx.ui.text.ParagraphStyle? paragraphStyle = null);
+    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.ParagraphStyle paragraphStyle);
+    method public static inline androidx.ui.text.AnnotatedString AnnotatedString(kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
+    method public static androidx.ui.text.AnnotatedString capitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static androidx.ui.text.AnnotatedString decapitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static int getLength(androidx.ui.text.AnnotatedString);
+    method public static androidx.ui.text.AnnotatedString subSequence(androidx.ui.text.AnnotatedString, int start, int end);
+    method public static androidx.ui.text.AnnotatedString toLowerCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static androidx.ui.text.AnnotatedString toUpperCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
+    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
+  }
+
+  public final class Locale {
+    ctor public Locale(String languageTag);
+    method public String getLanguage();
+    method public String getRegion();
+    method public String getScript();
+    method public String toLanguageTag();
+    property public final String language;
+    property public final String region;
+    property public final String script;
+    field public static final androidx.ui.text.Locale.Companion! Companion;
+  }
+
+  public static final class Locale.Companion {
+    method public androidx.ui.text.Locale getCurrent();
+    property public final androidx.ui.text.Locale current;
+  }
+
+  public final class LocaleList implements java.util.Collection<androidx.ui.text.Locale> kotlin.jvm.internal.markers.KMappedMarker {
+    ctor public LocaleList(java.util.List<androidx.ui.text.Locale> localeList);
+    ctor public LocaleList(String languageTags);
+    ctor public LocaleList(androidx.ui.text.Locale... locales);
+    method public java.util.List<androidx.ui.text.Locale> component1();
+    method public operator boolean contains(androidx.ui.text.Locale element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public androidx.ui.text.LocaleList copy(java.util.List<androidx.ui.text.Locale> localeList);
+    method public operator androidx.ui.text.Locale get(int i);
+    method public java.util.List<androidx.ui.text.Locale> getLocaleList();
+    method public int getSize();
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.ui.text.Locale> iterator();
+    property public int size;
+    field public static final androidx.ui.text.LocaleList.Companion! Companion;
+  }
+
+  public static final class LocaleList.Companion {
+    method public androidx.ui.text.LocaleList getCurrent();
+    property public final androidx.ui.text.LocaleList current;
+  }
+
+  public final class MultiParagraph {
+    ctor public MultiParagraph(androidx.ui.text.MultiParagraphIntrinsics intrinsics, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints);
+    ctor public MultiParagraph(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
+    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public androidx.ui.text.MultiParagraphIntrinsics getIntrinsics();
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineForOffset(int offset);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public int getMaxLines();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
+    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
+    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public androidx.ui.text.TextRange getWordBoundary(int offset);
+    method public void paint(androidx.ui.graphics.Canvas canvas);
+    property public final boolean didExceedMaxLines;
+    property public final float firstBaseline;
+    property public final float height;
+    property public final float lastBaseline;
+    property public final int lineCount;
+    property public final float maxIntrinsicWidth;
+    property public final float minIntrinsicWidth;
+    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
+    property public final float width;
+  }
+
+  public final class MultiParagraphIntrinsics implements androidx.ui.text.ParagraphIntrinsics {
+    ctor public MultiParagraphIntrinsics(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public androidx.ui.text.AnnotatedString getAnnotatedString();
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
+    property public float maxIntrinsicWidth;
+    property public float minIntrinsicWidth;
+  }
+
+  public final class MultiParagraphIntrinsicsKt {
+  }
+
+  public final class MultiParagraphKt {
+  }
+
+  public interface Paragraph {
+    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
+    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineForOffset(int offset);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
+    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
+    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public androidx.ui.text.TextRange getWordBoundary(int offset);
+    method public void paint(androidx.ui.graphics.Canvas canvas);
+    property public abstract boolean didExceedMaxLines;
+    property public abstract float firstBaseline;
+    property public abstract float height;
+    property public abstract float lastBaseline;
+    property public abstract int lineCount;
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+    property public abstract java.util.List<androidx.ui.geometry.Rect> placeholderRects;
+    property public abstract float width;
+  }
+
+  public final class ParagraphConstraints {
+    ctor public ParagraphConstraints(float width);
+    method public float component1();
+    method public androidx.ui.text.ParagraphConstraints copy(float width);
+    method public float getWidth();
+  }
+
+  public interface ParagraphIntrinsics {
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+  }
+
+  public final class ParagraphIntrinsicsKt {
+    method public static androidx.ui.text.ParagraphIntrinsics ParagraphIntrinsics(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+  }
+
+  public final class ParagraphKt {
+    method public static androidx.ui.text.Paragraph Paragraph(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public static androidx.ui.text.Paragraph Paragraph(androidx.ui.text.ParagraphIntrinsics paragraphIntrinsics, int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints);
+  }
+
+  public final class ParagraphStyle {
+    ctor public ParagraphStyle(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    ctor public ParagraphStyle();
+    method public androidx.ui.text.style.TextAlign? component1();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? component2();
+    method public androidx.ui.unit.TextUnit component3();
+    method public androidx.ui.text.style.TextIndent? component4();
+    method public androidx.ui.text.ParagraphStyle copy(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    method public androidx.ui.unit.TextUnit getLineHeight();
+    method public androidx.ui.text.style.TextAlign? getTextAlign();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
+    method public androidx.ui.text.style.TextIndent? getTextIndent();
+    method public androidx.ui.text.ParagraphStyle merge(androidx.ui.text.ParagraphStyle? other = null);
+  }
+
+  public final class ParagraphStyleKt {
+    method public static androidx.ui.text.ParagraphStyle lerp(androidx.ui.text.ParagraphStyle start, androidx.ui.text.ParagraphStyle stop, float fraction);
+  }
+
+  public final class Placeholder {
+    ctor public Placeholder(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
+    method public androidx.ui.unit.TextUnit component1();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.PlaceholderVerticalAlign component3();
+    method public androidx.ui.text.Placeholder copy(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
+    method public androidx.ui.unit.TextUnit getHeight();
+    method public androidx.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
+    method public androidx.ui.unit.TextUnit getWidth();
+  }
+
+  public enum PlaceholderVerticalAlign {
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign AboveBaseline;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Bottom;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Center;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextBottom;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextCenter;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextTop;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Top;
+  }
+
+  public final class SpanStyle {
+    ctor public SpanStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
+    ctor public SpanStyle();
+    method public androidx.ui.graphics.Color? component1();
+    method public androidx.ui.text.style.TextGeometricTransform? component10();
+    method public androidx.ui.text.LocaleList? component11();
+    method public androidx.ui.graphics.Color? component12();
+    method public androidx.ui.text.style.TextDecoration? component13();
+    method public androidx.ui.graphics.Shadow? component14();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.font.FontWeight? component3();
+    method public androidx.ui.text.font.FontStyle? component4();
+    method public androidx.ui.text.font.FontSynthesis? component5();
+    method public androidx.ui.text.font.FontFamily? component6();
+    method public String? component7();
+    method public androidx.ui.unit.TextUnit component8();
+    method public androidx.ui.text.style.BaselineShift? component9();
+    method public androidx.ui.text.SpanStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
+    method public androidx.ui.graphics.Color? getBackground();
+    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
+    method public androidx.ui.graphics.Color? getColor();
+    method public androidx.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public androidx.ui.unit.TextUnit getFontSize();
+    method public androidx.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.ui.text.font.FontWeight? getFontWeight();
+    method public androidx.ui.unit.TextUnit getLetterSpacing();
+    method public androidx.ui.text.LocaleList? getLocaleList();
+    method public androidx.ui.graphics.Shadow? getShadow();
+    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
+    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
+    method public androidx.ui.text.SpanStyle merge(androidx.ui.text.SpanStyle? other = null);
+  }
+
+  public final class SpanStyleKt {
+    method public static androidx.ui.text.SpanStyle lerp(androidx.ui.text.SpanStyle start, androidx.ui.text.SpanStyle stop, float fraction);
+  }
+
+  public final class StringKt {
+    method public static String capitalize(String, androidx.ui.text.Locale locale);
+    method public static String capitalize(String, androidx.ui.text.LocaleList localeList);
+    method public static String decapitalize(String, androidx.ui.text.Locale locale);
+    method public static String decapitalize(String, androidx.ui.text.LocaleList localeList);
+    method public static String toLowerCase(String, androidx.ui.text.Locale locale);
+    method public static String toLowerCase(String, androidx.ui.text.LocaleList localeList);
+    method public static String toUpperCase(String, androidx.ui.text.Locale locale);
+    method public static String toUpperCase(String, androidx.ui.text.LocaleList localeList);
+  }
+
+  public final class TextLayoutHelperKt {
+  }
+
+  public final class TextLayoutInput {
+    ctor public TextLayoutInput(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
+    method public androidx.ui.text.AnnotatedString component1();
+    method public androidx.ui.core.Constraints component10();
+    method public androidx.ui.text.TextStyle component2();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> component3();
+    method public int component4();
+    method public boolean component5();
+    method public androidx.ui.text.style.TextOverflow component6();
+    method public androidx.ui.unit.Density component7();
+    method public androidx.ui.core.LayoutDirection component8();
+    method public androidx.ui.text.font.Font.ResourceLoader component9();
+    method public androidx.ui.text.TextLayoutInput copy(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
+    method public androidx.ui.core.Constraints getConstraints();
+    method public androidx.ui.unit.Density getDensity();
+    method public androidx.ui.core.LayoutDirection getLayoutDirection();
+    method public int getMaxLines();
+    method public androidx.ui.text.style.TextOverflow getOverflow();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
+    method public androidx.ui.text.font.Font.ResourceLoader getResourceLoader();
+    method public boolean getSoftWrap();
+    method public androidx.ui.text.TextStyle getStyle();
+    method public androidx.ui.text.AnnotatedString getText();
+  }
+
+  public final class TextLayoutResult {
+    method public androidx.ui.text.TextLayoutInput component1();
+    method public androidx.ui.unit.IntPxSize component3();
+    method public androidx.ui.text.TextLayoutResult copy(androidx.ui.text.TextLayoutInput layoutInput, androidx.ui.text.MultiParagraph multiParagraph, androidx.ui.unit.IntPxSize size);
+    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
+    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidOverflowHeight();
+    method public boolean getDidOverflowWidth();
+    method public androidx.ui.unit.Px getFirstBaseline();
+    method public boolean getHasVisualOverflow();
+    method public androidx.ui.unit.Px getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public androidx.ui.unit.Px getLastBaseline();
+    method public androidx.ui.text.TextLayoutInput getLayoutInput();
+    method public androidx.ui.unit.Px getLineBottom(int lineIndex);
+    method public int getLineForOffset(int offset);
+    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
+    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
+    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
+    method public androidx.ui.unit.IntPxSize getSize();
+    method public androidx.ui.text.TextRange getWordBoundary(int offset);
+    property public final boolean didOverflowHeight;
+    property public final boolean didOverflowWidth;
+    property public final androidx.ui.unit.Px firstBaseline;
+    property public final boolean hasVisualOverflow;
+    property public final androidx.ui.unit.Px lastBaseline;
+    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
+  }
+
+  public final class TextPainter {
+    method public void paint(androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
+    field public static final androidx.ui.text.TextPainter! INSTANCE;
+  }
+
+  public final class TextRange {
+    ctor public TextRange(int start, int end);
+    method public int component1();
+    method public int component2();
+    method public operator boolean contains(androidx.ui.text.TextRange other);
+    method public operator boolean contains(int offset);
+    method public androidx.ui.text.TextRange copy(int start, int end);
+    method public boolean getCollapsed();
+    method public int getEnd();
+    method public int getLength();
+    method public int getMax();
+    method public int getMin();
+    method public int getStart();
+    method public boolean intersects(androidx.ui.text.TextRange other);
+    property public final boolean collapsed;
+    property public final int length;
+    property public final int max;
+    property public final int min;
+  }
+
+  public final class TextRangeKt {
+    method public static String substring(CharSequence, androidx.ui.text.TextRange range);
+  }
+
+  public final class TextStyle {
+    ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    ctor public TextStyle();
+    method public androidx.ui.graphics.Color? component1();
+    method public androidx.ui.text.style.TextGeometricTransform? component10();
+    method public androidx.ui.text.LocaleList? component11();
+    method public androidx.ui.graphics.Color? component12();
+    method public androidx.ui.text.style.TextDecoration? component13();
+    method public androidx.ui.graphics.Shadow? component14();
+    method public androidx.ui.text.style.TextAlign? component15();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? component16();
+    method public androidx.ui.unit.TextUnit component17();
+    method public androidx.ui.text.style.TextIndent? component18();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.font.FontWeight? component3();
+    method public androidx.ui.text.font.FontStyle? component4();
+    method public androidx.ui.text.font.FontSynthesis? component5();
+    method public androidx.ui.text.font.FontFamily? component6();
+    method public String? component7();
+    method public androidx.ui.unit.TextUnit component8();
+    method public androidx.ui.text.style.BaselineShift? component9();
+    method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    method public androidx.ui.graphics.Color? getBackground();
+    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
+    method public androidx.ui.graphics.Color? getColor();
+    method public androidx.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public androidx.ui.unit.TextUnit getFontSize();
+    method public androidx.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.ui.text.font.FontWeight? getFontWeight();
+    method public androidx.ui.unit.TextUnit getLetterSpacing();
+    method public androidx.ui.unit.TextUnit getLineHeight();
+    method public androidx.ui.text.LocaleList? getLocaleList();
+    method public androidx.ui.graphics.Shadow? getShadow();
+    method public androidx.ui.text.style.TextAlign? getTextAlign();
+    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
+    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
+    method public androidx.ui.text.style.TextIndent? getTextIndent();
+    method public androidx.ui.text.TextStyle merge(androidx.ui.text.TextStyle? other = null);
+    method public androidx.ui.text.TextStyle merge(androidx.ui.text.SpanStyle other);
+    method public androidx.ui.text.TextStyle merge(androidx.ui.text.ParagraphStyle other);
+    method public androidx.ui.text.ParagraphStyle toParagraphStyle();
+    method public androidx.ui.text.SpanStyle toSpanStyle();
+    field public static final androidx.ui.text.TextStyle.Companion! Companion;
+  }
+
+  public static final class TextStyle.Companion {
+    method public androidx.ui.text.TextStyle getDefault();
+    property public final androidx.ui.text.TextStyle Default;
+  }
+
+  public final class TextStyleKt {
+    method public static androidx.ui.text.TextStyle lerp(androidx.ui.text.TextStyle start, androidx.ui.text.TextStyle stop, float fraction);
+    method public static androidx.ui.text.TextStyle resolveDefaults(androidx.ui.text.TextStyle style, androidx.ui.core.LayoutDirection direction);
+  }
+
+  public interface Typeface {
+    method public androidx.ui.text.font.FontFamily getFontFamily();
+    property public abstract androidx.ui.text.font.FontFamily fontFamily;
+  }
+
+  public final class TypefaceKt {
+    method public static androidx.ui.text.Typeface typefaceFromFontFamily(android.content.Context context, androidx.ui.text.font.FontFamily fontFamily, java.util.List<? extends kotlin.Pair<androidx.ui.text.font.FontWeight,? extends androidx.ui.text.font.FontStyle>>? necessaryStyles = null);
+  }
+
+}
+
+package androidx.ui.text.font {
+
+  public abstract sealed class FileBasedFontFamily extends androidx.ui.text.font.FontFamily {
+  }
+
+  public interface Font {
+    method public androidx.ui.text.font.FontStyle getStyle();
+    method public androidx.ui.text.font.FontWeight getWeight();
+    property public abstract androidx.ui.text.font.FontStyle style;
+    property public abstract androidx.ui.text.font.FontWeight weight;
+  }
+
+  public static interface Font.ResourceLoader {
+    method public Object load(androidx.ui.text.font.Font font);
+  }
+
+  public abstract sealed class FontFamily {
+    method public final boolean getCanLoadSynchronously();
+    field public static final androidx.ui.text.font.FontFamily.Companion! Companion;
+  }
+
+  public static final class FontFamily.Companion {
+    method public androidx.ui.text.font.GenericFontFamily getCursive();
+    method public androidx.ui.text.font.SystemFontFamily getDefault();
+    method public androidx.ui.text.font.GenericFontFamily getMonospace();
+    method public androidx.ui.text.font.GenericFontFamily getSansSerif();
+    method public androidx.ui.text.font.GenericFontFamily getSerif();
+    property public final androidx.ui.text.font.GenericFontFamily Cursive;
+    property public final androidx.ui.text.font.SystemFontFamily Default;
+    property public final androidx.ui.text.font.GenericFontFamily Monospace;
+    property public final androidx.ui.text.font.GenericFontFamily SansSerif;
+    property public final androidx.ui.text.font.GenericFontFamily Serif;
+  }
+
+  public final class FontFamilyKt {
+    method public static androidx.ui.text.font.FontListFontFamily fontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
+    method public static androidx.ui.text.font.FontListFontFamily fontFamily(androidx.ui.text.font.Font... fonts);
+    method public static androidx.ui.text.font.LoadedFontFamily fontFamily(androidx.ui.text.Typeface typeface);
+  }
+
+  public final class FontKt {
+    method public static androidx.ui.text.font.FontListFontFamily asFontFamily(androidx.ui.text.font.Font);
+    method public static androidx.ui.text.font.Font font(int resId, androidx.ui.text.font.FontWeight weight = FontWeight.Normal, androidx.ui.text.font.FontStyle style = androidx.ui.text.font.FontStyle.Normal);
+  }
+
+  public final class FontListFontFamily extends androidx.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.ui.text.font.Font> {
+    ctor public FontListFontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
+    method public java.util.List<androidx.ui.text.font.Font> component1();
+    method public boolean contains(androidx.ui.text.font.Font element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public androidx.ui.text.font.FontListFontFamily copy(java.util.List<? extends androidx.ui.text.font.Font> fonts);
+    method public androidx.ui.text.font.Font get(int index);
+    method public java.util.List<androidx.ui.text.font.Font> getFonts();
+    method public int getSize();
+    method public int indexOf(androidx.ui.text.font.Font element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.ui.text.font.Font> iterator();
+    method public int lastIndexOf(androidx.ui.text.font.Font element);
+    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator();
+    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator(int index);
+    method public java.util.List<androidx.ui.text.font.Font> subList(int fromIndex, int toIndex);
+  }
+
+  public enum FontStyle {
+    enum_constant public static final androidx.ui.text.font.FontStyle Italic;
+    enum_constant public static final androidx.ui.text.font.FontStyle Normal;
+  }
+
+  public enum FontSynthesis {
+    enum_constant public static final androidx.ui.text.font.FontSynthesis All;
+    enum_constant public static final androidx.ui.text.font.FontSynthesis None;
+    enum_constant public static final androidx.ui.text.font.FontSynthesis Style;
+    enum_constant public static final androidx.ui.text.font.FontSynthesis Weight;
+  }
+
+  public final class FontWeight implements java.lang.Comparable<androidx.ui.text.font.FontWeight> {
+    method public int compareTo(androidx.ui.text.font.FontWeight other);
+    method public androidx.ui.text.font.FontWeight copy(int weight);
+    field public static final androidx.ui.text.font.FontWeight.Companion! Companion;
+  }
+
+  public static final class FontWeight.Companion {
+    method public androidx.ui.text.font.FontWeight getBlack();
+    method public androidx.ui.text.font.FontWeight getBold();
+    method public androidx.ui.text.font.FontWeight getExtraBold();
+    method public androidx.ui.text.font.FontWeight getExtraLight();
+    method public androidx.ui.text.font.FontWeight getLight();
+    method public androidx.ui.text.font.FontWeight getMedium();
+    method public androidx.ui.text.font.FontWeight getNormal();
+    method public androidx.ui.text.font.FontWeight getSemiBold();
+    method public androidx.ui.text.font.FontWeight getThin();
+    method public androidx.ui.text.font.FontWeight getW100();
+    method public androidx.ui.text.font.FontWeight getW200();
+    method public androidx.ui.text.font.FontWeight getW300();
+    method public androidx.ui.text.font.FontWeight getW400();
+    method public androidx.ui.text.font.FontWeight getW500();
+    method public androidx.ui.text.font.FontWeight getW600();
+    method public androidx.ui.text.font.FontWeight getW700();
+    method public androidx.ui.text.font.FontWeight getW800();
+    method public androidx.ui.text.font.FontWeight getW900();
+    property public final androidx.ui.text.font.FontWeight Black;
+    property public final androidx.ui.text.font.FontWeight Bold;
+    property public final androidx.ui.text.font.FontWeight ExtraBold;
+    property public final androidx.ui.text.font.FontWeight ExtraLight;
+    property public final androidx.ui.text.font.FontWeight Light;
+    property public final androidx.ui.text.font.FontWeight Medium;
+    property public final androidx.ui.text.font.FontWeight Normal;
+    property public final androidx.ui.text.font.FontWeight SemiBold;
+    property public final androidx.ui.text.font.FontWeight Thin;
+    property public final androidx.ui.text.font.FontWeight W100;
+    property public final androidx.ui.text.font.FontWeight W200;
+    property public final androidx.ui.text.font.FontWeight W300;
+    property public final androidx.ui.text.font.FontWeight W400;
+    property public final androidx.ui.text.font.FontWeight W500;
+    property public final androidx.ui.text.font.FontWeight W600;
+    property public final androidx.ui.text.font.FontWeight W700;
+    property public final androidx.ui.text.font.FontWeight W800;
+    property public final androidx.ui.text.font.FontWeight W900;
+  }
+
+  public final class FontWeightKt {
+    method public static androidx.ui.text.font.FontWeight lerp(androidx.ui.text.font.FontWeight start, androidx.ui.text.font.FontWeight stop, float fraction);
+  }
+
+  public final class GenericFontFamily extends androidx.ui.text.font.SystemFontFamily {
+    method public String getName();
+  }
+
+  public final class LoadedFontFamily extends androidx.ui.text.font.FontFamily {
+    ctor public LoadedFontFamily(androidx.ui.text.Typeface typeface);
+    method public androidx.ui.text.Typeface component1();
+    method public androidx.ui.text.font.LoadedFontFamily copy(androidx.ui.text.Typeface typeface);
+    method public androidx.ui.text.Typeface getTypeface();
+  }
+
+  public final class ResourceFont implements androidx.ui.text.font.Font {
+    ctor public ResourceFont(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
+    method public int component1();
+    method public androidx.ui.text.font.FontWeight component2();
+    method public androidx.ui.text.font.FontStyle component3();
+    method public androidx.ui.text.font.ResourceFont copy(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
+    method public int getResId();
+    method public androidx.ui.text.font.FontStyle getStyle();
+    method public androidx.ui.text.font.FontWeight getWeight();
+  }
+
+  public abstract sealed class SystemFontFamily extends androidx.ui.text.font.FontFamily {
+  }
+
+}
+
+package androidx.ui.text.platform {
+
+  public final class AndroidParagraphHelperKt {
+  }
+
+  public final class AndroidParagraphKt {
+  }
+
+  public final class PlatformLocaleKt {
+  }
+
+}
+
+package androidx.ui.text.style {
+
+  public final class BaselineShift {
+    ctor public BaselineShift(float multiplier);
+    method public float component1();
+    method public androidx.ui.text.style.BaselineShift copy(float multiplier);
+    method public float getMultiplier();
+    field public static final androidx.ui.text.style.BaselineShift.Companion! Companion;
+  }
+
+  public static final class BaselineShift.Companion {
+    method public androidx.ui.text.style.BaselineShift getNone();
+    method public androidx.ui.text.style.BaselineShift getSubscript();
+    method public androidx.ui.text.style.BaselineShift getSuperscript();
+    property public final androidx.ui.text.style.BaselineShift None;
+    property public final androidx.ui.text.style.BaselineShift Subscript;
+    property public final androidx.ui.text.style.BaselineShift Superscript;
+  }
+
+  public final class BaselineShiftKt {
+    method public static androidx.ui.text.style.BaselineShift lerp(androidx.ui.text.style.BaselineShift start, androidx.ui.text.style.BaselineShift stop, float fraction);
+  }
+
+  public enum TextAlign {
+    enum_constant public static final androidx.ui.text.style.TextAlign Center;
+    enum_constant public static final androidx.ui.text.style.TextAlign End;
+    enum_constant public static final androidx.ui.text.style.TextAlign Justify;
+    enum_constant public static final androidx.ui.text.style.TextAlign Left;
+    enum_constant public static final androidx.ui.text.style.TextAlign Right;
+    enum_constant public static final androidx.ui.text.style.TextAlign Start;
+  }
+
+  public final class TextDecoration {
+    method public int component1();
+    method public boolean contains(androidx.ui.text.style.TextDecoration other);
+    method public androidx.ui.text.style.TextDecoration copy(int mask);
+    method public int getMask();
+    field public static final androidx.ui.text.style.TextDecoration.Companion! Companion;
+  }
+
+  public static final class TextDecoration.Companion {
+    method public androidx.ui.text.style.TextDecoration combine(java.util.List<androidx.ui.text.style.TextDecoration> decorations);
+    method public androidx.ui.text.style.TextDecoration getLineThrough();
+    method public androidx.ui.text.style.TextDecoration getNone();
+    method public androidx.ui.text.style.TextDecoration getUnderline();
+    property public final androidx.ui.text.style.TextDecoration LineThrough;
+    property public final androidx.ui.text.style.TextDecoration None;
+    property public final androidx.ui.text.style.TextDecoration Underline;
+  }
+
+  public enum TextDirection {
+    enum_constant public static final androidx.ui.text.style.TextDirection Ltr;
+    enum_constant public static final androidx.ui.text.style.TextDirection Rtl;
+  }
+
+  public enum TextDirectionAlgorithm {
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrLtr;
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrRtl;
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceLtr;
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceRtl;
+  }
+
+  public final class TextGeometricTransform {
+    ctor public TextGeometricTransform(float scaleX, float skewX);
+    ctor public TextGeometricTransform();
+    method public float component1();
+    method public float component2();
+    method public androidx.ui.text.style.TextGeometricTransform copy(float scaleX, float skewX);
+    method public float getScaleX();
+    method public float getSkewX();
+    field public static final androidx.ui.text.style.TextGeometricTransform.Companion! Companion;
+  }
+
+  public static final class TextGeometricTransform.Companion {
+  }
+
+  public final class TextGeometricTransformKt {
+    method public static androidx.ui.text.style.TextGeometricTransform lerp(androidx.ui.text.style.TextGeometricTransform start, androidx.ui.text.style.TextGeometricTransform stop, float fraction);
+  }
+
+  public final class TextIndent {
+    ctor public TextIndent(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
+    ctor public TextIndent();
+    method public androidx.ui.unit.TextUnit component1();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.style.TextIndent copy(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
+    method public androidx.ui.unit.TextUnit getFirstLine();
+    method public androidx.ui.unit.TextUnit getRestLine();
+    field public static final androidx.ui.text.style.TextIndent.Companion! Companion;
+  }
+
+  public static final class TextIndent.Companion {
+    method public androidx.ui.text.style.TextIndent getNone();
+    property public final androidx.ui.text.style.TextIndent None;
+  }
+
+  public final class TextIndentKt {
+    method public static androidx.ui.text.style.TextIndent lerp(androidx.ui.text.style.TextIndent start, androidx.ui.text.style.TextIndent stop, float fraction);
+  }
+
+  public enum TextOverflow {
+    enum_constant public static final androidx.ui.text.style.TextOverflow Clip;
+    enum_constant public static final androidx.ui.text.style.TextOverflow Ellipsis;
+  }
+
+}
+
diff --git a/ui/ui-text/api/public_plus_experimental_0.1.0-dev01.txt b/ui/ui-text-core/api/public_plus_experimental_0.1.0-dev01.txt
similarity index 100%
rename from ui/ui-text/api/public_plus_experimental_0.1.0-dev01.txt
rename to ui/ui-text-core/api/public_plus_experimental_0.1.0-dev01.txt
diff --git a/ui/ui-text/api/public_plus_experimental_0.1.0-dev02.txt b/ui/ui-text-core/api/public_plus_experimental_0.1.0-dev02.txt
similarity index 100%
rename from ui/ui-text/api/public_plus_experimental_0.1.0-dev02.txt
rename to ui/ui-text-core/api/public_plus_experimental_0.1.0-dev02.txt
diff --git a/ui/ui-text/api/public_plus_experimental_0.1.0-dev03.txt b/ui/ui-text-core/api/public_plus_experimental_0.1.0-dev03.txt
similarity index 100%
rename from ui/ui-text/api/public_plus_experimental_0.1.0-dev03.txt
rename to ui/ui-text-core/api/public_plus_experimental_0.1.0-dev03.txt
diff --git a/ui/ui-text/api/public_plus_experimental_0.1.0-dev04.txt b/ui/ui-text-core/api/public_plus_experimental_0.1.0-dev04.txt
similarity index 100%
rename from ui/ui-text/api/public_plus_experimental_0.1.0-dev04.txt
rename to ui/ui-text-core/api/public_plus_experimental_0.1.0-dev04.txt
diff --git a/ui/ui-text/api/public_plus_experimental_0.1.0-dev05.txt b/ui/ui-text-core/api/public_plus_experimental_0.1.0-dev05.txt
similarity index 100%
rename from ui/ui-text/api/public_plus_experimental_0.1.0-dev05.txt
rename to ui/ui-text-core/api/public_plus_experimental_0.1.0-dev05.txt
diff --git a/ui/ui-text/api/public_plus_experimental_0.1.0-dev06.txt b/ui/ui-text-core/api/public_plus_experimental_0.1.0-dev06.txt
similarity index 100%
rename from ui/ui-text/api/public_plus_experimental_0.1.0-dev06.txt
rename to ui/ui-text-core/api/public_plus_experimental_0.1.0-dev06.txt
diff --git a/ui/ui-text/api/public_plus_experimental_0.1.0-dev07.txt b/ui/ui-text-core/api/public_plus_experimental_0.1.0-dev07.txt
similarity index 100%
rename from ui/ui-text/api/public_plus_experimental_0.1.0-dev07.txt
rename to ui/ui-text-core/api/public_plus_experimental_0.1.0-dev07.txt
diff --git a/ui/ui-text/api/public_plus_experimental_0.1.0-dev08.txt b/ui/ui-text-core/api/public_plus_experimental_0.1.0-dev08.txt
similarity index 100%
rename from ui/ui-text/api/public_plus_experimental_0.1.0-dev08.txt
rename to ui/ui-text-core/api/public_plus_experimental_0.1.0-dev08.txt
diff --git a/ui/ui-text-core/api/public_plus_experimental_0.1.0-dev09.txt b/ui/ui-text-core/api/public_plus_experimental_0.1.0-dev09.txt
new file mode 100644
index 0000000..1df7e9d0
--- /dev/null
+++ b/ui/ui-text-core/api/public_plus_experimental_0.1.0-dev09.txt
@@ -0,0 +1,926 @@
+// Signature format: 3.0
+package androidx.ui.input {
+
+  public final class BackspaceKeyEditOp implements androidx.ui.input.EditOperation {
+    ctor public BackspaceKeyEditOp();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class CommitTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public CommitTextEditOp(String text, int newCursorPosition);
+    method public String component1();
+    method public int component2();
+    method public androidx.ui.input.CommitTextEditOp copy(String text, int newCursorPosition);
+    method public int getNewCursorPosition();
+    method public String getText();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public DeleteSurroundingTextEditOp(int beforeLength, int afterLength);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.DeleteSurroundingTextEditOp copy(int beforeLength, int afterLength);
+    method public int getAfterLength();
+    method public int getBeforeLength();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextInCodePointsEditOp implements androidx.ui.input.EditOperation {
+    ctor public DeleteSurroundingTextInCodePointsEditOp(int beforeLength, int afterLength);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.DeleteSurroundingTextInCodePointsEditOp copy(int beforeLength, int afterLength);
+    method public int getAfterLength();
+    method public int getBeforeLength();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public interface EditOperation {
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class EditingBuffer {
+    ctor public EditingBuffer(String initialText, androidx.ui.text.TextRange initialSelection);
+    field public static final int NOWHERE = -1; // 0xffffffff
+  }
+
+  public final class EditorValue {
+    ctor public EditorValue(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
+    ctor public EditorValue();
+    method public String component1();
+    method public androidx.ui.text.TextRange component2();
+    method public androidx.ui.text.TextRange? component3();
+    method public androidx.ui.input.EditorValue copy(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
+    method public androidx.ui.text.TextRange? getComposition();
+    method public String getSelectedText();
+    method public androidx.ui.text.TextRange getSelection();
+    method public String getText();
+    method public String getTextAfterSelection(int maxChars);
+    method public String getTextBeforeSelection(int maxChars);
+  }
+
+  public final class FinishComposingTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public FinishComposingTextEditOp();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public enum ImeAction {
+    enum_constant public static final androidx.ui.input.ImeAction Done;
+    enum_constant public static final androidx.ui.input.ImeAction Go;
+    enum_constant public static final androidx.ui.input.ImeAction Next;
+    enum_constant public static final androidx.ui.input.ImeAction NoAction;
+    enum_constant public static final androidx.ui.input.ImeAction Previous;
+    enum_constant public static final androidx.ui.input.ImeAction Search;
+    enum_constant public static final androidx.ui.input.ImeAction Send;
+    enum_constant public static final androidx.ui.input.ImeAction Unspecified;
+  }
+
+  public interface InputEventListener {
+    method public void onEditOperations(java.util.List<? extends androidx.ui.input.EditOperation> editOps);
+    method public void onImeAction(androidx.ui.input.ImeAction imeAction);
+  }
+
+  public enum KeyboardType {
+    enum_constant public static final androidx.ui.input.KeyboardType Ascii;
+    enum_constant public static final androidx.ui.input.KeyboardType Email;
+    enum_constant public static final androidx.ui.input.KeyboardType Number;
+    enum_constant public static final androidx.ui.input.KeyboardType NumberPassword;
+    enum_constant public static final androidx.ui.input.KeyboardType Password;
+    enum_constant public static final androidx.ui.input.KeyboardType Phone;
+    enum_constant public static final androidx.ui.input.KeyboardType Text;
+    enum_constant public static final androidx.ui.input.KeyboardType Uri;
+  }
+
+  public final class MoveCursorEditOp implements androidx.ui.input.EditOperation {
+    ctor public MoveCursorEditOp(int amount);
+    method public int component1();
+    method public androidx.ui.input.MoveCursorEditOp copy(int amount);
+    method public int getAmount();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public interface OffsetMap {
+    method public int originalToTransformed(int offset);
+    method public int transformedToOriginal(int offset);
+    field public static final androidx.ui.input.OffsetMap.Companion! Companion;
+  }
+
+  public static final class OffsetMap.Companion {
+    method public androidx.ui.input.OffsetMap getIdentityOffsetMap();
+    property public final androidx.ui.input.OffsetMap identityOffsetMap;
+  }
+
+  public final class PasswordVisualTransformation implements androidx.ui.input.VisualTransformation {
+    ctor public PasswordVisualTransformation(char mask);
+    ctor public PasswordVisualTransformation();
+    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+    method public char getMask();
+  }
+
+  public interface PlatformTextInputService {
+    method public void hideSoftwareKeyboard();
+    method public void notifyFocusedRect(androidx.ui.geometry.Rect rect);
+    method public void onStateUpdated(androidx.ui.input.EditorValue model);
+    method public void showSoftwareKeyboard();
+    method public void startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput();
+  }
+
+  public final class SetComposingRegionEditOp implements androidx.ui.input.EditOperation {
+    ctor public SetComposingRegionEditOp(int start, int end);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.SetComposingRegionEditOp copy(int start, int end);
+    method public int getEnd();
+    method public int getStart();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class SetComposingTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public SetComposingTextEditOp(String text, int newCursorPosition);
+    method public String component1();
+    method public int component2();
+    method public androidx.ui.input.SetComposingTextEditOp copy(String text, int newCursorPosition);
+    method public int getNewCursorPosition();
+    method public String getText();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class SetSelectionEditOp implements androidx.ui.input.EditOperation {
+    ctor public SetSelectionEditOp(int start, int end);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.SetSelectionEditOp copy(int start, int end);
+    method public int getEnd();
+    method public int getStart();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public class TextInputService {
+    ctor public TextInputService(androidx.ui.input.PlatformTextInputService platformTextInputService);
+    method public void hideSoftwareKeyboard(int token);
+    method public void notifyFocusedRect(int token, androidx.ui.geometry.Rect rect);
+    method public void onStateUpdated(int token, androidx.ui.input.EditorValue model);
+    method public void showSoftwareKeyboard(int token);
+    method public int startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput(int token);
+  }
+
+  public final class TextInputServiceKt {
+    field public static final int INVALID_SESSION = -1; // 0xffffffff
+    field public static final int NO_SESSION = 0; // 0x0
+  }
+
+  public final class TransformedText {
+    ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+    method public androidx.ui.text.AnnotatedString component1();
+    method public androidx.ui.input.OffsetMap component2();
+    method public androidx.ui.input.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+    method public androidx.ui.input.OffsetMap getOffsetMap();
+    method public androidx.ui.text.AnnotatedString getTransformedText();
+  }
+
+  public interface VisualTransformation {
+    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+  }
+
+}
+
+package androidx.ui.text {
+
+  public final class AnnotatedString {
+    ctor public AnnotatedString(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles);
+    method public String component1();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> component2();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> component3();
+    method public androidx.ui.text.AnnotatedString copy(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> annotations);
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> getParagraphStyles();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> getSpanStyles();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> getStringAnnotations(String scope, int start, int end);
+    method public String getText();
+    method public operator androidx.ui.text.AnnotatedString plus(androidx.ui.text.AnnotatedString other);
+  }
+
+  public static final class AnnotatedString.Builder {
+    ctor public AnnotatedString.Builder(int capacity);
+    ctor public AnnotatedString.Builder();
+    ctor public AnnotatedString.Builder(String text);
+    ctor public AnnotatedString.Builder(androidx.ui.text.AnnotatedString text);
+    method public void addAnnotationString(String scope, String annotation, int start, int end);
+    method public void addStyle(androidx.ui.text.SpanStyle style, int start, int end);
+    method public void addStyle(androidx.ui.text.ParagraphStyle style, int start, int end);
+    method public void append(String text);
+    method public void append(char p);
+    method public void append(androidx.ui.text.AnnotatedString text);
+    method public int getLength();
+    method public void pop();
+    method public void pop(int index);
+    method public int pushStringAnnotation(String scope, String annotation);
+    method public int pushStyle(androidx.ui.text.SpanStyle style);
+    method public int pushStyle(androidx.ui.text.ParagraphStyle style);
+    method public androidx.ui.text.AnnotatedString toAnnotatedString();
+    property public final int length;
+  }
+
+  public static final class AnnotatedString.Item<T> {
+    ctor public AnnotatedString.Item(T! item, int start, int end, String scope);
+    ctor public AnnotatedString.Item(T! item, int start, int end);
+    method public T! component1();
+    method public int component2();
+    method public int component3();
+    method public String component4();
+    method public androidx.ui.text.AnnotatedString.Item<T> copy(T! item, int start, int end, String scope);
+    method public int getEnd();
+    method public T! getItem();
+    method public String getScope();
+    method public int getStart();
+  }
+
+  public final class AnnotatedStringKt {
+    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.SpanStyle spanStyle, androidx.ui.text.ParagraphStyle? paragraphStyle = null);
+    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.ParagraphStyle paragraphStyle);
+    method public static inline androidx.ui.text.AnnotatedString AnnotatedString(kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
+    method public static androidx.ui.text.AnnotatedString capitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static androidx.ui.text.AnnotatedString decapitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static int getLength(androidx.ui.text.AnnotatedString);
+    method public static androidx.ui.text.AnnotatedString subSequence(androidx.ui.text.AnnotatedString, int start, int end);
+    method public static androidx.ui.text.AnnotatedString toLowerCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static androidx.ui.text.AnnotatedString toUpperCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
+    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
+  }
+
+  public final class Locale {
+    ctor public Locale(String languageTag);
+    method public String getLanguage();
+    method public String getRegion();
+    method public String getScript();
+    method public String toLanguageTag();
+    property public final String language;
+    property public final String region;
+    property public final String script;
+    field public static final androidx.ui.text.Locale.Companion! Companion;
+  }
+
+  public static final class Locale.Companion {
+    method public androidx.ui.text.Locale getCurrent();
+    property public final androidx.ui.text.Locale current;
+  }
+
+  public final class LocaleList implements java.util.Collection<androidx.ui.text.Locale> kotlin.jvm.internal.markers.KMappedMarker {
+    ctor public LocaleList(java.util.List<androidx.ui.text.Locale> localeList);
+    ctor public LocaleList(String languageTags);
+    ctor public LocaleList(androidx.ui.text.Locale... locales);
+    method public java.util.List<androidx.ui.text.Locale> component1();
+    method public operator boolean contains(androidx.ui.text.Locale element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public androidx.ui.text.LocaleList copy(java.util.List<androidx.ui.text.Locale> localeList);
+    method public operator androidx.ui.text.Locale get(int i);
+    method public java.util.List<androidx.ui.text.Locale> getLocaleList();
+    method public int getSize();
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.ui.text.Locale> iterator();
+    property public int size;
+    field public static final androidx.ui.text.LocaleList.Companion! Companion;
+  }
+
+  public static final class LocaleList.Companion {
+    method public androidx.ui.text.LocaleList getCurrent();
+    property public final androidx.ui.text.LocaleList current;
+  }
+
+  public final class MultiParagraph {
+    ctor public MultiParagraph(androidx.ui.text.MultiParagraphIntrinsics intrinsics, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints);
+    ctor public MultiParagraph(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
+    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public androidx.ui.text.MultiParagraphIntrinsics getIntrinsics();
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineForOffset(int offset);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public int getMaxLines();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
+    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
+    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public androidx.ui.text.TextRange getWordBoundary(int offset);
+    method public void paint(androidx.ui.graphics.Canvas canvas);
+    property public final boolean didExceedMaxLines;
+    property public final float firstBaseline;
+    property public final float height;
+    property public final float lastBaseline;
+    property public final int lineCount;
+    property public final float maxIntrinsicWidth;
+    property public final float minIntrinsicWidth;
+    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
+    property public final float width;
+  }
+
+  public final class MultiParagraphIntrinsics implements androidx.ui.text.ParagraphIntrinsics {
+    ctor public MultiParagraphIntrinsics(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public androidx.ui.text.AnnotatedString getAnnotatedString();
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
+    property public float maxIntrinsicWidth;
+    property public float minIntrinsicWidth;
+  }
+
+  public final class MultiParagraphIntrinsicsKt {
+  }
+
+  public final class MultiParagraphKt {
+  }
+
+  public interface Paragraph {
+    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
+    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineForOffset(int offset);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
+    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
+    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public androidx.ui.text.TextRange getWordBoundary(int offset);
+    method public void paint(androidx.ui.graphics.Canvas canvas);
+    property public abstract boolean didExceedMaxLines;
+    property public abstract float firstBaseline;
+    property public abstract float height;
+    property public abstract float lastBaseline;
+    property public abstract int lineCount;
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+    property public abstract java.util.List<androidx.ui.geometry.Rect> placeholderRects;
+    property public abstract float width;
+  }
+
+  public final class ParagraphConstraints {
+    ctor public ParagraphConstraints(float width);
+    method public float component1();
+    method public androidx.ui.text.ParagraphConstraints copy(float width);
+    method public float getWidth();
+  }
+
+  public interface ParagraphIntrinsics {
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+  }
+
+  public final class ParagraphIntrinsicsKt {
+    method public static androidx.ui.text.ParagraphIntrinsics ParagraphIntrinsics(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+  }
+
+  public final class ParagraphKt {
+    method public static androidx.ui.text.Paragraph Paragraph(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public static androidx.ui.text.Paragraph Paragraph(androidx.ui.text.ParagraphIntrinsics paragraphIntrinsics, int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints);
+  }
+
+  public final class ParagraphStyle {
+    ctor public ParagraphStyle(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    ctor public ParagraphStyle();
+    method public androidx.ui.text.style.TextAlign? component1();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? component2();
+    method public androidx.ui.unit.TextUnit component3();
+    method public androidx.ui.text.style.TextIndent? component4();
+    method public androidx.ui.text.ParagraphStyle copy(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    method public androidx.ui.unit.TextUnit getLineHeight();
+    method public androidx.ui.text.style.TextAlign? getTextAlign();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
+    method public androidx.ui.text.style.TextIndent? getTextIndent();
+    method public androidx.ui.text.ParagraphStyle merge(androidx.ui.text.ParagraphStyle? other = null);
+  }
+
+  public final class ParagraphStyleKt {
+    method public static androidx.ui.text.ParagraphStyle lerp(androidx.ui.text.ParagraphStyle start, androidx.ui.text.ParagraphStyle stop, float fraction);
+  }
+
+  public final class Placeholder {
+    ctor public Placeholder(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
+    method public androidx.ui.unit.TextUnit component1();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.PlaceholderVerticalAlign component3();
+    method public androidx.ui.text.Placeholder copy(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
+    method public androidx.ui.unit.TextUnit getHeight();
+    method public androidx.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
+    method public androidx.ui.unit.TextUnit getWidth();
+  }
+
+  public enum PlaceholderVerticalAlign {
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign AboveBaseline;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Bottom;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Center;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextBottom;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextCenter;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextTop;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Top;
+  }
+
+  public final class SpanStyle {
+    ctor public SpanStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
+    ctor public SpanStyle();
+    method public androidx.ui.graphics.Color? component1();
+    method public androidx.ui.text.style.TextGeometricTransform? component10();
+    method public androidx.ui.text.LocaleList? component11();
+    method public androidx.ui.graphics.Color? component12();
+    method public androidx.ui.text.style.TextDecoration? component13();
+    method public androidx.ui.graphics.Shadow? component14();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.font.FontWeight? component3();
+    method public androidx.ui.text.font.FontStyle? component4();
+    method public androidx.ui.text.font.FontSynthesis? component5();
+    method public androidx.ui.text.font.FontFamily? component6();
+    method public String? component7();
+    method public androidx.ui.unit.TextUnit component8();
+    method public androidx.ui.text.style.BaselineShift? component9();
+    method public androidx.ui.text.SpanStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
+    method public androidx.ui.graphics.Color? getBackground();
+    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
+    method public androidx.ui.graphics.Color? getColor();
+    method public androidx.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public androidx.ui.unit.TextUnit getFontSize();
+    method public androidx.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.ui.text.font.FontWeight? getFontWeight();
+    method public androidx.ui.unit.TextUnit getLetterSpacing();
+    method public androidx.ui.text.LocaleList? getLocaleList();
+    method public androidx.ui.graphics.Shadow? getShadow();
+    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
+    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
+    method public androidx.ui.text.SpanStyle merge(androidx.ui.text.SpanStyle? other = null);
+  }
+
+  public final class SpanStyleKt {
+    method public static androidx.ui.text.SpanStyle lerp(androidx.ui.text.SpanStyle start, androidx.ui.text.SpanStyle stop, float fraction);
+  }
+
+  public final class StringKt {
+    method public static String capitalize(String, androidx.ui.text.Locale locale);
+    method public static String capitalize(String, androidx.ui.text.LocaleList localeList);
+    method public static String decapitalize(String, androidx.ui.text.Locale locale);
+    method public static String decapitalize(String, androidx.ui.text.LocaleList localeList);
+    method public static String toLowerCase(String, androidx.ui.text.Locale locale);
+    method public static String toLowerCase(String, androidx.ui.text.LocaleList localeList);
+    method public static String toUpperCase(String, androidx.ui.text.Locale locale);
+    method public static String toUpperCase(String, androidx.ui.text.LocaleList localeList);
+  }
+
+  public final class TextLayoutHelperKt {
+  }
+
+  public final class TextLayoutInput {
+    ctor public TextLayoutInput(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
+    method public androidx.ui.text.AnnotatedString component1();
+    method public androidx.ui.core.Constraints component10();
+    method public androidx.ui.text.TextStyle component2();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> component3();
+    method public int component4();
+    method public boolean component5();
+    method public androidx.ui.text.style.TextOverflow component6();
+    method public androidx.ui.unit.Density component7();
+    method public androidx.ui.core.LayoutDirection component8();
+    method public androidx.ui.text.font.Font.ResourceLoader component9();
+    method public androidx.ui.text.TextLayoutInput copy(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
+    method public androidx.ui.core.Constraints getConstraints();
+    method public androidx.ui.unit.Density getDensity();
+    method public androidx.ui.core.LayoutDirection getLayoutDirection();
+    method public int getMaxLines();
+    method public androidx.ui.text.style.TextOverflow getOverflow();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
+    method public androidx.ui.text.font.Font.ResourceLoader getResourceLoader();
+    method public boolean getSoftWrap();
+    method public androidx.ui.text.TextStyle getStyle();
+    method public androidx.ui.text.AnnotatedString getText();
+  }
+
+  public final class TextLayoutResult {
+    method public androidx.ui.text.TextLayoutInput component1();
+    method public androidx.ui.unit.IntPxSize component3();
+    method public androidx.ui.text.TextLayoutResult copy(androidx.ui.text.TextLayoutInput layoutInput, androidx.ui.text.MultiParagraph multiParagraph, androidx.ui.unit.IntPxSize size);
+    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
+    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidOverflowHeight();
+    method public boolean getDidOverflowWidth();
+    method public androidx.ui.unit.Px getFirstBaseline();
+    method public boolean getHasVisualOverflow();
+    method public androidx.ui.unit.Px getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public androidx.ui.unit.Px getLastBaseline();
+    method public androidx.ui.text.TextLayoutInput getLayoutInput();
+    method public androidx.ui.unit.Px getLineBottom(int lineIndex);
+    method public int getLineForOffset(int offset);
+    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
+    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
+    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
+    method public androidx.ui.unit.IntPxSize getSize();
+    method public androidx.ui.text.TextRange getWordBoundary(int offset);
+    property public final boolean didOverflowHeight;
+    property public final boolean didOverflowWidth;
+    property public final androidx.ui.unit.Px firstBaseline;
+    property public final boolean hasVisualOverflow;
+    property public final androidx.ui.unit.Px lastBaseline;
+    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
+  }
+
+  public final class TextPainter {
+    method public void paint(androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
+    field public static final androidx.ui.text.TextPainter! INSTANCE;
+  }
+
+  public final class TextRange {
+    ctor public TextRange(int start, int end);
+    method public int component1();
+    method public int component2();
+    method public operator boolean contains(androidx.ui.text.TextRange other);
+    method public operator boolean contains(int offset);
+    method public androidx.ui.text.TextRange copy(int start, int end);
+    method public boolean getCollapsed();
+    method public int getEnd();
+    method public int getLength();
+    method public int getMax();
+    method public int getMin();
+    method public int getStart();
+    method public boolean intersects(androidx.ui.text.TextRange other);
+    property public final boolean collapsed;
+    property public final int length;
+    property public final int max;
+    property public final int min;
+  }
+
+  public final class TextRangeKt {
+    method public static String substring(CharSequence, androidx.ui.text.TextRange range);
+  }
+
+  public final class TextStyle {
+    ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    ctor public TextStyle();
+    method public androidx.ui.graphics.Color? component1();
+    method public androidx.ui.text.style.TextGeometricTransform? component10();
+    method public androidx.ui.text.LocaleList? component11();
+    method public androidx.ui.graphics.Color? component12();
+    method public androidx.ui.text.style.TextDecoration? component13();
+    method public androidx.ui.graphics.Shadow? component14();
+    method public androidx.ui.text.style.TextAlign? component15();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? component16();
+    method public androidx.ui.unit.TextUnit component17();
+    method public androidx.ui.text.style.TextIndent? component18();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.font.FontWeight? component3();
+    method public androidx.ui.text.font.FontStyle? component4();
+    method public androidx.ui.text.font.FontSynthesis? component5();
+    method public androidx.ui.text.font.FontFamily? component6();
+    method public String? component7();
+    method public androidx.ui.unit.TextUnit component8();
+    method public androidx.ui.text.style.BaselineShift? component9();
+    method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    method public androidx.ui.graphics.Color? getBackground();
+    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
+    method public androidx.ui.graphics.Color? getColor();
+    method public androidx.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public androidx.ui.unit.TextUnit getFontSize();
+    method public androidx.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.ui.text.font.FontWeight? getFontWeight();
+    method public androidx.ui.unit.TextUnit getLetterSpacing();
+    method public androidx.ui.unit.TextUnit getLineHeight();
+    method public androidx.ui.text.LocaleList? getLocaleList();
+    method public androidx.ui.graphics.Shadow? getShadow();
+    method public androidx.ui.text.style.TextAlign? getTextAlign();
+    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
+    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
+    method public androidx.ui.text.style.TextIndent? getTextIndent();
+    method public androidx.ui.text.TextStyle merge(androidx.ui.text.TextStyle? other = null);
+    method public androidx.ui.text.TextStyle merge(androidx.ui.text.SpanStyle other);
+    method public androidx.ui.text.TextStyle merge(androidx.ui.text.ParagraphStyle other);
+    method public androidx.ui.text.ParagraphStyle toParagraphStyle();
+    method public androidx.ui.text.SpanStyle toSpanStyle();
+    field public static final androidx.ui.text.TextStyle.Companion! Companion;
+  }
+
+  public static final class TextStyle.Companion {
+    method public androidx.ui.text.TextStyle getDefault();
+    property public final androidx.ui.text.TextStyle Default;
+  }
+
+  public final class TextStyleKt {
+    method public static androidx.ui.text.TextStyle lerp(androidx.ui.text.TextStyle start, androidx.ui.text.TextStyle stop, float fraction);
+    method public static androidx.ui.text.TextStyle resolveDefaults(androidx.ui.text.TextStyle style, androidx.ui.core.LayoutDirection direction);
+  }
+
+  public interface Typeface {
+    method public androidx.ui.text.font.FontFamily getFontFamily();
+    property public abstract androidx.ui.text.font.FontFamily fontFamily;
+  }
+
+  public final class TypefaceKt {
+    method public static androidx.ui.text.Typeface typefaceFromFontFamily(android.content.Context context, androidx.ui.text.font.FontFamily fontFamily, java.util.List<? extends kotlin.Pair<androidx.ui.text.font.FontWeight,? extends androidx.ui.text.font.FontStyle>>? necessaryStyles = null);
+  }
+
+}
+
+package androidx.ui.text.font {
+
+  public abstract sealed class FileBasedFontFamily extends androidx.ui.text.font.FontFamily {
+  }
+
+  public interface Font {
+    method public androidx.ui.text.font.FontStyle getStyle();
+    method public androidx.ui.text.font.FontWeight getWeight();
+    property public abstract androidx.ui.text.font.FontStyle style;
+    property public abstract androidx.ui.text.font.FontWeight weight;
+  }
+
+  public static interface Font.ResourceLoader {
+    method public Object load(androidx.ui.text.font.Font font);
+  }
+
+  public abstract sealed class FontFamily {
+    method public final boolean getCanLoadSynchronously();
+    field public static final androidx.ui.text.font.FontFamily.Companion! Companion;
+  }
+
+  public static final class FontFamily.Companion {
+    method public androidx.ui.text.font.GenericFontFamily getCursive();
+    method public androidx.ui.text.font.SystemFontFamily getDefault();
+    method public androidx.ui.text.font.GenericFontFamily getMonospace();
+    method public androidx.ui.text.font.GenericFontFamily getSansSerif();
+    method public androidx.ui.text.font.GenericFontFamily getSerif();
+    property public final androidx.ui.text.font.GenericFontFamily Cursive;
+    property public final androidx.ui.text.font.SystemFontFamily Default;
+    property public final androidx.ui.text.font.GenericFontFamily Monospace;
+    property public final androidx.ui.text.font.GenericFontFamily SansSerif;
+    property public final androidx.ui.text.font.GenericFontFamily Serif;
+  }
+
+  public final class FontFamilyKt {
+    method public static androidx.ui.text.font.FontListFontFamily fontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
+    method public static androidx.ui.text.font.FontListFontFamily fontFamily(androidx.ui.text.font.Font... fonts);
+    method public static androidx.ui.text.font.LoadedFontFamily fontFamily(androidx.ui.text.Typeface typeface);
+  }
+
+  public final class FontKt {
+    method public static androidx.ui.text.font.FontListFontFamily asFontFamily(androidx.ui.text.font.Font);
+    method public static androidx.ui.text.font.Font font(int resId, androidx.ui.text.font.FontWeight weight = FontWeight.Normal, androidx.ui.text.font.FontStyle style = androidx.ui.text.font.FontStyle.Normal);
+  }
+
+  public final class FontListFontFamily extends androidx.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.ui.text.font.Font> {
+    ctor public FontListFontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
+    method public java.util.List<androidx.ui.text.font.Font> component1();
+    method public boolean contains(androidx.ui.text.font.Font element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public androidx.ui.text.font.FontListFontFamily copy(java.util.List<? extends androidx.ui.text.font.Font> fonts);
+    method public androidx.ui.text.font.Font get(int index);
+    method public java.util.List<androidx.ui.text.font.Font> getFonts();
+    method public int getSize();
+    method public int indexOf(androidx.ui.text.font.Font element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.ui.text.font.Font> iterator();
+    method public int lastIndexOf(androidx.ui.text.font.Font element);
+    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator();
+    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator(int index);
+    method public java.util.List<androidx.ui.text.font.Font> subList(int fromIndex, int toIndex);
+  }
+
+  public enum FontStyle {
+    enum_constant public static final androidx.ui.text.font.FontStyle Italic;
+    enum_constant public static final androidx.ui.text.font.FontStyle Normal;
+  }
+
+  public enum FontSynthesis {
+    enum_constant public static final androidx.ui.text.font.FontSynthesis All;
+    enum_constant public static final androidx.ui.text.font.FontSynthesis None;
+    enum_constant public static final androidx.ui.text.font.FontSynthesis Style;
+    enum_constant public static final androidx.ui.text.font.FontSynthesis Weight;
+  }
+
+  public final class FontWeight implements java.lang.Comparable<androidx.ui.text.font.FontWeight> {
+    method public int compareTo(androidx.ui.text.font.FontWeight other);
+    method public androidx.ui.text.font.FontWeight copy(int weight);
+    field public static final androidx.ui.text.font.FontWeight.Companion! Companion;
+  }
+
+  public static final class FontWeight.Companion {
+    method public androidx.ui.text.font.FontWeight getBlack();
+    method public androidx.ui.text.font.FontWeight getBold();
+    method public androidx.ui.text.font.FontWeight getExtraBold();
+    method public androidx.ui.text.font.FontWeight getExtraLight();
+    method public androidx.ui.text.font.FontWeight getLight();
+    method public androidx.ui.text.font.FontWeight getMedium();
+    method public androidx.ui.text.font.FontWeight getNormal();
+    method public androidx.ui.text.font.FontWeight getSemiBold();
+    method public androidx.ui.text.font.FontWeight getThin();
+    method public androidx.ui.text.font.FontWeight getW100();
+    method public androidx.ui.text.font.FontWeight getW200();
+    method public androidx.ui.text.font.FontWeight getW300();
+    method public androidx.ui.text.font.FontWeight getW400();
+    method public androidx.ui.text.font.FontWeight getW500();
+    method public androidx.ui.text.font.FontWeight getW600();
+    method public androidx.ui.text.font.FontWeight getW700();
+    method public androidx.ui.text.font.FontWeight getW800();
+    method public androidx.ui.text.font.FontWeight getW900();
+    property public final androidx.ui.text.font.FontWeight Black;
+    property public final androidx.ui.text.font.FontWeight Bold;
+    property public final androidx.ui.text.font.FontWeight ExtraBold;
+    property public final androidx.ui.text.font.FontWeight ExtraLight;
+    property public final androidx.ui.text.font.FontWeight Light;
+    property public final androidx.ui.text.font.FontWeight Medium;
+    property public final androidx.ui.text.font.FontWeight Normal;
+    property public final androidx.ui.text.font.FontWeight SemiBold;
+    property public final androidx.ui.text.font.FontWeight Thin;
+    property public final androidx.ui.text.font.FontWeight W100;
+    property public final androidx.ui.text.font.FontWeight W200;
+    property public final androidx.ui.text.font.FontWeight W300;
+    property public final androidx.ui.text.font.FontWeight W400;
+    property public final androidx.ui.text.font.FontWeight W500;
+    property public final androidx.ui.text.font.FontWeight W600;
+    property public final androidx.ui.text.font.FontWeight W700;
+    property public final androidx.ui.text.font.FontWeight W800;
+    property public final androidx.ui.text.font.FontWeight W900;
+  }
+
+  public final class FontWeightKt {
+    method public static androidx.ui.text.font.FontWeight lerp(androidx.ui.text.font.FontWeight start, androidx.ui.text.font.FontWeight stop, float fraction);
+  }
+
+  public final class GenericFontFamily extends androidx.ui.text.font.SystemFontFamily {
+    method public String getName();
+  }
+
+  public final class LoadedFontFamily extends androidx.ui.text.font.FontFamily {
+    ctor public LoadedFontFamily(androidx.ui.text.Typeface typeface);
+    method public androidx.ui.text.Typeface component1();
+    method public androidx.ui.text.font.LoadedFontFamily copy(androidx.ui.text.Typeface typeface);
+    method public androidx.ui.text.Typeface getTypeface();
+  }
+
+  public final class ResourceFont implements androidx.ui.text.font.Font {
+    ctor public ResourceFont(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
+    method public int component1();
+    method public androidx.ui.text.font.FontWeight component2();
+    method public androidx.ui.text.font.FontStyle component3();
+    method public androidx.ui.text.font.ResourceFont copy(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
+    method public int getResId();
+    method public androidx.ui.text.font.FontStyle getStyle();
+    method public androidx.ui.text.font.FontWeight getWeight();
+  }
+
+  public abstract sealed class SystemFontFamily extends androidx.ui.text.font.FontFamily {
+  }
+
+}
+
+package androidx.ui.text.platform {
+
+  public final class AndroidParagraphHelperKt {
+  }
+
+  public final class AndroidParagraphKt {
+  }
+
+  public final class PlatformLocaleKt {
+  }
+
+}
+
+package androidx.ui.text.style {
+
+  public final class BaselineShift {
+    ctor public BaselineShift(float multiplier);
+    method public float component1();
+    method public androidx.ui.text.style.BaselineShift copy(float multiplier);
+    method public float getMultiplier();
+    field public static final androidx.ui.text.style.BaselineShift.Companion! Companion;
+  }
+
+  public static final class BaselineShift.Companion {
+    method public androidx.ui.text.style.BaselineShift getNone();
+    method public androidx.ui.text.style.BaselineShift getSubscript();
+    method public androidx.ui.text.style.BaselineShift getSuperscript();
+    property public final androidx.ui.text.style.BaselineShift None;
+    property public final androidx.ui.text.style.BaselineShift Subscript;
+    property public final androidx.ui.text.style.BaselineShift Superscript;
+  }
+
+  public final class BaselineShiftKt {
+    method public static androidx.ui.text.style.BaselineShift lerp(androidx.ui.text.style.BaselineShift start, androidx.ui.text.style.BaselineShift stop, float fraction);
+  }
+
+  public enum TextAlign {
+    enum_constant public static final androidx.ui.text.style.TextAlign Center;
+    enum_constant public static final androidx.ui.text.style.TextAlign End;
+    enum_constant public static final androidx.ui.text.style.TextAlign Justify;
+    enum_constant public static final androidx.ui.text.style.TextAlign Left;
+    enum_constant public static final androidx.ui.text.style.TextAlign Right;
+    enum_constant public static final androidx.ui.text.style.TextAlign Start;
+  }
+
+  public final class TextDecoration {
+    method public int component1();
+    method public boolean contains(androidx.ui.text.style.TextDecoration other);
+    method public androidx.ui.text.style.TextDecoration copy(int mask);
+    method public int getMask();
+    field public static final androidx.ui.text.style.TextDecoration.Companion! Companion;
+  }
+
+  public static final class TextDecoration.Companion {
+    method public androidx.ui.text.style.TextDecoration combine(java.util.List<androidx.ui.text.style.TextDecoration> decorations);
+    method public androidx.ui.text.style.TextDecoration getLineThrough();
+    method public androidx.ui.text.style.TextDecoration getNone();
+    method public androidx.ui.text.style.TextDecoration getUnderline();
+    property public final androidx.ui.text.style.TextDecoration LineThrough;
+    property public final androidx.ui.text.style.TextDecoration None;
+    property public final androidx.ui.text.style.TextDecoration Underline;
+  }
+
+  public enum TextDirection {
+    enum_constant public static final androidx.ui.text.style.TextDirection Ltr;
+    enum_constant public static final androidx.ui.text.style.TextDirection Rtl;
+  }
+
+  public enum TextDirectionAlgorithm {
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrLtr;
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrRtl;
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceLtr;
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceRtl;
+  }
+
+  public final class TextGeometricTransform {
+    ctor public TextGeometricTransform(float scaleX, float skewX);
+    ctor public TextGeometricTransform();
+    method public float component1();
+    method public float component2();
+    method public androidx.ui.text.style.TextGeometricTransform copy(float scaleX, float skewX);
+    method public float getScaleX();
+    method public float getSkewX();
+    field public static final androidx.ui.text.style.TextGeometricTransform.Companion! Companion;
+  }
+
+  public static final class TextGeometricTransform.Companion {
+  }
+
+  public final class TextGeometricTransformKt {
+    method public static androidx.ui.text.style.TextGeometricTransform lerp(androidx.ui.text.style.TextGeometricTransform start, androidx.ui.text.style.TextGeometricTransform stop, float fraction);
+  }
+
+  public final class TextIndent {
+    ctor public TextIndent(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
+    ctor public TextIndent();
+    method public androidx.ui.unit.TextUnit component1();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.style.TextIndent copy(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
+    method public androidx.ui.unit.TextUnit getFirstLine();
+    method public androidx.ui.unit.TextUnit getRestLine();
+    field public static final androidx.ui.text.style.TextIndent.Companion! Companion;
+  }
+
+  public static final class TextIndent.Companion {
+    method public androidx.ui.text.style.TextIndent getNone();
+    property public final androidx.ui.text.style.TextIndent None;
+  }
+
+  public final class TextIndentKt {
+    method public static androidx.ui.text.style.TextIndent lerp(androidx.ui.text.style.TextIndent start, androidx.ui.text.style.TextIndent stop, float fraction);
+  }
+
+  public enum TextOverflow {
+    enum_constant public static final androidx.ui.text.style.TextOverflow Clip;
+    enum_constant public static final androidx.ui.text.style.TextOverflow Ellipsis;
+  }
+
+}
+
diff --git a/ui/ui-text-core/api/public_plus_experimental_current.txt b/ui/ui-text-core/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..1df7e9d0
--- /dev/null
+++ b/ui/ui-text-core/api/public_plus_experimental_current.txt
@@ -0,0 +1,926 @@
+// Signature format: 3.0
+package androidx.ui.input {
+
+  public final class BackspaceKeyEditOp implements androidx.ui.input.EditOperation {
+    ctor public BackspaceKeyEditOp();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class CommitTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public CommitTextEditOp(String text, int newCursorPosition);
+    method public String component1();
+    method public int component2();
+    method public androidx.ui.input.CommitTextEditOp copy(String text, int newCursorPosition);
+    method public int getNewCursorPosition();
+    method public String getText();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public DeleteSurroundingTextEditOp(int beforeLength, int afterLength);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.DeleteSurroundingTextEditOp copy(int beforeLength, int afterLength);
+    method public int getAfterLength();
+    method public int getBeforeLength();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextInCodePointsEditOp implements androidx.ui.input.EditOperation {
+    ctor public DeleteSurroundingTextInCodePointsEditOp(int beforeLength, int afterLength);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.DeleteSurroundingTextInCodePointsEditOp copy(int beforeLength, int afterLength);
+    method public int getAfterLength();
+    method public int getBeforeLength();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public interface EditOperation {
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class EditingBuffer {
+    ctor public EditingBuffer(String initialText, androidx.ui.text.TextRange initialSelection);
+    field public static final int NOWHERE = -1; // 0xffffffff
+  }
+
+  public final class EditorValue {
+    ctor public EditorValue(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
+    ctor public EditorValue();
+    method public String component1();
+    method public androidx.ui.text.TextRange component2();
+    method public androidx.ui.text.TextRange? component3();
+    method public androidx.ui.input.EditorValue copy(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
+    method public androidx.ui.text.TextRange? getComposition();
+    method public String getSelectedText();
+    method public androidx.ui.text.TextRange getSelection();
+    method public String getText();
+    method public String getTextAfterSelection(int maxChars);
+    method public String getTextBeforeSelection(int maxChars);
+  }
+
+  public final class FinishComposingTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public FinishComposingTextEditOp();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public enum ImeAction {
+    enum_constant public static final androidx.ui.input.ImeAction Done;
+    enum_constant public static final androidx.ui.input.ImeAction Go;
+    enum_constant public static final androidx.ui.input.ImeAction Next;
+    enum_constant public static final androidx.ui.input.ImeAction NoAction;
+    enum_constant public static final androidx.ui.input.ImeAction Previous;
+    enum_constant public static final androidx.ui.input.ImeAction Search;
+    enum_constant public static final androidx.ui.input.ImeAction Send;
+    enum_constant public static final androidx.ui.input.ImeAction Unspecified;
+  }
+
+  public interface InputEventListener {
+    method public void onEditOperations(java.util.List<? extends androidx.ui.input.EditOperation> editOps);
+    method public void onImeAction(androidx.ui.input.ImeAction imeAction);
+  }
+
+  public enum KeyboardType {
+    enum_constant public static final androidx.ui.input.KeyboardType Ascii;
+    enum_constant public static final androidx.ui.input.KeyboardType Email;
+    enum_constant public static final androidx.ui.input.KeyboardType Number;
+    enum_constant public static final androidx.ui.input.KeyboardType NumberPassword;
+    enum_constant public static final androidx.ui.input.KeyboardType Password;
+    enum_constant public static final androidx.ui.input.KeyboardType Phone;
+    enum_constant public static final androidx.ui.input.KeyboardType Text;
+    enum_constant public static final androidx.ui.input.KeyboardType Uri;
+  }
+
+  public final class MoveCursorEditOp implements androidx.ui.input.EditOperation {
+    ctor public MoveCursorEditOp(int amount);
+    method public int component1();
+    method public androidx.ui.input.MoveCursorEditOp copy(int amount);
+    method public int getAmount();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public interface OffsetMap {
+    method public int originalToTransformed(int offset);
+    method public int transformedToOriginal(int offset);
+    field public static final androidx.ui.input.OffsetMap.Companion! Companion;
+  }
+
+  public static final class OffsetMap.Companion {
+    method public androidx.ui.input.OffsetMap getIdentityOffsetMap();
+    property public final androidx.ui.input.OffsetMap identityOffsetMap;
+  }
+
+  public final class PasswordVisualTransformation implements androidx.ui.input.VisualTransformation {
+    ctor public PasswordVisualTransformation(char mask);
+    ctor public PasswordVisualTransformation();
+    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+    method public char getMask();
+  }
+
+  public interface PlatformTextInputService {
+    method public void hideSoftwareKeyboard();
+    method public void notifyFocusedRect(androidx.ui.geometry.Rect rect);
+    method public void onStateUpdated(androidx.ui.input.EditorValue model);
+    method public void showSoftwareKeyboard();
+    method public void startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput();
+  }
+
+  public final class SetComposingRegionEditOp implements androidx.ui.input.EditOperation {
+    ctor public SetComposingRegionEditOp(int start, int end);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.SetComposingRegionEditOp copy(int start, int end);
+    method public int getEnd();
+    method public int getStart();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class SetComposingTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public SetComposingTextEditOp(String text, int newCursorPosition);
+    method public String component1();
+    method public int component2();
+    method public androidx.ui.input.SetComposingTextEditOp copy(String text, int newCursorPosition);
+    method public int getNewCursorPosition();
+    method public String getText();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class SetSelectionEditOp implements androidx.ui.input.EditOperation {
+    ctor public SetSelectionEditOp(int start, int end);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.SetSelectionEditOp copy(int start, int end);
+    method public int getEnd();
+    method public int getStart();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public class TextInputService {
+    ctor public TextInputService(androidx.ui.input.PlatformTextInputService platformTextInputService);
+    method public void hideSoftwareKeyboard(int token);
+    method public void notifyFocusedRect(int token, androidx.ui.geometry.Rect rect);
+    method public void onStateUpdated(int token, androidx.ui.input.EditorValue model);
+    method public void showSoftwareKeyboard(int token);
+    method public int startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput(int token);
+  }
+
+  public final class TextInputServiceKt {
+    field public static final int INVALID_SESSION = -1; // 0xffffffff
+    field public static final int NO_SESSION = 0; // 0x0
+  }
+
+  public final class TransformedText {
+    ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+    method public androidx.ui.text.AnnotatedString component1();
+    method public androidx.ui.input.OffsetMap component2();
+    method public androidx.ui.input.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+    method public androidx.ui.input.OffsetMap getOffsetMap();
+    method public androidx.ui.text.AnnotatedString getTransformedText();
+  }
+
+  public interface VisualTransformation {
+    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+  }
+
+}
+
+package androidx.ui.text {
+
+  public final class AnnotatedString {
+    ctor public AnnotatedString(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles);
+    method public String component1();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> component2();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> component3();
+    method public androidx.ui.text.AnnotatedString copy(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> annotations);
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> getParagraphStyles();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> getSpanStyles();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> getStringAnnotations(String scope, int start, int end);
+    method public String getText();
+    method public operator androidx.ui.text.AnnotatedString plus(androidx.ui.text.AnnotatedString other);
+  }
+
+  public static final class AnnotatedString.Builder {
+    ctor public AnnotatedString.Builder(int capacity);
+    ctor public AnnotatedString.Builder();
+    ctor public AnnotatedString.Builder(String text);
+    ctor public AnnotatedString.Builder(androidx.ui.text.AnnotatedString text);
+    method public void addAnnotationString(String scope, String annotation, int start, int end);
+    method public void addStyle(androidx.ui.text.SpanStyle style, int start, int end);
+    method public void addStyle(androidx.ui.text.ParagraphStyle style, int start, int end);
+    method public void append(String text);
+    method public void append(char p);
+    method public void append(androidx.ui.text.AnnotatedString text);
+    method public int getLength();
+    method public void pop();
+    method public void pop(int index);
+    method public int pushStringAnnotation(String scope, String annotation);
+    method public int pushStyle(androidx.ui.text.SpanStyle style);
+    method public int pushStyle(androidx.ui.text.ParagraphStyle style);
+    method public androidx.ui.text.AnnotatedString toAnnotatedString();
+    property public final int length;
+  }
+
+  public static final class AnnotatedString.Item<T> {
+    ctor public AnnotatedString.Item(T! item, int start, int end, String scope);
+    ctor public AnnotatedString.Item(T! item, int start, int end);
+    method public T! component1();
+    method public int component2();
+    method public int component3();
+    method public String component4();
+    method public androidx.ui.text.AnnotatedString.Item<T> copy(T! item, int start, int end, String scope);
+    method public int getEnd();
+    method public T! getItem();
+    method public String getScope();
+    method public int getStart();
+  }
+
+  public final class AnnotatedStringKt {
+    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.SpanStyle spanStyle, androidx.ui.text.ParagraphStyle? paragraphStyle = null);
+    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.ParagraphStyle paragraphStyle);
+    method public static inline androidx.ui.text.AnnotatedString AnnotatedString(kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
+    method public static androidx.ui.text.AnnotatedString capitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static androidx.ui.text.AnnotatedString decapitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static int getLength(androidx.ui.text.AnnotatedString);
+    method public static androidx.ui.text.AnnotatedString subSequence(androidx.ui.text.AnnotatedString, int start, int end);
+    method public static androidx.ui.text.AnnotatedString toLowerCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static androidx.ui.text.AnnotatedString toUpperCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
+    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
+  }
+
+  public final class Locale {
+    ctor public Locale(String languageTag);
+    method public String getLanguage();
+    method public String getRegion();
+    method public String getScript();
+    method public String toLanguageTag();
+    property public final String language;
+    property public final String region;
+    property public final String script;
+    field public static final androidx.ui.text.Locale.Companion! Companion;
+  }
+
+  public static final class Locale.Companion {
+    method public androidx.ui.text.Locale getCurrent();
+    property public final androidx.ui.text.Locale current;
+  }
+
+  public final class LocaleList implements java.util.Collection<androidx.ui.text.Locale> kotlin.jvm.internal.markers.KMappedMarker {
+    ctor public LocaleList(java.util.List<androidx.ui.text.Locale> localeList);
+    ctor public LocaleList(String languageTags);
+    ctor public LocaleList(androidx.ui.text.Locale... locales);
+    method public java.util.List<androidx.ui.text.Locale> component1();
+    method public operator boolean contains(androidx.ui.text.Locale element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public androidx.ui.text.LocaleList copy(java.util.List<androidx.ui.text.Locale> localeList);
+    method public operator androidx.ui.text.Locale get(int i);
+    method public java.util.List<androidx.ui.text.Locale> getLocaleList();
+    method public int getSize();
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.ui.text.Locale> iterator();
+    property public int size;
+    field public static final androidx.ui.text.LocaleList.Companion! Companion;
+  }
+
+  public static final class LocaleList.Companion {
+    method public androidx.ui.text.LocaleList getCurrent();
+    property public final androidx.ui.text.LocaleList current;
+  }
+
+  public final class MultiParagraph {
+    ctor public MultiParagraph(androidx.ui.text.MultiParagraphIntrinsics intrinsics, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints);
+    ctor public MultiParagraph(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
+    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public androidx.ui.text.MultiParagraphIntrinsics getIntrinsics();
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineForOffset(int offset);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public int getMaxLines();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
+    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
+    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public androidx.ui.text.TextRange getWordBoundary(int offset);
+    method public void paint(androidx.ui.graphics.Canvas canvas);
+    property public final boolean didExceedMaxLines;
+    property public final float firstBaseline;
+    property public final float height;
+    property public final float lastBaseline;
+    property public final int lineCount;
+    property public final float maxIntrinsicWidth;
+    property public final float minIntrinsicWidth;
+    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
+    property public final float width;
+  }
+
+  public final class MultiParagraphIntrinsics implements androidx.ui.text.ParagraphIntrinsics {
+    ctor public MultiParagraphIntrinsics(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public androidx.ui.text.AnnotatedString getAnnotatedString();
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
+    property public float maxIntrinsicWidth;
+    property public float minIntrinsicWidth;
+  }
+
+  public final class MultiParagraphIntrinsicsKt {
+  }
+
+  public final class MultiParagraphKt {
+  }
+
+  public interface Paragraph {
+    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
+    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineForOffset(int offset);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
+    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
+    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public androidx.ui.text.TextRange getWordBoundary(int offset);
+    method public void paint(androidx.ui.graphics.Canvas canvas);
+    property public abstract boolean didExceedMaxLines;
+    property public abstract float firstBaseline;
+    property public abstract float height;
+    property public abstract float lastBaseline;
+    property public abstract int lineCount;
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+    property public abstract java.util.List<androidx.ui.geometry.Rect> placeholderRects;
+    property public abstract float width;
+  }
+
+  public final class ParagraphConstraints {
+    ctor public ParagraphConstraints(float width);
+    method public float component1();
+    method public androidx.ui.text.ParagraphConstraints copy(float width);
+    method public float getWidth();
+  }
+
+  public interface ParagraphIntrinsics {
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+  }
+
+  public final class ParagraphIntrinsicsKt {
+    method public static androidx.ui.text.ParagraphIntrinsics ParagraphIntrinsics(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+  }
+
+  public final class ParagraphKt {
+    method public static androidx.ui.text.Paragraph Paragraph(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public static androidx.ui.text.Paragraph Paragraph(androidx.ui.text.ParagraphIntrinsics paragraphIntrinsics, int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints);
+  }
+
+  public final class ParagraphStyle {
+    ctor public ParagraphStyle(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    ctor public ParagraphStyle();
+    method public androidx.ui.text.style.TextAlign? component1();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? component2();
+    method public androidx.ui.unit.TextUnit component3();
+    method public androidx.ui.text.style.TextIndent? component4();
+    method public androidx.ui.text.ParagraphStyle copy(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    method public androidx.ui.unit.TextUnit getLineHeight();
+    method public androidx.ui.text.style.TextAlign? getTextAlign();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
+    method public androidx.ui.text.style.TextIndent? getTextIndent();
+    method public androidx.ui.text.ParagraphStyle merge(androidx.ui.text.ParagraphStyle? other = null);
+  }
+
+  public final class ParagraphStyleKt {
+    method public static androidx.ui.text.ParagraphStyle lerp(androidx.ui.text.ParagraphStyle start, androidx.ui.text.ParagraphStyle stop, float fraction);
+  }
+
+  public final class Placeholder {
+    ctor public Placeholder(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
+    method public androidx.ui.unit.TextUnit component1();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.PlaceholderVerticalAlign component3();
+    method public androidx.ui.text.Placeholder copy(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
+    method public androidx.ui.unit.TextUnit getHeight();
+    method public androidx.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
+    method public androidx.ui.unit.TextUnit getWidth();
+  }
+
+  public enum PlaceholderVerticalAlign {
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign AboveBaseline;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Bottom;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Center;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextBottom;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextCenter;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextTop;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Top;
+  }
+
+  public final class SpanStyle {
+    ctor public SpanStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
+    ctor public SpanStyle();
+    method public androidx.ui.graphics.Color? component1();
+    method public androidx.ui.text.style.TextGeometricTransform? component10();
+    method public androidx.ui.text.LocaleList? component11();
+    method public androidx.ui.graphics.Color? component12();
+    method public androidx.ui.text.style.TextDecoration? component13();
+    method public androidx.ui.graphics.Shadow? component14();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.font.FontWeight? component3();
+    method public androidx.ui.text.font.FontStyle? component4();
+    method public androidx.ui.text.font.FontSynthesis? component5();
+    method public androidx.ui.text.font.FontFamily? component6();
+    method public String? component7();
+    method public androidx.ui.unit.TextUnit component8();
+    method public androidx.ui.text.style.BaselineShift? component9();
+    method public androidx.ui.text.SpanStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
+    method public androidx.ui.graphics.Color? getBackground();
+    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
+    method public androidx.ui.graphics.Color? getColor();
+    method public androidx.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public androidx.ui.unit.TextUnit getFontSize();
+    method public androidx.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.ui.text.font.FontWeight? getFontWeight();
+    method public androidx.ui.unit.TextUnit getLetterSpacing();
+    method public androidx.ui.text.LocaleList? getLocaleList();
+    method public androidx.ui.graphics.Shadow? getShadow();
+    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
+    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
+    method public androidx.ui.text.SpanStyle merge(androidx.ui.text.SpanStyle? other = null);
+  }
+
+  public final class SpanStyleKt {
+    method public static androidx.ui.text.SpanStyle lerp(androidx.ui.text.SpanStyle start, androidx.ui.text.SpanStyle stop, float fraction);
+  }
+
+  public final class StringKt {
+    method public static String capitalize(String, androidx.ui.text.Locale locale);
+    method public static String capitalize(String, androidx.ui.text.LocaleList localeList);
+    method public static String decapitalize(String, androidx.ui.text.Locale locale);
+    method public static String decapitalize(String, androidx.ui.text.LocaleList localeList);
+    method public static String toLowerCase(String, androidx.ui.text.Locale locale);
+    method public static String toLowerCase(String, androidx.ui.text.LocaleList localeList);
+    method public static String toUpperCase(String, androidx.ui.text.Locale locale);
+    method public static String toUpperCase(String, androidx.ui.text.LocaleList localeList);
+  }
+
+  public final class TextLayoutHelperKt {
+  }
+
+  public final class TextLayoutInput {
+    ctor public TextLayoutInput(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
+    method public androidx.ui.text.AnnotatedString component1();
+    method public androidx.ui.core.Constraints component10();
+    method public androidx.ui.text.TextStyle component2();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> component3();
+    method public int component4();
+    method public boolean component5();
+    method public androidx.ui.text.style.TextOverflow component6();
+    method public androidx.ui.unit.Density component7();
+    method public androidx.ui.core.LayoutDirection component8();
+    method public androidx.ui.text.font.Font.ResourceLoader component9();
+    method public androidx.ui.text.TextLayoutInput copy(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
+    method public androidx.ui.core.Constraints getConstraints();
+    method public androidx.ui.unit.Density getDensity();
+    method public androidx.ui.core.LayoutDirection getLayoutDirection();
+    method public int getMaxLines();
+    method public androidx.ui.text.style.TextOverflow getOverflow();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
+    method public androidx.ui.text.font.Font.ResourceLoader getResourceLoader();
+    method public boolean getSoftWrap();
+    method public androidx.ui.text.TextStyle getStyle();
+    method public androidx.ui.text.AnnotatedString getText();
+  }
+
+  public final class TextLayoutResult {
+    method public androidx.ui.text.TextLayoutInput component1();
+    method public androidx.ui.unit.IntPxSize component3();
+    method public androidx.ui.text.TextLayoutResult copy(androidx.ui.text.TextLayoutInput layoutInput, androidx.ui.text.MultiParagraph multiParagraph, androidx.ui.unit.IntPxSize size);
+    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
+    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidOverflowHeight();
+    method public boolean getDidOverflowWidth();
+    method public androidx.ui.unit.Px getFirstBaseline();
+    method public boolean getHasVisualOverflow();
+    method public androidx.ui.unit.Px getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public androidx.ui.unit.Px getLastBaseline();
+    method public androidx.ui.text.TextLayoutInput getLayoutInput();
+    method public androidx.ui.unit.Px getLineBottom(int lineIndex);
+    method public int getLineForOffset(int offset);
+    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
+    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
+    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
+    method public androidx.ui.unit.IntPxSize getSize();
+    method public androidx.ui.text.TextRange getWordBoundary(int offset);
+    property public final boolean didOverflowHeight;
+    property public final boolean didOverflowWidth;
+    property public final androidx.ui.unit.Px firstBaseline;
+    property public final boolean hasVisualOverflow;
+    property public final androidx.ui.unit.Px lastBaseline;
+    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
+  }
+
+  public final class TextPainter {
+    method public void paint(androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
+    field public static final androidx.ui.text.TextPainter! INSTANCE;
+  }
+
+  public final class TextRange {
+    ctor public TextRange(int start, int end);
+    method public int component1();
+    method public int component2();
+    method public operator boolean contains(androidx.ui.text.TextRange other);
+    method public operator boolean contains(int offset);
+    method public androidx.ui.text.TextRange copy(int start, int end);
+    method public boolean getCollapsed();
+    method public int getEnd();
+    method public int getLength();
+    method public int getMax();
+    method public int getMin();
+    method public int getStart();
+    method public boolean intersects(androidx.ui.text.TextRange other);
+    property public final boolean collapsed;
+    property public final int length;
+    property public final int max;
+    property public final int min;
+  }
+
+  public final class TextRangeKt {
+    method public static String substring(CharSequence, androidx.ui.text.TextRange range);
+  }
+
+  public final class TextStyle {
+    ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    ctor public TextStyle();
+    method public androidx.ui.graphics.Color? component1();
+    method public androidx.ui.text.style.TextGeometricTransform? component10();
+    method public androidx.ui.text.LocaleList? component11();
+    method public androidx.ui.graphics.Color? component12();
+    method public androidx.ui.text.style.TextDecoration? component13();
+    method public androidx.ui.graphics.Shadow? component14();
+    method public androidx.ui.text.style.TextAlign? component15();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? component16();
+    method public androidx.ui.unit.TextUnit component17();
+    method public androidx.ui.text.style.TextIndent? component18();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.font.FontWeight? component3();
+    method public androidx.ui.text.font.FontStyle? component4();
+    method public androidx.ui.text.font.FontSynthesis? component5();
+    method public androidx.ui.text.font.FontFamily? component6();
+    method public String? component7();
+    method public androidx.ui.unit.TextUnit component8();
+    method public androidx.ui.text.style.BaselineShift? component9();
+    method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    method public androidx.ui.graphics.Color? getBackground();
+    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
+    method public androidx.ui.graphics.Color? getColor();
+    method public androidx.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public androidx.ui.unit.TextUnit getFontSize();
+    method public androidx.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.ui.text.font.FontWeight? getFontWeight();
+    method public androidx.ui.unit.TextUnit getLetterSpacing();
+    method public androidx.ui.unit.TextUnit getLineHeight();
+    method public androidx.ui.text.LocaleList? getLocaleList();
+    method public androidx.ui.graphics.Shadow? getShadow();
+    method public androidx.ui.text.style.TextAlign? getTextAlign();
+    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
+    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
+    method public androidx.ui.text.style.TextIndent? getTextIndent();
+    method public androidx.ui.text.TextStyle merge(androidx.ui.text.TextStyle? other = null);
+    method public androidx.ui.text.TextStyle merge(androidx.ui.text.SpanStyle other);
+    method public androidx.ui.text.TextStyle merge(androidx.ui.text.ParagraphStyle other);
+    method public androidx.ui.text.ParagraphStyle toParagraphStyle();
+    method public androidx.ui.text.SpanStyle toSpanStyle();
+    field public static final androidx.ui.text.TextStyle.Companion! Companion;
+  }
+
+  public static final class TextStyle.Companion {
+    method public androidx.ui.text.TextStyle getDefault();
+    property public final androidx.ui.text.TextStyle Default;
+  }
+
+  public final class TextStyleKt {
+    method public static androidx.ui.text.TextStyle lerp(androidx.ui.text.TextStyle start, androidx.ui.text.TextStyle stop, float fraction);
+    method public static androidx.ui.text.TextStyle resolveDefaults(androidx.ui.text.TextStyle style, androidx.ui.core.LayoutDirection direction);
+  }
+
+  public interface Typeface {
+    method public androidx.ui.text.font.FontFamily getFontFamily();
+    property public abstract androidx.ui.text.font.FontFamily fontFamily;
+  }
+
+  public final class TypefaceKt {
+    method public static androidx.ui.text.Typeface typefaceFromFontFamily(android.content.Context context, androidx.ui.text.font.FontFamily fontFamily, java.util.List<? extends kotlin.Pair<androidx.ui.text.font.FontWeight,? extends androidx.ui.text.font.FontStyle>>? necessaryStyles = null);
+  }
+
+}
+
+package androidx.ui.text.font {
+
+  public abstract sealed class FileBasedFontFamily extends androidx.ui.text.font.FontFamily {
+  }
+
+  public interface Font {
+    method public androidx.ui.text.font.FontStyle getStyle();
+    method public androidx.ui.text.font.FontWeight getWeight();
+    property public abstract androidx.ui.text.font.FontStyle style;
+    property public abstract androidx.ui.text.font.FontWeight weight;
+  }
+
+  public static interface Font.ResourceLoader {
+    method public Object load(androidx.ui.text.font.Font font);
+  }
+
+  public abstract sealed class FontFamily {
+    method public final boolean getCanLoadSynchronously();
+    field public static final androidx.ui.text.font.FontFamily.Companion! Companion;
+  }
+
+  public static final class FontFamily.Companion {
+    method public androidx.ui.text.font.GenericFontFamily getCursive();
+    method public androidx.ui.text.font.SystemFontFamily getDefault();
+    method public androidx.ui.text.font.GenericFontFamily getMonospace();
+    method public androidx.ui.text.font.GenericFontFamily getSansSerif();
+    method public androidx.ui.text.font.GenericFontFamily getSerif();
+    property public final androidx.ui.text.font.GenericFontFamily Cursive;
+    property public final androidx.ui.text.font.SystemFontFamily Default;
+    property public final androidx.ui.text.font.GenericFontFamily Monospace;
+    property public final androidx.ui.text.font.GenericFontFamily SansSerif;
+    property public final androidx.ui.text.font.GenericFontFamily Serif;
+  }
+
+  public final class FontFamilyKt {
+    method public static androidx.ui.text.font.FontListFontFamily fontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
+    method public static androidx.ui.text.font.FontListFontFamily fontFamily(androidx.ui.text.font.Font... fonts);
+    method public static androidx.ui.text.font.LoadedFontFamily fontFamily(androidx.ui.text.Typeface typeface);
+  }
+
+  public final class FontKt {
+    method public static androidx.ui.text.font.FontListFontFamily asFontFamily(androidx.ui.text.font.Font);
+    method public static androidx.ui.text.font.Font font(int resId, androidx.ui.text.font.FontWeight weight = FontWeight.Normal, androidx.ui.text.font.FontStyle style = androidx.ui.text.font.FontStyle.Normal);
+  }
+
+  public final class FontListFontFamily extends androidx.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.ui.text.font.Font> {
+    ctor public FontListFontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
+    method public java.util.List<androidx.ui.text.font.Font> component1();
+    method public boolean contains(androidx.ui.text.font.Font element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public androidx.ui.text.font.FontListFontFamily copy(java.util.List<? extends androidx.ui.text.font.Font> fonts);
+    method public androidx.ui.text.font.Font get(int index);
+    method public java.util.List<androidx.ui.text.font.Font> getFonts();
+    method public int getSize();
+    method public int indexOf(androidx.ui.text.font.Font element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.ui.text.font.Font> iterator();
+    method public int lastIndexOf(androidx.ui.text.font.Font element);
+    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator();
+    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator(int index);
+    method public java.util.List<androidx.ui.text.font.Font> subList(int fromIndex, int toIndex);
+  }
+
+  public enum FontStyle {
+    enum_constant public static final androidx.ui.text.font.FontStyle Italic;
+    enum_constant public static final androidx.ui.text.font.FontStyle Normal;
+  }
+
+  public enum FontSynthesis {
+    enum_constant public static final androidx.ui.text.font.FontSynthesis All;
+    enum_constant public static final androidx.ui.text.font.FontSynthesis None;
+    enum_constant public static final androidx.ui.text.font.FontSynthesis Style;
+    enum_constant public static final androidx.ui.text.font.FontSynthesis Weight;
+  }
+
+  public final class FontWeight implements java.lang.Comparable<androidx.ui.text.font.FontWeight> {
+    method public int compareTo(androidx.ui.text.font.FontWeight other);
+    method public androidx.ui.text.font.FontWeight copy(int weight);
+    field public static final androidx.ui.text.font.FontWeight.Companion! Companion;
+  }
+
+  public static final class FontWeight.Companion {
+    method public androidx.ui.text.font.FontWeight getBlack();
+    method public androidx.ui.text.font.FontWeight getBold();
+    method public androidx.ui.text.font.FontWeight getExtraBold();
+    method public androidx.ui.text.font.FontWeight getExtraLight();
+    method public androidx.ui.text.font.FontWeight getLight();
+    method public androidx.ui.text.font.FontWeight getMedium();
+    method public androidx.ui.text.font.FontWeight getNormal();
+    method public androidx.ui.text.font.FontWeight getSemiBold();
+    method public androidx.ui.text.font.FontWeight getThin();
+    method public androidx.ui.text.font.FontWeight getW100();
+    method public androidx.ui.text.font.FontWeight getW200();
+    method public androidx.ui.text.font.FontWeight getW300();
+    method public androidx.ui.text.font.FontWeight getW400();
+    method public androidx.ui.text.font.FontWeight getW500();
+    method public androidx.ui.text.font.FontWeight getW600();
+    method public androidx.ui.text.font.FontWeight getW700();
+    method public androidx.ui.text.font.FontWeight getW800();
+    method public androidx.ui.text.font.FontWeight getW900();
+    property public final androidx.ui.text.font.FontWeight Black;
+    property public final androidx.ui.text.font.FontWeight Bold;
+    property public final androidx.ui.text.font.FontWeight ExtraBold;
+    property public final androidx.ui.text.font.FontWeight ExtraLight;
+    property public final androidx.ui.text.font.FontWeight Light;
+    property public final androidx.ui.text.font.FontWeight Medium;
+    property public final androidx.ui.text.font.FontWeight Normal;
+    property public final androidx.ui.text.font.FontWeight SemiBold;
+    property public final androidx.ui.text.font.FontWeight Thin;
+    property public final androidx.ui.text.font.FontWeight W100;
+    property public final androidx.ui.text.font.FontWeight W200;
+    property public final androidx.ui.text.font.FontWeight W300;
+    property public final androidx.ui.text.font.FontWeight W400;
+    property public final androidx.ui.text.font.FontWeight W500;
+    property public final androidx.ui.text.font.FontWeight W600;
+    property public final androidx.ui.text.font.FontWeight W700;
+    property public final androidx.ui.text.font.FontWeight W800;
+    property public final androidx.ui.text.font.FontWeight W900;
+  }
+
+  public final class FontWeightKt {
+    method public static androidx.ui.text.font.FontWeight lerp(androidx.ui.text.font.FontWeight start, androidx.ui.text.font.FontWeight stop, float fraction);
+  }
+
+  public final class GenericFontFamily extends androidx.ui.text.font.SystemFontFamily {
+    method public String getName();
+  }
+
+  public final class LoadedFontFamily extends androidx.ui.text.font.FontFamily {
+    ctor public LoadedFontFamily(androidx.ui.text.Typeface typeface);
+    method public androidx.ui.text.Typeface component1();
+    method public androidx.ui.text.font.LoadedFontFamily copy(androidx.ui.text.Typeface typeface);
+    method public androidx.ui.text.Typeface getTypeface();
+  }
+
+  public final class ResourceFont implements androidx.ui.text.font.Font {
+    ctor public ResourceFont(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
+    method public int component1();
+    method public androidx.ui.text.font.FontWeight component2();
+    method public androidx.ui.text.font.FontStyle component3();
+    method public androidx.ui.text.font.ResourceFont copy(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
+    method public int getResId();
+    method public androidx.ui.text.font.FontStyle getStyle();
+    method public androidx.ui.text.font.FontWeight getWeight();
+  }
+
+  public abstract sealed class SystemFontFamily extends androidx.ui.text.font.FontFamily {
+  }
+
+}
+
+package androidx.ui.text.platform {
+
+  public final class AndroidParagraphHelperKt {
+  }
+
+  public final class AndroidParagraphKt {
+  }
+
+  public final class PlatformLocaleKt {
+  }
+
+}
+
+package androidx.ui.text.style {
+
+  public final class BaselineShift {
+    ctor public BaselineShift(float multiplier);
+    method public float component1();
+    method public androidx.ui.text.style.BaselineShift copy(float multiplier);
+    method public float getMultiplier();
+    field public static final androidx.ui.text.style.BaselineShift.Companion! Companion;
+  }
+
+  public static final class BaselineShift.Companion {
+    method public androidx.ui.text.style.BaselineShift getNone();
+    method public androidx.ui.text.style.BaselineShift getSubscript();
+    method public androidx.ui.text.style.BaselineShift getSuperscript();
+    property public final androidx.ui.text.style.BaselineShift None;
+    property public final androidx.ui.text.style.BaselineShift Subscript;
+    property public final androidx.ui.text.style.BaselineShift Superscript;
+  }
+
+  public final class BaselineShiftKt {
+    method public static androidx.ui.text.style.BaselineShift lerp(androidx.ui.text.style.BaselineShift start, androidx.ui.text.style.BaselineShift stop, float fraction);
+  }
+
+  public enum TextAlign {
+    enum_constant public static final androidx.ui.text.style.TextAlign Center;
+    enum_constant public static final androidx.ui.text.style.TextAlign End;
+    enum_constant public static final androidx.ui.text.style.TextAlign Justify;
+    enum_constant public static final androidx.ui.text.style.TextAlign Left;
+    enum_constant public static final androidx.ui.text.style.TextAlign Right;
+    enum_constant public static final androidx.ui.text.style.TextAlign Start;
+  }
+
+  public final class TextDecoration {
+    method public int component1();
+    method public boolean contains(androidx.ui.text.style.TextDecoration other);
+    method public androidx.ui.text.style.TextDecoration copy(int mask);
+    method public int getMask();
+    field public static final androidx.ui.text.style.TextDecoration.Companion! Companion;
+  }
+
+  public static final class TextDecoration.Companion {
+    method public androidx.ui.text.style.TextDecoration combine(java.util.List<androidx.ui.text.style.TextDecoration> decorations);
+    method public androidx.ui.text.style.TextDecoration getLineThrough();
+    method public androidx.ui.text.style.TextDecoration getNone();
+    method public androidx.ui.text.style.TextDecoration getUnderline();
+    property public final androidx.ui.text.style.TextDecoration LineThrough;
+    property public final androidx.ui.text.style.TextDecoration None;
+    property public final androidx.ui.text.style.TextDecoration Underline;
+  }
+
+  public enum TextDirection {
+    enum_constant public static final androidx.ui.text.style.TextDirection Ltr;
+    enum_constant public static final androidx.ui.text.style.TextDirection Rtl;
+  }
+
+  public enum TextDirectionAlgorithm {
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrLtr;
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrRtl;
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceLtr;
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceRtl;
+  }
+
+  public final class TextGeometricTransform {
+    ctor public TextGeometricTransform(float scaleX, float skewX);
+    ctor public TextGeometricTransform();
+    method public float component1();
+    method public float component2();
+    method public androidx.ui.text.style.TextGeometricTransform copy(float scaleX, float skewX);
+    method public float getScaleX();
+    method public float getSkewX();
+    field public static final androidx.ui.text.style.TextGeometricTransform.Companion! Companion;
+  }
+
+  public static final class TextGeometricTransform.Companion {
+  }
+
+  public final class TextGeometricTransformKt {
+    method public static androidx.ui.text.style.TextGeometricTransform lerp(androidx.ui.text.style.TextGeometricTransform start, androidx.ui.text.style.TextGeometricTransform stop, float fraction);
+  }
+
+  public final class TextIndent {
+    ctor public TextIndent(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
+    ctor public TextIndent();
+    method public androidx.ui.unit.TextUnit component1();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.style.TextIndent copy(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
+    method public androidx.ui.unit.TextUnit getFirstLine();
+    method public androidx.ui.unit.TextUnit getRestLine();
+    field public static final androidx.ui.text.style.TextIndent.Companion! Companion;
+  }
+
+  public static final class TextIndent.Companion {
+    method public androidx.ui.text.style.TextIndent getNone();
+    property public final androidx.ui.text.style.TextIndent None;
+  }
+
+  public final class TextIndentKt {
+    method public static androidx.ui.text.style.TextIndent lerp(androidx.ui.text.style.TextIndent start, androidx.ui.text.style.TextIndent stop, float fraction);
+  }
+
+  public enum TextOverflow {
+    enum_constant public static final androidx.ui.text.style.TextOverflow Clip;
+    enum_constant public static final androidx.ui.text.style.TextOverflow Ellipsis;
+  }
+
+}
+
diff --git a/ui/ui-text/api/res-0.1.0-dev01.txt b/ui/ui-text-core/api/res-0.1.0-dev01.txt
similarity index 100%
rename from ui/ui-text/api/res-0.1.0-dev01.txt
rename to ui/ui-text-core/api/res-0.1.0-dev01.txt
diff --git a/ui/ui-text/api/res-0.1.0-dev02.txt b/ui/ui-text-core/api/res-0.1.0-dev02.txt
similarity index 100%
rename from ui/ui-text/api/res-0.1.0-dev02.txt
rename to ui/ui-text-core/api/res-0.1.0-dev02.txt
diff --git a/ui/ui-text/api/res-0.1.0-dev03.txt b/ui/ui-text-core/api/res-0.1.0-dev03.txt
similarity index 100%
rename from ui/ui-text/api/res-0.1.0-dev03.txt
rename to ui/ui-text-core/api/res-0.1.0-dev03.txt
diff --git a/ui/ui-text/api/res-0.1.0-dev04.txt b/ui/ui-text-core/api/res-0.1.0-dev04.txt
similarity index 100%
rename from ui/ui-text/api/res-0.1.0-dev04.txt
rename to ui/ui-text-core/api/res-0.1.0-dev04.txt
diff --git a/ui/ui-text/api/res-0.1.0-dev05.txt b/ui/ui-text-core/api/res-0.1.0-dev05.txt
similarity index 100%
rename from ui/ui-text/api/res-0.1.0-dev05.txt
rename to ui/ui-text-core/api/res-0.1.0-dev05.txt
diff --git a/ui/ui-text/api/res-0.1.0-dev06.txt b/ui/ui-text-core/api/res-0.1.0-dev06.txt
similarity index 100%
rename from ui/ui-text/api/res-0.1.0-dev06.txt
rename to ui/ui-text-core/api/res-0.1.0-dev06.txt
diff --git a/ui/ui-text/api/res-0.1.0-dev07.txt b/ui/ui-text-core/api/res-0.1.0-dev07.txt
similarity index 100%
rename from ui/ui-text/api/res-0.1.0-dev07.txt
rename to ui/ui-text-core/api/res-0.1.0-dev07.txt
diff --git a/ui/ui-text/api/res-0.1.0-dev08.txt b/ui/ui-text-core/api/res-0.1.0-dev08.txt
similarity index 100%
rename from ui/ui-text/api/res-0.1.0-dev08.txt
rename to ui/ui-text-core/api/res-0.1.0-dev08.txt
diff --git a/ui/ui-android-text/api/res-0.1.0-dev09.txt b/ui/ui-text-core/api/res-0.1.0-dev09.txt
similarity index 100%
copy from ui/ui-android-text/api/res-0.1.0-dev09.txt
copy to ui/ui-text-core/api/res-0.1.0-dev09.txt
diff --git a/ui/ui-text/api/restricted_0.1.0-dev01.txt b/ui/ui-text-core/api/restricted_0.1.0-dev01.txt
similarity index 100%
rename from ui/ui-text/api/restricted_0.1.0-dev01.txt
rename to ui/ui-text-core/api/restricted_0.1.0-dev01.txt
diff --git a/ui/ui-text/api/restricted_0.1.0-dev02.txt b/ui/ui-text-core/api/restricted_0.1.0-dev02.txt
similarity index 100%
rename from ui/ui-text/api/restricted_0.1.0-dev02.txt
rename to ui/ui-text-core/api/restricted_0.1.0-dev02.txt
diff --git a/ui/ui-text/api/restricted_0.1.0-dev03.txt b/ui/ui-text-core/api/restricted_0.1.0-dev03.txt
similarity index 100%
rename from ui/ui-text/api/restricted_0.1.0-dev03.txt
rename to ui/ui-text-core/api/restricted_0.1.0-dev03.txt
diff --git a/ui/ui-text/api/restricted_0.1.0-dev04.txt b/ui/ui-text-core/api/restricted_0.1.0-dev04.txt
similarity index 100%
rename from ui/ui-text/api/restricted_0.1.0-dev04.txt
rename to ui/ui-text-core/api/restricted_0.1.0-dev04.txt
diff --git a/ui/ui-text/api/restricted_0.1.0-dev05.txt b/ui/ui-text-core/api/restricted_0.1.0-dev05.txt
similarity index 100%
rename from ui/ui-text/api/restricted_0.1.0-dev05.txt
rename to ui/ui-text-core/api/restricted_0.1.0-dev05.txt
diff --git a/ui/ui-text/api/restricted_0.1.0-dev06.txt b/ui/ui-text-core/api/restricted_0.1.0-dev06.txt
similarity index 100%
rename from ui/ui-text/api/restricted_0.1.0-dev06.txt
rename to ui/ui-text-core/api/restricted_0.1.0-dev06.txt
diff --git a/ui/ui-text/api/restricted_0.1.0-dev07.txt b/ui/ui-text-core/api/restricted_0.1.0-dev07.txt
similarity index 100%
rename from ui/ui-text/api/restricted_0.1.0-dev07.txt
rename to ui/ui-text-core/api/restricted_0.1.0-dev07.txt
diff --git a/ui/ui-text/api/restricted_0.1.0-dev08.txt b/ui/ui-text-core/api/restricted_0.1.0-dev08.txt
similarity index 100%
rename from ui/ui-text/api/restricted_0.1.0-dev08.txt
rename to ui/ui-text-core/api/restricted_0.1.0-dev08.txt
diff --git a/ui/ui-text-core/api/restricted_0.1.0-dev09.txt b/ui/ui-text-core/api/restricted_0.1.0-dev09.txt
new file mode 100644
index 0000000..3364849
--- /dev/null
+++ b/ui/ui-text-core/api/restricted_0.1.0-dev09.txt
@@ -0,0 +1,955 @@
+// Signature format: 3.0
+package androidx.ui.input {
+
+  public final class BackspaceKeyEditOp implements androidx.ui.input.EditOperation {
+    ctor public BackspaceKeyEditOp();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class CommitTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public CommitTextEditOp(String text, int newCursorPosition);
+    method public String component1();
+    method public int component2();
+    method public androidx.ui.input.CommitTextEditOp copy(String text, int newCursorPosition);
+    method public int getNewCursorPosition();
+    method public String getText();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public DeleteSurroundingTextEditOp(int beforeLength, int afterLength);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.DeleteSurroundingTextEditOp copy(int beforeLength, int afterLength);
+    method public int getAfterLength();
+    method public int getBeforeLength();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextInCodePointsEditOp implements androidx.ui.input.EditOperation {
+    ctor public DeleteSurroundingTextInCodePointsEditOp(int beforeLength, int afterLength);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.DeleteSurroundingTextInCodePointsEditOp copy(int beforeLength, int afterLength);
+    method public int getAfterLength();
+    method public int getBeforeLength();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public interface EditOperation {
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class EditProcessor {
+    method public androidx.ui.input.EditorValue onEditCommands(java.util.List<? extends androidx.ui.input.EditOperation> ops);
+    method public void onNewState(androidx.ui.input.EditorValue model, androidx.ui.input.TextInputService? textInputService, int token);
+  }
+
+  public final class EditingBuffer {
+    ctor public EditingBuffer(String initialText, androidx.ui.text.TextRange initialSelection);
+    field public static final int NOWHERE = -1; // 0xffffffff
+  }
+
+  public final class EditorValue {
+    ctor public EditorValue(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
+    ctor public EditorValue();
+    method public String component1();
+    method public androidx.ui.text.TextRange component2();
+    method public androidx.ui.text.TextRange? component3();
+    method public androidx.ui.input.EditorValue copy(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
+    method public androidx.ui.text.TextRange? getComposition();
+    method public String getSelectedText();
+    method public androidx.ui.text.TextRange getSelection();
+    method public String getText();
+    method public String getTextAfterSelection(int maxChars);
+    method public String getTextBeforeSelection(int maxChars);
+  }
+
+  public final class FinishComposingTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public FinishComposingTextEditOp();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public enum ImeAction {
+    enum_constant public static final androidx.ui.input.ImeAction Done;
+    enum_constant public static final androidx.ui.input.ImeAction Go;
+    enum_constant public static final androidx.ui.input.ImeAction Next;
+    enum_constant public static final androidx.ui.input.ImeAction NoAction;
+    enum_constant public static final androidx.ui.input.ImeAction Previous;
+    enum_constant public static final androidx.ui.input.ImeAction Search;
+    enum_constant public static final androidx.ui.input.ImeAction Send;
+    enum_constant public static final androidx.ui.input.ImeAction Unspecified;
+  }
+
+  public interface InputEventListener {
+    method public void onEditOperations(java.util.List<? extends androidx.ui.input.EditOperation> editOps);
+    method public void onImeAction(androidx.ui.input.ImeAction imeAction);
+  }
+
+  public enum KeyboardType {
+    enum_constant public static final androidx.ui.input.KeyboardType Ascii;
+    enum_constant public static final androidx.ui.input.KeyboardType Email;
+    enum_constant public static final androidx.ui.input.KeyboardType Number;
+    enum_constant public static final androidx.ui.input.KeyboardType NumberPassword;
+    enum_constant public static final androidx.ui.input.KeyboardType Password;
+    enum_constant public static final androidx.ui.input.KeyboardType Phone;
+    enum_constant public static final androidx.ui.input.KeyboardType Text;
+    enum_constant public static final androidx.ui.input.KeyboardType Uri;
+  }
+
+  public final class MoveCursorEditOp implements androidx.ui.input.EditOperation {
+    ctor public MoveCursorEditOp(int amount);
+    method public int component1();
+    method public androidx.ui.input.MoveCursorEditOp copy(int amount);
+    method public int getAmount();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public interface OffsetMap {
+    method public int originalToTransformed(int offset);
+    method public int transformedToOriginal(int offset);
+    field public static final androidx.ui.input.OffsetMap.Companion! Companion;
+  }
+
+  public static final class OffsetMap.Companion {
+    method public androidx.ui.input.OffsetMap getIdentityOffsetMap();
+    property public final androidx.ui.input.OffsetMap identityOffsetMap;
+  }
+
+  public final class PasswordVisualTransformation implements androidx.ui.input.VisualTransformation {
+    ctor public PasswordVisualTransformation(char mask);
+    ctor public PasswordVisualTransformation();
+    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+    method public char getMask();
+  }
+
+  public interface PlatformTextInputService {
+    method public void hideSoftwareKeyboard();
+    method public void notifyFocusedRect(androidx.ui.geometry.Rect rect);
+    method public void onStateUpdated(androidx.ui.input.EditorValue model);
+    method public void showSoftwareKeyboard();
+    method public void startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput();
+  }
+
+  public final class SetComposingRegionEditOp implements androidx.ui.input.EditOperation {
+    ctor public SetComposingRegionEditOp(int start, int end);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.SetComposingRegionEditOp copy(int start, int end);
+    method public int getEnd();
+    method public int getStart();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class SetComposingTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public SetComposingTextEditOp(String text, int newCursorPosition);
+    method public String component1();
+    method public int component2();
+    method public androidx.ui.input.SetComposingTextEditOp copy(String text, int newCursorPosition);
+    method public int getNewCursorPosition();
+    method public String getText();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class SetSelectionEditOp implements androidx.ui.input.EditOperation {
+    ctor public SetSelectionEditOp(int start, int end);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.SetSelectionEditOp copy(int start, int end);
+    method public int getEnd();
+    method public int getStart();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public class TextInputService {
+    ctor public TextInputService(androidx.ui.input.PlatformTextInputService platformTextInputService);
+    method public void hideSoftwareKeyboard(int token);
+    method public void notifyFocusedRect(int token, androidx.ui.geometry.Rect rect);
+    method public void onStateUpdated(int token, androidx.ui.input.EditorValue model);
+    method public void showSoftwareKeyboard(int token);
+    method public int startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput(int token);
+  }
+
+  public final class TextInputServiceKt {
+    field public static final int INVALID_SESSION = -1; // 0xffffffff
+    field public static final int NO_SESSION = 0; // 0x0
+  }
+
+  public final class TransformedText {
+    ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+    method public androidx.ui.text.AnnotatedString component1();
+    method public androidx.ui.input.OffsetMap component2();
+    method public androidx.ui.input.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+    method public androidx.ui.input.OffsetMap getOffsetMap();
+    method public androidx.ui.text.AnnotatedString getTransformedText();
+  }
+
+  public interface VisualTransformation {
+    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+  }
+
+}
+
+package androidx.ui.text {
+
+  public final class AnnotatedString {
+    ctor public AnnotatedString(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles);
+    method public String component1();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> component2();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> component3();
+    method public androidx.ui.text.AnnotatedString copy(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> annotations);
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> getParagraphStyles();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> getSpanStyles();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> getStringAnnotations(String scope, int start, int end);
+    method public String getText();
+    method public operator androidx.ui.text.AnnotatedString plus(androidx.ui.text.AnnotatedString other);
+  }
+
+  public static final class AnnotatedString.Builder {
+    ctor public AnnotatedString.Builder(int capacity);
+    ctor public AnnotatedString.Builder();
+    ctor public AnnotatedString.Builder(String text);
+    ctor public AnnotatedString.Builder(androidx.ui.text.AnnotatedString text);
+    method public void addAnnotationString(String scope, String annotation, int start, int end);
+    method public void addStyle(androidx.ui.text.SpanStyle style, int start, int end);
+    method public void addStyle(androidx.ui.text.ParagraphStyle style, int start, int end);
+    method public void append(String text);
+    method public void append(char p);
+    method public void append(androidx.ui.text.AnnotatedString text);
+    method public int getLength();
+    method public void pop();
+    method public void pop(int index);
+    method public int pushStringAnnotation(String scope, String annotation);
+    method public int pushStyle(androidx.ui.text.SpanStyle style);
+    method public int pushStyle(androidx.ui.text.ParagraphStyle style);
+    method public androidx.ui.text.AnnotatedString toAnnotatedString();
+    property public final int length;
+  }
+
+  public static final class AnnotatedString.Item<T> {
+    ctor public AnnotatedString.Item(T! item, int start, int end, String scope);
+    ctor public AnnotatedString.Item(T! item, int start, int end);
+    method public T! component1();
+    method public int component2();
+    method public int component3();
+    method public String component4();
+    method public androidx.ui.text.AnnotatedString.Item<T> copy(T! item, int start, int end, String scope);
+    method public int getEnd();
+    method public T! getItem();
+    method public String getScope();
+    method public int getStart();
+  }
+
+  public final class AnnotatedStringKt {
+    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.SpanStyle spanStyle, androidx.ui.text.ParagraphStyle? paragraphStyle = null);
+    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.ParagraphStyle paragraphStyle);
+    method public static inline androidx.ui.text.AnnotatedString AnnotatedString(kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
+    method public static androidx.ui.text.AnnotatedString capitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static androidx.ui.text.AnnotatedString decapitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static int getLength(androidx.ui.text.AnnotatedString);
+    method public static androidx.ui.text.AnnotatedString subSequence(androidx.ui.text.AnnotatedString, int start, int end);
+    method public static androidx.ui.text.AnnotatedString toLowerCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static androidx.ui.text.AnnotatedString toUpperCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
+    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
+  }
+
+  public final class Locale {
+    ctor public Locale(String languageTag);
+    method public String getLanguage();
+    method public String getRegion();
+    method public String getScript();
+    method public String toLanguageTag();
+    property public final String language;
+    property public final String region;
+    property public final String script;
+    field public static final androidx.ui.text.Locale.Companion! Companion;
+  }
+
+  public static final class Locale.Companion {
+    method public androidx.ui.text.Locale getCurrent();
+    property public final androidx.ui.text.Locale current;
+  }
+
+  public final class LocaleList implements java.util.Collection<androidx.ui.text.Locale> kotlin.jvm.internal.markers.KMappedMarker {
+    ctor public LocaleList(java.util.List<androidx.ui.text.Locale> localeList);
+    ctor public LocaleList(String languageTags);
+    ctor public LocaleList(androidx.ui.text.Locale... locales);
+    method public java.util.List<androidx.ui.text.Locale> component1();
+    method public operator boolean contains(androidx.ui.text.Locale element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public androidx.ui.text.LocaleList copy(java.util.List<androidx.ui.text.Locale> localeList);
+    method public operator androidx.ui.text.Locale get(int i);
+    method public java.util.List<androidx.ui.text.Locale> getLocaleList();
+    method public int getSize();
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.ui.text.Locale> iterator();
+    property public int size;
+    field public static final androidx.ui.text.LocaleList.Companion! Companion;
+  }
+
+  public static final class LocaleList.Companion {
+    method public androidx.ui.text.LocaleList getCurrent();
+    property public final androidx.ui.text.LocaleList current;
+  }
+
+  public final class MultiParagraph {
+    ctor public MultiParagraph(androidx.ui.text.MultiParagraphIntrinsics intrinsics, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints);
+    ctor public MultiParagraph(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
+    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public androidx.ui.text.MultiParagraphIntrinsics getIntrinsics();
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineForOffset(int offset);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public int getMaxLines();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
+    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
+    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public androidx.ui.text.TextRange getWordBoundary(int offset);
+    method public void paint(androidx.ui.graphics.Canvas canvas);
+    property public final boolean didExceedMaxLines;
+    property public final float firstBaseline;
+    property public final float height;
+    property public final float lastBaseline;
+    property public final int lineCount;
+    property public final float maxIntrinsicWidth;
+    property public final float minIntrinsicWidth;
+    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
+    property public final float width;
+  }
+
+  public final class MultiParagraphIntrinsics implements androidx.ui.text.ParagraphIntrinsics {
+    ctor public MultiParagraphIntrinsics(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public androidx.ui.text.AnnotatedString getAnnotatedString();
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
+    property public float maxIntrinsicWidth;
+    property public float minIntrinsicWidth;
+  }
+
+  public final class MultiParagraphIntrinsicsKt {
+  }
+
+  public final class MultiParagraphKt {
+  }
+
+  public interface Paragraph {
+    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
+    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineForOffset(int offset);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
+    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
+    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public androidx.ui.text.TextRange getWordBoundary(int offset);
+    method public void paint(androidx.ui.graphics.Canvas canvas);
+    property public abstract boolean didExceedMaxLines;
+    property public abstract float firstBaseline;
+    property public abstract float height;
+    property public abstract float lastBaseline;
+    property public abstract int lineCount;
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+    property public abstract java.util.List<androidx.ui.geometry.Rect> placeholderRects;
+    property public abstract float width;
+  }
+
+  public final class ParagraphConstraints {
+    ctor public ParagraphConstraints(float width);
+    method public float component1();
+    method public androidx.ui.text.ParagraphConstraints copy(float width);
+    method public float getWidth();
+  }
+
+  public interface ParagraphIntrinsics {
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+  }
+
+  public final class ParagraphIntrinsicsKt {
+    method public static androidx.ui.text.ParagraphIntrinsics ParagraphIntrinsics(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+  }
+
+  public final class ParagraphKt {
+    method public static androidx.ui.text.Paragraph Paragraph(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public static androidx.ui.text.Paragraph Paragraph(androidx.ui.text.ParagraphIntrinsics paragraphIntrinsics, int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints);
+  }
+
+  public final class ParagraphStyle {
+    ctor public ParagraphStyle(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    ctor public ParagraphStyle();
+    method public androidx.ui.text.style.TextAlign? component1();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? component2();
+    method public androidx.ui.unit.TextUnit component3();
+    method public androidx.ui.text.style.TextIndent? component4();
+    method public androidx.ui.text.ParagraphStyle copy(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    method public androidx.ui.unit.TextUnit getLineHeight();
+    method public androidx.ui.text.style.TextAlign? getTextAlign();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
+    method public androidx.ui.text.style.TextIndent? getTextIndent();
+    method public androidx.ui.text.ParagraphStyle merge(androidx.ui.text.ParagraphStyle? other = null);
+  }
+
+  public final class ParagraphStyleKt {
+    method public static androidx.ui.text.ParagraphStyle lerp(androidx.ui.text.ParagraphStyle start, androidx.ui.text.ParagraphStyle stop, float fraction);
+  }
+
+  public final class Placeholder {
+    ctor public Placeholder(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
+    method public androidx.ui.unit.TextUnit component1();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.PlaceholderVerticalAlign component3();
+    method public androidx.ui.text.Placeholder copy(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
+    method public androidx.ui.unit.TextUnit getHeight();
+    method public androidx.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
+    method public androidx.ui.unit.TextUnit getWidth();
+  }
+
+  public enum PlaceholderVerticalAlign {
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign AboveBaseline;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Bottom;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Center;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextBottom;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextCenter;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextTop;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Top;
+  }
+
+  public final class SpanStyle {
+    ctor public SpanStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
+    ctor public SpanStyle();
+    method public androidx.ui.graphics.Color? component1();
+    method public androidx.ui.text.style.TextGeometricTransform? component10();
+    method public androidx.ui.text.LocaleList? component11();
+    method public androidx.ui.graphics.Color? component12();
+    method public androidx.ui.text.style.TextDecoration? component13();
+    method public androidx.ui.graphics.Shadow? component14();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.font.FontWeight? component3();
+    method public androidx.ui.text.font.FontStyle? component4();
+    method public androidx.ui.text.font.FontSynthesis? component5();
+    method public androidx.ui.text.font.FontFamily? component6();
+    method public String? component7();
+    method public androidx.ui.unit.TextUnit component8();
+    method public androidx.ui.text.style.BaselineShift? component9();
+    method public androidx.ui.text.SpanStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
+    method public androidx.ui.graphics.Color? getBackground();
+    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
+    method public androidx.ui.graphics.Color? getColor();
+    method public androidx.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public androidx.ui.unit.TextUnit getFontSize();
+    method public androidx.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.ui.text.font.FontWeight? getFontWeight();
+    method public androidx.ui.unit.TextUnit getLetterSpacing();
+    method public androidx.ui.text.LocaleList? getLocaleList();
+    method public androidx.ui.graphics.Shadow? getShadow();
+    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
+    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
+    method public androidx.ui.text.SpanStyle merge(androidx.ui.text.SpanStyle? other = null);
+  }
+
+  public final class SpanStyleKt {
+    method public static androidx.ui.text.SpanStyle lerp(androidx.ui.text.SpanStyle start, androidx.ui.text.SpanStyle stop, float fraction);
+  }
+
+  public final class StringKt {
+    method public static String capitalize(String, androidx.ui.text.Locale locale);
+    method public static String capitalize(String, androidx.ui.text.LocaleList localeList);
+    method public static String decapitalize(String, androidx.ui.text.Locale locale);
+    method public static String decapitalize(String, androidx.ui.text.LocaleList localeList);
+    method public static String toLowerCase(String, androidx.ui.text.Locale locale);
+    method public static String toLowerCase(String, androidx.ui.text.LocaleList localeList);
+    method public static String toUpperCase(String, androidx.ui.text.Locale locale);
+    method public static String toUpperCase(String, androidx.ui.text.LocaleList localeList);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class TextDelegate {
+    ctor public TextDelegate(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders);
+    method public androidx.ui.unit.Density getDensity();
+    method public androidx.ui.unit.IntPx getMaxIntrinsicWidth();
+    method public int getMaxLines();
+    method public androidx.ui.unit.IntPx getMinIntrinsicWidth();
+    method public androidx.ui.text.style.TextOverflow getOverflow();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
+    method public androidx.ui.text.font.Font.ResourceLoader getResourceLoader();
+    method public boolean getSoftWrap();
+    method public androidx.ui.text.TextStyle getStyle();
+    method public androidx.ui.text.AnnotatedString getText();
+    method public androidx.ui.text.TextLayoutResult layout(androidx.ui.core.Constraints constraints, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.TextLayoutResult? prevResult = null);
+    method public void layoutIntrinsics(androidx.ui.core.LayoutDirection layoutDirection);
+    property public final androidx.ui.unit.IntPx maxIntrinsicWidth;
+    property public final androidx.ui.unit.IntPx minIntrinsicWidth;
+    field public static final androidx.ui.text.TextDelegate.Companion! Companion;
+  }
+
+  public static final class TextDelegate.Companion {
+    method public void paint(androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
+    method public void paintBackground(int start, int end, androidx.ui.graphics.Color color, androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
+  }
+
+  public final class TextLayoutHelperKt {
+  }
+
+  public final class TextLayoutInput {
+    ctor public TextLayoutInput(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
+    method public androidx.ui.text.AnnotatedString component1();
+    method public androidx.ui.core.Constraints component10();
+    method public androidx.ui.text.TextStyle component2();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> component3();
+    method public int component4();
+    method public boolean component5();
+    method public androidx.ui.text.style.TextOverflow component6();
+    method public androidx.ui.unit.Density component7();
+    method public androidx.ui.core.LayoutDirection component8();
+    method public androidx.ui.text.font.Font.ResourceLoader component9();
+    method public androidx.ui.text.TextLayoutInput copy(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
+    method public androidx.ui.core.Constraints getConstraints();
+    method public androidx.ui.unit.Density getDensity();
+    method public androidx.ui.core.LayoutDirection getLayoutDirection();
+    method public int getMaxLines();
+    method public androidx.ui.text.style.TextOverflow getOverflow();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
+    method public androidx.ui.text.font.Font.ResourceLoader getResourceLoader();
+    method public boolean getSoftWrap();
+    method public androidx.ui.text.TextStyle getStyle();
+    method public androidx.ui.text.AnnotatedString getText();
+  }
+
+  public final class TextLayoutResult {
+    method public androidx.ui.text.TextLayoutInput component1();
+    method public androidx.ui.unit.IntPxSize component3();
+    method public androidx.ui.text.TextLayoutResult copy(androidx.ui.text.TextLayoutInput layoutInput, androidx.ui.text.MultiParagraph multiParagraph, androidx.ui.unit.IntPxSize size);
+    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
+    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidOverflowHeight();
+    method public boolean getDidOverflowWidth();
+    method public androidx.ui.unit.Px getFirstBaseline();
+    method public boolean getHasVisualOverflow();
+    method public androidx.ui.unit.Px getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public androidx.ui.unit.Px getLastBaseline();
+    method public androidx.ui.text.TextLayoutInput getLayoutInput();
+    method public androidx.ui.unit.Px getLineBottom(int lineIndex);
+    method public int getLineForOffset(int offset);
+    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
+    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
+    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
+    method public androidx.ui.unit.IntPxSize getSize();
+    method public androidx.ui.text.TextRange getWordBoundary(int offset);
+    property public final boolean didOverflowHeight;
+    property public final boolean didOverflowWidth;
+    property public final androidx.ui.unit.Px firstBaseline;
+    property public final boolean hasVisualOverflow;
+    property public final androidx.ui.unit.Px lastBaseline;
+    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
+  }
+
+  public final class TextPainter {
+    method public void paint(androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
+    field public static final androidx.ui.text.TextPainter! INSTANCE;
+  }
+
+  public final class TextRange {
+    ctor public TextRange(int start, int end);
+    method public int component1();
+    method public int component2();
+    method public operator boolean contains(androidx.ui.text.TextRange other);
+    method public operator boolean contains(int offset);
+    method public androidx.ui.text.TextRange copy(int start, int end);
+    method public boolean getCollapsed();
+    method public int getEnd();
+    method public int getLength();
+    method public int getMax();
+    method public int getMin();
+    method public int getStart();
+    method public boolean intersects(androidx.ui.text.TextRange other);
+    property public final boolean collapsed;
+    property public final int length;
+    property public final int max;
+    property public final int min;
+  }
+
+  public final class TextRangeKt {
+    method public static String substring(CharSequence, androidx.ui.text.TextRange range);
+  }
+
+  public final class TextStyle {
+    ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    ctor public TextStyle();
+    method public androidx.ui.graphics.Color? component1();
+    method public androidx.ui.text.style.TextGeometricTransform? component10();
+    method public androidx.ui.text.LocaleList? component11();
+    method public androidx.ui.graphics.Color? component12();
+    method public androidx.ui.text.style.TextDecoration? component13();
+    method public androidx.ui.graphics.Shadow? component14();
+    method public androidx.ui.text.style.TextAlign? component15();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? component16();
+    method public androidx.ui.unit.TextUnit component17();
+    method public androidx.ui.text.style.TextIndent? component18();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.font.FontWeight? component3();
+    method public androidx.ui.text.font.FontStyle? component4();
+    method public androidx.ui.text.font.FontSynthesis? component5();
+    method public androidx.ui.text.font.FontFamily? component6();
+    method public String? component7();
+    method public androidx.ui.unit.TextUnit component8();
+    method public androidx.ui.text.style.BaselineShift? component9();
+    method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    method public androidx.ui.graphics.Color? getBackground();
+    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
+    method public androidx.ui.graphics.Color? getColor();
+    method public androidx.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public androidx.ui.unit.TextUnit getFontSize();
+    method public androidx.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.ui.text.font.FontWeight? getFontWeight();
+    method public androidx.ui.unit.TextUnit getLetterSpacing();
+    method public androidx.ui.unit.TextUnit getLineHeight();
+    method public androidx.ui.text.LocaleList? getLocaleList();
+    method public androidx.ui.graphics.Shadow? getShadow();
+    method public androidx.ui.text.style.TextAlign? getTextAlign();
+    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
+    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
+    method public androidx.ui.text.style.TextIndent? getTextIndent();
+    method public androidx.ui.text.TextStyle merge(androidx.ui.text.TextStyle? other = null);
+    method public androidx.ui.text.TextStyle merge(androidx.ui.text.SpanStyle other);
+    method public androidx.ui.text.TextStyle merge(androidx.ui.text.ParagraphStyle other);
+    method public androidx.ui.text.ParagraphStyle toParagraphStyle();
+    method public androidx.ui.text.SpanStyle toSpanStyle();
+    field public static final androidx.ui.text.TextStyle.Companion! Companion;
+  }
+
+  public static final class TextStyle.Companion {
+    method public androidx.ui.text.TextStyle getDefault();
+    property public final androidx.ui.text.TextStyle Default;
+  }
+
+  public final class TextStyleKt {
+    method public static androidx.ui.text.TextStyle lerp(androidx.ui.text.TextStyle start, androidx.ui.text.TextStyle stop, float fraction);
+    method public static androidx.ui.text.TextStyle resolveDefaults(androidx.ui.text.TextStyle style, androidx.ui.core.LayoutDirection direction);
+  }
+
+  public interface Typeface {
+    method public androidx.ui.text.font.FontFamily getFontFamily();
+    property public abstract androidx.ui.text.font.FontFamily fontFamily;
+  }
+
+  public final class TypefaceKt {
+    method public static androidx.ui.text.Typeface typefaceFromFontFamily(android.content.Context context, androidx.ui.text.font.FontFamily fontFamily, java.util.List<? extends kotlin.Pair<androidx.ui.text.font.FontWeight,? extends androidx.ui.text.font.FontStyle>>? necessaryStyles = null);
+  }
+
+}
+
+package androidx.ui.text.font {
+
+  public abstract sealed class FileBasedFontFamily extends androidx.ui.text.font.FontFamily {
+  }
+
+  public interface Font {
+    method public androidx.ui.text.font.FontStyle getStyle();
+    method public androidx.ui.text.font.FontWeight getWeight();
+    property public abstract androidx.ui.text.font.FontStyle style;
+    property public abstract androidx.ui.text.font.FontWeight weight;
+  }
+
+  public static interface Font.ResourceLoader {
+    method public Object load(androidx.ui.text.font.Font font);
+  }
+
+  public abstract sealed class FontFamily {
+    method public final boolean getCanLoadSynchronously();
+    field public static final androidx.ui.text.font.FontFamily.Companion! Companion;
+  }
+
+  public static final class FontFamily.Companion {
+    method public androidx.ui.text.font.GenericFontFamily getCursive();
+    method public androidx.ui.text.font.SystemFontFamily getDefault();
+    method public androidx.ui.text.font.GenericFontFamily getMonospace();
+    method public androidx.ui.text.font.GenericFontFamily getSansSerif();
+    method public androidx.ui.text.font.GenericFontFamily getSerif();
+    property public final androidx.ui.text.font.GenericFontFamily Cursive;
+    property public final androidx.ui.text.font.SystemFontFamily Default;
+    property public final androidx.ui.text.font.GenericFontFamily Monospace;
+    property public final androidx.ui.text.font.GenericFontFamily SansSerif;
+    property public final androidx.ui.text.font.GenericFontFamily Serif;
+  }
+
+  public final class FontFamilyKt {
+    method public static androidx.ui.text.font.FontListFontFamily fontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
+    method public static androidx.ui.text.font.FontListFontFamily fontFamily(androidx.ui.text.font.Font... fonts);
+    method public static androidx.ui.text.font.LoadedFontFamily fontFamily(androidx.ui.text.Typeface typeface);
+  }
+
+  public final class FontKt {
+    method public static androidx.ui.text.font.FontListFontFamily asFontFamily(androidx.ui.text.font.Font);
+    method public static androidx.ui.text.font.Font font(int resId, androidx.ui.text.font.FontWeight weight = FontWeight.Normal, androidx.ui.text.font.FontStyle style = androidx.ui.text.font.FontStyle.Normal);
+  }
+
+  public final class FontListFontFamily extends androidx.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.ui.text.font.Font> {
+    ctor public FontListFontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
+    method public java.util.List<androidx.ui.text.font.Font> component1();
+    method public boolean contains(androidx.ui.text.font.Font element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public androidx.ui.text.font.FontListFontFamily copy(java.util.List<? extends androidx.ui.text.font.Font> fonts);
+    method public androidx.ui.text.font.Font get(int index);
+    method public java.util.List<androidx.ui.text.font.Font> getFonts();
+    method public int getSize();
+    method public int indexOf(androidx.ui.text.font.Font element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.ui.text.font.Font> iterator();
+    method public int lastIndexOf(androidx.ui.text.font.Font element);
+    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator();
+    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator(int index);
+    method public java.util.List<androidx.ui.text.font.Font> subList(int fromIndex, int toIndex);
+  }
+
+  public enum FontStyle {
+    enum_constant public static final androidx.ui.text.font.FontStyle Italic;
+    enum_constant public static final androidx.ui.text.font.FontStyle Normal;
+  }
+
+  public enum FontSynthesis {
+    enum_constant public static final androidx.ui.text.font.FontSynthesis All;
+    enum_constant public static final androidx.ui.text.font.FontSynthesis None;
+    enum_constant public static final androidx.ui.text.font.FontSynthesis Style;
+    enum_constant public static final androidx.ui.text.font.FontSynthesis Weight;
+  }
+
+  public final class FontWeight implements java.lang.Comparable<androidx.ui.text.font.FontWeight> {
+    method public int compareTo(androidx.ui.text.font.FontWeight other);
+    method public androidx.ui.text.font.FontWeight copy(int weight);
+    field public static final androidx.ui.text.font.FontWeight.Companion! Companion;
+  }
+
+  public static final class FontWeight.Companion {
+    method public androidx.ui.text.font.FontWeight getBlack();
+    method public androidx.ui.text.font.FontWeight getBold();
+    method public androidx.ui.text.font.FontWeight getExtraBold();
+    method public androidx.ui.text.font.FontWeight getExtraLight();
+    method public androidx.ui.text.font.FontWeight getLight();
+    method public androidx.ui.text.font.FontWeight getMedium();
+    method public androidx.ui.text.font.FontWeight getNormal();
+    method public androidx.ui.text.font.FontWeight getSemiBold();
+    method public androidx.ui.text.font.FontWeight getThin();
+    method public androidx.ui.text.font.FontWeight getW100();
+    method public androidx.ui.text.font.FontWeight getW200();
+    method public androidx.ui.text.font.FontWeight getW300();
+    method public androidx.ui.text.font.FontWeight getW400();
+    method public androidx.ui.text.font.FontWeight getW500();
+    method public androidx.ui.text.font.FontWeight getW600();
+    method public androidx.ui.text.font.FontWeight getW700();
+    method public androidx.ui.text.font.FontWeight getW800();
+    method public androidx.ui.text.font.FontWeight getW900();
+    property public final androidx.ui.text.font.FontWeight Black;
+    property public final androidx.ui.text.font.FontWeight Bold;
+    property public final androidx.ui.text.font.FontWeight ExtraBold;
+    property public final androidx.ui.text.font.FontWeight ExtraLight;
+    property public final androidx.ui.text.font.FontWeight Light;
+    property public final androidx.ui.text.font.FontWeight Medium;
+    property public final androidx.ui.text.font.FontWeight Normal;
+    property public final androidx.ui.text.font.FontWeight SemiBold;
+    property public final androidx.ui.text.font.FontWeight Thin;
+    property public final androidx.ui.text.font.FontWeight W100;
+    property public final androidx.ui.text.font.FontWeight W200;
+    property public final androidx.ui.text.font.FontWeight W300;
+    property public final androidx.ui.text.font.FontWeight W400;
+    property public final androidx.ui.text.font.FontWeight W500;
+    property public final androidx.ui.text.font.FontWeight W600;
+    property public final androidx.ui.text.font.FontWeight W700;
+    property public final androidx.ui.text.font.FontWeight W800;
+    property public final androidx.ui.text.font.FontWeight W900;
+  }
+
+  public final class FontWeightKt {
+    method public static androidx.ui.text.font.FontWeight lerp(androidx.ui.text.font.FontWeight start, androidx.ui.text.font.FontWeight stop, float fraction);
+  }
+
+  public final class GenericFontFamily extends androidx.ui.text.font.SystemFontFamily {
+    method public String getName();
+  }
+
+  public final class LoadedFontFamily extends androidx.ui.text.font.FontFamily {
+    ctor public LoadedFontFamily(androidx.ui.text.Typeface typeface);
+    method public androidx.ui.text.Typeface component1();
+    method public androidx.ui.text.font.LoadedFontFamily copy(androidx.ui.text.Typeface typeface);
+    method public androidx.ui.text.Typeface getTypeface();
+  }
+
+  public final class ResourceFont implements androidx.ui.text.font.Font {
+    ctor public ResourceFont(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
+    method public int component1();
+    method public androidx.ui.text.font.FontWeight component2();
+    method public androidx.ui.text.font.FontStyle component3();
+    method public androidx.ui.text.font.ResourceFont copy(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
+    method public int getResId();
+    method public androidx.ui.text.font.FontStyle getStyle();
+    method public androidx.ui.text.font.FontWeight getWeight();
+  }
+
+  public abstract sealed class SystemFontFamily extends androidx.ui.text.font.FontFamily {
+  }
+
+}
+
+package androidx.ui.text.platform {
+
+  public final class AndroidParagraphHelperKt {
+  }
+
+  public final class AndroidParagraphKt {
+  }
+
+  public final class PlatformLocaleKt {
+  }
+
+}
+
+package androidx.ui.text.style {
+
+  public final class BaselineShift {
+    ctor public BaselineShift(float multiplier);
+    method public float component1();
+    method public androidx.ui.text.style.BaselineShift copy(float multiplier);
+    method public float getMultiplier();
+    field public static final androidx.ui.text.style.BaselineShift.Companion! Companion;
+  }
+
+  public static final class BaselineShift.Companion {
+    method public androidx.ui.text.style.BaselineShift getNone();
+    method public androidx.ui.text.style.BaselineShift getSubscript();
+    method public androidx.ui.text.style.BaselineShift getSuperscript();
+    property public final androidx.ui.text.style.BaselineShift None;
+    property public final androidx.ui.text.style.BaselineShift Subscript;
+    property public final androidx.ui.text.style.BaselineShift Superscript;
+  }
+
+  public final class BaselineShiftKt {
+    method public static androidx.ui.text.style.BaselineShift lerp(androidx.ui.text.style.BaselineShift start, androidx.ui.text.style.BaselineShift stop, float fraction);
+  }
+
+  public enum TextAlign {
+    enum_constant public static final androidx.ui.text.style.TextAlign Center;
+    enum_constant public static final androidx.ui.text.style.TextAlign End;
+    enum_constant public static final androidx.ui.text.style.TextAlign Justify;
+    enum_constant public static final androidx.ui.text.style.TextAlign Left;
+    enum_constant public static final androidx.ui.text.style.TextAlign Right;
+    enum_constant public static final androidx.ui.text.style.TextAlign Start;
+  }
+
+  public final class TextDecoration {
+    method public int component1();
+    method public boolean contains(androidx.ui.text.style.TextDecoration other);
+    method public androidx.ui.text.style.TextDecoration copy(int mask);
+    method public int getMask();
+    field public static final androidx.ui.text.style.TextDecoration.Companion! Companion;
+  }
+
+  public static final class TextDecoration.Companion {
+    method public androidx.ui.text.style.TextDecoration combine(java.util.List<androidx.ui.text.style.TextDecoration> decorations);
+    method public androidx.ui.text.style.TextDecoration getLineThrough();
+    method public androidx.ui.text.style.TextDecoration getNone();
+    method public androidx.ui.text.style.TextDecoration getUnderline();
+    property public final androidx.ui.text.style.TextDecoration LineThrough;
+    property public final androidx.ui.text.style.TextDecoration None;
+    property public final androidx.ui.text.style.TextDecoration Underline;
+  }
+
+  public enum TextDirection {
+    enum_constant public static final androidx.ui.text.style.TextDirection Ltr;
+    enum_constant public static final androidx.ui.text.style.TextDirection Rtl;
+  }
+
+  public enum TextDirectionAlgorithm {
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrLtr;
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrRtl;
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceLtr;
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceRtl;
+  }
+
+  public final class TextGeometricTransform {
+    ctor public TextGeometricTransform(float scaleX, float skewX);
+    ctor public TextGeometricTransform();
+    method public float component1();
+    method public float component2();
+    method public androidx.ui.text.style.TextGeometricTransform copy(float scaleX, float skewX);
+    method public float getScaleX();
+    method public float getSkewX();
+    field public static final androidx.ui.text.style.TextGeometricTransform.Companion! Companion;
+  }
+
+  public static final class TextGeometricTransform.Companion {
+  }
+
+  public final class TextGeometricTransformKt {
+    method public static androidx.ui.text.style.TextGeometricTransform lerp(androidx.ui.text.style.TextGeometricTransform start, androidx.ui.text.style.TextGeometricTransform stop, float fraction);
+  }
+
+  public final class TextIndent {
+    ctor public TextIndent(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
+    ctor public TextIndent();
+    method public androidx.ui.unit.TextUnit component1();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.style.TextIndent copy(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
+    method public androidx.ui.unit.TextUnit getFirstLine();
+    method public androidx.ui.unit.TextUnit getRestLine();
+    field public static final androidx.ui.text.style.TextIndent.Companion! Companion;
+  }
+
+  public static final class TextIndent.Companion {
+    method public androidx.ui.text.style.TextIndent getNone();
+    property public final androidx.ui.text.style.TextIndent None;
+  }
+
+  public final class TextIndentKt {
+    method public static androidx.ui.text.style.TextIndent lerp(androidx.ui.text.style.TextIndent start, androidx.ui.text.style.TextIndent stop, float fraction);
+  }
+
+  public enum TextOverflow {
+    enum_constant public static final androidx.ui.text.style.TextOverflow Clip;
+    enum_constant public static final androidx.ui.text.style.TextOverflow Ellipsis;
+  }
+
+}
+
diff --git a/ui/ui-text-core/api/restricted_current.txt b/ui/ui-text-core/api/restricted_current.txt
new file mode 100644
index 0000000..3364849
--- /dev/null
+++ b/ui/ui-text-core/api/restricted_current.txt
@@ -0,0 +1,955 @@
+// Signature format: 3.0
+package androidx.ui.input {
+
+  public final class BackspaceKeyEditOp implements androidx.ui.input.EditOperation {
+    ctor public BackspaceKeyEditOp();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class CommitTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public CommitTextEditOp(String text, int newCursorPosition);
+    method public String component1();
+    method public int component2();
+    method public androidx.ui.input.CommitTextEditOp copy(String text, int newCursorPosition);
+    method public int getNewCursorPosition();
+    method public String getText();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public DeleteSurroundingTextEditOp(int beforeLength, int afterLength);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.DeleteSurroundingTextEditOp copy(int beforeLength, int afterLength);
+    method public int getAfterLength();
+    method public int getBeforeLength();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextInCodePointsEditOp implements androidx.ui.input.EditOperation {
+    ctor public DeleteSurroundingTextInCodePointsEditOp(int beforeLength, int afterLength);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.DeleteSurroundingTextInCodePointsEditOp copy(int beforeLength, int afterLength);
+    method public int getAfterLength();
+    method public int getBeforeLength();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public interface EditOperation {
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class EditProcessor {
+    method public androidx.ui.input.EditorValue onEditCommands(java.util.List<? extends androidx.ui.input.EditOperation> ops);
+    method public void onNewState(androidx.ui.input.EditorValue model, androidx.ui.input.TextInputService? textInputService, int token);
+  }
+
+  public final class EditingBuffer {
+    ctor public EditingBuffer(String initialText, androidx.ui.text.TextRange initialSelection);
+    field public static final int NOWHERE = -1; // 0xffffffff
+  }
+
+  public final class EditorValue {
+    ctor public EditorValue(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
+    ctor public EditorValue();
+    method public String component1();
+    method public androidx.ui.text.TextRange component2();
+    method public androidx.ui.text.TextRange? component3();
+    method public androidx.ui.input.EditorValue copy(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
+    method public androidx.ui.text.TextRange? getComposition();
+    method public String getSelectedText();
+    method public androidx.ui.text.TextRange getSelection();
+    method public String getText();
+    method public String getTextAfterSelection(int maxChars);
+    method public String getTextBeforeSelection(int maxChars);
+  }
+
+  public final class FinishComposingTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public FinishComposingTextEditOp();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public enum ImeAction {
+    enum_constant public static final androidx.ui.input.ImeAction Done;
+    enum_constant public static final androidx.ui.input.ImeAction Go;
+    enum_constant public static final androidx.ui.input.ImeAction Next;
+    enum_constant public static final androidx.ui.input.ImeAction NoAction;
+    enum_constant public static final androidx.ui.input.ImeAction Previous;
+    enum_constant public static final androidx.ui.input.ImeAction Search;
+    enum_constant public static final androidx.ui.input.ImeAction Send;
+    enum_constant public static final androidx.ui.input.ImeAction Unspecified;
+  }
+
+  public interface InputEventListener {
+    method public void onEditOperations(java.util.List<? extends androidx.ui.input.EditOperation> editOps);
+    method public void onImeAction(androidx.ui.input.ImeAction imeAction);
+  }
+
+  public enum KeyboardType {
+    enum_constant public static final androidx.ui.input.KeyboardType Ascii;
+    enum_constant public static final androidx.ui.input.KeyboardType Email;
+    enum_constant public static final androidx.ui.input.KeyboardType Number;
+    enum_constant public static final androidx.ui.input.KeyboardType NumberPassword;
+    enum_constant public static final androidx.ui.input.KeyboardType Password;
+    enum_constant public static final androidx.ui.input.KeyboardType Phone;
+    enum_constant public static final androidx.ui.input.KeyboardType Text;
+    enum_constant public static final androidx.ui.input.KeyboardType Uri;
+  }
+
+  public final class MoveCursorEditOp implements androidx.ui.input.EditOperation {
+    ctor public MoveCursorEditOp(int amount);
+    method public int component1();
+    method public androidx.ui.input.MoveCursorEditOp copy(int amount);
+    method public int getAmount();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public interface OffsetMap {
+    method public int originalToTransformed(int offset);
+    method public int transformedToOriginal(int offset);
+    field public static final androidx.ui.input.OffsetMap.Companion! Companion;
+  }
+
+  public static final class OffsetMap.Companion {
+    method public androidx.ui.input.OffsetMap getIdentityOffsetMap();
+    property public final androidx.ui.input.OffsetMap identityOffsetMap;
+  }
+
+  public final class PasswordVisualTransformation implements androidx.ui.input.VisualTransformation {
+    ctor public PasswordVisualTransformation(char mask);
+    ctor public PasswordVisualTransformation();
+    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+    method public char getMask();
+  }
+
+  public interface PlatformTextInputService {
+    method public void hideSoftwareKeyboard();
+    method public void notifyFocusedRect(androidx.ui.geometry.Rect rect);
+    method public void onStateUpdated(androidx.ui.input.EditorValue model);
+    method public void showSoftwareKeyboard();
+    method public void startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput();
+  }
+
+  public final class SetComposingRegionEditOp implements androidx.ui.input.EditOperation {
+    ctor public SetComposingRegionEditOp(int start, int end);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.SetComposingRegionEditOp copy(int start, int end);
+    method public int getEnd();
+    method public int getStart();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class SetComposingTextEditOp implements androidx.ui.input.EditOperation {
+    ctor public SetComposingTextEditOp(String text, int newCursorPosition);
+    method public String component1();
+    method public int component2();
+    method public androidx.ui.input.SetComposingTextEditOp copy(String text, int newCursorPosition);
+    method public int getNewCursorPosition();
+    method public String getText();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public final class SetSelectionEditOp implements androidx.ui.input.EditOperation {
+    ctor public SetSelectionEditOp(int start, int end);
+    method public int component1();
+    method public int component2();
+    method public androidx.ui.input.SetSelectionEditOp copy(int start, int end);
+    method public int getEnd();
+    method public int getStart();
+    method public void process(androidx.ui.input.EditingBuffer buffer);
+  }
+
+  public class TextInputService {
+    ctor public TextInputService(androidx.ui.input.PlatformTextInputService platformTextInputService);
+    method public void hideSoftwareKeyboard(int token);
+    method public void notifyFocusedRect(int token, androidx.ui.geometry.Rect rect);
+    method public void onStateUpdated(int token, androidx.ui.input.EditorValue model);
+    method public void showSoftwareKeyboard(int token);
+    method public int startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput(int token);
+  }
+
+  public final class TextInputServiceKt {
+    field public static final int INVALID_SESSION = -1; // 0xffffffff
+    field public static final int NO_SESSION = 0; // 0x0
+  }
+
+  public final class TransformedText {
+    ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+    method public androidx.ui.text.AnnotatedString component1();
+    method public androidx.ui.input.OffsetMap component2();
+    method public androidx.ui.input.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+    method public androidx.ui.input.OffsetMap getOffsetMap();
+    method public androidx.ui.text.AnnotatedString getTransformedText();
+  }
+
+  public interface VisualTransformation {
+    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+  }
+
+}
+
+package androidx.ui.text {
+
+  public final class AnnotatedString {
+    ctor public AnnotatedString(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles);
+    method public String component1();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> component2();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> component3();
+    method public androidx.ui.text.AnnotatedString copy(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> annotations);
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> getParagraphStyles();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> getSpanStyles();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> getStringAnnotations(String scope, int start, int end);
+    method public String getText();
+    method public operator androidx.ui.text.AnnotatedString plus(androidx.ui.text.AnnotatedString other);
+  }
+
+  public static final class AnnotatedString.Builder {
+    ctor public AnnotatedString.Builder(int capacity);
+    ctor public AnnotatedString.Builder();
+    ctor public AnnotatedString.Builder(String text);
+    ctor public AnnotatedString.Builder(androidx.ui.text.AnnotatedString text);
+    method public void addAnnotationString(String scope, String annotation, int start, int end);
+    method public void addStyle(androidx.ui.text.SpanStyle style, int start, int end);
+    method public void addStyle(androidx.ui.text.ParagraphStyle style, int start, int end);
+    method public void append(String text);
+    method public void append(char p);
+    method public void append(androidx.ui.text.AnnotatedString text);
+    method public int getLength();
+    method public void pop();
+    method public void pop(int index);
+    method public int pushStringAnnotation(String scope, String annotation);
+    method public int pushStyle(androidx.ui.text.SpanStyle style);
+    method public int pushStyle(androidx.ui.text.ParagraphStyle style);
+    method public androidx.ui.text.AnnotatedString toAnnotatedString();
+    property public final int length;
+  }
+
+  public static final class AnnotatedString.Item<T> {
+    ctor public AnnotatedString.Item(T! item, int start, int end, String scope);
+    ctor public AnnotatedString.Item(T! item, int start, int end);
+    method public T! component1();
+    method public int component2();
+    method public int component3();
+    method public String component4();
+    method public androidx.ui.text.AnnotatedString.Item<T> copy(T! item, int start, int end, String scope);
+    method public int getEnd();
+    method public T! getItem();
+    method public String getScope();
+    method public int getStart();
+  }
+
+  public final class AnnotatedStringKt {
+    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.SpanStyle spanStyle, androidx.ui.text.ParagraphStyle? paragraphStyle = null);
+    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.ParagraphStyle paragraphStyle);
+    method public static inline androidx.ui.text.AnnotatedString AnnotatedString(kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
+    method public static androidx.ui.text.AnnotatedString capitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static androidx.ui.text.AnnotatedString decapitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static int getLength(androidx.ui.text.AnnotatedString);
+    method public static androidx.ui.text.AnnotatedString subSequence(androidx.ui.text.AnnotatedString, int start, int end);
+    method public static androidx.ui.text.AnnotatedString toLowerCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static androidx.ui.text.AnnotatedString toUpperCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
+    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
+    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
+  }
+
+  public final class Locale {
+    ctor public Locale(String languageTag);
+    method public String getLanguage();
+    method public String getRegion();
+    method public String getScript();
+    method public String toLanguageTag();
+    property public final String language;
+    property public final String region;
+    property public final String script;
+    field public static final androidx.ui.text.Locale.Companion! Companion;
+  }
+
+  public static final class Locale.Companion {
+    method public androidx.ui.text.Locale getCurrent();
+    property public final androidx.ui.text.Locale current;
+  }
+
+  public final class LocaleList implements java.util.Collection<androidx.ui.text.Locale> kotlin.jvm.internal.markers.KMappedMarker {
+    ctor public LocaleList(java.util.List<androidx.ui.text.Locale> localeList);
+    ctor public LocaleList(String languageTags);
+    ctor public LocaleList(androidx.ui.text.Locale... locales);
+    method public java.util.List<androidx.ui.text.Locale> component1();
+    method public operator boolean contains(androidx.ui.text.Locale element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public androidx.ui.text.LocaleList copy(java.util.List<androidx.ui.text.Locale> localeList);
+    method public operator androidx.ui.text.Locale get(int i);
+    method public java.util.List<androidx.ui.text.Locale> getLocaleList();
+    method public int getSize();
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.ui.text.Locale> iterator();
+    property public int size;
+    field public static final androidx.ui.text.LocaleList.Companion! Companion;
+  }
+
+  public static final class LocaleList.Companion {
+    method public androidx.ui.text.LocaleList getCurrent();
+    property public final androidx.ui.text.LocaleList current;
+  }
+
+  public final class MultiParagraph {
+    ctor public MultiParagraph(androidx.ui.text.MultiParagraphIntrinsics intrinsics, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints);
+    ctor public MultiParagraph(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
+    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public androidx.ui.text.MultiParagraphIntrinsics getIntrinsics();
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineForOffset(int offset);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public int getMaxLines();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
+    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
+    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public androidx.ui.text.TextRange getWordBoundary(int offset);
+    method public void paint(androidx.ui.graphics.Canvas canvas);
+    property public final boolean didExceedMaxLines;
+    property public final float firstBaseline;
+    property public final float height;
+    property public final float lastBaseline;
+    property public final int lineCount;
+    property public final float maxIntrinsicWidth;
+    property public final float minIntrinsicWidth;
+    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
+    property public final float width;
+  }
+
+  public final class MultiParagraphIntrinsics implements androidx.ui.text.ParagraphIntrinsics {
+    ctor public MultiParagraphIntrinsics(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public androidx.ui.text.AnnotatedString getAnnotatedString();
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
+    property public float maxIntrinsicWidth;
+    property public float minIntrinsicWidth;
+  }
+
+  public final class MultiParagraphIntrinsicsKt {
+  }
+
+  public final class MultiParagraphKt {
+  }
+
+  public interface Paragraph {
+    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
+    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineForOffset(int offset);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
+    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
+    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public androidx.ui.text.TextRange getWordBoundary(int offset);
+    method public void paint(androidx.ui.graphics.Canvas canvas);
+    property public abstract boolean didExceedMaxLines;
+    property public abstract float firstBaseline;
+    property public abstract float height;
+    property public abstract float lastBaseline;
+    property public abstract int lineCount;
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+    property public abstract java.util.List<androidx.ui.geometry.Rect> placeholderRects;
+    property public abstract float width;
+  }
+
+  public final class ParagraphConstraints {
+    ctor public ParagraphConstraints(float width);
+    method public float component1();
+    method public androidx.ui.text.ParagraphConstraints copy(float width);
+    method public float getWidth();
+  }
+
+  public interface ParagraphIntrinsics {
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+  }
+
+  public final class ParagraphIntrinsicsKt {
+    method public static androidx.ui.text.ParagraphIntrinsics ParagraphIntrinsics(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+  }
+
+  public final class ParagraphKt {
+    method public static androidx.ui.text.Paragraph Paragraph(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public static androidx.ui.text.Paragraph Paragraph(androidx.ui.text.ParagraphIntrinsics paragraphIntrinsics, int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints);
+  }
+
+  public final class ParagraphStyle {
+    ctor public ParagraphStyle(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    ctor public ParagraphStyle();
+    method public androidx.ui.text.style.TextAlign? component1();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? component2();
+    method public androidx.ui.unit.TextUnit component3();
+    method public androidx.ui.text.style.TextIndent? component4();
+    method public androidx.ui.text.ParagraphStyle copy(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    method public androidx.ui.unit.TextUnit getLineHeight();
+    method public androidx.ui.text.style.TextAlign? getTextAlign();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
+    method public androidx.ui.text.style.TextIndent? getTextIndent();
+    method public androidx.ui.text.ParagraphStyle merge(androidx.ui.text.ParagraphStyle? other = null);
+  }
+
+  public final class ParagraphStyleKt {
+    method public static androidx.ui.text.ParagraphStyle lerp(androidx.ui.text.ParagraphStyle start, androidx.ui.text.ParagraphStyle stop, float fraction);
+  }
+
+  public final class Placeholder {
+    ctor public Placeholder(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
+    method public androidx.ui.unit.TextUnit component1();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.PlaceholderVerticalAlign component3();
+    method public androidx.ui.text.Placeholder copy(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
+    method public androidx.ui.unit.TextUnit getHeight();
+    method public androidx.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
+    method public androidx.ui.unit.TextUnit getWidth();
+  }
+
+  public enum PlaceholderVerticalAlign {
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign AboveBaseline;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Bottom;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Center;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextBottom;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextCenter;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextTop;
+    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Top;
+  }
+
+  public final class SpanStyle {
+    ctor public SpanStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
+    ctor public SpanStyle();
+    method public androidx.ui.graphics.Color? component1();
+    method public androidx.ui.text.style.TextGeometricTransform? component10();
+    method public androidx.ui.text.LocaleList? component11();
+    method public androidx.ui.graphics.Color? component12();
+    method public androidx.ui.text.style.TextDecoration? component13();
+    method public androidx.ui.graphics.Shadow? component14();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.font.FontWeight? component3();
+    method public androidx.ui.text.font.FontStyle? component4();
+    method public androidx.ui.text.font.FontSynthesis? component5();
+    method public androidx.ui.text.font.FontFamily? component6();
+    method public String? component7();
+    method public androidx.ui.unit.TextUnit component8();
+    method public androidx.ui.text.style.BaselineShift? component9();
+    method public androidx.ui.text.SpanStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
+    method public androidx.ui.graphics.Color? getBackground();
+    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
+    method public androidx.ui.graphics.Color? getColor();
+    method public androidx.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public androidx.ui.unit.TextUnit getFontSize();
+    method public androidx.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.ui.text.font.FontWeight? getFontWeight();
+    method public androidx.ui.unit.TextUnit getLetterSpacing();
+    method public androidx.ui.text.LocaleList? getLocaleList();
+    method public androidx.ui.graphics.Shadow? getShadow();
+    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
+    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
+    method public androidx.ui.text.SpanStyle merge(androidx.ui.text.SpanStyle? other = null);
+  }
+
+  public final class SpanStyleKt {
+    method public static androidx.ui.text.SpanStyle lerp(androidx.ui.text.SpanStyle start, androidx.ui.text.SpanStyle stop, float fraction);
+  }
+
+  public final class StringKt {
+    method public static String capitalize(String, androidx.ui.text.Locale locale);
+    method public static String capitalize(String, androidx.ui.text.LocaleList localeList);
+    method public static String decapitalize(String, androidx.ui.text.Locale locale);
+    method public static String decapitalize(String, androidx.ui.text.LocaleList localeList);
+    method public static String toLowerCase(String, androidx.ui.text.Locale locale);
+    method public static String toLowerCase(String, androidx.ui.text.LocaleList localeList);
+    method public static String toUpperCase(String, androidx.ui.text.Locale locale);
+    method public static String toUpperCase(String, androidx.ui.text.LocaleList localeList);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class TextDelegate {
+    ctor public TextDelegate(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders);
+    method public androidx.ui.unit.Density getDensity();
+    method public androidx.ui.unit.IntPx getMaxIntrinsicWidth();
+    method public int getMaxLines();
+    method public androidx.ui.unit.IntPx getMinIntrinsicWidth();
+    method public androidx.ui.text.style.TextOverflow getOverflow();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
+    method public androidx.ui.text.font.Font.ResourceLoader getResourceLoader();
+    method public boolean getSoftWrap();
+    method public androidx.ui.text.TextStyle getStyle();
+    method public androidx.ui.text.AnnotatedString getText();
+    method public androidx.ui.text.TextLayoutResult layout(androidx.ui.core.Constraints constraints, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.TextLayoutResult? prevResult = null);
+    method public void layoutIntrinsics(androidx.ui.core.LayoutDirection layoutDirection);
+    property public final androidx.ui.unit.IntPx maxIntrinsicWidth;
+    property public final androidx.ui.unit.IntPx minIntrinsicWidth;
+    field public static final androidx.ui.text.TextDelegate.Companion! Companion;
+  }
+
+  public static final class TextDelegate.Companion {
+    method public void paint(androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
+    method public void paintBackground(int start, int end, androidx.ui.graphics.Color color, androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
+  }
+
+  public final class TextLayoutHelperKt {
+  }
+
+  public final class TextLayoutInput {
+    ctor public TextLayoutInput(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
+    method public androidx.ui.text.AnnotatedString component1();
+    method public androidx.ui.core.Constraints component10();
+    method public androidx.ui.text.TextStyle component2();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> component3();
+    method public int component4();
+    method public boolean component5();
+    method public androidx.ui.text.style.TextOverflow component6();
+    method public androidx.ui.unit.Density component7();
+    method public androidx.ui.core.LayoutDirection component8();
+    method public androidx.ui.text.font.Font.ResourceLoader component9();
+    method public androidx.ui.text.TextLayoutInput copy(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
+    method public androidx.ui.core.Constraints getConstraints();
+    method public androidx.ui.unit.Density getDensity();
+    method public androidx.ui.core.LayoutDirection getLayoutDirection();
+    method public int getMaxLines();
+    method public androidx.ui.text.style.TextOverflow getOverflow();
+    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
+    method public androidx.ui.text.font.Font.ResourceLoader getResourceLoader();
+    method public boolean getSoftWrap();
+    method public androidx.ui.text.TextStyle getStyle();
+    method public androidx.ui.text.AnnotatedString getText();
+  }
+
+  public final class TextLayoutResult {
+    method public androidx.ui.text.TextLayoutInput component1();
+    method public androidx.ui.unit.IntPxSize component3();
+    method public androidx.ui.text.TextLayoutResult copy(androidx.ui.text.TextLayoutInput layoutInput, androidx.ui.text.MultiParagraph multiParagraph, androidx.ui.unit.IntPxSize size);
+    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
+    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidOverflowHeight();
+    method public boolean getDidOverflowWidth();
+    method public androidx.ui.unit.Px getFirstBaseline();
+    method public boolean getHasVisualOverflow();
+    method public androidx.ui.unit.Px getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public androidx.ui.unit.Px getLastBaseline();
+    method public androidx.ui.text.TextLayoutInput getLayoutInput();
+    method public androidx.ui.unit.Px getLineBottom(int lineIndex);
+    method public int getLineForOffset(int offset);
+    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
+    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
+    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
+    method public androidx.ui.unit.IntPxSize getSize();
+    method public androidx.ui.text.TextRange getWordBoundary(int offset);
+    property public final boolean didOverflowHeight;
+    property public final boolean didOverflowWidth;
+    property public final androidx.ui.unit.Px firstBaseline;
+    property public final boolean hasVisualOverflow;
+    property public final androidx.ui.unit.Px lastBaseline;
+    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
+  }
+
+  public final class TextPainter {
+    method public void paint(androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
+    field public static final androidx.ui.text.TextPainter! INSTANCE;
+  }
+
+  public final class TextRange {
+    ctor public TextRange(int start, int end);
+    method public int component1();
+    method public int component2();
+    method public operator boolean contains(androidx.ui.text.TextRange other);
+    method public operator boolean contains(int offset);
+    method public androidx.ui.text.TextRange copy(int start, int end);
+    method public boolean getCollapsed();
+    method public int getEnd();
+    method public int getLength();
+    method public int getMax();
+    method public int getMin();
+    method public int getStart();
+    method public boolean intersects(androidx.ui.text.TextRange other);
+    property public final boolean collapsed;
+    property public final int length;
+    property public final int max;
+    property public final int min;
+  }
+
+  public final class TextRangeKt {
+    method public static String substring(CharSequence, androidx.ui.text.TextRange range);
+  }
+
+  public final class TextStyle {
+    ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    ctor public TextStyle();
+    method public androidx.ui.graphics.Color? component1();
+    method public androidx.ui.text.style.TextGeometricTransform? component10();
+    method public androidx.ui.text.LocaleList? component11();
+    method public androidx.ui.graphics.Color? component12();
+    method public androidx.ui.text.style.TextDecoration? component13();
+    method public androidx.ui.graphics.Shadow? component14();
+    method public androidx.ui.text.style.TextAlign? component15();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? component16();
+    method public androidx.ui.unit.TextUnit component17();
+    method public androidx.ui.text.style.TextIndent? component18();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.font.FontWeight? component3();
+    method public androidx.ui.text.font.FontStyle? component4();
+    method public androidx.ui.text.font.FontSynthesis? component5();
+    method public androidx.ui.text.font.FontFamily? component6();
+    method public String? component7();
+    method public androidx.ui.unit.TextUnit component8();
+    method public androidx.ui.text.style.BaselineShift? component9();
+    method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
+    method public androidx.ui.graphics.Color? getBackground();
+    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
+    method public androidx.ui.graphics.Color? getColor();
+    method public androidx.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public androidx.ui.unit.TextUnit getFontSize();
+    method public androidx.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.ui.text.font.FontWeight? getFontWeight();
+    method public androidx.ui.unit.TextUnit getLetterSpacing();
+    method public androidx.ui.unit.TextUnit getLineHeight();
+    method public androidx.ui.text.LocaleList? getLocaleList();
+    method public androidx.ui.graphics.Shadow? getShadow();
+    method public androidx.ui.text.style.TextAlign? getTextAlign();
+    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
+    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
+    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
+    method public androidx.ui.text.style.TextIndent? getTextIndent();
+    method public androidx.ui.text.TextStyle merge(androidx.ui.text.TextStyle? other = null);
+    method public androidx.ui.text.TextStyle merge(androidx.ui.text.SpanStyle other);
+    method public androidx.ui.text.TextStyle merge(androidx.ui.text.ParagraphStyle other);
+    method public androidx.ui.text.ParagraphStyle toParagraphStyle();
+    method public androidx.ui.text.SpanStyle toSpanStyle();
+    field public static final androidx.ui.text.TextStyle.Companion! Companion;
+  }
+
+  public static final class TextStyle.Companion {
+    method public androidx.ui.text.TextStyle getDefault();
+    property public final androidx.ui.text.TextStyle Default;
+  }
+
+  public final class TextStyleKt {
+    method public static androidx.ui.text.TextStyle lerp(androidx.ui.text.TextStyle start, androidx.ui.text.TextStyle stop, float fraction);
+    method public static androidx.ui.text.TextStyle resolveDefaults(androidx.ui.text.TextStyle style, androidx.ui.core.LayoutDirection direction);
+  }
+
+  public interface Typeface {
+    method public androidx.ui.text.font.FontFamily getFontFamily();
+    property public abstract androidx.ui.text.font.FontFamily fontFamily;
+  }
+
+  public final class TypefaceKt {
+    method public static androidx.ui.text.Typeface typefaceFromFontFamily(android.content.Context context, androidx.ui.text.font.FontFamily fontFamily, java.util.List<? extends kotlin.Pair<androidx.ui.text.font.FontWeight,? extends androidx.ui.text.font.FontStyle>>? necessaryStyles = null);
+  }
+
+}
+
+package androidx.ui.text.font {
+
+  public abstract sealed class FileBasedFontFamily extends androidx.ui.text.font.FontFamily {
+  }
+
+  public interface Font {
+    method public androidx.ui.text.font.FontStyle getStyle();
+    method public androidx.ui.text.font.FontWeight getWeight();
+    property public abstract androidx.ui.text.font.FontStyle style;
+    property public abstract androidx.ui.text.font.FontWeight weight;
+  }
+
+  public static interface Font.ResourceLoader {
+    method public Object load(androidx.ui.text.font.Font font);
+  }
+
+  public abstract sealed class FontFamily {
+    method public final boolean getCanLoadSynchronously();
+    field public static final androidx.ui.text.font.FontFamily.Companion! Companion;
+  }
+
+  public static final class FontFamily.Companion {
+    method public androidx.ui.text.font.GenericFontFamily getCursive();
+    method public androidx.ui.text.font.SystemFontFamily getDefault();
+    method public androidx.ui.text.font.GenericFontFamily getMonospace();
+    method public androidx.ui.text.font.GenericFontFamily getSansSerif();
+    method public androidx.ui.text.font.GenericFontFamily getSerif();
+    property public final androidx.ui.text.font.GenericFontFamily Cursive;
+    property public final androidx.ui.text.font.SystemFontFamily Default;
+    property public final androidx.ui.text.font.GenericFontFamily Monospace;
+    property public final androidx.ui.text.font.GenericFontFamily SansSerif;
+    property public final androidx.ui.text.font.GenericFontFamily Serif;
+  }
+
+  public final class FontFamilyKt {
+    method public static androidx.ui.text.font.FontListFontFamily fontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
+    method public static androidx.ui.text.font.FontListFontFamily fontFamily(androidx.ui.text.font.Font... fonts);
+    method public static androidx.ui.text.font.LoadedFontFamily fontFamily(androidx.ui.text.Typeface typeface);
+  }
+
+  public final class FontKt {
+    method public static androidx.ui.text.font.FontListFontFamily asFontFamily(androidx.ui.text.font.Font);
+    method public static androidx.ui.text.font.Font font(int resId, androidx.ui.text.font.FontWeight weight = FontWeight.Normal, androidx.ui.text.font.FontStyle style = androidx.ui.text.font.FontStyle.Normal);
+  }
+
+  public final class FontListFontFamily extends androidx.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.ui.text.font.Font> {
+    ctor public FontListFontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
+    method public java.util.List<androidx.ui.text.font.Font> component1();
+    method public boolean contains(androidx.ui.text.font.Font element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public androidx.ui.text.font.FontListFontFamily copy(java.util.List<? extends androidx.ui.text.font.Font> fonts);
+    method public androidx.ui.text.font.Font get(int index);
+    method public java.util.List<androidx.ui.text.font.Font> getFonts();
+    method public int getSize();
+    method public int indexOf(androidx.ui.text.font.Font element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.ui.text.font.Font> iterator();
+    method public int lastIndexOf(androidx.ui.text.font.Font element);
+    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator();
+    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator(int index);
+    method public java.util.List<androidx.ui.text.font.Font> subList(int fromIndex, int toIndex);
+  }
+
+  public enum FontStyle {
+    enum_constant public static final androidx.ui.text.font.FontStyle Italic;
+    enum_constant public static final androidx.ui.text.font.FontStyle Normal;
+  }
+
+  public enum FontSynthesis {
+    enum_constant public static final androidx.ui.text.font.FontSynthesis All;
+    enum_constant public static final androidx.ui.text.font.FontSynthesis None;
+    enum_constant public static final androidx.ui.text.font.FontSynthesis Style;
+    enum_constant public static final androidx.ui.text.font.FontSynthesis Weight;
+  }
+
+  public final class FontWeight implements java.lang.Comparable<androidx.ui.text.font.FontWeight> {
+    method public int compareTo(androidx.ui.text.font.FontWeight other);
+    method public androidx.ui.text.font.FontWeight copy(int weight);
+    field public static final androidx.ui.text.font.FontWeight.Companion! Companion;
+  }
+
+  public static final class FontWeight.Companion {
+    method public androidx.ui.text.font.FontWeight getBlack();
+    method public androidx.ui.text.font.FontWeight getBold();
+    method public androidx.ui.text.font.FontWeight getExtraBold();
+    method public androidx.ui.text.font.FontWeight getExtraLight();
+    method public androidx.ui.text.font.FontWeight getLight();
+    method public androidx.ui.text.font.FontWeight getMedium();
+    method public androidx.ui.text.font.FontWeight getNormal();
+    method public androidx.ui.text.font.FontWeight getSemiBold();
+    method public androidx.ui.text.font.FontWeight getThin();
+    method public androidx.ui.text.font.FontWeight getW100();
+    method public androidx.ui.text.font.FontWeight getW200();
+    method public androidx.ui.text.font.FontWeight getW300();
+    method public androidx.ui.text.font.FontWeight getW400();
+    method public androidx.ui.text.font.FontWeight getW500();
+    method public androidx.ui.text.font.FontWeight getW600();
+    method public androidx.ui.text.font.FontWeight getW700();
+    method public androidx.ui.text.font.FontWeight getW800();
+    method public androidx.ui.text.font.FontWeight getW900();
+    property public final androidx.ui.text.font.FontWeight Black;
+    property public final androidx.ui.text.font.FontWeight Bold;
+    property public final androidx.ui.text.font.FontWeight ExtraBold;
+    property public final androidx.ui.text.font.FontWeight ExtraLight;
+    property public final androidx.ui.text.font.FontWeight Light;
+    property public final androidx.ui.text.font.FontWeight Medium;
+    property public final androidx.ui.text.font.FontWeight Normal;
+    property public final androidx.ui.text.font.FontWeight SemiBold;
+    property public final androidx.ui.text.font.FontWeight Thin;
+    property public final androidx.ui.text.font.FontWeight W100;
+    property public final androidx.ui.text.font.FontWeight W200;
+    property public final androidx.ui.text.font.FontWeight W300;
+    property public final androidx.ui.text.font.FontWeight W400;
+    property public final androidx.ui.text.font.FontWeight W500;
+    property public final androidx.ui.text.font.FontWeight W600;
+    property public final androidx.ui.text.font.FontWeight W700;
+    property public final androidx.ui.text.font.FontWeight W800;
+    property public final androidx.ui.text.font.FontWeight W900;
+  }
+
+  public final class FontWeightKt {
+    method public static androidx.ui.text.font.FontWeight lerp(androidx.ui.text.font.FontWeight start, androidx.ui.text.font.FontWeight stop, float fraction);
+  }
+
+  public final class GenericFontFamily extends androidx.ui.text.font.SystemFontFamily {
+    method public String getName();
+  }
+
+  public final class LoadedFontFamily extends androidx.ui.text.font.FontFamily {
+    ctor public LoadedFontFamily(androidx.ui.text.Typeface typeface);
+    method public androidx.ui.text.Typeface component1();
+    method public androidx.ui.text.font.LoadedFontFamily copy(androidx.ui.text.Typeface typeface);
+    method public androidx.ui.text.Typeface getTypeface();
+  }
+
+  public final class ResourceFont implements androidx.ui.text.font.Font {
+    ctor public ResourceFont(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
+    method public int component1();
+    method public androidx.ui.text.font.FontWeight component2();
+    method public androidx.ui.text.font.FontStyle component3();
+    method public androidx.ui.text.font.ResourceFont copy(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
+    method public int getResId();
+    method public androidx.ui.text.font.FontStyle getStyle();
+    method public androidx.ui.text.font.FontWeight getWeight();
+  }
+
+  public abstract sealed class SystemFontFamily extends androidx.ui.text.font.FontFamily {
+  }
+
+}
+
+package androidx.ui.text.platform {
+
+  public final class AndroidParagraphHelperKt {
+  }
+
+  public final class AndroidParagraphKt {
+  }
+
+  public final class PlatformLocaleKt {
+  }
+
+}
+
+package androidx.ui.text.style {
+
+  public final class BaselineShift {
+    ctor public BaselineShift(float multiplier);
+    method public float component1();
+    method public androidx.ui.text.style.BaselineShift copy(float multiplier);
+    method public float getMultiplier();
+    field public static final androidx.ui.text.style.BaselineShift.Companion! Companion;
+  }
+
+  public static final class BaselineShift.Companion {
+    method public androidx.ui.text.style.BaselineShift getNone();
+    method public androidx.ui.text.style.BaselineShift getSubscript();
+    method public androidx.ui.text.style.BaselineShift getSuperscript();
+    property public final androidx.ui.text.style.BaselineShift None;
+    property public final androidx.ui.text.style.BaselineShift Subscript;
+    property public final androidx.ui.text.style.BaselineShift Superscript;
+  }
+
+  public final class BaselineShiftKt {
+    method public static androidx.ui.text.style.BaselineShift lerp(androidx.ui.text.style.BaselineShift start, androidx.ui.text.style.BaselineShift stop, float fraction);
+  }
+
+  public enum TextAlign {
+    enum_constant public static final androidx.ui.text.style.TextAlign Center;
+    enum_constant public static final androidx.ui.text.style.TextAlign End;
+    enum_constant public static final androidx.ui.text.style.TextAlign Justify;
+    enum_constant public static final androidx.ui.text.style.TextAlign Left;
+    enum_constant public static final androidx.ui.text.style.TextAlign Right;
+    enum_constant public static final androidx.ui.text.style.TextAlign Start;
+  }
+
+  public final class TextDecoration {
+    method public int component1();
+    method public boolean contains(androidx.ui.text.style.TextDecoration other);
+    method public androidx.ui.text.style.TextDecoration copy(int mask);
+    method public int getMask();
+    field public static final androidx.ui.text.style.TextDecoration.Companion! Companion;
+  }
+
+  public static final class TextDecoration.Companion {
+    method public androidx.ui.text.style.TextDecoration combine(java.util.List<androidx.ui.text.style.TextDecoration> decorations);
+    method public androidx.ui.text.style.TextDecoration getLineThrough();
+    method public androidx.ui.text.style.TextDecoration getNone();
+    method public androidx.ui.text.style.TextDecoration getUnderline();
+    property public final androidx.ui.text.style.TextDecoration LineThrough;
+    property public final androidx.ui.text.style.TextDecoration None;
+    property public final androidx.ui.text.style.TextDecoration Underline;
+  }
+
+  public enum TextDirection {
+    enum_constant public static final androidx.ui.text.style.TextDirection Ltr;
+    enum_constant public static final androidx.ui.text.style.TextDirection Rtl;
+  }
+
+  public enum TextDirectionAlgorithm {
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrLtr;
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrRtl;
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceLtr;
+    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceRtl;
+  }
+
+  public final class TextGeometricTransform {
+    ctor public TextGeometricTransform(float scaleX, float skewX);
+    ctor public TextGeometricTransform();
+    method public float component1();
+    method public float component2();
+    method public androidx.ui.text.style.TextGeometricTransform copy(float scaleX, float skewX);
+    method public float getScaleX();
+    method public float getSkewX();
+    field public static final androidx.ui.text.style.TextGeometricTransform.Companion! Companion;
+  }
+
+  public static final class TextGeometricTransform.Companion {
+  }
+
+  public final class TextGeometricTransformKt {
+    method public static androidx.ui.text.style.TextGeometricTransform lerp(androidx.ui.text.style.TextGeometricTransform start, androidx.ui.text.style.TextGeometricTransform stop, float fraction);
+  }
+
+  public final class TextIndent {
+    ctor public TextIndent(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
+    ctor public TextIndent();
+    method public androidx.ui.unit.TextUnit component1();
+    method public androidx.ui.unit.TextUnit component2();
+    method public androidx.ui.text.style.TextIndent copy(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
+    method public androidx.ui.unit.TextUnit getFirstLine();
+    method public androidx.ui.unit.TextUnit getRestLine();
+    field public static final androidx.ui.text.style.TextIndent.Companion! Companion;
+  }
+
+  public static final class TextIndent.Companion {
+    method public androidx.ui.text.style.TextIndent getNone();
+    property public final androidx.ui.text.style.TextIndent None;
+  }
+
+  public final class TextIndentKt {
+    method public static androidx.ui.text.style.TextIndent lerp(androidx.ui.text.style.TextIndent start, androidx.ui.text.style.TextIndent stop, float fraction);
+  }
+
+  public enum TextOverflow {
+    enum_constant public static final androidx.ui.text.style.TextOverflow Clip;
+    enum_constant public static final androidx.ui.text.style.TextOverflow Ellipsis;
+  }
+
+}
+
diff --git a/ui/ui-android-text/build.gradle b/ui/ui-text-core/build.gradle
similarity index 62%
copy from ui/ui-android-text/build.gradle
copy to ui/ui-text-core/build.gradle
index 52b6371..6abae17 100644
--- a/ui/ui-android-text/build.gradle
+++ b/ui/ui-text-core/build.gradle
@@ -17,6 +17,7 @@
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 import static androidx.build.dependencies.DependenciesKt.*
 
@@ -30,30 +31,52 @@
 dependencies {
     implementation(KOTLIN_STDLIB)
 
-    api "androidx.annotation:annotation:1.1.0"
+    // TODO: Non-Kotlin dependency, move to Android-specific code
+    implementation "androidx.collection:collection:1.1.0"
+    // TODO: Non-Kotlin dependency, move to Android-specific code
+    implementation "androidx.core:core:1.0.2"
 
+    implementation project(":compose:compose-runtime")
+    implementation project(":ui:ui-util")
+    implementation project(":ui:ui-text-android")
+    api project(":ui:ui-core")
+
+    testImplementation project(":ui:ui-test-font")
     testImplementation(ANDROIDX_TEST_RULES)
     testImplementation(ANDROIDX_TEST_RUNNER)
     testImplementation(JUNIT)
+    testImplementation(MOCKITO_CORE)
+    testImplementation(TRUTH)
+    testImplementation(KOTLIN_REFLECT)
+    testImplementation MOCKITO_KOTLIN, {
+        exclude group: 'org.mockito' // to keep control on the mockito version
+    }
 
+
+    androidTestImplementation project(":ui:ui-test-font")
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(ESPRESSO_CORE)
     androidTestImplementation(JUNIT)
-    androidTestImplementation(TRUTH)
     androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(TRUTH)
     androidTestImplementation MOCKITO_KOTLIN, {
         exclude group: 'org.mockito' // to keep control on the mockito version
     }
 }
 
 androidx {
-    name = "AndroidX Text"
+    name = "AndroidX UI Text Core"
     publish = Publish.SNAPSHOT_AND_RELEASE
-    generateDocs = false
     mavenVersion = LibraryVersions.UI
     mavenGroup = LibraryGroups.UI
-    inceptionYear = "2018"
-    description = "Android Specific implementation for Text."
+    inceptionYear = "2019"
+    description = "Core Text APIs and utitilities that enables the Text composables on AndroidX UI"
+}
+
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        useIR = true
+    }
 }
diff --git a/ui/ui-text/integration-tests/text-demos/build.gradle b/ui/ui-text-core/integration-tests/text-demos/build.gradle
similarity index 88%
rename from ui/ui-text/integration-tests/text-demos/build.gradle
rename to ui/ui-text-core/integration-tests/text-demos/build.gradle
index 60287ed..875a9b1 100644
--- a/ui/ui-text/integration-tests/text-demos/build.gradle
+++ b/ui/ui-text-core/integration-tests/text-demos/build.gradle
@@ -20,8 +20,8 @@
     implementation project(":ui:ui-framework")
     implementation project(":ui:ui-foundation")
     implementation project(":ui:ui-layout")
-    implementation project(":ui:ui-text")
-    implementation project(":ui:ui-text:samples")
+    implementation project(":ui:ui-text-core")
+    implementation project(":ui:ui-text-core:samples")
 }
 
 android {
diff --git a/ui/ui-text/integration-tests/text-demos/src/main/AndroidManifest.xml b/ui/ui-text-core/integration-tests/text-demos/src/main/AndroidManifest.xml
similarity index 100%
rename from ui/ui-text/integration-tests/text-demos/src/main/AndroidManifest.xml
rename to ui/ui-text-core/integration-tests/text-demos/src/main/AndroidManifest.xml
diff --git a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeInputField.kt b/ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeInputField.kt
similarity index 100%
rename from ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeInputField.kt
rename to ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeInputField.kt
diff --git a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeInputFieldFocusTransition.kt b/ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeInputFieldFocusTransition.kt
similarity index 96%
rename from ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeInputFieldFocusTransition.kt
rename to ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeInputFieldFocusTransition.kt
index 866fece..5a4f26a 100644
--- a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeInputFieldFocusTransition.kt
+++ b/ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeInputFieldFocusTransition.kt
@@ -54,7 +54,8 @@
     }
     TextField(
         value = state.value,
-        textStyle = TextStyle(color = color, fontSize = 32.sp),
+        textColor = color,
+        textStyle = TextStyle(fontSize = 32.sp),
         onValueChange = {
             state.value = it
         },
diff --git a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeInputFieldTrickyUseCase.kt b/ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeInputFieldTrickyUseCase.kt
similarity index 100%
rename from ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeInputFieldTrickyUseCase.kt
rename to ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeInputFieldTrickyUseCase.kt
diff --git a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeMultiParagraph.kt b/ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeMultiParagraph.kt
similarity index 100%
rename from ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeMultiParagraph.kt
rename to ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeMultiParagraph.kt
diff --git a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeText.kt b/ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeText.kt
similarity index 100%
rename from ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeText.kt
rename to ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeText.kt
diff --git a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeTextSelection.kt b/ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeTextSelection.kt
similarity index 100%
rename from ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeTextSelection.kt
rename to ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeTextSelection.kt
diff --git a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeTextSelectionSample.kt b/ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeTextSelectionSample.kt
similarity index 100%
rename from ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeTextSelectionSample.kt
rename to ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeTextSelectionSample.kt
diff --git a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeVariousInputField.kt b/ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeVariousInputField.kt
similarity index 98%
rename from ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeVariousInputField.kt
rename to ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeVariousInputField.kt
index b71b59b..da84965 100644
--- a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeVariousInputField.kt
+++ b/ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeVariousInputField.kt
@@ -234,13 +234,11 @@
             )
 
             TagLine(tag = "Editfield with Hint Text")
-            HintEditText @Composable {
+            HintEditText {
                 Text(
                     text = "Hint Text",
-                    style = TextStyle(
-                        color = Color(0xFF888888),
-                        fontSize = fontSize8
-                    )
+                    color = Color(0xFF888888),
+                    style = TextStyle(fontSize = fontSize8)
                 )
             }
 
diff --git a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/InteractiveText.kt b/ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/InteractiveText.kt
similarity index 100%
rename from ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/InteractiveText.kt
rename to ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/InteractiveText.kt
diff --git a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/TextDemos.kt b/ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/TextDemos.kt
similarity index 100%
rename from ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/TextDemos.kt
rename to ui/ui-text-core/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/TextDemos.kt
diff --git a/ui/ui-text-core/samples/build.gradle b/ui/ui-text-core/samples/build.gradle
new file mode 100644
index 0000000..bbd8985
--- /dev/null
+++ b/ui/ui-text-core/samples/build.gradle
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+import static androidx.build.dependencies.DependenciesKt.*
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("AndroidXUiPlugin")
+    id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+    kotlinPlugin project(path: ":compose:compose-compiler")
+
+    implementation(KOTLIN_STDLIB)
+
+    implementation project(":annotation:annotation-sampled")
+
+    implementation project(":compose:compose-runtime")
+    implementation project(":ui:ui-core")
+    implementation project(":ui:ui-foundation")
+    implementation project(":ui:ui-framework")
+    implementation project(":ui:ui-text-core")
+}
+
+android {
+    tasks.withType(KotlinCompile).configureEach {
+        kotlinOptions {
+            useIR = true
+        }
+    }
+}
diff --git a/lifecycle/lifecycle-viewmodel-hilt/src/main/AndroidManifest.xml b/ui/ui-text-core/samples/src/main/AndroidManifest.xml
similarity index 75%
copy from lifecycle/lifecycle-viewmodel-hilt/src/main/AndroidManifest.xml
copy to ui/ui-text-core/samples/src/main/AndroidManifest.xml
index 572f7d0..361b69f 100644
--- a/lifecycle/lifecycle-viewmodel-hilt/src/main/AndroidManifest.xml
+++ b/ui/ui-text-core/samples/src/main/AndroidManifest.xml
@@ -1,5 +1,5 @@
 <!--
-  Copyright 2020 The Android Open Source Project
+  Copyright 2019 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -14,6 +14,4 @@
   limitations under the License.
   -->
 
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="androidx.lifecycle.hilt">
-</manifest>
+<manifest package="androidx.ui.text.samples" />
diff --git a/ui/ui-text/samples/src/main/java/androidx/ui/text/samples/AnnotatedStringBuilderSamples.kt b/ui/ui-text-core/samples/src/main/java/androidx/ui/text/samples/AnnotatedStringBuilderSamples.kt
similarity index 100%
rename from ui/ui-text/samples/src/main/java/androidx/ui/text/samples/AnnotatedStringBuilderSamples.kt
rename to ui/ui-text-core/samples/src/main/java/androidx/ui/text/samples/AnnotatedStringBuilderSamples.kt
diff --git a/ui/ui-text/samples/src/main/java/androidx/ui/text/samples/BaselineShiftSamples.kt b/ui/ui-text-core/samples/src/main/java/androidx/ui/text/samples/BaselineShiftSamples.kt
similarity index 100%
rename from ui/ui-text/samples/src/main/java/androidx/ui/text/samples/BaselineShiftSamples.kt
rename to ui/ui-text-core/samples/src/main/java/androidx/ui/text/samples/BaselineShiftSamples.kt
diff --git a/ui/ui-text/samples/src/main/java/androidx/ui/text/samples/FontFamilySamples.kt b/ui/ui-text-core/samples/src/main/java/androidx/ui/text/samples/FontFamilySamples.kt
similarity index 100%
rename from ui/ui-text/samples/src/main/java/androidx/ui/text/samples/FontFamilySamples.kt
rename to ui/ui-text-core/samples/src/main/java/androidx/ui/text/samples/FontFamilySamples.kt
diff --git a/ui/ui-text/samples/src/main/java/androidx/ui/text/samples/ParagraphStyleSamples.kt b/ui/ui-text-core/samples/src/main/java/androidx/ui/text/samples/ParagraphStyleSamples.kt
similarity index 100%
rename from ui/ui-text/samples/src/main/java/androidx/ui/text/samples/ParagraphStyleSamples.kt
rename to ui/ui-text-core/samples/src/main/java/androidx/ui/text/samples/ParagraphStyleSamples.kt
diff --git a/ui/ui-text/samples/src/main/java/androidx/ui/text/samples/SpanStyleSamples.kt b/ui/ui-text-core/samples/src/main/java/androidx/ui/text/samples/SpanStyleSamples.kt
similarity index 100%
rename from ui/ui-text/samples/src/main/java/androidx/ui/text/samples/SpanStyleSamples.kt
rename to ui/ui-text-core/samples/src/main/java/androidx/ui/text/samples/SpanStyleSamples.kt
diff --git a/ui/ui-text/samples/src/main/java/androidx/ui/text/samples/TextDecorationSamples.kt b/ui/ui-text-core/samples/src/main/java/androidx/ui/text/samples/TextDecorationSamples.kt
similarity index 100%
rename from ui/ui-text/samples/src/main/java/androidx/ui/text/samples/TextDecorationSamples.kt
rename to ui/ui-text-core/samples/src/main/java/androidx/ui/text/samples/TextDecorationSamples.kt
diff --git a/ui/ui-text/samples/src/main/java/androidx/ui/text/samples/TextStyleSamples.kt b/ui/ui-text-core/samples/src/main/java/androidx/ui/text/samples/TextStyleSamples.kt
similarity index 100%
rename from ui/ui-text/samples/src/main/java/androidx/ui/text/samples/TextStyleSamples.kt
rename to ui/ui-text-core/samples/src/main/java/androidx/ui/text/samples/TextStyleSamples.kt
diff --git a/ui/ui-text/samples/src/main/java/androidx/ui/text/samples/VisualTransformationSamples.kt b/ui/ui-text-core/samples/src/main/java/androidx/ui/text/samples/VisualTransformationSamples.kt
similarity index 100%
rename from ui/ui-text/samples/src/main/java/androidx/ui/text/samples/VisualTransformationSamples.kt
rename to ui/ui-text-core/samples/src/main/java/androidx/ui/text/samples/VisualTransformationSamples.kt
diff --git a/ui/ui-text/samples/src/main/res/font/my_font_400_italic.ttf b/ui/ui-text-core/samples/src/main/res/font/my_font_400_italic.ttf
similarity index 100%
rename from ui/ui-text/samples/src/main/res/font/my_font_400_italic.ttf
rename to ui/ui-text-core/samples/src/main/res/font/my_font_400_italic.ttf
diff --git a/ui/ui-text/samples/src/main/res/font/my_font_400_regular.ttf b/ui/ui-text-core/samples/src/main/res/font/my_font_400_regular.ttf
similarity index 100%
rename from ui/ui-text/samples/src/main/res/font/my_font_400_regular.ttf
rename to ui/ui-text-core/samples/src/main/res/font/my_font_400_regular.ttf
diff --git a/ui/ui-text/samples/src/main/res/font/myfont.ttf b/ui/ui-text-core/samples/src/main/res/font/myfont.ttf
similarity index 100%
rename from ui/ui-text/samples/src/main/res/font/myfont.ttf
rename to ui/ui-text-core/samples/src/main/res/font/myfont.ttf
diff --git a/lifecycle/lifecycle-viewmodel-hilt/src/main/AndroidManifest.xml b/ui/ui-text-core/src/androidTest/AndroidManifest.xml
similarity index 75%
copy from lifecycle/lifecycle-viewmodel-hilt/src/main/AndroidManifest.xml
copy to ui/ui-text-core/src/androidTest/AndroidManifest.xml
index 572f7d0..92206d6 100644
--- a/lifecycle/lifecycle-viewmodel-hilt/src/main/AndroidManifest.xml
+++ b/ui/ui-text-core/src/androidTest/AndroidManifest.xml
@@ -1,5 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-  Copyright 2020 The Android Open Source Project
+  Copyright 2019 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -13,7 +14,4 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="androidx.lifecycle.hilt">
-</manifest>
+<manifest package="androidx.ui.text.core.test" />
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/input/BackspaceKeyEditOpTest.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/input/BackspaceKeyEditOpTest.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/input/BackspaceKeyEditOpTest.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/input/BackspaceKeyEditOpTest.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/input/MoveCursorEditOpTest.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/input/MoveCursorEditOpTest.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/input/MoveCursorEditOpTest.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/input/MoveCursorEditOpTest.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/FontTestData.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/FontTestData.kt
similarity index 98%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/FontTestData.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/FontTestData.kt
index 01510be..cccb5e7 100644
--- a/ui/ui-text/src/androidTest/java/androidx/ui/text/FontTestData.kt
+++ b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/FontTestData.kt
@@ -19,7 +19,7 @@
 import androidx.ui.text.font.font
 import androidx.ui.text.font.FontStyle
 import androidx.ui.text.font.FontWeight
-import androidx.ui.text.test.R
+import androidx.ui.text.font.test.R
 
 class FontTestData {
     companion object {
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/LocaleListTest.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/LocaleListTest.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/LocaleListTest.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/LocaleListTest.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/LocaleTest.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/LocaleTest.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/LocaleTest.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/LocaleTest.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/MultiParagraphIntegrationTest.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/MultiParagraphIntegrationTest.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/MultiParagraphIntegrationTest.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/MultiParagraphIntegrationTest.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/ParagraphIntegrationTest.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/ParagraphIntegrationTest.kt
similarity index 99%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/ParagraphIntegrationTest.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/ParagraphIntegrationTest.kt
index f0b351a..2f5f30a 100644
--- a/ui/ui-text/src/androidTest/java/androidx/ui/text/ParagraphIntegrationTest.kt
+++ b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/ParagraphIntegrationTest.kt
@@ -27,6 +27,7 @@
 import androidx.ui.graphics.Path
 import androidx.ui.graphics.PathOperation
 import androidx.ui.graphics.Shadow
+import androidx.ui.graphics.asAndroidBitmap
 import androidx.ui.text.FontTestData.Companion.BASIC_KERN_FONT
 import androidx.ui.text.FontTestData.Companion.BASIC_MEASURE_FONT
 import androidx.ui.text.FontTestData.Companion.FONT_100_REGULAR
@@ -1795,7 +1796,8 @@
 
             paragraphNoMaxLine.paint(Canvas(imageNoMaxLine))
             paragraphWithMaxLine.paint(Canvas(imageWithMaxLine))
-            assertThat(imageNoMaxLine.nativeImage).isNotEqualToBitmap(imageWithMaxLine.nativeImage)
+            assertThat(imageNoMaxLine.asAndroidBitmap()).isNotEqualToBitmap(imageWithMaxLine
+                .asAndroidBitmap())
         }
     }
 
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/ParagraphIntrinsicIntegrationTest.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/ParagraphIntrinsicIntegrationTest.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/ParagraphIntrinsicIntegrationTest.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/ParagraphIntrinsicIntegrationTest.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/ParagraphPlaceholderIntegrationTest.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/ParagraphPlaceholderIntegrationTest.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/ParagraphPlaceholderIntegrationTest.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/ParagraphPlaceholderIntegrationTest.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/StringTest.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/StringTest.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/StringTest.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/StringTest.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/TextDelegateIntegrationTest.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/TextDelegateIntegrationTest.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/TextDelegateIntegrationTest.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/TextDelegateIntegrationTest.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/TextLayoutResultIntegrationTest.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/TextLayoutResultIntegrationTest.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/TextLayoutResultIntegrationTest.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/TextLayoutResultIntegrationTest.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/TextTestExtensions.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/TextTestExtensions.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/TextTestExtensions.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/TextTestExtensions.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/matchers/BitmapSubject.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/matchers/BitmapSubject.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/matchers/BitmapSubject.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/matchers/BitmapSubject.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/matchers/CharSequenceSubject.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/matchers/CharSequenceSubject.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/matchers/CharSequenceSubject.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/matchers/CharSequenceSubject.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/matchers/ComposeMatchers.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/matchers/ComposeMatchers.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/matchers/ComposeMatchers.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/matchers/ComposeMatchers.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/matchers/TypefaceSubject.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/matchers/TypefaceSubject.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/matchers/TypefaceSubject.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/matchers/TypefaceSubject.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/platform/AndroidParagraphTest.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/platform/AndroidParagraphTest.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/platform/AndroidParagraphTest.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/platform/AndroidParagraphTest.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/platform/AndroidTypefaceCacheTest.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/platform/AndroidTypefaceCacheTest.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/platform/AndroidTypefaceCacheTest.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/platform/AndroidTypefaceCacheTest.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/platform/AndroidTypefaceSubsetTest.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/platform/AndroidTypefaceSubsetTest.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/platform/AndroidTypefaceSubsetTest.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/platform/AndroidTypefaceSubsetTest.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/platform/AndroidTypefaceTest.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/platform/AndroidTypefaceTest.kt
similarity index 99%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/platform/AndroidTypefaceTest.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/platform/AndroidTypefaceTest.kt
index 0c7d7f4..6adbe70 100644
--- a/ui/ui-text/src/androidTest/java/androidx/ui/text/platform/AndroidTypefaceTest.kt
+++ b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/platform/AndroidTypefaceTest.kt
@@ -32,7 +32,7 @@
 import androidx.ui.text.font.font
 import androidx.ui.text.font.fontFamily
 import androidx.ui.text.matchers.assertThat
-import androidx.ui.text.test.R
+import androidx.ui.text.core.test.R
 import androidx.ui.text.typefaceFromFontFamily
 import com.google.common.truth.Truth.assertThat
 import com.nhaarman.mockitokotlin2.any
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/platform/GenerifFontFamilyCacheTest.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/platform/GenerifFontFamilyCacheTest.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/platform/GenerifFontFamilyCacheTest.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/platform/GenerifFontFamilyCacheTest.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/platform/TextTestExtensions.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/platform/TextTestExtensions.kt
similarity index 100%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/platform/TextTestExtensions.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/platform/TextTestExtensions.kt
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/platform/TypefaceAdapterTest.kt b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/platform/TypefaceAdapterTest.kt
similarity index 99%
rename from ui/ui-text/src/androidTest/java/androidx/ui/text/platform/TypefaceAdapterTest.kt
rename to ui/ui-text-core/src/androidTest/java/androidx/ui/text/platform/TypefaceAdapterTest.kt
index 33a81d5..419d336 100644
--- a/ui/ui-text/src/androidTest/java/androidx/ui/text/platform/TypefaceAdapterTest.kt
+++ b/ui/ui-text-core/src/androidTest/java/androidx/ui/text/platform/TypefaceAdapterTest.kt
@@ -48,7 +48,7 @@
 import androidx.ui.text.font.FontWeight
 import androidx.ui.text.font.asFontFamily
 import androidx.ui.text.matchers.assertThat
-import androidx.ui.text.test.R
+import androidx.ui.text.core.test.R
 import com.google.common.truth.Truth.assertThat
 import com.nhaarman.mockitokotlin2.any
 import com.nhaarman.mockitokotlin2.eq
diff --git a/lifecycle/lifecycle-viewmodel-hilt/src/main/AndroidManifest.xml b/ui/ui-text-core/src/main/AndroidManifest.xml
similarity index 75%
copy from lifecycle/lifecycle-viewmodel-hilt/src/main/AndroidManifest.xml
copy to ui/ui-text-core/src/main/AndroidManifest.xml
index 572f7d0..3085d36 100644
--- a/lifecycle/lifecycle-viewmodel-hilt/src/main/AndroidManifest.xml
+++ b/ui/ui-text-core/src/main/AndroidManifest.xml
@@ -1,5 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-  Copyright 2020 The Android Open Source Project
+  Copyright 2019 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -13,7 +14,4 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="androidx.lifecycle.hilt">
-</manifest>
+<manifest package="androidx.ui.text.core" />
diff --git a/ui/ui-text/src/main/java/androidx/ui/input/EditOperation.kt b/ui/ui-text-core/src/main/java/androidx/ui/input/EditOperation.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/input/EditOperation.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/input/EditOperation.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/input/EditProcessor.kt b/ui/ui-text-core/src/main/java/androidx/ui/input/EditProcessor.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/input/EditProcessor.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/input/EditProcessor.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/input/EditingBuffer.kt b/ui/ui-text-core/src/main/java/androidx/ui/input/EditingBuffer.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/input/EditingBuffer.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/input/EditingBuffer.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/input/EditorValue.kt b/ui/ui-text-core/src/main/java/androidx/ui/input/EditorValue.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/input/EditorValue.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/input/EditorValue.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/input/GapBuffer.kt b/ui/ui-text-core/src/main/java/androidx/ui/input/GapBuffer.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/input/GapBuffer.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/input/GapBuffer.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/input/ImeAction.kt b/ui/ui-text-core/src/main/java/androidx/ui/input/ImeAction.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/input/ImeAction.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/input/ImeAction.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/input/InputEventListener.kt b/ui/ui-text-core/src/main/java/androidx/ui/input/InputEventListener.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/input/InputEventListener.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/input/InputEventListener.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/input/KeyboardType.kt b/ui/ui-text-core/src/main/java/androidx/ui/input/KeyboardType.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/input/KeyboardType.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/input/KeyboardType.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/input/OWNERS b/ui/ui-text-core/src/main/java/androidx/ui/input/OWNERS
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/input/OWNERS
rename to ui/ui-text-core/src/main/java/androidx/ui/input/OWNERS
diff --git a/ui/ui-text/src/main/java/androidx/ui/input/TextInputService.kt b/ui/ui-text-core/src/main/java/androidx/ui/input/TextInputService.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/input/TextInputService.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/input/TextInputService.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/input/VisualTransformation.kt b/ui/ui-text-core/src/main/java/androidx/ui/input/VisualTransformation.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/input/VisualTransformation.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/input/VisualTransformation.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/AnnotatedString.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/AnnotatedString.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/AnnotatedString.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/AnnotatedString.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/Locale.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/Locale.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/Locale.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/Locale.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/LocaleList.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/LocaleList.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/LocaleList.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/LocaleList.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/MultiParagraph.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/MultiParagraph.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/MultiParagraph.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/MultiParagraph.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/MultiParagraphIntrinsics.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/MultiParagraphIntrinsics.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/MultiParagraphIntrinsics.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/MultiParagraphIntrinsics.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/Paragraph.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/Paragraph.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/Paragraph.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/Paragraph.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/ParagraphConstraints.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/ParagraphConstraints.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/ParagraphConstraints.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/ParagraphConstraints.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/ParagraphIntrinsics.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/ParagraphIntrinsics.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/ParagraphIntrinsics.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/ParagraphIntrinsics.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/ParagraphStyle.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/ParagraphStyle.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/ParagraphStyle.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/ParagraphStyle.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/Placeholder.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/Placeholder.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/Placeholder.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/Placeholder.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/SpanStyle.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/SpanStyle.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/SpanStyle.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/SpanStyle.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/String.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/String.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/String.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/String.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/TextDelegate.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/TextDelegate.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/TextDelegate.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/TextDelegate.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/TextLayoutHelper.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/TextLayoutHelper.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/TextLayoutHelper.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/TextLayoutHelper.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/TextLayoutResult.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/TextLayoutResult.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/TextLayoutResult.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/TextLayoutResult.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/TextPainter.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/TextPainter.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/TextPainter.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/TextPainter.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/TextRange.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/TextRange.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/TextRange.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/TextRange.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/TextStyle.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/TextStyle.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/TextStyle.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/TextStyle.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/Typeface.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/Typeface.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/Typeface.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/Typeface.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/font/Font.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/font/Font.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/font/Font.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/font/Font.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/font/FontFamily.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/font/FontFamily.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/font/FontFamily.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/font/FontFamily.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/font/FontMatcher.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/font/FontMatcher.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/font/FontMatcher.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/font/FontMatcher.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/font/FontStyle.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/font/FontStyle.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/font/FontStyle.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/font/FontStyle.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/font/FontSynthesis.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/font/FontSynthesis.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/font/FontSynthesis.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/font/FontSynthesis.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/font/FontWeight.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/font/FontWeight.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/font/FontWeight.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/font/FontWeight.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidDefaultTypeface.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/platform/AndroidDefaultTypeface.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidDefaultTypeface.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/platform/AndroidDefaultTypeface.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidFontListTypeface.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/platform/AndroidFontListTypeface.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidFontListTypeface.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/platform/AndroidFontListTypeface.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidGenericFontFamilyTypeface.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/platform/AndroidGenericFontFamilyTypeface.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidGenericFontFamilyTypeface.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/platform/AndroidGenericFontFamilyTypeface.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidLocaleDelegate.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/platform/AndroidLocaleDelegate.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidLocaleDelegate.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/platform/AndroidLocaleDelegate.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidParagraph.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/platform/AndroidParagraph.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidParagraph.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/platform/AndroidParagraph.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidParagraphHelper.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/platform/AndroidParagraphHelper.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidParagraphHelper.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/platform/AndroidParagraphHelper.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidParagraphIntrinsics.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/platform/AndroidParagraphIntrinsics.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidParagraphIntrinsics.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/platform/AndroidParagraphIntrinsics.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidStringDelegate.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/platform/AndroidStringDelegate.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidStringDelegate.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/platform/AndroidStringDelegate.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidTypeface.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/platform/AndroidTypeface.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidTypeface.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/platform/AndroidTypeface.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/platform/PlatformLocale.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/platform/PlatformLocale.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/platform/PlatformLocale.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/platform/PlatformLocale.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/platform/TypefaceAdapter.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/platform/TypefaceAdapter.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/platform/TypefaceAdapter.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/platform/TypefaceAdapter.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/style/BaselineShift.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/style/BaselineShift.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/style/BaselineShift.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/style/BaselineShift.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/style/TextAlign.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/style/TextAlign.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/style/TextAlign.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/style/TextAlign.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/style/TextDecoration.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/style/TextDecoration.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/style/TextDecoration.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/style/TextDecoration.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/style/TextDirection.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/style/TextDirection.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/style/TextDirection.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/style/TextDirection.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/style/TextDirectionAlgorithm.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/style/TextDirectionAlgorithm.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/style/TextDirectionAlgorithm.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/style/TextDirectionAlgorithm.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/style/TextGeometricTransform.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/style/TextGeometricTransform.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/style/TextGeometricTransform.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/style/TextGeometricTransform.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/style/TextIndent.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/style/TextIndent.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/style/TextIndent.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/style/TextIndent.kt
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/style/TextOverflow.kt b/ui/ui-text-core/src/main/java/androidx/ui/text/style/TextOverflow.kt
similarity index 100%
rename from ui/ui-text/src/main/java/androidx/ui/text/style/TextOverflow.kt
rename to ui/ui-text-core/src/main/java/androidx/ui/text/style/TextOverflow.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/input/CommitTextEditOpTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/input/CommitTextEditOpTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/input/CommitTextEditOpTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/input/CommitTextEditOpTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/input/DeleteSurroundingTextEditOpTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/input/DeleteSurroundingTextEditOpTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/input/DeleteSurroundingTextEditOpTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/input/DeleteSurroundingTextEditOpTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/input/DeleteSurroundingTextInCodePointsEditOpTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/input/DeleteSurroundingTextInCodePointsEditOpTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/input/DeleteSurroundingTextInCodePointsEditOpTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/input/DeleteSurroundingTextInCodePointsEditOpTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/input/EditProcessorTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/input/EditProcessorTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/input/EditProcessorTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/input/EditProcessorTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/input/EditingBufferTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/input/EditingBufferTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/input/EditingBufferTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/input/EditingBufferTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/input/FinishComposingTextEditOpTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/input/FinishComposingTextEditOpTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/input/FinishComposingTextEditOpTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/input/FinishComposingTextEditOpTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/input/GapBufferTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/input/GapBufferTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/input/GapBufferTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/input/GapBufferTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/input/PasswordVisualTransformationTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/input/PasswordVisualTransformationTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/input/PasswordVisualTransformationTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/input/PasswordVisualTransformationTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/input/SetComposingRegionEditOpTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/input/SetComposingRegionEditOpTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/input/SetComposingRegionEditOpTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/input/SetComposingRegionEditOpTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/input/SetComposingTextEditOpTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/input/SetComposingTextEditOpTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/input/SetComposingTextEditOpTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/input/SetComposingTextEditOpTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/input/SetSelectionEditOpTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/input/SetSelectionEditOpTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/input/SetSelectionEditOpTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/input/SetSelectionEditOpTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/AnnotatedStringBuilderTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/AnnotatedStringBuilderTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/AnnotatedStringBuilderTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/AnnotatedStringBuilderTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/AnnotatedStringTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/AnnotatedStringTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/AnnotatedStringTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/AnnotatedStringTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/AnnotatedStringTransformTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/AnnotatedStringTransformTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/AnnotatedStringTransformTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/AnnotatedStringTransformTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/MultiParagraphTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/MultiParagraphTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/MultiParagraphTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/MultiParagraphTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/ParagraphConstraintsTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/ParagraphConstraintsTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/ParagraphConstraintsTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/ParagraphConstraintsTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/ParagraphStyleTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/ParagraphStyleTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/ParagraphStyleTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/ParagraphStyleTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/PlaceholderTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/PlaceholderTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/PlaceholderTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/PlaceholderTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/SpanStyleTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/SpanStyleTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/SpanStyleTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/SpanStyleTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/TextDelegateTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/TextDelegateTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/TextDelegateTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/TextDelegateTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/TextInputServiceTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/TextInputServiceTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/TextInputServiceTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/TextInputServiceTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/TextLayoutHelperTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/TextLayoutHelperTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/TextLayoutHelperTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/TextLayoutHelperTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/TextRangeTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/TextRangeTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/TextRangeTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/TextRangeTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/TextSpanParagraphStyleTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/TextSpanParagraphStyleTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/TextSpanParagraphStyleTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/TextSpanParagraphStyleTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/TextStyleResolveDefaultsTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/TextStyleResolveDefaultsTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/TextStyleResolveDefaultsTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/TextStyleResolveDefaultsTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/TextStyleTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/TextStyleTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/TextStyleTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/TextStyleTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/font/FontFamilyTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/font/FontFamilyTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/font/FontFamilyTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/font/FontFamilyTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/font/FontMatcherTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/font/FontMatcherTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/font/FontMatcherTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/font/FontMatcherTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/font/FontTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/font/FontTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/font/FontTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/font/FontTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/font/FontTestData.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/font/FontTestData.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/font/FontTestData.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/font/FontTestData.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/font/FontWeightTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/font/FontWeightTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/font/FontWeightTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/font/FontWeightTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/font/LoadedFontFamilyTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/font/LoadedFontFamilyTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/font/LoadedFontFamilyTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/font/LoadedFontFamilyTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/style/BaselineShiftTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/style/BaselineShiftTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/style/BaselineShiftTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/style/BaselineShiftTest.kt
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/style/TextDecorationTest.kt b/ui/ui-text-core/src/test/java/androidx/ui/text/style/TextDecorationTest.kt
similarity index 100%
rename from ui/ui-text/src/test/java/androidx/ui/text/style/TextDecorationTest.kt
rename to ui/ui-text-core/src/test/java/androidx/ui/text/style/TextDecorationTest.kt
diff --git a/ui/ui-text-core/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/ui/ui-text-core/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
new file mode 100644
index 0000000..ca6ee9c
--- /dev/null
+++ b/ui/ui-text-core/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
@@ -0,0 +1 @@
+mock-maker-inline
\ No newline at end of file
diff --git a/ui/ui-text/OWNERS b/ui/ui-text/OWNERS
index 8cd9c61..73261b9 100644
--- a/ui/ui-text/OWNERS
+++ b/ui/ui-text/OWNERS
@@ -1,12 +1,4 @@
-pavlis@google.com
-adamp@google.com
-mount@google.com
-popam@google.com
-andreykulikov@google.com
-ryanmentley@google.com
-shepshapard@google.com
-njawad@google.com
 haoyuchang@google.com
-nona@google.com
-siyamed@google.com
 qqd@google.com
+nona@google.com
+siyamed@google.com
\ No newline at end of file
diff --git a/ui/ui-text/api/0.1.0-dev09.txt b/ui/ui-text/api/0.1.0-dev09.txt
index 1df7e9d0..906a58c 100644
--- a/ui/ui-text/api/0.1.0-dev09.txt
+++ b/ui/ui-text/api/0.1.0-dev09.txt
@@ -1,925 +1,24 @@
 // Signature format: 3.0
-package androidx.ui.input {
-
-  public final class BackspaceKeyEditOp implements androidx.ui.input.EditOperation {
-    ctor public BackspaceKeyEditOp();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class CommitTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public CommitTextEditOp(String text, int newCursorPosition);
-    method public String component1();
-    method public int component2();
-    method public androidx.ui.input.CommitTextEditOp copy(String text, int newCursorPosition);
-    method public int getNewCursorPosition();
-    method public String getText();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class DeleteSurroundingTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public DeleteSurroundingTextEditOp(int beforeLength, int afterLength);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.DeleteSurroundingTextEditOp copy(int beforeLength, int afterLength);
-    method public int getAfterLength();
-    method public int getBeforeLength();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class DeleteSurroundingTextInCodePointsEditOp implements androidx.ui.input.EditOperation {
-    ctor public DeleteSurroundingTextInCodePointsEditOp(int beforeLength, int afterLength);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.DeleteSurroundingTextInCodePointsEditOp copy(int beforeLength, int afterLength);
-    method public int getAfterLength();
-    method public int getBeforeLength();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public interface EditOperation {
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class EditingBuffer {
-    ctor public EditingBuffer(String initialText, androidx.ui.text.TextRange initialSelection);
-    field public static final int NOWHERE = -1; // 0xffffffff
-  }
-
-  public final class EditorValue {
-    ctor public EditorValue(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
-    ctor public EditorValue();
-    method public String component1();
-    method public androidx.ui.text.TextRange component2();
-    method public androidx.ui.text.TextRange? component3();
-    method public androidx.ui.input.EditorValue copy(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
-    method public androidx.ui.text.TextRange? getComposition();
-    method public String getSelectedText();
-    method public androidx.ui.text.TextRange getSelection();
-    method public String getText();
-    method public String getTextAfterSelection(int maxChars);
-    method public String getTextBeforeSelection(int maxChars);
-  }
-
-  public final class FinishComposingTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public FinishComposingTextEditOp();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public enum ImeAction {
-    enum_constant public static final androidx.ui.input.ImeAction Done;
-    enum_constant public static final androidx.ui.input.ImeAction Go;
-    enum_constant public static final androidx.ui.input.ImeAction Next;
-    enum_constant public static final androidx.ui.input.ImeAction NoAction;
-    enum_constant public static final androidx.ui.input.ImeAction Previous;
-    enum_constant public static final androidx.ui.input.ImeAction Search;
-    enum_constant public static final androidx.ui.input.ImeAction Send;
-    enum_constant public static final androidx.ui.input.ImeAction Unspecified;
-  }
-
-  public interface InputEventListener {
-    method public void onEditOperations(java.util.List<? extends androidx.ui.input.EditOperation> editOps);
-    method public void onImeAction(androidx.ui.input.ImeAction imeAction);
-  }
-
-  public enum KeyboardType {
-    enum_constant public static final androidx.ui.input.KeyboardType Ascii;
-    enum_constant public static final androidx.ui.input.KeyboardType Email;
-    enum_constant public static final androidx.ui.input.KeyboardType Number;
-    enum_constant public static final androidx.ui.input.KeyboardType NumberPassword;
-    enum_constant public static final androidx.ui.input.KeyboardType Password;
-    enum_constant public static final androidx.ui.input.KeyboardType Phone;
-    enum_constant public static final androidx.ui.input.KeyboardType Text;
-    enum_constant public static final androidx.ui.input.KeyboardType Uri;
-  }
-
-  public final class MoveCursorEditOp implements androidx.ui.input.EditOperation {
-    ctor public MoveCursorEditOp(int amount);
-    method public int component1();
-    method public androidx.ui.input.MoveCursorEditOp copy(int amount);
-    method public int getAmount();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public interface OffsetMap {
-    method public int originalToTransformed(int offset);
-    method public int transformedToOriginal(int offset);
-    field public static final androidx.ui.input.OffsetMap.Companion! Companion;
-  }
-
-  public static final class OffsetMap.Companion {
-    method public androidx.ui.input.OffsetMap getIdentityOffsetMap();
-    property public final androidx.ui.input.OffsetMap identityOffsetMap;
-  }
-
-  public final class PasswordVisualTransformation implements androidx.ui.input.VisualTransformation {
-    ctor public PasswordVisualTransformation(char mask);
-    ctor public PasswordVisualTransformation();
-    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
-    method public char getMask();
-  }
-
-  public interface PlatformTextInputService {
-    method public void hideSoftwareKeyboard();
-    method public void notifyFocusedRect(androidx.ui.geometry.Rect rect);
-    method public void onStateUpdated(androidx.ui.input.EditorValue model);
-    method public void showSoftwareKeyboard();
-    method public void startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
-    method public void stopInput();
-  }
-
-  public final class SetComposingRegionEditOp implements androidx.ui.input.EditOperation {
-    ctor public SetComposingRegionEditOp(int start, int end);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.SetComposingRegionEditOp copy(int start, int end);
-    method public int getEnd();
-    method public int getStart();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class SetComposingTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public SetComposingTextEditOp(String text, int newCursorPosition);
-    method public String component1();
-    method public int component2();
-    method public androidx.ui.input.SetComposingTextEditOp copy(String text, int newCursorPosition);
-    method public int getNewCursorPosition();
-    method public String getText();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class SetSelectionEditOp implements androidx.ui.input.EditOperation {
-    ctor public SetSelectionEditOp(int start, int end);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.SetSelectionEditOp copy(int start, int end);
-    method public int getEnd();
-    method public int getStart();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public class TextInputService {
-    ctor public TextInputService(androidx.ui.input.PlatformTextInputService platformTextInputService);
-    method public void hideSoftwareKeyboard(int token);
-    method public void notifyFocusedRect(int token, androidx.ui.geometry.Rect rect);
-    method public void onStateUpdated(int token, androidx.ui.input.EditorValue model);
-    method public void showSoftwareKeyboard(int token);
-    method public int startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
-    method public void stopInput(int token);
-  }
-
-  public final class TextInputServiceKt {
-    field public static final int INVALID_SESSION = -1; // 0xffffffff
-    field public static final int NO_SESSION = 0; // 0x0
-  }
-
-  public final class TransformedText {
-    ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
-    method public androidx.ui.text.AnnotatedString component1();
-    method public androidx.ui.input.OffsetMap component2();
-    method public androidx.ui.input.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
-    method public androidx.ui.input.OffsetMap getOffsetMap();
-    method public androidx.ui.text.AnnotatedString getTransformedText();
-  }
-
-  public interface VisualTransformation {
-    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
-  }
-
-}
-
 package androidx.ui.text {
 
-  public final class AnnotatedString {
-    ctor public AnnotatedString(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles);
-    method public String component1();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> component2();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> component3();
-    method public androidx.ui.text.AnnotatedString copy(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> annotations);
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> getParagraphStyles();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> getSpanStyles();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> getStringAnnotations(String scope, int start, int end);
-    method public String getText();
-    method public operator androidx.ui.text.AnnotatedString plus(androidx.ui.text.AnnotatedString other);
+  public final class CoreTextFieldKt {
+    method public static void CoreTextField(androidx.ui.input.EditorValue value, androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = TextStyle.Default, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
   }
 
-  public static final class AnnotatedString.Builder {
-    ctor public AnnotatedString.Builder(int capacity);
-    ctor public AnnotatedString.Builder();
-    ctor public AnnotatedString.Builder(String text);
-    ctor public AnnotatedString.Builder(androidx.ui.text.AnnotatedString text);
-    method public void addAnnotationString(String scope, String annotation, int start, int end);
-    method public void addStyle(androidx.ui.text.SpanStyle style, int start, int end);
-    method public void addStyle(androidx.ui.text.ParagraphStyle style, int start, int end);
-    method public void append(String text);
-    method public void append(char p);
-    method public void append(androidx.ui.text.AnnotatedString text);
-    method public int getLength();
-    method public void pop();
-    method public void pop(int index);
-    method public int pushStringAnnotation(String scope, String annotation);
-    method public int pushStyle(androidx.ui.text.SpanStyle style);
-    method public int pushStyle(androidx.ui.text.ParagraphStyle style);
-    method public androidx.ui.text.AnnotatedString toAnnotatedString();
-    property public final int length;
+  public final class CoreTextKt {
+    method public static void CoreText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, int maxLines, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout);
+    method public static androidx.ui.core.HorizontalAlignmentLine getFirstBaseline();
+    method public static androidx.ui.core.HorizontalAlignmentLine getLastBaseline();
   }
 
-  public static final class AnnotatedString.Item<T> {
-    ctor public AnnotatedString.Item(T! item, int start, int end, String scope);
-    ctor public AnnotatedString.Item(T! item, int start, int end);
-    method public T! component1();
-    method public int component2();
-    method public int component3();
-    method public String component4();
-    method public androidx.ui.text.AnnotatedString.Item<T> copy(T! item, int start, int end, String scope);
-    method public int getEnd();
-    method public T! getItem();
-    method public String getScope();
-    method public int getStart();
-  }
-
-  public final class AnnotatedStringKt {
-    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.SpanStyle spanStyle, androidx.ui.text.ParagraphStyle? paragraphStyle = null);
-    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.ParagraphStyle paragraphStyle);
-    method public static inline androidx.ui.text.AnnotatedString AnnotatedString(kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
-    method public static androidx.ui.text.AnnotatedString capitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static androidx.ui.text.AnnotatedString decapitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static int getLength(androidx.ui.text.AnnotatedString);
-    method public static androidx.ui.text.AnnotatedString subSequence(androidx.ui.text.AnnotatedString, int start, int end);
-    method public static androidx.ui.text.AnnotatedString toLowerCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static androidx.ui.text.AnnotatedString toUpperCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
-    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
-  }
-
-  public final class Locale {
-    ctor public Locale(String languageTag);
-    method public String getLanguage();
-    method public String getRegion();
-    method public String getScript();
-    method public String toLanguageTag();
-    property public final String language;
-    property public final String region;
-    property public final String script;
-    field public static final androidx.ui.text.Locale.Companion! Companion;
-  }
-
-  public static final class Locale.Companion {
-    method public androidx.ui.text.Locale getCurrent();
-    property public final androidx.ui.text.Locale current;
-  }
-
-  public final class LocaleList implements java.util.Collection<androidx.ui.text.Locale> kotlin.jvm.internal.markers.KMappedMarker {
-    ctor public LocaleList(java.util.List<androidx.ui.text.Locale> localeList);
-    ctor public LocaleList(String languageTags);
-    ctor public LocaleList(androidx.ui.text.Locale... locales);
-    method public java.util.List<androidx.ui.text.Locale> component1();
-    method public operator boolean contains(androidx.ui.text.Locale element);
-    method public boolean containsAll(java.util.Collection<?> elements);
-    method public androidx.ui.text.LocaleList copy(java.util.List<androidx.ui.text.Locale> localeList);
-    method public operator androidx.ui.text.Locale get(int i);
-    method public java.util.List<androidx.ui.text.Locale> getLocaleList();
-    method public int getSize();
-    method public boolean isEmpty();
-    method public java.util.Iterator<androidx.ui.text.Locale> iterator();
-    property public int size;
-    field public static final androidx.ui.text.LocaleList.Companion! Companion;
-  }
-
-  public static final class LocaleList.Companion {
-    method public androidx.ui.text.LocaleList getCurrent();
-    property public final androidx.ui.text.LocaleList current;
-  }
-
-  public final class MultiParagraph {
-    ctor public MultiParagraph(androidx.ui.text.MultiParagraphIntrinsics intrinsics, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints);
-    ctor public MultiParagraph(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
-    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
-    method public androidx.ui.geometry.Rect getCursorRect(int offset);
-    method public boolean getDidExceedMaxLines();
-    method public float getFirstBaseline();
-    method public float getHeight();
-    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
-    method public androidx.ui.text.MultiParagraphIntrinsics getIntrinsics();
-    method public float getLastBaseline();
-    method public float getLineBottom(int lineIndex);
-    method public int getLineCount();
-    method public int getLineForOffset(int offset);
-    method public float getLineHeight(int lineIndex);
-    method public float getLineLeft(int lineIndex);
-    method public float getLineRight(int lineIndex);
-    method public float getLineTop(int lineIndex);
-    method public float getLineWidth(int lineIndex);
-    method public float getMaxIntrinsicWidth();
-    method public int getMaxLines();
-    method public float getMinIntrinsicWidth();
-    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
-    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
-    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
-    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
-    method public float getWidth();
-    method public androidx.ui.text.TextRange getWordBoundary(int offset);
-    method public void paint(androidx.ui.graphics.Canvas canvas);
-    property public final boolean didExceedMaxLines;
-    property public final float firstBaseline;
-    property public final float height;
-    property public final float lastBaseline;
-    property public final int lineCount;
-    property public final float maxIntrinsicWidth;
-    property public final float minIntrinsicWidth;
-    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
-    property public final float width;
-  }
-
-  public final class MultiParagraphIntrinsics implements androidx.ui.text.ParagraphIntrinsics {
-    ctor public MultiParagraphIntrinsics(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-    method public androidx.ui.text.AnnotatedString getAnnotatedString();
-    method public float getMaxIntrinsicWidth();
-    method public float getMinIntrinsicWidth();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
-    property public float maxIntrinsicWidth;
-    property public float minIntrinsicWidth;
-  }
-
-  public final class MultiParagraphIntrinsicsKt {
-  }
-
-  public final class MultiParagraphKt {
-  }
-
-  public interface Paragraph {
-    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
-    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
-    method public androidx.ui.geometry.Rect getCursorRect(int offset);
-    method public boolean getDidExceedMaxLines();
-    method public float getFirstBaseline();
-    method public float getHeight();
-    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
-    method public float getLastBaseline();
-    method public float getLineBottom(int lineIndex);
-    method public int getLineCount();
-    method public int getLineForOffset(int offset);
-    method public float getLineHeight(int lineIndex);
-    method public float getLineLeft(int lineIndex);
-    method public float getLineRight(int lineIndex);
-    method public float getLineTop(int lineIndex);
-    method public float getLineWidth(int lineIndex);
-    method public float getMaxIntrinsicWidth();
-    method public float getMinIntrinsicWidth();
-    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
-    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
-    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
-    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
-    method public float getWidth();
-    method public androidx.ui.text.TextRange getWordBoundary(int offset);
-    method public void paint(androidx.ui.graphics.Canvas canvas);
-    property public abstract boolean didExceedMaxLines;
-    property public abstract float firstBaseline;
-    property public abstract float height;
-    property public abstract float lastBaseline;
-    property public abstract int lineCount;
-    property public abstract float maxIntrinsicWidth;
-    property public abstract float minIntrinsicWidth;
-    property public abstract java.util.List<androidx.ui.geometry.Rect> placeholderRects;
-    property public abstract float width;
-  }
-
-  public final class ParagraphConstraints {
-    ctor public ParagraphConstraints(float width);
-    method public float component1();
-    method public androidx.ui.text.ParagraphConstraints copy(float width);
-    method public float getWidth();
-  }
-
-  public interface ParagraphIntrinsics {
-    method public float getMaxIntrinsicWidth();
-    method public float getMinIntrinsicWidth();
-    property public abstract float maxIntrinsicWidth;
-    property public abstract float minIntrinsicWidth;
-  }
-
-  public final class ParagraphIntrinsicsKt {
-    method public static androidx.ui.text.ParagraphIntrinsics ParagraphIntrinsics(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-  }
-
-  public final class ParagraphKt {
-    method public static androidx.ui.text.Paragraph Paragraph(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-    method public static androidx.ui.text.Paragraph Paragraph(androidx.ui.text.ParagraphIntrinsics paragraphIntrinsics, int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints);
-  }
-
-  public final class ParagraphStyle {
-    ctor public ParagraphStyle(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    ctor public ParagraphStyle();
-    method public androidx.ui.text.style.TextAlign? component1();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? component2();
-    method public androidx.ui.unit.TextUnit component3();
-    method public androidx.ui.text.style.TextIndent? component4();
-    method public androidx.ui.text.ParagraphStyle copy(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    method public androidx.ui.unit.TextUnit getLineHeight();
-    method public androidx.ui.text.style.TextAlign? getTextAlign();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
-    method public androidx.ui.text.style.TextIndent? getTextIndent();
-    method public androidx.ui.text.ParagraphStyle merge(androidx.ui.text.ParagraphStyle? other = null);
-  }
-
-  public final class ParagraphStyleKt {
-    method public static androidx.ui.text.ParagraphStyle lerp(androidx.ui.text.ParagraphStyle start, androidx.ui.text.ParagraphStyle stop, float fraction);
-  }
-
-  public final class Placeholder {
-    ctor public Placeholder(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
-    method public androidx.ui.unit.TextUnit component1();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.PlaceholderVerticalAlign component3();
-    method public androidx.ui.text.Placeholder copy(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
-    method public androidx.ui.unit.TextUnit getHeight();
-    method public androidx.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
-    method public androidx.ui.unit.TextUnit getWidth();
-  }
-
-  public enum PlaceholderVerticalAlign {
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign AboveBaseline;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Bottom;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Center;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextBottom;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextCenter;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextTop;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Top;
-  }
-
-  public final class SpanStyle {
-    ctor public SpanStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
-    ctor public SpanStyle();
-    method public androidx.ui.graphics.Color? component1();
-    method public androidx.ui.text.style.TextGeometricTransform? component10();
-    method public androidx.ui.text.LocaleList? component11();
-    method public androidx.ui.graphics.Color? component12();
-    method public androidx.ui.text.style.TextDecoration? component13();
-    method public androidx.ui.graphics.Shadow? component14();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.font.FontWeight? component3();
-    method public androidx.ui.text.font.FontStyle? component4();
-    method public androidx.ui.text.font.FontSynthesis? component5();
-    method public androidx.ui.text.font.FontFamily? component6();
-    method public String? component7();
-    method public androidx.ui.unit.TextUnit component8();
-    method public androidx.ui.text.style.BaselineShift? component9();
-    method public androidx.ui.text.SpanStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
-    method public androidx.ui.graphics.Color? getBackground();
-    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
-    method public androidx.ui.graphics.Color? getColor();
-    method public androidx.ui.text.font.FontFamily? getFontFamily();
-    method public String? getFontFeatureSettings();
-    method public androidx.ui.unit.TextUnit getFontSize();
-    method public androidx.ui.text.font.FontStyle? getFontStyle();
-    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
-    method public androidx.ui.text.font.FontWeight? getFontWeight();
-    method public androidx.ui.unit.TextUnit getLetterSpacing();
-    method public androidx.ui.text.LocaleList? getLocaleList();
-    method public androidx.ui.graphics.Shadow? getShadow();
-    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
-    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
-    method public androidx.ui.text.SpanStyle merge(androidx.ui.text.SpanStyle? other = null);
-  }
-
-  public final class SpanStyleKt {
-    method public static androidx.ui.text.SpanStyle lerp(androidx.ui.text.SpanStyle start, androidx.ui.text.SpanStyle stop, float fraction);
-  }
-
-  public final class StringKt {
-    method public static String capitalize(String, androidx.ui.text.Locale locale);
-    method public static String capitalize(String, androidx.ui.text.LocaleList localeList);
-    method public static String decapitalize(String, androidx.ui.text.Locale locale);
-    method public static String decapitalize(String, androidx.ui.text.LocaleList localeList);
-    method public static String toLowerCase(String, androidx.ui.text.Locale locale);
-    method public static String toLowerCase(String, androidx.ui.text.LocaleList localeList);
-    method public static String toUpperCase(String, androidx.ui.text.Locale locale);
-    method public static String toUpperCase(String, androidx.ui.text.LocaleList localeList);
-  }
-
-  public final class TextLayoutHelperKt {
-  }
-
-  public final class TextLayoutInput {
-    ctor public TextLayoutInput(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
-    method public androidx.ui.text.AnnotatedString component1();
-    method public androidx.ui.core.Constraints component10();
-    method public androidx.ui.text.TextStyle component2();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> component3();
-    method public int component4();
-    method public boolean component5();
-    method public androidx.ui.text.style.TextOverflow component6();
-    method public androidx.ui.unit.Density component7();
-    method public androidx.ui.core.LayoutDirection component8();
-    method public androidx.ui.text.font.Font.ResourceLoader component9();
-    method public androidx.ui.text.TextLayoutInput copy(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
-    method public androidx.ui.core.Constraints getConstraints();
-    method public androidx.ui.unit.Density getDensity();
-    method public androidx.ui.core.LayoutDirection getLayoutDirection();
-    method public int getMaxLines();
-    method public androidx.ui.text.style.TextOverflow getOverflow();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
-    method public androidx.ui.text.font.Font.ResourceLoader getResourceLoader();
-    method public boolean getSoftWrap();
-    method public androidx.ui.text.TextStyle getStyle();
-    method public androidx.ui.text.AnnotatedString getText();
-  }
-
-  public final class TextLayoutResult {
-    method public androidx.ui.text.TextLayoutInput component1();
-    method public androidx.ui.unit.IntPxSize component3();
-    method public androidx.ui.text.TextLayoutResult copy(androidx.ui.text.TextLayoutInput layoutInput, androidx.ui.text.MultiParagraph multiParagraph, androidx.ui.unit.IntPxSize size);
-    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
-    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
-    method public androidx.ui.geometry.Rect getCursorRect(int offset);
-    method public boolean getDidOverflowHeight();
-    method public boolean getDidOverflowWidth();
-    method public androidx.ui.unit.Px getFirstBaseline();
-    method public boolean getHasVisualOverflow();
-    method public androidx.ui.unit.Px getHorizontalPosition(int offset, boolean usePrimaryDirection);
-    method public androidx.ui.unit.Px getLastBaseline();
-    method public androidx.ui.text.TextLayoutInput getLayoutInput();
-    method public androidx.ui.unit.Px getLineBottom(int lineIndex);
-    method public int getLineForOffset(int offset);
-    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
-    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
-    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
-    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
-    method public androidx.ui.unit.IntPxSize getSize();
-    method public androidx.ui.text.TextRange getWordBoundary(int offset);
-    property public final boolean didOverflowHeight;
-    property public final boolean didOverflowWidth;
-    property public final androidx.ui.unit.Px firstBaseline;
-    property public final boolean hasVisualOverflow;
-    property public final androidx.ui.unit.Px lastBaseline;
-    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
-  }
-
-  public final class TextPainter {
-    method public void paint(androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
-    field public static final androidx.ui.text.TextPainter! INSTANCE;
-  }
-
-  public final class TextRange {
-    ctor public TextRange(int start, int end);
-    method public int component1();
-    method public int component2();
-    method public operator boolean contains(androidx.ui.text.TextRange other);
-    method public operator boolean contains(int offset);
-    method public androidx.ui.text.TextRange copy(int start, int end);
-    method public boolean getCollapsed();
-    method public int getEnd();
-    method public int getLength();
-    method public int getMax();
-    method public int getMin();
-    method public int getStart();
-    method public boolean intersects(androidx.ui.text.TextRange other);
-    property public final boolean collapsed;
-    property public final int length;
-    property public final int max;
-    property public final int min;
-  }
-
-  public final class TextRangeKt {
-    method public static String substring(CharSequence, androidx.ui.text.TextRange range);
-  }
-
-  public final class TextStyle {
-    ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    ctor public TextStyle();
-    method public androidx.ui.graphics.Color? component1();
-    method public androidx.ui.text.style.TextGeometricTransform? component10();
-    method public androidx.ui.text.LocaleList? component11();
-    method public androidx.ui.graphics.Color? component12();
-    method public androidx.ui.text.style.TextDecoration? component13();
-    method public androidx.ui.graphics.Shadow? component14();
-    method public androidx.ui.text.style.TextAlign? component15();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? component16();
-    method public androidx.ui.unit.TextUnit component17();
-    method public androidx.ui.text.style.TextIndent? component18();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.font.FontWeight? component3();
-    method public androidx.ui.text.font.FontStyle? component4();
-    method public androidx.ui.text.font.FontSynthesis? component5();
-    method public androidx.ui.text.font.FontFamily? component6();
-    method public String? component7();
-    method public androidx.ui.unit.TextUnit component8();
-    method public androidx.ui.text.style.BaselineShift? component9();
-    method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    method public androidx.ui.graphics.Color? getBackground();
-    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
-    method public androidx.ui.graphics.Color? getColor();
-    method public androidx.ui.text.font.FontFamily? getFontFamily();
-    method public String? getFontFeatureSettings();
-    method public androidx.ui.unit.TextUnit getFontSize();
-    method public androidx.ui.text.font.FontStyle? getFontStyle();
-    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
-    method public androidx.ui.text.font.FontWeight? getFontWeight();
-    method public androidx.ui.unit.TextUnit getLetterSpacing();
-    method public androidx.ui.unit.TextUnit getLineHeight();
-    method public androidx.ui.text.LocaleList? getLocaleList();
-    method public androidx.ui.graphics.Shadow? getShadow();
-    method public androidx.ui.text.style.TextAlign? getTextAlign();
-    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
-    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
-    method public androidx.ui.text.style.TextIndent? getTextIndent();
-    method public androidx.ui.text.TextStyle merge(androidx.ui.text.TextStyle? other = null);
-    method public androidx.ui.text.TextStyle merge(androidx.ui.text.SpanStyle other);
-    method public androidx.ui.text.TextStyle merge(androidx.ui.text.ParagraphStyle other);
-    method public androidx.ui.text.ParagraphStyle toParagraphStyle();
-    method public androidx.ui.text.SpanStyle toSpanStyle();
-    field public static final androidx.ui.text.TextStyle.Companion! Companion;
-  }
-
-  public static final class TextStyle.Companion {
-    method public androidx.ui.text.TextStyle getDefault();
-    property public final androidx.ui.text.TextStyle Default;
-  }
-
-  public final class TextStyleKt {
-    method public static androidx.ui.text.TextStyle lerp(androidx.ui.text.TextStyle start, androidx.ui.text.TextStyle stop, float fraction);
-    method public static androidx.ui.text.TextStyle resolveDefaults(androidx.ui.text.TextStyle style, androidx.ui.core.LayoutDirection direction);
-  }
-
-  public interface Typeface {
-    method public androidx.ui.text.font.FontFamily getFontFamily();
-    property public abstract androidx.ui.text.font.FontFamily fontFamily;
-  }
-
-  public final class TypefaceKt {
-    method public static androidx.ui.text.Typeface typefaceFromFontFamily(android.content.Context context, androidx.ui.text.font.FontFamily fontFamily, java.util.List<? extends kotlin.Pair<androidx.ui.text.font.FontWeight,? extends androidx.ui.text.font.FontStyle>>? necessaryStyles = null);
+  public final class TextFieldDelegateKt {
   }
 
 }
 
-package androidx.ui.text.font {
+package androidx.ui.text.selection {
 
-  public abstract sealed class FileBasedFontFamily extends androidx.ui.text.font.FontFamily {
-  }
-
-  public interface Font {
-    method public androidx.ui.text.font.FontStyle getStyle();
-    method public androidx.ui.text.font.FontWeight getWeight();
-    property public abstract androidx.ui.text.font.FontStyle style;
-    property public abstract androidx.ui.text.font.FontWeight weight;
-  }
-
-  public static interface Font.ResourceLoader {
-    method public Object load(androidx.ui.text.font.Font font);
-  }
-
-  public abstract sealed class FontFamily {
-    method public final boolean getCanLoadSynchronously();
-    field public static final androidx.ui.text.font.FontFamily.Companion! Companion;
-  }
-
-  public static final class FontFamily.Companion {
-    method public androidx.ui.text.font.GenericFontFamily getCursive();
-    method public androidx.ui.text.font.SystemFontFamily getDefault();
-    method public androidx.ui.text.font.GenericFontFamily getMonospace();
-    method public androidx.ui.text.font.GenericFontFamily getSansSerif();
-    method public androidx.ui.text.font.GenericFontFamily getSerif();
-    property public final androidx.ui.text.font.GenericFontFamily Cursive;
-    property public final androidx.ui.text.font.SystemFontFamily Default;
-    property public final androidx.ui.text.font.GenericFontFamily Monospace;
-    property public final androidx.ui.text.font.GenericFontFamily SansSerif;
-    property public final androidx.ui.text.font.GenericFontFamily Serif;
-  }
-
-  public final class FontFamilyKt {
-    method public static androidx.ui.text.font.FontListFontFamily fontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
-    method public static androidx.ui.text.font.FontListFontFamily fontFamily(androidx.ui.text.font.Font... fonts);
-    method public static androidx.ui.text.font.LoadedFontFamily fontFamily(androidx.ui.text.Typeface typeface);
-  }
-
-  public final class FontKt {
-    method public static androidx.ui.text.font.FontListFontFamily asFontFamily(androidx.ui.text.font.Font);
-    method public static androidx.ui.text.font.Font font(int resId, androidx.ui.text.font.FontWeight weight = FontWeight.Normal, androidx.ui.text.font.FontStyle style = androidx.ui.text.font.FontStyle.Normal);
-  }
-
-  public final class FontListFontFamily extends androidx.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.ui.text.font.Font> {
-    ctor public FontListFontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
-    method public java.util.List<androidx.ui.text.font.Font> component1();
-    method public boolean contains(androidx.ui.text.font.Font element);
-    method public boolean containsAll(java.util.Collection<?> elements);
-    method public androidx.ui.text.font.FontListFontFamily copy(java.util.List<? extends androidx.ui.text.font.Font> fonts);
-    method public androidx.ui.text.font.Font get(int index);
-    method public java.util.List<androidx.ui.text.font.Font> getFonts();
-    method public int getSize();
-    method public int indexOf(androidx.ui.text.font.Font element);
-    method public boolean isEmpty();
-    method public java.util.Iterator<androidx.ui.text.font.Font> iterator();
-    method public int lastIndexOf(androidx.ui.text.font.Font element);
-    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator();
-    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator(int index);
-    method public java.util.List<androidx.ui.text.font.Font> subList(int fromIndex, int toIndex);
-  }
-
-  public enum FontStyle {
-    enum_constant public static final androidx.ui.text.font.FontStyle Italic;
-    enum_constant public static final androidx.ui.text.font.FontStyle Normal;
-  }
-
-  public enum FontSynthesis {
-    enum_constant public static final androidx.ui.text.font.FontSynthesis All;
-    enum_constant public static final androidx.ui.text.font.FontSynthesis None;
-    enum_constant public static final androidx.ui.text.font.FontSynthesis Style;
-    enum_constant public static final androidx.ui.text.font.FontSynthesis Weight;
-  }
-
-  public final class FontWeight implements java.lang.Comparable<androidx.ui.text.font.FontWeight> {
-    method public int compareTo(androidx.ui.text.font.FontWeight other);
-    method public androidx.ui.text.font.FontWeight copy(int weight);
-    field public static final androidx.ui.text.font.FontWeight.Companion! Companion;
-  }
-
-  public static final class FontWeight.Companion {
-    method public androidx.ui.text.font.FontWeight getBlack();
-    method public androidx.ui.text.font.FontWeight getBold();
-    method public androidx.ui.text.font.FontWeight getExtraBold();
-    method public androidx.ui.text.font.FontWeight getExtraLight();
-    method public androidx.ui.text.font.FontWeight getLight();
-    method public androidx.ui.text.font.FontWeight getMedium();
-    method public androidx.ui.text.font.FontWeight getNormal();
-    method public androidx.ui.text.font.FontWeight getSemiBold();
-    method public androidx.ui.text.font.FontWeight getThin();
-    method public androidx.ui.text.font.FontWeight getW100();
-    method public androidx.ui.text.font.FontWeight getW200();
-    method public androidx.ui.text.font.FontWeight getW300();
-    method public androidx.ui.text.font.FontWeight getW400();
-    method public androidx.ui.text.font.FontWeight getW500();
-    method public androidx.ui.text.font.FontWeight getW600();
-    method public androidx.ui.text.font.FontWeight getW700();
-    method public androidx.ui.text.font.FontWeight getW800();
-    method public androidx.ui.text.font.FontWeight getW900();
-    property public final androidx.ui.text.font.FontWeight Black;
-    property public final androidx.ui.text.font.FontWeight Bold;
-    property public final androidx.ui.text.font.FontWeight ExtraBold;
-    property public final androidx.ui.text.font.FontWeight ExtraLight;
-    property public final androidx.ui.text.font.FontWeight Light;
-    property public final androidx.ui.text.font.FontWeight Medium;
-    property public final androidx.ui.text.font.FontWeight Normal;
-    property public final androidx.ui.text.font.FontWeight SemiBold;
-    property public final androidx.ui.text.font.FontWeight Thin;
-    property public final androidx.ui.text.font.FontWeight W100;
-    property public final androidx.ui.text.font.FontWeight W200;
-    property public final androidx.ui.text.font.FontWeight W300;
-    property public final androidx.ui.text.font.FontWeight W400;
-    property public final androidx.ui.text.font.FontWeight W500;
-    property public final androidx.ui.text.font.FontWeight W600;
-    property public final androidx.ui.text.font.FontWeight W700;
-    property public final androidx.ui.text.font.FontWeight W800;
-    property public final androidx.ui.text.font.FontWeight W900;
-  }
-
-  public final class FontWeightKt {
-    method public static androidx.ui.text.font.FontWeight lerp(androidx.ui.text.font.FontWeight start, androidx.ui.text.font.FontWeight stop, float fraction);
-  }
-
-  public final class GenericFontFamily extends androidx.ui.text.font.SystemFontFamily {
-    method public String getName();
-  }
-
-  public final class LoadedFontFamily extends androidx.ui.text.font.FontFamily {
-    ctor public LoadedFontFamily(androidx.ui.text.Typeface typeface);
-    method public androidx.ui.text.Typeface component1();
-    method public androidx.ui.text.font.LoadedFontFamily copy(androidx.ui.text.Typeface typeface);
-    method public androidx.ui.text.Typeface getTypeface();
-  }
-
-  public final class ResourceFont implements androidx.ui.text.font.Font {
-    ctor public ResourceFont(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
-    method public int component1();
-    method public androidx.ui.text.font.FontWeight component2();
-    method public androidx.ui.text.font.FontStyle component3();
-    method public androidx.ui.text.font.ResourceFont copy(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
-    method public int getResId();
-    method public androidx.ui.text.font.FontStyle getStyle();
-    method public androidx.ui.text.font.FontWeight getWeight();
-  }
-
-  public abstract sealed class SystemFontFamily extends androidx.ui.text.font.FontFamily {
-  }
-
-}
-
-package androidx.ui.text.platform {
-
-  public final class AndroidParagraphHelperKt {
-  }
-
-  public final class AndroidParagraphKt {
-  }
-
-  public final class PlatformLocaleKt {
-  }
-
-}
-
-package androidx.ui.text.style {
-
-  public final class BaselineShift {
-    ctor public BaselineShift(float multiplier);
-    method public float component1();
-    method public androidx.ui.text.style.BaselineShift copy(float multiplier);
-    method public float getMultiplier();
-    field public static final androidx.ui.text.style.BaselineShift.Companion! Companion;
-  }
-
-  public static final class BaselineShift.Companion {
-    method public androidx.ui.text.style.BaselineShift getNone();
-    method public androidx.ui.text.style.BaselineShift getSubscript();
-    method public androidx.ui.text.style.BaselineShift getSuperscript();
-    property public final androidx.ui.text.style.BaselineShift None;
-    property public final androidx.ui.text.style.BaselineShift Subscript;
-    property public final androidx.ui.text.style.BaselineShift Superscript;
-  }
-
-  public final class BaselineShiftKt {
-    method public static androidx.ui.text.style.BaselineShift lerp(androidx.ui.text.style.BaselineShift start, androidx.ui.text.style.BaselineShift stop, float fraction);
-  }
-
-  public enum TextAlign {
-    enum_constant public static final androidx.ui.text.style.TextAlign Center;
-    enum_constant public static final androidx.ui.text.style.TextAlign End;
-    enum_constant public static final androidx.ui.text.style.TextAlign Justify;
-    enum_constant public static final androidx.ui.text.style.TextAlign Left;
-    enum_constant public static final androidx.ui.text.style.TextAlign Right;
-    enum_constant public static final androidx.ui.text.style.TextAlign Start;
-  }
-
-  public final class TextDecoration {
-    method public int component1();
-    method public boolean contains(androidx.ui.text.style.TextDecoration other);
-    method public androidx.ui.text.style.TextDecoration copy(int mask);
-    method public int getMask();
-    field public static final androidx.ui.text.style.TextDecoration.Companion! Companion;
-  }
-
-  public static final class TextDecoration.Companion {
-    method public androidx.ui.text.style.TextDecoration combine(java.util.List<androidx.ui.text.style.TextDecoration> decorations);
-    method public androidx.ui.text.style.TextDecoration getLineThrough();
-    method public androidx.ui.text.style.TextDecoration getNone();
-    method public androidx.ui.text.style.TextDecoration getUnderline();
-    property public final androidx.ui.text.style.TextDecoration LineThrough;
-    property public final androidx.ui.text.style.TextDecoration None;
-    property public final androidx.ui.text.style.TextDecoration Underline;
-  }
-
-  public enum TextDirection {
-    enum_constant public static final androidx.ui.text.style.TextDirection Ltr;
-    enum_constant public static final androidx.ui.text.style.TextDirection Rtl;
-  }
-
-  public enum TextDirectionAlgorithm {
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrLtr;
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrRtl;
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceLtr;
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceRtl;
-  }
-
-  public final class TextGeometricTransform {
-    ctor public TextGeometricTransform(float scaleX, float skewX);
-    ctor public TextGeometricTransform();
-    method public float component1();
-    method public float component2();
-    method public androidx.ui.text.style.TextGeometricTransform copy(float scaleX, float skewX);
-    method public float getScaleX();
-    method public float getSkewX();
-    field public static final androidx.ui.text.style.TextGeometricTransform.Companion! Companion;
-  }
-
-  public static final class TextGeometricTransform.Companion {
-  }
-
-  public final class TextGeometricTransformKt {
-    method public static androidx.ui.text.style.TextGeometricTransform lerp(androidx.ui.text.style.TextGeometricTransform start, androidx.ui.text.style.TextGeometricTransform stop, float fraction);
-  }
-
-  public final class TextIndent {
-    ctor public TextIndent(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
-    ctor public TextIndent();
-    method public androidx.ui.unit.TextUnit component1();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.style.TextIndent copy(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
-    method public androidx.ui.unit.TextUnit getFirstLine();
-    method public androidx.ui.unit.TextUnit getRestLine();
-    field public static final androidx.ui.text.style.TextIndent.Companion! Companion;
-  }
-
-  public static final class TextIndent.Companion {
-    method public androidx.ui.text.style.TextIndent getNone();
-    property public final androidx.ui.text.style.TextIndent None;
-  }
-
-  public final class TextIndentKt {
-    method public static androidx.ui.text.style.TextIndent lerp(androidx.ui.text.style.TextIndent start, androidx.ui.text.style.TextIndent stop, float fraction);
-  }
-
-  public enum TextOverflow {
-    enum_constant public static final androidx.ui.text.style.TextOverflow Clip;
-    enum_constant public static final androidx.ui.text.style.TextOverflow Ellipsis;
+  public final class TextSelectionDelegateKt {
   }
 
 }
diff --git a/ui/ui-text/api/current.txt b/ui/ui-text/api/current.txt
index 1df7e9d0..906a58c 100644
--- a/ui/ui-text/api/current.txt
+++ b/ui/ui-text/api/current.txt
@@ -1,925 +1,24 @@
 // Signature format: 3.0
-package androidx.ui.input {
-
-  public final class BackspaceKeyEditOp implements androidx.ui.input.EditOperation {
-    ctor public BackspaceKeyEditOp();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class CommitTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public CommitTextEditOp(String text, int newCursorPosition);
-    method public String component1();
-    method public int component2();
-    method public androidx.ui.input.CommitTextEditOp copy(String text, int newCursorPosition);
-    method public int getNewCursorPosition();
-    method public String getText();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class DeleteSurroundingTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public DeleteSurroundingTextEditOp(int beforeLength, int afterLength);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.DeleteSurroundingTextEditOp copy(int beforeLength, int afterLength);
-    method public int getAfterLength();
-    method public int getBeforeLength();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class DeleteSurroundingTextInCodePointsEditOp implements androidx.ui.input.EditOperation {
-    ctor public DeleteSurroundingTextInCodePointsEditOp(int beforeLength, int afterLength);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.DeleteSurroundingTextInCodePointsEditOp copy(int beforeLength, int afterLength);
-    method public int getAfterLength();
-    method public int getBeforeLength();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public interface EditOperation {
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class EditingBuffer {
-    ctor public EditingBuffer(String initialText, androidx.ui.text.TextRange initialSelection);
-    field public static final int NOWHERE = -1; // 0xffffffff
-  }
-
-  public final class EditorValue {
-    ctor public EditorValue(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
-    ctor public EditorValue();
-    method public String component1();
-    method public androidx.ui.text.TextRange component2();
-    method public androidx.ui.text.TextRange? component3();
-    method public androidx.ui.input.EditorValue copy(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
-    method public androidx.ui.text.TextRange? getComposition();
-    method public String getSelectedText();
-    method public androidx.ui.text.TextRange getSelection();
-    method public String getText();
-    method public String getTextAfterSelection(int maxChars);
-    method public String getTextBeforeSelection(int maxChars);
-  }
-
-  public final class FinishComposingTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public FinishComposingTextEditOp();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public enum ImeAction {
-    enum_constant public static final androidx.ui.input.ImeAction Done;
-    enum_constant public static final androidx.ui.input.ImeAction Go;
-    enum_constant public static final androidx.ui.input.ImeAction Next;
-    enum_constant public static final androidx.ui.input.ImeAction NoAction;
-    enum_constant public static final androidx.ui.input.ImeAction Previous;
-    enum_constant public static final androidx.ui.input.ImeAction Search;
-    enum_constant public static final androidx.ui.input.ImeAction Send;
-    enum_constant public static final androidx.ui.input.ImeAction Unspecified;
-  }
-
-  public interface InputEventListener {
-    method public void onEditOperations(java.util.List<? extends androidx.ui.input.EditOperation> editOps);
-    method public void onImeAction(androidx.ui.input.ImeAction imeAction);
-  }
-
-  public enum KeyboardType {
-    enum_constant public static final androidx.ui.input.KeyboardType Ascii;
-    enum_constant public static final androidx.ui.input.KeyboardType Email;
-    enum_constant public static final androidx.ui.input.KeyboardType Number;
-    enum_constant public static final androidx.ui.input.KeyboardType NumberPassword;
-    enum_constant public static final androidx.ui.input.KeyboardType Password;
-    enum_constant public static final androidx.ui.input.KeyboardType Phone;
-    enum_constant public static final androidx.ui.input.KeyboardType Text;
-    enum_constant public static final androidx.ui.input.KeyboardType Uri;
-  }
-
-  public final class MoveCursorEditOp implements androidx.ui.input.EditOperation {
-    ctor public MoveCursorEditOp(int amount);
-    method public int component1();
-    method public androidx.ui.input.MoveCursorEditOp copy(int amount);
-    method public int getAmount();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public interface OffsetMap {
-    method public int originalToTransformed(int offset);
-    method public int transformedToOriginal(int offset);
-    field public static final androidx.ui.input.OffsetMap.Companion! Companion;
-  }
-
-  public static final class OffsetMap.Companion {
-    method public androidx.ui.input.OffsetMap getIdentityOffsetMap();
-    property public final androidx.ui.input.OffsetMap identityOffsetMap;
-  }
-
-  public final class PasswordVisualTransformation implements androidx.ui.input.VisualTransformation {
-    ctor public PasswordVisualTransformation(char mask);
-    ctor public PasswordVisualTransformation();
-    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
-    method public char getMask();
-  }
-
-  public interface PlatformTextInputService {
-    method public void hideSoftwareKeyboard();
-    method public void notifyFocusedRect(androidx.ui.geometry.Rect rect);
-    method public void onStateUpdated(androidx.ui.input.EditorValue model);
-    method public void showSoftwareKeyboard();
-    method public void startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
-    method public void stopInput();
-  }
-
-  public final class SetComposingRegionEditOp implements androidx.ui.input.EditOperation {
-    ctor public SetComposingRegionEditOp(int start, int end);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.SetComposingRegionEditOp copy(int start, int end);
-    method public int getEnd();
-    method public int getStart();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class SetComposingTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public SetComposingTextEditOp(String text, int newCursorPosition);
-    method public String component1();
-    method public int component2();
-    method public androidx.ui.input.SetComposingTextEditOp copy(String text, int newCursorPosition);
-    method public int getNewCursorPosition();
-    method public String getText();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class SetSelectionEditOp implements androidx.ui.input.EditOperation {
-    ctor public SetSelectionEditOp(int start, int end);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.SetSelectionEditOp copy(int start, int end);
-    method public int getEnd();
-    method public int getStart();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public class TextInputService {
-    ctor public TextInputService(androidx.ui.input.PlatformTextInputService platformTextInputService);
-    method public void hideSoftwareKeyboard(int token);
-    method public void notifyFocusedRect(int token, androidx.ui.geometry.Rect rect);
-    method public void onStateUpdated(int token, androidx.ui.input.EditorValue model);
-    method public void showSoftwareKeyboard(int token);
-    method public int startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
-    method public void stopInput(int token);
-  }
-
-  public final class TextInputServiceKt {
-    field public static final int INVALID_SESSION = -1; // 0xffffffff
-    field public static final int NO_SESSION = 0; // 0x0
-  }
-
-  public final class TransformedText {
-    ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
-    method public androidx.ui.text.AnnotatedString component1();
-    method public androidx.ui.input.OffsetMap component2();
-    method public androidx.ui.input.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
-    method public androidx.ui.input.OffsetMap getOffsetMap();
-    method public androidx.ui.text.AnnotatedString getTransformedText();
-  }
-
-  public interface VisualTransformation {
-    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
-  }
-
-}
-
 package androidx.ui.text {
 
-  public final class AnnotatedString {
-    ctor public AnnotatedString(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles);
-    method public String component1();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> component2();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> component3();
-    method public androidx.ui.text.AnnotatedString copy(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> annotations);
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> getParagraphStyles();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> getSpanStyles();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> getStringAnnotations(String scope, int start, int end);
-    method public String getText();
-    method public operator androidx.ui.text.AnnotatedString plus(androidx.ui.text.AnnotatedString other);
+  public final class CoreTextFieldKt {
+    method public static void CoreTextField(androidx.ui.input.EditorValue value, androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = TextStyle.Default, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
   }
 
-  public static final class AnnotatedString.Builder {
-    ctor public AnnotatedString.Builder(int capacity);
-    ctor public AnnotatedString.Builder();
-    ctor public AnnotatedString.Builder(String text);
-    ctor public AnnotatedString.Builder(androidx.ui.text.AnnotatedString text);
-    method public void addAnnotationString(String scope, String annotation, int start, int end);
-    method public void addStyle(androidx.ui.text.SpanStyle style, int start, int end);
-    method public void addStyle(androidx.ui.text.ParagraphStyle style, int start, int end);
-    method public void append(String text);
-    method public void append(char p);
-    method public void append(androidx.ui.text.AnnotatedString text);
-    method public int getLength();
-    method public void pop();
-    method public void pop(int index);
-    method public int pushStringAnnotation(String scope, String annotation);
-    method public int pushStyle(androidx.ui.text.SpanStyle style);
-    method public int pushStyle(androidx.ui.text.ParagraphStyle style);
-    method public androidx.ui.text.AnnotatedString toAnnotatedString();
-    property public final int length;
+  public final class CoreTextKt {
+    method public static void CoreText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, int maxLines, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout);
+    method public static androidx.ui.core.HorizontalAlignmentLine getFirstBaseline();
+    method public static androidx.ui.core.HorizontalAlignmentLine getLastBaseline();
   }
 
-  public static final class AnnotatedString.Item<T> {
-    ctor public AnnotatedString.Item(T! item, int start, int end, String scope);
-    ctor public AnnotatedString.Item(T! item, int start, int end);
-    method public T! component1();
-    method public int component2();
-    method public int component3();
-    method public String component4();
-    method public androidx.ui.text.AnnotatedString.Item<T> copy(T! item, int start, int end, String scope);
-    method public int getEnd();
-    method public T! getItem();
-    method public String getScope();
-    method public int getStart();
-  }
-
-  public final class AnnotatedStringKt {
-    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.SpanStyle spanStyle, androidx.ui.text.ParagraphStyle? paragraphStyle = null);
-    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.ParagraphStyle paragraphStyle);
-    method public static inline androidx.ui.text.AnnotatedString AnnotatedString(kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
-    method public static androidx.ui.text.AnnotatedString capitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static androidx.ui.text.AnnotatedString decapitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static int getLength(androidx.ui.text.AnnotatedString);
-    method public static androidx.ui.text.AnnotatedString subSequence(androidx.ui.text.AnnotatedString, int start, int end);
-    method public static androidx.ui.text.AnnotatedString toLowerCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static androidx.ui.text.AnnotatedString toUpperCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
-    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
-  }
-
-  public final class Locale {
-    ctor public Locale(String languageTag);
-    method public String getLanguage();
-    method public String getRegion();
-    method public String getScript();
-    method public String toLanguageTag();
-    property public final String language;
-    property public final String region;
-    property public final String script;
-    field public static final androidx.ui.text.Locale.Companion! Companion;
-  }
-
-  public static final class Locale.Companion {
-    method public androidx.ui.text.Locale getCurrent();
-    property public final androidx.ui.text.Locale current;
-  }
-
-  public final class LocaleList implements java.util.Collection<androidx.ui.text.Locale> kotlin.jvm.internal.markers.KMappedMarker {
-    ctor public LocaleList(java.util.List<androidx.ui.text.Locale> localeList);
-    ctor public LocaleList(String languageTags);
-    ctor public LocaleList(androidx.ui.text.Locale... locales);
-    method public java.util.List<androidx.ui.text.Locale> component1();
-    method public operator boolean contains(androidx.ui.text.Locale element);
-    method public boolean containsAll(java.util.Collection<?> elements);
-    method public androidx.ui.text.LocaleList copy(java.util.List<androidx.ui.text.Locale> localeList);
-    method public operator androidx.ui.text.Locale get(int i);
-    method public java.util.List<androidx.ui.text.Locale> getLocaleList();
-    method public int getSize();
-    method public boolean isEmpty();
-    method public java.util.Iterator<androidx.ui.text.Locale> iterator();
-    property public int size;
-    field public static final androidx.ui.text.LocaleList.Companion! Companion;
-  }
-
-  public static final class LocaleList.Companion {
-    method public androidx.ui.text.LocaleList getCurrent();
-    property public final androidx.ui.text.LocaleList current;
-  }
-
-  public final class MultiParagraph {
-    ctor public MultiParagraph(androidx.ui.text.MultiParagraphIntrinsics intrinsics, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints);
-    ctor public MultiParagraph(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
-    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
-    method public androidx.ui.geometry.Rect getCursorRect(int offset);
-    method public boolean getDidExceedMaxLines();
-    method public float getFirstBaseline();
-    method public float getHeight();
-    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
-    method public androidx.ui.text.MultiParagraphIntrinsics getIntrinsics();
-    method public float getLastBaseline();
-    method public float getLineBottom(int lineIndex);
-    method public int getLineCount();
-    method public int getLineForOffset(int offset);
-    method public float getLineHeight(int lineIndex);
-    method public float getLineLeft(int lineIndex);
-    method public float getLineRight(int lineIndex);
-    method public float getLineTop(int lineIndex);
-    method public float getLineWidth(int lineIndex);
-    method public float getMaxIntrinsicWidth();
-    method public int getMaxLines();
-    method public float getMinIntrinsicWidth();
-    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
-    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
-    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
-    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
-    method public float getWidth();
-    method public androidx.ui.text.TextRange getWordBoundary(int offset);
-    method public void paint(androidx.ui.graphics.Canvas canvas);
-    property public final boolean didExceedMaxLines;
-    property public final float firstBaseline;
-    property public final float height;
-    property public final float lastBaseline;
-    property public final int lineCount;
-    property public final float maxIntrinsicWidth;
-    property public final float minIntrinsicWidth;
-    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
-    property public final float width;
-  }
-
-  public final class MultiParagraphIntrinsics implements androidx.ui.text.ParagraphIntrinsics {
-    ctor public MultiParagraphIntrinsics(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-    method public androidx.ui.text.AnnotatedString getAnnotatedString();
-    method public float getMaxIntrinsicWidth();
-    method public float getMinIntrinsicWidth();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
-    property public float maxIntrinsicWidth;
-    property public float minIntrinsicWidth;
-  }
-
-  public final class MultiParagraphIntrinsicsKt {
-  }
-
-  public final class MultiParagraphKt {
-  }
-
-  public interface Paragraph {
-    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
-    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
-    method public androidx.ui.geometry.Rect getCursorRect(int offset);
-    method public boolean getDidExceedMaxLines();
-    method public float getFirstBaseline();
-    method public float getHeight();
-    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
-    method public float getLastBaseline();
-    method public float getLineBottom(int lineIndex);
-    method public int getLineCount();
-    method public int getLineForOffset(int offset);
-    method public float getLineHeight(int lineIndex);
-    method public float getLineLeft(int lineIndex);
-    method public float getLineRight(int lineIndex);
-    method public float getLineTop(int lineIndex);
-    method public float getLineWidth(int lineIndex);
-    method public float getMaxIntrinsicWidth();
-    method public float getMinIntrinsicWidth();
-    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
-    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
-    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
-    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
-    method public float getWidth();
-    method public androidx.ui.text.TextRange getWordBoundary(int offset);
-    method public void paint(androidx.ui.graphics.Canvas canvas);
-    property public abstract boolean didExceedMaxLines;
-    property public abstract float firstBaseline;
-    property public abstract float height;
-    property public abstract float lastBaseline;
-    property public abstract int lineCount;
-    property public abstract float maxIntrinsicWidth;
-    property public abstract float minIntrinsicWidth;
-    property public abstract java.util.List<androidx.ui.geometry.Rect> placeholderRects;
-    property public abstract float width;
-  }
-
-  public final class ParagraphConstraints {
-    ctor public ParagraphConstraints(float width);
-    method public float component1();
-    method public androidx.ui.text.ParagraphConstraints copy(float width);
-    method public float getWidth();
-  }
-
-  public interface ParagraphIntrinsics {
-    method public float getMaxIntrinsicWidth();
-    method public float getMinIntrinsicWidth();
-    property public abstract float maxIntrinsicWidth;
-    property public abstract float minIntrinsicWidth;
-  }
-
-  public final class ParagraphIntrinsicsKt {
-    method public static androidx.ui.text.ParagraphIntrinsics ParagraphIntrinsics(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-  }
-
-  public final class ParagraphKt {
-    method public static androidx.ui.text.Paragraph Paragraph(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-    method public static androidx.ui.text.Paragraph Paragraph(androidx.ui.text.ParagraphIntrinsics paragraphIntrinsics, int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints);
-  }
-
-  public final class ParagraphStyle {
-    ctor public ParagraphStyle(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    ctor public ParagraphStyle();
-    method public androidx.ui.text.style.TextAlign? component1();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? component2();
-    method public androidx.ui.unit.TextUnit component3();
-    method public androidx.ui.text.style.TextIndent? component4();
-    method public androidx.ui.text.ParagraphStyle copy(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    method public androidx.ui.unit.TextUnit getLineHeight();
-    method public androidx.ui.text.style.TextAlign? getTextAlign();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
-    method public androidx.ui.text.style.TextIndent? getTextIndent();
-    method public androidx.ui.text.ParagraphStyle merge(androidx.ui.text.ParagraphStyle? other = null);
-  }
-
-  public final class ParagraphStyleKt {
-    method public static androidx.ui.text.ParagraphStyle lerp(androidx.ui.text.ParagraphStyle start, androidx.ui.text.ParagraphStyle stop, float fraction);
-  }
-
-  public final class Placeholder {
-    ctor public Placeholder(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
-    method public androidx.ui.unit.TextUnit component1();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.PlaceholderVerticalAlign component3();
-    method public androidx.ui.text.Placeholder copy(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
-    method public androidx.ui.unit.TextUnit getHeight();
-    method public androidx.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
-    method public androidx.ui.unit.TextUnit getWidth();
-  }
-
-  public enum PlaceholderVerticalAlign {
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign AboveBaseline;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Bottom;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Center;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextBottom;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextCenter;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextTop;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Top;
-  }
-
-  public final class SpanStyle {
-    ctor public SpanStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
-    ctor public SpanStyle();
-    method public androidx.ui.graphics.Color? component1();
-    method public androidx.ui.text.style.TextGeometricTransform? component10();
-    method public androidx.ui.text.LocaleList? component11();
-    method public androidx.ui.graphics.Color? component12();
-    method public androidx.ui.text.style.TextDecoration? component13();
-    method public androidx.ui.graphics.Shadow? component14();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.font.FontWeight? component3();
-    method public androidx.ui.text.font.FontStyle? component4();
-    method public androidx.ui.text.font.FontSynthesis? component5();
-    method public androidx.ui.text.font.FontFamily? component6();
-    method public String? component7();
-    method public androidx.ui.unit.TextUnit component8();
-    method public androidx.ui.text.style.BaselineShift? component9();
-    method public androidx.ui.text.SpanStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
-    method public androidx.ui.graphics.Color? getBackground();
-    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
-    method public androidx.ui.graphics.Color? getColor();
-    method public androidx.ui.text.font.FontFamily? getFontFamily();
-    method public String? getFontFeatureSettings();
-    method public androidx.ui.unit.TextUnit getFontSize();
-    method public androidx.ui.text.font.FontStyle? getFontStyle();
-    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
-    method public androidx.ui.text.font.FontWeight? getFontWeight();
-    method public androidx.ui.unit.TextUnit getLetterSpacing();
-    method public androidx.ui.text.LocaleList? getLocaleList();
-    method public androidx.ui.graphics.Shadow? getShadow();
-    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
-    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
-    method public androidx.ui.text.SpanStyle merge(androidx.ui.text.SpanStyle? other = null);
-  }
-
-  public final class SpanStyleKt {
-    method public static androidx.ui.text.SpanStyle lerp(androidx.ui.text.SpanStyle start, androidx.ui.text.SpanStyle stop, float fraction);
-  }
-
-  public final class StringKt {
-    method public static String capitalize(String, androidx.ui.text.Locale locale);
-    method public static String capitalize(String, androidx.ui.text.LocaleList localeList);
-    method public static String decapitalize(String, androidx.ui.text.Locale locale);
-    method public static String decapitalize(String, androidx.ui.text.LocaleList localeList);
-    method public static String toLowerCase(String, androidx.ui.text.Locale locale);
-    method public static String toLowerCase(String, androidx.ui.text.LocaleList localeList);
-    method public static String toUpperCase(String, androidx.ui.text.Locale locale);
-    method public static String toUpperCase(String, androidx.ui.text.LocaleList localeList);
-  }
-
-  public final class TextLayoutHelperKt {
-  }
-
-  public final class TextLayoutInput {
-    ctor public TextLayoutInput(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
-    method public androidx.ui.text.AnnotatedString component1();
-    method public androidx.ui.core.Constraints component10();
-    method public androidx.ui.text.TextStyle component2();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> component3();
-    method public int component4();
-    method public boolean component5();
-    method public androidx.ui.text.style.TextOverflow component6();
-    method public androidx.ui.unit.Density component7();
-    method public androidx.ui.core.LayoutDirection component8();
-    method public androidx.ui.text.font.Font.ResourceLoader component9();
-    method public androidx.ui.text.TextLayoutInput copy(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
-    method public androidx.ui.core.Constraints getConstraints();
-    method public androidx.ui.unit.Density getDensity();
-    method public androidx.ui.core.LayoutDirection getLayoutDirection();
-    method public int getMaxLines();
-    method public androidx.ui.text.style.TextOverflow getOverflow();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
-    method public androidx.ui.text.font.Font.ResourceLoader getResourceLoader();
-    method public boolean getSoftWrap();
-    method public androidx.ui.text.TextStyle getStyle();
-    method public androidx.ui.text.AnnotatedString getText();
-  }
-
-  public final class TextLayoutResult {
-    method public androidx.ui.text.TextLayoutInput component1();
-    method public androidx.ui.unit.IntPxSize component3();
-    method public androidx.ui.text.TextLayoutResult copy(androidx.ui.text.TextLayoutInput layoutInput, androidx.ui.text.MultiParagraph multiParagraph, androidx.ui.unit.IntPxSize size);
-    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
-    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
-    method public androidx.ui.geometry.Rect getCursorRect(int offset);
-    method public boolean getDidOverflowHeight();
-    method public boolean getDidOverflowWidth();
-    method public androidx.ui.unit.Px getFirstBaseline();
-    method public boolean getHasVisualOverflow();
-    method public androidx.ui.unit.Px getHorizontalPosition(int offset, boolean usePrimaryDirection);
-    method public androidx.ui.unit.Px getLastBaseline();
-    method public androidx.ui.text.TextLayoutInput getLayoutInput();
-    method public androidx.ui.unit.Px getLineBottom(int lineIndex);
-    method public int getLineForOffset(int offset);
-    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
-    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
-    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
-    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
-    method public androidx.ui.unit.IntPxSize getSize();
-    method public androidx.ui.text.TextRange getWordBoundary(int offset);
-    property public final boolean didOverflowHeight;
-    property public final boolean didOverflowWidth;
-    property public final androidx.ui.unit.Px firstBaseline;
-    property public final boolean hasVisualOverflow;
-    property public final androidx.ui.unit.Px lastBaseline;
-    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
-  }
-
-  public final class TextPainter {
-    method public void paint(androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
-    field public static final androidx.ui.text.TextPainter! INSTANCE;
-  }
-
-  public final class TextRange {
-    ctor public TextRange(int start, int end);
-    method public int component1();
-    method public int component2();
-    method public operator boolean contains(androidx.ui.text.TextRange other);
-    method public operator boolean contains(int offset);
-    method public androidx.ui.text.TextRange copy(int start, int end);
-    method public boolean getCollapsed();
-    method public int getEnd();
-    method public int getLength();
-    method public int getMax();
-    method public int getMin();
-    method public int getStart();
-    method public boolean intersects(androidx.ui.text.TextRange other);
-    property public final boolean collapsed;
-    property public final int length;
-    property public final int max;
-    property public final int min;
-  }
-
-  public final class TextRangeKt {
-    method public static String substring(CharSequence, androidx.ui.text.TextRange range);
-  }
-
-  public final class TextStyle {
-    ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    ctor public TextStyle();
-    method public androidx.ui.graphics.Color? component1();
-    method public androidx.ui.text.style.TextGeometricTransform? component10();
-    method public androidx.ui.text.LocaleList? component11();
-    method public androidx.ui.graphics.Color? component12();
-    method public androidx.ui.text.style.TextDecoration? component13();
-    method public androidx.ui.graphics.Shadow? component14();
-    method public androidx.ui.text.style.TextAlign? component15();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? component16();
-    method public androidx.ui.unit.TextUnit component17();
-    method public androidx.ui.text.style.TextIndent? component18();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.font.FontWeight? component3();
-    method public androidx.ui.text.font.FontStyle? component4();
-    method public androidx.ui.text.font.FontSynthesis? component5();
-    method public androidx.ui.text.font.FontFamily? component6();
-    method public String? component7();
-    method public androidx.ui.unit.TextUnit component8();
-    method public androidx.ui.text.style.BaselineShift? component9();
-    method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    method public androidx.ui.graphics.Color? getBackground();
-    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
-    method public androidx.ui.graphics.Color? getColor();
-    method public androidx.ui.text.font.FontFamily? getFontFamily();
-    method public String? getFontFeatureSettings();
-    method public androidx.ui.unit.TextUnit getFontSize();
-    method public androidx.ui.text.font.FontStyle? getFontStyle();
-    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
-    method public androidx.ui.text.font.FontWeight? getFontWeight();
-    method public androidx.ui.unit.TextUnit getLetterSpacing();
-    method public androidx.ui.unit.TextUnit getLineHeight();
-    method public androidx.ui.text.LocaleList? getLocaleList();
-    method public androidx.ui.graphics.Shadow? getShadow();
-    method public androidx.ui.text.style.TextAlign? getTextAlign();
-    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
-    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
-    method public androidx.ui.text.style.TextIndent? getTextIndent();
-    method public androidx.ui.text.TextStyle merge(androidx.ui.text.TextStyle? other = null);
-    method public androidx.ui.text.TextStyle merge(androidx.ui.text.SpanStyle other);
-    method public androidx.ui.text.TextStyle merge(androidx.ui.text.ParagraphStyle other);
-    method public androidx.ui.text.ParagraphStyle toParagraphStyle();
-    method public androidx.ui.text.SpanStyle toSpanStyle();
-    field public static final androidx.ui.text.TextStyle.Companion! Companion;
-  }
-
-  public static final class TextStyle.Companion {
-    method public androidx.ui.text.TextStyle getDefault();
-    property public final androidx.ui.text.TextStyle Default;
-  }
-
-  public final class TextStyleKt {
-    method public static androidx.ui.text.TextStyle lerp(androidx.ui.text.TextStyle start, androidx.ui.text.TextStyle stop, float fraction);
-    method public static androidx.ui.text.TextStyle resolveDefaults(androidx.ui.text.TextStyle style, androidx.ui.core.LayoutDirection direction);
-  }
-
-  public interface Typeface {
-    method public androidx.ui.text.font.FontFamily getFontFamily();
-    property public abstract androidx.ui.text.font.FontFamily fontFamily;
-  }
-
-  public final class TypefaceKt {
-    method public static androidx.ui.text.Typeface typefaceFromFontFamily(android.content.Context context, androidx.ui.text.font.FontFamily fontFamily, java.util.List<? extends kotlin.Pair<androidx.ui.text.font.FontWeight,? extends androidx.ui.text.font.FontStyle>>? necessaryStyles = null);
+  public final class TextFieldDelegateKt {
   }
 
 }
 
-package androidx.ui.text.font {
+package androidx.ui.text.selection {
 
-  public abstract sealed class FileBasedFontFamily extends androidx.ui.text.font.FontFamily {
-  }
-
-  public interface Font {
-    method public androidx.ui.text.font.FontStyle getStyle();
-    method public androidx.ui.text.font.FontWeight getWeight();
-    property public abstract androidx.ui.text.font.FontStyle style;
-    property public abstract androidx.ui.text.font.FontWeight weight;
-  }
-
-  public static interface Font.ResourceLoader {
-    method public Object load(androidx.ui.text.font.Font font);
-  }
-
-  public abstract sealed class FontFamily {
-    method public final boolean getCanLoadSynchronously();
-    field public static final androidx.ui.text.font.FontFamily.Companion! Companion;
-  }
-
-  public static final class FontFamily.Companion {
-    method public androidx.ui.text.font.GenericFontFamily getCursive();
-    method public androidx.ui.text.font.SystemFontFamily getDefault();
-    method public androidx.ui.text.font.GenericFontFamily getMonospace();
-    method public androidx.ui.text.font.GenericFontFamily getSansSerif();
-    method public androidx.ui.text.font.GenericFontFamily getSerif();
-    property public final androidx.ui.text.font.GenericFontFamily Cursive;
-    property public final androidx.ui.text.font.SystemFontFamily Default;
-    property public final androidx.ui.text.font.GenericFontFamily Monospace;
-    property public final androidx.ui.text.font.GenericFontFamily SansSerif;
-    property public final androidx.ui.text.font.GenericFontFamily Serif;
-  }
-
-  public final class FontFamilyKt {
-    method public static androidx.ui.text.font.FontListFontFamily fontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
-    method public static androidx.ui.text.font.FontListFontFamily fontFamily(androidx.ui.text.font.Font... fonts);
-    method public static androidx.ui.text.font.LoadedFontFamily fontFamily(androidx.ui.text.Typeface typeface);
-  }
-
-  public final class FontKt {
-    method public static androidx.ui.text.font.FontListFontFamily asFontFamily(androidx.ui.text.font.Font);
-    method public static androidx.ui.text.font.Font font(int resId, androidx.ui.text.font.FontWeight weight = FontWeight.Normal, androidx.ui.text.font.FontStyle style = androidx.ui.text.font.FontStyle.Normal);
-  }
-
-  public final class FontListFontFamily extends androidx.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.ui.text.font.Font> {
-    ctor public FontListFontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
-    method public java.util.List<androidx.ui.text.font.Font> component1();
-    method public boolean contains(androidx.ui.text.font.Font element);
-    method public boolean containsAll(java.util.Collection<?> elements);
-    method public androidx.ui.text.font.FontListFontFamily copy(java.util.List<? extends androidx.ui.text.font.Font> fonts);
-    method public androidx.ui.text.font.Font get(int index);
-    method public java.util.List<androidx.ui.text.font.Font> getFonts();
-    method public int getSize();
-    method public int indexOf(androidx.ui.text.font.Font element);
-    method public boolean isEmpty();
-    method public java.util.Iterator<androidx.ui.text.font.Font> iterator();
-    method public int lastIndexOf(androidx.ui.text.font.Font element);
-    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator();
-    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator(int index);
-    method public java.util.List<androidx.ui.text.font.Font> subList(int fromIndex, int toIndex);
-  }
-
-  public enum FontStyle {
-    enum_constant public static final androidx.ui.text.font.FontStyle Italic;
-    enum_constant public static final androidx.ui.text.font.FontStyle Normal;
-  }
-
-  public enum FontSynthesis {
-    enum_constant public static final androidx.ui.text.font.FontSynthesis All;
-    enum_constant public static final androidx.ui.text.font.FontSynthesis None;
-    enum_constant public static final androidx.ui.text.font.FontSynthesis Style;
-    enum_constant public static final androidx.ui.text.font.FontSynthesis Weight;
-  }
-
-  public final class FontWeight implements java.lang.Comparable<androidx.ui.text.font.FontWeight> {
-    method public int compareTo(androidx.ui.text.font.FontWeight other);
-    method public androidx.ui.text.font.FontWeight copy(int weight);
-    field public static final androidx.ui.text.font.FontWeight.Companion! Companion;
-  }
-
-  public static final class FontWeight.Companion {
-    method public androidx.ui.text.font.FontWeight getBlack();
-    method public androidx.ui.text.font.FontWeight getBold();
-    method public androidx.ui.text.font.FontWeight getExtraBold();
-    method public androidx.ui.text.font.FontWeight getExtraLight();
-    method public androidx.ui.text.font.FontWeight getLight();
-    method public androidx.ui.text.font.FontWeight getMedium();
-    method public androidx.ui.text.font.FontWeight getNormal();
-    method public androidx.ui.text.font.FontWeight getSemiBold();
-    method public androidx.ui.text.font.FontWeight getThin();
-    method public androidx.ui.text.font.FontWeight getW100();
-    method public androidx.ui.text.font.FontWeight getW200();
-    method public androidx.ui.text.font.FontWeight getW300();
-    method public androidx.ui.text.font.FontWeight getW400();
-    method public androidx.ui.text.font.FontWeight getW500();
-    method public androidx.ui.text.font.FontWeight getW600();
-    method public androidx.ui.text.font.FontWeight getW700();
-    method public androidx.ui.text.font.FontWeight getW800();
-    method public androidx.ui.text.font.FontWeight getW900();
-    property public final androidx.ui.text.font.FontWeight Black;
-    property public final androidx.ui.text.font.FontWeight Bold;
-    property public final androidx.ui.text.font.FontWeight ExtraBold;
-    property public final androidx.ui.text.font.FontWeight ExtraLight;
-    property public final androidx.ui.text.font.FontWeight Light;
-    property public final androidx.ui.text.font.FontWeight Medium;
-    property public final androidx.ui.text.font.FontWeight Normal;
-    property public final androidx.ui.text.font.FontWeight SemiBold;
-    property public final androidx.ui.text.font.FontWeight Thin;
-    property public final androidx.ui.text.font.FontWeight W100;
-    property public final androidx.ui.text.font.FontWeight W200;
-    property public final androidx.ui.text.font.FontWeight W300;
-    property public final androidx.ui.text.font.FontWeight W400;
-    property public final androidx.ui.text.font.FontWeight W500;
-    property public final androidx.ui.text.font.FontWeight W600;
-    property public final androidx.ui.text.font.FontWeight W700;
-    property public final androidx.ui.text.font.FontWeight W800;
-    property public final androidx.ui.text.font.FontWeight W900;
-  }
-
-  public final class FontWeightKt {
-    method public static androidx.ui.text.font.FontWeight lerp(androidx.ui.text.font.FontWeight start, androidx.ui.text.font.FontWeight stop, float fraction);
-  }
-
-  public final class GenericFontFamily extends androidx.ui.text.font.SystemFontFamily {
-    method public String getName();
-  }
-
-  public final class LoadedFontFamily extends androidx.ui.text.font.FontFamily {
-    ctor public LoadedFontFamily(androidx.ui.text.Typeface typeface);
-    method public androidx.ui.text.Typeface component1();
-    method public androidx.ui.text.font.LoadedFontFamily copy(androidx.ui.text.Typeface typeface);
-    method public androidx.ui.text.Typeface getTypeface();
-  }
-
-  public final class ResourceFont implements androidx.ui.text.font.Font {
-    ctor public ResourceFont(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
-    method public int component1();
-    method public androidx.ui.text.font.FontWeight component2();
-    method public androidx.ui.text.font.FontStyle component3();
-    method public androidx.ui.text.font.ResourceFont copy(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
-    method public int getResId();
-    method public androidx.ui.text.font.FontStyle getStyle();
-    method public androidx.ui.text.font.FontWeight getWeight();
-  }
-
-  public abstract sealed class SystemFontFamily extends androidx.ui.text.font.FontFamily {
-  }
-
-}
-
-package androidx.ui.text.platform {
-
-  public final class AndroidParagraphHelperKt {
-  }
-
-  public final class AndroidParagraphKt {
-  }
-
-  public final class PlatformLocaleKt {
-  }
-
-}
-
-package androidx.ui.text.style {
-
-  public final class BaselineShift {
-    ctor public BaselineShift(float multiplier);
-    method public float component1();
-    method public androidx.ui.text.style.BaselineShift copy(float multiplier);
-    method public float getMultiplier();
-    field public static final androidx.ui.text.style.BaselineShift.Companion! Companion;
-  }
-
-  public static final class BaselineShift.Companion {
-    method public androidx.ui.text.style.BaselineShift getNone();
-    method public androidx.ui.text.style.BaselineShift getSubscript();
-    method public androidx.ui.text.style.BaselineShift getSuperscript();
-    property public final androidx.ui.text.style.BaselineShift None;
-    property public final androidx.ui.text.style.BaselineShift Subscript;
-    property public final androidx.ui.text.style.BaselineShift Superscript;
-  }
-
-  public final class BaselineShiftKt {
-    method public static androidx.ui.text.style.BaselineShift lerp(androidx.ui.text.style.BaselineShift start, androidx.ui.text.style.BaselineShift stop, float fraction);
-  }
-
-  public enum TextAlign {
-    enum_constant public static final androidx.ui.text.style.TextAlign Center;
-    enum_constant public static final androidx.ui.text.style.TextAlign End;
-    enum_constant public static final androidx.ui.text.style.TextAlign Justify;
-    enum_constant public static final androidx.ui.text.style.TextAlign Left;
-    enum_constant public static final androidx.ui.text.style.TextAlign Right;
-    enum_constant public static final androidx.ui.text.style.TextAlign Start;
-  }
-
-  public final class TextDecoration {
-    method public int component1();
-    method public boolean contains(androidx.ui.text.style.TextDecoration other);
-    method public androidx.ui.text.style.TextDecoration copy(int mask);
-    method public int getMask();
-    field public static final androidx.ui.text.style.TextDecoration.Companion! Companion;
-  }
-
-  public static final class TextDecoration.Companion {
-    method public androidx.ui.text.style.TextDecoration combine(java.util.List<androidx.ui.text.style.TextDecoration> decorations);
-    method public androidx.ui.text.style.TextDecoration getLineThrough();
-    method public androidx.ui.text.style.TextDecoration getNone();
-    method public androidx.ui.text.style.TextDecoration getUnderline();
-    property public final androidx.ui.text.style.TextDecoration LineThrough;
-    property public final androidx.ui.text.style.TextDecoration None;
-    property public final androidx.ui.text.style.TextDecoration Underline;
-  }
-
-  public enum TextDirection {
-    enum_constant public static final androidx.ui.text.style.TextDirection Ltr;
-    enum_constant public static final androidx.ui.text.style.TextDirection Rtl;
-  }
-
-  public enum TextDirectionAlgorithm {
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrLtr;
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrRtl;
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceLtr;
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceRtl;
-  }
-
-  public final class TextGeometricTransform {
-    ctor public TextGeometricTransform(float scaleX, float skewX);
-    ctor public TextGeometricTransform();
-    method public float component1();
-    method public float component2();
-    method public androidx.ui.text.style.TextGeometricTransform copy(float scaleX, float skewX);
-    method public float getScaleX();
-    method public float getSkewX();
-    field public static final androidx.ui.text.style.TextGeometricTransform.Companion! Companion;
-  }
-
-  public static final class TextGeometricTransform.Companion {
-  }
-
-  public final class TextGeometricTransformKt {
-    method public static androidx.ui.text.style.TextGeometricTransform lerp(androidx.ui.text.style.TextGeometricTransform start, androidx.ui.text.style.TextGeometricTransform stop, float fraction);
-  }
-
-  public final class TextIndent {
-    ctor public TextIndent(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
-    ctor public TextIndent();
-    method public androidx.ui.unit.TextUnit component1();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.style.TextIndent copy(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
-    method public androidx.ui.unit.TextUnit getFirstLine();
-    method public androidx.ui.unit.TextUnit getRestLine();
-    field public static final androidx.ui.text.style.TextIndent.Companion! Companion;
-  }
-
-  public static final class TextIndent.Companion {
-    method public androidx.ui.text.style.TextIndent getNone();
-    property public final androidx.ui.text.style.TextIndent None;
-  }
-
-  public final class TextIndentKt {
-    method public static androidx.ui.text.style.TextIndent lerp(androidx.ui.text.style.TextIndent start, androidx.ui.text.style.TextIndent stop, float fraction);
-  }
-
-  public enum TextOverflow {
-    enum_constant public static final androidx.ui.text.style.TextOverflow Clip;
-    enum_constant public static final androidx.ui.text.style.TextOverflow Ellipsis;
+  public final class TextSelectionDelegateKt {
   }
 
 }
diff --git a/ui/ui-text/api/public_plus_experimental_0.1.0-dev09.txt b/ui/ui-text/api/public_plus_experimental_0.1.0-dev09.txt
index 1df7e9d0..906a58c 100644
--- a/ui/ui-text/api/public_plus_experimental_0.1.0-dev09.txt
+++ b/ui/ui-text/api/public_plus_experimental_0.1.0-dev09.txt
@@ -1,925 +1,24 @@
 // Signature format: 3.0
-package androidx.ui.input {
-
-  public final class BackspaceKeyEditOp implements androidx.ui.input.EditOperation {
-    ctor public BackspaceKeyEditOp();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class CommitTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public CommitTextEditOp(String text, int newCursorPosition);
-    method public String component1();
-    method public int component2();
-    method public androidx.ui.input.CommitTextEditOp copy(String text, int newCursorPosition);
-    method public int getNewCursorPosition();
-    method public String getText();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class DeleteSurroundingTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public DeleteSurroundingTextEditOp(int beforeLength, int afterLength);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.DeleteSurroundingTextEditOp copy(int beforeLength, int afterLength);
-    method public int getAfterLength();
-    method public int getBeforeLength();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class DeleteSurroundingTextInCodePointsEditOp implements androidx.ui.input.EditOperation {
-    ctor public DeleteSurroundingTextInCodePointsEditOp(int beforeLength, int afterLength);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.DeleteSurroundingTextInCodePointsEditOp copy(int beforeLength, int afterLength);
-    method public int getAfterLength();
-    method public int getBeforeLength();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public interface EditOperation {
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class EditingBuffer {
-    ctor public EditingBuffer(String initialText, androidx.ui.text.TextRange initialSelection);
-    field public static final int NOWHERE = -1; // 0xffffffff
-  }
-
-  public final class EditorValue {
-    ctor public EditorValue(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
-    ctor public EditorValue();
-    method public String component1();
-    method public androidx.ui.text.TextRange component2();
-    method public androidx.ui.text.TextRange? component3();
-    method public androidx.ui.input.EditorValue copy(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
-    method public androidx.ui.text.TextRange? getComposition();
-    method public String getSelectedText();
-    method public androidx.ui.text.TextRange getSelection();
-    method public String getText();
-    method public String getTextAfterSelection(int maxChars);
-    method public String getTextBeforeSelection(int maxChars);
-  }
-
-  public final class FinishComposingTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public FinishComposingTextEditOp();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public enum ImeAction {
-    enum_constant public static final androidx.ui.input.ImeAction Done;
-    enum_constant public static final androidx.ui.input.ImeAction Go;
-    enum_constant public static final androidx.ui.input.ImeAction Next;
-    enum_constant public static final androidx.ui.input.ImeAction NoAction;
-    enum_constant public static final androidx.ui.input.ImeAction Previous;
-    enum_constant public static final androidx.ui.input.ImeAction Search;
-    enum_constant public static final androidx.ui.input.ImeAction Send;
-    enum_constant public static final androidx.ui.input.ImeAction Unspecified;
-  }
-
-  public interface InputEventListener {
-    method public void onEditOperations(java.util.List<? extends androidx.ui.input.EditOperation> editOps);
-    method public void onImeAction(androidx.ui.input.ImeAction imeAction);
-  }
-
-  public enum KeyboardType {
-    enum_constant public static final androidx.ui.input.KeyboardType Ascii;
-    enum_constant public static final androidx.ui.input.KeyboardType Email;
-    enum_constant public static final androidx.ui.input.KeyboardType Number;
-    enum_constant public static final androidx.ui.input.KeyboardType NumberPassword;
-    enum_constant public static final androidx.ui.input.KeyboardType Password;
-    enum_constant public static final androidx.ui.input.KeyboardType Phone;
-    enum_constant public static final androidx.ui.input.KeyboardType Text;
-    enum_constant public static final androidx.ui.input.KeyboardType Uri;
-  }
-
-  public final class MoveCursorEditOp implements androidx.ui.input.EditOperation {
-    ctor public MoveCursorEditOp(int amount);
-    method public int component1();
-    method public androidx.ui.input.MoveCursorEditOp copy(int amount);
-    method public int getAmount();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public interface OffsetMap {
-    method public int originalToTransformed(int offset);
-    method public int transformedToOriginal(int offset);
-    field public static final androidx.ui.input.OffsetMap.Companion! Companion;
-  }
-
-  public static final class OffsetMap.Companion {
-    method public androidx.ui.input.OffsetMap getIdentityOffsetMap();
-    property public final androidx.ui.input.OffsetMap identityOffsetMap;
-  }
-
-  public final class PasswordVisualTransformation implements androidx.ui.input.VisualTransformation {
-    ctor public PasswordVisualTransformation(char mask);
-    ctor public PasswordVisualTransformation();
-    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
-    method public char getMask();
-  }
-
-  public interface PlatformTextInputService {
-    method public void hideSoftwareKeyboard();
-    method public void notifyFocusedRect(androidx.ui.geometry.Rect rect);
-    method public void onStateUpdated(androidx.ui.input.EditorValue model);
-    method public void showSoftwareKeyboard();
-    method public void startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
-    method public void stopInput();
-  }
-
-  public final class SetComposingRegionEditOp implements androidx.ui.input.EditOperation {
-    ctor public SetComposingRegionEditOp(int start, int end);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.SetComposingRegionEditOp copy(int start, int end);
-    method public int getEnd();
-    method public int getStart();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class SetComposingTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public SetComposingTextEditOp(String text, int newCursorPosition);
-    method public String component1();
-    method public int component2();
-    method public androidx.ui.input.SetComposingTextEditOp copy(String text, int newCursorPosition);
-    method public int getNewCursorPosition();
-    method public String getText();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class SetSelectionEditOp implements androidx.ui.input.EditOperation {
-    ctor public SetSelectionEditOp(int start, int end);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.SetSelectionEditOp copy(int start, int end);
-    method public int getEnd();
-    method public int getStart();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public class TextInputService {
-    ctor public TextInputService(androidx.ui.input.PlatformTextInputService platformTextInputService);
-    method public void hideSoftwareKeyboard(int token);
-    method public void notifyFocusedRect(int token, androidx.ui.geometry.Rect rect);
-    method public void onStateUpdated(int token, androidx.ui.input.EditorValue model);
-    method public void showSoftwareKeyboard(int token);
-    method public int startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
-    method public void stopInput(int token);
-  }
-
-  public final class TextInputServiceKt {
-    field public static final int INVALID_SESSION = -1; // 0xffffffff
-    field public static final int NO_SESSION = 0; // 0x0
-  }
-
-  public final class TransformedText {
-    ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
-    method public androidx.ui.text.AnnotatedString component1();
-    method public androidx.ui.input.OffsetMap component2();
-    method public androidx.ui.input.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
-    method public androidx.ui.input.OffsetMap getOffsetMap();
-    method public androidx.ui.text.AnnotatedString getTransformedText();
-  }
-
-  public interface VisualTransformation {
-    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
-  }
-
-}
-
 package androidx.ui.text {
 
-  public final class AnnotatedString {
-    ctor public AnnotatedString(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles);
-    method public String component1();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> component2();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> component3();
-    method public androidx.ui.text.AnnotatedString copy(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> annotations);
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> getParagraphStyles();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> getSpanStyles();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> getStringAnnotations(String scope, int start, int end);
-    method public String getText();
-    method public operator androidx.ui.text.AnnotatedString plus(androidx.ui.text.AnnotatedString other);
+  public final class CoreTextFieldKt {
+    method public static void CoreTextField(androidx.ui.input.EditorValue value, androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = TextStyle.Default, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
   }
 
-  public static final class AnnotatedString.Builder {
-    ctor public AnnotatedString.Builder(int capacity);
-    ctor public AnnotatedString.Builder();
-    ctor public AnnotatedString.Builder(String text);
-    ctor public AnnotatedString.Builder(androidx.ui.text.AnnotatedString text);
-    method public void addAnnotationString(String scope, String annotation, int start, int end);
-    method public void addStyle(androidx.ui.text.SpanStyle style, int start, int end);
-    method public void addStyle(androidx.ui.text.ParagraphStyle style, int start, int end);
-    method public void append(String text);
-    method public void append(char p);
-    method public void append(androidx.ui.text.AnnotatedString text);
-    method public int getLength();
-    method public void pop();
-    method public void pop(int index);
-    method public int pushStringAnnotation(String scope, String annotation);
-    method public int pushStyle(androidx.ui.text.SpanStyle style);
-    method public int pushStyle(androidx.ui.text.ParagraphStyle style);
-    method public androidx.ui.text.AnnotatedString toAnnotatedString();
-    property public final int length;
+  public final class CoreTextKt {
+    method public static void CoreText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, int maxLines, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout);
+    method public static androidx.ui.core.HorizontalAlignmentLine getFirstBaseline();
+    method public static androidx.ui.core.HorizontalAlignmentLine getLastBaseline();
   }
 
-  public static final class AnnotatedString.Item<T> {
-    ctor public AnnotatedString.Item(T! item, int start, int end, String scope);
-    ctor public AnnotatedString.Item(T! item, int start, int end);
-    method public T! component1();
-    method public int component2();
-    method public int component3();
-    method public String component4();
-    method public androidx.ui.text.AnnotatedString.Item<T> copy(T! item, int start, int end, String scope);
-    method public int getEnd();
-    method public T! getItem();
-    method public String getScope();
-    method public int getStart();
-  }
-
-  public final class AnnotatedStringKt {
-    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.SpanStyle spanStyle, androidx.ui.text.ParagraphStyle? paragraphStyle = null);
-    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.ParagraphStyle paragraphStyle);
-    method public static inline androidx.ui.text.AnnotatedString AnnotatedString(kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
-    method public static androidx.ui.text.AnnotatedString capitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static androidx.ui.text.AnnotatedString decapitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static int getLength(androidx.ui.text.AnnotatedString);
-    method public static androidx.ui.text.AnnotatedString subSequence(androidx.ui.text.AnnotatedString, int start, int end);
-    method public static androidx.ui.text.AnnotatedString toLowerCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static androidx.ui.text.AnnotatedString toUpperCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
-    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
-  }
-
-  public final class Locale {
-    ctor public Locale(String languageTag);
-    method public String getLanguage();
-    method public String getRegion();
-    method public String getScript();
-    method public String toLanguageTag();
-    property public final String language;
-    property public final String region;
-    property public final String script;
-    field public static final androidx.ui.text.Locale.Companion! Companion;
-  }
-
-  public static final class Locale.Companion {
-    method public androidx.ui.text.Locale getCurrent();
-    property public final androidx.ui.text.Locale current;
-  }
-
-  public final class LocaleList implements java.util.Collection<androidx.ui.text.Locale> kotlin.jvm.internal.markers.KMappedMarker {
-    ctor public LocaleList(java.util.List<androidx.ui.text.Locale> localeList);
-    ctor public LocaleList(String languageTags);
-    ctor public LocaleList(androidx.ui.text.Locale... locales);
-    method public java.util.List<androidx.ui.text.Locale> component1();
-    method public operator boolean contains(androidx.ui.text.Locale element);
-    method public boolean containsAll(java.util.Collection<?> elements);
-    method public androidx.ui.text.LocaleList copy(java.util.List<androidx.ui.text.Locale> localeList);
-    method public operator androidx.ui.text.Locale get(int i);
-    method public java.util.List<androidx.ui.text.Locale> getLocaleList();
-    method public int getSize();
-    method public boolean isEmpty();
-    method public java.util.Iterator<androidx.ui.text.Locale> iterator();
-    property public int size;
-    field public static final androidx.ui.text.LocaleList.Companion! Companion;
-  }
-
-  public static final class LocaleList.Companion {
-    method public androidx.ui.text.LocaleList getCurrent();
-    property public final androidx.ui.text.LocaleList current;
-  }
-
-  public final class MultiParagraph {
-    ctor public MultiParagraph(androidx.ui.text.MultiParagraphIntrinsics intrinsics, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints);
-    ctor public MultiParagraph(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
-    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
-    method public androidx.ui.geometry.Rect getCursorRect(int offset);
-    method public boolean getDidExceedMaxLines();
-    method public float getFirstBaseline();
-    method public float getHeight();
-    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
-    method public androidx.ui.text.MultiParagraphIntrinsics getIntrinsics();
-    method public float getLastBaseline();
-    method public float getLineBottom(int lineIndex);
-    method public int getLineCount();
-    method public int getLineForOffset(int offset);
-    method public float getLineHeight(int lineIndex);
-    method public float getLineLeft(int lineIndex);
-    method public float getLineRight(int lineIndex);
-    method public float getLineTop(int lineIndex);
-    method public float getLineWidth(int lineIndex);
-    method public float getMaxIntrinsicWidth();
-    method public int getMaxLines();
-    method public float getMinIntrinsicWidth();
-    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
-    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
-    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
-    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
-    method public float getWidth();
-    method public androidx.ui.text.TextRange getWordBoundary(int offset);
-    method public void paint(androidx.ui.graphics.Canvas canvas);
-    property public final boolean didExceedMaxLines;
-    property public final float firstBaseline;
-    property public final float height;
-    property public final float lastBaseline;
-    property public final int lineCount;
-    property public final float maxIntrinsicWidth;
-    property public final float minIntrinsicWidth;
-    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
-    property public final float width;
-  }
-
-  public final class MultiParagraphIntrinsics implements androidx.ui.text.ParagraphIntrinsics {
-    ctor public MultiParagraphIntrinsics(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-    method public androidx.ui.text.AnnotatedString getAnnotatedString();
-    method public float getMaxIntrinsicWidth();
-    method public float getMinIntrinsicWidth();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
-    property public float maxIntrinsicWidth;
-    property public float minIntrinsicWidth;
-  }
-
-  public final class MultiParagraphIntrinsicsKt {
-  }
-
-  public final class MultiParagraphKt {
-  }
-
-  public interface Paragraph {
-    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
-    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
-    method public androidx.ui.geometry.Rect getCursorRect(int offset);
-    method public boolean getDidExceedMaxLines();
-    method public float getFirstBaseline();
-    method public float getHeight();
-    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
-    method public float getLastBaseline();
-    method public float getLineBottom(int lineIndex);
-    method public int getLineCount();
-    method public int getLineForOffset(int offset);
-    method public float getLineHeight(int lineIndex);
-    method public float getLineLeft(int lineIndex);
-    method public float getLineRight(int lineIndex);
-    method public float getLineTop(int lineIndex);
-    method public float getLineWidth(int lineIndex);
-    method public float getMaxIntrinsicWidth();
-    method public float getMinIntrinsicWidth();
-    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
-    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
-    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
-    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
-    method public float getWidth();
-    method public androidx.ui.text.TextRange getWordBoundary(int offset);
-    method public void paint(androidx.ui.graphics.Canvas canvas);
-    property public abstract boolean didExceedMaxLines;
-    property public abstract float firstBaseline;
-    property public abstract float height;
-    property public abstract float lastBaseline;
-    property public abstract int lineCount;
-    property public abstract float maxIntrinsicWidth;
-    property public abstract float minIntrinsicWidth;
-    property public abstract java.util.List<androidx.ui.geometry.Rect> placeholderRects;
-    property public abstract float width;
-  }
-
-  public final class ParagraphConstraints {
-    ctor public ParagraphConstraints(float width);
-    method public float component1();
-    method public androidx.ui.text.ParagraphConstraints copy(float width);
-    method public float getWidth();
-  }
-
-  public interface ParagraphIntrinsics {
-    method public float getMaxIntrinsicWidth();
-    method public float getMinIntrinsicWidth();
-    property public abstract float maxIntrinsicWidth;
-    property public abstract float minIntrinsicWidth;
-  }
-
-  public final class ParagraphIntrinsicsKt {
-    method public static androidx.ui.text.ParagraphIntrinsics ParagraphIntrinsics(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-  }
-
-  public final class ParagraphKt {
-    method public static androidx.ui.text.Paragraph Paragraph(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-    method public static androidx.ui.text.Paragraph Paragraph(androidx.ui.text.ParagraphIntrinsics paragraphIntrinsics, int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints);
-  }
-
-  public final class ParagraphStyle {
-    ctor public ParagraphStyle(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    ctor public ParagraphStyle();
-    method public androidx.ui.text.style.TextAlign? component1();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? component2();
-    method public androidx.ui.unit.TextUnit component3();
-    method public androidx.ui.text.style.TextIndent? component4();
-    method public androidx.ui.text.ParagraphStyle copy(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    method public androidx.ui.unit.TextUnit getLineHeight();
-    method public androidx.ui.text.style.TextAlign? getTextAlign();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
-    method public androidx.ui.text.style.TextIndent? getTextIndent();
-    method public androidx.ui.text.ParagraphStyle merge(androidx.ui.text.ParagraphStyle? other = null);
-  }
-
-  public final class ParagraphStyleKt {
-    method public static androidx.ui.text.ParagraphStyle lerp(androidx.ui.text.ParagraphStyle start, androidx.ui.text.ParagraphStyle stop, float fraction);
-  }
-
-  public final class Placeholder {
-    ctor public Placeholder(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
-    method public androidx.ui.unit.TextUnit component1();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.PlaceholderVerticalAlign component3();
-    method public androidx.ui.text.Placeholder copy(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
-    method public androidx.ui.unit.TextUnit getHeight();
-    method public androidx.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
-    method public androidx.ui.unit.TextUnit getWidth();
-  }
-
-  public enum PlaceholderVerticalAlign {
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign AboveBaseline;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Bottom;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Center;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextBottom;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextCenter;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextTop;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Top;
-  }
-
-  public final class SpanStyle {
-    ctor public SpanStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
-    ctor public SpanStyle();
-    method public androidx.ui.graphics.Color? component1();
-    method public androidx.ui.text.style.TextGeometricTransform? component10();
-    method public androidx.ui.text.LocaleList? component11();
-    method public androidx.ui.graphics.Color? component12();
-    method public androidx.ui.text.style.TextDecoration? component13();
-    method public androidx.ui.graphics.Shadow? component14();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.font.FontWeight? component3();
-    method public androidx.ui.text.font.FontStyle? component4();
-    method public androidx.ui.text.font.FontSynthesis? component5();
-    method public androidx.ui.text.font.FontFamily? component6();
-    method public String? component7();
-    method public androidx.ui.unit.TextUnit component8();
-    method public androidx.ui.text.style.BaselineShift? component9();
-    method public androidx.ui.text.SpanStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
-    method public androidx.ui.graphics.Color? getBackground();
-    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
-    method public androidx.ui.graphics.Color? getColor();
-    method public androidx.ui.text.font.FontFamily? getFontFamily();
-    method public String? getFontFeatureSettings();
-    method public androidx.ui.unit.TextUnit getFontSize();
-    method public androidx.ui.text.font.FontStyle? getFontStyle();
-    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
-    method public androidx.ui.text.font.FontWeight? getFontWeight();
-    method public androidx.ui.unit.TextUnit getLetterSpacing();
-    method public androidx.ui.text.LocaleList? getLocaleList();
-    method public androidx.ui.graphics.Shadow? getShadow();
-    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
-    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
-    method public androidx.ui.text.SpanStyle merge(androidx.ui.text.SpanStyle? other = null);
-  }
-
-  public final class SpanStyleKt {
-    method public static androidx.ui.text.SpanStyle lerp(androidx.ui.text.SpanStyle start, androidx.ui.text.SpanStyle stop, float fraction);
-  }
-
-  public final class StringKt {
-    method public static String capitalize(String, androidx.ui.text.Locale locale);
-    method public static String capitalize(String, androidx.ui.text.LocaleList localeList);
-    method public static String decapitalize(String, androidx.ui.text.Locale locale);
-    method public static String decapitalize(String, androidx.ui.text.LocaleList localeList);
-    method public static String toLowerCase(String, androidx.ui.text.Locale locale);
-    method public static String toLowerCase(String, androidx.ui.text.LocaleList localeList);
-    method public static String toUpperCase(String, androidx.ui.text.Locale locale);
-    method public static String toUpperCase(String, androidx.ui.text.LocaleList localeList);
-  }
-
-  public final class TextLayoutHelperKt {
-  }
-
-  public final class TextLayoutInput {
-    ctor public TextLayoutInput(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
-    method public androidx.ui.text.AnnotatedString component1();
-    method public androidx.ui.core.Constraints component10();
-    method public androidx.ui.text.TextStyle component2();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> component3();
-    method public int component4();
-    method public boolean component5();
-    method public androidx.ui.text.style.TextOverflow component6();
-    method public androidx.ui.unit.Density component7();
-    method public androidx.ui.core.LayoutDirection component8();
-    method public androidx.ui.text.font.Font.ResourceLoader component9();
-    method public androidx.ui.text.TextLayoutInput copy(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
-    method public androidx.ui.core.Constraints getConstraints();
-    method public androidx.ui.unit.Density getDensity();
-    method public androidx.ui.core.LayoutDirection getLayoutDirection();
-    method public int getMaxLines();
-    method public androidx.ui.text.style.TextOverflow getOverflow();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
-    method public androidx.ui.text.font.Font.ResourceLoader getResourceLoader();
-    method public boolean getSoftWrap();
-    method public androidx.ui.text.TextStyle getStyle();
-    method public androidx.ui.text.AnnotatedString getText();
-  }
-
-  public final class TextLayoutResult {
-    method public androidx.ui.text.TextLayoutInput component1();
-    method public androidx.ui.unit.IntPxSize component3();
-    method public androidx.ui.text.TextLayoutResult copy(androidx.ui.text.TextLayoutInput layoutInput, androidx.ui.text.MultiParagraph multiParagraph, androidx.ui.unit.IntPxSize size);
-    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
-    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
-    method public androidx.ui.geometry.Rect getCursorRect(int offset);
-    method public boolean getDidOverflowHeight();
-    method public boolean getDidOverflowWidth();
-    method public androidx.ui.unit.Px getFirstBaseline();
-    method public boolean getHasVisualOverflow();
-    method public androidx.ui.unit.Px getHorizontalPosition(int offset, boolean usePrimaryDirection);
-    method public androidx.ui.unit.Px getLastBaseline();
-    method public androidx.ui.text.TextLayoutInput getLayoutInput();
-    method public androidx.ui.unit.Px getLineBottom(int lineIndex);
-    method public int getLineForOffset(int offset);
-    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
-    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
-    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
-    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
-    method public androidx.ui.unit.IntPxSize getSize();
-    method public androidx.ui.text.TextRange getWordBoundary(int offset);
-    property public final boolean didOverflowHeight;
-    property public final boolean didOverflowWidth;
-    property public final androidx.ui.unit.Px firstBaseline;
-    property public final boolean hasVisualOverflow;
-    property public final androidx.ui.unit.Px lastBaseline;
-    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
-  }
-
-  public final class TextPainter {
-    method public void paint(androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
-    field public static final androidx.ui.text.TextPainter! INSTANCE;
-  }
-
-  public final class TextRange {
-    ctor public TextRange(int start, int end);
-    method public int component1();
-    method public int component2();
-    method public operator boolean contains(androidx.ui.text.TextRange other);
-    method public operator boolean contains(int offset);
-    method public androidx.ui.text.TextRange copy(int start, int end);
-    method public boolean getCollapsed();
-    method public int getEnd();
-    method public int getLength();
-    method public int getMax();
-    method public int getMin();
-    method public int getStart();
-    method public boolean intersects(androidx.ui.text.TextRange other);
-    property public final boolean collapsed;
-    property public final int length;
-    property public final int max;
-    property public final int min;
-  }
-
-  public final class TextRangeKt {
-    method public static String substring(CharSequence, androidx.ui.text.TextRange range);
-  }
-
-  public final class TextStyle {
-    ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    ctor public TextStyle();
-    method public androidx.ui.graphics.Color? component1();
-    method public androidx.ui.text.style.TextGeometricTransform? component10();
-    method public androidx.ui.text.LocaleList? component11();
-    method public androidx.ui.graphics.Color? component12();
-    method public androidx.ui.text.style.TextDecoration? component13();
-    method public androidx.ui.graphics.Shadow? component14();
-    method public androidx.ui.text.style.TextAlign? component15();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? component16();
-    method public androidx.ui.unit.TextUnit component17();
-    method public androidx.ui.text.style.TextIndent? component18();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.font.FontWeight? component3();
-    method public androidx.ui.text.font.FontStyle? component4();
-    method public androidx.ui.text.font.FontSynthesis? component5();
-    method public androidx.ui.text.font.FontFamily? component6();
-    method public String? component7();
-    method public androidx.ui.unit.TextUnit component8();
-    method public androidx.ui.text.style.BaselineShift? component9();
-    method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    method public androidx.ui.graphics.Color? getBackground();
-    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
-    method public androidx.ui.graphics.Color? getColor();
-    method public androidx.ui.text.font.FontFamily? getFontFamily();
-    method public String? getFontFeatureSettings();
-    method public androidx.ui.unit.TextUnit getFontSize();
-    method public androidx.ui.text.font.FontStyle? getFontStyle();
-    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
-    method public androidx.ui.text.font.FontWeight? getFontWeight();
-    method public androidx.ui.unit.TextUnit getLetterSpacing();
-    method public androidx.ui.unit.TextUnit getLineHeight();
-    method public androidx.ui.text.LocaleList? getLocaleList();
-    method public androidx.ui.graphics.Shadow? getShadow();
-    method public androidx.ui.text.style.TextAlign? getTextAlign();
-    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
-    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
-    method public androidx.ui.text.style.TextIndent? getTextIndent();
-    method public androidx.ui.text.TextStyle merge(androidx.ui.text.TextStyle? other = null);
-    method public androidx.ui.text.TextStyle merge(androidx.ui.text.SpanStyle other);
-    method public androidx.ui.text.TextStyle merge(androidx.ui.text.ParagraphStyle other);
-    method public androidx.ui.text.ParagraphStyle toParagraphStyle();
-    method public androidx.ui.text.SpanStyle toSpanStyle();
-    field public static final androidx.ui.text.TextStyle.Companion! Companion;
-  }
-
-  public static final class TextStyle.Companion {
-    method public androidx.ui.text.TextStyle getDefault();
-    property public final androidx.ui.text.TextStyle Default;
-  }
-
-  public final class TextStyleKt {
-    method public static androidx.ui.text.TextStyle lerp(androidx.ui.text.TextStyle start, androidx.ui.text.TextStyle stop, float fraction);
-    method public static androidx.ui.text.TextStyle resolveDefaults(androidx.ui.text.TextStyle style, androidx.ui.core.LayoutDirection direction);
-  }
-
-  public interface Typeface {
-    method public androidx.ui.text.font.FontFamily getFontFamily();
-    property public abstract androidx.ui.text.font.FontFamily fontFamily;
-  }
-
-  public final class TypefaceKt {
-    method public static androidx.ui.text.Typeface typefaceFromFontFamily(android.content.Context context, androidx.ui.text.font.FontFamily fontFamily, java.util.List<? extends kotlin.Pair<androidx.ui.text.font.FontWeight,? extends androidx.ui.text.font.FontStyle>>? necessaryStyles = null);
+  public final class TextFieldDelegateKt {
   }
 
 }
 
-package androidx.ui.text.font {
+package androidx.ui.text.selection {
 
-  public abstract sealed class FileBasedFontFamily extends androidx.ui.text.font.FontFamily {
-  }
-
-  public interface Font {
-    method public androidx.ui.text.font.FontStyle getStyle();
-    method public androidx.ui.text.font.FontWeight getWeight();
-    property public abstract androidx.ui.text.font.FontStyle style;
-    property public abstract androidx.ui.text.font.FontWeight weight;
-  }
-
-  public static interface Font.ResourceLoader {
-    method public Object load(androidx.ui.text.font.Font font);
-  }
-
-  public abstract sealed class FontFamily {
-    method public final boolean getCanLoadSynchronously();
-    field public static final androidx.ui.text.font.FontFamily.Companion! Companion;
-  }
-
-  public static final class FontFamily.Companion {
-    method public androidx.ui.text.font.GenericFontFamily getCursive();
-    method public androidx.ui.text.font.SystemFontFamily getDefault();
-    method public androidx.ui.text.font.GenericFontFamily getMonospace();
-    method public androidx.ui.text.font.GenericFontFamily getSansSerif();
-    method public androidx.ui.text.font.GenericFontFamily getSerif();
-    property public final androidx.ui.text.font.GenericFontFamily Cursive;
-    property public final androidx.ui.text.font.SystemFontFamily Default;
-    property public final androidx.ui.text.font.GenericFontFamily Monospace;
-    property public final androidx.ui.text.font.GenericFontFamily SansSerif;
-    property public final androidx.ui.text.font.GenericFontFamily Serif;
-  }
-
-  public final class FontFamilyKt {
-    method public static androidx.ui.text.font.FontListFontFamily fontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
-    method public static androidx.ui.text.font.FontListFontFamily fontFamily(androidx.ui.text.font.Font... fonts);
-    method public static androidx.ui.text.font.LoadedFontFamily fontFamily(androidx.ui.text.Typeface typeface);
-  }
-
-  public final class FontKt {
-    method public static androidx.ui.text.font.FontListFontFamily asFontFamily(androidx.ui.text.font.Font);
-    method public static androidx.ui.text.font.Font font(int resId, androidx.ui.text.font.FontWeight weight = FontWeight.Normal, androidx.ui.text.font.FontStyle style = androidx.ui.text.font.FontStyle.Normal);
-  }
-
-  public final class FontListFontFamily extends androidx.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.ui.text.font.Font> {
-    ctor public FontListFontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
-    method public java.util.List<androidx.ui.text.font.Font> component1();
-    method public boolean contains(androidx.ui.text.font.Font element);
-    method public boolean containsAll(java.util.Collection<?> elements);
-    method public androidx.ui.text.font.FontListFontFamily copy(java.util.List<? extends androidx.ui.text.font.Font> fonts);
-    method public androidx.ui.text.font.Font get(int index);
-    method public java.util.List<androidx.ui.text.font.Font> getFonts();
-    method public int getSize();
-    method public int indexOf(androidx.ui.text.font.Font element);
-    method public boolean isEmpty();
-    method public java.util.Iterator<androidx.ui.text.font.Font> iterator();
-    method public int lastIndexOf(androidx.ui.text.font.Font element);
-    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator();
-    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator(int index);
-    method public java.util.List<androidx.ui.text.font.Font> subList(int fromIndex, int toIndex);
-  }
-
-  public enum FontStyle {
-    enum_constant public static final androidx.ui.text.font.FontStyle Italic;
-    enum_constant public static final androidx.ui.text.font.FontStyle Normal;
-  }
-
-  public enum FontSynthesis {
-    enum_constant public static final androidx.ui.text.font.FontSynthesis All;
-    enum_constant public static final androidx.ui.text.font.FontSynthesis None;
-    enum_constant public static final androidx.ui.text.font.FontSynthesis Style;
-    enum_constant public static final androidx.ui.text.font.FontSynthesis Weight;
-  }
-
-  public final class FontWeight implements java.lang.Comparable<androidx.ui.text.font.FontWeight> {
-    method public int compareTo(androidx.ui.text.font.FontWeight other);
-    method public androidx.ui.text.font.FontWeight copy(int weight);
-    field public static final androidx.ui.text.font.FontWeight.Companion! Companion;
-  }
-
-  public static final class FontWeight.Companion {
-    method public androidx.ui.text.font.FontWeight getBlack();
-    method public androidx.ui.text.font.FontWeight getBold();
-    method public androidx.ui.text.font.FontWeight getExtraBold();
-    method public androidx.ui.text.font.FontWeight getExtraLight();
-    method public androidx.ui.text.font.FontWeight getLight();
-    method public androidx.ui.text.font.FontWeight getMedium();
-    method public androidx.ui.text.font.FontWeight getNormal();
-    method public androidx.ui.text.font.FontWeight getSemiBold();
-    method public androidx.ui.text.font.FontWeight getThin();
-    method public androidx.ui.text.font.FontWeight getW100();
-    method public androidx.ui.text.font.FontWeight getW200();
-    method public androidx.ui.text.font.FontWeight getW300();
-    method public androidx.ui.text.font.FontWeight getW400();
-    method public androidx.ui.text.font.FontWeight getW500();
-    method public androidx.ui.text.font.FontWeight getW600();
-    method public androidx.ui.text.font.FontWeight getW700();
-    method public androidx.ui.text.font.FontWeight getW800();
-    method public androidx.ui.text.font.FontWeight getW900();
-    property public final androidx.ui.text.font.FontWeight Black;
-    property public final androidx.ui.text.font.FontWeight Bold;
-    property public final androidx.ui.text.font.FontWeight ExtraBold;
-    property public final androidx.ui.text.font.FontWeight ExtraLight;
-    property public final androidx.ui.text.font.FontWeight Light;
-    property public final androidx.ui.text.font.FontWeight Medium;
-    property public final androidx.ui.text.font.FontWeight Normal;
-    property public final androidx.ui.text.font.FontWeight SemiBold;
-    property public final androidx.ui.text.font.FontWeight Thin;
-    property public final androidx.ui.text.font.FontWeight W100;
-    property public final androidx.ui.text.font.FontWeight W200;
-    property public final androidx.ui.text.font.FontWeight W300;
-    property public final androidx.ui.text.font.FontWeight W400;
-    property public final androidx.ui.text.font.FontWeight W500;
-    property public final androidx.ui.text.font.FontWeight W600;
-    property public final androidx.ui.text.font.FontWeight W700;
-    property public final androidx.ui.text.font.FontWeight W800;
-    property public final androidx.ui.text.font.FontWeight W900;
-  }
-
-  public final class FontWeightKt {
-    method public static androidx.ui.text.font.FontWeight lerp(androidx.ui.text.font.FontWeight start, androidx.ui.text.font.FontWeight stop, float fraction);
-  }
-
-  public final class GenericFontFamily extends androidx.ui.text.font.SystemFontFamily {
-    method public String getName();
-  }
-
-  public final class LoadedFontFamily extends androidx.ui.text.font.FontFamily {
-    ctor public LoadedFontFamily(androidx.ui.text.Typeface typeface);
-    method public androidx.ui.text.Typeface component1();
-    method public androidx.ui.text.font.LoadedFontFamily copy(androidx.ui.text.Typeface typeface);
-    method public androidx.ui.text.Typeface getTypeface();
-  }
-
-  public final class ResourceFont implements androidx.ui.text.font.Font {
-    ctor public ResourceFont(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
-    method public int component1();
-    method public androidx.ui.text.font.FontWeight component2();
-    method public androidx.ui.text.font.FontStyle component3();
-    method public androidx.ui.text.font.ResourceFont copy(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
-    method public int getResId();
-    method public androidx.ui.text.font.FontStyle getStyle();
-    method public androidx.ui.text.font.FontWeight getWeight();
-  }
-
-  public abstract sealed class SystemFontFamily extends androidx.ui.text.font.FontFamily {
-  }
-
-}
-
-package androidx.ui.text.platform {
-
-  public final class AndroidParagraphHelperKt {
-  }
-
-  public final class AndroidParagraphKt {
-  }
-
-  public final class PlatformLocaleKt {
-  }
-
-}
-
-package androidx.ui.text.style {
-
-  public final class BaselineShift {
-    ctor public BaselineShift(float multiplier);
-    method public float component1();
-    method public androidx.ui.text.style.BaselineShift copy(float multiplier);
-    method public float getMultiplier();
-    field public static final androidx.ui.text.style.BaselineShift.Companion! Companion;
-  }
-
-  public static final class BaselineShift.Companion {
-    method public androidx.ui.text.style.BaselineShift getNone();
-    method public androidx.ui.text.style.BaselineShift getSubscript();
-    method public androidx.ui.text.style.BaselineShift getSuperscript();
-    property public final androidx.ui.text.style.BaselineShift None;
-    property public final androidx.ui.text.style.BaselineShift Subscript;
-    property public final androidx.ui.text.style.BaselineShift Superscript;
-  }
-
-  public final class BaselineShiftKt {
-    method public static androidx.ui.text.style.BaselineShift lerp(androidx.ui.text.style.BaselineShift start, androidx.ui.text.style.BaselineShift stop, float fraction);
-  }
-
-  public enum TextAlign {
-    enum_constant public static final androidx.ui.text.style.TextAlign Center;
-    enum_constant public static final androidx.ui.text.style.TextAlign End;
-    enum_constant public static final androidx.ui.text.style.TextAlign Justify;
-    enum_constant public static final androidx.ui.text.style.TextAlign Left;
-    enum_constant public static final androidx.ui.text.style.TextAlign Right;
-    enum_constant public static final androidx.ui.text.style.TextAlign Start;
-  }
-
-  public final class TextDecoration {
-    method public int component1();
-    method public boolean contains(androidx.ui.text.style.TextDecoration other);
-    method public androidx.ui.text.style.TextDecoration copy(int mask);
-    method public int getMask();
-    field public static final androidx.ui.text.style.TextDecoration.Companion! Companion;
-  }
-
-  public static final class TextDecoration.Companion {
-    method public androidx.ui.text.style.TextDecoration combine(java.util.List<androidx.ui.text.style.TextDecoration> decorations);
-    method public androidx.ui.text.style.TextDecoration getLineThrough();
-    method public androidx.ui.text.style.TextDecoration getNone();
-    method public androidx.ui.text.style.TextDecoration getUnderline();
-    property public final androidx.ui.text.style.TextDecoration LineThrough;
-    property public final androidx.ui.text.style.TextDecoration None;
-    property public final androidx.ui.text.style.TextDecoration Underline;
-  }
-
-  public enum TextDirection {
-    enum_constant public static final androidx.ui.text.style.TextDirection Ltr;
-    enum_constant public static final androidx.ui.text.style.TextDirection Rtl;
-  }
-
-  public enum TextDirectionAlgorithm {
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrLtr;
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrRtl;
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceLtr;
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceRtl;
-  }
-
-  public final class TextGeometricTransform {
-    ctor public TextGeometricTransform(float scaleX, float skewX);
-    ctor public TextGeometricTransform();
-    method public float component1();
-    method public float component2();
-    method public androidx.ui.text.style.TextGeometricTransform copy(float scaleX, float skewX);
-    method public float getScaleX();
-    method public float getSkewX();
-    field public static final androidx.ui.text.style.TextGeometricTransform.Companion! Companion;
-  }
-
-  public static final class TextGeometricTransform.Companion {
-  }
-
-  public final class TextGeometricTransformKt {
-    method public static androidx.ui.text.style.TextGeometricTransform lerp(androidx.ui.text.style.TextGeometricTransform start, androidx.ui.text.style.TextGeometricTransform stop, float fraction);
-  }
-
-  public final class TextIndent {
-    ctor public TextIndent(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
-    ctor public TextIndent();
-    method public androidx.ui.unit.TextUnit component1();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.style.TextIndent copy(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
-    method public androidx.ui.unit.TextUnit getFirstLine();
-    method public androidx.ui.unit.TextUnit getRestLine();
-    field public static final androidx.ui.text.style.TextIndent.Companion! Companion;
-  }
-
-  public static final class TextIndent.Companion {
-    method public androidx.ui.text.style.TextIndent getNone();
-    property public final androidx.ui.text.style.TextIndent None;
-  }
-
-  public final class TextIndentKt {
-    method public static androidx.ui.text.style.TextIndent lerp(androidx.ui.text.style.TextIndent start, androidx.ui.text.style.TextIndent stop, float fraction);
-  }
-
-  public enum TextOverflow {
-    enum_constant public static final androidx.ui.text.style.TextOverflow Clip;
-    enum_constant public static final androidx.ui.text.style.TextOverflow Ellipsis;
+  public final class TextSelectionDelegateKt {
   }
 
 }
diff --git a/ui/ui-text/api/public_plus_experimental_current.txt b/ui/ui-text/api/public_plus_experimental_current.txt
index 1df7e9d0..906a58c 100644
--- a/ui/ui-text/api/public_plus_experimental_current.txt
+++ b/ui/ui-text/api/public_plus_experimental_current.txt
@@ -1,925 +1,24 @@
 // Signature format: 3.0
-package androidx.ui.input {
-
-  public final class BackspaceKeyEditOp implements androidx.ui.input.EditOperation {
-    ctor public BackspaceKeyEditOp();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class CommitTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public CommitTextEditOp(String text, int newCursorPosition);
-    method public String component1();
-    method public int component2();
-    method public androidx.ui.input.CommitTextEditOp copy(String text, int newCursorPosition);
-    method public int getNewCursorPosition();
-    method public String getText();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class DeleteSurroundingTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public DeleteSurroundingTextEditOp(int beforeLength, int afterLength);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.DeleteSurroundingTextEditOp copy(int beforeLength, int afterLength);
-    method public int getAfterLength();
-    method public int getBeforeLength();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class DeleteSurroundingTextInCodePointsEditOp implements androidx.ui.input.EditOperation {
-    ctor public DeleteSurroundingTextInCodePointsEditOp(int beforeLength, int afterLength);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.DeleteSurroundingTextInCodePointsEditOp copy(int beforeLength, int afterLength);
-    method public int getAfterLength();
-    method public int getBeforeLength();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public interface EditOperation {
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class EditingBuffer {
-    ctor public EditingBuffer(String initialText, androidx.ui.text.TextRange initialSelection);
-    field public static final int NOWHERE = -1; // 0xffffffff
-  }
-
-  public final class EditorValue {
-    ctor public EditorValue(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
-    ctor public EditorValue();
-    method public String component1();
-    method public androidx.ui.text.TextRange component2();
-    method public androidx.ui.text.TextRange? component3();
-    method public androidx.ui.input.EditorValue copy(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
-    method public androidx.ui.text.TextRange? getComposition();
-    method public String getSelectedText();
-    method public androidx.ui.text.TextRange getSelection();
-    method public String getText();
-    method public String getTextAfterSelection(int maxChars);
-    method public String getTextBeforeSelection(int maxChars);
-  }
-
-  public final class FinishComposingTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public FinishComposingTextEditOp();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public enum ImeAction {
-    enum_constant public static final androidx.ui.input.ImeAction Done;
-    enum_constant public static final androidx.ui.input.ImeAction Go;
-    enum_constant public static final androidx.ui.input.ImeAction Next;
-    enum_constant public static final androidx.ui.input.ImeAction NoAction;
-    enum_constant public static final androidx.ui.input.ImeAction Previous;
-    enum_constant public static final androidx.ui.input.ImeAction Search;
-    enum_constant public static final androidx.ui.input.ImeAction Send;
-    enum_constant public static final androidx.ui.input.ImeAction Unspecified;
-  }
-
-  public interface InputEventListener {
-    method public void onEditOperations(java.util.List<? extends androidx.ui.input.EditOperation> editOps);
-    method public void onImeAction(androidx.ui.input.ImeAction imeAction);
-  }
-
-  public enum KeyboardType {
-    enum_constant public static final androidx.ui.input.KeyboardType Ascii;
-    enum_constant public static final androidx.ui.input.KeyboardType Email;
-    enum_constant public static final androidx.ui.input.KeyboardType Number;
-    enum_constant public static final androidx.ui.input.KeyboardType NumberPassword;
-    enum_constant public static final androidx.ui.input.KeyboardType Password;
-    enum_constant public static final androidx.ui.input.KeyboardType Phone;
-    enum_constant public static final androidx.ui.input.KeyboardType Text;
-    enum_constant public static final androidx.ui.input.KeyboardType Uri;
-  }
-
-  public final class MoveCursorEditOp implements androidx.ui.input.EditOperation {
-    ctor public MoveCursorEditOp(int amount);
-    method public int component1();
-    method public androidx.ui.input.MoveCursorEditOp copy(int amount);
-    method public int getAmount();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public interface OffsetMap {
-    method public int originalToTransformed(int offset);
-    method public int transformedToOriginal(int offset);
-    field public static final androidx.ui.input.OffsetMap.Companion! Companion;
-  }
-
-  public static final class OffsetMap.Companion {
-    method public androidx.ui.input.OffsetMap getIdentityOffsetMap();
-    property public final androidx.ui.input.OffsetMap identityOffsetMap;
-  }
-
-  public final class PasswordVisualTransformation implements androidx.ui.input.VisualTransformation {
-    ctor public PasswordVisualTransformation(char mask);
-    ctor public PasswordVisualTransformation();
-    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
-    method public char getMask();
-  }
-
-  public interface PlatformTextInputService {
-    method public void hideSoftwareKeyboard();
-    method public void notifyFocusedRect(androidx.ui.geometry.Rect rect);
-    method public void onStateUpdated(androidx.ui.input.EditorValue model);
-    method public void showSoftwareKeyboard();
-    method public void startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
-    method public void stopInput();
-  }
-
-  public final class SetComposingRegionEditOp implements androidx.ui.input.EditOperation {
-    ctor public SetComposingRegionEditOp(int start, int end);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.SetComposingRegionEditOp copy(int start, int end);
-    method public int getEnd();
-    method public int getStart();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class SetComposingTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public SetComposingTextEditOp(String text, int newCursorPosition);
-    method public String component1();
-    method public int component2();
-    method public androidx.ui.input.SetComposingTextEditOp copy(String text, int newCursorPosition);
-    method public int getNewCursorPosition();
-    method public String getText();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class SetSelectionEditOp implements androidx.ui.input.EditOperation {
-    ctor public SetSelectionEditOp(int start, int end);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.SetSelectionEditOp copy(int start, int end);
-    method public int getEnd();
-    method public int getStart();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public class TextInputService {
-    ctor public TextInputService(androidx.ui.input.PlatformTextInputService platformTextInputService);
-    method public void hideSoftwareKeyboard(int token);
-    method public void notifyFocusedRect(int token, androidx.ui.geometry.Rect rect);
-    method public void onStateUpdated(int token, androidx.ui.input.EditorValue model);
-    method public void showSoftwareKeyboard(int token);
-    method public int startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
-    method public void stopInput(int token);
-  }
-
-  public final class TextInputServiceKt {
-    field public static final int INVALID_SESSION = -1; // 0xffffffff
-    field public static final int NO_SESSION = 0; // 0x0
-  }
-
-  public final class TransformedText {
-    ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
-    method public androidx.ui.text.AnnotatedString component1();
-    method public androidx.ui.input.OffsetMap component2();
-    method public androidx.ui.input.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
-    method public androidx.ui.input.OffsetMap getOffsetMap();
-    method public androidx.ui.text.AnnotatedString getTransformedText();
-  }
-
-  public interface VisualTransformation {
-    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
-  }
-
-}
-
 package androidx.ui.text {
 
-  public final class AnnotatedString {
-    ctor public AnnotatedString(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles);
-    method public String component1();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> component2();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> component3();
-    method public androidx.ui.text.AnnotatedString copy(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> annotations);
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> getParagraphStyles();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> getSpanStyles();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> getStringAnnotations(String scope, int start, int end);
-    method public String getText();
-    method public operator androidx.ui.text.AnnotatedString plus(androidx.ui.text.AnnotatedString other);
+  public final class CoreTextFieldKt {
+    method public static void CoreTextField(androidx.ui.input.EditorValue value, androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = TextStyle.Default, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
   }
 
-  public static final class AnnotatedString.Builder {
-    ctor public AnnotatedString.Builder(int capacity);
-    ctor public AnnotatedString.Builder();
-    ctor public AnnotatedString.Builder(String text);
-    ctor public AnnotatedString.Builder(androidx.ui.text.AnnotatedString text);
-    method public void addAnnotationString(String scope, String annotation, int start, int end);
-    method public void addStyle(androidx.ui.text.SpanStyle style, int start, int end);
-    method public void addStyle(androidx.ui.text.ParagraphStyle style, int start, int end);
-    method public void append(String text);
-    method public void append(char p);
-    method public void append(androidx.ui.text.AnnotatedString text);
-    method public int getLength();
-    method public void pop();
-    method public void pop(int index);
-    method public int pushStringAnnotation(String scope, String annotation);
-    method public int pushStyle(androidx.ui.text.SpanStyle style);
-    method public int pushStyle(androidx.ui.text.ParagraphStyle style);
-    method public androidx.ui.text.AnnotatedString toAnnotatedString();
-    property public final int length;
+  public final class CoreTextKt {
+    method public static void CoreText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, int maxLines, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout);
+    method public static androidx.ui.core.HorizontalAlignmentLine getFirstBaseline();
+    method public static androidx.ui.core.HorizontalAlignmentLine getLastBaseline();
   }
 
-  public static final class AnnotatedString.Item<T> {
-    ctor public AnnotatedString.Item(T! item, int start, int end, String scope);
-    ctor public AnnotatedString.Item(T! item, int start, int end);
-    method public T! component1();
-    method public int component2();
-    method public int component3();
-    method public String component4();
-    method public androidx.ui.text.AnnotatedString.Item<T> copy(T! item, int start, int end, String scope);
-    method public int getEnd();
-    method public T! getItem();
-    method public String getScope();
-    method public int getStart();
-  }
-
-  public final class AnnotatedStringKt {
-    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.SpanStyle spanStyle, androidx.ui.text.ParagraphStyle? paragraphStyle = null);
-    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.ParagraphStyle paragraphStyle);
-    method public static inline androidx.ui.text.AnnotatedString AnnotatedString(kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
-    method public static androidx.ui.text.AnnotatedString capitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static androidx.ui.text.AnnotatedString decapitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static int getLength(androidx.ui.text.AnnotatedString);
-    method public static androidx.ui.text.AnnotatedString subSequence(androidx.ui.text.AnnotatedString, int start, int end);
-    method public static androidx.ui.text.AnnotatedString toLowerCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static androidx.ui.text.AnnotatedString toUpperCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
-    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
-  }
-
-  public final class Locale {
-    ctor public Locale(String languageTag);
-    method public String getLanguage();
-    method public String getRegion();
-    method public String getScript();
-    method public String toLanguageTag();
-    property public final String language;
-    property public final String region;
-    property public final String script;
-    field public static final androidx.ui.text.Locale.Companion! Companion;
-  }
-
-  public static final class Locale.Companion {
-    method public androidx.ui.text.Locale getCurrent();
-    property public final androidx.ui.text.Locale current;
-  }
-
-  public final class LocaleList implements java.util.Collection<androidx.ui.text.Locale> kotlin.jvm.internal.markers.KMappedMarker {
-    ctor public LocaleList(java.util.List<androidx.ui.text.Locale> localeList);
-    ctor public LocaleList(String languageTags);
-    ctor public LocaleList(androidx.ui.text.Locale... locales);
-    method public java.util.List<androidx.ui.text.Locale> component1();
-    method public operator boolean contains(androidx.ui.text.Locale element);
-    method public boolean containsAll(java.util.Collection<?> elements);
-    method public androidx.ui.text.LocaleList copy(java.util.List<androidx.ui.text.Locale> localeList);
-    method public operator androidx.ui.text.Locale get(int i);
-    method public java.util.List<androidx.ui.text.Locale> getLocaleList();
-    method public int getSize();
-    method public boolean isEmpty();
-    method public java.util.Iterator<androidx.ui.text.Locale> iterator();
-    property public int size;
-    field public static final androidx.ui.text.LocaleList.Companion! Companion;
-  }
-
-  public static final class LocaleList.Companion {
-    method public androidx.ui.text.LocaleList getCurrent();
-    property public final androidx.ui.text.LocaleList current;
-  }
-
-  public final class MultiParagraph {
-    ctor public MultiParagraph(androidx.ui.text.MultiParagraphIntrinsics intrinsics, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints);
-    ctor public MultiParagraph(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
-    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
-    method public androidx.ui.geometry.Rect getCursorRect(int offset);
-    method public boolean getDidExceedMaxLines();
-    method public float getFirstBaseline();
-    method public float getHeight();
-    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
-    method public androidx.ui.text.MultiParagraphIntrinsics getIntrinsics();
-    method public float getLastBaseline();
-    method public float getLineBottom(int lineIndex);
-    method public int getLineCount();
-    method public int getLineForOffset(int offset);
-    method public float getLineHeight(int lineIndex);
-    method public float getLineLeft(int lineIndex);
-    method public float getLineRight(int lineIndex);
-    method public float getLineTop(int lineIndex);
-    method public float getLineWidth(int lineIndex);
-    method public float getMaxIntrinsicWidth();
-    method public int getMaxLines();
-    method public float getMinIntrinsicWidth();
-    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
-    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
-    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
-    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
-    method public float getWidth();
-    method public androidx.ui.text.TextRange getWordBoundary(int offset);
-    method public void paint(androidx.ui.graphics.Canvas canvas);
-    property public final boolean didExceedMaxLines;
-    property public final float firstBaseline;
-    property public final float height;
-    property public final float lastBaseline;
-    property public final int lineCount;
-    property public final float maxIntrinsicWidth;
-    property public final float minIntrinsicWidth;
-    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
-    property public final float width;
-  }
-
-  public final class MultiParagraphIntrinsics implements androidx.ui.text.ParagraphIntrinsics {
-    ctor public MultiParagraphIntrinsics(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-    method public androidx.ui.text.AnnotatedString getAnnotatedString();
-    method public float getMaxIntrinsicWidth();
-    method public float getMinIntrinsicWidth();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
-    property public float maxIntrinsicWidth;
-    property public float minIntrinsicWidth;
-  }
-
-  public final class MultiParagraphIntrinsicsKt {
-  }
-
-  public final class MultiParagraphKt {
-  }
-
-  public interface Paragraph {
-    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
-    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
-    method public androidx.ui.geometry.Rect getCursorRect(int offset);
-    method public boolean getDidExceedMaxLines();
-    method public float getFirstBaseline();
-    method public float getHeight();
-    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
-    method public float getLastBaseline();
-    method public float getLineBottom(int lineIndex);
-    method public int getLineCount();
-    method public int getLineForOffset(int offset);
-    method public float getLineHeight(int lineIndex);
-    method public float getLineLeft(int lineIndex);
-    method public float getLineRight(int lineIndex);
-    method public float getLineTop(int lineIndex);
-    method public float getLineWidth(int lineIndex);
-    method public float getMaxIntrinsicWidth();
-    method public float getMinIntrinsicWidth();
-    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
-    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
-    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
-    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
-    method public float getWidth();
-    method public androidx.ui.text.TextRange getWordBoundary(int offset);
-    method public void paint(androidx.ui.graphics.Canvas canvas);
-    property public abstract boolean didExceedMaxLines;
-    property public abstract float firstBaseline;
-    property public abstract float height;
-    property public abstract float lastBaseline;
-    property public abstract int lineCount;
-    property public abstract float maxIntrinsicWidth;
-    property public abstract float minIntrinsicWidth;
-    property public abstract java.util.List<androidx.ui.geometry.Rect> placeholderRects;
-    property public abstract float width;
-  }
-
-  public final class ParagraphConstraints {
-    ctor public ParagraphConstraints(float width);
-    method public float component1();
-    method public androidx.ui.text.ParagraphConstraints copy(float width);
-    method public float getWidth();
-  }
-
-  public interface ParagraphIntrinsics {
-    method public float getMaxIntrinsicWidth();
-    method public float getMinIntrinsicWidth();
-    property public abstract float maxIntrinsicWidth;
-    property public abstract float minIntrinsicWidth;
-  }
-
-  public final class ParagraphIntrinsicsKt {
-    method public static androidx.ui.text.ParagraphIntrinsics ParagraphIntrinsics(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-  }
-
-  public final class ParagraphKt {
-    method public static androidx.ui.text.Paragraph Paragraph(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-    method public static androidx.ui.text.Paragraph Paragraph(androidx.ui.text.ParagraphIntrinsics paragraphIntrinsics, int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints);
-  }
-
-  public final class ParagraphStyle {
-    ctor public ParagraphStyle(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    ctor public ParagraphStyle();
-    method public androidx.ui.text.style.TextAlign? component1();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? component2();
-    method public androidx.ui.unit.TextUnit component3();
-    method public androidx.ui.text.style.TextIndent? component4();
-    method public androidx.ui.text.ParagraphStyle copy(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    method public androidx.ui.unit.TextUnit getLineHeight();
-    method public androidx.ui.text.style.TextAlign? getTextAlign();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
-    method public androidx.ui.text.style.TextIndent? getTextIndent();
-    method public androidx.ui.text.ParagraphStyle merge(androidx.ui.text.ParagraphStyle? other = null);
-  }
-
-  public final class ParagraphStyleKt {
-    method public static androidx.ui.text.ParagraphStyle lerp(androidx.ui.text.ParagraphStyle start, androidx.ui.text.ParagraphStyle stop, float fraction);
-  }
-
-  public final class Placeholder {
-    ctor public Placeholder(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
-    method public androidx.ui.unit.TextUnit component1();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.PlaceholderVerticalAlign component3();
-    method public androidx.ui.text.Placeholder copy(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
-    method public androidx.ui.unit.TextUnit getHeight();
-    method public androidx.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
-    method public androidx.ui.unit.TextUnit getWidth();
-  }
-
-  public enum PlaceholderVerticalAlign {
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign AboveBaseline;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Bottom;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Center;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextBottom;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextCenter;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextTop;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Top;
-  }
-
-  public final class SpanStyle {
-    ctor public SpanStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
-    ctor public SpanStyle();
-    method public androidx.ui.graphics.Color? component1();
-    method public androidx.ui.text.style.TextGeometricTransform? component10();
-    method public androidx.ui.text.LocaleList? component11();
-    method public androidx.ui.graphics.Color? component12();
-    method public androidx.ui.text.style.TextDecoration? component13();
-    method public androidx.ui.graphics.Shadow? component14();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.font.FontWeight? component3();
-    method public androidx.ui.text.font.FontStyle? component4();
-    method public androidx.ui.text.font.FontSynthesis? component5();
-    method public androidx.ui.text.font.FontFamily? component6();
-    method public String? component7();
-    method public androidx.ui.unit.TextUnit component8();
-    method public androidx.ui.text.style.BaselineShift? component9();
-    method public androidx.ui.text.SpanStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
-    method public androidx.ui.graphics.Color? getBackground();
-    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
-    method public androidx.ui.graphics.Color? getColor();
-    method public androidx.ui.text.font.FontFamily? getFontFamily();
-    method public String? getFontFeatureSettings();
-    method public androidx.ui.unit.TextUnit getFontSize();
-    method public androidx.ui.text.font.FontStyle? getFontStyle();
-    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
-    method public androidx.ui.text.font.FontWeight? getFontWeight();
-    method public androidx.ui.unit.TextUnit getLetterSpacing();
-    method public androidx.ui.text.LocaleList? getLocaleList();
-    method public androidx.ui.graphics.Shadow? getShadow();
-    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
-    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
-    method public androidx.ui.text.SpanStyle merge(androidx.ui.text.SpanStyle? other = null);
-  }
-
-  public final class SpanStyleKt {
-    method public static androidx.ui.text.SpanStyle lerp(androidx.ui.text.SpanStyle start, androidx.ui.text.SpanStyle stop, float fraction);
-  }
-
-  public final class StringKt {
-    method public static String capitalize(String, androidx.ui.text.Locale locale);
-    method public static String capitalize(String, androidx.ui.text.LocaleList localeList);
-    method public static String decapitalize(String, androidx.ui.text.Locale locale);
-    method public static String decapitalize(String, androidx.ui.text.LocaleList localeList);
-    method public static String toLowerCase(String, androidx.ui.text.Locale locale);
-    method public static String toLowerCase(String, androidx.ui.text.LocaleList localeList);
-    method public static String toUpperCase(String, androidx.ui.text.Locale locale);
-    method public static String toUpperCase(String, androidx.ui.text.LocaleList localeList);
-  }
-
-  public final class TextLayoutHelperKt {
-  }
-
-  public final class TextLayoutInput {
-    ctor public TextLayoutInput(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
-    method public androidx.ui.text.AnnotatedString component1();
-    method public androidx.ui.core.Constraints component10();
-    method public androidx.ui.text.TextStyle component2();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> component3();
-    method public int component4();
-    method public boolean component5();
-    method public androidx.ui.text.style.TextOverflow component6();
-    method public androidx.ui.unit.Density component7();
-    method public androidx.ui.core.LayoutDirection component8();
-    method public androidx.ui.text.font.Font.ResourceLoader component9();
-    method public androidx.ui.text.TextLayoutInput copy(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
-    method public androidx.ui.core.Constraints getConstraints();
-    method public androidx.ui.unit.Density getDensity();
-    method public androidx.ui.core.LayoutDirection getLayoutDirection();
-    method public int getMaxLines();
-    method public androidx.ui.text.style.TextOverflow getOverflow();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
-    method public androidx.ui.text.font.Font.ResourceLoader getResourceLoader();
-    method public boolean getSoftWrap();
-    method public androidx.ui.text.TextStyle getStyle();
-    method public androidx.ui.text.AnnotatedString getText();
-  }
-
-  public final class TextLayoutResult {
-    method public androidx.ui.text.TextLayoutInput component1();
-    method public androidx.ui.unit.IntPxSize component3();
-    method public androidx.ui.text.TextLayoutResult copy(androidx.ui.text.TextLayoutInput layoutInput, androidx.ui.text.MultiParagraph multiParagraph, androidx.ui.unit.IntPxSize size);
-    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
-    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
-    method public androidx.ui.geometry.Rect getCursorRect(int offset);
-    method public boolean getDidOverflowHeight();
-    method public boolean getDidOverflowWidth();
-    method public androidx.ui.unit.Px getFirstBaseline();
-    method public boolean getHasVisualOverflow();
-    method public androidx.ui.unit.Px getHorizontalPosition(int offset, boolean usePrimaryDirection);
-    method public androidx.ui.unit.Px getLastBaseline();
-    method public androidx.ui.text.TextLayoutInput getLayoutInput();
-    method public androidx.ui.unit.Px getLineBottom(int lineIndex);
-    method public int getLineForOffset(int offset);
-    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
-    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
-    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
-    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
-    method public androidx.ui.unit.IntPxSize getSize();
-    method public androidx.ui.text.TextRange getWordBoundary(int offset);
-    property public final boolean didOverflowHeight;
-    property public final boolean didOverflowWidth;
-    property public final androidx.ui.unit.Px firstBaseline;
-    property public final boolean hasVisualOverflow;
-    property public final androidx.ui.unit.Px lastBaseline;
-    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
-  }
-
-  public final class TextPainter {
-    method public void paint(androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
-    field public static final androidx.ui.text.TextPainter! INSTANCE;
-  }
-
-  public final class TextRange {
-    ctor public TextRange(int start, int end);
-    method public int component1();
-    method public int component2();
-    method public operator boolean contains(androidx.ui.text.TextRange other);
-    method public operator boolean contains(int offset);
-    method public androidx.ui.text.TextRange copy(int start, int end);
-    method public boolean getCollapsed();
-    method public int getEnd();
-    method public int getLength();
-    method public int getMax();
-    method public int getMin();
-    method public int getStart();
-    method public boolean intersects(androidx.ui.text.TextRange other);
-    property public final boolean collapsed;
-    property public final int length;
-    property public final int max;
-    property public final int min;
-  }
-
-  public final class TextRangeKt {
-    method public static String substring(CharSequence, androidx.ui.text.TextRange range);
-  }
-
-  public final class TextStyle {
-    ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    ctor public TextStyle();
-    method public androidx.ui.graphics.Color? component1();
-    method public androidx.ui.text.style.TextGeometricTransform? component10();
-    method public androidx.ui.text.LocaleList? component11();
-    method public androidx.ui.graphics.Color? component12();
-    method public androidx.ui.text.style.TextDecoration? component13();
-    method public androidx.ui.graphics.Shadow? component14();
-    method public androidx.ui.text.style.TextAlign? component15();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? component16();
-    method public androidx.ui.unit.TextUnit component17();
-    method public androidx.ui.text.style.TextIndent? component18();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.font.FontWeight? component3();
-    method public androidx.ui.text.font.FontStyle? component4();
-    method public androidx.ui.text.font.FontSynthesis? component5();
-    method public androidx.ui.text.font.FontFamily? component6();
-    method public String? component7();
-    method public androidx.ui.unit.TextUnit component8();
-    method public androidx.ui.text.style.BaselineShift? component9();
-    method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    method public androidx.ui.graphics.Color? getBackground();
-    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
-    method public androidx.ui.graphics.Color? getColor();
-    method public androidx.ui.text.font.FontFamily? getFontFamily();
-    method public String? getFontFeatureSettings();
-    method public androidx.ui.unit.TextUnit getFontSize();
-    method public androidx.ui.text.font.FontStyle? getFontStyle();
-    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
-    method public androidx.ui.text.font.FontWeight? getFontWeight();
-    method public androidx.ui.unit.TextUnit getLetterSpacing();
-    method public androidx.ui.unit.TextUnit getLineHeight();
-    method public androidx.ui.text.LocaleList? getLocaleList();
-    method public androidx.ui.graphics.Shadow? getShadow();
-    method public androidx.ui.text.style.TextAlign? getTextAlign();
-    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
-    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
-    method public androidx.ui.text.style.TextIndent? getTextIndent();
-    method public androidx.ui.text.TextStyle merge(androidx.ui.text.TextStyle? other = null);
-    method public androidx.ui.text.TextStyle merge(androidx.ui.text.SpanStyle other);
-    method public androidx.ui.text.TextStyle merge(androidx.ui.text.ParagraphStyle other);
-    method public androidx.ui.text.ParagraphStyle toParagraphStyle();
-    method public androidx.ui.text.SpanStyle toSpanStyle();
-    field public static final androidx.ui.text.TextStyle.Companion! Companion;
-  }
-
-  public static final class TextStyle.Companion {
-    method public androidx.ui.text.TextStyle getDefault();
-    property public final androidx.ui.text.TextStyle Default;
-  }
-
-  public final class TextStyleKt {
-    method public static androidx.ui.text.TextStyle lerp(androidx.ui.text.TextStyle start, androidx.ui.text.TextStyle stop, float fraction);
-    method public static androidx.ui.text.TextStyle resolveDefaults(androidx.ui.text.TextStyle style, androidx.ui.core.LayoutDirection direction);
-  }
-
-  public interface Typeface {
-    method public androidx.ui.text.font.FontFamily getFontFamily();
-    property public abstract androidx.ui.text.font.FontFamily fontFamily;
-  }
-
-  public final class TypefaceKt {
-    method public static androidx.ui.text.Typeface typefaceFromFontFamily(android.content.Context context, androidx.ui.text.font.FontFamily fontFamily, java.util.List<? extends kotlin.Pair<androidx.ui.text.font.FontWeight,? extends androidx.ui.text.font.FontStyle>>? necessaryStyles = null);
+  public final class TextFieldDelegateKt {
   }
 
 }
 
-package androidx.ui.text.font {
+package androidx.ui.text.selection {
 
-  public abstract sealed class FileBasedFontFamily extends androidx.ui.text.font.FontFamily {
-  }
-
-  public interface Font {
-    method public androidx.ui.text.font.FontStyle getStyle();
-    method public androidx.ui.text.font.FontWeight getWeight();
-    property public abstract androidx.ui.text.font.FontStyle style;
-    property public abstract androidx.ui.text.font.FontWeight weight;
-  }
-
-  public static interface Font.ResourceLoader {
-    method public Object load(androidx.ui.text.font.Font font);
-  }
-
-  public abstract sealed class FontFamily {
-    method public final boolean getCanLoadSynchronously();
-    field public static final androidx.ui.text.font.FontFamily.Companion! Companion;
-  }
-
-  public static final class FontFamily.Companion {
-    method public androidx.ui.text.font.GenericFontFamily getCursive();
-    method public androidx.ui.text.font.SystemFontFamily getDefault();
-    method public androidx.ui.text.font.GenericFontFamily getMonospace();
-    method public androidx.ui.text.font.GenericFontFamily getSansSerif();
-    method public androidx.ui.text.font.GenericFontFamily getSerif();
-    property public final androidx.ui.text.font.GenericFontFamily Cursive;
-    property public final androidx.ui.text.font.SystemFontFamily Default;
-    property public final androidx.ui.text.font.GenericFontFamily Monospace;
-    property public final androidx.ui.text.font.GenericFontFamily SansSerif;
-    property public final androidx.ui.text.font.GenericFontFamily Serif;
-  }
-
-  public final class FontFamilyKt {
-    method public static androidx.ui.text.font.FontListFontFamily fontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
-    method public static androidx.ui.text.font.FontListFontFamily fontFamily(androidx.ui.text.font.Font... fonts);
-    method public static androidx.ui.text.font.LoadedFontFamily fontFamily(androidx.ui.text.Typeface typeface);
-  }
-
-  public final class FontKt {
-    method public static androidx.ui.text.font.FontListFontFamily asFontFamily(androidx.ui.text.font.Font);
-    method public static androidx.ui.text.font.Font font(int resId, androidx.ui.text.font.FontWeight weight = FontWeight.Normal, androidx.ui.text.font.FontStyle style = androidx.ui.text.font.FontStyle.Normal);
-  }
-
-  public final class FontListFontFamily extends androidx.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.ui.text.font.Font> {
-    ctor public FontListFontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
-    method public java.util.List<androidx.ui.text.font.Font> component1();
-    method public boolean contains(androidx.ui.text.font.Font element);
-    method public boolean containsAll(java.util.Collection<?> elements);
-    method public androidx.ui.text.font.FontListFontFamily copy(java.util.List<? extends androidx.ui.text.font.Font> fonts);
-    method public androidx.ui.text.font.Font get(int index);
-    method public java.util.List<androidx.ui.text.font.Font> getFonts();
-    method public int getSize();
-    method public int indexOf(androidx.ui.text.font.Font element);
-    method public boolean isEmpty();
-    method public java.util.Iterator<androidx.ui.text.font.Font> iterator();
-    method public int lastIndexOf(androidx.ui.text.font.Font element);
-    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator();
-    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator(int index);
-    method public java.util.List<androidx.ui.text.font.Font> subList(int fromIndex, int toIndex);
-  }
-
-  public enum FontStyle {
-    enum_constant public static final androidx.ui.text.font.FontStyle Italic;
-    enum_constant public static final androidx.ui.text.font.FontStyle Normal;
-  }
-
-  public enum FontSynthesis {
-    enum_constant public static final androidx.ui.text.font.FontSynthesis All;
-    enum_constant public static final androidx.ui.text.font.FontSynthesis None;
-    enum_constant public static final androidx.ui.text.font.FontSynthesis Style;
-    enum_constant public static final androidx.ui.text.font.FontSynthesis Weight;
-  }
-
-  public final class FontWeight implements java.lang.Comparable<androidx.ui.text.font.FontWeight> {
-    method public int compareTo(androidx.ui.text.font.FontWeight other);
-    method public androidx.ui.text.font.FontWeight copy(int weight);
-    field public static final androidx.ui.text.font.FontWeight.Companion! Companion;
-  }
-
-  public static final class FontWeight.Companion {
-    method public androidx.ui.text.font.FontWeight getBlack();
-    method public androidx.ui.text.font.FontWeight getBold();
-    method public androidx.ui.text.font.FontWeight getExtraBold();
-    method public androidx.ui.text.font.FontWeight getExtraLight();
-    method public androidx.ui.text.font.FontWeight getLight();
-    method public androidx.ui.text.font.FontWeight getMedium();
-    method public androidx.ui.text.font.FontWeight getNormal();
-    method public androidx.ui.text.font.FontWeight getSemiBold();
-    method public androidx.ui.text.font.FontWeight getThin();
-    method public androidx.ui.text.font.FontWeight getW100();
-    method public androidx.ui.text.font.FontWeight getW200();
-    method public androidx.ui.text.font.FontWeight getW300();
-    method public androidx.ui.text.font.FontWeight getW400();
-    method public androidx.ui.text.font.FontWeight getW500();
-    method public androidx.ui.text.font.FontWeight getW600();
-    method public androidx.ui.text.font.FontWeight getW700();
-    method public androidx.ui.text.font.FontWeight getW800();
-    method public androidx.ui.text.font.FontWeight getW900();
-    property public final androidx.ui.text.font.FontWeight Black;
-    property public final androidx.ui.text.font.FontWeight Bold;
-    property public final androidx.ui.text.font.FontWeight ExtraBold;
-    property public final androidx.ui.text.font.FontWeight ExtraLight;
-    property public final androidx.ui.text.font.FontWeight Light;
-    property public final androidx.ui.text.font.FontWeight Medium;
-    property public final androidx.ui.text.font.FontWeight Normal;
-    property public final androidx.ui.text.font.FontWeight SemiBold;
-    property public final androidx.ui.text.font.FontWeight Thin;
-    property public final androidx.ui.text.font.FontWeight W100;
-    property public final androidx.ui.text.font.FontWeight W200;
-    property public final androidx.ui.text.font.FontWeight W300;
-    property public final androidx.ui.text.font.FontWeight W400;
-    property public final androidx.ui.text.font.FontWeight W500;
-    property public final androidx.ui.text.font.FontWeight W600;
-    property public final androidx.ui.text.font.FontWeight W700;
-    property public final androidx.ui.text.font.FontWeight W800;
-    property public final androidx.ui.text.font.FontWeight W900;
-  }
-
-  public final class FontWeightKt {
-    method public static androidx.ui.text.font.FontWeight lerp(androidx.ui.text.font.FontWeight start, androidx.ui.text.font.FontWeight stop, float fraction);
-  }
-
-  public final class GenericFontFamily extends androidx.ui.text.font.SystemFontFamily {
-    method public String getName();
-  }
-
-  public final class LoadedFontFamily extends androidx.ui.text.font.FontFamily {
-    ctor public LoadedFontFamily(androidx.ui.text.Typeface typeface);
-    method public androidx.ui.text.Typeface component1();
-    method public androidx.ui.text.font.LoadedFontFamily copy(androidx.ui.text.Typeface typeface);
-    method public androidx.ui.text.Typeface getTypeface();
-  }
-
-  public final class ResourceFont implements androidx.ui.text.font.Font {
-    ctor public ResourceFont(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
-    method public int component1();
-    method public androidx.ui.text.font.FontWeight component2();
-    method public androidx.ui.text.font.FontStyle component3();
-    method public androidx.ui.text.font.ResourceFont copy(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
-    method public int getResId();
-    method public androidx.ui.text.font.FontStyle getStyle();
-    method public androidx.ui.text.font.FontWeight getWeight();
-  }
-
-  public abstract sealed class SystemFontFamily extends androidx.ui.text.font.FontFamily {
-  }
-
-}
-
-package androidx.ui.text.platform {
-
-  public final class AndroidParagraphHelperKt {
-  }
-
-  public final class AndroidParagraphKt {
-  }
-
-  public final class PlatformLocaleKt {
-  }
-
-}
-
-package androidx.ui.text.style {
-
-  public final class BaselineShift {
-    ctor public BaselineShift(float multiplier);
-    method public float component1();
-    method public androidx.ui.text.style.BaselineShift copy(float multiplier);
-    method public float getMultiplier();
-    field public static final androidx.ui.text.style.BaselineShift.Companion! Companion;
-  }
-
-  public static final class BaselineShift.Companion {
-    method public androidx.ui.text.style.BaselineShift getNone();
-    method public androidx.ui.text.style.BaselineShift getSubscript();
-    method public androidx.ui.text.style.BaselineShift getSuperscript();
-    property public final androidx.ui.text.style.BaselineShift None;
-    property public final androidx.ui.text.style.BaselineShift Subscript;
-    property public final androidx.ui.text.style.BaselineShift Superscript;
-  }
-
-  public final class BaselineShiftKt {
-    method public static androidx.ui.text.style.BaselineShift lerp(androidx.ui.text.style.BaselineShift start, androidx.ui.text.style.BaselineShift stop, float fraction);
-  }
-
-  public enum TextAlign {
-    enum_constant public static final androidx.ui.text.style.TextAlign Center;
-    enum_constant public static final androidx.ui.text.style.TextAlign End;
-    enum_constant public static final androidx.ui.text.style.TextAlign Justify;
-    enum_constant public static final androidx.ui.text.style.TextAlign Left;
-    enum_constant public static final androidx.ui.text.style.TextAlign Right;
-    enum_constant public static final androidx.ui.text.style.TextAlign Start;
-  }
-
-  public final class TextDecoration {
-    method public int component1();
-    method public boolean contains(androidx.ui.text.style.TextDecoration other);
-    method public androidx.ui.text.style.TextDecoration copy(int mask);
-    method public int getMask();
-    field public static final androidx.ui.text.style.TextDecoration.Companion! Companion;
-  }
-
-  public static final class TextDecoration.Companion {
-    method public androidx.ui.text.style.TextDecoration combine(java.util.List<androidx.ui.text.style.TextDecoration> decorations);
-    method public androidx.ui.text.style.TextDecoration getLineThrough();
-    method public androidx.ui.text.style.TextDecoration getNone();
-    method public androidx.ui.text.style.TextDecoration getUnderline();
-    property public final androidx.ui.text.style.TextDecoration LineThrough;
-    property public final androidx.ui.text.style.TextDecoration None;
-    property public final androidx.ui.text.style.TextDecoration Underline;
-  }
-
-  public enum TextDirection {
-    enum_constant public static final androidx.ui.text.style.TextDirection Ltr;
-    enum_constant public static final androidx.ui.text.style.TextDirection Rtl;
-  }
-
-  public enum TextDirectionAlgorithm {
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrLtr;
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrRtl;
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceLtr;
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceRtl;
-  }
-
-  public final class TextGeometricTransform {
-    ctor public TextGeometricTransform(float scaleX, float skewX);
-    ctor public TextGeometricTransform();
-    method public float component1();
-    method public float component2();
-    method public androidx.ui.text.style.TextGeometricTransform copy(float scaleX, float skewX);
-    method public float getScaleX();
-    method public float getSkewX();
-    field public static final androidx.ui.text.style.TextGeometricTransform.Companion! Companion;
-  }
-
-  public static final class TextGeometricTransform.Companion {
-  }
-
-  public final class TextGeometricTransformKt {
-    method public static androidx.ui.text.style.TextGeometricTransform lerp(androidx.ui.text.style.TextGeometricTransform start, androidx.ui.text.style.TextGeometricTransform stop, float fraction);
-  }
-
-  public final class TextIndent {
-    ctor public TextIndent(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
-    ctor public TextIndent();
-    method public androidx.ui.unit.TextUnit component1();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.style.TextIndent copy(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
-    method public androidx.ui.unit.TextUnit getFirstLine();
-    method public androidx.ui.unit.TextUnit getRestLine();
-    field public static final androidx.ui.text.style.TextIndent.Companion! Companion;
-  }
-
-  public static final class TextIndent.Companion {
-    method public androidx.ui.text.style.TextIndent getNone();
-    property public final androidx.ui.text.style.TextIndent None;
-  }
-
-  public final class TextIndentKt {
-    method public static androidx.ui.text.style.TextIndent lerp(androidx.ui.text.style.TextIndent start, androidx.ui.text.style.TextIndent stop, float fraction);
-  }
-
-  public enum TextOverflow {
-    enum_constant public static final androidx.ui.text.style.TextOverflow Clip;
-    enum_constant public static final androidx.ui.text.style.TextOverflow Ellipsis;
+  public final class TextSelectionDelegateKt {
   }
 
 }
diff --git a/ui/ui-text/api/restricted_0.1.0-dev09.txt b/ui/ui-text/api/restricted_0.1.0-dev09.txt
index 3364849..906a58c 100644
--- a/ui/ui-text/api/restricted_0.1.0-dev09.txt
+++ b/ui/ui-text/api/restricted_0.1.0-dev09.txt
@@ -1,954 +1,24 @@
 // Signature format: 3.0
-package androidx.ui.input {
-
-  public final class BackspaceKeyEditOp implements androidx.ui.input.EditOperation {
-    ctor public BackspaceKeyEditOp();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class CommitTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public CommitTextEditOp(String text, int newCursorPosition);
-    method public String component1();
-    method public int component2();
-    method public androidx.ui.input.CommitTextEditOp copy(String text, int newCursorPosition);
-    method public int getNewCursorPosition();
-    method public String getText();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class DeleteSurroundingTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public DeleteSurroundingTextEditOp(int beforeLength, int afterLength);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.DeleteSurroundingTextEditOp copy(int beforeLength, int afterLength);
-    method public int getAfterLength();
-    method public int getBeforeLength();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class DeleteSurroundingTextInCodePointsEditOp implements androidx.ui.input.EditOperation {
-    ctor public DeleteSurroundingTextInCodePointsEditOp(int beforeLength, int afterLength);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.DeleteSurroundingTextInCodePointsEditOp copy(int beforeLength, int afterLength);
-    method public int getAfterLength();
-    method public int getBeforeLength();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public interface EditOperation {
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class EditProcessor {
-    method public androidx.ui.input.EditorValue onEditCommands(java.util.List<? extends androidx.ui.input.EditOperation> ops);
-    method public void onNewState(androidx.ui.input.EditorValue model, androidx.ui.input.TextInputService? textInputService, int token);
-  }
-
-  public final class EditingBuffer {
-    ctor public EditingBuffer(String initialText, androidx.ui.text.TextRange initialSelection);
-    field public static final int NOWHERE = -1; // 0xffffffff
-  }
-
-  public final class EditorValue {
-    ctor public EditorValue(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
-    ctor public EditorValue();
-    method public String component1();
-    method public androidx.ui.text.TextRange component2();
-    method public androidx.ui.text.TextRange? component3();
-    method public androidx.ui.input.EditorValue copy(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
-    method public androidx.ui.text.TextRange? getComposition();
-    method public String getSelectedText();
-    method public androidx.ui.text.TextRange getSelection();
-    method public String getText();
-    method public String getTextAfterSelection(int maxChars);
-    method public String getTextBeforeSelection(int maxChars);
-  }
-
-  public final class FinishComposingTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public FinishComposingTextEditOp();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public enum ImeAction {
-    enum_constant public static final androidx.ui.input.ImeAction Done;
-    enum_constant public static final androidx.ui.input.ImeAction Go;
-    enum_constant public static final androidx.ui.input.ImeAction Next;
-    enum_constant public static final androidx.ui.input.ImeAction NoAction;
-    enum_constant public static final androidx.ui.input.ImeAction Previous;
-    enum_constant public static final androidx.ui.input.ImeAction Search;
-    enum_constant public static final androidx.ui.input.ImeAction Send;
-    enum_constant public static final androidx.ui.input.ImeAction Unspecified;
-  }
-
-  public interface InputEventListener {
-    method public void onEditOperations(java.util.List<? extends androidx.ui.input.EditOperation> editOps);
-    method public void onImeAction(androidx.ui.input.ImeAction imeAction);
-  }
-
-  public enum KeyboardType {
-    enum_constant public static final androidx.ui.input.KeyboardType Ascii;
-    enum_constant public static final androidx.ui.input.KeyboardType Email;
-    enum_constant public static final androidx.ui.input.KeyboardType Number;
-    enum_constant public static final androidx.ui.input.KeyboardType NumberPassword;
-    enum_constant public static final androidx.ui.input.KeyboardType Password;
-    enum_constant public static final androidx.ui.input.KeyboardType Phone;
-    enum_constant public static final androidx.ui.input.KeyboardType Text;
-    enum_constant public static final androidx.ui.input.KeyboardType Uri;
-  }
-
-  public final class MoveCursorEditOp implements androidx.ui.input.EditOperation {
-    ctor public MoveCursorEditOp(int amount);
-    method public int component1();
-    method public androidx.ui.input.MoveCursorEditOp copy(int amount);
-    method public int getAmount();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public interface OffsetMap {
-    method public int originalToTransformed(int offset);
-    method public int transformedToOriginal(int offset);
-    field public static final androidx.ui.input.OffsetMap.Companion! Companion;
-  }
-
-  public static final class OffsetMap.Companion {
-    method public androidx.ui.input.OffsetMap getIdentityOffsetMap();
-    property public final androidx.ui.input.OffsetMap identityOffsetMap;
-  }
-
-  public final class PasswordVisualTransformation implements androidx.ui.input.VisualTransformation {
-    ctor public PasswordVisualTransformation(char mask);
-    ctor public PasswordVisualTransformation();
-    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
-    method public char getMask();
-  }
-
-  public interface PlatformTextInputService {
-    method public void hideSoftwareKeyboard();
-    method public void notifyFocusedRect(androidx.ui.geometry.Rect rect);
-    method public void onStateUpdated(androidx.ui.input.EditorValue model);
-    method public void showSoftwareKeyboard();
-    method public void startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
-    method public void stopInput();
-  }
-
-  public final class SetComposingRegionEditOp implements androidx.ui.input.EditOperation {
-    ctor public SetComposingRegionEditOp(int start, int end);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.SetComposingRegionEditOp copy(int start, int end);
-    method public int getEnd();
-    method public int getStart();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class SetComposingTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public SetComposingTextEditOp(String text, int newCursorPosition);
-    method public String component1();
-    method public int component2();
-    method public androidx.ui.input.SetComposingTextEditOp copy(String text, int newCursorPosition);
-    method public int getNewCursorPosition();
-    method public String getText();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class SetSelectionEditOp implements androidx.ui.input.EditOperation {
-    ctor public SetSelectionEditOp(int start, int end);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.SetSelectionEditOp copy(int start, int end);
-    method public int getEnd();
-    method public int getStart();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public class TextInputService {
-    ctor public TextInputService(androidx.ui.input.PlatformTextInputService platformTextInputService);
-    method public void hideSoftwareKeyboard(int token);
-    method public void notifyFocusedRect(int token, androidx.ui.geometry.Rect rect);
-    method public void onStateUpdated(int token, androidx.ui.input.EditorValue model);
-    method public void showSoftwareKeyboard(int token);
-    method public int startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
-    method public void stopInput(int token);
-  }
-
-  public final class TextInputServiceKt {
-    field public static final int INVALID_SESSION = -1; // 0xffffffff
-    field public static final int NO_SESSION = 0; // 0x0
-  }
-
-  public final class TransformedText {
-    ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
-    method public androidx.ui.text.AnnotatedString component1();
-    method public androidx.ui.input.OffsetMap component2();
-    method public androidx.ui.input.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
-    method public androidx.ui.input.OffsetMap getOffsetMap();
-    method public androidx.ui.text.AnnotatedString getTransformedText();
-  }
-
-  public interface VisualTransformation {
-    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
-  }
-
-}
-
 package androidx.ui.text {
 
-  public final class AnnotatedString {
-    ctor public AnnotatedString(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles);
-    method public String component1();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> component2();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> component3();
-    method public androidx.ui.text.AnnotatedString copy(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> annotations);
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> getParagraphStyles();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> getSpanStyles();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> getStringAnnotations(String scope, int start, int end);
-    method public String getText();
-    method public operator androidx.ui.text.AnnotatedString plus(androidx.ui.text.AnnotatedString other);
+  public final class CoreTextFieldKt {
+    method public static void CoreTextField(androidx.ui.input.EditorValue value, androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = TextStyle.Default, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
   }
 
-  public static final class AnnotatedString.Builder {
-    ctor public AnnotatedString.Builder(int capacity);
-    ctor public AnnotatedString.Builder();
-    ctor public AnnotatedString.Builder(String text);
-    ctor public AnnotatedString.Builder(androidx.ui.text.AnnotatedString text);
-    method public void addAnnotationString(String scope, String annotation, int start, int end);
-    method public void addStyle(androidx.ui.text.SpanStyle style, int start, int end);
-    method public void addStyle(androidx.ui.text.ParagraphStyle style, int start, int end);
-    method public void append(String text);
-    method public void append(char p);
-    method public void append(androidx.ui.text.AnnotatedString text);
-    method public int getLength();
-    method public void pop();
-    method public void pop(int index);
-    method public int pushStringAnnotation(String scope, String annotation);
-    method public int pushStyle(androidx.ui.text.SpanStyle style);
-    method public int pushStyle(androidx.ui.text.ParagraphStyle style);
-    method public androidx.ui.text.AnnotatedString toAnnotatedString();
-    property public final int length;
+  public final class CoreTextKt {
+    method public static void CoreText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, int maxLines, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout);
+    method public static androidx.ui.core.HorizontalAlignmentLine getFirstBaseline();
+    method public static androidx.ui.core.HorizontalAlignmentLine getLastBaseline();
   }
 
-  public static final class AnnotatedString.Item<T> {
-    ctor public AnnotatedString.Item(T! item, int start, int end, String scope);
-    ctor public AnnotatedString.Item(T! item, int start, int end);
-    method public T! component1();
-    method public int component2();
-    method public int component3();
-    method public String component4();
-    method public androidx.ui.text.AnnotatedString.Item<T> copy(T! item, int start, int end, String scope);
-    method public int getEnd();
-    method public T! getItem();
-    method public String getScope();
-    method public int getStart();
-  }
-
-  public final class AnnotatedStringKt {
-    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.SpanStyle spanStyle, androidx.ui.text.ParagraphStyle? paragraphStyle = null);
-    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.ParagraphStyle paragraphStyle);
-    method public static inline androidx.ui.text.AnnotatedString AnnotatedString(kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
-    method public static androidx.ui.text.AnnotatedString capitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static androidx.ui.text.AnnotatedString decapitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static int getLength(androidx.ui.text.AnnotatedString);
-    method public static androidx.ui.text.AnnotatedString subSequence(androidx.ui.text.AnnotatedString, int start, int end);
-    method public static androidx.ui.text.AnnotatedString toLowerCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static androidx.ui.text.AnnotatedString toUpperCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
-    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
-  }
-
-  public final class Locale {
-    ctor public Locale(String languageTag);
-    method public String getLanguage();
-    method public String getRegion();
-    method public String getScript();
-    method public String toLanguageTag();
-    property public final String language;
-    property public final String region;
-    property public final String script;
-    field public static final androidx.ui.text.Locale.Companion! Companion;
-  }
-
-  public static final class Locale.Companion {
-    method public androidx.ui.text.Locale getCurrent();
-    property public final androidx.ui.text.Locale current;
-  }
-
-  public final class LocaleList implements java.util.Collection<androidx.ui.text.Locale> kotlin.jvm.internal.markers.KMappedMarker {
-    ctor public LocaleList(java.util.List<androidx.ui.text.Locale> localeList);
-    ctor public LocaleList(String languageTags);
-    ctor public LocaleList(androidx.ui.text.Locale... locales);
-    method public java.util.List<androidx.ui.text.Locale> component1();
-    method public operator boolean contains(androidx.ui.text.Locale element);
-    method public boolean containsAll(java.util.Collection<?> elements);
-    method public androidx.ui.text.LocaleList copy(java.util.List<androidx.ui.text.Locale> localeList);
-    method public operator androidx.ui.text.Locale get(int i);
-    method public java.util.List<androidx.ui.text.Locale> getLocaleList();
-    method public int getSize();
-    method public boolean isEmpty();
-    method public java.util.Iterator<androidx.ui.text.Locale> iterator();
-    property public int size;
-    field public static final androidx.ui.text.LocaleList.Companion! Companion;
-  }
-
-  public static final class LocaleList.Companion {
-    method public androidx.ui.text.LocaleList getCurrent();
-    property public final androidx.ui.text.LocaleList current;
-  }
-
-  public final class MultiParagraph {
-    ctor public MultiParagraph(androidx.ui.text.MultiParagraphIntrinsics intrinsics, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints);
-    ctor public MultiParagraph(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
-    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
-    method public androidx.ui.geometry.Rect getCursorRect(int offset);
-    method public boolean getDidExceedMaxLines();
-    method public float getFirstBaseline();
-    method public float getHeight();
-    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
-    method public androidx.ui.text.MultiParagraphIntrinsics getIntrinsics();
-    method public float getLastBaseline();
-    method public float getLineBottom(int lineIndex);
-    method public int getLineCount();
-    method public int getLineForOffset(int offset);
-    method public float getLineHeight(int lineIndex);
-    method public float getLineLeft(int lineIndex);
-    method public float getLineRight(int lineIndex);
-    method public float getLineTop(int lineIndex);
-    method public float getLineWidth(int lineIndex);
-    method public float getMaxIntrinsicWidth();
-    method public int getMaxLines();
-    method public float getMinIntrinsicWidth();
-    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
-    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
-    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
-    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
-    method public float getWidth();
-    method public androidx.ui.text.TextRange getWordBoundary(int offset);
-    method public void paint(androidx.ui.graphics.Canvas canvas);
-    property public final boolean didExceedMaxLines;
-    property public final float firstBaseline;
-    property public final float height;
-    property public final float lastBaseline;
-    property public final int lineCount;
-    property public final float maxIntrinsicWidth;
-    property public final float minIntrinsicWidth;
-    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
-    property public final float width;
-  }
-
-  public final class MultiParagraphIntrinsics implements androidx.ui.text.ParagraphIntrinsics {
-    ctor public MultiParagraphIntrinsics(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-    method public androidx.ui.text.AnnotatedString getAnnotatedString();
-    method public float getMaxIntrinsicWidth();
-    method public float getMinIntrinsicWidth();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
-    property public float maxIntrinsicWidth;
-    property public float minIntrinsicWidth;
-  }
-
-  public final class MultiParagraphIntrinsicsKt {
-  }
-
-  public final class MultiParagraphKt {
-  }
-
-  public interface Paragraph {
-    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
-    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
-    method public androidx.ui.geometry.Rect getCursorRect(int offset);
-    method public boolean getDidExceedMaxLines();
-    method public float getFirstBaseline();
-    method public float getHeight();
-    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
-    method public float getLastBaseline();
-    method public float getLineBottom(int lineIndex);
-    method public int getLineCount();
-    method public int getLineForOffset(int offset);
-    method public float getLineHeight(int lineIndex);
-    method public float getLineLeft(int lineIndex);
-    method public float getLineRight(int lineIndex);
-    method public float getLineTop(int lineIndex);
-    method public float getLineWidth(int lineIndex);
-    method public float getMaxIntrinsicWidth();
-    method public float getMinIntrinsicWidth();
-    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
-    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
-    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
-    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
-    method public float getWidth();
-    method public androidx.ui.text.TextRange getWordBoundary(int offset);
-    method public void paint(androidx.ui.graphics.Canvas canvas);
-    property public abstract boolean didExceedMaxLines;
-    property public abstract float firstBaseline;
-    property public abstract float height;
-    property public abstract float lastBaseline;
-    property public abstract int lineCount;
-    property public abstract float maxIntrinsicWidth;
-    property public abstract float minIntrinsicWidth;
-    property public abstract java.util.List<androidx.ui.geometry.Rect> placeholderRects;
-    property public abstract float width;
-  }
-
-  public final class ParagraphConstraints {
-    ctor public ParagraphConstraints(float width);
-    method public float component1();
-    method public androidx.ui.text.ParagraphConstraints copy(float width);
-    method public float getWidth();
-  }
-
-  public interface ParagraphIntrinsics {
-    method public float getMaxIntrinsicWidth();
-    method public float getMinIntrinsicWidth();
-    property public abstract float maxIntrinsicWidth;
-    property public abstract float minIntrinsicWidth;
-  }
-
-  public final class ParagraphIntrinsicsKt {
-    method public static androidx.ui.text.ParagraphIntrinsics ParagraphIntrinsics(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-  }
-
-  public final class ParagraphKt {
-    method public static androidx.ui.text.Paragraph Paragraph(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-    method public static androidx.ui.text.Paragraph Paragraph(androidx.ui.text.ParagraphIntrinsics paragraphIntrinsics, int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints);
-  }
-
-  public final class ParagraphStyle {
-    ctor public ParagraphStyle(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    ctor public ParagraphStyle();
-    method public androidx.ui.text.style.TextAlign? component1();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? component2();
-    method public androidx.ui.unit.TextUnit component3();
-    method public androidx.ui.text.style.TextIndent? component4();
-    method public androidx.ui.text.ParagraphStyle copy(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    method public androidx.ui.unit.TextUnit getLineHeight();
-    method public androidx.ui.text.style.TextAlign? getTextAlign();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
-    method public androidx.ui.text.style.TextIndent? getTextIndent();
-    method public androidx.ui.text.ParagraphStyle merge(androidx.ui.text.ParagraphStyle? other = null);
-  }
-
-  public final class ParagraphStyleKt {
-    method public static androidx.ui.text.ParagraphStyle lerp(androidx.ui.text.ParagraphStyle start, androidx.ui.text.ParagraphStyle stop, float fraction);
-  }
-
-  public final class Placeholder {
-    ctor public Placeholder(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
-    method public androidx.ui.unit.TextUnit component1();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.PlaceholderVerticalAlign component3();
-    method public androidx.ui.text.Placeholder copy(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
-    method public androidx.ui.unit.TextUnit getHeight();
-    method public androidx.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
-    method public androidx.ui.unit.TextUnit getWidth();
-  }
-
-  public enum PlaceholderVerticalAlign {
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign AboveBaseline;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Bottom;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Center;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextBottom;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextCenter;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextTop;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Top;
-  }
-
-  public final class SpanStyle {
-    ctor public SpanStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
-    ctor public SpanStyle();
-    method public androidx.ui.graphics.Color? component1();
-    method public androidx.ui.text.style.TextGeometricTransform? component10();
-    method public androidx.ui.text.LocaleList? component11();
-    method public androidx.ui.graphics.Color? component12();
-    method public androidx.ui.text.style.TextDecoration? component13();
-    method public androidx.ui.graphics.Shadow? component14();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.font.FontWeight? component3();
-    method public androidx.ui.text.font.FontStyle? component4();
-    method public androidx.ui.text.font.FontSynthesis? component5();
-    method public androidx.ui.text.font.FontFamily? component6();
-    method public String? component7();
-    method public androidx.ui.unit.TextUnit component8();
-    method public androidx.ui.text.style.BaselineShift? component9();
-    method public androidx.ui.text.SpanStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
-    method public androidx.ui.graphics.Color? getBackground();
-    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
-    method public androidx.ui.graphics.Color? getColor();
-    method public androidx.ui.text.font.FontFamily? getFontFamily();
-    method public String? getFontFeatureSettings();
-    method public androidx.ui.unit.TextUnit getFontSize();
-    method public androidx.ui.text.font.FontStyle? getFontStyle();
-    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
-    method public androidx.ui.text.font.FontWeight? getFontWeight();
-    method public androidx.ui.unit.TextUnit getLetterSpacing();
-    method public androidx.ui.text.LocaleList? getLocaleList();
-    method public androidx.ui.graphics.Shadow? getShadow();
-    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
-    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
-    method public androidx.ui.text.SpanStyle merge(androidx.ui.text.SpanStyle? other = null);
-  }
-
-  public final class SpanStyleKt {
-    method public static androidx.ui.text.SpanStyle lerp(androidx.ui.text.SpanStyle start, androidx.ui.text.SpanStyle stop, float fraction);
-  }
-
-  public final class StringKt {
-    method public static String capitalize(String, androidx.ui.text.Locale locale);
-    method public static String capitalize(String, androidx.ui.text.LocaleList localeList);
-    method public static String decapitalize(String, androidx.ui.text.Locale locale);
-    method public static String decapitalize(String, androidx.ui.text.LocaleList localeList);
-    method public static String toLowerCase(String, androidx.ui.text.Locale locale);
-    method public static String toLowerCase(String, androidx.ui.text.LocaleList localeList);
-    method public static String toUpperCase(String, androidx.ui.text.Locale locale);
-    method public static String toUpperCase(String, androidx.ui.text.LocaleList localeList);
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class TextDelegate {
-    ctor public TextDelegate(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders);
-    method public androidx.ui.unit.Density getDensity();
-    method public androidx.ui.unit.IntPx getMaxIntrinsicWidth();
-    method public int getMaxLines();
-    method public androidx.ui.unit.IntPx getMinIntrinsicWidth();
-    method public androidx.ui.text.style.TextOverflow getOverflow();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
-    method public androidx.ui.text.font.Font.ResourceLoader getResourceLoader();
-    method public boolean getSoftWrap();
-    method public androidx.ui.text.TextStyle getStyle();
-    method public androidx.ui.text.AnnotatedString getText();
-    method public androidx.ui.text.TextLayoutResult layout(androidx.ui.core.Constraints constraints, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.TextLayoutResult? prevResult = null);
-    method public void layoutIntrinsics(androidx.ui.core.LayoutDirection layoutDirection);
-    property public final androidx.ui.unit.IntPx maxIntrinsicWidth;
-    property public final androidx.ui.unit.IntPx minIntrinsicWidth;
-    field public static final androidx.ui.text.TextDelegate.Companion! Companion;
-  }
-
-  public static final class TextDelegate.Companion {
-    method public void paint(androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
-    method public void paintBackground(int start, int end, androidx.ui.graphics.Color color, androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
-  }
-
-  public final class TextLayoutHelperKt {
-  }
-
-  public final class TextLayoutInput {
-    ctor public TextLayoutInput(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
-    method public androidx.ui.text.AnnotatedString component1();
-    method public androidx.ui.core.Constraints component10();
-    method public androidx.ui.text.TextStyle component2();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> component3();
-    method public int component4();
-    method public boolean component5();
-    method public androidx.ui.text.style.TextOverflow component6();
-    method public androidx.ui.unit.Density component7();
-    method public androidx.ui.core.LayoutDirection component8();
-    method public androidx.ui.text.font.Font.ResourceLoader component9();
-    method public androidx.ui.text.TextLayoutInput copy(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
-    method public androidx.ui.core.Constraints getConstraints();
-    method public androidx.ui.unit.Density getDensity();
-    method public androidx.ui.core.LayoutDirection getLayoutDirection();
-    method public int getMaxLines();
-    method public androidx.ui.text.style.TextOverflow getOverflow();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
-    method public androidx.ui.text.font.Font.ResourceLoader getResourceLoader();
-    method public boolean getSoftWrap();
-    method public androidx.ui.text.TextStyle getStyle();
-    method public androidx.ui.text.AnnotatedString getText();
-  }
-
-  public final class TextLayoutResult {
-    method public androidx.ui.text.TextLayoutInput component1();
-    method public androidx.ui.unit.IntPxSize component3();
-    method public androidx.ui.text.TextLayoutResult copy(androidx.ui.text.TextLayoutInput layoutInput, androidx.ui.text.MultiParagraph multiParagraph, androidx.ui.unit.IntPxSize size);
-    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
-    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
-    method public androidx.ui.geometry.Rect getCursorRect(int offset);
-    method public boolean getDidOverflowHeight();
-    method public boolean getDidOverflowWidth();
-    method public androidx.ui.unit.Px getFirstBaseline();
-    method public boolean getHasVisualOverflow();
-    method public androidx.ui.unit.Px getHorizontalPosition(int offset, boolean usePrimaryDirection);
-    method public androidx.ui.unit.Px getLastBaseline();
-    method public androidx.ui.text.TextLayoutInput getLayoutInput();
-    method public androidx.ui.unit.Px getLineBottom(int lineIndex);
-    method public int getLineForOffset(int offset);
-    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
-    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
-    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
-    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
-    method public androidx.ui.unit.IntPxSize getSize();
-    method public androidx.ui.text.TextRange getWordBoundary(int offset);
-    property public final boolean didOverflowHeight;
-    property public final boolean didOverflowWidth;
-    property public final androidx.ui.unit.Px firstBaseline;
-    property public final boolean hasVisualOverflow;
-    property public final androidx.ui.unit.Px lastBaseline;
-    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
-  }
-
-  public final class TextPainter {
-    method public void paint(androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
-    field public static final androidx.ui.text.TextPainter! INSTANCE;
-  }
-
-  public final class TextRange {
-    ctor public TextRange(int start, int end);
-    method public int component1();
-    method public int component2();
-    method public operator boolean contains(androidx.ui.text.TextRange other);
-    method public operator boolean contains(int offset);
-    method public androidx.ui.text.TextRange copy(int start, int end);
-    method public boolean getCollapsed();
-    method public int getEnd();
-    method public int getLength();
-    method public int getMax();
-    method public int getMin();
-    method public int getStart();
-    method public boolean intersects(androidx.ui.text.TextRange other);
-    property public final boolean collapsed;
-    property public final int length;
-    property public final int max;
-    property public final int min;
-  }
-
-  public final class TextRangeKt {
-    method public static String substring(CharSequence, androidx.ui.text.TextRange range);
-  }
-
-  public final class TextStyle {
-    ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    ctor public TextStyle();
-    method public androidx.ui.graphics.Color? component1();
-    method public androidx.ui.text.style.TextGeometricTransform? component10();
-    method public androidx.ui.text.LocaleList? component11();
-    method public androidx.ui.graphics.Color? component12();
-    method public androidx.ui.text.style.TextDecoration? component13();
-    method public androidx.ui.graphics.Shadow? component14();
-    method public androidx.ui.text.style.TextAlign? component15();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? component16();
-    method public androidx.ui.unit.TextUnit component17();
-    method public androidx.ui.text.style.TextIndent? component18();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.font.FontWeight? component3();
-    method public androidx.ui.text.font.FontStyle? component4();
-    method public androidx.ui.text.font.FontSynthesis? component5();
-    method public androidx.ui.text.font.FontFamily? component6();
-    method public String? component7();
-    method public androidx.ui.unit.TextUnit component8();
-    method public androidx.ui.text.style.BaselineShift? component9();
-    method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    method public androidx.ui.graphics.Color? getBackground();
-    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
-    method public androidx.ui.graphics.Color? getColor();
-    method public androidx.ui.text.font.FontFamily? getFontFamily();
-    method public String? getFontFeatureSettings();
-    method public androidx.ui.unit.TextUnit getFontSize();
-    method public androidx.ui.text.font.FontStyle? getFontStyle();
-    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
-    method public androidx.ui.text.font.FontWeight? getFontWeight();
-    method public androidx.ui.unit.TextUnit getLetterSpacing();
-    method public androidx.ui.unit.TextUnit getLineHeight();
-    method public androidx.ui.text.LocaleList? getLocaleList();
-    method public androidx.ui.graphics.Shadow? getShadow();
-    method public androidx.ui.text.style.TextAlign? getTextAlign();
-    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
-    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
-    method public androidx.ui.text.style.TextIndent? getTextIndent();
-    method public androidx.ui.text.TextStyle merge(androidx.ui.text.TextStyle? other = null);
-    method public androidx.ui.text.TextStyle merge(androidx.ui.text.SpanStyle other);
-    method public androidx.ui.text.TextStyle merge(androidx.ui.text.ParagraphStyle other);
-    method public androidx.ui.text.ParagraphStyle toParagraphStyle();
-    method public androidx.ui.text.SpanStyle toSpanStyle();
-    field public static final androidx.ui.text.TextStyle.Companion! Companion;
-  }
-
-  public static final class TextStyle.Companion {
-    method public androidx.ui.text.TextStyle getDefault();
-    property public final androidx.ui.text.TextStyle Default;
-  }
-
-  public final class TextStyleKt {
-    method public static androidx.ui.text.TextStyle lerp(androidx.ui.text.TextStyle start, androidx.ui.text.TextStyle stop, float fraction);
-    method public static androidx.ui.text.TextStyle resolveDefaults(androidx.ui.text.TextStyle style, androidx.ui.core.LayoutDirection direction);
-  }
-
-  public interface Typeface {
-    method public androidx.ui.text.font.FontFamily getFontFamily();
-    property public abstract androidx.ui.text.font.FontFamily fontFamily;
-  }
-
-  public final class TypefaceKt {
-    method public static androidx.ui.text.Typeface typefaceFromFontFamily(android.content.Context context, androidx.ui.text.font.FontFamily fontFamily, java.util.List<? extends kotlin.Pair<androidx.ui.text.font.FontWeight,? extends androidx.ui.text.font.FontStyle>>? necessaryStyles = null);
+  public final class TextFieldDelegateKt {
   }
 
 }
 
-package androidx.ui.text.font {
+package androidx.ui.text.selection {
 
-  public abstract sealed class FileBasedFontFamily extends androidx.ui.text.font.FontFamily {
-  }
-
-  public interface Font {
-    method public androidx.ui.text.font.FontStyle getStyle();
-    method public androidx.ui.text.font.FontWeight getWeight();
-    property public abstract androidx.ui.text.font.FontStyle style;
-    property public abstract androidx.ui.text.font.FontWeight weight;
-  }
-
-  public static interface Font.ResourceLoader {
-    method public Object load(androidx.ui.text.font.Font font);
-  }
-
-  public abstract sealed class FontFamily {
-    method public final boolean getCanLoadSynchronously();
-    field public static final androidx.ui.text.font.FontFamily.Companion! Companion;
-  }
-
-  public static final class FontFamily.Companion {
-    method public androidx.ui.text.font.GenericFontFamily getCursive();
-    method public androidx.ui.text.font.SystemFontFamily getDefault();
-    method public androidx.ui.text.font.GenericFontFamily getMonospace();
-    method public androidx.ui.text.font.GenericFontFamily getSansSerif();
-    method public androidx.ui.text.font.GenericFontFamily getSerif();
-    property public final androidx.ui.text.font.GenericFontFamily Cursive;
-    property public final androidx.ui.text.font.SystemFontFamily Default;
-    property public final androidx.ui.text.font.GenericFontFamily Monospace;
-    property public final androidx.ui.text.font.GenericFontFamily SansSerif;
-    property public final androidx.ui.text.font.GenericFontFamily Serif;
-  }
-
-  public final class FontFamilyKt {
-    method public static androidx.ui.text.font.FontListFontFamily fontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
-    method public static androidx.ui.text.font.FontListFontFamily fontFamily(androidx.ui.text.font.Font... fonts);
-    method public static androidx.ui.text.font.LoadedFontFamily fontFamily(androidx.ui.text.Typeface typeface);
-  }
-
-  public final class FontKt {
-    method public static androidx.ui.text.font.FontListFontFamily asFontFamily(androidx.ui.text.font.Font);
-    method public static androidx.ui.text.font.Font font(int resId, androidx.ui.text.font.FontWeight weight = FontWeight.Normal, androidx.ui.text.font.FontStyle style = androidx.ui.text.font.FontStyle.Normal);
-  }
-
-  public final class FontListFontFamily extends androidx.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.ui.text.font.Font> {
-    ctor public FontListFontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
-    method public java.util.List<androidx.ui.text.font.Font> component1();
-    method public boolean contains(androidx.ui.text.font.Font element);
-    method public boolean containsAll(java.util.Collection<?> elements);
-    method public androidx.ui.text.font.FontListFontFamily copy(java.util.List<? extends androidx.ui.text.font.Font> fonts);
-    method public androidx.ui.text.font.Font get(int index);
-    method public java.util.List<androidx.ui.text.font.Font> getFonts();
-    method public int getSize();
-    method public int indexOf(androidx.ui.text.font.Font element);
-    method public boolean isEmpty();
-    method public java.util.Iterator<androidx.ui.text.font.Font> iterator();
-    method public int lastIndexOf(androidx.ui.text.font.Font element);
-    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator();
-    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator(int index);
-    method public java.util.List<androidx.ui.text.font.Font> subList(int fromIndex, int toIndex);
-  }
-
-  public enum FontStyle {
-    enum_constant public static final androidx.ui.text.font.FontStyle Italic;
-    enum_constant public static final androidx.ui.text.font.FontStyle Normal;
-  }
-
-  public enum FontSynthesis {
-    enum_constant public static final androidx.ui.text.font.FontSynthesis All;
-    enum_constant public static final androidx.ui.text.font.FontSynthesis None;
-    enum_constant public static final androidx.ui.text.font.FontSynthesis Style;
-    enum_constant public static final androidx.ui.text.font.FontSynthesis Weight;
-  }
-
-  public final class FontWeight implements java.lang.Comparable<androidx.ui.text.font.FontWeight> {
-    method public int compareTo(androidx.ui.text.font.FontWeight other);
-    method public androidx.ui.text.font.FontWeight copy(int weight);
-    field public static final androidx.ui.text.font.FontWeight.Companion! Companion;
-  }
-
-  public static final class FontWeight.Companion {
-    method public androidx.ui.text.font.FontWeight getBlack();
-    method public androidx.ui.text.font.FontWeight getBold();
-    method public androidx.ui.text.font.FontWeight getExtraBold();
-    method public androidx.ui.text.font.FontWeight getExtraLight();
-    method public androidx.ui.text.font.FontWeight getLight();
-    method public androidx.ui.text.font.FontWeight getMedium();
-    method public androidx.ui.text.font.FontWeight getNormal();
-    method public androidx.ui.text.font.FontWeight getSemiBold();
-    method public androidx.ui.text.font.FontWeight getThin();
-    method public androidx.ui.text.font.FontWeight getW100();
-    method public androidx.ui.text.font.FontWeight getW200();
-    method public androidx.ui.text.font.FontWeight getW300();
-    method public androidx.ui.text.font.FontWeight getW400();
-    method public androidx.ui.text.font.FontWeight getW500();
-    method public androidx.ui.text.font.FontWeight getW600();
-    method public androidx.ui.text.font.FontWeight getW700();
-    method public androidx.ui.text.font.FontWeight getW800();
-    method public androidx.ui.text.font.FontWeight getW900();
-    property public final androidx.ui.text.font.FontWeight Black;
-    property public final androidx.ui.text.font.FontWeight Bold;
-    property public final androidx.ui.text.font.FontWeight ExtraBold;
-    property public final androidx.ui.text.font.FontWeight ExtraLight;
-    property public final androidx.ui.text.font.FontWeight Light;
-    property public final androidx.ui.text.font.FontWeight Medium;
-    property public final androidx.ui.text.font.FontWeight Normal;
-    property public final androidx.ui.text.font.FontWeight SemiBold;
-    property public final androidx.ui.text.font.FontWeight Thin;
-    property public final androidx.ui.text.font.FontWeight W100;
-    property public final androidx.ui.text.font.FontWeight W200;
-    property public final androidx.ui.text.font.FontWeight W300;
-    property public final androidx.ui.text.font.FontWeight W400;
-    property public final androidx.ui.text.font.FontWeight W500;
-    property public final androidx.ui.text.font.FontWeight W600;
-    property public final androidx.ui.text.font.FontWeight W700;
-    property public final androidx.ui.text.font.FontWeight W800;
-    property public final androidx.ui.text.font.FontWeight W900;
-  }
-
-  public final class FontWeightKt {
-    method public static androidx.ui.text.font.FontWeight lerp(androidx.ui.text.font.FontWeight start, androidx.ui.text.font.FontWeight stop, float fraction);
-  }
-
-  public final class GenericFontFamily extends androidx.ui.text.font.SystemFontFamily {
-    method public String getName();
-  }
-
-  public final class LoadedFontFamily extends androidx.ui.text.font.FontFamily {
-    ctor public LoadedFontFamily(androidx.ui.text.Typeface typeface);
-    method public androidx.ui.text.Typeface component1();
-    method public androidx.ui.text.font.LoadedFontFamily copy(androidx.ui.text.Typeface typeface);
-    method public androidx.ui.text.Typeface getTypeface();
-  }
-
-  public final class ResourceFont implements androidx.ui.text.font.Font {
-    ctor public ResourceFont(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
-    method public int component1();
-    method public androidx.ui.text.font.FontWeight component2();
-    method public androidx.ui.text.font.FontStyle component3();
-    method public androidx.ui.text.font.ResourceFont copy(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
-    method public int getResId();
-    method public androidx.ui.text.font.FontStyle getStyle();
-    method public androidx.ui.text.font.FontWeight getWeight();
-  }
-
-  public abstract sealed class SystemFontFamily extends androidx.ui.text.font.FontFamily {
-  }
-
-}
-
-package androidx.ui.text.platform {
-
-  public final class AndroidParagraphHelperKt {
-  }
-
-  public final class AndroidParagraphKt {
-  }
-
-  public final class PlatformLocaleKt {
-  }
-
-}
-
-package androidx.ui.text.style {
-
-  public final class BaselineShift {
-    ctor public BaselineShift(float multiplier);
-    method public float component1();
-    method public androidx.ui.text.style.BaselineShift copy(float multiplier);
-    method public float getMultiplier();
-    field public static final androidx.ui.text.style.BaselineShift.Companion! Companion;
-  }
-
-  public static final class BaselineShift.Companion {
-    method public androidx.ui.text.style.BaselineShift getNone();
-    method public androidx.ui.text.style.BaselineShift getSubscript();
-    method public androidx.ui.text.style.BaselineShift getSuperscript();
-    property public final androidx.ui.text.style.BaselineShift None;
-    property public final androidx.ui.text.style.BaselineShift Subscript;
-    property public final androidx.ui.text.style.BaselineShift Superscript;
-  }
-
-  public final class BaselineShiftKt {
-    method public static androidx.ui.text.style.BaselineShift lerp(androidx.ui.text.style.BaselineShift start, androidx.ui.text.style.BaselineShift stop, float fraction);
-  }
-
-  public enum TextAlign {
-    enum_constant public static final androidx.ui.text.style.TextAlign Center;
-    enum_constant public static final androidx.ui.text.style.TextAlign End;
-    enum_constant public static final androidx.ui.text.style.TextAlign Justify;
-    enum_constant public static final androidx.ui.text.style.TextAlign Left;
-    enum_constant public static final androidx.ui.text.style.TextAlign Right;
-    enum_constant public static final androidx.ui.text.style.TextAlign Start;
-  }
-
-  public final class TextDecoration {
-    method public int component1();
-    method public boolean contains(androidx.ui.text.style.TextDecoration other);
-    method public androidx.ui.text.style.TextDecoration copy(int mask);
-    method public int getMask();
-    field public static final androidx.ui.text.style.TextDecoration.Companion! Companion;
-  }
-
-  public static final class TextDecoration.Companion {
-    method public androidx.ui.text.style.TextDecoration combine(java.util.List<androidx.ui.text.style.TextDecoration> decorations);
-    method public androidx.ui.text.style.TextDecoration getLineThrough();
-    method public androidx.ui.text.style.TextDecoration getNone();
-    method public androidx.ui.text.style.TextDecoration getUnderline();
-    property public final androidx.ui.text.style.TextDecoration LineThrough;
-    property public final androidx.ui.text.style.TextDecoration None;
-    property public final androidx.ui.text.style.TextDecoration Underline;
-  }
-
-  public enum TextDirection {
-    enum_constant public static final androidx.ui.text.style.TextDirection Ltr;
-    enum_constant public static final androidx.ui.text.style.TextDirection Rtl;
-  }
-
-  public enum TextDirectionAlgorithm {
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrLtr;
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrRtl;
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceLtr;
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceRtl;
-  }
-
-  public final class TextGeometricTransform {
-    ctor public TextGeometricTransform(float scaleX, float skewX);
-    ctor public TextGeometricTransform();
-    method public float component1();
-    method public float component2();
-    method public androidx.ui.text.style.TextGeometricTransform copy(float scaleX, float skewX);
-    method public float getScaleX();
-    method public float getSkewX();
-    field public static final androidx.ui.text.style.TextGeometricTransform.Companion! Companion;
-  }
-
-  public static final class TextGeometricTransform.Companion {
-  }
-
-  public final class TextGeometricTransformKt {
-    method public static androidx.ui.text.style.TextGeometricTransform lerp(androidx.ui.text.style.TextGeometricTransform start, androidx.ui.text.style.TextGeometricTransform stop, float fraction);
-  }
-
-  public final class TextIndent {
-    ctor public TextIndent(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
-    ctor public TextIndent();
-    method public androidx.ui.unit.TextUnit component1();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.style.TextIndent copy(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
-    method public androidx.ui.unit.TextUnit getFirstLine();
-    method public androidx.ui.unit.TextUnit getRestLine();
-    field public static final androidx.ui.text.style.TextIndent.Companion! Companion;
-  }
-
-  public static final class TextIndent.Companion {
-    method public androidx.ui.text.style.TextIndent getNone();
-    property public final androidx.ui.text.style.TextIndent None;
-  }
-
-  public final class TextIndentKt {
-    method public static androidx.ui.text.style.TextIndent lerp(androidx.ui.text.style.TextIndent start, androidx.ui.text.style.TextIndent stop, float fraction);
-  }
-
-  public enum TextOverflow {
-    enum_constant public static final androidx.ui.text.style.TextOverflow Clip;
-    enum_constant public static final androidx.ui.text.style.TextOverflow Ellipsis;
+  public final class TextSelectionDelegateKt {
   }
 
 }
diff --git a/ui/ui-text/api/restricted_current.txt b/ui/ui-text/api/restricted_current.txt
index 3364849..906a58c 100644
--- a/ui/ui-text/api/restricted_current.txt
+++ b/ui/ui-text/api/restricted_current.txt
@@ -1,954 +1,24 @@
 // Signature format: 3.0
-package androidx.ui.input {
-
-  public final class BackspaceKeyEditOp implements androidx.ui.input.EditOperation {
-    ctor public BackspaceKeyEditOp();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class CommitTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public CommitTextEditOp(String text, int newCursorPosition);
-    method public String component1();
-    method public int component2();
-    method public androidx.ui.input.CommitTextEditOp copy(String text, int newCursorPosition);
-    method public int getNewCursorPosition();
-    method public String getText();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class DeleteSurroundingTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public DeleteSurroundingTextEditOp(int beforeLength, int afterLength);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.DeleteSurroundingTextEditOp copy(int beforeLength, int afterLength);
-    method public int getAfterLength();
-    method public int getBeforeLength();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class DeleteSurroundingTextInCodePointsEditOp implements androidx.ui.input.EditOperation {
-    ctor public DeleteSurroundingTextInCodePointsEditOp(int beforeLength, int afterLength);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.DeleteSurroundingTextInCodePointsEditOp copy(int beforeLength, int afterLength);
-    method public int getAfterLength();
-    method public int getBeforeLength();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public interface EditOperation {
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class EditProcessor {
-    method public androidx.ui.input.EditorValue onEditCommands(java.util.List<? extends androidx.ui.input.EditOperation> ops);
-    method public void onNewState(androidx.ui.input.EditorValue model, androidx.ui.input.TextInputService? textInputService, int token);
-  }
-
-  public final class EditingBuffer {
-    ctor public EditingBuffer(String initialText, androidx.ui.text.TextRange initialSelection);
-    field public static final int NOWHERE = -1; // 0xffffffff
-  }
-
-  public final class EditorValue {
-    ctor public EditorValue(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
-    ctor public EditorValue();
-    method public String component1();
-    method public androidx.ui.text.TextRange component2();
-    method public androidx.ui.text.TextRange? component3();
-    method public androidx.ui.input.EditorValue copy(String text, androidx.ui.text.TextRange selection, androidx.ui.text.TextRange? composition);
-    method public androidx.ui.text.TextRange? getComposition();
-    method public String getSelectedText();
-    method public androidx.ui.text.TextRange getSelection();
-    method public String getText();
-    method public String getTextAfterSelection(int maxChars);
-    method public String getTextBeforeSelection(int maxChars);
-  }
-
-  public final class FinishComposingTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public FinishComposingTextEditOp();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public enum ImeAction {
-    enum_constant public static final androidx.ui.input.ImeAction Done;
-    enum_constant public static final androidx.ui.input.ImeAction Go;
-    enum_constant public static final androidx.ui.input.ImeAction Next;
-    enum_constant public static final androidx.ui.input.ImeAction NoAction;
-    enum_constant public static final androidx.ui.input.ImeAction Previous;
-    enum_constant public static final androidx.ui.input.ImeAction Search;
-    enum_constant public static final androidx.ui.input.ImeAction Send;
-    enum_constant public static final androidx.ui.input.ImeAction Unspecified;
-  }
-
-  public interface InputEventListener {
-    method public void onEditOperations(java.util.List<? extends androidx.ui.input.EditOperation> editOps);
-    method public void onImeAction(androidx.ui.input.ImeAction imeAction);
-  }
-
-  public enum KeyboardType {
-    enum_constant public static final androidx.ui.input.KeyboardType Ascii;
-    enum_constant public static final androidx.ui.input.KeyboardType Email;
-    enum_constant public static final androidx.ui.input.KeyboardType Number;
-    enum_constant public static final androidx.ui.input.KeyboardType NumberPassword;
-    enum_constant public static final androidx.ui.input.KeyboardType Password;
-    enum_constant public static final androidx.ui.input.KeyboardType Phone;
-    enum_constant public static final androidx.ui.input.KeyboardType Text;
-    enum_constant public static final androidx.ui.input.KeyboardType Uri;
-  }
-
-  public final class MoveCursorEditOp implements androidx.ui.input.EditOperation {
-    ctor public MoveCursorEditOp(int amount);
-    method public int component1();
-    method public androidx.ui.input.MoveCursorEditOp copy(int amount);
-    method public int getAmount();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public interface OffsetMap {
-    method public int originalToTransformed(int offset);
-    method public int transformedToOriginal(int offset);
-    field public static final androidx.ui.input.OffsetMap.Companion! Companion;
-  }
-
-  public static final class OffsetMap.Companion {
-    method public androidx.ui.input.OffsetMap getIdentityOffsetMap();
-    property public final androidx.ui.input.OffsetMap identityOffsetMap;
-  }
-
-  public final class PasswordVisualTransformation implements androidx.ui.input.VisualTransformation {
-    ctor public PasswordVisualTransformation(char mask);
-    ctor public PasswordVisualTransformation();
-    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
-    method public char getMask();
-  }
-
-  public interface PlatformTextInputService {
-    method public void hideSoftwareKeyboard();
-    method public void notifyFocusedRect(androidx.ui.geometry.Rect rect);
-    method public void onStateUpdated(androidx.ui.input.EditorValue model);
-    method public void showSoftwareKeyboard();
-    method public void startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
-    method public void stopInput();
-  }
-
-  public final class SetComposingRegionEditOp implements androidx.ui.input.EditOperation {
-    ctor public SetComposingRegionEditOp(int start, int end);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.SetComposingRegionEditOp copy(int start, int end);
-    method public int getEnd();
-    method public int getStart();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class SetComposingTextEditOp implements androidx.ui.input.EditOperation {
-    ctor public SetComposingTextEditOp(String text, int newCursorPosition);
-    method public String component1();
-    method public int component2();
-    method public androidx.ui.input.SetComposingTextEditOp copy(String text, int newCursorPosition);
-    method public int getNewCursorPosition();
-    method public String getText();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public final class SetSelectionEditOp implements androidx.ui.input.EditOperation {
-    ctor public SetSelectionEditOp(int start, int end);
-    method public int component1();
-    method public int component2();
-    method public androidx.ui.input.SetSelectionEditOp copy(int start, int end);
-    method public int getEnd();
-    method public int getStart();
-    method public void process(androidx.ui.input.EditingBuffer buffer);
-  }
-
-  public class TextInputService {
-    ctor public TextInputService(androidx.ui.input.PlatformTextInputService platformTextInputService);
-    method public void hideSoftwareKeyboard(int token);
-    method public void notifyFocusedRect(int token, androidx.ui.geometry.Rect rect);
-    method public void onStateUpdated(int token, androidx.ui.input.EditorValue model);
-    method public void showSoftwareKeyboard(int token);
-    method public int startInput(androidx.ui.input.EditorValue initModel, androidx.ui.input.KeyboardType keyboardType, androidx.ui.input.ImeAction imeAction, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.ui.input.EditOperation>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed);
-    method public void stopInput(int token);
-  }
-
-  public final class TextInputServiceKt {
-    field public static final int INVALID_SESSION = -1; // 0xffffffff
-    field public static final int NO_SESSION = 0; // 0x0
-  }
-
-  public final class TransformedText {
-    ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
-    method public androidx.ui.text.AnnotatedString component1();
-    method public androidx.ui.input.OffsetMap component2();
-    method public androidx.ui.input.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
-    method public androidx.ui.input.OffsetMap getOffsetMap();
-    method public androidx.ui.text.AnnotatedString getTransformedText();
-  }
-
-  public interface VisualTransformation {
-    method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
-  }
-
-}
-
 package androidx.ui.text {
 
-  public final class AnnotatedString {
-    ctor public AnnotatedString(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles);
-    method public String component1();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> component2();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> component3();
-    method public androidx.ui.text.AnnotatedString copy(String text, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> paragraphStyles, java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> annotations);
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.ParagraphStyle>> getParagraphStyles();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> getSpanStyles();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<java.lang.String>> getStringAnnotations(String scope, int start, int end);
-    method public String getText();
-    method public operator androidx.ui.text.AnnotatedString plus(androidx.ui.text.AnnotatedString other);
+  public final class CoreTextFieldKt {
+    method public static void CoreTextField(androidx.ui.input.EditorValue value, androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorValue,kotlin.Unit> onValueChange, androidx.ui.text.TextStyle textStyle = TextStyle.Default, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
   }
 
-  public static final class AnnotatedString.Builder {
-    ctor public AnnotatedString.Builder(int capacity);
-    ctor public AnnotatedString.Builder();
-    ctor public AnnotatedString.Builder(String text);
-    ctor public AnnotatedString.Builder(androidx.ui.text.AnnotatedString text);
-    method public void addAnnotationString(String scope, String annotation, int start, int end);
-    method public void addStyle(androidx.ui.text.SpanStyle style, int start, int end);
-    method public void addStyle(androidx.ui.text.ParagraphStyle style, int start, int end);
-    method public void append(String text);
-    method public void append(char p);
-    method public void append(androidx.ui.text.AnnotatedString text);
-    method public int getLength();
-    method public void pop();
-    method public void pop(int index);
-    method public int pushStringAnnotation(String scope, String annotation);
-    method public int pushStyle(androidx.ui.text.SpanStyle style);
-    method public int pushStyle(androidx.ui.text.ParagraphStyle style);
-    method public androidx.ui.text.AnnotatedString toAnnotatedString();
-    property public final int length;
+  public final class CoreTextKt {
+    method public static void CoreText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, int maxLines, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout);
+    method public static androidx.ui.core.HorizontalAlignmentLine getFirstBaseline();
+    method public static androidx.ui.core.HorizontalAlignmentLine getLastBaseline();
   }
 
-  public static final class AnnotatedString.Item<T> {
-    ctor public AnnotatedString.Item(T! item, int start, int end, String scope);
-    ctor public AnnotatedString.Item(T! item, int start, int end);
-    method public T! component1();
-    method public int component2();
-    method public int component3();
-    method public String component4();
-    method public androidx.ui.text.AnnotatedString.Item<T> copy(T! item, int start, int end, String scope);
-    method public int getEnd();
-    method public T! getItem();
-    method public String getScope();
-    method public int getStart();
-  }
-
-  public final class AnnotatedStringKt {
-    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.SpanStyle spanStyle, androidx.ui.text.ParagraphStyle? paragraphStyle = null);
-    method public static androidx.ui.text.AnnotatedString AnnotatedString(String text, androidx.ui.text.ParagraphStyle paragraphStyle);
-    method public static inline androidx.ui.text.AnnotatedString AnnotatedString(kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
-    method public static androidx.ui.text.AnnotatedString capitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static androidx.ui.text.AnnotatedString decapitalize(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static int getLength(androidx.ui.text.AnnotatedString);
-    method public static androidx.ui.text.AnnotatedString subSequence(androidx.ui.text.AnnotatedString, int start, int end);
-    method public static androidx.ui.text.AnnotatedString toLowerCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static androidx.ui.text.AnnotatedString toUpperCase(androidx.ui.text.AnnotatedString, androidx.ui.text.LocaleList localeList = LocaleList.current);
-    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
-    method public static inline <R> R withStyle(androidx.ui.text.AnnotatedString.Builder, androidx.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.ui.text.AnnotatedString.Builder,? extends R> block);
-  }
-
-  public final class Locale {
-    ctor public Locale(String languageTag);
-    method public String getLanguage();
-    method public String getRegion();
-    method public String getScript();
-    method public String toLanguageTag();
-    property public final String language;
-    property public final String region;
-    property public final String script;
-    field public static final androidx.ui.text.Locale.Companion! Companion;
-  }
-
-  public static final class Locale.Companion {
-    method public androidx.ui.text.Locale getCurrent();
-    property public final androidx.ui.text.Locale current;
-  }
-
-  public final class LocaleList implements java.util.Collection<androidx.ui.text.Locale> kotlin.jvm.internal.markers.KMappedMarker {
-    ctor public LocaleList(java.util.List<androidx.ui.text.Locale> localeList);
-    ctor public LocaleList(String languageTags);
-    ctor public LocaleList(androidx.ui.text.Locale... locales);
-    method public java.util.List<androidx.ui.text.Locale> component1();
-    method public operator boolean contains(androidx.ui.text.Locale element);
-    method public boolean containsAll(java.util.Collection<?> elements);
-    method public androidx.ui.text.LocaleList copy(java.util.List<androidx.ui.text.Locale> localeList);
-    method public operator androidx.ui.text.Locale get(int i);
-    method public java.util.List<androidx.ui.text.Locale> getLocaleList();
-    method public int getSize();
-    method public boolean isEmpty();
-    method public java.util.Iterator<androidx.ui.text.Locale> iterator();
-    property public int size;
-    field public static final androidx.ui.text.LocaleList.Companion! Companion;
-  }
-
-  public static final class LocaleList.Companion {
-    method public androidx.ui.text.LocaleList getCurrent();
-    property public final androidx.ui.text.LocaleList current;
-  }
-
-  public final class MultiParagraph {
-    ctor public MultiParagraph(androidx.ui.text.MultiParagraphIntrinsics intrinsics, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints);
-    ctor public MultiParagraph(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean ellipsis, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
-    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
-    method public androidx.ui.geometry.Rect getCursorRect(int offset);
-    method public boolean getDidExceedMaxLines();
-    method public float getFirstBaseline();
-    method public float getHeight();
-    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
-    method public androidx.ui.text.MultiParagraphIntrinsics getIntrinsics();
-    method public float getLastBaseline();
-    method public float getLineBottom(int lineIndex);
-    method public int getLineCount();
-    method public int getLineForOffset(int offset);
-    method public float getLineHeight(int lineIndex);
-    method public float getLineLeft(int lineIndex);
-    method public float getLineRight(int lineIndex);
-    method public float getLineTop(int lineIndex);
-    method public float getLineWidth(int lineIndex);
-    method public float getMaxIntrinsicWidth();
-    method public int getMaxLines();
-    method public float getMinIntrinsicWidth();
-    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
-    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
-    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
-    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
-    method public float getWidth();
-    method public androidx.ui.text.TextRange getWordBoundary(int offset);
-    method public void paint(androidx.ui.graphics.Canvas canvas);
-    property public final boolean didExceedMaxLines;
-    property public final float firstBaseline;
-    property public final float height;
-    property public final float lastBaseline;
-    property public final int lineCount;
-    property public final float maxIntrinsicWidth;
-    property public final float minIntrinsicWidth;
-    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
-    property public final float width;
-  }
-
-  public final class MultiParagraphIntrinsics implements androidx.ui.text.ParagraphIntrinsics {
-    ctor public MultiParagraphIntrinsics(androidx.ui.text.AnnotatedString annotatedString, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-    method public androidx.ui.text.AnnotatedString getAnnotatedString();
-    method public float getMaxIntrinsicWidth();
-    method public float getMinIntrinsicWidth();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
-    property public float maxIntrinsicWidth;
-    property public float minIntrinsicWidth;
-  }
-
-  public final class MultiParagraphIntrinsicsKt {
-  }
-
-  public final class MultiParagraphKt {
-  }
-
-  public interface Paragraph {
-    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
-    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
-    method public androidx.ui.geometry.Rect getCursorRect(int offset);
-    method public boolean getDidExceedMaxLines();
-    method public float getFirstBaseline();
-    method public float getHeight();
-    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
-    method public float getLastBaseline();
-    method public float getLineBottom(int lineIndex);
-    method public int getLineCount();
-    method public int getLineForOffset(int offset);
-    method public float getLineHeight(int lineIndex);
-    method public float getLineLeft(int lineIndex);
-    method public float getLineRight(int lineIndex);
-    method public float getLineTop(int lineIndex);
-    method public float getLineWidth(int lineIndex);
-    method public float getMaxIntrinsicWidth();
-    method public float getMinIntrinsicWidth();
-    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
-    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
-    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
-    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
-    method public float getWidth();
-    method public androidx.ui.text.TextRange getWordBoundary(int offset);
-    method public void paint(androidx.ui.graphics.Canvas canvas);
-    property public abstract boolean didExceedMaxLines;
-    property public abstract float firstBaseline;
-    property public abstract float height;
-    property public abstract float lastBaseline;
-    property public abstract int lineCount;
-    property public abstract float maxIntrinsicWidth;
-    property public abstract float minIntrinsicWidth;
-    property public abstract java.util.List<androidx.ui.geometry.Rect> placeholderRects;
-    property public abstract float width;
-  }
-
-  public final class ParagraphConstraints {
-    ctor public ParagraphConstraints(float width);
-    method public float component1();
-    method public androidx.ui.text.ParagraphConstraints copy(float width);
-    method public float getWidth();
-  }
-
-  public interface ParagraphIntrinsics {
-    method public float getMaxIntrinsicWidth();
-    method public float getMinIntrinsicWidth();
-    property public abstract float maxIntrinsicWidth;
-    property public abstract float minIntrinsicWidth;
-  }
-
-  public final class ParagraphIntrinsicsKt {
-    method public static androidx.ui.text.ParagraphIntrinsics ParagraphIntrinsics(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-  }
-
-  public final class ParagraphKt {
-    method public static androidx.ui.text.Paragraph Paragraph(String text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.SpanStyle>> spanStyles = listOf(), java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders = listOf(), int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader);
-    method public static androidx.ui.text.Paragraph Paragraph(androidx.ui.text.ParagraphIntrinsics paragraphIntrinsics, int maxLines = 2147483647, boolean ellipsis = false, androidx.ui.text.ParagraphConstraints constraints);
-  }
-
-  public final class ParagraphStyle {
-    ctor public ParagraphStyle(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    ctor public ParagraphStyle();
-    method public androidx.ui.text.style.TextAlign? component1();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? component2();
-    method public androidx.ui.unit.TextUnit component3();
-    method public androidx.ui.text.style.TextIndent? component4();
-    method public androidx.ui.text.ParagraphStyle copy(androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    method public androidx.ui.unit.TextUnit getLineHeight();
-    method public androidx.ui.text.style.TextAlign? getTextAlign();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
-    method public androidx.ui.text.style.TextIndent? getTextIndent();
-    method public androidx.ui.text.ParagraphStyle merge(androidx.ui.text.ParagraphStyle? other = null);
-  }
-
-  public final class ParagraphStyleKt {
-    method public static androidx.ui.text.ParagraphStyle lerp(androidx.ui.text.ParagraphStyle start, androidx.ui.text.ParagraphStyle stop, float fraction);
-  }
-
-  public final class Placeholder {
-    ctor public Placeholder(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
-    method public androidx.ui.unit.TextUnit component1();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.PlaceholderVerticalAlign component3();
-    method public androidx.ui.text.Placeholder copy(androidx.ui.unit.TextUnit width, androidx.ui.unit.TextUnit height, androidx.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
-    method public androidx.ui.unit.TextUnit getHeight();
-    method public androidx.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
-    method public androidx.ui.unit.TextUnit getWidth();
-  }
-
-  public enum PlaceholderVerticalAlign {
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign AboveBaseline;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Bottom;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Center;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextBottom;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextCenter;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign TextTop;
-    enum_constant public static final androidx.ui.text.PlaceholderVerticalAlign Top;
-  }
-
-  public final class SpanStyle {
-    ctor public SpanStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
-    ctor public SpanStyle();
-    method public androidx.ui.graphics.Color? component1();
-    method public androidx.ui.text.style.TextGeometricTransform? component10();
-    method public androidx.ui.text.LocaleList? component11();
-    method public androidx.ui.graphics.Color? component12();
-    method public androidx.ui.text.style.TextDecoration? component13();
-    method public androidx.ui.graphics.Shadow? component14();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.font.FontWeight? component3();
-    method public androidx.ui.text.font.FontStyle? component4();
-    method public androidx.ui.text.font.FontSynthesis? component5();
-    method public androidx.ui.text.font.FontFamily? component6();
-    method public String? component7();
-    method public androidx.ui.unit.TextUnit component8();
-    method public androidx.ui.text.style.BaselineShift? component9();
-    method public androidx.ui.text.SpanStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow);
-    method public androidx.ui.graphics.Color? getBackground();
-    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
-    method public androidx.ui.graphics.Color? getColor();
-    method public androidx.ui.text.font.FontFamily? getFontFamily();
-    method public String? getFontFeatureSettings();
-    method public androidx.ui.unit.TextUnit getFontSize();
-    method public androidx.ui.text.font.FontStyle? getFontStyle();
-    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
-    method public androidx.ui.text.font.FontWeight? getFontWeight();
-    method public androidx.ui.unit.TextUnit getLetterSpacing();
-    method public androidx.ui.text.LocaleList? getLocaleList();
-    method public androidx.ui.graphics.Shadow? getShadow();
-    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
-    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
-    method public androidx.ui.text.SpanStyle merge(androidx.ui.text.SpanStyle? other = null);
-  }
-
-  public final class SpanStyleKt {
-    method public static androidx.ui.text.SpanStyle lerp(androidx.ui.text.SpanStyle start, androidx.ui.text.SpanStyle stop, float fraction);
-  }
-
-  public final class StringKt {
-    method public static String capitalize(String, androidx.ui.text.Locale locale);
-    method public static String capitalize(String, androidx.ui.text.LocaleList localeList);
-    method public static String decapitalize(String, androidx.ui.text.Locale locale);
-    method public static String decapitalize(String, androidx.ui.text.LocaleList localeList);
-    method public static String toLowerCase(String, androidx.ui.text.Locale locale);
-    method public static String toLowerCase(String, androidx.ui.text.LocaleList localeList);
-    method public static String toUpperCase(String, androidx.ui.text.Locale locale);
-    method public static String toUpperCase(String, androidx.ui.text.LocaleList localeList);
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class TextDelegate {
-    ctor public TextDelegate(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.text.font.Font.ResourceLoader resourceLoader, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders);
-    method public androidx.ui.unit.Density getDensity();
-    method public androidx.ui.unit.IntPx getMaxIntrinsicWidth();
-    method public int getMaxLines();
-    method public androidx.ui.unit.IntPx getMinIntrinsicWidth();
-    method public androidx.ui.text.style.TextOverflow getOverflow();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
-    method public androidx.ui.text.font.Font.ResourceLoader getResourceLoader();
-    method public boolean getSoftWrap();
-    method public androidx.ui.text.TextStyle getStyle();
-    method public androidx.ui.text.AnnotatedString getText();
-    method public androidx.ui.text.TextLayoutResult layout(androidx.ui.core.Constraints constraints, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.TextLayoutResult? prevResult = null);
-    method public void layoutIntrinsics(androidx.ui.core.LayoutDirection layoutDirection);
-    property public final androidx.ui.unit.IntPx maxIntrinsicWidth;
-    property public final androidx.ui.unit.IntPx minIntrinsicWidth;
-    field public static final androidx.ui.text.TextDelegate.Companion! Companion;
-  }
-
-  public static final class TextDelegate.Companion {
-    method public void paint(androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
-    method public void paintBackground(int start, int end, androidx.ui.graphics.Color color, androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
-  }
-
-  public final class TextLayoutHelperKt {
-  }
-
-  public final class TextLayoutInput {
-    ctor public TextLayoutInput(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
-    method public androidx.ui.text.AnnotatedString component1();
-    method public androidx.ui.core.Constraints component10();
-    method public androidx.ui.text.TextStyle component2();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> component3();
-    method public int component4();
-    method public boolean component5();
-    method public androidx.ui.text.style.TextOverflow component6();
-    method public androidx.ui.unit.Density component7();
-    method public androidx.ui.core.LayoutDirection component8();
-    method public androidx.ui.text.font.Font.ResourceLoader component9();
-    method public androidx.ui.text.TextLayoutInput copy(androidx.ui.text.AnnotatedString text, androidx.ui.text.TextStyle style, java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, androidx.ui.text.style.TextOverflow overflow, androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.text.font.Font.ResourceLoader resourceLoader, androidx.ui.core.Constraints constraints);
-    method public androidx.ui.core.Constraints getConstraints();
-    method public androidx.ui.unit.Density getDensity();
-    method public androidx.ui.core.LayoutDirection getLayoutDirection();
-    method public int getMaxLines();
-    method public androidx.ui.text.style.TextOverflow getOverflow();
-    method public java.util.List<androidx.ui.text.AnnotatedString.Item<androidx.ui.text.Placeholder>> getPlaceholders();
-    method public androidx.ui.text.font.Font.ResourceLoader getResourceLoader();
-    method public boolean getSoftWrap();
-    method public androidx.ui.text.TextStyle getStyle();
-    method public androidx.ui.text.AnnotatedString getText();
-  }
-
-  public final class TextLayoutResult {
-    method public androidx.ui.text.TextLayoutInput component1();
-    method public androidx.ui.unit.IntPxSize component3();
-    method public androidx.ui.text.TextLayoutResult copy(androidx.ui.text.TextLayoutInput layoutInput, androidx.ui.text.MultiParagraph multiParagraph, androidx.ui.unit.IntPxSize size);
-    method public androidx.ui.text.style.TextDirection getBidiRunDirection(int offset);
-    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
-    method public androidx.ui.geometry.Rect getCursorRect(int offset);
-    method public boolean getDidOverflowHeight();
-    method public boolean getDidOverflowWidth();
-    method public androidx.ui.unit.Px getFirstBaseline();
-    method public boolean getHasVisualOverflow();
-    method public androidx.ui.unit.Px getHorizontalPosition(int offset, boolean usePrimaryDirection);
-    method public androidx.ui.unit.Px getLastBaseline();
-    method public androidx.ui.text.TextLayoutInput getLayoutInput();
-    method public androidx.ui.unit.Px getLineBottom(int lineIndex);
-    method public int getLineForOffset(int offset);
-    method public int getOffsetForPosition(androidx.ui.unit.PxPosition position);
-    method public androidx.ui.text.style.TextDirection getParagraphDirection(int offset);
-    method public androidx.ui.graphics.Path getPathForRange(int start, int end);
-    method public java.util.List<androidx.ui.geometry.Rect> getPlaceholderRects();
-    method public androidx.ui.unit.IntPxSize getSize();
-    method public androidx.ui.text.TextRange getWordBoundary(int offset);
-    property public final boolean didOverflowHeight;
-    property public final boolean didOverflowWidth;
-    property public final androidx.ui.unit.Px firstBaseline;
-    property public final boolean hasVisualOverflow;
-    property public final androidx.ui.unit.Px lastBaseline;
-    property public final java.util.List<androidx.ui.geometry.Rect> placeholderRects;
-  }
-
-  public final class TextPainter {
-    method public void paint(androidx.ui.graphics.Canvas canvas, androidx.ui.text.TextLayoutResult textLayoutResult);
-    field public static final androidx.ui.text.TextPainter! INSTANCE;
-  }
-
-  public final class TextRange {
-    ctor public TextRange(int start, int end);
-    method public int component1();
-    method public int component2();
-    method public operator boolean contains(androidx.ui.text.TextRange other);
-    method public operator boolean contains(int offset);
-    method public androidx.ui.text.TextRange copy(int start, int end);
-    method public boolean getCollapsed();
-    method public int getEnd();
-    method public int getLength();
-    method public int getMax();
-    method public int getMin();
-    method public int getStart();
-    method public boolean intersects(androidx.ui.text.TextRange other);
-    property public final boolean collapsed;
-    property public final int length;
-    property public final int max;
-    property public final int min;
-  }
-
-  public final class TextRangeKt {
-    method public static String substring(CharSequence, androidx.ui.text.TextRange range);
-  }
-
-  public final class TextStyle {
-    ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    ctor public TextStyle();
-    method public androidx.ui.graphics.Color? component1();
-    method public androidx.ui.text.style.TextGeometricTransform? component10();
-    method public androidx.ui.text.LocaleList? component11();
-    method public androidx.ui.graphics.Color? component12();
-    method public androidx.ui.text.style.TextDecoration? component13();
-    method public androidx.ui.graphics.Shadow? component14();
-    method public androidx.ui.text.style.TextAlign? component15();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? component16();
-    method public androidx.ui.unit.TextUnit component17();
-    method public androidx.ui.text.style.TextIndent? component18();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.font.FontWeight? component3();
-    method public androidx.ui.text.font.FontStyle? component4();
-    method public androidx.ui.text.font.FontSynthesis? component5();
-    method public androidx.ui.text.font.FontFamily? component6();
-    method public String? component7();
-    method public androidx.ui.unit.TextUnit component8();
-    method public androidx.ui.text.style.BaselineShift? component9();
-    method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.unit.TextUnit fontSize, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, androidx.ui.unit.TextUnit letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.LocaleList? localeList, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? textDecoration, androidx.ui.graphics.Shadow? shadow, androidx.ui.text.style.TextAlign? textAlign, androidx.ui.text.style.TextDirectionAlgorithm? textDirectionAlgorithm, androidx.ui.unit.TextUnit lineHeight, androidx.ui.text.style.TextIndent? textIndent);
-    method public androidx.ui.graphics.Color? getBackground();
-    method public androidx.ui.text.style.BaselineShift? getBaselineShift();
-    method public androidx.ui.graphics.Color? getColor();
-    method public androidx.ui.text.font.FontFamily? getFontFamily();
-    method public String? getFontFeatureSettings();
-    method public androidx.ui.unit.TextUnit getFontSize();
-    method public androidx.ui.text.font.FontStyle? getFontStyle();
-    method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
-    method public androidx.ui.text.font.FontWeight? getFontWeight();
-    method public androidx.ui.unit.TextUnit getLetterSpacing();
-    method public androidx.ui.unit.TextUnit getLineHeight();
-    method public androidx.ui.text.LocaleList? getLocaleList();
-    method public androidx.ui.graphics.Shadow? getShadow();
-    method public androidx.ui.text.style.TextAlign? getTextAlign();
-    method public androidx.ui.text.style.TextDecoration? getTextDecoration();
-    method public androidx.ui.text.style.TextDirectionAlgorithm? getTextDirectionAlgorithm();
-    method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
-    method public androidx.ui.text.style.TextIndent? getTextIndent();
-    method public androidx.ui.text.TextStyle merge(androidx.ui.text.TextStyle? other = null);
-    method public androidx.ui.text.TextStyle merge(androidx.ui.text.SpanStyle other);
-    method public androidx.ui.text.TextStyle merge(androidx.ui.text.ParagraphStyle other);
-    method public androidx.ui.text.ParagraphStyle toParagraphStyle();
-    method public androidx.ui.text.SpanStyle toSpanStyle();
-    field public static final androidx.ui.text.TextStyle.Companion! Companion;
-  }
-
-  public static final class TextStyle.Companion {
-    method public androidx.ui.text.TextStyle getDefault();
-    property public final androidx.ui.text.TextStyle Default;
-  }
-
-  public final class TextStyleKt {
-    method public static androidx.ui.text.TextStyle lerp(androidx.ui.text.TextStyle start, androidx.ui.text.TextStyle stop, float fraction);
-    method public static androidx.ui.text.TextStyle resolveDefaults(androidx.ui.text.TextStyle style, androidx.ui.core.LayoutDirection direction);
-  }
-
-  public interface Typeface {
-    method public androidx.ui.text.font.FontFamily getFontFamily();
-    property public abstract androidx.ui.text.font.FontFamily fontFamily;
-  }
-
-  public final class TypefaceKt {
-    method public static androidx.ui.text.Typeface typefaceFromFontFamily(android.content.Context context, androidx.ui.text.font.FontFamily fontFamily, java.util.List<? extends kotlin.Pair<androidx.ui.text.font.FontWeight,? extends androidx.ui.text.font.FontStyle>>? necessaryStyles = null);
+  public final class TextFieldDelegateKt {
   }
 
 }
 
-package androidx.ui.text.font {
+package androidx.ui.text.selection {
 
-  public abstract sealed class FileBasedFontFamily extends androidx.ui.text.font.FontFamily {
-  }
-
-  public interface Font {
-    method public androidx.ui.text.font.FontStyle getStyle();
-    method public androidx.ui.text.font.FontWeight getWeight();
-    property public abstract androidx.ui.text.font.FontStyle style;
-    property public abstract androidx.ui.text.font.FontWeight weight;
-  }
-
-  public static interface Font.ResourceLoader {
-    method public Object load(androidx.ui.text.font.Font font);
-  }
-
-  public abstract sealed class FontFamily {
-    method public final boolean getCanLoadSynchronously();
-    field public static final androidx.ui.text.font.FontFamily.Companion! Companion;
-  }
-
-  public static final class FontFamily.Companion {
-    method public androidx.ui.text.font.GenericFontFamily getCursive();
-    method public androidx.ui.text.font.SystemFontFamily getDefault();
-    method public androidx.ui.text.font.GenericFontFamily getMonospace();
-    method public androidx.ui.text.font.GenericFontFamily getSansSerif();
-    method public androidx.ui.text.font.GenericFontFamily getSerif();
-    property public final androidx.ui.text.font.GenericFontFamily Cursive;
-    property public final androidx.ui.text.font.SystemFontFamily Default;
-    property public final androidx.ui.text.font.GenericFontFamily Monospace;
-    property public final androidx.ui.text.font.GenericFontFamily SansSerif;
-    property public final androidx.ui.text.font.GenericFontFamily Serif;
-  }
-
-  public final class FontFamilyKt {
-    method public static androidx.ui.text.font.FontListFontFamily fontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
-    method public static androidx.ui.text.font.FontListFontFamily fontFamily(androidx.ui.text.font.Font... fonts);
-    method public static androidx.ui.text.font.LoadedFontFamily fontFamily(androidx.ui.text.Typeface typeface);
-  }
-
-  public final class FontKt {
-    method public static androidx.ui.text.font.FontListFontFamily asFontFamily(androidx.ui.text.font.Font);
-    method public static androidx.ui.text.font.Font font(int resId, androidx.ui.text.font.FontWeight weight = FontWeight.Normal, androidx.ui.text.font.FontStyle style = androidx.ui.text.font.FontStyle.Normal);
-  }
-
-  public final class FontListFontFamily extends androidx.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.ui.text.font.Font> {
-    ctor public FontListFontFamily(java.util.List<? extends androidx.ui.text.font.Font> fonts);
-    method public java.util.List<androidx.ui.text.font.Font> component1();
-    method public boolean contains(androidx.ui.text.font.Font element);
-    method public boolean containsAll(java.util.Collection<?> elements);
-    method public androidx.ui.text.font.FontListFontFamily copy(java.util.List<? extends androidx.ui.text.font.Font> fonts);
-    method public androidx.ui.text.font.Font get(int index);
-    method public java.util.List<androidx.ui.text.font.Font> getFonts();
-    method public int getSize();
-    method public int indexOf(androidx.ui.text.font.Font element);
-    method public boolean isEmpty();
-    method public java.util.Iterator<androidx.ui.text.font.Font> iterator();
-    method public int lastIndexOf(androidx.ui.text.font.Font element);
-    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator();
-    method public java.util.ListIterator<androidx.ui.text.font.Font> listIterator(int index);
-    method public java.util.List<androidx.ui.text.font.Font> subList(int fromIndex, int toIndex);
-  }
-
-  public enum FontStyle {
-    enum_constant public static final androidx.ui.text.font.FontStyle Italic;
-    enum_constant public static final androidx.ui.text.font.FontStyle Normal;
-  }
-
-  public enum FontSynthesis {
-    enum_constant public static final androidx.ui.text.font.FontSynthesis All;
-    enum_constant public static final androidx.ui.text.font.FontSynthesis None;
-    enum_constant public static final androidx.ui.text.font.FontSynthesis Style;
-    enum_constant public static final androidx.ui.text.font.FontSynthesis Weight;
-  }
-
-  public final class FontWeight implements java.lang.Comparable<androidx.ui.text.font.FontWeight> {
-    method public int compareTo(androidx.ui.text.font.FontWeight other);
-    method public androidx.ui.text.font.FontWeight copy(int weight);
-    field public static final androidx.ui.text.font.FontWeight.Companion! Companion;
-  }
-
-  public static final class FontWeight.Companion {
-    method public androidx.ui.text.font.FontWeight getBlack();
-    method public androidx.ui.text.font.FontWeight getBold();
-    method public androidx.ui.text.font.FontWeight getExtraBold();
-    method public androidx.ui.text.font.FontWeight getExtraLight();
-    method public androidx.ui.text.font.FontWeight getLight();
-    method public androidx.ui.text.font.FontWeight getMedium();
-    method public androidx.ui.text.font.FontWeight getNormal();
-    method public androidx.ui.text.font.FontWeight getSemiBold();
-    method public androidx.ui.text.font.FontWeight getThin();
-    method public androidx.ui.text.font.FontWeight getW100();
-    method public androidx.ui.text.font.FontWeight getW200();
-    method public androidx.ui.text.font.FontWeight getW300();
-    method public androidx.ui.text.font.FontWeight getW400();
-    method public androidx.ui.text.font.FontWeight getW500();
-    method public androidx.ui.text.font.FontWeight getW600();
-    method public androidx.ui.text.font.FontWeight getW700();
-    method public androidx.ui.text.font.FontWeight getW800();
-    method public androidx.ui.text.font.FontWeight getW900();
-    property public final androidx.ui.text.font.FontWeight Black;
-    property public final androidx.ui.text.font.FontWeight Bold;
-    property public final androidx.ui.text.font.FontWeight ExtraBold;
-    property public final androidx.ui.text.font.FontWeight ExtraLight;
-    property public final androidx.ui.text.font.FontWeight Light;
-    property public final androidx.ui.text.font.FontWeight Medium;
-    property public final androidx.ui.text.font.FontWeight Normal;
-    property public final androidx.ui.text.font.FontWeight SemiBold;
-    property public final androidx.ui.text.font.FontWeight Thin;
-    property public final androidx.ui.text.font.FontWeight W100;
-    property public final androidx.ui.text.font.FontWeight W200;
-    property public final androidx.ui.text.font.FontWeight W300;
-    property public final androidx.ui.text.font.FontWeight W400;
-    property public final androidx.ui.text.font.FontWeight W500;
-    property public final androidx.ui.text.font.FontWeight W600;
-    property public final androidx.ui.text.font.FontWeight W700;
-    property public final androidx.ui.text.font.FontWeight W800;
-    property public final androidx.ui.text.font.FontWeight W900;
-  }
-
-  public final class FontWeightKt {
-    method public static androidx.ui.text.font.FontWeight lerp(androidx.ui.text.font.FontWeight start, androidx.ui.text.font.FontWeight stop, float fraction);
-  }
-
-  public final class GenericFontFamily extends androidx.ui.text.font.SystemFontFamily {
-    method public String getName();
-  }
-
-  public final class LoadedFontFamily extends androidx.ui.text.font.FontFamily {
-    ctor public LoadedFontFamily(androidx.ui.text.Typeface typeface);
-    method public androidx.ui.text.Typeface component1();
-    method public androidx.ui.text.font.LoadedFontFamily copy(androidx.ui.text.Typeface typeface);
-    method public androidx.ui.text.Typeface getTypeface();
-  }
-
-  public final class ResourceFont implements androidx.ui.text.font.Font {
-    ctor public ResourceFont(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
-    method public int component1();
-    method public androidx.ui.text.font.FontWeight component2();
-    method public androidx.ui.text.font.FontStyle component3();
-    method public androidx.ui.text.font.ResourceFont copy(int resId, androidx.ui.text.font.FontWeight weight, androidx.ui.text.font.FontStyle style);
-    method public int getResId();
-    method public androidx.ui.text.font.FontStyle getStyle();
-    method public androidx.ui.text.font.FontWeight getWeight();
-  }
-
-  public abstract sealed class SystemFontFamily extends androidx.ui.text.font.FontFamily {
-  }
-
-}
-
-package androidx.ui.text.platform {
-
-  public final class AndroidParagraphHelperKt {
-  }
-
-  public final class AndroidParagraphKt {
-  }
-
-  public final class PlatformLocaleKt {
-  }
-
-}
-
-package androidx.ui.text.style {
-
-  public final class BaselineShift {
-    ctor public BaselineShift(float multiplier);
-    method public float component1();
-    method public androidx.ui.text.style.BaselineShift copy(float multiplier);
-    method public float getMultiplier();
-    field public static final androidx.ui.text.style.BaselineShift.Companion! Companion;
-  }
-
-  public static final class BaselineShift.Companion {
-    method public androidx.ui.text.style.BaselineShift getNone();
-    method public androidx.ui.text.style.BaselineShift getSubscript();
-    method public androidx.ui.text.style.BaselineShift getSuperscript();
-    property public final androidx.ui.text.style.BaselineShift None;
-    property public final androidx.ui.text.style.BaselineShift Subscript;
-    property public final androidx.ui.text.style.BaselineShift Superscript;
-  }
-
-  public final class BaselineShiftKt {
-    method public static androidx.ui.text.style.BaselineShift lerp(androidx.ui.text.style.BaselineShift start, androidx.ui.text.style.BaselineShift stop, float fraction);
-  }
-
-  public enum TextAlign {
-    enum_constant public static final androidx.ui.text.style.TextAlign Center;
-    enum_constant public static final androidx.ui.text.style.TextAlign End;
-    enum_constant public static final androidx.ui.text.style.TextAlign Justify;
-    enum_constant public static final androidx.ui.text.style.TextAlign Left;
-    enum_constant public static final androidx.ui.text.style.TextAlign Right;
-    enum_constant public static final androidx.ui.text.style.TextAlign Start;
-  }
-
-  public final class TextDecoration {
-    method public int component1();
-    method public boolean contains(androidx.ui.text.style.TextDecoration other);
-    method public androidx.ui.text.style.TextDecoration copy(int mask);
-    method public int getMask();
-    field public static final androidx.ui.text.style.TextDecoration.Companion! Companion;
-  }
-
-  public static final class TextDecoration.Companion {
-    method public androidx.ui.text.style.TextDecoration combine(java.util.List<androidx.ui.text.style.TextDecoration> decorations);
-    method public androidx.ui.text.style.TextDecoration getLineThrough();
-    method public androidx.ui.text.style.TextDecoration getNone();
-    method public androidx.ui.text.style.TextDecoration getUnderline();
-    property public final androidx.ui.text.style.TextDecoration LineThrough;
-    property public final androidx.ui.text.style.TextDecoration None;
-    property public final androidx.ui.text.style.TextDecoration Underline;
-  }
-
-  public enum TextDirection {
-    enum_constant public static final androidx.ui.text.style.TextDirection Ltr;
-    enum_constant public static final androidx.ui.text.style.TextDirection Rtl;
-  }
-
-  public enum TextDirectionAlgorithm {
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrLtr;
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ContentOrRtl;
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceLtr;
-    enum_constant public static final androidx.ui.text.style.TextDirectionAlgorithm ForceRtl;
-  }
-
-  public final class TextGeometricTransform {
-    ctor public TextGeometricTransform(float scaleX, float skewX);
-    ctor public TextGeometricTransform();
-    method public float component1();
-    method public float component2();
-    method public androidx.ui.text.style.TextGeometricTransform copy(float scaleX, float skewX);
-    method public float getScaleX();
-    method public float getSkewX();
-    field public static final androidx.ui.text.style.TextGeometricTransform.Companion! Companion;
-  }
-
-  public static final class TextGeometricTransform.Companion {
-  }
-
-  public final class TextGeometricTransformKt {
-    method public static androidx.ui.text.style.TextGeometricTransform lerp(androidx.ui.text.style.TextGeometricTransform start, androidx.ui.text.style.TextGeometricTransform stop, float fraction);
-  }
-
-  public final class TextIndent {
-    ctor public TextIndent(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
-    ctor public TextIndent();
-    method public androidx.ui.unit.TextUnit component1();
-    method public androidx.ui.unit.TextUnit component2();
-    method public androidx.ui.text.style.TextIndent copy(androidx.ui.unit.TextUnit firstLine, androidx.ui.unit.TextUnit restLine);
-    method public androidx.ui.unit.TextUnit getFirstLine();
-    method public androidx.ui.unit.TextUnit getRestLine();
-    field public static final androidx.ui.text.style.TextIndent.Companion! Companion;
-  }
-
-  public static final class TextIndent.Companion {
-    method public androidx.ui.text.style.TextIndent getNone();
-    property public final androidx.ui.text.style.TextIndent None;
-  }
-
-  public final class TextIndentKt {
-    method public static androidx.ui.text.style.TextIndent lerp(androidx.ui.text.style.TextIndent start, androidx.ui.text.style.TextIndent stop, float fraction);
-  }
-
-  public enum TextOverflow {
-    enum_constant public static final androidx.ui.text.style.TextOverflow Clip;
-    enum_constant public static final androidx.ui.text.style.TextOverflow Ellipsis;
+  public final class TextSelectionDelegateKt {
   }
 
 }
diff --git a/ui/ui-text/build.gradle b/ui/ui-text/build.gradle
index c300c3c..8ed6c32 100644
--- a/ui/ui-text/build.gradle
+++ b/ui/ui-text/build.gradle
@@ -29,17 +29,11 @@
 }
 
 dependencies {
+    kotlinPlugin project(path: ":compose:compose-compiler")
     implementation(KOTLIN_STDLIB)
-
-    // TODO: Non-Kotlin dependency, move to Android-specific code
-    implementation "androidx.collection:collection:1.1.0"
-    // TODO: Non-Kotlin dependency, move to Android-specific code
-    implementation "androidx.core:core:1.0.2"
-
     implementation project(":compose:compose-runtime")
-    implementation project(":ui:ui-util")
-    implementation project(":ui:ui-android-text")
-    api project(":ui:ui-core")
+    api project(":ui:ui-framework")
+    api project(":ui:ui-text-core")
 
     testImplementation(ANDROIDX_TEST_RULES)
     testImplementation(ANDROIDX_TEST_RUNNER)
@@ -51,6 +45,11 @@
         exclude group: 'org.mockito' // to keep control on the mockito version
     }
 
+    androidTestImplementation project(":ui:ui-test")
+    // SelectionContainerTest and TextLayoutTest depends on ui-platform
+    androidTestImplementation project(":ui:ui-platform")
+    androidTestImplementation project(":ui:ui-test-font")
+    androidTestImplementation "androidx.core:core:1.0.2"
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
@@ -64,12 +63,12 @@
 }
 
 androidx {
-    name = "AndroidX UI Text"
+    name = "AndroidX UI Text Composables"
     publish = Publish.SNAPSHOT_AND_RELEASE
     mavenVersion = LibraryVersions.UI
     mavenGroup = LibraryGroups.UI
-    inceptionYear = "2019"
-    description = "AndroidX UI Text"
+    inceptionYear = "2020"
+    description = "AndroidX UI base Text composables for building up higher level text."
 }
 
 tasks.withType(KotlinCompile).configureEach {
@@ -77,3 +76,11 @@
         useIR = true
     }
 }
+
+android {
+    buildTypes {
+        debug {
+            testCoverageEnabled = false // Breaks Kotlin compiler.
+        }
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-text/integration-tests/text-demos/build.gradle b/ui/ui-text/integration-tests/ui-text-compose-demos/build.gradle
similarity index 83%
copy from ui/ui-text/integration-tests/text-demos/build.gradle
copy to ui/ui-text/integration-tests/ui-text-compose-demos/build.gradle
index 60287ed..40a49c8 100644
--- a/ui/ui-text/integration-tests/text-demos/build.gradle
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/build.gradle
@@ -17,11 +17,9 @@
     implementation project(":compose:compose-runtime")
     implementation project(":ui:integration-tests:demos:common")
     implementation project(":ui:ui-core")
-    implementation project(":ui:ui-framework")
-    implementation project(":ui:ui-foundation")
     implementation project(":ui:ui-layout")
-    implementation project(":ui:ui-text")
-    implementation project(":ui:ui-text:samples")
+    implementation project(":ui:ui-text-core")
+    implementation project(":ui:ui-framework")
 }
 
 android {
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/AndroidManifest.xml b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..590b236
--- /dev/null
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<!--
+  ~ Copyright (C) 2016 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+<manifest package="androidx.ui.text.demos"/>
diff --git a/ui/ui-text/samples/build.gradle b/ui/ui-text/samples/build.gradle
index b58854b..e322408 100644
--- a/ui/ui-text/samples/build.gradle
+++ b/ui/ui-text/samples/build.gradle
@@ -33,10 +33,9 @@
     implementation project(":annotation:annotation-sampled")
 
     implementation project(":compose:compose-runtime")
-    implementation project(":ui:ui-core")
-    implementation project(":ui:ui-foundation")
     implementation project(":ui:ui-framework")
-    implementation project(":ui:ui-text")
+    implementation project(":ui:ui-foundation")
+    implementation project(":ui:ui-core")
 }
 
 android {
diff --git a/ui/ui-text/samples/src/main/AndroidManifest.xml b/ui/ui-text/samples/src/main/AndroidManifest.xml
index 361b69f..e6f6f34 100644
--- a/ui/ui-text/samples/src/main/AndroidManifest.xml
+++ b/ui/ui-text/samples/src/main/AndroidManifest.xml
@@ -14,4 +14,4 @@
   limitations under the License.
   -->
 
-<manifest package="androidx.ui.text.samples" />
+<manifest package="androidx.ui.text.samples" />
\ No newline at end of file
diff --git a/ui/ui-text/src/androidTest/AndroidManifest.xml b/ui/ui-text/src/androidTest/AndroidManifest.xml
index a35af48..2349c27 100644
--- a/ui/ui-text/src/androidTest/AndroidManifest.xml
+++ b/ui/ui-text/src/androidTest/AndroidManifest.xml
@@ -1,17 +1,21 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2019 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
 
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
+     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
+          http://www.apache.org/licenses/LICENSE-2.0
 
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-  -->
-<manifest package="androidx.ui.text.test" />
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.ui.text.test">
+    <application>
+        <activity android:name="androidx.activity.ComponentActivity" />
+    </application>
+</manifest>
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/TextFieldDelegateIntegrationTest.kt b/ui/ui-text/src/androidTest/java/androidx/ui/text/TextFieldDelegateIntegrationTest.kt
similarity index 96%
rename from ui/ui-framework/src/androidTest/java/androidx/ui/core/TextFieldDelegateIntegrationTest.kt
rename to ui/ui-text/src/androidTest/java/androidx/ui/text/TextFieldDelegateIntegrationTest.kt
index 0e1125e..433f5bb 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/TextFieldDelegateIntegrationTest.kt
+++ b/ui/ui-text/src/androidTest/java/androidx/ui/text/TextFieldDelegateIntegrationTest.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.ui.core
+package androidx.ui.text
 
 import android.content.Context
 import android.graphics.Bitmap
@@ -22,17 +22,13 @@
 import androidx.core.content.res.ResourcesCompat
 import androidx.test.filters.SmallTest
 import androidx.test.platform.app.InstrumentationRegistry
+import androidx.ui.core.Constraints
+import androidx.ui.core.LayoutDirection
 import androidx.ui.graphics.Canvas
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.Paint
 import androidx.ui.input.EditorValue
 import androidx.ui.input.OffsetMap
-import androidx.ui.text.AnnotatedString
-import androidx.ui.text.TextDelegate
-import androidx.ui.text.TextLayoutResult
-import androidx.ui.text.TextPainter
-import androidx.ui.text.TextRange
-import androidx.ui.text.TextStyle
 import androidx.ui.text.font.Font
 import androidx.ui.text.font.ResourceFont
 import androidx.ui.unit.Density
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/TextFieldFocusTest.kt b/ui/ui-text/src/androidTest/java/androidx/ui/text/TextFieldFocusTest.kt
similarity index 79%
rename from ui/ui-framework/src/androidTest/java/androidx/ui/core/TextFieldFocusTest.kt
rename to ui/ui-text/src/androidTest/java/androidx/ui/text/TextFieldFocusTest.kt
index 3b32f1d..325bf24 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/TextFieldFocusTest.kt
+++ b/ui/ui-text/src/androidTest/java/androidx/ui/text/TextFieldFocusTest.kt
@@ -14,16 +14,22 @@
  * limitations under the License.
  */
 
-package androidx.ui.core
+package androidx.ui.text
 
 import androidx.compose.Composable
 import androidx.compose.Providers
 import androidx.compose.state
 import androidx.test.filters.LargeTest
-import androidx.ui.core.input.FocusManagerImpl
+import androidx.ui.core.FocusManagerAmbient
+import androidx.ui.core.Modifier
+import androidx.ui.core.TestTag
+import androidx.ui.core.TextInputServiceAmbient
+import androidx.ui.core.input.FocusManager
 import androidx.ui.input.EditorValue
 import androidx.ui.input.TextInputService
 import androidx.ui.test.createComposeRule
+import androidx.ui.test.runOnIdleCompose
+import androidx.ui.test.runOnUiThread
 import com.google.common.truth.Truth.assertThat
 import com.nhaarman.mockitokotlin2.any
 import com.nhaarman.mockitokotlin2.mock
@@ -47,7 +53,7 @@
             val editor = state { EditorValue() }
             CoreTextField(
                 value = editor.value,
-                modifier = Modifier.None,
+                modifier = Modifier,
                 onValueChange = {
                     editor.value = it
                 },
@@ -60,7 +66,6 @@
 
     @Test
     fun requestFocus() {
-        val focusManager = FocusManagerImpl()
         val inputSessionToken = 10
         val textInputService = mock<TextInputService>()
         whenever(textInputService.startInput(any(), any(), any(), any(), any()))
@@ -72,33 +77,34 @@
             FocusTestData("ID3")
         )
 
+        lateinit var focusManager: FocusManager
         composeTestRule.setContent {
             Providers(
-                FocusManagerAmbient provides focusManager,
                 TextInputServiceAmbient provides textInputService
             ) {
+                focusManager = FocusManagerAmbient.current
                 TestTag(tag = "textField") {
                     TextFieldApp(testDataList)
                 }
             }
         }
 
-        composeTestRule.runOnUiThread { focusManager.requestFocusById(testDataList[0].id) }
-        composeTestRule.runOnIdleCompose {
+        runOnUiThread { focusManager.requestFocusById(testDataList[0].id) }
+        runOnIdleCompose {
             assertThat(testDataList[0].focused).isTrue()
             assertThat(testDataList[1].focused).isFalse()
             assertThat(testDataList[2].focused).isFalse()
         }
 
-        composeTestRule.runOnUiThread { focusManager.requestFocusById(testDataList[1].id) }
-        composeTestRule.runOnIdleCompose {
+        runOnUiThread { focusManager.requestFocusById(testDataList[1].id) }
+        runOnIdleCompose {
             assertThat(testDataList[0].focused).isFalse()
             assertThat(testDataList[1].focused).isTrue()
             assertThat(testDataList[2].focused).isFalse()
         }
 
-        composeTestRule.runOnUiThread { focusManager.requestFocusById(testDataList[2].id) }
-        composeTestRule.runOnIdleCompose {
+        runOnUiThread { focusManager.requestFocusById(testDataList[2].id) }
+        runOnIdleCompose {
             assertThat(testDataList[0].focused).isFalse()
             assertThat(testDataList[1].focused).isFalse()
             assertThat(testDataList[2].focused).isTrue()
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/TextLayoutTest.kt b/ui/ui-text/src/androidTest/java/androidx/ui/text/TextLayoutTest.kt
similarity index 69%
rename from ui/ui-framework/src/androidTest/java/androidx/ui/core/TextLayoutTest.kt
rename to ui/ui-text/src/androidTest/java/androidx/ui/text/TextLayoutTest.kt
index e4e1d97..c1011b4 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/TextLayoutTest.kt
+++ b/ui/ui-text/src/androidTest/java/androidx/ui/text/TextLayoutTest.kt
@@ -14,22 +14,25 @@
  * limitations under the License.
  */
 
-package androidx.ui.core
+package androidx.ui.text
 
+import android.app.Activity
+import androidx.activity.ComponentActivity
 import androidx.compose.Composable
 import androidx.compose.remember
 import androidx.test.filters.SmallTest
 import androidx.test.rule.ActivityTestRule
-import androidx.ui.framework.test.R
-import androidx.ui.framework.test.TestActivity
-import androidx.ui.layout.rtl
-import androidx.ui.text.AnnotatedString
-import androidx.ui.text.TextLayoutResult
-import androidx.ui.text.TextStyle
+import androidx.ui.core.Constraints
+import androidx.ui.core.Layout
+import androidx.ui.core.Modifier
+import androidx.ui.core.Ref
+import androidx.ui.core.onPositioned
+import androidx.ui.core.setContent
 import androidx.ui.text.font.FontStyle
 import androidx.ui.text.font.FontWeight
 import androidx.ui.text.font.asFontFamily
 import androidx.ui.text.font.font
+import androidx.ui.text.font.test.R
 import androidx.ui.text.style.TextOverflow
 import androidx.ui.unit.Density
 import androidx.ui.unit.IntPx
@@ -41,9 +44,6 @@
 import com.nhaarman.mockitokotlin2.mock
 import com.nhaarman.mockitokotlin2.times
 import com.nhaarman.mockitokotlin2.verify
-import org.junit.Assert.assertEquals
-import org.junit.Assert.assertNotNull
-import org.junit.Assert.assertTrue
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
@@ -56,8 +56,8 @@
 @SmallTest
 class TextLayoutTest {
     @get:Rule
-    internal val activityTestRule = ActivityTestRule(TestActivity::class.java)
-    private lateinit var activity: TestActivity
+    internal val activityTestRule = ActivityTestRule(ComponentActivity::class.java)
+    private lateinit var activity: Activity
     private lateinit var density: Density
 
     @Before
@@ -86,13 +86,13 @@
                 }
             )
         }
-        assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
-        assertNotNull(textSize.value)
-        assertNotNull(doubleTextSize.value)
-        assertTrue(textSize.value!!.width > 0.px)
-        assertTrue(textSize.value!!.height > 0.px)
-        assertEquals(textSize.value!!.width * 2, doubleTextSize.value!!.width)
-        assertEquals(textSize.value!!.height, doubleTextSize.value!!.height)
+        assertThat(layoutLatch.await(1, TimeUnit.SECONDS)).isTrue()
+        assertThat(textSize.value).isNotNull()
+        assertThat(doubleTextSize.value).isNotNull()
+        assertThat(textSize.value!!.width).isGreaterThan(0.ipx)
+        assertThat(textSize.value!!.height).isGreaterThan(0.ipx)
+        assertThat(textSize.value!!.width * 2).isEqualTo(doubleTextSize.value!!.width)
+        assertThat(textSize.value!!.height).isEqualTo(doubleTextSize.value!!.height)
     }
 
     @Test
@@ -114,7 +114,7 @@
                 }
             )
         }
-        assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
+        assertThat(layoutLatch.await(1, TimeUnit.SECONDS)).isTrue()
         val textWidth = textSize.value!!.width
         val textHeight = textSize.value!!.height
         val doubleTextWidth = doubleTextSize.value!!.width
@@ -133,24 +133,24 @@
             ) { measurables, _, _ ->
                 val textMeasurable = measurables.first()
                 // Min width.
-                assertEquals(textWidth, textMeasurable.minIntrinsicWidth(0.ipx))
+                assertThat(textWidth).isEqualTo(textMeasurable.minIntrinsicWidth(0.ipx))
                 // Min height.
-                assertTrue(textMeasurable.minIntrinsicHeight(textWidth) > textHeight)
-                assertEquals(textHeight, textMeasurable.minIntrinsicHeight(doubleTextWidth))
-                assertEquals(textHeight, textMeasurable.minIntrinsicHeight(IntPx.Infinity))
+                assertThat(textMeasurable.minIntrinsicHeight(textWidth)).isGreaterThan(textHeight)
+                assertThat(textHeight).isEqualTo(textMeasurable.minIntrinsicHeight(doubleTextWidth))
+                assertThat(textHeight).isEqualTo(textMeasurable.minIntrinsicHeight(IntPx.Infinity))
                 // Max width.
-                assertEquals(doubleTextWidth, textMeasurable.maxIntrinsicWidth(0.ipx))
+                assertThat(doubleTextWidth).isEqualTo(textMeasurable.maxIntrinsicWidth(0.ipx))
                 // Max height.
-                assertTrue(textMeasurable.maxIntrinsicHeight(textWidth) > textHeight)
-                assertEquals(textHeight, textMeasurable.maxIntrinsicHeight(doubleTextWidth))
-                assertEquals(textHeight, textMeasurable.maxIntrinsicHeight(IntPx.Infinity))
+                assertThat(textMeasurable.maxIntrinsicHeight(textWidth)).isGreaterThan(textHeight)
+                assertThat(textHeight).isEqualTo(textMeasurable.maxIntrinsicHeight(doubleTextWidth))
+                assertThat(textHeight).isEqualTo(textMeasurable.maxIntrinsicHeight(IntPx.Infinity))
 
                 intrinsicsLatch.countDown()
 
                 layout(0.ipx, 0.ipx) {}
             }
         }
-        assertTrue(intrinsicsLatch.await(1, TimeUnit.SECONDS))
+        assertThat(intrinsicsLatch.await(1, TimeUnit.SECONDS)).isTrue()
     }
 
     @Test
@@ -162,22 +162,23 @@
             }
             Layout(text) { measurables, _, _ ->
                 val placeable = measurables.first().measure(Constraints())
-                assertNotNull(placeable[FirstBaseline])
-                assertNotNull(placeable[LastBaseline])
-                assertEquals(placeable[FirstBaseline], placeable[LastBaseline])
+                assertThat(placeable[FirstBaseline]).isNotNull()
+                assertThat(placeable[LastBaseline]).isNotNull()
+                assertThat(placeable[FirstBaseline]).isEqualTo(placeable[LastBaseline])
                 layoutLatch.countDown()
                 layout(0.ipx, 0.ipx) {}
             }
             Layout(text) { measurables, _, _ ->
                 val placeable = measurables.first().measure(Constraints(maxWidth = 0.ipx))
-                assertNotNull(placeable[FirstBaseline])
-                assertNotNull(placeable[LastBaseline])
-                assertTrue(placeable[FirstBaseline]!!.value < placeable[LastBaseline]!!.value)
+                assertThat(placeable[FirstBaseline]).isNotNull()
+                assertThat(placeable[LastBaseline]).isNotNull()
+                assertThat(placeable[FirstBaseline])
+                    .isLessThan(placeable[LastBaseline])
                 layoutLatch.countDown()
                 layout(0.ipx, 0.ipx) {}
             }
         }
-        assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
+        assertThat(layoutLatch.await(1, TimeUnit.SECONDS)).isTrue()
     }
 
     @Test
@@ -194,33 +195,10 @@
                 layout(0.ipx, 0.ipx) {}
             }
         }
-        assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
+        assertThat(layoutLatch.await(1, TimeUnit.SECONDS)).isTrue()
         verify(callback, times(1)).invoke(any())
     }
 
-    @Test
-    fun testCorrectLayoutDirection() {
-        val latch = CountDownLatch(1)
-        var layoutDirection: LayoutDirection? = null
-        show {
-            CoreText(
-                text = AnnotatedString("..."),
-                modifier = Modifier.rtl,
-                style = TextStyle.Default,
-                softWrap = true,
-                overflow = TextOverflow.Clip,
-                maxLines = 1
-            ) { result ->
-                layoutDirection = result.layoutInput.layoutDirection
-                latch.countDown()
-            }
-        }
-
-        assertThat(latch.await(1, TimeUnit.SECONDS)).isTrue()
-        assertThat(layoutDirection).isNotNull()
-        assertThat(layoutDirection!!).isEqualTo(LayoutDirection.Rtl)
-    }
-
     private fun show(composable: @Composable() () -> Unit) {
         val runnable: Runnable = object : Runnable {
             override fun run() {
@@ -247,7 +225,7 @@
 @Composable
 private fun TestingText(
     text: String,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     onTextLayout: (TextLayoutResult) -> Unit = {}
 ) {
     val textStyle = remember {
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/selection/MotionEventTestUtils.kt b/ui/ui-text/src/androidTest/java/androidx/ui/text/selection/MotionEventTestUtils.kt
new file mode 100644
index 0000000..13a7b00
--- /dev/null
+++ b/ui/ui-text/src/androidTest/java/androidx/ui/text/selection/MotionEventTestUtils.kt
@@ -0,0 +1,54 @@
+/*
+ * 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.ui.text.selection
+
+import android.view.MotionEvent
+
+internal fun MotionEvent(
+    eventTime: Int,
+    action: Int,
+    numPointers: Int,
+    actionIndex: Int,
+    pointerProperties: Array<MotionEvent.PointerProperties>,
+    pointerCoords: Array<MotionEvent.PointerCoords>
+) = MotionEvent.obtain(
+    0,
+    eventTime.toLong(),
+    action + (actionIndex shl MotionEvent.ACTION_POINTER_INDEX_SHIFT),
+    numPointers,
+    pointerProperties,
+    pointerCoords,
+    0,
+    0,
+    0f,
+    0f,
+    0,
+    0,
+    0,
+    0
+)
+
+@Suppress("RemoveRedundantQualifierName")
+internal fun PointerProperties(id: Int) =
+    MotionEvent.PointerProperties().apply { this.id = id }
+
+@Suppress("RemoveRedundantQualifierName")
+internal fun PointerCoords(x: Float, y: Float) =
+    MotionEvent.PointerCoords().apply {
+        this.x = x
+        this.y = y
+    }
\ No newline at end of file
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/selection/SelectionContainerTest.kt b/ui/ui-text/src/androidTest/java/androidx/ui/text/selection/SelectionContainerTest.kt
similarity index 90%
rename from ui/ui-framework/src/androidTest/java/androidx/ui/core/selection/SelectionContainerTest.kt
rename to ui/ui-text/src/androidTest/java/androidx/ui/text/selection/SelectionContainerTest.kt
index 3ee2f50..a81e35c 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/selection/SelectionContainerTest.kt
+++ b/ui/ui-text/src/androidTest/java/androidx/ui/text/selection/SelectionContainerTest.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * 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.
@@ -14,31 +14,31 @@
  * limitations under the License.
  */
 
-package androidx.ui.core.selection
+package androidx.ui.text.selection
 
-import android.R
-import android.app.Activity
 import android.view.MotionEvent
 import android.view.View
 import android.view.ViewGroup
+import androidx.activity.ComponentActivity
 import androidx.compose.Providers
 import androidx.compose.mutableStateOf
 import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
-import androidx.ui.core.CoreText
 import androidx.ui.core.HapticFeedBackAmbient
-import androidx.ui.core.gesture.MotionEvent
-import androidx.ui.core.gesture.PointerCoords
-import androidx.ui.core.gesture.PointerProperties
 import androidx.ui.core.hapticfeedback.HapticFeedback
 import androidx.ui.core.hapticfeedback.HapticFeedbackType
+import androidx.ui.core.selection.Selection
+import androidx.ui.core.selection.SelectionContainer
 import androidx.ui.test.android.AndroidComposeTestRule
+import androidx.ui.test.runOnIdleCompose
 import androidx.ui.text.AnnotatedString
+import androidx.ui.text.CoreText
 import androidx.ui.text.TextStyle
 import androidx.ui.text.font.FontStyle
 import androidx.ui.text.font.FontWeight
 import androidx.ui.text.font.ResourceFont
 import androidx.ui.text.font.asFontFamily
+import androidx.ui.text.font.test.R
 import androidx.ui.text.style.TextOverflow
 import androidx.ui.unit.px
 import androidx.ui.unit.sp
@@ -58,7 +58,7 @@
 @RunWith(JUnit4::class)
 class SelectionContainerTest {
     @get:Rule
-    val composeTestRule = AndroidComposeTestRule<Activity>()
+    val composeTestRule = AndroidComposeTestRule<ComponentActivity>()
 
     private val activity
         get() = composeTestRule.activityTestRule.activity
@@ -67,7 +67,7 @@
 
     private val textContent = "Text Demo Text Demo"
     private val fontFamily = ResourceFont(
-        resId = androidx.ui.framework.test.R.font.sample_font,
+        resId = R.font.sample_font,
         weight = FontWeight.Normal,
         style = FontStyle.Normal
     ).asFontFamily()
@@ -103,7 +103,7 @@
                 }
             }
         }
-        view = activity.findViewById<ViewGroup>(R.id.content)
+        view = activity.findViewById<ViewGroup>(android.R.id.content)
     }
 
     @Test
@@ -113,7 +113,7 @@
         // A reasonable number.
         val position = 50.px
         longPress(x = position.value, y = position.value)
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(selection.value).isNotNull()
         }
 
@@ -121,7 +121,7 @@
         press(x = position.value, y = position.value)
 
         // Assert.
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(selection.value).isNull()
             verify(
                 hapticFeedback,
@@ -142,7 +142,7 @@
         )
 
         // Assert. Should select "Demo".
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(selection.value!!.start.offset).isEqualTo(textContent.indexOf('D'))
             assertThat(selection.value!!.end.offset).isEqualTo(textContent.indexOf('o') + 1)
             verify(
@@ -169,7 +169,7 @@
         )
 
         // Assert.
-        composeTestRule.runOnIdleCompose {
+        runOnIdleCompose {
             assertThat(selection.value!!.start.offset).isEqualTo(startOffset)
             assertThat(selection.value!!.end.offset).isEqualTo("Text Demo".length)
             verify(
@@ -241,11 +241,11 @@
 
     private fun waitForLongPress(block: () -> Unit) {
         gestureCountDownLatch = CountDownLatch(1)
-        composeTestRule.runOnIdleCompose(block)
+        runOnIdleCompose(block)
         gestureCountDownLatch.await(750, TimeUnit.MILLISECONDS)
     }
 
     private fun waitForOtherGesture(block: () -> Unit) {
-        composeTestRule.runOnIdleCompose(block)
+        runOnIdleCompose(block)
     }
 }
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/selection/TextSelectionDelegateTest.kt b/ui/ui-text/src/androidTest/java/androidx/ui/text/selection/TextSelectionDelegateTest.kt
similarity index 99%
rename from ui/ui-framework/src/androidTest/java/androidx/ui/core/selection/TextSelectionDelegateTest.kt
rename to ui/ui-text/src/androidTest/java/androidx/ui/text/selection/TextSelectionDelegateTest.kt
index 8fa65b8..0617795 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/selection/TextSelectionDelegateTest.kt
+++ b/ui/ui-text/src/androidTest/java/androidx/ui/text/selection/TextSelectionDelegateTest.kt
@@ -14,18 +14,19 @@
  * limitations under the License.
  */
 
-package androidx.ui.core.selection
+package androidx.ui.text.selection
 
-import android.app.Activity
 import android.content.Context
 import android.graphics.Typeface
+import androidx.activity.ComponentActivity
 import androidx.core.content.res.ResourcesCompat
 import androidx.test.filters.SmallTest
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.ui.core.Constraints
 import androidx.ui.core.LayoutCoordinates
 import androidx.ui.core.LayoutDirection
-import androidx.ui.framework.test.R
+import androidx.ui.core.selection.Selectable
+import androidx.ui.core.selection.Selection
 import androidx.ui.test.android.AndroidComposeTestRule
 import androidx.ui.text.AnnotatedString
 import androidx.ui.text.SpanStyle
@@ -33,11 +34,12 @@
 import androidx.ui.text.TextLayoutResult
 import androidx.ui.text.TextStyle
 import androidx.ui.text.font.Font
-import androidx.ui.text.font.font
 import androidx.ui.text.font.FontStyle
 import androidx.ui.text.font.FontWeight
 import androidx.ui.text.font.ResourceFont
 import androidx.ui.text.font.asFontFamily
+import androidx.ui.text.font.font
+import androidx.ui.text.font.test.R
 import androidx.ui.text.style.TextDirection
 import androidx.ui.unit.Density
 import androidx.ui.unit.PxPosition
@@ -62,7 +64,7 @@
 @SmallTest
 class TextSelectionDelegateTest {
     @get:Rule
-    val composeTestRule = AndroidComposeTestRule<Activity>()
+    val composeTestRule = AndroidComposeTestRule<ComponentActivity>()
 
     private val fontFamily = BASIC_MEASURE_FONT.asFontFamily()
     private val context = InstrumentationRegistry.getInstrumentation().context
diff --git a/ui/ui-text/src/main/AndroidManifest.xml b/ui/ui-text/src/main/AndroidManifest.xml
index fd766f4..7f42466 100644
--- a/ui/ui-text/src/main/AndroidManifest.xml
+++ b/ui/ui-text/src/main/AndroidManifest.xml
@@ -1,17 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2019 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
 
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
+     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
+          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.
-  -->
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
 <manifest package="androidx.ui.text" />
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/CoreText.kt b/ui/ui-text/src/main/java/androidx/ui/text/CoreText.kt
similarity index 94%
rename from ui/ui-framework/src/main/java/androidx/ui/core/CoreText.kt
rename to ui/ui-text/src/main/java/androidx/ui/text/CoreText.kt
index f1a7464..428767f 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/CoreText.kt
+++ b/ui/ui-text/src/main/java/androidx/ui/text/CoreText.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package androidx.ui.core
+package androidx.ui.text
 
 import androidx.compose.Composable
 import androidx.compose.StructurallyEqual
@@ -23,16 +23,20 @@
 import androidx.compose.onCommit
 import androidx.compose.remember
 import androidx.compose.setValue
+import androidx.ui.core.Constraints
+import androidx.ui.core.DensityAmbient
+import androidx.ui.core.FontLoaderAmbient
+import androidx.ui.core.HorizontalAlignmentLine
+import androidx.ui.core.Layout
+import androidx.ui.core.LayoutCoordinates
+import androidx.ui.core.Modifier
+import androidx.ui.core.drawBehind
+import androidx.ui.core.onPositioned
 import androidx.ui.core.selection.Selectable
 import androidx.ui.core.selection.SelectionRegistrarAmbient
-import androidx.ui.core.selection.TextSelectionDelegate
 import androidx.ui.graphics.Color
-import androidx.ui.text.AnnotatedString
-import androidx.ui.text.TextDelegate
-import androidx.ui.text.TextLayoutResult
-import androidx.ui.text.TextRange
-import androidx.ui.text.TextStyle
 import androidx.ui.text.font.Font
+import androidx.ui.text.selection.TextSelectionDelegate
 import androidx.ui.text.style.TextAlign
 import androidx.ui.text.style.TextOverflow
 import androidx.ui.unit.Density
@@ -67,7 +71,7 @@
 @Composable
 fun CoreText(
     text: AnnotatedString,
-    modifier: Modifier = Modifier.None,
+    modifier: Modifier = Modifier,
     style: TextStyle,
     softWrap: Boolean,
     overflow: TextOverflow,
@@ -108,18 +112,18 @@
 
     Layout(
         children = emptyContent(),
-        modifier = modifier.drawBehind { canvas, _ ->
+        modifier = modifier.drawBehind {
             state.layoutResult?.let { layoutResult ->
                 state.selectionRange?.let {
                     TextDelegate.paintBackground(
                         it.min,
                         it.max,
                         DefaultSelectionColor,
-                        canvas,
+                        this,
                         layoutResult
                     )
                 }
-                TextDelegate.paint(canvas, layoutResult)
+                TextDelegate.paint(this, layoutResult)
             }
         }.onPositioned {
             // Get the layout coordinates of the text composable. This is for hit test of
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/CoreTextField.kt b/ui/ui-text/src/main/java/androidx/ui/text/CoreTextField.kt
similarity index 89%
rename from ui/ui-framework/src/main/java/androidx/ui/core/CoreTextField.kt
rename to ui/ui-text/src/main/java/androidx/ui/text/CoreTextField.kt
index 70529ce..a3c60cf 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/CoreTextField.kt
+++ b/ui/ui-text/src/main/java/androidx/ui/text/CoreTextField.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package androidx.ui.core
+package androidx.ui.text
 
 import androidx.compose.Composable
 import androidx.compose.emptyContent
@@ -23,22 +23,30 @@
 import androidx.compose.remember
 import androidx.compose.setValue
 import androidx.compose.state
-import androidx.ui.core.gesture.DragGestureDetector
+import androidx.ui.core.DensityAmbient
+import androidx.ui.core.FocusManagerAmbient
+import androidx.ui.core.FontLoaderAmbient
+import androidx.ui.core.Layout
+import androidx.ui.core.LayoutCoordinates
+import androidx.ui.core.Modifier
+import androidx.ui.core.PassThroughLayout
+import androidx.ui.core.TextInputServiceAmbient
+import androidx.ui.core.drawBehind
 import androidx.ui.core.gesture.DragObserver
-import androidx.ui.core.gesture.PressIndicatorGestureDetector
+import androidx.ui.core.gesture.dragGestureFilter
+import androidx.ui.core.gesture.pressIndicatorGestureFilter
 import androidx.ui.core.input.FocusNode
+import androidx.ui.core.onPositioned
 import androidx.ui.input.EditProcessor
-import androidx.ui.input.ImeAction
 import androidx.ui.input.EditorValue
+import androidx.ui.input.ImeAction
 import androidx.ui.input.KeyboardType
 import androidx.ui.input.NO_SESSION
 import androidx.ui.input.VisualTransformation
 import androidx.ui.semantics.Semantics
 import androidx.ui.semantics.onClick
-import androidx.ui.text.TextDelegate
-import androidx.ui.text.TextLayoutResult
-import androidx.ui.text.TextStyle
 import androidx.ui.unit.PxPosition
+import androidx.ui.unit.round
 
 /**
  * The common TextField implementation.
@@ -92,8 +100,6 @@
         state.textDelegate = updateTextDelegate(
             current = state.textDelegate,
             text = visualText,
-            // TODO(143536715): TextField should use currentTextStyle() here, so we need a higher
-            // level TextField
             style = textStyle,
             density = density,
             resourceLoader = resourceLoader
@@ -112,7 +118,8 @@
                     keyboardType,
                     imeAction,
                     onValueChangeWrapper,
-                    onImeActionPerformed)
+                    onImeActionPerformed
+                )
                 state.layoutCoordinates?.let { coords ->
                     textInputService?.let { textInputService ->
                         state.layoutResult?.let { layoutResult ->
@@ -138,7 +145,8 @@
                     state.inputSession,
                     state.processor,
                     hasNextClient,
-                    onValueChangeWrapper)
+                    onValueChangeWrapper
+                )
                 onBlur()
             },
             onRelease = {
@@ -158,10 +166,10 @@
         ) {
             Layout(
                 emptyContent(),
-                modifier.drawBehind { canvas, _ ->
+                modifier.drawBehind {
                     state.layoutResult?.let { layoutResult ->
                         TextFieldDelegate.draw(
-                            canvas,
+                            this,
                             value,
                             offsetMap,
                             layoutResult,
@@ -197,7 +205,14 @@
                         state.layoutResult = result
                         onTextLayout(result)
                     }
-                    layout(width, height) {}
+                    layout(
+                        width,
+                        height,
+                        mapOf(
+                            FirstBaseline to result.firstBaseline.round(),
+                            LastBaseline to result.lastBaseline.round()
+                        )
+                    ) {}
                 }
             }
         }
@@ -270,7 +285,7 @@
             onClick(action = doFocusIn)
         }
     ) {
-        val drag = DragPositionGestureDetector(
+        val drag = Modifier.dragPositionGestureFilter(
             onPress = {
                 if (focused.value) {
                     onPress(it)
@@ -327,7 +342,7 @@
  * Helper composable for tracking drag position.
  */
 @Composable
-private fun DragPositionGestureDetector(
+private fun Modifier.dragPositionGestureFilter(
     onPress: (PxPosition) -> Unit,
     onRelease: (PxPosition) -> Unit
 ): Modifier {
@@ -336,23 +351,19 @@
     //  actually may be functionally correct, but might mostly suggest that it should not
     //  actually be called PressIndicator, but instead something else.
 
-    val pressIndicator =
-        PressIndicatorGestureDetector(
+    return this
+        .pressIndicatorGestureFilter(
             onStart = {
                 tracker.value.init(it)
                 onPress(it)
             }, onStop = {
                 onRelease(tracker.value.getPosition())
             })
-
-    val drag =
-        DragGestureDetector(dragObserver = object :
+        .dragGestureFilter(dragObserver = object :
             DragObserver {
             override fun onDrag(dragDistance: PxPosition): PxPosition {
                 tracker.value.onDrag(dragDistance)
                 return tracker.value.getPosition()
             }
         })
-
-    return pressIndicator + drag
 }
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/TextFieldDelegate.kt b/ui/ui-text/src/main/java/androidx/ui/text/TextFieldDelegate.kt
similarity index 89%
rename from ui/ui-framework/src/main/java/androidx/ui/core/TextFieldDelegate.kt
rename to ui/ui-text/src/main/java/androidx/ui/text/TextFieldDelegate.kt
index c7c4f12..d07ebb6 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/TextFieldDelegate.kt
+++ b/ui/ui-text/src/main/java/androidx/ui/text/TextFieldDelegate.kt
@@ -14,34 +14,28 @@
  * limitations under the License.
  */
 
-package androidx.ui.core
+package androidx.ui.text
 
+import androidx.ui.core.Constraints
+import androidx.ui.core.LayoutCoordinates
+import androidx.ui.core.LayoutDirection
 import androidx.ui.geometry.Rect
 import androidx.ui.graphics.Canvas
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.Paint
 import androidx.ui.input.EditOperation
 import androidx.ui.input.EditProcessor
+import androidx.ui.input.EditorValue
 import androidx.ui.input.FinishComposingTextEditOp
 import androidx.ui.input.INVALID_SESSION
 import androidx.ui.input.ImeAction
 import androidx.ui.input.InputSessionToken
-import androidx.ui.input.EditorValue
 import androidx.ui.input.KeyboardType
 import androidx.ui.input.OffsetMap
 import androidx.ui.input.SetSelectionEditOp
 import androidx.ui.input.TextInputService
 import androidx.ui.input.TransformedText
 import androidx.ui.input.VisualTransformation
-import androidx.ui.text.AnnotatedString
-import androidx.ui.text.Paragraph
-import androidx.ui.text.ParagraphConstraints
-import androidx.ui.text.SpanStyle
-import androidx.ui.text.TextDelegate
-import androidx.ui.text.TextLayoutResult
-import androidx.ui.text.TextPainter
-import androidx.ui.text.TextRange
-import androidx.ui.text.TextStyle
 import androidx.ui.text.font.Font
 import androidx.ui.text.style.TextDecoration
 import androidx.ui.text.style.TextDirectionAlgorithm
@@ -49,7 +43,6 @@
 import androidx.ui.unit.IntPx
 import androidx.ui.unit.PxPosition
 import androidx.ui.unit.ipx
-import androidx.ui.unit.isFinite
 import androidx.ui.unit.px
 import kotlin.math.ceil
 import kotlin.math.roundToInt
@@ -105,32 +98,7 @@
             layoutDirection: LayoutDirection,
             prevResultText: TextLayoutResult? = null
         ): Triple<IntPx, IntPx, TextLayoutResult> {
-            val layoutResult = if (constraints.maxWidth.isFinite()) {
-                textDelegate.layout(
-                    Constraints(
-                        constraints.maxWidth, // We want to fill width. See below.
-                        constraints.maxWidth,
-                        constraints.minHeight,
-                        constraints.maxHeight
-                    ),
-                    layoutDirection,
-                    prevResultText
-                )
-            } else {
-                // TextField want to fill the required width but if infinite width is passed,
-                // falling back to wrap-content behavior since it may be in the horizontal scroller.
-                textDelegate.layoutIntrinsics(layoutDirection)
-                textDelegate.layout(
-                    Constraints(
-                        textDelegate.maxIntrinsicWidth,
-                        textDelegate.maxIntrinsicWidth,
-                        constraints.minHeight,
-                        constraints.maxHeight
-                    ),
-                    layoutDirection,
-                    prevResultText
-                )
-            }
+            val layoutResult = textDelegate.layout(constraints, layoutDirection, prevResultText)
 
             val isEmptyText = textDelegate.text.text.isEmpty()
             val height = if (isEmptyText) {
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionMode.kt b/ui/ui-text/src/main/java/androidx/ui/text/selection/SelectionMode.kt
similarity index 99%
rename from ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionMode.kt
rename to ui/ui-text/src/main/java/androidx/ui/text/selection/SelectionMode.kt
index 6d970ac..eaaa01e 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionMode.kt
+++ b/ui/ui-text/src/main/java/androidx/ui/text/selection/SelectionMode.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.ui.core.selection
+package androidx.ui.text.selection
 
 import androidx.ui.unit.PxBounds
 import androidx.ui.unit.PxPosition
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/selection/TextSelectionDelegate.kt b/ui/ui-text/src/main/java/androidx/ui/text/selection/TextSelectionDelegate.kt
similarity index 98%
rename from ui/ui-framework/src/main/java/androidx/ui/core/selection/TextSelectionDelegate.kt
rename to ui/ui-text/src/main/java/androidx/ui/text/selection/TextSelectionDelegate.kt
index 0cf5d8c..b3a2b7e 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/selection/TextSelectionDelegate.kt
+++ b/ui/ui-text/src/main/java/androidx/ui/text/selection/TextSelectionDelegate.kt
@@ -14,9 +14,11 @@
  * limitations under the License.
  */
 
-package androidx.ui.core.selection
+package androidx.ui.text.selection
 
 import androidx.ui.core.LayoutCoordinates
+import androidx.ui.core.selection.Selectable
+import androidx.ui.core.selection.Selection
 import androidx.ui.geometry.Offset
 import androidx.ui.text.AnnotatedString
 import androidx.ui.text.TextLayoutResult
@@ -140,14 +142,14 @@
     val containsWholeSelectionEnd =
         bounds.toRect().contains(Offset(endPosition.x.value, endPosition.y.value))
 
-    var rawStartOffset =
+    val rawStartOffset =
         if (containsWholeSelectionStart)
             textLayoutResult.getOffsetForPosition(startPosition).coerceIn(0, lastOffset)
         else
         // If the composable is selected, the start offset cannot be -1 for this composable. If the
         // final start offset is still -1, it means this composable is not selected.
             -1
-    var rawEndOffset =
+    val rawEndOffset =
         if (containsWholeSelectionEnd)
             textLayoutResult.getOffsetForPosition(endPosition).coerceIn(0, lastOffset)
         else
@@ -375,7 +377,7 @@
         start = if (handlesCrossed) endPosition else startPosition,
         end = if (handlesCrossed) startPosition else endPosition
     )
-    var startOffset = if (isSelected && !containsWholeSelectionStart) {
+    val startOffset = if (isSelected && !containsWholeSelectionStart) {
         // If the composable is selected but the start is not in the composable, bound to the border
         // of the text in the composable.
         if (handlesCrossed) max(lastOffset, 0) else 0
@@ -385,7 +387,7 @@
         // the start, the final offset has already been calculated earlier.
         rawStartOffset
     }
-    var endOffset = if (isSelected && !containsWholeSelectionEnd) {
+    val endOffset = if (isSelected && !containsWholeSelectionEnd) {
         // If the composable is selected but the end is not in the composable, bound to the border
         // of the text in the composable.
         if (handlesCrossed) 0 else max(lastOffset, 0)
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/DragEventTrackerTest.kt b/ui/ui-text/src/test/java/androidx/ui/text/DragEventTrackerTest.kt
similarity index 98%
rename from ui/ui-framework/src/test/java/androidx/ui/core/DragEventTrackerTest.kt
rename to ui/ui-text/src/test/java/androidx/ui/text/DragEventTrackerTest.kt
index 73515ef..49fffd3 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/DragEventTrackerTest.kt
+++ b/ui/ui-text/src/test/java/androidx/ui/text/DragEventTrackerTest.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.ui.core
+package androidx.ui.text
 
 import androidx.ui.unit.PxPosition
 import androidx.ui.unit.px
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/TextFieldDelegateTest.kt b/ui/ui-text/src/test/java/androidx/ui/text/TextFieldDelegateTest.kt
similarity index 90%
rename from ui/ui-framework/src/test/java/androidx/ui/core/TextFieldDelegateTest.kt
rename to ui/ui-text/src/test/java/androidx/ui/text/TextFieldDelegateTest.kt
index 02fe5ac..6a4bcea 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/TextFieldDelegateTest.kt
+++ b/ui/ui-text/src/test/java/androidx/ui/text/TextFieldDelegateTest.kt
@@ -14,32 +14,27 @@
  * limitations under the License.
  */
 
-package androidx.ui.core
+package androidx.ui.text
 
+import androidx.ui.core.Constraints
+import androidx.ui.core.LayoutCoordinates
+import androidx.ui.core.LayoutDirection
 import androidx.ui.geometry.Rect
 import androidx.ui.graphics.Canvas
 import androidx.ui.graphics.Color
 import androidx.ui.input.CommitTextEditOp
 import androidx.ui.input.EditOperation
 import androidx.ui.input.EditProcessor
+import androidx.ui.input.EditorValue
 import androidx.ui.input.FinishComposingTextEditOp
 import androidx.ui.input.ImeAction
-import androidx.ui.input.EditorValue
 import androidx.ui.input.KeyboardType
 import androidx.ui.input.OffsetMap
 import androidx.ui.input.SetSelectionEditOp
 import androidx.ui.input.TextInputService
 import androidx.ui.input.TransformedText
-import androidx.ui.text.AnnotatedString
-import androidx.ui.text.MultiParagraphIntrinsics
-import androidx.ui.text.SpanStyle
-import androidx.ui.text.TextDelegate
-import androidx.ui.text.TextLayoutResult
-import androidx.ui.text.TextRange
-import androidx.ui.text.TextStyle
 import androidx.ui.text.style.TextDecoration
 import androidx.ui.unit.Density
-import androidx.ui.unit.IntPx
 import androidx.ui.unit.IntPxSize
 import androidx.ui.unit.PxPosition
 import androidx.ui.unit.ipx
@@ -294,7 +289,7 @@
     fun layout() {
         val constraints = Constraints(
             minWidth = 0.px.round(),
-            maxWidth = 1024.px.round(),
+            maxWidth = 1280.px.round(),
             minHeight = 0.px.round(),
             maxHeight = 2048.px.round()
         )
@@ -418,37 +413,4 @@
             AnnotatedString.Item(SpanStyle(textDecoration = TextDecoration.Underline), 3, 6)
         )
     }
-
-    @Test
-    fun infinte_constraints() {
-        val constraints = Constraints(
-            minWidth = 0.px.round(),
-            maxWidth = IntPx.Infinity,
-            minHeight = 0.px.round(),
-            maxHeight = 2048.px.round()
-        )
-
-        val dummyText = AnnotatedString(text = "Hello, World")
-        whenever(mDelegate.text).thenReturn(dummyText)
-        whenever(mDelegate.style).thenReturn(TextStyle())
-        whenever(mDelegate.density).thenReturn(Density(1.0f))
-        whenever(mDelegate.resourceLoader).thenReturn(mock())
-        whenever(mDelegate.layout(any(), any(), eq(null))).thenReturn(textLayoutResult)
-        whenever(textLayoutResult.size).thenReturn(IntPxSize(123.ipx, 512.ipx))
-        whenever(mDelegate.maxIntrinsicWidth).thenReturn(123.ipx)
-
-        val res = TextFieldDelegate.layout(mDelegate, constraints, layoutDirection)
-        assertThat(res.first).isEqualTo(123.ipx)
-        assertEquals(512.ipx, res.second)
-
-        verify(mDelegate, times(1)).layout(
-            Constraints(
-                123.ipx,
-                123.ipx,
-                0.ipx,
-                2048.ipx
-            ),
-            layoutDirection
-        )
-    }
 }
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/selection/SelectionModeTest.kt b/ui/ui-text/src/test/java/androidx/ui/text/selection/SelectionModeTest.kt
similarity index 99%
rename from ui/ui-framework/src/test/java/androidx/ui/core/selection/SelectionModeTest.kt
rename to ui/ui-text/src/test/java/androidx/ui/text/selection/SelectionModeTest.kt
index 8f58fe8..64dc4b3 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/selection/SelectionModeTest.kt
+++ b/ui/ui-text/src/test/java/androidx/ui/text/selection/SelectionModeTest.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.ui.core.selection
+package androidx.ui.text.selection
 
 import androidx.test.filters.SmallTest
 import androidx.ui.unit.PxBounds
diff --git a/ui/ui-text/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/ui/ui-text/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
index ca6ee9c..1f0955d 100644
--- a/ui/ui-text/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
+++ b/ui/ui-text/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
@@ -1 +1 @@
-mock-maker-inline
\ No newline at end of file
+mock-maker-inline
diff --git a/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/ComposeViewAdapterTest.kt b/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/ComposeViewAdapterTest.kt
index 6a7d892..4f0b007 100644
--- a/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/ComposeViewAdapterTest.kt
+++ b/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/ComposeViewAdapterTest.kt
@@ -16,8 +16,8 @@
 
 package androidx.ui.tooling
 
-import android.app.Activity
 import android.os.Bundle
+import androidx.activity.ComponentActivity
 import androidx.test.rule.ActivityTestRule
 import androidx.ui.tooling.preview.ComposeViewAdapter
 import androidx.ui.tooling.preview.ViewInfo
@@ -37,7 +37,7 @@
     @Before
     fun setup() {
         composeViewAdapter =
-            activityTestRule.activity.findViewById<ComposeViewAdapter>(R.id.compose_view_adapter)
+            activityTestRule.activity.findViewById(R.id.compose_view_adapter)
     }
 
     @After
@@ -123,7 +123,7 @@
     }
 
     companion object {
-        class TestActivity : Activity() {
+        class TestActivity : ComponentActivity() {
             override fun onCreate(savedInstanceState: Bundle?) {
                 super.onCreate(savedInstanceState)
                 setContentView(R.layout.compose_adapter_test)
diff --git a/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/InspectableTests.kt b/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/InspectableTests.kt
index 843bee93..e4b242a 100644
--- a/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/InspectableTests.kt
+++ b/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/InspectableTests.kt
@@ -47,9 +47,9 @@
         show {
             Inspectable {
                 Column {
-                    Box(Modifier.preferredSize(100.dp).drawBehind { canvas, size ->
+                    Box(Modifier.preferredSize(100.dp).drawBehind {
                         val paint = Paint().also { it.color = Color(0xFF) }
-                        canvas.drawRect(size.toRect(), paint)
+                        drawRect(size.toRect(), paint)
                     })
                 }
             }
diff --git a/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/TestActivity.kt b/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/TestActivity.kt
index 255afca..9a45d0a 100644
--- a/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/TestActivity.kt
+++ b/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/TestActivity.kt
@@ -16,10 +16,10 @@
 
 package androidx.ui.tooling
 
-import android.app.Activity
+import androidx.activity.ComponentActivity
 import java.util.concurrent.CountDownLatch
 
-class TestActivity : Activity() {
+class TestActivity : ComponentActivity() {
     var hasFocusLatch = CountDownLatch(1)
 
     override fun onWindowFocusChanged(hasFocus: Boolean) {
diff --git a/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/preview/ParameterProviderComposable.kt b/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/preview/ParameterProviderComposable.kt
index c7ccf0e..7e99f2a 100644
--- a/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/preview/ParameterProviderComposable.kt
+++ b/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/preview/ParameterProviderComposable.kt
@@ -19,6 +19,9 @@
 import androidx.compose.Composable
 import androidx.ui.foundation.Text
 import androidx.ui.graphics.Color
+import androidx.ui.material.Button
+import androidx.ui.material.ColorPalette
+import androidx.ui.material.MaterialTheme
 import androidx.ui.material.Surface
 
 @Preview
@@ -36,4 +39,15 @@
     Surface(color = Color.Red) {
         Text("$parameter")
     }
+}
+
+@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
+@Preview
+@Composable
+fun ColorPaletteParameter(parameter: ColorPalette) {
+    MaterialTheme(colors = parameter) {
+        Button(onClick = {}) {
+            Text("Hello colors")
+        }
+    }
 }
\ No newline at end of file
diff --git a/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/preview/PreviewParameterTest.kt b/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/preview/PreviewParameterTest.kt
index 781b4c4..cecb39e 100644
--- a/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/preview/PreviewParameterTest.kt
+++ b/ui/ui-tooling/src/androidTest/java/androidx/ui/tooling/preview/PreviewParameterTest.kt
@@ -17,6 +17,9 @@
 package androidx.ui.tooling.preview
 
 import androidx.test.rule.ActivityTestRule
+import androidx.ui.material.ColorPalette
+import androidx.ui.material.darkColorPalette
+import androidx.ui.material.lightColorPalette
 import androidx.ui.tooling.ComposeViewAdapterTest
 import androidx.ui.tooling.preview.datasource.CollectionPreviewParameterProvider
 import androidx.ui.tooling.preview.datasource.LoremIpsum
@@ -77,4 +80,20 @@
             )
         }
     }
+
+    private class MyColorPaletteProvider : CollectionPreviewParameterProvider<ColorPalette>(
+        listOf(lightColorPalette(), darkColorPalette())
+    )
+
+    @Test
+    fun checkColorPaletteProvider() {
+        activityTestRule.runOnUiThread {
+            composeViewAdapter.init(
+                "androidx.ui.tooling.preview.ParameterProviderComposableKt",
+                "ColorPaletteParameter",
+                parameterProvider = MyColorPaletteProvider::class,
+                debugViewInfos = true
+            )
+        }
+    }
 }
\ No newline at end of file
diff --git a/ui/ui-tooling/src/main/java/androidx/ui/tooling/preview/ComposeViewAdapter.kt b/ui/ui-tooling/src/main/java/androidx/ui/tooling/preview/ComposeViewAdapter.kt
index 7be9ae2..b0c9175 100644
--- a/ui/ui-tooling/src/main/java/androidx/ui/tooling/preview/ComposeViewAdapter.kt
+++ b/ui/ui-tooling/src/main/java/androidx/ui/tooling/preview/ComposeViewAdapter.kt
@@ -90,7 +90,16 @@
 
 /**
  * View adapter that renders a `@Composable`. The `@Composable` is found by
- * reading the `tools:composableName` attribute that contains the FQN.
+ * reading the `tools:composableName` attribute that contains the FQN. Additional attributes can
+ * be used to customize the behaviour of this view:
+ *  - `tools:parameterProviderClass`: FQN of the [PreviewParameterProvider] to be instantiated by
+ *  the [ComposeViewAdapter] that will be used as source for the `@Composable` parameters.
+ *  - `tools:parameterProviderIndex`: The index within the [PreviewParameterProvider] of the
+ *  value to be used in this particular instance.
+ *  - `tools:paintBounds`: If true, the component boundaries will be painted. This is only meant
+ *  for debugging purposes.
+ *  - `tools:printViewInfos`: If true, the [ComposeViewAdapter] will log the tree of [ViewInfo]
+ *  to logcat for debugging.
  *
  * @suppress
  */
@@ -286,10 +295,30 @@
         val composableName = attrs.getAttributeValue(TOOLS_NS_URI, "composableName") ?: return
         val className = composableName.substringBeforeLast('.')
         val methodName = composableName.substringAfterLast('.')
+        val parameterProviderIndex = attrs.getAttributeIntValue(
+            TOOLS_NS_URI,
+            "parameterProviderIndex", 0
+        )
+        val parameterProviderClassName = attrs.getAttributeValue(
+            TOOLS_NS_URI,
+            "parameterProviderClass"
+        )
+        val parameterProviderClass = if (parameterProviderClassName != null)
+            try {
+                @Suppress("UNCHECKED_CAST")
+                Class.forName(parameterProviderClassName).kotlin as? KClass<out
+                PreviewParameterProvider<*>>
+            } catch (e: ClassNotFoundException) {
+                Log.e(TAG, "Unable to find provider '$parameterProviderClassName'", e)
+                null
+            }
+        else null
 
         init(
             className = className,
             methodName = methodName,
+            parameterProvider = parameterProviderClass,
+            parameterProviderIndex = parameterProviderIndex,
             debugPaintBounds = attrs.getAttributeBooleanValue(
                 TOOLS_NS_URI,
                 "paintBounds",
diff --git a/ui/ui-tooling/src/main/java/androidx/ui/tooling/preview/PreviewUtils.kt b/ui/ui-tooling/src/main/java/androidx/ui/tooling/preview/PreviewUtils.kt
index e111aea..32b9ba3 100644
--- a/ui/ui-tooling/src/main/java/androidx/ui/tooling/preview/PreviewUtils.kt
+++ b/ui/ui-tooling/src/main/java/androidx/ui/tooling/preview/PreviewUtils.kt
@@ -29,12 +29,34 @@
 private const val DEFAULT_SUFFIX = "\$default"
 
 /**
+ * Returns true if the [methodTypes] and [actualTypes] are compatible. This means that every
+ * `actualTypes[n]` are assignable to `methodTypes[n]`.
+ */
+private fun compatibleTypes(methodTypes: Array<Class<*>>, actualTypes: Array<Class<*>>): Boolean =
+    methodTypes.size == actualTypes.size &&
+            methodTypes.mapIndexed { index, clazz -> clazz.isAssignableFrom(actualTypes[index]) }
+                .all { it }
+
+/**
+ * Same as [Class#getDeclaredMethod] but it accounts for compatible types so the signature does
+ * not need to exactly match. This allows finding method calls that use subclasses as parameters
+ * instead of the exact types.
+ */
+private fun Class<*>.getDeclaredCompatibleMethod(methodName: String, vararg args: Class<*>):
+        Method {
+    val actualTypes: Array<Class<*>> = arrayOf(*args)
+    return declaredMethods.firstOrNull {
+        methodName == it.name && compatibleTypes(it.parameterTypes, actualTypes)
+    } ?: throw NoSuchMethodException("$methodName not found")
+}
+
+/**
  * Find the given method by name. If the method has parameters, this function will try to find
  * the version that accepts default parameters.
  */
 private fun Class<*>.findComposableMethod(methodName: String, vararg args: Any?): Method {
     val method = try {
-        getDeclaredMethod(
+        getDeclaredCompatibleMethod(
             methodName,
             *args.mapNotNull { it?.javaClass }.toTypedArray(),
             Composer::class.java
diff --git a/vectordrawable/vectordrawable-seekable/build.gradle b/vectordrawable/vectordrawable-seekable/build.gradle
index afe6653..c3d274d 100644
--- a/vectordrawable/vectordrawable-seekable/build.gradle
+++ b/vectordrawable/vectordrawable-seekable/build.gradle
@@ -44,7 +44,7 @@
 
 androidx {
     name = "Android SeekableAnimatedVectorDrawable"
-    publish = Publish.NONE
+    publish = Publish.SNAPSHOT_AND_RELEASE
     mavenVersion = LibraryVersions.VECTORDRAWABLE_SEEKABLE
     mavenGroup = LibraryGroups.VECTORDRAWABLE
     inceptionYear = "2020"
diff --git a/viewpager/viewpager/build.gradle b/viewpager/viewpager/build.gradle
index c4e5cb3..656aa08 100644
--- a/viewpager/viewpager/build.gradle
+++ b/viewpager/viewpager/build.gradle
@@ -17,7 +17,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    implementation(project(":core:core"))
+    implementation("androidx.core:core:1.3.0-beta01")
     api("androidx.customview:customview:1.0.0")
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/viewpager2/integration-tests/testapp/src/main/java/androidx/viewpager2/integration/testapp/CardFragmentActivity.kt b/viewpager2/integration-tests/testapp/src/main/java/androidx/viewpager2/integration/testapp/CardFragmentActivity.kt
index 27057f6..cc02c2f 100644
--- a/viewpager2/integration-tests/testapp/src/main/java/androidx/viewpager2/integration/testapp/CardFragmentActivity.kt
+++ b/viewpager2/integration-tests/testapp/src/main/java/androidx/viewpager2/integration/testapp/CardFragmentActivity.kt
@@ -56,7 +56,7 @@
             savedInstanceState: Bundle?
         ): View? {
             val cardView = CardView(layoutInflater, container)
-            cardView.bind(Card.fromBundle(arguments!!))
+            cardView.bind(Card.fromBundle(requireArguments()))
             return cardView.view
         }
 
diff --git a/viewpager2/viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentStateAdapter.java b/viewpager2/viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentStateAdapter.java
index f1bcd8d..bc114bd 100644
--- a/viewpager2/viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentStateAdapter.java
+++ b/viewpager2/viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentStateAdapter.java
@@ -40,7 +40,6 @@
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentActivity;
 import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentStatePagerAdapter;
 import androidx.fragment.app.FragmentTransaction;
 import androidx.lifecycle.Lifecycle;
 import androidx.lifecycle.LifecycleEventObserver;
@@ -55,7 +54,8 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 
 /**
- * Similar in behavior to {@link FragmentStatePagerAdapter}
+ * Similar in behavior to {@link androidx.fragment.app.FragmentStatePagerAdapter
+ * FragmentStatePagerAdapter}
  * <p>
  * Lifecycle within {@link RecyclerView}:
  * <ul>
diff --git a/viewpager2/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java b/viewpager2/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
index a7869c6..3eb7e60 100644
--- a/viewpager2/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
+++ b/viewpager2/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
@@ -1221,7 +1221,7 @@
     }
 
     // TODO(b/141956012): Suppressed during upgrade to AGP 3.6.
-    @SuppressWarnings("ClassCanBeStatic")
+    @SuppressWarnings({"ClassCanBeStatic", "InnerClassMayBeStatic"})
     private abstract class AccessibilityProvider {
         void onInitialize(@NonNull CompositeOnPageChangeCallback pageChangeEventDispatcher,
                 @NonNull RecyclerView recyclerView) {
diff --git a/wear/wear/src/androidTest/java/androidx/wear/widget/ConfirmationActivityTest.java b/wear/wear/src/androidTest/java/androidx/wear/widget/ConfirmationActivityTest.java
index 4c8791f..6efc610 100644
--- a/wear/wear/src/androidTest/java/androidx/wear/widget/ConfirmationActivityTest.java
+++ b/wear/wear/src/androidTest/java/androidx/wear/widget/ConfirmationActivityTest.java
@@ -39,14 +39,14 @@
 
     // Number of milliseconds before the end of the duration period that we should check that the
     // ConfirmationActivity still has focus
-    private static final int MILLIS_BEFORE_END_OF_DURATION = 150;
+    private static final int MILLIS_BEFORE_END_OF_DURATION = 450;
 
     // Number of milliseconds after the end of the duration period that we should wait before the
     // ConfirmationActivity still lost focus
-    private static final int MILLIS_AFTER_END_OF_DURATION = 150;
+    private static final int MILLIS_AFTER_END_OF_DURATION = 500;
 
     // Number of milliseconds to wait for the confirmation activity to display initially
-    private static final int MILLIS_TO_WAIT_FOR_ACTIVITY_TO_BE_DRAWN = 100;
+    private static final int MILLIS_TO_WAIT_FOR_ACTIVITY_TO_BE_DRAWN = 500;
 
     @Rule
     public final WakeLockRule wakeLock = new WakeLockRule();
@@ -57,18 +57,12 @@
 
     @Test
     public void testConfirmationDialogShownForDefaultDuration() throws Throwable {
-        testConfirmationDialogShownForConfiguredDuration(
-                ConfirmationActivity.DEFAULT_ANIMATION_DURATION_MS);
-    }
-
-    @Test
-    public void testConfirmationDialogShownForShortDuration() throws Throwable {
-        int testDuration = ConfirmationActivity.DEFAULT_ANIMATION_DURATION_MS / 2;
+        int testDuration = ConfirmationActivity.DEFAULT_ANIMATION_DURATION_MS;
         // Check that the structure of the test is still valid
         assertTrue(testDuration
                 > (MILLIS_BEFORE_END_OF_DURATION + MILLIS_TO_WAIT_FOR_ACTIVITY_TO_BE_DRAWN));
-
-        testConfirmationDialogShownForConfiguredDuration(testDuration);
+        testConfirmationDialogShownForConfiguredDuration(
+                ConfirmationActivity.DEFAULT_ANIMATION_DURATION_MS);
     }
 
     @Test
@@ -80,6 +74,7 @@
     private void testConfirmationDialogShownForConfiguredDuration(int duration) throws Throwable {
         // Wait for the test activity to be visible
         InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+        Thread.sleep(MILLIS_TO_WAIT_FOR_ACTIVITY_TO_BE_DRAWN);
 
         // Check that the test activity currently hasWindowFocus()
         assertTrue(mActivityRule.getActivity().hasWindowFocus());
diff --git a/webkit/README.md b/webkit/README.md
index c1528f0..2c7ae98 100644
--- a/webkit/README.md
+++ b/webkit/README.md
@@ -1,5 +1,8 @@
 # androidx.webkit
 
+**See this page rendered in [Gitiles
+markdown](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/webkit/README.md).**
+
 The androidx.webkit library is a static library you can add to your Android
 application in order to use android.webkit APIs that are not available for older
 platform versions.
diff --git a/webkit/integration-tests/testapp/README.md b/webkit/integration-tests/testapp/README.md
index 34e18f1..4c7d56c 100644
--- a/webkit/integration-tests/testapp/README.md
+++ b/webkit/integration-tests/testapp/README.md
@@ -1,5 +1,8 @@
 # WebView Demo App
 
+**See this page rendered in [Gitiles
+markdown](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/webkit/integration-tests/testapp/README.md).**
+
 The WebView/Webkit demo app serves as both a practical demonstration how to use
 the latest AndroidX Webkit APIs and as a means to exercise those APIs for manual
 testing.
diff --git a/webkit/webkit/api/1.3.0-alpha01.txt b/webkit/webkit/api/1.3.0-alpha01.txt
index 62e01ee..15f26e05 100644
--- a/webkit/webkit/api/1.3.0-alpha01.txt
+++ b/webkit/webkit/api/1.3.0-alpha01.txt
@@ -128,15 +128,20 @@
   public class WebSettingsCompat {
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.DISABLED_ACTION_MODE_MENU_ITEMS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getDisabledActionModeMenuItems(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getForceDark(android.webkit.WebSettings);
+    method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK_STRATEGY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getForceDarkStrategy(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.OFF_SCREEN_PRERASTER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean getOffscreenPreRaster(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.SAFE_BROWSING_ENABLE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean getSafeBrowsingEnabled(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.DISABLED_ACTION_MODE_MENU_ITEMS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setDisabledActionModeMenuItems(android.webkit.WebSettings, int);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setForceDark(android.webkit.WebSettings, int);
+    method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK_STRATEGY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setForceDarkStrategy(android.webkit.WebSettings, int);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.OFF_SCREEN_PRERASTER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setOffscreenPreRaster(android.webkit.WebSettings, boolean);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.SAFE_BROWSING_ENABLE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setSafeBrowsingEnabled(android.webkit.WebSettings, boolean);
     field public static final int FORCE_DARK_AUTO = 1; // 0x1
     field public static final int FORCE_DARK_OFF = 0; // 0x0
     field public static final int FORCE_DARK_ON = 2; // 0x2
+    field public static final int PREFER_WEB_THEME_OVER_USER_AGENT_DARKENING = 2; // 0x2
+    field public static final int USER_AGENT_DARKENING_ONLY = 0; // 0x0
+    field public static final int WEB_THEME_DARKENING_ONLY = 1; // 0x1
   }
 
   public final class WebViewAssetLoader {
@@ -210,6 +215,7 @@
     field public static final String CREATE_WEB_MESSAGE_CHANNEL = "CREATE_WEB_MESSAGE_CHANNEL";
     field public static final String DISABLED_ACTION_MODE_MENU_ITEMS = "DISABLED_ACTION_MODE_MENU_ITEMS";
     field public static final String FORCE_DARK = "FORCE_DARK";
+    field public static final String FORCE_DARK_STRATEGY = "FORCE_DARK_STRATEGY";
     field public static final String GET_WEB_CHROME_CLIENT = "GET_WEB_CHROME_CLIENT";
     field public static final String GET_WEB_VIEW_CLIENT = "GET_WEB_VIEW_CLIENT";
     field public static final String GET_WEB_VIEW_RENDERER = "GET_WEB_VIEW_RENDERER";
diff --git a/webkit/webkit/api/current.txt b/webkit/webkit/api/current.txt
index 62e01ee..15f26e05 100644
--- a/webkit/webkit/api/current.txt
+++ b/webkit/webkit/api/current.txt
@@ -128,15 +128,20 @@
   public class WebSettingsCompat {
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.DISABLED_ACTION_MODE_MENU_ITEMS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getDisabledActionModeMenuItems(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getForceDark(android.webkit.WebSettings);
+    method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK_STRATEGY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getForceDarkStrategy(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.OFF_SCREEN_PRERASTER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean getOffscreenPreRaster(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.SAFE_BROWSING_ENABLE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean getSafeBrowsingEnabled(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.DISABLED_ACTION_MODE_MENU_ITEMS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setDisabledActionModeMenuItems(android.webkit.WebSettings, int);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setForceDark(android.webkit.WebSettings, int);
+    method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK_STRATEGY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setForceDarkStrategy(android.webkit.WebSettings, int);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.OFF_SCREEN_PRERASTER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setOffscreenPreRaster(android.webkit.WebSettings, boolean);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.SAFE_BROWSING_ENABLE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setSafeBrowsingEnabled(android.webkit.WebSettings, boolean);
     field public static final int FORCE_DARK_AUTO = 1; // 0x1
     field public static final int FORCE_DARK_OFF = 0; // 0x0
     field public static final int FORCE_DARK_ON = 2; // 0x2
+    field public static final int PREFER_WEB_THEME_OVER_USER_AGENT_DARKENING = 2; // 0x2
+    field public static final int USER_AGENT_DARKENING_ONLY = 0; // 0x0
+    field public static final int WEB_THEME_DARKENING_ONLY = 1; // 0x1
   }
 
   public final class WebViewAssetLoader {
@@ -210,6 +215,7 @@
     field public static final String CREATE_WEB_MESSAGE_CHANNEL = "CREATE_WEB_MESSAGE_CHANNEL";
     field public static final String DISABLED_ACTION_MODE_MENU_ITEMS = "DISABLED_ACTION_MODE_MENU_ITEMS";
     field public static final String FORCE_DARK = "FORCE_DARK";
+    field public static final String FORCE_DARK_STRATEGY = "FORCE_DARK_STRATEGY";
     field public static final String GET_WEB_CHROME_CLIENT = "GET_WEB_CHROME_CLIENT";
     field public static final String GET_WEB_VIEW_CLIENT = "GET_WEB_VIEW_CLIENT";
     field public static final String GET_WEB_VIEW_RENDERER = "GET_WEB_VIEW_RENDERER";
diff --git a/webkit/webkit/api/public_plus_experimental_1.3.0-alpha01.txt b/webkit/webkit/api/public_plus_experimental_1.3.0-alpha01.txt
index 62e01ee..15f26e05 100644
--- a/webkit/webkit/api/public_plus_experimental_1.3.0-alpha01.txt
+++ b/webkit/webkit/api/public_plus_experimental_1.3.0-alpha01.txt
@@ -128,15 +128,20 @@
   public class WebSettingsCompat {
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.DISABLED_ACTION_MODE_MENU_ITEMS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getDisabledActionModeMenuItems(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getForceDark(android.webkit.WebSettings);
+    method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK_STRATEGY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getForceDarkStrategy(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.OFF_SCREEN_PRERASTER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean getOffscreenPreRaster(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.SAFE_BROWSING_ENABLE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean getSafeBrowsingEnabled(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.DISABLED_ACTION_MODE_MENU_ITEMS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setDisabledActionModeMenuItems(android.webkit.WebSettings, int);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setForceDark(android.webkit.WebSettings, int);
+    method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK_STRATEGY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setForceDarkStrategy(android.webkit.WebSettings, int);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.OFF_SCREEN_PRERASTER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setOffscreenPreRaster(android.webkit.WebSettings, boolean);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.SAFE_BROWSING_ENABLE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setSafeBrowsingEnabled(android.webkit.WebSettings, boolean);
     field public static final int FORCE_DARK_AUTO = 1; // 0x1
     field public static final int FORCE_DARK_OFF = 0; // 0x0
     field public static final int FORCE_DARK_ON = 2; // 0x2
+    field public static final int PREFER_WEB_THEME_OVER_USER_AGENT_DARKENING = 2; // 0x2
+    field public static final int USER_AGENT_DARKENING_ONLY = 0; // 0x0
+    field public static final int WEB_THEME_DARKENING_ONLY = 1; // 0x1
   }
 
   public final class WebViewAssetLoader {
@@ -210,6 +215,7 @@
     field public static final String CREATE_WEB_MESSAGE_CHANNEL = "CREATE_WEB_MESSAGE_CHANNEL";
     field public static final String DISABLED_ACTION_MODE_MENU_ITEMS = "DISABLED_ACTION_MODE_MENU_ITEMS";
     field public static final String FORCE_DARK = "FORCE_DARK";
+    field public static final String FORCE_DARK_STRATEGY = "FORCE_DARK_STRATEGY";
     field public static final String GET_WEB_CHROME_CLIENT = "GET_WEB_CHROME_CLIENT";
     field public static final String GET_WEB_VIEW_CLIENT = "GET_WEB_VIEW_CLIENT";
     field public static final String GET_WEB_VIEW_RENDERER = "GET_WEB_VIEW_RENDERER";
diff --git a/webkit/webkit/api/public_plus_experimental_current.txt b/webkit/webkit/api/public_plus_experimental_current.txt
index 62e01ee..15f26e05 100644
--- a/webkit/webkit/api/public_plus_experimental_current.txt
+++ b/webkit/webkit/api/public_plus_experimental_current.txt
@@ -128,15 +128,20 @@
   public class WebSettingsCompat {
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.DISABLED_ACTION_MODE_MENU_ITEMS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getDisabledActionModeMenuItems(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getForceDark(android.webkit.WebSettings);
+    method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK_STRATEGY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getForceDarkStrategy(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.OFF_SCREEN_PRERASTER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean getOffscreenPreRaster(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.SAFE_BROWSING_ENABLE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean getSafeBrowsingEnabled(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.DISABLED_ACTION_MODE_MENU_ITEMS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setDisabledActionModeMenuItems(android.webkit.WebSettings, int);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setForceDark(android.webkit.WebSettings, int);
+    method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK_STRATEGY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setForceDarkStrategy(android.webkit.WebSettings, int);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.OFF_SCREEN_PRERASTER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setOffscreenPreRaster(android.webkit.WebSettings, boolean);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.SAFE_BROWSING_ENABLE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setSafeBrowsingEnabled(android.webkit.WebSettings, boolean);
     field public static final int FORCE_DARK_AUTO = 1; // 0x1
     field public static final int FORCE_DARK_OFF = 0; // 0x0
     field public static final int FORCE_DARK_ON = 2; // 0x2
+    field public static final int PREFER_WEB_THEME_OVER_USER_AGENT_DARKENING = 2; // 0x2
+    field public static final int USER_AGENT_DARKENING_ONLY = 0; // 0x0
+    field public static final int WEB_THEME_DARKENING_ONLY = 1; // 0x1
   }
 
   public final class WebViewAssetLoader {
@@ -210,6 +215,7 @@
     field public static final String CREATE_WEB_MESSAGE_CHANNEL = "CREATE_WEB_MESSAGE_CHANNEL";
     field public static final String DISABLED_ACTION_MODE_MENU_ITEMS = "DISABLED_ACTION_MODE_MENU_ITEMS";
     field public static final String FORCE_DARK = "FORCE_DARK";
+    field public static final String FORCE_DARK_STRATEGY = "FORCE_DARK_STRATEGY";
     field public static final String GET_WEB_CHROME_CLIENT = "GET_WEB_CHROME_CLIENT";
     field public static final String GET_WEB_VIEW_CLIENT = "GET_WEB_VIEW_CLIENT";
     field public static final String GET_WEB_VIEW_RENDERER = "GET_WEB_VIEW_RENDERER";
diff --git a/webkit/webkit/api/restricted_1.3.0-alpha01.txt b/webkit/webkit/api/restricted_1.3.0-alpha01.txt
index 62e01ee..15f26e05 100644
--- a/webkit/webkit/api/restricted_1.3.0-alpha01.txt
+++ b/webkit/webkit/api/restricted_1.3.0-alpha01.txt
@@ -128,15 +128,20 @@
   public class WebSettingsCompat {
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.DISABLED_ACTION_MODE_MENU_ITEMS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getDisabledActionModeMenuItems(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getForceDark(android.webkit.WebSettings);
+    method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK_STRATEGY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getForceDarkStrategy(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.OFF_SCREEN_PRERASTER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean getOffscreenPreRaster(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.SAFE_BROWSING_ENABLE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean getSafeBrowsingEnabled(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.DISABLED_ACTION_MODE_MENU_ITEMS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setDisabledActionModeMenuItems(android.webkit.WebSettings, int);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setForceDark(android.webkit.WebSettings, int);
+    method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK_STRATEGY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setForceDarkStrategy(android.webkit.WebSettings, int);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.OFF_SCREEN_PRERASTER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setOffscreenPreRaster(android.webkit.WebSettings, boolean);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.SAFE_BROWSING_ENABLE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setSafeBrowsingEnabled(android.webkit.WebSettings, boolean);
     field public static final int FORCE_DARK_AUTO = 1; // 0x1
     field public static final int FORCE_DARK_OFF = 0; // 0x0
     field public static final int FORCE_DARK_ON = 2; // 0x2
+    field public static final int PREFER_WEB_THEME_OVER_USER_AGENT_DARKENING = 2; // 0x2
+    field public static final int USER_AGENT_DARKENING_ONLY = 0; // 0x0
+    field public static final int WEB_THEME_DARKENING_ONLY = 1; // 0x1
   }
 
   public final class WebViewAssetLoader {
@@ -210,6 +215,7 @@
     field public static final String CREATE_WEB_MESSAGE_CHANNEL = "CREATE_WEB_MESSAGE_CHANNEL";
     field public static final String DISABLED_ACTION_MODE_MENU_ITEMS = "DISABLED_ACTION_MODE_MENU_ITEMS";
     field public static final String FORCE_DARK = "FORCE_DARK";
+    field public static final String FORCE_DARK_STRATEGY = "FORCE_DARK_STRATEGY";
     field public static final String GET_WEB_CHROME_CLIENT = "GET_WEB_CHROME_CLIENT";
     field public static final String GET_WEB_VIEW_CLIENT = "GET_WEB_VIEW_CLIENT";
     field public static final String GET_WEB_VIEW_RENDERER = "GET_WEB_VIEW_RENDERER";
diff --git a/webkit/webkit/api/restricted_current.txt b/webkit/webkit/api/restricted_current.txt
index 62e01ee..15f26e05 100644
--- a/webkit/webkit/api/restricted_current.txt
+++ b/webkit/webkit/api/restricted_current.txt
@@ -128,15 +128,20 @@
   public class WebSettingsCompat {
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.DISABLED_ACTION_MODE_MENU_ITEMS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getDisabledActionModeMenuItems(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getForceDark(android.webkit.WebSettings);
+    method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK_STRATEGY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static int getForceDarkStrategy(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.OFF_SCREEN_PRERASTER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean getOffscreenPreRaster(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.SAFE_BROWSING_ENABLE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean getSafeBrowsingEnabled(android.webkit.WebSettings);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.DISABLED_ACTION_MODE_MENU_ITEMS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setDisabledActionModeMenuItems(android.webkit.WebSettings, int);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setForceDark(android.webkit.WebSettings, int);
+    method @RequiresFeature(name=androidx.webkit.WebViewFeature.FORCE_DARK_STRATEGY, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setForceDarkStrategy(android.webkit.WebSettings, int);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.OFF_SCREEN_PRERASTER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setOffscreenPreRaster(android.webkit.WebSettings, boolean);
     method @RequiresFeature(name=androidx.webkit.WebViewFeature.SAFE_BROWSING_ENABLE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setSafeBrowsingEnabled(android.webkit.WebSettings, boolean);
     field public static final int FORCE_DARK_AUTO = 1; // 0x1
     field public static final int FORCE_DARK_OFF = 0; // 0x0
     field public static final int FORCE_DARK_ON = 2; // 0x2
+    field public static final int PREFER_WEB_THEME_OVER_USER_AGENT_DARKENING = 2; // 0x2
+    field public static final int USER_AGENT_DARKENING_ONLY = 0; // 0x0
+    field public static final int WEB_THEME_DARKENING_ONLY = 1; // 0x1
   }
 
   public final class WebViewAssetLoader {
@@ -210,6 +215,7 @@
     field public static final String CREATE_WEB_MESSAGE_CHANNEL = "CREATE_WEB_MESSAGE_CHANNEL";
     field public static final String DISABLED_ACTION_MODE_MENU_ITEMS = "DISABLED_ACTION_MODE_MENU_ITEMS";
     field public static final String FORCE_DARK = "FORCE_DARK";
+    field public static final String FORCE_DARK_STRATEGY = "FORCE_DARK_STRATEGY";
     field public static final String GET_WEB_CHROME_CLIENT = "GET_WEB_CHROME_CLIENT";
     field public static final String GET_WEB_VIEW_CLIENT = "GET_WEB_VIEW_CLIENT";
     field public static final String GET_WEB_VIEW_RENDERER = "GET_WEB_VIEW_RENDERER";
diff --git a/webkit/webkit/src/main/java/androidx/webkit/WebSettingsCompat.java b/webkit/webkit/src/main/java/androidx/webkit/WebSettingsCompat.java
index 209eceb..8fee98e 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/WebSettingsCompat.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/WebSettingsCompat.java
@@ -335,6 +335,10 @@
      * {@link WebViewFeature#isFeatureSupported(String)}
      * returns true for {@link WebViewFeature#FORCE_DARK}.
      *
+     * <p>
+     * If equals to {@link ForceDark#FORCE_DARK_ON} then {@link #setForceDarkStrategy} is used to
+     * specify darkening strategy.
+     *
      * @param forceDarkMode the force dark mode to set.
      * @see #getForceDark
      */
@@ -386,12 +390,11 @@
     /**
      * In this mode WebView content will be darkened by a user agent and it will ignore the
      * web page's dark theme if it exists.
+     * See <a href="https://drafts.csswg.org/css-color-adjust-1/">specification</a>
+     * for more information.
      *
      * @see #setForceDarkStrategy
-     * TODO(amalova): unhide
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public static final int USER_AGENT_DARKENING_ONLY =
             WebSettingsBoundaryInterface.ForceDarkBehavior.FORCE_DARK_ONLY;
 
@@ -401,10 +404,7 @@
      * default theme.
      *
      * @see #setForceDarkStrategy
-     * TODO(amalova): unhide
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public static final int WEB_THEME_DARKENING_ONLY =
             WebSettingsBoundaryInterface.ForceDarkBehavior.MEDIA_QUERY_ONLY;
 
@@ -413,10 +413,7 @@
      * theme.
      *
      * @see #setForceDarkStrategy
-     * TODO(amalova): unhide
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public static final int PREFER_WEB_THEME_OVER_USER_AGENT_DARKENING =
             WebSettingsBoundaryInterface.ForceDarkBehavior.PREFER_MEDIA_QUERY_OVER_FORCE_DARK;
 
@@ -441,12 +438,13 @@
      * {@link WebViewFeature#isFeatureSupported(String)}
      * returns true for {@link WebViewFeature#FORCE_DARK_STRATEGY}.
      *
-     * @param forceDarkBehavior
+     * <p>
+     * The specified strategy is only used if force dark mode is on.
+     * See {@link #setForceDark}.
      *
-     * TODO(amalova): unhide
-     * @hide
+     * @param forceDarkBehavior the force dark strategy to set.
+     * @see #getForceDarkStrategy
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     @SuppressLint("NewApi")
     @RequiresFeature(name = WebViewFeature.FORCE_DARK_STRATEGY,
             enforcement = "androidx.webkit.WebViewFeature#isFeatureSupported")
@@ -472,12 +470,9 @@
      * {@link WebViewFeature#isFeatureSupported(String)}
      * returns true for {@link WebViewFeature#FORCE_DARK_STRATEGY}.
      *
-     * @return todo
-     *
-     * TODO(amalova): unhide
-     * @hide
+     * @return the currently set force dark strategy.
+     * @see #setForceDarkStrategy
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     @SuppressLint("NewApi")
     @RequiresFeature(name = WebViewFeature.FORCE_DARK_STRATEGY,
             enforcement = "androidx.webkit.WebViewFeature#isFeatureSupported")
diff --git a/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java b/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java
index 7c27387..756fe76 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java
@@ -419,11 +419,7 @@
      * This feature covers
      * {@link WebSettingsCompat#setForceDarkStrategy(WebSettings, int)} and
      * {@link WebSettingsCompat#getForceDarkStrategy(WebSettings)}.
-     *
-     * TODO(amalova): unhide
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public static final String FORCE_DARK_STRATEGY = "FORCE_DARK_STRATEGY";
 
     /**
diff --git a/webkit/webkit/src/main/java/androidx/webkit/package-info.java b/webkit/webkit/src/main/java/androidx/webkit/package-info.java
index 4497e64..fe19dde 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/package-info.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/package-info.java
@@ -27,7 +27,7 @@
  * <pre class="prettyprint">
  *dependencies {
  *    ...
- *    implementation 'androidx.webkit:webkit:1.1.0'
+ *    implementation 'androidx.webkit:webkit:1.2.0'
  *}</pre>
  *
  * <p><b>Migrating to androidx.webkit</b>
diff --git a/work/workmanager-ktx/build.gradle b/work/workmanager-ktx/build.gradle
index c1a1a67..3ebe3d0 100644
--- a/work/workmanager-ktx/build.gradle
+++ b/work/workmanager-ktx/build.gradle
@@ -18,6 +18,7 @@
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.AndroidXExtension
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.Publish
@@ -65,3 +66,11 @@
     description = "Android WorkManager Kotlin Extensions"
     url = AndroidXExtension.ARCHITECTURE_URL
 }
+
+
+// Allow usage of Kotlin's @OptIn.
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn"]
+    }
+}
diff --git a/work/workmanager-ktx/src/androidTest/java/androidx/work/ListenableFutureTest.kt b/work/workmanager-ktx/src/androidTest/java/androidx/work/ListenableFutureTest.kt
index 1f87734..5f26e92 100644
--- a/work/workmanager-ktx/src/androidTest/java/androidx/work/ListenableFutureTest.kt
+++ b/work/workmanager-ktx/src/androidTest/java/androidx/work/ListenableFutureTest.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
+
 package androidx.work
 
 import androidx.concurrent.futures.ResolvableFuture
diff --git a/work/workmanager-rxjava2/src/test/java/androidx/work/SetCompletableProgressTest.kt b/work/workmanager-rxjava2/src/test/java/androidx/work/SetCompletableProgressTest.kt
index a1bd9fc..c5b98f8 100644
--- a/work/workmanager-rxjava2/src/test/java/androidx/work/SetCompletableProgressTest.kt
+++ b/work/workmanager-rxjava2/src/test/java/androidx/work/SetCompletableProgressTest.kt
@@ -20,7 +20,7 @@
 import androidx.work.ListenableWorker.Result
 import androidx.work.impl.utils.SynchronousExecutor
 import androidx.work.impl.utils.futures.SettableFuture
-import junit.framework.Assert.assertEquals
+import org.junit.Assert.assertEquals
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
diff --git a/work/workmanager/src/androidTest/java/androidx/work/WorkTest.java b/work/workmanager/src/androidTest/java/androidx/work/WorkTest.java
index e7453bd..5237099 100644
--- a/work/workmanager/src/androidTest/java/androidx/work/WorkTest.java
+++ b/work/workmanager/src/androidTest/java/androidx/work/WorkTest.java
@@ -120,4 +120,23 @@
                 .setConstraints(constraints)
                 .build();
     }
+
+    @Test
+    public void testBuild_initialDelayMaxLong_throwsIllegalArgumentException() {
+        mThrown.expect(IllegalArgumentException.class);
+        new OneTimeWorkRequest.Builder(
+                TestWorker.class)
+                .setInitialDelay(Long.MAX_VALUE, TimeUnit.MILLISECONDS)
+                .build();
+    }
+
+    @Test
+    public void testBuild_initialDelayTooLarge_throwsIllegalArgumentException() {
+        mThrown.expect(IllegalArgumentException.class);
+        long now = System.currentTimeMillis();
+        new OneTimeWorkRequest.Builder(
+                TestWorker.class)
+                .setInitialDelay(Long.MAX_VALUE - now, TimeUnit.MILLISECONDS)
+                .build();
+    }
 }
diff --git a/work/workmanager/src/main/java/androidx/work/WorkRequest.java b/work/workmanager/src/main/java/androidx/work/WorkRequest.java
index 2894fab..25fed73 100644
--- a/work/workmanager/src/main/java/androidx/work/WorkRequest.java
+++ b/work/workmanager/src/main/java/androidx/work/WorkRequest.java
@@ -258,9 +258,15 @@
          * @param duration The length of the delay in {@code timeUnit} units
          * @param timeUnit The units of time for {@code duration}
          * @return The current {@link Builder}
+         * @throws IllegalArgumentException if the given initial delay will push the execution time
+         *         past {@code Long.MAX_VALUE} and cause an overflow
          */
         public @NonNull B setInitialDelay(long duration, @NonNull TimeUnit timeUnit) {
             mWorkSpec.initialDelay = timeUnit.toMillis(duration);
+            if (Long.MAX_VALUE - System.currentTimeMillis() <= mWorkSpec.initialDelay) {
+                throw new IllegalArgumentException("The given initial delay is too large and will"
+                        + " cause an overflow!");
+            }
             return getThis();
         }
 
@@ -268,11 +274,17 @@
          * Sets an initial delay for the {@link WorkRequest}.
          *
          * @param duration The length of the delay
-         * @return The current {@link Builder}
+         * @return The current {@link Builder}         *
+         * @throws IllegalArgumentException if the given initial delay will push the execution time
+         *         past {@code Long.MAX_VALUE} and cause an overflow
          */
         @RequiresApi(26)
         public @NonNull B setInitialDelay(@NonNull Duration duration) {
             mWorkSpec.initialDelay = duration.toMillis();
+            if (Long.MAX_VALUE - System.currentTimeMillis() <= mWorkSpec.initialDelay) {
+                throw new IllegalArgumentException("The given initial delay is too large and will"
+                        + " cause an overflow!");
+            }
             return getThis();
         }