[go: nahoru, domu]

Merge "ui-desktop: get rid of android.graphics/android.text emulation" into androidx-master-dev
diff --git a/autofill/autofill/api/1.1.0-alpha02.txt b/autofill/autofill/api/1.1.0-alpha02.txt
index d6f51b3..98cfd23 100644
--- a/autofill/autofill/api/1.1.0-alpha02.txt
+++ b/autofill/autofill/api/1.1.0-alpha02.txt
@@ -47,18 +47,18 @@
 
 package androidx.autofill.inline {
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class Renderer {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class Renderer {
     method public static android.app.PendingIntent? getAttributionIntent(android.app.slice.Slice);
     method public static android.os.Bundle getSupportedInlineUiVersionsAsBundle();
     method public static android.view.View? render(android.content.Context, android.app.slice.Slice, android.os.Bundle);
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class SuggestionHintConstants {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class SuggestionHintConstants {
     field public static final String SUGGESTION_HINT_CLIPBOARD_CONTENT = "clipboardContent";
     field public static final String SUGGESTION_HINT_SMART_REPLY = "smartReply";
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class UiVersions {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class UiVersions {
     method public static java.util.List<java.lang.String!> getVersions(android.os.Bundle);
     method public static androidx.autofill.inline.UiVersions.StylesBuilder newStylesBuilder();
     field public static final String INLINE_UI_VERSION_1 = "androidx.autofill.inline.ui.version:v1";
@@ -80,7 +80,7 @@
 
 package androidx.autofill.inline.common {
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class ImageViewStyle extends androidx.autofill.inline.common.ViewStyle {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class ImageViewStyle extends androidx.autofill.inline.common.ViewStyle {
   }
 
   public static final class ImageViewStyle.Builder {
@@ -96,7 +96,7 @@
     method public androidx.autofill.inline.common.ImageViewStyle.Builder setTintList(android.content.res.ColorStateList);
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class TextViewStyle extends androidx.autofill.inline.common.ViewStyle {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class TextViewStyle extends androidx.autofill.inline.common.ViewStyle {
   }
 
   public static final class TextViewStyle.Builder {
@@ -112,7 +112,7 @@
     method public androidx.autofill.inline.common.TextViewStyle.Builder setTypeface(String, int);
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public class ViewStyle {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public class ViewStyle {
   }
 
   public static final class ViewStyle.Builder {
@@ -128,7 +128,7 @@
 
 package androidx.autofill.inline.v1 {
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class InlineSuggestionUi {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class InlineSuggestionUi {
     method public static androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder newContentBuilder(android.app.PendingIntent);
     method public static androidx.autofill.inline.v1.InlineSuggestionUi.Style.Builder newStyleBuilder();
   }
diff --git a/autofill/autofill/api/current.txt b/autofill/autofill/api/current.txt
index d6f51b3..98cfd23 100644
--- a/autofill/autofill/api/current.txt
+++ b/autofill/autofill/api/current.txt
@@ -47,18 +47,18 @@
 
 package androidx.autofill.inline {
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class Renderer {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class Renderer {
     method public static android.app.PendingIntent? getAttributionIntent(android.app.slice.Slice);
     method public static android.os.Bundle getSupportedInlineUiVersionsAsBundle();
     method public static android.view.View? render(android.content.Context, android.app.slice.Slice, android.os.Bundle);
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class SuggestionHintConstants {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class SuggestionHintConstants {
     field public static final String SUGGESTION_HINT_CLIPBOARD_CONTENT = "clipboardContent";
     field public static final String SUGGESTION_HINT_SMART_REPLY = "smartReply";
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class UiVersions {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class UiVersions {
     method public static java.util.List<java.lang.String!> getVersions(android.os.Bundle);
     method public static androidx.autofill.inline.UiVersions.StylesBuilder newStylesBuilder();
     field public static final String INLINE_UI_VERSION_1 = "androidx.autofill.inline.ui.version:v1";
@@ -80,7 +80,7 @@
 
 package androidx.autofill.inline.common {
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class ImageViewStyle extends androidx.autofill.inline.common.ViewStyle {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class ImageViewStyle extends androidx.autofill.inline.common.ViewStyle {
   }
 
   public static final class ImageViewStyle.Builder {
@@ -96,7 +96,7 @@
     method public androidx.autofill.inline.common.ImageViewStyle.Builder setTintList(android.content.res.ColorStateList);
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class TextViewStyle extends androidx.autofill.inline.common.ViewStyle {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class TextViewStyle extends androidx.autofill.inline.common.ViewStyle {
   }
 
   public static final class TextViewStyle.Builder {
@@ -112,7 +112,7 @@
     method public androidx.autofill.inline.common.TextViewStyle.Builder setTypeface(String, int);
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public class ViewStyle {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public class ViewStyle {
   }
 
   public static final class ViewStyle.Builder {
@@ -128,7 +128,7 @@
 
 package androidx.autofill.inline.v1 {
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class InlineSuggestionUi {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class InlineSuggestionUi {
     method public static androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder newContentBuilder(android.app.PendingIntent);
     method public static androidx.autofill.inline.v1.InlineSuggestionUi.Style.Builder newStyleBuilder();
   }
diff --git a/autofill/autofill/api/public_plus_experimental_1.1.0-alpha02.txt b/autofill/autofill/api/public_plus_experimental_1.1.0-alpha02.txt
index d6f51b3..98cfd23 100644
--- a/autofill/autofill/api/public_plus_experimental_1.1.0-alpha02.txt
+++ b/autofill/autofill/api/public_plus_experimental_1.1.0-alpha02.txt
@@ -47,18 +47,18 @@
 
 package androidx.autofill.inline {
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class Renderer {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class Renderer {
     method public static android.app.PendingIntent? getAttributionIntent(android.app.slice.Slice);
     method public static android.os.Bundle getSupportedInlineUiVersionsAsBundle();
     method public static android.view.View? render(android.content.Context, android.app.slice.Slice, android.os.Bundle);
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class SuggestionHintConstants {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class SuggestionHintConstants {
     field public static final String SUGGESTION_HINT_CLIPBOARD_CONTENT = "clipboardContent";
     field public static final String SUGGESTION_HINT_SMART_REPLY = "smartReply";
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class UiVersions {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class UiVersions {
     method public static java.util.List<java.lang.String!> getVersions(android.os.Bundle);
     method public static androidx.autofill.inline.UiVersions.StylesBuilder newStylesBuilder();
     field public static final String INLINE_UI_VERSION_1 = "androidx.autofill.inline.ui.version:v1";
@@ -80,7 +80,7 @@
 
 package androidx.autofill.inline.common {
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class ImageViewStyle extends androidx.autofill.inline.common.ViewStyle {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class ImageViewStyle extends androidx.autofill.inline.common.ViewStyle {
   }
 
   public static final class ImageViewStyle.Builder {
@@ -96,7 +96,7 @@
     method public androidx.autofill.inline.common.ImageViewStyle.Builder setTintList(android.content.res.ColorStateList);
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class TextViewStyle extends androidx.autofill.inline.common.ViewStyle {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class TextViewStyle extends androidx.autofill.inline.common.ViewStyle {
   }
 
   public static final class TextViewStyle.Builder {
@@ -112,7 +112,7 @@
     method public androidx.autofill.inline.common.TextViewStyle.Builder setTypeface(String, int);
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public class ViewStyle {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public class ViewStyle {
   }
 
   public static final class ViewStyle.Builder {
@@ -128,7 +128,7 @@
 
 package androidx.autofill.inline.v1 {
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class InlineSuggestionUi {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class InlineSuggestionUi {
     method public static androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder newContentBuilder(android.app.PendingIntent);
     method public static androidx.autofill.inline.v1.InlineSuggestionUi.Style.Builder newStyleBuilder();
   }
diff --git a/autofill/autofill/api/public_plus_experimental_current.txt b/autofill/autofill/api/public_plus_experimental_current.txt
index d6f51b3..98cfd23 100644
--- a/autofill/autofill/api/public_plus_experimental_current.txt
+++ b/autofill/autofill/api/public_plus_experimental_current.txt
@@ -47,18 +47,18 @@
 
 package androidx.autofill.inline {
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class Renderer {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class Renderer {
     method public static android.app.PendingIntent? getAttributionIntent(android.app.slice.Slice);
     method public static android.os.Bundle getSupportedInlineUiVersionsAsBundle();
     method public static android.view.View? render(android.content.Context, android.app.slice.Slice, android.os.Bundle);
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class SuggestionHintConstants {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class SuggestionHintConstants {
     field public static final String SUGGESTION_HINT_CLIPBOARD_CONTENT = "clipboardContent";
     field public static final String SUGGESTION_HINT_SMART_REPLY = "smartReply";
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class UiVersions {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class UiVersions {
     method public static java.util.List<java.lang.String!> getVersions(android.os.Bundle);
     method public static androidx.autofill.inline.UiVersions.StylesBuilder newStylesBuilder();
     field public static final String INLINE_UI_VERSION_1 = "androidx.autofill.inline.ui.version:v1";
@@ -80,7 +80,7 @@
 
 package androidx.autofill.inline.common {
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class ImageViewStyle extends androidx.autofill.inline.common.ViewStyle {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class ImageViewStyle extends androidx.autofill.inline.common.ViewStyle {
   }
 
   public static final class ImageViewStyle.Builder {
@@ -96,7 +96,7 @@
     method public androidx.autofill.inline.common.ImageViewStyle.Builder setTintList(android.content.res.ColorStateList);
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class TextViewStyle extends androidx.autofill.inline.common.ViewStyle {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class TextViewStyle extends androidx.autofill.inline.common.ViewStyle {
   }
 
   public static final class TextViewStyle.Builder {
@@ -112,7 +112,7 @@
     method public androidx.autofill.inline.common.TextViewStyle.Builder setTypeface(String, int);
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public class ViewStyle {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public class ViewStyle {
   }
 
   public static final class ViewStyle.Builder {
@@ -128,7 +128,7 @@
 
 package androidx.autofill.inline.v1 {
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class InlineSuggestionUi {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class InlineSuggestionUi {
     method public static androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder newContentBuilder(android.app.PendingIntent);
     method public static androidx.autofill.inline.v1.InlineSuggestionUi.Style.Builder newStyleBuilder();
   }
diff --git a/autofill/autofill/api/restricted_1.1.0-alpha02.txt b/autofill/autofill/api/restricted_1.1.0-alpha02.txt
index 78c7008..852dd23 100644
--- a/autofill/autofill/api/restricted_1.1.0-alpha02.txt
+++ b/autofill/autofill/api/restricted_1.1.0-alpha02.txt
@@ -47,18 +47,18 @@
 
 package androidx.autofill.inline {
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class Renderer {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class Renderer {
     method public static android.app.PendingIntent? getAttributionIntent(android.app.slice.Slice);
     method public static android.os.Bundle getSupportedInlineUiVersionsAsBundle();
     method public static android.view.View? render(android.content.Context, android.app.slice.Slice, android.os.Bundle);
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class SuggestionHintConstants {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class SuggestionHintConstants {
     field public static final String SUGGESTION_HINT_CLIPBOARD_CONTENT = "clipboardContent";
     field public static final String SUGGESTION_HINT_SMART_REPLY = "smartReply";
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class UiVersions {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class UiVersions {
     method public static java.util.List<java.lang.String!> getVersions(android.os.Bundle);
     method public static androidx.autofill.inline.UiVersions.StylesBuilder newStylesBuilder();
     field public static final String INLINE_UI_VERSION_1 = "androidx.autofill.inline.ui.version:v1";
@@ -83,7 +83,7 @@
 
 package androidx.autofill.inline.common {
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class ImageViewStyle extends androidx.autofill.inline.common.ViewStyle {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class ImageViewStyle extends androidx.autofill.inline.common.ViewStyle {
   }
 
   public static final class ImageViewStyle.Builder {
@@ -99,7 +99,7 @@
     method public androidx.autofill.inline.common.ImageViewStyle.Builder setTintList(android.content.res.ColorStateList);
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class TextViewStyle extends androidx.autofill.inline.common.ViewStyle {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class TextViewStyle extends androidx.autofill.inline.common.ViewStyle {
   }
 
   public static final class TextViewStyle.Builder {
@@ -115,7 +115,7 @@
     method public androidx.autofill.inline.common.TextViewStyle.Builder setTypeface(String, int);
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public class ViewStyle {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public class ViewStyle {
   }
 
   public static final class ViewStyle.Builder {
@@ -131,7 +131,7 @@
 
 package androidx.autofill.inline.v1 {
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class InlineSuggestionUi {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class InlineSuggestionUi {
     method public static androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder newContentBuilder(android.app.PendingIntent);
     method public static androidx.autofill.inline.v1.InlineSuggestionUi.Style.Builder newStyleBuilder();
   }
diff --git a/autofill/autofill/api/restricted_current.txt b/autofill/autofill/api/restricted_current.txt
index 78c7008..852dd23 100644
--- a/autofill/autofill/api/restricted_current.txt
+++ b/autofill/autofill/api/restricted_current.txt
@@ -47,18 +47,18 @@
 
 package androidx.autofill.inline {
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class Renderer {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class Renderer {
     method public static android.app.PendingIntent? getAttributionIntent(android.app.slice.Slice);
     method public static android.os.Bundle getSupportedInlineUiVersionsAsBundle();
     method public static android.view.View? render(android.content.Context, android.app.slice.Slice, android.os.Bundle);
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class SuggestionHintConstants {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class SuggestionHintConstants {
     field public static final String SUGGESTION_HINT_CLIPBOARD_CONTENT = "clipboardContent";
     field public static final String SUGGESTION_HINT_SMART_REPLY = "smartReply";
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class UiVersions {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class UiVersions {
     method public static java.util.List<java.lang.String!> getVersions(android.os.Bundle);
     method public static androidx.autofill.inline.UiVersions.StylesBuilder newStylesBuilder();
     field public static final String INLINE_UI_VERSION_1 = "androidx.autofill.inline.ui.version:v1";
@@ -83,7 +83,7 @@
 
 package androidx.autofill.inline.common {
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class ImageViewStyle extends androidx.autofill.inline.common.ViewStyle {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class ImageViewStyle extends androidx.autofill.inline.common.ViewStyle {
   }
 
   public static final class ImageViewStyle.Builder {
@@ -99,7 +99,7 @@
     method public androidx.autofill.inline.common.ImageViewStyle.Builder setTintList(android.content.res.ColorStateList);
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class TextViewStyle extends androidx.autofill.inline.common.ViewStyle {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class TextViewStyle extends androidx.autofill.inline.common.ViewStyle {
   }
 
   public static final class TextViewStyle.Builder {
@@ -115,7 +115,7 @@
     method public androidx.autofill.inline.common.TextViewStyle.Builder setTypeface(String, int);
   }
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public class ViewStyle {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public class ViewStyle {
   }
 
   public static final class ViewStyle.Builder {
@@ -131,7 +131,7 @@
 
 package androidx.autofill.inline.v1 {
 
-  @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public final class InlineSuggestionUi {
+  @RequiresApi(api=android.os.Build.VERSION_CODES.R) public final class InlineSuggestionUi {
     method public static androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder newContentBuilder(android.app.PendingIntent);
     method public static androidx.autofill.inline.v1.InlineSuggestionUi.Style.Builder newStyleBuilder();
   }
diff --git a/autofill/autofill/src/androidTest/java/androidx/autofill/inline/RendererTest.java b/autofill/autofill/src/androidTest/java/androidx/autofill/inline/RendererTest.java
index 5917d76..c186e75 100644
--- a/autofill/autofill/src/androidTest/java/androidx/autofill/inline/RendererTest.java
+++ b/autofill/autofill/src/androidTest/java/androidx/autofill/inline/RendererTest.java
@@ -53,7 +53,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-@SdkSuppress(minSdkVersion = 29) // Needed only on 29 and above
+@SdkSuppress(minSdkVersion = 30) // Needed only on 30 and above
 public class RendererTest {
 
     @Rule
diff --git a/autofill/autofill/src/androidTest/java/androidx/autofill/inline/UiVersionsTest.java b/autofill/autofill/src/androidTest/java/androidx/autofill/inline/UiVersionsTest.java
index 64069bf..67c3d12 100644
--- a/autofill/autofill/src/androidTest/java/androidx/autofill/inline/UiVersionsTest.java
+++ b/autofill/autofill/src/androidTest/java/androidx/autofill/inline/UiVersionsTest.java
@@ -33,7 +33,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-@SdkSuppress(minSdkVersion = 29) // Needed only on 29 and above
+@SdkSuppress(minSdkVersion = 30) // Needed only on 30 and above
 public class UiVersionsTest {
 
     @Test
diff --git a/autofill/autofill/src/androidTest/java/androidx/autofill/inline/common/ImageViewStyleTest.java b/autofill/autofill/src/androidTest/java/androidx/autofill/inline/common/ImageViewStyleTest.java
index 1946c73..6fd19fb 100644
--- a/autofill/autofill/src/androidTest/java/androidx/autofill/inline/common/ImageViewStyleTest.java
+++ b/autofill/autofill/src/androidTest/java/androidx/autofill/inline/common/ImageViewStyleTest.java
@@ -34,7 +34,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-@SdkSuppress(minSdkVersion = 29) // Needed only on 29 and above
+@SdkSuppress(minSdkVersion = 30) // Needed only on 30 and above
 public class ImageViewStyleTest {
     private Context mContext;
 
diff --git a/autofill/autofill/src/androidTest/java/androidx/autofill/inline/common/TextViewStyleTest.java b/autofill/autofill/src/androidTest/java/androidx/autofill/inline/common/TextViewStyleTest.java
index 95aad04..b6a1fcf 100644
--- a/autofill/autofill/src/androidTest/java/androidx/autofill/inline/common/TextViewStyleTest.java
+++ b/autofill/autofill/src/androidTest/java/androidx/autofill/inline/common/TextViewStyleTest.java
@@ -34,7 +34,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-@SdkSuppress(minSdkVersion = 29) // Needed only on 29 and above
+@SdkSuppress(minSdkVersion = 30) // Needed only on 30 and above
 public class TextViewStyleTest {
     private Context mContext;
 
diff --git a/autofill/autofill/src/androidTest/java/androidx/autofill/inline/common/ViewStyleTest.java b/autofill/autofill/src/androidTest/java/androidx/autofill/inline/common/ViewStyleTest.java
index 7f8df02..dbd2222 100644
--- a/autofill/autofill/src/androidTest/java/androidx/autofill/inline/common/ViewStyleTest.java
+++ b/autofill/autofill/src/androidTest/java/androidx/autofill/inline/common/ViewStyleTest.java
@@ -35,7 +35,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-@SdkSuppress(minSdkVersion = 29) // Needed only on 29 and above
+@SdkSuppress(minSdkVersion = 30) // Needed only on 30 and above
 public class ViewStyleTest {
 
     private Context mContext;
diff --git a/autofill/autofill/src/androidTest/java/androidx/autofill/inline/v1/InlineSuggestionUiTest.java b/autofill/autofill/src/androidTest/java/androidx/autofill/inline/v1/InlineSuggestionUiTest.java
index 78a2d4f..e26e5af 100644
--- a/autofill/autofill/src/androidTest/java/androidx/autofill/inline/v1/InlineSuggestionUiTest.java
+++ b/autofill/autofill/src/androidTest/java/androidx/autofill/inline/v1/InlineSuggestionUiTest.java
@@ -65,7 +65,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-@SdkSuppress(minSdkVersion = 29) // Needed only on 29 and above
+@SdkSuppress(minSdkVersion = 30) // Needed only on 30 and above
 public class InlineSuggestionUiTest {
 
     private static final String TITLE = "Hello world!";
diff --git a/autofill/autofill/src/main/java/androidx/autofill/inline/Renderer.java b/autofill/autofill/src/main/java/androidx/autofill/inline/Renderer.java
index 72d11ab..0adb5cb 100644
--- a/autofill/autofill/src/main/java/androidx/autofill/inline/Renderer.java
+++ b/autofill/autofill/src/main/java/androidx/autofill/inline/Renderer.java
@@ -33,7 +33,7 @@
 /**
  * Renderer class responsible for rendering the inline suggestion UI.
  */
-@RequiresApi(api = Build.VERSION_CODES.Q) //TODO(b/147116534): Update to R.
+@RequiresApi(api = Build.VERSION_CODES.R)
 public final class Renderer {
 
     private static final String TAG = "Renderer";
diff --git a/autofill/autofill/src/main/java/androidx/autofill/inline/SuggestionHintConstants.java b/autofill/autofill/src/main/java/androidx/autofill/inline/SuggestionHintConstants.java
index 8894732..f5bbb00 100644
--- a/autofill/autofill/src/main/java/androidx/autofill/inline/SuggestionHintConstants.java
+++ b/autofill/autofill/src/main/java/androidx/autofill/inline/SuggestionHintConstants.java
@@ -32,7 +32,7 @@
  * associated hints to help rank and evaluate the quality of the suggestion based on user action
  * on them.
  */
-@RequiresApi(api = Build.VERSION_CODES.Q) //TODO(b/147116534): Update to R.
+@RequiresApi(api = Build.VERSION_CODES.R)
 public final class SuggestionHintConstants {
     private SuggestionHintConstants() {}
 
diff --git a/autofill/autofill/src/main/java/androidx/autofill/inline/UiVersions.java b/autofill/autofill/src/main/java/androidx/autofill/inline/UiVersions.java
index 6b0083d..d98a858 100644
--- a/autofill/autofill/src/main/java/androidx/autofill/inline/UiVersions.java
+++ b/autofill/autofill/src/main/java/androidx/autofill/inline/UiVersions.java
@@ -37,7 +37,7 @@
 /**
  * Defines the inline suggestion UI version constants.
  */
-@RequiresApi(api = Build.VERSION_CODES.Q) //TODO(b/147116534): Update to R.
+@RequiresApi(api = Build.VERSION_CODES.R)
 public final class UiVersions {
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
diff --git a/autofill/autofill/src/main/java/androidx/autofill/inline/VersionUtils.java b/autofill/autofill/src/main/java/androidx/autofill/inline/VersionUtils.java
index fb35f9c..4c53b2e 100644
--- a/autofill/autofill/src/main/java/androidx/autofill/inline/VersionUtils.java
+++ b/autofill/autofill/src/main/java/androidx/autofill/inline/VersionUtils.java
@@ -35,7 +35,7 @@
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY)
-@RequiresApi(api = Build.VERSION_CODES.Q) //TODO(b/147116534): Update to R.
+@RequiresApi(api = Build.VERSION_CODES.R)
 public final class VersionUtils {
     /**
      * Bundle key pointing to a list representing UI versions.
diff --git a/autofill/autofill/src/main/java/androidx/autofill/inline/common/BundledStyle.java b/autofill/autofill/src/main/java/androidx/autofill/inline/common/BundledStyle.java
index b5e0523..57b36c8 100644
--- a/autofill/autofill/src/main/java/androidx/autofill/inline/common/BundledStyle.java
+++ b/autofill/autofill/src/main/java/androidx/autofill/inline/common/BundledStyle.java
@@ -32,7 +32,7 @@
  * @hide
  */
 @RestrictTo(LIBRARY)
-@RequiresApi(api = Build.VERSION_CODES.Q) //TODO(b/147116534): Update to R.
+@RequiresApi(api = Build.VERSION_CODES.R)
 public abstract class BundledStyle {
 
     @NonNull
diff --git a/autofill/autofill/src/main/java/androidx/autofill/inline/common/ImageViewStyle.java b/autofill/autofill/src/main/java/androidx/autofill/inline/common/ImageViewStyle.java
index c571052..20d1a11 100644
--- a/autofill/autofill/src/main/java/androidx/autofill/inline/common/ImageViewStyle.java
+++ b/autofill/autofill/src/main/java/androidx/autofill/inline/common/ImageViewStyle.java
@@ -30,7 +30,7 @@
 /**
  * Specifies the style for an  {@link ImageView}.
  */
-@RequiresApi(api = Build.VERSION_CODES.Q) //TODO(b/147116534): Update to R.
+@RequiresApi(api = Build.VERSION_CODES.R)
 public final class ImageViewStyle extends ViewStyle {
     private static final String TAG = "ImageViewStyle";
 
diff --git a/autofill/autofill/src/main/java/androidx/autofill/inline/common/SlicedContent.java b/autofill/autofill/src/main/java/androidx/autofill/inline/common/SlicedContent.java
index a29f98f..ce9f062 100644
--- a/autofill/autofill/src/main/java/androidx/autofill/inline/common/SlicedContent.java
+++ b/autofill/autofill/src/main/java/androidx/autofill/inline/common/SlicedContent.java
@@ -35,7 +35,7 @@
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY)
-@RequiresApi(api = Build.VERSION_CODES.Q) //TODO(b/147116534): Update to R.
+@RequiresApi(api = Build.VERSION_CODES.R)
 public abstract class SlicedContent implements UiVersions.Content {
 
     static final Uri INLINE_SLICE_URI = Uri.parse("inline.slice");
diff --git a/autofill/autofill/src/main/java/androidx/autofill/inline/common/TextViewStyle.java b/autofill/autofill/src/main/java/androidx/autofill/inline/common/TextViewStyle.java
index a7d0293..97ac43e 100644
--- a/autofill/autofill/src/main/java/androidx/autofill/inline/common/TextViewStyle.java
+++ b/autofill/autofill/src/main/java/androidx/autofill/inline/common/TextViewStyle.java
@@ -32,7 +32,7 @@
 /**
  * Specifies the style for a {@link TextView}.
  */
-@RequiresApi(api = Build.VERSION_CODES.Q) //TODO(b/147116534): Update to R.
+@RequiresApi(api = Build.VERSION_CODES.R)
 public final class TextViewStyle extends ViewStyle {
 
     private static final String KEY_TEXT_VIEW_STYLE = "text_view_style";
diff --git a/autofill/autofill/src/main/java/androidx/autofill/inline/common/ViewStyle.java b/autofill/autofill/src/main/java/androidx/autofill/inline/common/ViewStyle.java
index a47c354..b3698b3 100644
--- a/autofill/autofill/src/main/java/androidx/autofill/inline/common/ViewStyle.java
+++ b/autofill/autofill/src/main/java/androidx/autofill/inline/common/ViewStyle.java
@@ -32,7 +32,7 @@
 /**
  * Specifies the style for a {@link View} or a {@link android.view.ViewGroup}.
  */
-@RequiresApi(api = Build.VERSION_CODES.Q) //TODO(b/147116534): Update to R.
+@RequiresApi(api = Build.VERSION_CODES.R)
 public class ViewStyle extends BundledStyle {
 
     private static final String KEY_VIEW_STYLE = "view_style";
diff --git a/autofill/autofill/src/main/java/androidx/autofill/inline/v1/InlineSuggestionUi.java b/autofill/autofill/src/main/java/androidx/autofill/inline/v1/InlineSuggestionUi.java
index 2b5037a..156fb78 100644
--- a/autofill/autofill/src/main/java/androidx/autofill/inline/v1/InlineSuggestionUi.java
+++ b/autofill/autofill/src/main/java/androidx/autofill/inline/v1/InlineSuggestionUi.java
@@ -64,7 +64,7 @@
  * <p>A default theme will be applied on the UI. The client can use {@link Style} to customize
  * the style for individual widgets as well as the overall UI background.
  */
-@RequiresApi(api = Build.VERSION_CODES.Q) //TODO(b/147116534): Update to R.
+@RequiresApi(api = Build.VERSION_CODES.R)
 public final class InlineSuggestionUi {
     private static final String TAG = "InlineSuggestionUi";
 
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
index 9ba1497..c1ac1ed 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -79,7 +79,7 @@
     val MEDIA2 = Version("1.1.0-alpha02")
     val MEDIAROUTER = Version("1.2.0-alpha02")
     val NAVIGATION = Version("2.4.0-alpha01")
-    val PAGING = Version("3.0.0-alpha03")
+    val PAGING = Version("3.0.0-alpha04")
     val PALETTE = Version("1.1.0-alpha01")
     val PRINT = Version("1.1.0-alpha01")
     val PERCENTLAYOUT = Version("1.1.0-alpha01")
diff --git a/buildSrc/src/main/kotlin/androidx/build/studio/StudioTask.kt b/buildSrc/src/main/kotlin/androidx/build/studio/StudioTask.kt
index 55a4340..f07253d 100644
--- a/buildSrc/src/main/kotlin/androidx/build/studio/StudioTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/studio/StudioTask.kt
@@ -94,6 +94,12 @@
     protected abstract val ideaProperties: File
 
     /**
+     * The studio.vmoptions file that we want to start Studio with
+     */
+    @get:Internal
+    open val vmOptions = File(project.getSupportRootFolder(), "development/studio/studio.vmoptions")
+
+    /**
      * [StudioArchiveCreator] that will ensure that an archive is present at [studioArchivePath]
      */
     @get:Internal
@@ -128,8 +134,6 @@
     }
 
     private fun launchStudio() {
-        val vmOptions = File(project.getSupportRootFolder(), "development/studio/studio.vmoptions")
-
         ProcessBuilder().apply {
             inheritIO()
             with(platformUtilities) { command(launchCommandArguments) }
@@ -226,5 +230,7 @@
  * Task for launching studio in a playground project
  */
 open class PlaygroundStudioTask : RootStudioTask() {
-    override val installParentDir get() = project.rootProject.projectDir.resolve("..")
+    override val installParentDir get() = projectRoot.resolve("..")
+    override val ideaProperties get() = projectRoot.resolve("../playground-common/idea.properties")
+    override val vmOptions get() = projectRoot.resolve("../playground-common/studio.vmoptions")
 }
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ProcessingImageReaderDeviceTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/ProcessingImageReaderDeviceTest.kt
index 33cf679..bfa7b2f 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ProcessingImageReaderDeviceTest.kt
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ProcessingImageReaderDeviceTest.kt
@@ -99,7 +99,7 @@
                 )
 
                 processingImageReader.setCaptureBundle(mCaptureBundle)
-                val imageWriter = ImageWriter.newInstance(processingImageReader.surface, 2)
+                val imageWriter = ImageWriter.newInstance(processingImageReader.surface!!, 2)
                 val callback = processingImageReader.cameraCaptureCallback!!
 
                 // Trigger the bundle of images required for processing to occur
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java
index 7acea606..a2ac50e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java
@@ -123,7 +123,7 @@
         return mImageReader.getMaxImages();
     }
 
-    @NonNull
+    @Nullable
     @Override
     public synchronized Surface getSurface() {
         return mImageReader.getSurface();
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 da19d29..4db48a4 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
@@ -18,6 +18,7 @@
 
 import android.app.Application;
 import android.content.Context;
+import android.content.ContextWrapper;
 import android.content.res.Resources;
 import android.os.Handler;
 import android.os.HandlerThread;
@@ -96,7 +97,9 @@
     private CameraFactory mCameraFactory;
     private CameraDeviceSurfaceManager mSurfaceManager;
     private UseCaseConfigFactory mDefaultConfigFactory;
-    private Application mApplication;
+    // TODO(b/161302102): Remove the stored context. Only make use of the context within the
+    //  called method.
+    private Context mAppContext;
 
     @GuardedBy("mInitializeLock")
     private InternalInitState mInitState = InternalInitState.UNINITIALIZED;
@@ -371,14 +374,15 @@
 
     /**
      * Returns the context used for CameraX.
-     *
+     * @deprecated This method will be removed. New code should not rely on it. See b/161302102.
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
     @NonNull
+    @Deprecated
     public static Context getContext() {
         CameraX cameraX = checkInitialized();
-        return cameraX.mApplication;
+        return cameraX.mAppContext;
     }
 
     /**
@@ -453,10 +457,9 @@
             }
 
             if (instanceFuture == null) {
-                Application app = (Application) context.getApplicationContext();
                 if (!isConfigured) {
                     // Attempt initialization through Application or Resources
-                    CameraXConfig.Provider configProvider = getConfigProvider(app);
+                    CameraXConfig.Provider configProvider = getConfigProvider(context);
                     if (configProvider == null) {
                         throw new IllegalStateException("CameraX is not configured properly. "
                                 + "The most likely cause is you did not include a default "
@@ -466,7 +469,7 @@
                     configureInstanceLocked(configProvider);
                 }
 
-                initializeInstanceLocked(app);
+                initializeInstanceLocked(context);
                 instanceFuture = getInstanceLocked();
             }
 
@@ -475,15 +478,16 @@
     }
 
     @Nullable
-    private static CameraXConfig.Provider getConfigProvider(@NonNull Application app) {
+    private static CameraXConfig.Provider getConfigProvider(@NonNull Context context) {
         CameraXConfig.Provider configProvider = null;
-        if (app instanceof CameraXConfig.Provider) {
+        Application application = getApplicationFromContext(context);
+        if (application instanceof CameraXConfig.Provider) {
             // Application is a CameraXConfig.Provider, use this directly
-            configProvider = (CameraXConfig.Provider) app;
+            configProvider = (CameraXConfig.Provider) application;
         } else {
             // Try to retrieve the CameraXConfig.Provider through the application's resources
             try {
-                Resources resources = app.getResources();
+                Resources resources = context.getApplicationContext().getResources();
                 String defaultProviderClassName =
                         resources.getString(
                                 R.string.androidx_camera_default_config_provider);
@@ -497,7 +501,8 @@
                     | InstantiationException
                     | InvocationTargetException
                     | NoSuchMethodException
-                    | IllegalAccessException e) {
+                    | IllegalAccessException
+                    | NullPointerException e) {
                 Log.e(TAG, "Failed to retrieve default CameraXConfig.Provider from "
                         + "resources", e);
             }
@@ -506,6 +511,30 @@
         return configProvider;
     }
 
+    /**
+     * Attempts to retrieve an {@link Application} object from the provided {@link Context}.
+     *
+     * <p>Because the contract does not specify that {@code Context.getApplicationContext()} must
+     * return an {@code Application} object, this method will attempt to retrieve the
+     * {@code Application} by unwrapping the context via {@link ContextWrapper#getBaseContext()} if
+     * {@code Context.getApplicationContext()}} does not succeed.
+     */
+    @Nullable
+    private static Application getApplicationFromContext(@NonNull Context context) {
+        Application application = null;
+        Context appContext = context.getApplicationContext();
+        while (appContext instanceof ContextWrapper) {
+            if (appContext instanceof Application) {
+                application = (Application) appContext;
+                break;
+            } else {
+                appContext = ((ContextWrapper) appContext).getBaseContext();
+            }
+        }
+
+        return application;
+    }
+
     @NonNull
     private static ListenableFuture<CameraX> getInstance() {
         synchronized (INSTANCE_LOCK) {
@@ -590,7 +619,12 @@
                         cameraExecutor.execute(() -> {
                             InitializationException initException = null;
                             try {
-                                mApplication = (Application) context.getApplicationContext();
+                                // TODO(b/161302102): Remove the stored context. Only make use of
+                                //  the context within the called method.
+                                mAppContext = getApplicationFromContext(context);
+                                if (mAppContext == null) {
+                                    mAppContext = context.getApplicationContext();
+                                }
                                 CameraFactory.Provider cameraFactoryProvider =
                                         mCameraXConfig.getCameraFactoryProvider(null);
                                 if (cameraFactoryProvider == null) {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/MetadataImageReader.java b/camera/camera-core/src/main/java/androidx/camera/core/MetadataImageReader.java
index 7b5fa93..0b601ab 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/MetadataImageReader.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/MetadataImageReader.java
@@ -228,7 +228,7 @@
         }
     }
 
-    @NonNull
+    @Nullable
     @Override
     public Surface getSurface() {
         synchronized (mLock) {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ProcessingImageReader.java b/camera/camera-core/src/main/java/androidx/camera/core/ProcessingImageReader.java
index 636a9c4..00047f0 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ProcessingImageReader.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ProcessingImageReader.java
@@ -242,7 +242,7 @@
         }
     }
 
-    @NonNull
+    @Nullable
     @Override
     public Surface getSurface() {
         synchronized (mLock) {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SafeCloseImageReaderProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/SafeCloseImageReaderProxy.java
index 4aac531..f4dae65 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SafeCloseImageReaderProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SafeCloseImageReaderProxy.java
@@ -42,7 +42,7 @@
     @GuardedBy("mLock")
     private final ImageReaderProxy mImageReaderProxy;
 
-    @NonNull
+    @Nullable
     private final Surface mSurface;
 
     // Called after images are closed to check if the ImageReaderProxy should be closed
@@ -87,7 +87,9 @@
     @Override
     public void close() {
         synchronized (mLock) {
-            mSurface.release();
+            if (mSurface != null) {
+                mSurface.release();
+            }
             mImageReaderProxy.close();
         }
     }
@@ -155,7 +157,7 @@
         }
     }
 
-    @NonNull
+    @Nullable
     @Override
     public Surface getSurface() {
         synchronized (mLock) {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageReaderProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageReaderProxy.java
index d72c89a..4b2d253 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageReaderProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageReaderProxy.java
@@ -92,7 +92,7 @@
      *
      * <p>@see {@link ImageReader#getSurface()}.
      */
-    @NonNull
+    @Nullable
     Surface getSurface();
 
     /**
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/CameraUtil.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/CameraUtil.java
index 71862dd..fc577e0 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/CameraUtil.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/CameraUtil.java
@@ -56,6 +56,8 @@
 
     static CameraCharacteristics getCameraCharacteristics(String cameraId) {
         Preconditions.checkNotNull(cameraId, "Invalid camera id.");
+        // TODO(b/161302102): Remove usage of deprecated CameraX.getContext()
+        @SuppressWarnings("deprecation")
         Context context = CameraX.getContext();
         CameraManagerCompat cameraManager = CameraManagerCompat.from(context);
         CameraCharacteristics cameraCharacteristics = null;
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsManager.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsManager.java
index dca706a..a82f15b 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsManager.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsManager.java
@@ -15,6 +15,7 @@
  */
 package androidx.camera.extensions;
 
+import android.content.Context;
 import android.os.Handler;
 import android.os.Looper;
 import android.util.Log;
@@ -113,8 +114,10 @@
 
         return CallbackToFutureAdapter.getFuture(completer -> {
             try {
-                InitializerImpl.init(VersionName.getCurrentVersion().toVersionString(),
-                        CameraX.getContext(),
+                // TODO(b/161302102): Remove usage of deprecated CameraX.getContext()
+                @SuppressWarnings("deprecation")
+                Context context = CameraX.getContext();
+                InitializerImpl.init(VersionName.getCurrentVersion().toVersionString(), context,
                         new InitializerImpl.OnExtensionsInitializedCallback() {
                             @Override
                             public void onSuccess() {
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java
index 527b3e2..a7b7030 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java
@@ -16,6 +16,7 @@
 
 package androidx.camera.extensions;
 
+import android.content.Context;
 import android.hardware.camera2.CameraCharacteristics;
 import android.util.Log;
 import android.util.Pair;
@@ -221,7 +222,10 @@
             if (mActive.get()) {
                 CameraCharacteristics cameraCharacteristics = CameraUtil.getCameraCharacteristics(
                         cameraId);
-                mImpl.onInit(cameraId, cameraCharacteristics, CameraX.getContext());
+                // TODO(b/161302102): Remove usage of deprecated CameraX.getContext()
+                @SuppressWarnings("deprecation")
+                Context context = CameraX.getContext();
+                mImpl.onInit(cameraId, cameraCharacteristics, context);
             }
         }
 
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/PreviewExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/PreviewExtender.java
index 39e461a..6f28ce4 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/PreviewExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/PreviewExtender.java
@@ -16,6 +16,7 @@
 
 package androidx.camera.extensions;
 
+import android.content.Context;
 import android.hardware.camera2.CameraCharacteristics;
 import android.util.Log;
 import android.util.Pair;
@@ -236,7 +237,10 @@
                 if (mActive) {
                     CameraCharacteristics cameraCharacteristics =
                             CameraUtil.getCameraCharacteristics(cameraId);
-                    mImpl.onInit(cameraId, cameraCharacteristics, CameraX.getContext());
+                    // TODO(b/161302102): Remove usage of deprecated CameraX.getContext()
+                    @SuppressWarnings("deprecation")
+                    Context context = CameraX.getContext();
+                    mImpl.onInit(cameraId, cameraCharacteristics, context);
                 }
             }
         }
diff --git a/camera/camera-lifecycle/build.gradle b/camera/camera-lifecycle/build.gradle
index 17cf0959..57fe2aa 100644
--- a/camera/camera-lifecycle/build.gradle
+++ b/camera/camera-lifecycle/build.gradle
@@ -44,6 +44,7 @@
     androidTestImplementation(project(":annotation:annotation-experimental"))
     androidTestImplementation(project(":concurrent:concurrent-futures-ktx"))
     androidTestImplementation(project(":internal-testutils-truth"))
+    androidTestImplementation("org.jetbrains.kotlinx:atomicfu:0.13.1")
 }
 
 android {
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 436dbf3..72fe277 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,7 +16,10 @@
 
 package androidx.camera.lifecycle
 
+import android.app.Application
 import android.content.Context
+import android.content.ContextWrapper
+import android.content.res.Resources
 import androidx.annotation.experimental.UseExperimental
 import androidx.camera.core.CameraSelector
 import androidx.camera.core.CameraXConfig
@@ -35,6 +38,7 @@
 import androidx.test.filters.SmallTest
 import androidx.testutils.assertThrows
 import com.google.common.truth.Truth.assertThat
+import kotlinx.atomicfu.atomic
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.MainScope
 import kotlinx.coroutines.asExecutor
@@ -45,7 +49,7 @@
 @SmallTest
 class ProcessCameraProviderTest {
 
-    private val context = ApplicationProvider.getApplicationContext() as android.content.Context
+    private val context = ApplicationProvider.getApplicationContext() as Context
     private val lifecycleOwner0 = FakeLifecycleOwner()
     private val lifecycleOwner1 = FakeLifecycleOwner()
 
@@ -72,6 +76,55 @@
         }
     }
 
+    @Test
+    fun canGetInstance_fromResources() = runBlocking {
+        // Wrap the context with a TestAppContextWrapper. This returns customized resources which
+        // will provide a CameraXConfig.Provider.
+        val contextWrapper = TestAppContextWrapper(context)
+        provider = ProcessCameraProvider.getInstance(contextWrapper).await()
+        assertThat(provider).isNotNull()
+        assertThat(contextWrapper.testResources.defaultProviderRetrieved).isTrue()
+    }
+
+    @UseExperimental(ExperimentalCameraProviderConfiguration::class)
+    @Test
+    fun configuredGetInstance_doesNotUseResources() {
+        ProcessCameraProvider.configureInstance(FakeAppConfig.create())
+        runBlocking {
+            // Wrap the context with a TestAppContextWrapper. This returns customized resources
+            // which we can check whether a default config provider was provided.
+            val contextWrapper = TestAppContextWrapper(context)
+            provider = ProcessCameraProvider.getInstance(contextWrapper).await()
+            assertThat(provider).isNotNull()
+            assertThat(contextWrapper.testResources.defaultProviderRetrieved).isFalse()
+        }
+    }
+
+    @UseExperimental(ExperimentalCameraProviderConfiguration::class)
+    @Test
+    fun configuredGetInstance_doesNotUseApplication() {
+        ProcessCameraProvider.configureInstance(FakeAppConfig.create())
+        runBlocking {
+            // Wrap the context with a TestAppContextWrapper and provide a context with an
+            // Application that implements CameraXConfig.Provider. Because the
+            // ProcessCameraProvider is already configured, this Application should not be used.
+            val testApp = TestApplication()
+            val contextWrapper = TestAppContextWrapper(context, testApp)
+            provider = ProcessCameraProvider.getInstance(contextWrapper).await()
+            assertThat(provider).isNotNull()
+            assertThat(testApp.providerUsed).isFalse()
+        }
+    }
+
+    @Test
+    fun unconfiguredGetInstance_usesApplicationProvider() = runBlocking {
+        val testApp = TestApplication()
+        val contextWrapper = TestAppContextWrapper(context, testApp)
+        provider = ProcessCameraProvider.getInstance(contextWrapper).await()
+        assertThat(provider).isNotNull()
+        assertThat(testApp.providerUsed).isTrue()
+    }
+
     @UseExperimental(ExperimentalCameraProviderConfiguration::class)
     @Test
     fun multipleConfigureInstance_throwsISE() {
@@ -470,3 +523,47 @@
         }
     }
 }
+
+private class TestAppContextWrapper(base: Context, val app: Application? = null) : ContextWrapper
+    (base) {
+
+    val testResources = TestResources(base.resources)
+
+    override fun getApplicationContext(): Context? {
+        return app ?: this
+    }
+
+    override fun getResources(): Resources {
+        return testResources
+    }
+}
+
+private class TestApplication : Application(), CameraXConfig.Provider {
+    private val used = atomic(false)
+    val providerUsed: Boolean
+        get() = used.value
+
+    override fun getCameraXConfig(): CameraXConfig {
+        used.value = true
+        return FakeAppConfig.create()
+    }
+}
+
+@Suppress("DEPRECATION")
+private class TestResources(base: Resources) : Resources(
+    base.assets, base.displayMetrics, base
+        .configuration
+) {
+
+    private val retrieved = atomic(false)
+    val defaultProviderRetrieved: Boolean
+        get() = retrieved.value
+
+    override fun getString(id: Int): String {
+        if (id == androidx.camera.core.R.string.androidx_camera_default_config_provider) {
+            retrieved.value = true
+            return FakeAppConfig.DefaultProvider::class.java.name
+        }
+        return super.getString(id)
+    }
+}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java b/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java
index 16cbb4b..70ef57d 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java
@@ -129,7 +129,7 @@
                 new CameraSelector.Builder().requireLensFacing(mLensFacing).build();
 
         try {
-            CameraX cameraX = CameraX.getOrCreateInstance(CameraX.getContext()).get();
+            CameraX cameraX = CameraX.getOrCreateInstance(this).get();
             LinkedHashSet<CameraInternal> cameras =
                     cameraSelector.filter(cameraX.getCameraRepository().getCameras());
             mCameraUseCaseAdapter = new CameraUseCaseAdapter(cameras.iterator().next(), cameras,
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 96be3b1f..db7b8d8 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
@@ -17,6 +17,7 @@
 package androidx.camera.testing.fakes;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.CameraXConfig;
 import androidx.camera.core.impl.CameraDeviceSurfaceManager;
@@ -63,4 +64,15 @@
 
         return appConfigBuilder.build();
     }
+
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public static final class DefaultProvider implements CameraXConfig.Provider {
+
+        @NonNull
+        @Override
+        public CameraXConfig getCameraXConfig() {
+            return create();
+        }
+    }
 }
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageReaderProxy.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageReaderProxy.java
index 5e30252..7e70b84 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageReaderProxy.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageReaderProxy.java
@@ -17,7 +17,6 @@
 package androidx.camera.testing.fakes;
 
 import android.graphics.ImageFormat;
-import android.graphics.SurfaceTexture;
 import android.view.Surface;
 
 import androidx.annotation.NonNull;
@@ -158,14 +157,9 @@
         return mMaxImages;
     }
 
-    @NonNull
+    @Nullable
     @Override
     public Surface getSurface() {
-        // Create a Surface using a SurfaceTexture since getSurface() requires a non-null value.
-        // However, this Surface shouldn't really be used since it isn't hooked up to anything
-        if (mSurface == null) {
-            mSurface = new Surface(new SurfaceTexture(0));
-        }
         return mSurface;
     }
 
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java b/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
index dd25b6e..b692e83 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
@@ -58,6 +58,19 @@
  * <p> This class manages the Surface lifecycle, as well as the preview aspect ratio and
  * orientation. Internally, it uses either a {@link android.view.TextureView} or
  * {@link android.view.SurfaceView} to display the camera feed.
+ *
+ * <p> If {@link PreviewView} uses a {@link android.view.SurfaceView} to display the preview
+ * stream, be careful when overlapping a {@link View} that's initially not visible (either
+ * {@link View#INVISIBLE} or {@link View#GONE}) on top of it. When the
+ * {@link android.view.SurfaceView} is attached to the display window, it calls
+ * {@link android.view.ViewParent#requestTransparentRegion(View)} which requests a computation of
+ * the transparent regions on the display. At this point, the {@link View} isn't visible, causing
+ * the overlapped region between the {@link android.view.SurfaceView} and the {@link View} to be
+ * considered transparent. Later if the {@link View} becomes {@linkplain View#VISIBLE visible}, it
+ * will not be displayed on top of {@link android.view.SurfaceView}. A way around this is to call
+ * {@link android.view.ViewParent#requestTransparentRegion(View)} right after making the
+ * {@link View} visible, or initially hiding the {@link View} by setting its
+ * {@linkplain View#setAlpha(float) opacity} to 0, then setting it to 1.0F to show it.
  */
 public class PreviewView extends FrameLayout {
 
diff --git a/camera/integration-tests/camerapipetestapp/build.gradle b/camera/integration-tests/camerapipetestapp/build.gradle
index 62e57cb..9a95fa2 100644
--- a/camera/integration-tests/camerapipetestapp/build.gradle
+++ b/camera/integration-tests/camerapipetestapp/build.gradle
@@ -58,6 +58,7 @@
 
     // Testing framework
     testImplementation(JUNIT)
+    testImplementation(TRUTH)
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
diff --git a/camera/integration-tests/camerapipetestapp/src/main/java/androidx/camera/integration/camera2/pipe/mappings/CameraMetadataKey.kt b/camera/integration-tests/camerapipetestapp/src/main/java/androidx/camera/integration/camera2/pipe/mappings/CameraMetadataKey.kt
new file mode 100644
index 0000000..8d0297b
--- /dev/null
+++ b/camera/integration-tests/camerapipetestapp/src/main/java/androidx/camera/integration/camera2/pipe/mappings/CameraMetadataKey.kt
@@ -0,0 +1,24 @@
+/*
+ * 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.integration.camera2.pipe.mappings
+
+enum class CameraMetadataKey {
+    LENS_FOCUS_DISTANCE,
+    LENS_FOCAL_LENGTH,
+    CONTROL_AE_MODE,
+    STATISTICS_FACES
+}
\ No newline at end of file
diff --git a/camera/integration-tests/camerapipetestapp/src/main/java/androidx/camera/integration/camera2/pipe/mappings/DataTransformations1D.kt b/camera/integration-tests/camerapipetestapp/src/main/java/androidx/camera/integration/camera2/pipe/mappings/DataTransformations1D.kt
new file mode 100644
index 0000000..e2be233
--- /dev/null
+++ b/camera/integration-tests/camerapipetestapp/src/main/java/androidx/camera/integration/camera2/pipe/mappings/DataTransformations1D.kt
@@ -0,0 +1,117 @@
+/*
+ * 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.integration.camera2.pipe.mappings
+
+import android.hardware.camera2.params.Face
+import androidx.camera.integration.camera2.pipe.mappings.CameraMetadataKey.CONTROL_AE_MODE
+import androidx.camera.integration.camera2.pipe.mappings.CameraMetadataKey.LENS_FOCUS_DISTANCE
+import androidx.camera.integration.camera2.pipe.mappings.CameraMetadataKey.STATISTICS_FACES
+
+/**
+ * Transforms camera metadata into numbers to be visualized as 1D graphics
+ */
+object DataTransformations1D {
+
+    /**
+     * Tries to apply a specific transformation. If one exists, the resulting Number is returned.
+     * If none exist, we try to apply a type based transformation. If one exists, the resulting
+     * Number is returned. Otherwise, an error expressing the transformation is not supported is
+     * thrown.
+     */
+    fun convert(key: CameraMetadataKey, keyData: Any?): Number? {
+
+        specificTransformationMap[key]?.let {
+            return it(keyData)
+        }
+
+        return typeTransformation(key, keyData)
+    }
+
+    /**
+     * When converting data, this is the first transformation we will try to apply. It maps specific
+     * keys to a lambda function that can transform the corresponding data into a number
+     */
+    private val specificTransformationMap: HashMap<CameraMetadataKey, (Any?) -> Number?> =
+        hashMapOf(
+        /**
+         * LENS_FOCUS_DISTANCE has a specific transformation that maps Float inputs to their
+         * reciprocals, maps null input to null, and throws an IllegalArgumentException if the input
+         * is not of the expected type Float?
+         */
+        LENS_FOCUS_DISTANCE to { keyData: Any? ->
+            when (keyData) {
+                is Float -> 1 / keyData
+                else -> nullOrInvalid(LENS_FOCUS_DISTANCE, keyData)
+            }
+        },
+
+        /**
+         * CONTROL_AE_MODE has a specific transformation that upon an Int input returns that input
+         * as is since each Int corresponds to a mode (The strings describing these modes will be
+         * passed as a map into the data source for the visualization directly). Upon a null input,
+         * null will be returned, and upon any other input, an exception will be thrown
+         */
+        CONTROL_AE_MODE to { keyData: Any? ->
+            when (keyData) {
+                is Int -> keyData
+                else -> nullOrInvalid(CONTROL_AE_MODE, keyData)
+            }
+        },
+
+        /**
+         * STATISTICS_FACES has a specific transformation that maps Array<Face> inputs to array
+         * size of that input, maps null input to null, and throws an IllegalArgumentException if
+         * the input is not an Array, or is an Array of the wrong type
+         */
+        STATISTICS_FACES to { keyData: Any? ->
+            when (keyData) {
+                is Array<*> -> {
+                    if (keyData.isArrayOf<Face>()) {
+                        keyData.size
+                    } else {
+                        throw IllegalArgumentException("keyData for $STATISTICS_FACES expected " +
+                                "to be Array<Face>, but was ${keyData::class.simpleName}")
+                    }
+                }
+                else -> nullOrInvalid(STATISTICS_FACES, keyData)
+            }
+        }
+    )
+
+    /**
+     * When converting data, this function will be called only if the camera metadata key has no
+     * specific transformation defined in the specificTransformationMap above. This function
+     * converts keyData based on its type, and throws an exception if the type is not supported
+     */
+    private fun typeTransformation(key: CameraMetadataKey, keyData: Any?): Number? {
+        return when (keyData) {
+            is Number -> keyData
+            else -> nullOrInvalid(key, keyData)
+        }
+    }
+
+    /**
+     * This function is called when keyData doesn't match any valid type. If keyData is null,
+     * null is returned, but if keyData is some other type, we throw an Illegal Argument
+     * Exception explaining transformation is not supported for the keyData's type
+     */
+    private fun nullOrInvalid(key: CameraMetadataKey, keyData: Any?): Number? {
+        if (keyData == null) return null
+        throw IllegalArgumentException("keyData of type ${keyData::class.simpleName} for $key is" +
+                " not supported")
+    }
+}
\ No newline at end of file
diff --git a/camera/integration-tests/camerapipetestapp/src/test/java/androidx/camera/integration/camera2/pipe/DataTransformations1DTests.kt b/camera/integration-tests/camerapipetestapp/src/test/java/androidx/camera/integration/camera2/pipe/DataTransformations1DTests.kt
new file mode 100644
index 0000000..8bb90b7
--- /dev/null
+++ b/camera/integration-tests/camerapipetestapp/src/test/java/androidx/camera/integration/camera2/pipe/DataTransformations1DTests.kt
@@ -0,0 +1,132 @@
+/*
+ * 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.integration.camera2.pipe
+
+import androidx.camera.integration.camera2.pipe.mappings.CameraMetadataKey.CONTROL_AE_MODE
+import androidx.camera.integration.camera2.pipe.mappings.CameraMetadataKey.LENS_FOCAL_LENGTH
+import androidx.camera.integration.camera2.pipe.mappings.CameraMetadataKey.LENS_FOCUS_DISTANCE
+import androidx.camera.integration.camera2.pipe.mappings.CameraMetadataKey.STATISTICS_FACES
+import androidx.camera.integration.camera2.pipe.mappings.DataTransformations1D
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+
+class DataTransformations1DTests {
+
+    /**
+     * LENS_FOCUS_DISTANCE tests
+     */
+    @Test
+    fun lensFocusDistance_nullTest() {
+        assertThat(DataTransformations1D.convert(LENS_FOCUS_DISTANCE, null)).isNull()
+    }
+
+    @Test
+    fun lensFocusDistance_floatTest() {
+        val nums: MutableList<Float> = mutableListOf(1f, 32f, 64f, 1024f)
+        val transformedNums: MutableList<Float> = mutableListOf(1 / 1f, 1 / 32f, 1 / 64f, 1 / 1024f)
+
+        (0 until nums.size).forEach {
+            val transformedData = DataTransformations1D.convert(LENS_FOCUS_DISTANCE, nums[it])
+            assertThat(transformedData is Float).isTrue()
+            assertThat(transformedData as Float)
+                .isWithin(0.0001f)
+                .of(transformedNums[it])
+        }
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun lensFocusDistance_intTest() {
+        DataTransformations1D.convert(LENS_FOCUS_DISTANCE, 1)
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun lensFocusDistance_booleanTest() {
+        DataTransformations1D.convert(LENS_FOCUS_DISTANCE, true)
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun lensFocusDistance_arrayTest() {
+        DataTransformations1D.convert(LENS_FOCUS_DISTANCE, arrayListOf(1, 2))
+    }
+
+    /**
+     * CONTROL_AE_MODE tests
+     */
+    @Test
+    fun controlAEMode_nullTest() {
+        assertThat(DataTransformations1D.convert(CONTROL_AE_MODE, null)).isNull()
+    }
+
+    @Test
+    fun controlAEMode_arrayOfIntTest() {
+        val keyData = 4
+        val transformedData = DataTransformations1D.convert(CONTROL_AE_MODE, keyData)
+        assertThat(transformedData).isEqualTo(keyData)
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun controlAEMode_floatTest() {
+        DataTransformations1D.convert(CONTROL_AE_MODE, 18F)
+    }
+
+    /**
+     * STATISTICS_FACES tests
+     */
+    @Test
+    fun statisticsFaces_nullTest() {
+        assertThat(DataTransformations1D.convert(STATISTICS_FACES, null)).isNull()
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun statisticsFaces_arrayOfIntTest() {
+        val faces: Array<Int> = arrayOf()
+        DataTransformations1D.convert(STATISTICS_FACES, faces)
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun statisticsFaces_nonArrayTest() {
+        DataTransformations1D.convert(STATISTICS_FACES, 18L)
+    }
+
+    /**
+     * Tests for keys with no specific transformation e.g. LENS_FOCAL_LENGTH
+     */
+    @Test
+    fun lensFocalLength_nullTest() {
+        assertThat(DataTransformations1D.convert(LENS_FOCAL_LENGTH, null)).isNull()
+    }
+
+    @Test
+    fun lensFocalLength_numberTest() {
+        val keyDataFloat = 29.9f
+        val transformedDataFloat = DataTransformations1D.convert(LENS_FOCAL_LENGTH, keyDataFloat)
+        assertThat(transformedDataFloat is Float).isTrue()
+        assertThat(keyDataFloat)
+            .isWithin(0.0001f)
+            .of(transformedDataFloat as Float)
+
+        val keyDataInt = 29
+        val transformedDataInt = DataTransformations1D.convert(LENS_FOCAL_LENGTH, keyDataInt)
+        assertThat(transformedDataInt is Int).isTrue()
+        assertThat(keyDataInt).isEqualTo(transformedDataInt)
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun lensFocalLength_booleanTest() {
+        DataTransformations1D.convert(LENS_FOCAL_LENGTH, true)
+    }
+}
\ No newline at end of file
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/CameraXActivityTestExtensions.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/CameraXActivityTestExtensions.kt
index 3a465b5..7f594e7 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/CameraXActivityTestExtensions.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/CameraXActivityTestExtensions.kt
@@ -19,6 +19,7 @@
 import androidx.test.core.app.ActivityScenario
 import androidx.test.espresso.Espresso
 import androidx.test.espresso.IdlingRegistry
+import androidx.test.espresso.action.ViewActions.click
 import androidx.test.espresso.assertion.ViewAssertions
 import androidx.test.espresso.matcher.ViewMatchers
 import androidx.testutils.withActivity
@@ -36,4 +37,19 @@
     } finally { // Always release the idling resource, in case of timeout exceptions.
         IdlingRegistry.getInstance().unregister(idlingResource)
     }
+}
+
+/**
+ * Waits until an image has been saved and its idling resource has become idle.
+ */
+internal fun ActivityScenario<CameraXActivity>.takePictureAndWaitForImageSavedIdle() {
+    val idlingResource = withActivity { imageSavedIdlingResource }
+    try {
+        IdlingRegistry.getInstance().register(idlingResource)
+        // Perform click to take a picture.
+        Espresso.onView(ViewMatchers.withId(R.id.Picture)).perform(click())
+    } finally { // Always release the idling resource, in case of timeout exceptions.
+        IdlingRegistry.getInstance().unregister(idlingResource)
+        withActivity { deleteSessionImages() }
+    }
 }
\ No newline at end of file
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/TakePictureTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/TakePictureTest.kt
index f2fe15d6..6158773 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/TakePictureTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/TakePictureTest.kt
@@ -16,15 +16,13 @@
 
 package androidx.camera.integration.core
 
+import android.Manifest
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.camera.testing.CoreAppTestUtil.clearDeviceUI
 import androidx.test.core.app.ActivityScenario
 import androidx.test.espresso.Espresso.onView
-import androidx.test.espresso.IdlingRegistry
 import androidx.test.espresso.action.ViewActions.click
-import androidx.test.espresso.assertion.ViewAssertions
-import androidx.test.espresso.matcher.ViewMatchers
 import androidx.test.espresso.matcher.ViewMatchers.withId
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
@@ -40,13 +38,12 @@
 @RunWith(AndroidJUnit4::class)
 class TakePictureTest {
     @get:Rule
-    var mCameraPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.CAMERA)
-    @get:Rule
-    var mStoragePermissionRule =
-        GrantPermissionRule.grant(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
-    @get:Rule
-    var mRecordAudioRule =
-        GrantPermissionRule.grant(android.Manifest.permission.RECORD_AUDIO)
+    val mPermissionRule: GrantPermissionRule =
+        GrantPermissionRule.grant(
+            Manifest.permission.CAMERA,
+            Manifest.permission.WRITE_EXTERNAL_STORAGE,
+            Manifest.permission.RECORD_AUDIO
+        )
 
     @Before
     fun setUp() {
@@ -60,17 +57,10 @@
     // Take a photo, wait for callback via imageSavedIdlingResource resource.
     @Test
     fun testPictureButton() {
-        ActivityScenario.launch(CameraXActivity::class.java).use {
-            it?.onActivity { activity ->
-                IdlingRegistry.getInstance().register(activity.viewIdlingResource)
-                IdlingRegistry.getInstance().register(activity.imageSavedIdlingResource)
-            }
-            onView(withId(R.id.Picture)).perform(click())
-            onView(withId(R.id.viewFinder))
-            it?.onActivity { activity ->
-                IdlingRegistry.getInstance().unregister(activity.viewIdlingResource)
-                IdlingRegistry.getInstance().unregister(activity.imageSavedIdlingResource)
-                activity.deleteSessionImages()
+        with(ActivityScenario.launch(CameraXActivity::class.java)) {
+            use { // Ensure ActivityScenario is cleaned up properly.
+                waitForViewfinderIdle()
+                takePictureAndWaitForImageSavedIdle()
             }
         }
     }
@@ -79,26 +69,15 @@
     // onError path.
     @Test
     fun testTakePictureAndRestartWhileCapturing() { // Launch activity check for view idle.
-        ActivityScenario.launch(CameraXActivity::class.java).use {
-            checkForViewIdle(it)
-            onView(withId(R.id.Picture)).perform(click())
-            // Immediately .recreate() this allows the test to reach the onError callback path.
-            // Note, moveToState(DESTROYED) doesn't trigger the same code path.
-            checkForViewIdle(it!!.recreate())
+        with(ActivityScenario.launch(CameraXActivity::class.java)) {
+            use { // Ensure ActivityScenario is cleaned up properly.
+                waitForViewfinderIdle()
+                onView(withId(R.id.Picture)).perform(click())
+                // Immediately .recreate() this allows the test to reach the onError callback path.
+                // Note, moveToState(DESTROYED) doesn't trigger the same code path.
+                it!!.recreate()
+                waitForViewfinderIdle()
+            }
         }
     }
-
-    private fun checkForViewIdle(activityScenario: ActivityScenario<CameraXActivity>):
-            ActivityScenario<CameraXActivity>? {
-        activityScenario.onActivity { activity ->
-            IdlingRegistry.getInstance().register(activity.viewIdlingResource)
-        }
-        // Check the activity launched and Preview displays frames.
-        onView(withId(R.id.viewFinder))
-            .check(ViewAssertions.matches(ViewMatchers.isDisplayed()))
-        activityScenario.onActivity { activity ->
-            IdlingRegistry.getInstance().unregister(activity.viewIdlingResource)
-        }
-        return activityScenario
-    }
 }
diff --git a/camera/integration-tests/coretestapp/src/main/cpp/opengl_renderer_jni.cpp b/camera/integration-tests/coretestapp/src/main/cpp/opengl_renderer_jni.cpp
index 319cc71..ce1894b2 100644
--- a/camera/integration-tests/coretestapp/src/main/cpp/opengl_renderer_jni.cpp
+++ b/camera/integration-tests/coretestapp/src/main/cpp/opengl_renderer_jni.cpp
@@ -141,12 +141,13 @@
 namespace {
     constexpr char VERTEX_SHADER_SRC[] = R"SRC(
       attribute vec4 position;
-      varying vec2 texCoord;
-      uniform mat4 vertTransform;
+      attribute vec4 texCoords;
+      uniform mat4 mvpTransform;
+      uniform mat4 texTransform;
+      varying vec2 fragCoord;
       void main() {
-        texCoord = ((vertTransform * vec4(position.xy, 0, 1.0)).xy
-            + vec2(1.0, 1.0)) * 0.5;
-        gl_Position = position;
+        fragCoord = (texTransform * texCoords).xy;
+        gl_Position = mvpTransform * position;
       }
 )SRC";
 
@@ -154,11 +155,9 @@
       #extension GL_OES_EGL_image_external : require
       precision mediump float;
       uniform samplerExternalOES sampler;
-      uniform mat4 texTransform;
-      varying vec2 texCoord;
+      varying vec2 fragCoord;
       void main() {
-        vec2 transTexCoord = (texTransform * vec4(texCoord, 0, 1.0)).xy;
-        gl_FragColor = texture2D(sampler, transTexCoord);
+        gl_FragColor = texture2D(sampler, fragCoord);
       }
 )SRC";
 
@@ -170,8 +169,9 @@
         EGLSurface pbufferSurface;
         GLuint program;
         GLint positionHandle;
+        GLint texCoordsHandle;
         GLint samplerHandle;
-        GLint vertTransformHandle;
+        GLint mvpTransformHandle;
         GLint texTransformHandle;
         GLuint textureId;
 
@@ -185,8 +185,9 @@
                   pbufferSurface(pbufferSurface),
                   program(0),
                   positionHandle(-1),
+                  texCoordsHandle(1),
                   samplerHandle(-1),
-                  vertTransformHandle(-1),
+                  mvpTransformHandle(-1),
                   texTransformHandle(-1),
                   textureId(0) {}
     };
@@ -364,13 +365,17 @@
             CHECK_GL(glGetAttribLocation(nativeContext->program, "position"));
     assert(nativeContext->positionHandle != -1);
 
+    nativeContext->texCoordsHandle =
+            CHECK_GL(glGetAttribLocation(nativeContext->program, "texCoords"));
+    assert(nativeContext->texCoordsHandle != -1);
+
     nativeContext->samplerHandle =
             CHECK_GL(glGetUniformLocation(nativeContext->program, "sampler"));
     assert(nativeContext->samplerHandle != -1);
 
-    nativeContext->vertTransformHandle =
-            CHECK_GL(glGetUniformLocation(nativeContext->program, "vertTransform"));
-    assert(nativeContext->vertTransformHandle != -1);
+    nativeContext->mvpTransformHandle =
+            CHECK_GL(glGetUniformLocation(nativeContext->program, "mvpTransform"));
+    assert(nativeContext->mvpTransformHandle != -1);
 
     nativeContext->texTransformHandle =
             CHECK_GL(glGetUniformLocation(nativeContext->program, "texTransform"));
@@ -429,25 +434,35 @@
 JNIEXPORT jboolean JNICALL
 Java_androidx_camera_integration_core_OpenGLRenderer_renderTexture(
         JNIEnv *env, jclass clazz, jlong context, jlong timestampNs,
-        jfloatArray jvertTransformArray, jfloatArray jtexTransformArray) {
+        jfloatArray jmvpTransformArray, jboolean mvpDirty,jfloatArray jtexTransformArray) {
     auto *nativeContext = reinterpret_cast<NativeContext *>(context);
 
-    // We use a single triangle with the viewport inscribed within for our
-    // vertices. This could also be done with a quad or two triangles.
-    //                          ^
-    //                          |
-    //                       (-1,3)
-    //                          +_
-    //                          | \_
-    //                          |   \_
-    //                       (-1,1)   \(1,1)
-    //                          +-------+_
-    //                          |       | \_
-    //                          |   +   |   \_
-    //                          |       |     \_
-    //                          +-------+-------+-->
-    //                       (-1,-1)  (1,-1)  (3,-1)
-    constexpr GLfloat vertices[] = {-1.0f, -1.0f, 3.0f, -1.0f, -1.0f, 3.0f};
+    // We use two triangles drawn with GL_TRIANGLE_STRIP to create the surface which will be
+    // textured with the camera frame. This could also be done with a quad (GL_QUADS) on a
+    // different version of OpenGL or with a scaled single triangle in which we would inscribe
+    // the camera texture.
+    //
+    //                       (-1,-1)         (1,-1)
+    //                          +---------------+
+    //                          | \_            |
+    //                          |    \_         |
+    //                          |       +       |
+    //                          |         \_    |
+    //                          |            \_ |
+    //                          +---------------+
+    //                       (-1,1)           (1,1)
+    constexpr GLfloat vertices[] = {
+            -1.0f,  1.0f, // Lower-left
+             1.0f,  1.0f, // Lower-right
+            -1.0f, -1.0f, // Upper-left (notice order here. We're drawing triangles, not a quad.)
+             1.0f, -1.0f  // Upper-right
+    };
+    constexpr GLfloat texCoords[] = {
+            0.0f, 0.0f, // Lower-left
+            1.0f, 0.0f, // Lower-right
+            0.0f, 1.0f, // Upper-left (order must match the vertices)
+            1.0f, 1.0f  // Upper-right
+    };
 
     GLint vertexComponents = 2;
     GLenum vertexType = GL_FLOAT;
@@ -457,16 +472,25 @@
                                    vertexComponents, vertexType, normalized,
                                    vertexStride, vertices));
     CHECK_GL(glEnableVertexAttribArray(nativeContext->positionHandle));
+
+    CHECK_GL(glVertexAttribPointer(nativeContext->texCoordsHandle,
+                                   vertexComponents, vertexType, normalized,
+                                   vertexStride, texCoords));
+    CHECK_GL(glEnableVertexAttribArray(nativeContext->texCoordsHandle));
+
     CHECK_GL(glUseProgram(nativeContext->program));
 
     GLsizei numMatrices = 1;
     GLboolean transpose = GL_FALSE;
-    GLfloat *vertTransformArray =
-            env->GetFloatArrayElements(jvertTransformArray, nullptr);
-    CHECK_GL(glUniformMatrix4fv(nativeContext->vertTransformHandle, numMatrices,
-                                transpose, vertTransformArray));
-    env->ReleaseFloatArrayElements(jvertTransformArray, vertTransformArray,
-                                   JNI_ABORT);
+    // Only re-upload MVP to GPU if it is dirty
+    if (mvpDirty) {
+        GLfloat *mvpTransformArray =
+                env->GetFloatArrayElements(jmvpTransformArray, nullptr);
+        CHECK_GL(glUniformMatrix4fv(nativeContext->mvpTransformHandle, numMatrices,
+                                    transpose, mvpTransformArray));
+        env->ReleaseFloatArrayElements(jmvpTransformArray, mvpTransformArray,
+                                       JNI_ABORT);
+    }
 
     CHECK_GL(glUniform1i(nativeContext->samplerHandle, 0));
 
@@ -481,9 +505,19 @@
 
     CHECK_GL(glBindTexture(GL_TEXTURE_EXTERNAL_OES, nativeContext->textureId));
 
+    // Required to use a left-handed coordinate system in order to match our world-space
+    //
+    //                    ________+x
+    //                  /|
+    //                 / |
+    //              +z/  |
+    //                   | +y
+    //
+    glFrontFace(GL_CW);
+
     // This will typically fail if the EGL surface has been detached abnormally. In that case we
     // will return JNI_FALSE below.
-    glDrawArrays(GL_TRIANGLES, 0, 3);
+    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
 
     // Check that all GL operations completed successfully. If not, log an error and return.
     GLenum glError = glGetError();
diff --git a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/OpenGLRenderer.java b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/OpenGLRenderer.java
index 8382a86..f3b1911 100644
--- a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/OpenGLRenderer.java
+++ b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/OpenGLRenderer.java
@@ -17,9 +17,11 @@
 package androidx.camera.integration.core;
 
 import android.graphics.Rect;
+import android.graphics.RectF;
 import android.graphics.SurfaceTexture;
 import android.opengl.Matrix;
 import android.os.Process;
+import android.util.Log;
 import android.util.Size;
 import android.view.Surface;
 
@@ -37,12 +39,14 @@
 import com.google.common.util.concurrent.ListenableFuture;
 
 import java.util.Locale;
+import java.util.Objects;
 import java.util.concurrent.Executor;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.atomic.AtomicInteger;
 
 final class OpenGLRenderer {
-
+    private static final String TAG = "OpenGLRenderer";
+    private static final boolean DEBUG = false;
     static {
         System.loadLibrary("opengl_renderer_jni");
     }
@@ -53,23 +57,36 @@
                     String.format(Locale.US, "GLRenderer-%03d", RENDERER_COUNT.incrementAndGet()),
                     Process.THREAD_PRIORITY_DEFAULT); // Use UI thread priority (DEFAULT)
 
-    private Size mPreviewResolution;
     private SurfaceTexture mPreviewTexture;
-    private final float[] mPreviewTransform = new float[16];
-    private float mNaturalPreviewWidth = 0;
-    private float mNaturalPreviewHeight = 0;
+    private RectF mPreviewCropRect;
+    private Size mPreviewSize;
+    private int mTextureRotationDegrees;
+    // Transform retrieved by SurfaceTexture.getTransformMatrix
+    private final float[] mTextureTransform = new float[16];
+
+    // The Model represent the surface we are drawing on. In 3D, it is a flat rectangle.
+    private final float[] mModelTransform = new float[16];
+
+    private final float[] mViewTransform = new float[16];
+
+    private final float[] mProjectionTransform = new float[16];
+
+    // A combination of the model, view and projection transform matrices.
+    private final float[] mMvpTransform = new float[16];
+    private boolean mMvpDirty = true;
 
     private Size mSurfaceSize = null;
     private int mSurfaceRotationDegrees = 0;
-    private final float[] mSurfaceTransform = new float[16];
 
-    private final float[] mTempVec = new float[8];
-
-    private Rect mPreviewCropRect;
-
-    private final float[] mCropRectTransform = new float[16];
-
-    private final float[] mFragmentShaderTransform = new float[16];
+    // Vectors defining the 'up' direction for the 4 angles we're interested in. These are based
+    // off our world-space coordinate system (sensor coordinates), where the origin (0, 0) is in
+    // the upper left of the image, and rotations are clockwise (left-handed coordinates).
+    private static final float[] DIRECTION_UP_ROT_0 = {0f, -1f, 0f, 0f};
+    private static final float[] DIRECTION_UP_ROT_90 = {1f, 0f, 0f, 0f};
+    private static final float[] DIRECTION_UP_ROT_180 = {0f, 1f, 0f, 0f};
+    private static final float[] DIRECTION_UP_ROT_270 = {-1f, 0f, 0f, 0f};
+    private float[] mTempVec = new float[4];
+    private float[] mTempMatrix = new float[32]; // 2 concatenated matrices for calculations
 
     private long mNativeContext = 0;
 
@@ -78,6 +95,11 @@
 
     private Pair<Executor, Consumer<Long>> mFrameUpdateListener;
 
+    OpenGLRenderer() {
+        // Initialize the GL context on the GL thread
+        mExecutor.execute(() -> mNativeContext = initContext());
+    }
+
     @UseExperimental(markerClass = ExperimentalUseCaseGroup.class)
     @MainThread
     void attachInputPreview(@NonNull Preview preview) {
@@ -89,15 +111,18 @@
                         return;
                     }
 
-                    if (mNativeContext == 0) {
-                        mNativeContext = initContext();
-                    }
-
                     SurfaceTexture surfaceTexture = resetPreviewTexture(
                             surfaceRequest.getResolution());
                     Surface inputSurface = new Surface(surfaceTexture);
                     mNumOutstandingSurfaces++;
-                    mPreviewCropRect = surfaceRequest.getCropRect();
+                    Rect requestCropRect = surfaceRequest.getCropRect();
+                    if (!isCropRectFullTexture(requestCropRect)) {
+                        // Crop rect is pre-calculated. Use it directly.
+                        mPreviewCropRect = new RectF(requestCropRect);
+                    } else {
+                        // Crop rect needs to be calculated before drawing.
+                        mPreviewCropRect = null;
+                    }
                     surfaceRequest.provideSurface(
                             inputSurface,
                             mExecutor,
@@ -108,7 +133,7 @@
                                     mPreviewTexture = null;
                                 }
                                 mNumOutstandingSurfaces--;
-                                doShutdownIfNeeded();
+                                doShutdownExecutorIfNeeded();
                             });
                 });
     }
@@ -122,15 +147,15 @@
                             return;
                         }
 
-                        if (mNativeContext == 0) {
-                            mNativeContext = initContext();
-                        }
-
                         if (setWindowSurface(mNativeContext, surface)) {
-                            this.mSurfaceRotationDegrees = surfaceRotationDegrees;
-                            this.mSurfaceSize = surfaceSize;
+                            if (surfaceRotationDegrees != mSurfaceRotationDegrees
+                                    || !Objects.equals(surfaceSize, mSurfaceSize)) {
+                                mMvpDirty = true;
+                            }
+                            mSurfaceRotationDegrees = surfaceRotationDegrees;
+                            mSurfaceSize = surfaceSize;
                         } else {
-                            this.mSurfaceSize = null;
+                            mSurfaceSize = null;
                         }
 
                     });
@@ -150,9 +175,7 @@
      */
     void setFrameUpdateListener(@NonNull Executor executor, @NonNull Consumer<Long> listener) {
         try {
-            mExecutor.execute(() -> {
-                mFrameUpdateListener = new Pair<>(executor, listener);
-            });
+            mExecutor.execute(() -> mFrameUpdateListener = new Pair<>(executor, listener));
         } catch (RejectedExecutionException e) {
             // Renderer is shutting down. Ignore.
         }
@@ -162,8 +185,11 @@
         try {
             mExecutor.execute(
                     () -> {
-                        this.mSurfaceRotationDegrees = surfaceRotationDegrees;
-                        if (mPreviewTexture != null && mNativeContext != 0) {
+                        if (surfaceRotationDegrees != mSurfaceRotationDegrees) {
+                            mMvpDirty = true;
+                        }
+                        mSurfaceRotationDegrees = surfaceRotationDegrees;
+                        if (mPreviewTexture != null && !mIsShutdown) {
                             renderLatest();
                         }
                     });
@@ -185,7 +211,7 @@
             try {
                 mExecutor.execute(
                         () -> {
-                            if (mNativeContext != 0) {
+                            if (!mIsShutdown) {
                                 setWindowSurface(mNativeContext, null);
                                 mSurfaceSize = null;
                             }
@@ -203,12 +229,12 @@
         try {
             mExecutor.execute(
                     () -> {
-                        mIsShutdown = true;
-                        if (mNativeContext != 0) {
+                        if (!mIsShutdown) {
                             closeContext(mNativeContext);
                             mNativeContext = 0;
+                            mIsShutdown = true;
                         }
-                        doShutdownIfNeeded();
+                        doShutdownExecutorIfNeeded();
                     });
         } catch (RejectedExecutionException e) {
             // Renderer already shutting down. Ignore.
@@ -216,7 +242,7 @@
     }
 
     @WorkerThread
-    private void doShutdownIfNeeded() {
+    private void doShutdownExecutorIfNeeded() {
         if (mIsShutdown && mNumOutstandingSurfaces == 0) {
             mFrameUpdateListener = null;
             mExecutor.shutdown();
@@ -234,13 +260,16 @@
         mPreviewTexture.setDefaultBufferSize(size.getWidth(), size.getHeight());
         mPreviewTexture.setOnFrameAvailableListener(
                 surfaceTexture -> {
-                    if (surfaceTexture == mPreviewTexture && mNativeContext != 0) {
+                    if (surfaceTexture == mPreviewTexture && !mIsShutdown) {
                         surfaceTexture.updateTexImage();
                         renderLatest();
                     }
                 },
                 mExecutor.getHandler());
-        mPreviewResolution = size;
+        if (!Objects.equals(size, mPreviewSize)) {
+            mMvpDirty = true;
+        }
+        mPreviewSize = size;
         return mPreviewTexture;
     }
 
@@ -251,27 +280,25 @@
 
         // Get texture transform from surface texture (transform to natural orientation).
         // This will be used to transform texture coordinates in the fragment shader.
-        mPreviewTexture.getTransformMatrix(mPreviewTransform);
-
+        mPreviewTexture.getTransformMatrix(mTextureTransform);
+        // Check whether the texture's rotation has changed so we can update the MVP matrix.
+        int textureRotationDegrees = getTextureRotationDegrees();
+        if (textureRotationDegrees != mTextureRotationDegrees) {
+            mMvpDirty = true;
+        }
+        mTextureRotationDegrees = textureRotationDegrees;
         if (mSurfaceSize != null) {
-            // If the crop rect matches the preview surface, it means either the viewport is not
-            // set, or it's set but the crop rect happens to be the same as the preview surface.
-            // Either way, use the entire surface for sampling and do additional custom
-            // transformation if necessary.
-            if (isCropRectMatchPreview()) {
-                calculateCustomTransformation();
-            } else {
-                calculateViewportTransformation();
+            if (mMvpDirty) {
+                updateMvpTransform();
             }
-            boolean success = renderTexture(mNativeContext, timestampNs, mSurfaceTransform,
-                    mFragmentShaderTransform);
+            boolean success = renderTexture(mNativeContext, timestampNs, mMvpTransform, mMvpDirty,
+                    mTextureTransform);
+            mMvpDirty = false;
             if (success && mFrameUpdateListener != null) {
-                Executor executor = mFrameUpdateListener.first;
-                Consumer<Long> listener = mFrameUpdateListener.second;
+                Executor executor = Objects.requireNonNull(mFrameUpdateListener.first);
+                Consumer<Long> listener = Objects.requireNonNull(mFrameUpdateListener.second);
                 try {
-                    executor.execute(() -> {
-                        listener.accept(timestampNs);
-                    });
+                    executor.execute(() -> listener.accept(timestampNs));
                 } catch (RejectedExecutionException e) {
                     // Unable to send frame update. Ignore.
                 }
@@ -280,27 +307,26 @@
     }
 
     /**
-     * Calculates the dimensions of the source texture after it has been transformed from the raw
-     * sensor texture to an image which is in the device's 'natural' orientation.
+     * Calculates the rotation of the source texture between the sensor coordinate space and
+     * the device's 'natural' orientation.
      *
-     * <p>The required transform is passed along with each texture update and is retrieved from
-     * {@link
-     * SurfaceTexture#getTransformMatrix(float[])}.
+     * <p>A required transform matrix is passed along with each texture update and is retrieved by
+     * {@link SurfaceTexture#getTransformMatrix(float[])}.
      *
      * <pre>{@code
      *        TEXTURE FROM SENSOR:
      * ^
-     * |
-     * |          .###########
-     * |           ***********
-     * |   ....############## ####. /           Sensor may be rotated relative
-     * |  ################### #( )#.            to the device's 'natural'
-     * |       ############## ######            orientation.
-     * |  ################### #( )#*
-     * |   ****############## ####* \
-     * |           ...........
-     * |          *###########
-     * |
+     * |                  +-----------+
+     * |          .#######|###        |
+     * |           *******|***        |
+     * |   ....###########|## ####. / |         Sensor may be rotated relative
+     * |  ################|## #( )#.  |         to the device's 'natural'
+     * |       ###########|## ######  |         orientation.
+     * |  ################|## #( )#*  |
+     * |   ****###########|## ####* \ |
+     * |           .......|...        |
+     * |          *#######|###        |
+     * |                  +-----------+
      * +-------------------------------->
      *                                               TRANSFORMED IMAGE:
      *                 | |                   ^
@@ -318,205 +344,303 @@
      * }</pre>
      *
      * <p>The transform matrix is a 4x4 affine transform matrix that operates on standard normalized
-     * texture coordinates which are in the range of [0,1] for both s and t dimensions. Once the
-     * transform is applied, we scale by the width and height of the source texture.
+     * texture coordinates which are in the range of [0,1] for both s and t dimensions. Before
+     * the transform is applied, the texture may have dimensions that are larger than the
+     * dimensions of the SurfaceTexture we provided in order to accommodate hardware limitations.
+     *
+     * <p>For this method we are only interested in the rotation component of the transform
+     * matrix, so the calculations avoid the scaling and translation components.
      */
     @WorkerThread
-    private void calculateInputDimensions() {
-
-        // Although the transform is normally used to rotate, it can also handle scale and
-        // translation.
-        // In order to accommodate for this, we use test vectors representing the boundaries of the
-        // input, and run them through the transform to find the boundaries of the output.
+    private int getTextureRotationDegrees() {
+        // The final output image should have the requested dimensions AFTER applying the
+        // transform matrix, but width and height may be swapped. We know that the transform
+        // matrix from SurfaceTexture#getTransformMatrix() is an affine transform matrix that
+        // will only rotate in 90 degree increments, so we only need to worry about the rotation
+        // component.
         //
-        //                                Top Bound (Vt):    Right Bound (Vr):
-        //
-        //                                ^ (0.5,1)             ^
-        //                                |    ^                |
-        //                                |    |                |
-        //                                |    |                |        (1,0.5)
-        //          Texture               |    +                |     +---->
-        //          Coordinates:          |                     |
-        //          ^                     |                     |
-        //          |                     +----------->         +----------->
-        //        (0,1)     (1,1)
-        //          +---------+           Bottom Bound (Vb):     Left Bound (Vl):
-        //          |         |
-        //          |         |           ^                     ^
-        //          |    +    |           |                     |
-        //          |(0.5,0.5)|           |                     |
-        //          |         |           |                  (0,0.5)
-        //          +------------>        |    +                <----+
-        //        (0,0)     (1,0)         |    |                |
-        //                                |    |                |
-        //                                +----v------>         +----------->
-        //                                  (0.5,0)
-        //
-        // Using the above test vectors, we can calculate the transformed height using transform
-        // matrix M as:
-        //
-        // Voh = |M x (Vt * h) - M x (Vb * h)| = |M x (Vt - Vb) * h| = |M x Vih| = |M x [0 h 0 0]|
-        // where:
-        // Vih = input, pre-transform height vector,
-        // Voh = output transformed height vector,
-        //   h = pre-transform texture height,
-        //  || denotes element-wise absolute value,
-        //   x denotes matrix-vector multiplication, and
-        //   * denotes element-wise multiplication.
-        //
-        // Similarly, the transformed width will be calculated as:
-        //
-        // Vow = |M x (Vr * w) - M x (Vl * w)| = |M x (Vr - Vl) * w| = |M x Viw| = |M x [w 0 0 0]|
-        // where:
-        // Vow = output transformed width vector, and w = pre-transform texture width
-        //
-        // Since the transform matrix can potentially swap width and height, we must hold on to both
-        // elements of each output vector. However, since we assume rotations in multiples of 90
-        // degrees, and the vectors are orthogonal, we can calculate the final transformed vector
-        // as:
-        //
-        // Vo = |M x Vih| + |M x Viw|
+        // We can test this by using an test vector of [s, t, p, q] = [0, 1, 0, 0]. Using 'q = 0'
+        // will ignore the translation component of the matrix. We will only need to check if the
+        // 's' component becomes a scaled version of the 't' component and the 't' component
+        // becomes 0.
+        Matrix.multiplyMV(mTempVec, 0, mTextureTransform, 0, DIRECTION_UP_ROT_0, 0);
 
-        // Initialize the components we care about for the output vector. This will be
-        // accumulated from
-        // Voh and Vow.
-        mNaturalPreviewWidth = 0;
-        mNaturalPreviewHeight = 0;
-
-        // Calculate Voh. We use our allocated temporary vector to avoid excessive allocations since
-        // this is done per-frame.
-        float[] vih = mTempVec;
-        vih[0] = 0;
-        vih[1] = mPreviewResolution.getHeight();
-        vih[2] = 0;
-        vih[3] = 0;
-
-        // Apply the transform. Second half of the array is the result vector Voh.
-        Matrix.multiplyMV(
-                /*resultVec=*/ mTempVec, /*resultVecOffset=*/ 4,
-                /*lhsMat=*/ mPreviewTransform, /*lhsMatOffset=*/ 0,
-                /*rhsVec=*/ vih, /*rhsVecOffset=*/ 0);
-
-        // Accumulate output from Voh.
-        mNaturalPreviewWidth += Math.abs(mTempVec[4]);
-        mNaturalPreviewHeight += Math.abs(mTempVec[5]);
-
-        // Calculate Vow.
-        float[] voh = mTempVec;
-        voh[0] = mPreviewResolution.getWidth();
-        voh[1] = 0;
-        voh[2] = 0;
-        voh[3] = 0;
-
-        // Apply the transform. Second half of the array is the result vector Vow.
-        Matrix.multiplyMV(
-                /*resultVec=*/ mTempVec,
-                /*resultVecOffset=*/ 4,
-                /*lhsMat=*/ mPreviewTransform,
-                /*lhsMatOffset=*/ 0,
-                /*rhsVec=*/ voh,
-                /*rhsVecOffset=*/ 0);
-
-        // Accumulate output from Vow. This now represents the fully transformed coordinates.
-        mNaturalPreviewWidth += Math.abs(mTempVec[4]);
-        mNaturalPreviewHeight += Math.abs(mTempVec[5]);
-    }
-
-
-    /**
-     * Returns true if the crop rect matches the preview surface.
-     */
-    private boolean isCropRectMatchPreview() {
-        // If the crop rect is the same size as the preview, do custom transformation for fragment
-        // shader to sample the whole surface.
-        return mPreviewCropRect != null && mPreviewCropRect.left == 0 && mPreviewCropRect.top == 0
-                && mPreviewCropRect.width() == mPreviewResolution.getWidth()
-                && mPreviewCropRect.height() == mPreviewResolution.getHeight();
-    }
-
-    /**
-     * Calculates the vertex shader transform matrix needed to transform the output from device
-     * 'natural' orientation coordinates to a "center-crop" view of the camera viewport.
-     *
-     * <p>A device's 'natural' orientation is the orientation where the Display rotation is
-     * Surface.ROTATION_0. For most phones, this will be a portrait orientation, whereas some
-     * tablets may use landscape as their natural orientation. The Surface rotation is always
-     * provided relative to the device's 'natural' orientation.
-     *
-     * <p>Because the camera sensor (or crop of the camera sensor) may have a different aspect ratio
-     * than the Surface that is meant to display it, we also want to fit the image from the
-     * camera so the entire Surface is filled. This generally requires scaling the input texture
-     * and cropping pixels from either the width or height. We call this transform "center-crop"
-     * and is equivalent to the ScaleType with the same name in ImageView.
-     */
-    @WorkerThread
-    private void calculateCustomTransformation() {
-        // Calculate the dimensions of the source texture in the 'natural' orientation of the
-        // device.
-        calculateInputDimensions();
-
-        // Transform surface width and height to natural orientation
-        Matrix.setRotateM(mSurfaceTransform, 0, -mSurfaceRotationDegrees, 0, 0, 1.0f);
-
-        // Since rotation is a linear transform, we don't need to worry about the affine component
-        mTempVec[0] = mSurfaceSize.getWidth();
-        mTempVec[1] = mSurfaceSize.getHeight();
-
-        // Apply the transform to surface dimensions
-        Matrix.multiplyMV(mTempVec, 4, mSurfaceTransform, 0, mTempVec, 0);
-
-        float naturalSurfaceWidth = Math.abs(mTempVec[4]);
-        float naturalSurfaceHeight = Math.abs(mTempVec[5]);
-
-        // Now that both preview and surface are in the same coordinate system, calculate the ratio
-        // of width/height between preview/surface to determine which dimension to scale
-        float heightRatio = mNaturalPreviewHeight / naturalSurfaceHeight;
-        float widthRatio = mNaturalPreviewWidth / naturalSurfaceWidth;
-
-        // Now that we have calculated scale, we must apply rotation and scale in the correct order
-        // such that it will apply to the vertex shader's vertices consistently.
-        Matrix.setIdentityM(mSurfaceTransform, 0);
-
-        // Apply the scale depending on whether the width or the height needs to be scaled to match
-        // a "center crop" scale type. Because vertex coordinates are already normalized, we must
-        // remove
-        // the implicit scaling (through division) before scaling by the opposite dimension.
-        if (mNaturalPreviewWidth * naturalSurfaceHeight
-                > mNaturalPreviewHeight * naturalSurfaceWidth) {
-            Matrix.scaleM(mSurfaceTransform, 0, heightRatio / widthRatio, 1.0f, 1.0f);
-        } else {
-            Matrix.scaleM(mSurfaceTransform, 0, 1.0f, widthRatio / heightRatio, 1.0f);
+        // Calculate the normalized vector and round to integers so we can do integer comparison.
+        // Normalizing the vector removes the effects of the scaling component of the
+        // transform matrix. Once normalized, we can round and do integer comparison.
+        float length = Matrix.length(mTempVec[0], mTempVec[1], 0);
+        int s = Math.round(mTempVec[0] / length);
+        int t = Math.round(mTempVec[1] / length);
+        if (s == 0 && t == 1) {
+            //       (0,1)                               (0,1)
+            //    +----^----+          0 deg          +----^----+
+            //    |    |    |        Rotation         |    |    |
+            //    |    +    |         +----->         |    +    |
+            //    |  (0,0)  |                         |  (0,0)  |
+            //    +---------+                         +---------+
+            return 0;
+        } else if (s == 1 && t == 0) {
+            //       (0,1)
+            //    +----^----+         90 deg          +---------+
+            //    |    |    |        Rotation         |         |
+            //    |    +    |         +----->         |    +---->(1,0)
+            //    |  (0,0)  |                         |  (0,0)  |
+            //    +---------+                         +---------+
+            return 90;
+        } else if (s == 0 && t == -1) {
+            //       (0,1)
+            //    +----^----+         180 deg         +---------+
+            //    |    |    |        Rotation         |  (0,0)  |
+            //    |    +    |         +----->         |    +    |
+            //    |  (0,0)  |                         |    |    |
+            //    +---------+                         +----v----+
+            //                                           (0,-1)
+            return 180;
+        }  else if (s == -1 && t == 0) {
+            //       (0,1)
+            //    +----^----+         270 deg         +---------+
+            //    |    |    |        Rotation         |         |
+            //    |    +    |         +----->   (-1,0)<----+    |
+            //    |  (0,0)  |                         |  (0,0)  |
+            //    +---------+                         +---------+
+            return 270;
         }
 
-        // Finally add in rotation. This will be applied to vertices first.
-        Matrix.rotateM(mSurfaceTransform, 0, -mSurfaceRotationDegrees, 0, 0, 1.0f);
+        throw new RuntimeException(String.format("Unexpected texture transform matrix. Expected "
+                + "test vector [0, 1] to rotate to [0,1], [1, 0], [0, -1] or [-1, 0], but instead "
+                + "was [%d, %d].", s, t));
+    }
 
-        // For custom transformation, the fragment shader uses the SurfaceTexture transformation
-        // directly.
-        System.arraycopy(mPreviewTransform, 0, mFragmentShaderTransform, 0,
-                mFragmentShaderTransform.length);
+
+    /**
+     * Returns true if the crop rect dimensions match the entire texture dimensions.
+     */
+    @WorkerThread
+    private boolean isCropRectFullTexture(@NonNull Rect cropRect) {
+        return cropRect.left == 0 && cropRect.top == 0
+                && cropRect.width() == mPreviewSize.getWidth()
+                && cropRect.height() == mPreviewSize.getHeight();
     }
 
     /**
-     * Calculates the transformation based on viewport crop rect.
+     * Derives the model crop rect from the texture and output surface dimensions, applying a
+     * 'center-crop' transform.
+     *
+     * <p>Because the camera sensor (or crop of the camera sensor) may have a different
+     * aspect ratio than the ViewPort that is meant to display it, we want to fit the image
+     * from the camera so the entire ViewPort is filled. This generally requires scaling the input
+     * texture and cropping pixels from either the width or height. We call this transform
+     * 'center-crop' and is equivalent to {@link android.widget.ImageView.ScaleType#CENTER_CROP}.
      */
-    private void calculateViewportTransformation() {
-        // Append the transformations so that only the area within the crop rect is sampled.
-        Matrix.setIdentityM(mCropRectTransform, 0);
-        float translateX = (float) mPreviewCropRect.left / mPreviewResolution.getWidth();
-        float translateY = (float) mPreviewCropRect.top / mPreviewResolution.getHeight();
-        Matrix.translateM(mCropRectTransform, 0, translateX, translateY, 0f);
+    @WorkerThread
+    private void extractPreviewCropFromPreviewSizeAndSurface() {
+        // Swap the dimensions of the surface we are drawing the texture onto if rotating the
+        // texture to the surface orientation requires a 90 degree or 270 degree rotation.
+        int viewPortRotation = getViewPortRotation();
+        if (viewPortRotation == 90 || viewPortRotation == 270) {
+            // Width and height swapped
+            mPreviewCropRect = new RectF(0, 0, mSurfaceSize.getHeight(), mSurfaceSize.getWidth());
+        } else {
+            mPreviewCropRect = new RectF(0, 0, mSurfaceSize.getWidth(), mSurfaceSize.getHeight());
+        }
 
-        float scaleX = (float) mPreviewCropRect.width() / mPreviewResolution.getWidth();
-        float scaleY = (float) mPreviewCropRect.height() / mPreviewResolution.getHeight();
-        Matrix.scaleM(mCropRectTransform, 0, scaleX, scaleY, 1f);
+        android.graphics.Matrix centerCropMatrix = new android.graphics.Matrix();
+        RectF previewSize = new RectF(0, 0, mPreviewSize.getWidth(), mPreviewSize.getHeight());
+        centerCropMatrix.setRectToRect(mPreviewCropRect, previewSize,
+                android.graphics.Matrix.ScaleToFit.CENTER);
+        centerCropMatrix.mapRect(mPreviewCropRect);
+    }
 
-        Matrix.multiplyMM(mFragmentShaderTransform, 0, mCropRectTransform, 0,
-                mPreviewTransform, 0);
+    /**
+     * Returns the relative rotation between the sensor coordinates and the ViewPort in
+     * world-space coordinates.
+     *
+     * <p>This is the angle the sensor needs to be rotated, clockwise, in order to be upright in
+     * the viewport coordinates.
+     */
+    @WorkerThread
+    private int getViewPortRotation() {
+        // Note that since the rotation defined by Surface#ROTATION_*** are positive when the
+        // device is rotated in a counter-clockwise direction and our world-space coordinates
+        // define positive angles in the clockwise direction, we add the two together to get the
+        // total angle required.
+        return (mTextureRotationDegrees + mSurfaceRotationDegrees) % 360;
+    }
 
-        // Correct for display rotation.
-        Matrix.setIdentityM(mSurfaceTransform, 0);
-        Matrix.rotateM(mSurfaceTransform, 0, -mSurfaceRotationDegrees, 0, 0, 1.0f);
+    /**
+     * Updates the matrix used to transform the model into the correct dimensions within the
+     * world-space.
+     *
+     * <p>In order to draw the camera frames to screen, we use a flat rectangle in our
+     * world-coordinate space. The world coordinates match the preview buffer coordinates with
+     * the origin (0,0) in the upper left corner of the image. Defining the world space in this
+     * way allows subsequent models to be positioned according to buffer coordinates.
+     * Note this different than standard OpenGL coordinates; this is a left-handed coordinate
+     * system, and requires using glFrontFace(GL_CW) before drawing.
+     * <pre>{@code
+     *             Standard coordinates:                   Our coordinate system:
+     *
+     *                      | +y                                  ________+x
+     *                      |                                   /|
+     *                      |                                  / |
+     *                      |________+x                     +z/  |
+     *                     /                                     | +y
+     *                    /
+     *                   /+z
+     * }</pre>
+     * <p>Our model is initially a square with vertices in the range (-1,-1 - 1,1). It is
+     * rotated, scaled and translated to match the dimensions of preview with the origin in the
+     * upper left corner.
+     *
+     * <p>Example for a preview with dimensions 1920x1080:
+     * <pre>{@code
+     *                (-1,-1)    (1,-1)
+     *                   +---------+        Model
+     *                   |         |        Transform          (0,0)         (1920,0)
+     * Unscaled Model -> |    +    |         ---\                +----------------+
+     *                   |         |         ---/                |                |      Scaled/
+     *                   +---------+                             |                | <-- Translated
+     *                (-1,1)     (1,1)                           |                |       Model
+     *                                                           +----------------+
+     *                                                         (0,1080)      (1920,1080)
+     * }</pre>
+     */
+    @WorkerThread
+    private void updateModelTransform() {
+        // Remove the rotation to the device 'natural' orientation so our world space will be in
+        // sensor coordinates.
+        Matrix.setRotateM(mTempMatrix, 0, -mTextureRotationDegrees, 0.0f, 0.0f, 1.0f);
+
+        Matrix.setIdentityM(mTempMatrix, 16);
+        // Translate to the upper left corner of the quad so we are in buffer space
+        Matrix.translateM(mTempMatrix, 16, mPreviewSize.getWidth() / 2f,
+                mPreviewSize.getHeight() / 2f, 0);
+        // Scale the vertices so that our world space units are pixels equal in size to the
+        // pixels of the buffer sent from the camera.
+        Matrix.scaleM(mTempMatrix, 16, mPreviewSize.getWidth() / 2f, mPreviewSize.getHeight() / 2f,
+                1f);
+        Matrix.multiplyMM(mModelTransform, 0, mTempMatrix, 16, mTempMatrix, 0);
+        if (DEBUG) {
+            printMatrix("ModelTransform", mModelTransform, 0);
+        }
+    }
+
+    /**
+     * The view transform defines the position and orientation of the camera within our world-space.
+     *
+     * <p>This brings us from world-space coordinates to view (camera) space.
+     *
+     * <p>This matrix is defined by a camera position, a gaze point, and a vector that represents
+     * the "up" direction. Because we are using an orthogonal projection, we always place the
+     * camera directly in front of the gaze point and 1 unit away on the z-axis for convenience.
+     * We have defined our world coordinates in a way where we will be looking at the front of
+     * the model rectangle if our camera is placed on the positive z-axis and we gaze towards
+     * the negative z-axis.
+     */
+    @WorkerThread
+    private void updateViewTransform() {
+        // Apply the rotation of the ViewPort and look at the center of the image
+        float[] upVec = DIRECTION_UP_ROT_0;
+        switch (getViewPortRotation()) {
+            case 0:
+                upVec = DIRECTION_UP_ROT_0;
+                break;
+            case 90:
+                upVec = DIRECTION_UP_ROT_90;
+                break;
+            case 180:
+                upVec = DIRECTION_UP_ROT_180;
+                break;
+            case 270:
+                upVec = DIRECTION_UP_ROT_270;
+                break;
+        }
+        Matrix.setLookAtM(mViewTransform, 0,
+                mPreviewCropRect.centerX(), mPreviewCropRect.centerY(), 1, // Camera position
+                mPreviewCropRect.centerX(), mPreviewCropRect.centerY(), 0, // Point to look at
+                upVec[0], upVec[1], upVec[2] // Up direction
+        );
+        if (DEBUG) {
+            printMatrix("ViewTransform", mViewTransform, 0);
+        }
+    }
+
+    /**
+     * The projection matrix will map from the view space to normalized device coordinates (NDC)
+     * which OpenGL is expecting.
+     *
+     * <p>Our view is meant to only show the pixels defined by the model crop rect, so our
+     * orthogonal projection matrix will depend on the preview crop rect dimensions.
+     *
+     * <p>The projection matrix can be thought of as a cube which has sides that align with the
+     * edges of the ViewPort and the near/far sides can be adjusted as needed. In our case, we
+     * set the near side to match the camera position and the far side to match the model's
+     * position on the z-axis, 1 unit away.
+     */
+    @WorkerThread
+    private void updateProjectionTransform() {
+        float viewPortWidth = mPreviewCropRect.width();
+        float viewPortHeight = mPreviewCropRect.height();
+        // Since projection occurs after rotation of the camera, in order to map directly to model
+        // coordinates we need to take into account the surface rotation.
+        int viewPortRotation = getViewPortRotation();
+        if (viewPortRotation == 90 || viewPortRotation == 270) {
+            viewPortWidth = mPreviewCropRect.height();
+            viewPortHeight = mPreviewCropRect.width();
+        }
+
+        Matrix.orthoM(mProjectionTransform, 0,
+                /*left=*/-viewPortWidth / 2f, /*right=*/viewPortWidth / 2f,
+                /*bottom=*/viewPortHeight / 2f, /*top=*/-viewPortHeight / 2f,
+                /*near=*/0, /*far=*/1);
+        if (DEBUG) {
+            printMatrix("ProjectionTransform", mProjectionTransform, 0);
+        }
+    }
+
+    /**
+     * The MVP is the combination of model, view and projection transforms that take us from the
+     * world space to normalized device coordinates (NDC) which OpenGL uses to display images
+     * with the correct dimensions on an EGL surface.
+     */
+    @WorkerThread
+    private void updateMvpTransform() {
+        if (mPreviewCropRect == null) {
+            extractPreviewCropFromPreviewSizeAndSurface();
+        }
+
+        if (DEBUG) {
+            Log.d(TAG, String.format("Model dimensions: %s, Crop rect: %s", mPreviewSize,
+                    mPreviewCropRect));
+        }
+
+        updateModelTransform();
+        updateViewTransform();
+        updateProjectionTransform();
+
+        Matrix.multiplyMM(mTempMatrix, 0, mViewTransform, 0, mModelTransform, 0);
+
+        if (DEBUG) {
+            // Print the model-view matrix (without projection)
+            printMatrix("MVTransform", mTempMatrix, 0);
+        }
+
+        Matrix.multiplyMM(mMvpTransform, 0, mProjectionTransform, 0, mTempMatrix, 0);
+        if (DEBUG) {
+            printMatrix("MVPTransform", mMvpTransform, 0);
+        }
+    }
+
+    private static void printMatrix(String label, float[] matrix, int offset) {
+        Log.d(TAG, String.format("%s:\n"
+                        + "%.4f %.4f %.4f %.4f\n"
+                        + "%.4f %.4f %.4f %.4f\n"
+                        + "%.4f %.4f %.4f %.4f\n"
+                        + "%.4f %.4f %.4f %.4f\n", label,
+                matrix[offset],     matrix[offset + 4], matrix[offset + 8],  matrix[offset + 12],
+                matrix[offset + 1], matrix[offset + 5], matrix[offset + 9],  matrix[offset + 13],
+                matrix[offset + 2], matrix[offset + 6], matrix[offset + 10], matrix[offset + 14],
+                matrix[offset + 3], matrix[offset + 7], matrix[offset + 11], matrix[offset + 15]));
     }
 
     @WorkerThread
@@ -532,7 +656,8 @@
     private static native boolean renderTexture(
             long nativeContext,
             long timestampNs,
-            @NonNull float[] vertexTransform,
+            @NonNull float[] mvpTransform,
+            boolean mvpDirty,
             @NonNull float[] textureTransform);
 
     @WorkerThread
diff --git a/compose/compose-runtime/samples/src/main/java/androidx/compose/samples/ModelSamples.kt b/compose/compose-runtime/samples/src/main/java/androidx/compose/samples/ModelSamples.kt
index b3147d0..9eaff4b 100644
--- a/compose/compose-runtime/samples/src/main/java/androidx/compose/samples/ModelSamples.kt
+++ b/compose/compose-runtime/samples/src/main/java/androidx/compose/samples/ModelSamples.kt
@@ -21,10 +21,10 @@
 import androidx.compose.getValue
 import androidx.compose.setValue
 import androidx.compose.state
-import androidx.ui.foundation.TextField
 import androidx.ui.foundation.Text
 import androidx.ui.input.TextFieldValue
 import androidx.ui.material.Button
+import androidx.ui.text.CoreTextField
 
 @Composable
 @Sampled
@@ -36,11 +36,11 @@
 
         fun login() = Api.login(username.text, password.text)
 
-        TextField(
+        CoreTextField(
             value = username,
              username = it }
         )
-        TextField(
+        CoreTextField(
             value = password,
              password = it }
         )
diff --git a/compose/compose-runtime/samples/src/main/java/androidx/compose/samples/MutableStateListSamples.kt b/compose/compose-runtime/samples/src/main/java/androidx/compose/samples/MutableStateListSamples.kt
index 2067a8b..c31242e 100644
--- a/compose/compose-runtime/samples/src/main/java/androidx/compose/samples/MutableStateListSamples.kt
+++ b/compose/compose-runtime/samples/src/main/java/androidx/compose/samples/MutableStateListSamples.kt
@@ -23,11 +23,11 @@
 import androidx.compose.mutableStateListOf
 import androidx.compose.state
 import androidx.ui.foundation.Text
-import androidx.ui.foundation.TextField
 import androidx.ui.input.TextFieldValue
 import androidx.ui.layout.Column
 import androidx.ui.layout.Row
 import androidx.ui.material.Button
+import androidx.ui.text.CoreTextField
 
 @Composable
 @Sampled
@@ -39,7 +39,7 @@
 
         Column {
             Row {
-                TextField(
+                CoreTextField(
                     value = name,
                      name = it }
                 )
diff --git a/compose/compose-runtime/samples/src/main/java/androidx/compose/samples/MutableStateMapSample.kt b/compose/compose-runtime/samples/src/main/java/androidx/compose/samples/MutableStateMapSample.kt
index 7767044..5417e79 100644
--- a/compose/compose-runtime/samples/src/main/java/androidx/compose/samples/MutableStateMapSample.kt
+++ b/compose/compose-runtime/samples/src/main/java/androidx/compose/samples/MutableStateMapSample.kt
@@ -23,11 +23,11 @@
 import androidx.compose.mutableStateMapOf
 import androidx.compose.state
 import androidx.ui.foundation.Text
-import androidx.ui.foundation.TextField
 import androidx.ui.input.TextFieldValue
 import androidx.ui.layout.Column
 import androidx.ui.layout.Row
 import androidx.ui.material.Button
+import androidx.ui.text.CoreTextField
 
 @Composable
 @Sampled
@@ -44,11 +44,11 @@
 
         Column {
             Row {
-                TextField(
+                CoreTextField(
                     value = name,
                      name = it }
                 )
-                TextField(
+                CoreTextField(
                     value = saying,
                      saying = it }
                 )
diff --git a/core/core/api/1.5.0-alpha01.txt b/core/core/api/1.5.0-alpha01.txt
index 34eec64..ba78e54 100644
--- a/core/core/api/1.5.0-alpha01.txt
+++ b/core/core/api/1.5.0-alpha01.txt
@@ -240,6 +240,7 @@
     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 androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+    method public static CharSequence? getSettingsText(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);
@@ -271,10 +272,13 @@
     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_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
     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_HISTORIC_MESSAGES = "android.messages.historic";
     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";
@@ -282,6 +286,8 @@
     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_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
     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";
@@ -314,6 +320,7 @@
     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 String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
     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
@@ -488,6 +495,7 @@
     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 setSettingsText(CharSequence?);
     method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
     method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
     method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
@@ -560,11 +568,13 @@
     ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
     ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
     method public void addCompatExtras(android.os.Bundle);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message);
     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!> getHistoricMessages();
     method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
     method public androidx.core.app.Person getUser();
     method @Deprecated public CharSequence? getUserDisplayName();
@@ -1419,7 +1429,7 @@
     field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
   }
 
-  public class MailTo {
+  public final class MailTo {
     method public String? getBcc();
     method public String? getBody();
     method public String? getCc();
diff --git a/core/core/api/api_lint.ignore b/core/core/api/api_lint.ignore
index b6158f8d..e70fc14 100644
--- a/core/core/api/api_lint.ignore
+++ b/core/core/api/api_lint.ignore
@@ -23,68 +23,6 @@
     Inconsistent extra value; expected `androidx.core.app.extra.USAGE_TIME_REPORT`, was `android.activity.usage_time`
 ActionValue: androidx.core.app.ActivityOptionsCompat#EXTRA_USAGE_TIME_REPORT_PACKAGES:
     Inconsistent extra value; expected `androidx.core.app.extra.USAGE_TIME_REPORT_PACKAGES`, was `android.usage_time_packages`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_AUDIO_CONTENTS_URI:
-    Inconsistent extra value; expected `androidx.core.app.extra.AUDIO_CONTENTS_URI`, was `android.audioContents`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_BACKGROUND_IMAGE_URI:
-    Inconsistent extra value; expected `androidx.core.app.extra.BACKGROUND_IMAGE_URI`, was `android.backgroundImageUri`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_BIG_TEXT:
-    Inconsistent extra value; expected `androidx.core.app.extra.BIG_TEXT`, was `android.bigText`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_CHRONOMETER_COUNT_DOWN:
-    Inconsistent extra value; expected `androidx.core.app.extra.CHRONOMETER_COUNT_DOWN`, was `android.chronometerCountDown`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_COMPACT_ACTIONS:
-    Inconsistent extra value; expected `androidx.core.app.extra.COMPACT_ACTIONS`, was `android.compactActions`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_CONVERSATION_TITLE:
-    Inconsistent extra value; expected `androidx.core.app.extra.CONVERSATION_TITLE`, was `android.conversationTitle`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_HIDDEN_CONVERSATION_TITLE:
-    Inconsistent extra value; expected `androidx.core.app.extra.HIDDEN_CONVERSATION_TITLE`, was `android.hiddenConversationTitle`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_INFO_TEXT:
-    Inconsistent extra value; expected `androidx.core.app.extra.INFO_TEXT`, was `android.infoText`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_IS_GROUP_CONVERSATION:
-    Inconsistent extra value; expected `androidx.core.app.extra.IS_GROUP_CONVERSATION`, was `android.isGroupConversation`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_LARGE_ICON:
-    Inconsistent extra value; expected `androidx.core.app.extra.LARGE_ICON`, was `android.largeIcon`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_LARGE_ICON_BIG:
-    Inconsistent extra value; expected `androidx.core.app.extra.LARGE_ICON_BIG`, was `android.largeIcon.big`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_MEDIA_SESSION:
-    Inconsistent extra value; expected `androidx.core.app.extra.MEDIA_SESSION`, was `android.mediaSession`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_MESSAGES:
-    Inconsistent extra value; expected `androidx.core.app.extra.MESSAGES`, was `android.messages`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_MESSAGING_STYLE_USER:
-    Inconsistent extra value; expected `androidx.core.app.extra.MESSAGING_STYLE_USER`, was `android.messagingStyleUser`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_PEOPLE:
-    Inconsistent extra value; expected `androidx.core.app.extra.PEOPLE`, was `android.people`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_PICTURE:
-    Inconsistent extra value; expected `androidx.core.app.extra.PICTURE`, was `android.picture`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_PROGRESS:
-    Inconsistent extra value; expected `androidx.core.app.extra.PROGRESS`, was `android.progress`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_PROGRESS_INDETERMINATE:
-    Inconsistent extra value; expected `androidx.core.app.extra.PROGRESS_INDETERMINATE`, was `android.progressIndeterminate`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_PROGRESS_MAX:
-    Inconsistent extra value; expected `androidx.core.app.extra.PROGRESS_MAX`, was `android.progressMax`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_REMOTE_INPUT_HISTORY:
-    Inconsistent extra value; expected `androidx.core.app.extra.REMOTE_INPUT_HISTORY`, was `android.remoteInputHistory`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_SELF_DISPLAY_NAME:
-    Inconsistent extra value; expected `androidx.core.app.extra.SELF_DISPLAY_NAME`, was `android.selfDisplayName`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_SHOW_CHRONOMETER:
-    Inconsistent extra value; expected `androidx.core.app.extra.SHOW_CHRONOMETER`, was `android.showChronometer`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_SHOW_WHEN:
-    Inconsistent extra value; expected `androidx.core.app.extra.SHOW_WHEN`, was `android.showWhen`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_SMALL_ICON:
-    Inconsistent extra value; expected `androidx.core.app.extra.SMALL_ICON`, was `android.icon`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_SUB_TEXT:
-    Inconsistent extra value; expected `androidx.core.app.extra.SUB_TEXT`, was `android.subText`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_SUMMARY_TEXT:
-    Inconsistent extra value; expected `androidx.core.app.extra.SUMMARY_TEXT`, was `android.summaryText`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_TEMPLATE:
-    Inconsistent extra value; expected `androidx.core.app.extra.TEMPLATE`, was `android.template`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_TEXT:
-    Inconsistent extra value; expected `androidx.core.app.extra.TEXT`, was `android.text`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_TEXT_LINES:
-    Inconsistent extra value; expected `androidx.core.app.extra.TEXT_LINES`, was `android.textLines`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_TITLE:
-    Inconsistent extra value; expected `androidx.core.app.extra.TITLE`, was `android.title`
-ActionValue: androidx.core.app.NotificationCompat#EXTRA_TITLE_BIG:
-    Inconsistent extra value; expected `androidx.core.app.extra.TITLE_BIG`, was `android.title.big`
 ActionValue: androidx.core.app.NotificationCompatExtras#EXTRA_ACTION_EXTRAS:
     Inconsistent extra value; expected `androidx.core.app.extra.ACTION_EXTRAS`, was `android.support.actionExtras`
 ActionValue: androidx.core.app.NotificationCompatExtras#EXTRA_GROUP_KEY:
@@ -273,498 +211,10 @@
     Missing nullability on parameter `sharedElements` in method `makeSceneTransitionAnimation`
 MissingNullability: androidx.core.app.JobIntentService#onBind(android.content.Intent):
     Missing nullability on method `onBind` return
-MissingNullability: androidx.core.app.NotificationCompat#getAction(android.app.Notification, int):
-    Missing nullability on method `getAction` return
-MissingNullability: androidx.core.app.NotificationCompat#getAction(android.app.Notification, int) parameter #0:
-    Missing nullability on parameter `notification` in method `getAction`
-MissingNullability: androidx.core.app.NotificationCompat#getActionCount(android.app.Notification) parameter #0:
-    Missing nullability on parameter `notification` in method `getActionCount`
-MissingNullability: androidx.core.app.NotificationCompat#getAllowSystemGeneratedContextualActions(android.app.Notification) parameter #0:
-    Missing nullability on parameter `notification` in method `getAllowSystemGeneratedContextualActions`
-MissingNullability: androidx.core.app.NotificationCompat#getBadgeIconType(android.app.Notification) parameter #0:
-    Missing nullability on parameter `notification` in method `getBadgeIconType`
-MissingNullability: androidx.core.app.NotificationCompat#getCategory(android.app.Notification):
-    Missing nullability on method `getCategory` return
-MissingNullability: androidx.core.app.NotificationCompat#getCategory(android.app.Notification) parameter #0:
-    Missing nullability on parameter `notification` in method `getCategory`
-MissingNullability: androidx.core.app.NotificationCompat#getChannelId(android.app.Notification):
-    Missing nullability on method `getChannelId` return
-MissingNullability: androidx.core.app.NotificationCompat#getChannelId(android.app.Notification) parameter #0:
-    Missing nullability on parameter `notification` in method `getChannelId`
-MissingNullability: androidx.core.app.NotificationCompat#getContentTitle(android.app.Notification):
-    Missing nullability on method `getContentTitle` return
-MissingNullability: androidx.core.app.NotificationCompat#getContentTitle(android.app.Notification) parameter #0:
-    Missing nullability on parameter `notification` in method `getContentTitle`
-MissingNullability: androidx.core.app.NotificationCompat#getExtras(android.app.Notification) parameter #0:
-    Missing nullability on parameter `notification` in method `getExtras`
-MissingNullability: androidx.core.app.NotificationCompat#getGroup(android.app.Notification):
-    Missing nullability on method `getGroup` return
-MissingNullability: androidx.core.app.NotificationCompat#getGroup(android.app.Notification) parameter #0:
-    Missing nullability on parameter `notification` in method `getGroup`
-MissingNullability: androidx.core.app.NotificationCompat#getGroupAlertBehavior(android.app.Notification) parameter #0:
-    Missing nullability on parameter `notification` in method `getGroupAlertBehavior`
-MissingNullability: androidx.core.app.NotificationCompat#getInvisibleActions(android.app.Notification):
-    Missing nullability on method `getInvisibleActions` return
-MissingNullability: androidx.core.app.NotificationCompat#getInvisibleActions(android.app.Notification) parameter #0:
-    Missing nullability on parameter `notification` in method `getInvisibleActions`
-MissingNullability: androidx.core.app.NotificationCompat#getLocalOnly(android.app.Notification) parameter #0:
-    Missing nullability on parameter `notification` in method `getLocalOnly`
-MissingNullability: androidx.core.app.NotificationCompat#getShortcutId(android.app.Notification):
-    Missing nullability on method `getShortcutId` return
-MissingNullability: androidx.core.app.NotificationCompat#getShortcutId(android.app.Notification) parameter #0:
-    Missing nullability on parameter `notification` in method `getShortcutId`
-MissingNullability: androidx.core.app.NotificationCompat#getSortKey(android.app.Notification):
-    Missing nullability on method `getSortKey` return
-MissingNullability: androidx.core.app.NotificationCompat#getSortKey(android.app.Notification) parameter #0:
-    Missing nullability on parameter `notification` in method `getSortKey`
-MissingNullability: androidx.core.app.NotificationCompat#getTimeoutAfter(android.app.Notification) parameter #0:
-    Missing nullability on parameter `notification` in method `getTimeoutAfter`
-MissingNullability: androidx.core.app.NotificationCompat#isGroupSummary(android.app.Notification) parameter #0:
-    Missing nullability on parameter `notification` in method `isGroupSummary`
-MissingNullability: androidx.core.app.NotificationCompat.Action#Action(int, CharSequence, android.app.PendingIntent) parameter #1:
-    Missing nullability on parameter `title` in method `Action`
-MissingNullability: androidx.core.app.NotificationCompat.Action#Action(int, CharSequence, android.app.PendingIntent) parameter #2:
-    Missing nullability on parameter `intent` in method `Action`
 MissingNullability: androidx.core.app.NotificationCompat.Action#actionIntent:
     Missing nullability on field `actionIntent` in class `class androidx.core.app.NotificationCompat.Action`
-MissingNullability: androidx.core.app.NotificationCompat.Action#getActionIntent():
-    Missing nullability on method `getActionIntent` return
-MissingNullability: androidx.core.app.NotificationCompat.Action#getDataOnlyRemoteInputs():
-    Missing nullability on method `getDataOnlyRemoteInputs` return
-MissingNullability: androidx.core.app.NotificationCompat.Action#getExtras():
-    Missing nullability on method `getExtras` return
-MissingNullability: androidx.core.app.NotificationCompat.Action#getRemoteInputs():
-    Missing nullability on method `getRemoteInputs` return
-MissingNullability: androidx.core.app.NotificationCompat.Action#getTitle():
-    Missing nullability on method `getTitle` return
 MissingNullability: androidx.core.app.NotificationCompat.Action#title:
     Missing nullability on field `title` in class `class androidx.core.app.NotificationCompat.Action`
-MissingNullability: androidx.core.app.NotificationCompat.Action.Builder#Builder(androidx.core.app.NotificationCompat.Action) parameter #0:
-    Missing nullability on parameter `action` in method `Builder`
-MissingNullability: androidx.core.app.NotificationCompat.Action.Builder#Builder(int, CharSequence, android.app.PendingIntent) parameter #1:
-    Missing nullability on parameter `title` in method `Builder`
-MissingNullability: androidx.core.app.NotificationCompat.Action.Builder#Builder(int, CharSequence, android.app.PendingIntent) parameter #2:
-    Missing nullability on parameter `intent` in method `Builder`
-MissingNullability: androidx.core.app.NotificationCompat.Action.Builder#addExtras(android.os.Bundle):
-    Missing nullability on method `addExtras` return
-MissingNullability: androidx.core.app.NotificationCompat.Action.Builder#addExtras(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `extras` in method `addExtras`
-MissingNullability: androidx.core.app.NotificationCompat.Action.Builder#addRemoteInput(androidx.core.app.RemoteInput):
-    Missing nullability on method `addRemoteInput` return
-MissingNullability: androidx.core.app.NotificationCompat.Action.Builder#addRemoteInput(androidx.core.app.RemoteInput) parameter #0:
-    Missing nullability on parameter `remoteInput` in method `addRemoteInput`
-MissingNullability: androidx.core.app.NotificationCompat.Action.Builder#build():
-    Missing nullability on method `build` return
-MissingNullability: androidx.core.app.NotificationCompat.Action.Builder#extend(androidx.core.app.NotificationCompat.Action.Extender):
-    Missing nullability on method `extend` return
-MissingNullability: androidx.core.app.NotificationCompat.Action.Builder#extend(androidx.core.app.NotificationCompat.Action.Extender) parameter #0:
-    Missing nullability on parameter `extender` in method `extend`
-MissingNullability: androidx.core.app.NotificationCompat.Action.Builder#getExtras():
-    Missing nullability on method `getExtras` return
-MissingNullability: androidx.core.app.NotificationCompat.Action.Builder#setAllowGeneratedReplies(boolean):
-    Missing nullability on method `setAllowGeneratedReplies` return
-MissingNullability: androidx.core.app.NotificationCompat.Action.Builder#setSemanticAction(int):
-    Missing nullability on method `setSemanticAction` return
-MissingNullability: androidx.core.app.NotificationCompat.Action.Builder#setShowsUserInterface(boolean):
-    Missing nullability on method `setShowsUserInterface` return
-MissingNullability: androidx.core.app.NotificationCompat.Action.Extender#extend(androidx.core.app.NotificationCompat.Action.Builder):
-    Missing nullability on method `extend` return
-MissingNullability: androidx.core.app.NotificationCompat.Action.Extender#extend(androidx.core.app.NotificationCompat.Action.Builder) parameter #0:
-    Missing nullability on parameter `builder` in method `extend`
-MissingNullability: androidx.core.app.NotificationCompat.Action.WearableExtender#WearableExtender(androidx.core.app.NotificationCompat.Action) parameter #0:
-    Missing nullability on parameter `action` in method `WearableExtender`
-MissingNullability: androidx.core.app.NotificationCompat.Action.WearableExtender#clone():
-    Missing nullability on method `clone` return
-MissingNullability: androidx.core.app.NotificationCompat.Action.WearableExtender#extend(androidx.core.app.NotificationCompat.Action.Builder):
-    Missing nullability on method `extend` return
-MissingNullability: androidx.core.app.NotificationCompat.Action.WearableExtender#extend(androidx.core.app.NotificationCompat.Action.Builder) parameter #0:
-    Missing nullability on parameter `builder` in method `extend`
-MissingNullability: androidx.core.app.NotificationCompat.Action.WearableExtender#setAvailableOffline(boolean):
-    Missing nullability on method `setAvailableOffline` return
-MissingNullability: androidx.core.app.NotificationCompat.Action.WearableExtender#setCancelLabel(CharSequence) parameter #0:
-    Missing nullability on parameter `label` in method `setCancelLabel`
-MissingNullability: androidx.core.app.NotificationCompat.Action.WearableExtender#setConfirmLabel(CharSequence) parameter #0:
-    Missing nullability on parameter `label` in method `setConfirmLabel`
-MissingNullability: androidx.core.app.NotificationCompat.Action.WearableExtender#setHintDisplayActionInline(boolean):
-    Missing nullability on method `setHintDisplayActionInline` return
-MissingNullability: androidx.core.app.NotificationCompat.Action.WearableExtender#setHintLaunchesActivity(boolean):
-    Missing nullability on method `setHintLaunchesActivity` return
-MissingNullability: androidx.core.app.NotificationCompat.Action.WearableExtender#setInProgressLabel(CharSequence) parameter #0:
-    Missing nullability on parameter `label` in method `setInProgressLabel`
-MissingNullability: androidx.core.app.NotificationCompat.BigPictureStyle#BigPictureStyle(androidx.core.app.NotificationCompat.Builder) parameter #0:
-    Missing nullability on parameter `builder` in method `BigPictureStyle`
-MissingNullability: androidx.core.app.NotificationCompat.BigPictureStyle#bigLargeIcon(android.graphics.Bitmap):
-    Missing nullability on method `bigLargeIcon` return
-MissingNullability: androidx.core.app.NotificationCompat.BigPictureStyle#bigLargeIcon(android.graphics.Bitmap) parameter #0:
-    Missing nullability on parameter `b` in method `bigLargeIcon`
-MissingNullability: androidx.core.app.NotificationCompat.BigPictureStyle#bigPicture(android.graphics.Bitmap):
-    Missing nullability on method `bigPicture` return
-MissingNullability: androidx.core.app.NotificationCompat.BigPictureStyle#bigPicture(android.graphics.Bitmap) parameter #0:
-    Missing nullability on parameter `b` in method `bigPicture`
-MissingNullability: androidx.core.app.NotificationCompat.BigPictureStyle#setBigContentTitle(CharSequence):
-    Missing nullability on method `setBigContentTitle` return
-MissingNullability: androidx.core.app.NotificationCompat.BigPictureStyle#setBigContentTitle(CharSequence) parameter #0:
-    Missing nullability on parameter `title` in method `setBigContentTitle`
-MissingNullability: androidx.core.app.NotificationCompat.BigPictureStyle#setSummaryText(CharSequence):
-    Missing nullability on method `setSummaryText` return
-MissingNullability: androidx.core.app.NotificationCompat.BigPictureStyle#setSummaryText(CharSequence) parameter #0:
-    Missing nullability on parameter `cs` in method `setSummaryText`
-MissingNullability: androidx.core.app.NotificationCompat.BigTextStyle#BigTextStyle(androidx.core.app.NotificationCompat.Builder) parameter #0:
-    Missing nullability on parameter `builder` in method `BigTextStyle`
-MissingNullability: androidx.core.app.NotificationCompat.BigTextStyle#bigText(CharSequence):
-    Missing nullability on method `bigText` return
-MissingNullability: androidx.core.app.NotificationCompat.BigTextStyle#bigText(CharSequence) parameter #0:
-    Missing nullability on parameter `cs` in method `bigText`
-MissingNullability: androidx.core.app.NotificationCompat.BigTextStyle#setBigContentTitle(CharSequence):
-    Missing nullability on method `setBigContentTitle` return
-MissingNullability: androidx.core.app.NotificationCompat.BigTextStyle#setBigContentTitle(CharSequence) parameter #0:
-    Missing nullability on parameter `title` in method `setBigContentTitle`
-MissingNullability: androidx.core.app.NotificationCompat.BigTextStyle#setSummaryText(CharSequence):
-    Missing nullability on method `setSummaryText` return
-MissingNullability: androidx.core.app.NotificationCompat.BigTextStyle#setSummaryText(CharSequence) parameter #0:
-    Missing nullability on parameter `cs` in method `setSummaryText`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#Builder(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `Builder`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#addAction(androidx.core.app.NotificationCompat.Action):
-    Missing nullability on method `addAction` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#addAction(androidx.core.app.NotificationCompat.Action) parameter #0:
-    Missing nullability on parameter `action` in method `addAction`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#addAction(int, CharSequence, android.app.PendingIntent):
-    Missing nullability on method `addAction` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#addAction(int, CharSequence, android.app.PendingIntent) parameter #1:
-    Missing nullability on parameter `title` in method `addAction`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#addAction(int, CharSequence, android.app.PendingIntent) parameter #2:
-    Missing nullability on parameter `intent` in method `addAction`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#addExtras(android.os.Bundle):
-    Missing nullability on method `addExtras` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#addExtras(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `extras` in method `addExtras`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#addInvisibleAction(androidx.core.app.NotificationCompat.Action):
-    Missing nullability on method `addInvisibleAction` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#addInvisibleAction(androidx.core.app.NotificationCompat.Action) parameter #0:
-    Missing nullability on parameter `action` in method `addInvisibleAction`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#addInvisibleAction(int, CharSequence, android.app.PendingIntent):
-    Missing nullability on method `addInvisibleAction` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#addInvisibleAction(int, CharSequence, android.app.PendingIntent) parameter #1:
-    Missing nullability on parameter `title` in method `addInvisibleAction`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#addInvisibleAction(int, CharSequence, android.app.PendingIntent) parameter #2:
-    Missing nullability on parameter `intent` in method `addInvisibleAction`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#addPerson(String) parameter #0:
-    Missing nullability on parameter `uri` in method `addPerson`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#build():
-    Missing nullability on method `build` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#extend(androidx.core.app.NotificationCompat.Extender):
-    Missing nullability on method `extend` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#extend(androidx.core.app.NotificationCompat.Extender) parameter #0:
-    Missing nullability on parameter `extender` in method `extend`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#getExtras():
-    Missing nullability on method `getExtras` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#limitCharSequenceLength(CharSequence):
-    Missing nullability on method `limitCharSequenceLength` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#limitCharSequenceLength(CharSequence) parameter #0:
-    Missing nullability on parameter `cs` in method `limitCharSequenceLength`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setAutoCancel(boolean):
-    Missing nullability on method `setAutoCancel` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setBadgeIconType(int):
-    Missing nullability on method `setBadgeIconType` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setCategory(String):
-    Missing nullability on method `setCategory` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setCategory(String) parameter #0:
-    Missing nullability on parameter `category` in method `setCategory`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setChannelId(String):
-    Missing nullability on method `setChannelId` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setColor(int):
-    Missing nullability on method `setColor` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setColorized(boolean):
-    Missing nullability on method `setColorized` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setContent(android.widget.RemoteViews):
-    Missing nullability on method `setContent` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setContent(android.widget.RemoteViews) parameter #0:
-    Missing nullability on parameter `views` in method `setContent`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setContentInfo(CharSequence):
-    Missing nullability on method `setContentInfo` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setContentInfo(CharSequence) parameter #0:
-    Missing nullability on parameter `info` in method `setContentInfo`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setContentIntent(android.app.PendingIntent):
-    Missing nullability on method `setContentIntent` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setContentIntent(android.app.PendingIntent) parameter #0:
-    Missing nullability on parameter `intent` in method `setContentIntent`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setContentText(CharSequence):
-    Missing nullability on method `setContentText` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setContentText(CharSequence) parameter #0:
-    Missing nullability on parameter `text` in method `setContentText`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setContentTitle(CharSequence):
-    Missing nullability on method `setContentTitle` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setContentTitle(CharSequence) parameter #0:
-    Missing nullability on parameter `title` in method `setContentTitle`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setCustomBigContentView(android.widget.RemoteViews):
-    Missing nullability on method `setCustomBigContentView` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setCustomBigContentView(android.widget.RemoteViews) parameter #0:
-    Missing nullability on parameter `contentView` in method `setCustomBigContentView`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setCustomContentView(android.widget.RemoteViews):
-    Missing nullability on method `setCustomContentView` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setCustomContentView(android.widget.RemoteViews) parameter #0:
-    Missing nullability on parameter `contentView` in method `setCustomContentView`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setCustomHeadsUpContentView(android.widget.RemoteViews):
-    Missing nullability on method `setCustomHeadsUpContentView` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setCustomHeadsUpContentView(android.widget.RemoteViews) parameter #0:
-    Missing nullability on parameter `contentView` in method `setCustomHeadsUpContentView`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setDefaults(int):
-    Missing nullability on method `setDefaults` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setDeleteIntent(android.app.PendingIntent):
-    Missing nullability on method `setDeleteIntent` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setDeleteIntent(android.app.PendingIntent) parameter #0:
-    Missing nullability on parameter `intent` in method `setDeleteIntent`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setExtras(android.os.Bundle):
-    Missing nullability on method `setExtras` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setExtras(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `extras` in method `setExtras`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setFullScreenIntent(android.app.PendingIntent, boolean):
-    Missing nullability on method `setFullScreenIntent` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setFullScreenIntent(android.app.PendingIntent, boolean) parameter #0:
-    Missing nullability on parameter `intent` in method `setFullScreenIntent`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setGroup(String):
-    Missing nullability on method `setGroup` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setGroup(String) parameter #0:
-    Missing nullability on parameter `groupKey` in method `setGroup`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setGroupAlertBehavior(int):
-    Missing nullability on method `setGroupAlertBehavior` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setGroupSummary(boolean):
-    Missing nullability on method `setGroupSummary` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setLargeIcon(android.graphics.Bitmap):
-    Missing nullability on method `setLargeIcon` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setLargeIcon(android.graphics.Bitmap) parameter #0:
-    Missing nullability on parameter `icon` in method `setLargeIcon`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setLights(int, int, int):
-    Missing nullability on method `setLights` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setLocalOnly(boolean):
-    Missing nullability on method `setLocalOnly` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setNumber(int):
-    Missing nullability on method `setNumber` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setOngoing(boolean):
-    Missing nullability on method `setOngoing` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setOnlyAlertOnce(boolean):
-    Missing nullability on method `setOnlyAlertOnce` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setPriority(int):
-    Missing nullability on method `setPriority` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setProgress(int, int, boolean):
-    Missing nullability on method `setProgress` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setPublicVersion(android.app.Notification):
-    Missing nullability on method `setPublicVersion` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setPublicVersion(android.app.Notification) parameter #0:
-    Missing nullability on parameter `n` in method `setPublicVersion`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setRemoteInputHistory(CharSequence[]):
-    Missing nullability on method `setRemoteInputHistory` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setRemoteInputHistory(CharSequence[]) parameter #0:
-    Missing nullability on parameter `text` in method `setRemoteInputHistory`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setShortcutId(String):
-    Missing nullability on method `setShortcutId` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setShortcutId(String) parameter #0:
-    Missing nullability on parameter `shortcutId` in method `setShortcutId`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setShowWhen(boolean):
-    Missing nullability on method `setShowWhen` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setSmallIcon(int):
-    Missing nullability on method `setSmallIcon` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setSmallIcon(int, int):
-    Missing nullability on method `setSmallIcon` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setSortKey(String):
-    Missing nullability on method `setSortKey` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setSortKey(String) parameter #0:
-    Missing nullability on parameter `sortKey` in method `setSortKey`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setSound(android.net.Uri):
-    Missing nullability on method `setSound` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setSound(android.net.Uri) parameter #0:
-    Missing nullability on parameter `sound` in method `setSound`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setSound(android.net.Uri, int):
-    Missing nullability on method `setSound` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setSound(android.net.Uri, int) parameter #0:
-    Missing nullability on parameter `sound` in method `setSound`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setStyle(androidx.core.app.NotificationCompat.Style):
-    Missing nullability on method `setStyle` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setStyle(androidx.core.app.NotificationCompat.Style) parameter #0:
-    Missing nullability on parameter `style` in method `setStyle`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setSubText(CharSequence):
-    Missing nullability on method `setSubText` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setSubText(CharSequence) parameter #0:
-    Missing nullability on parameter `text` in method `setSubText`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setTicker(CharSequence):
-    Missing nullability on method `setTicker` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setTicker(CharSequence) parameter #0:
-    Missing nullability on parameter `tickerText` in method `setTicker`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setTicker(CharSequence, android.widget.RemoteViews):
-    Missing nullability on method `setTicker` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setTicker(CharSequence, android.widget.RemoteViews) parameter #0:
-    Missing nullability on parameter `tickerText` in method `setTicker`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setTicker(CharSequence, android.widget.RemoteViews) parameter #1:
-    Missing nullability on parameter `views` in method `setTicker`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setTimeoutAfter(long):
-    Missing nullability on method `setTimeoutAfter` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setUsesChronometer(boolean):
-    Missing nullability on method `setUsesChronometer` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setVibrate(long[]):
-    Missing nullability on method `setVibrate` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setVibrate(long[]) parameter #0:
-    Missing nullability on parameter `pattern` in method `setVibrate`
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setVisibility(int):
-    Missing nullability on method `setVisibility` return
-MissingNullability: androidx.core.app.NotificationCompat.Builder#setWhen(long):
-    Missing nullability on method `setWhen` return
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender#CarExtender(android.app.Notification) parameter #0:
-    Missing nullability on parameter `notification` in method `CarExtender`
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender#extend(androidx.core.app.NotificationCompat.Builder):
-    Missing nullability on method `extend` return
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender#extend(androidx.core.app.NotificationCompat.Builder) parameter #0:
-    Missing nullability on parameter `builder` in method `extend`
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender#getLargeIcon():
-    Missing nullability on method `getLargeIcon` return
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender#setColor(int):
-    Missing nullability on method `setColor` return
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender#setLargeIcon(android.graphics.Bitmap):
-    Missing nullability on method `setLargeIcon` return
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender#setLargeIcon(android.graphics.Bitmap) parameter #0:
-    Missing nullability on parameter `largeIcon` in method `setLargeIcon`
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender#setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation) parameter #0:
-    Missing nullability on parameter `unreadConversation` in method `setUnreadConversation`
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender.UnreadConversation#getMessages():
-    Missing nullability on method `getMessages` return
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender.UnreadConversation#getParticipant():
-    Missing nullability on method `getParticipant` return
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender.UnreadConversation#getParticipants():
-    Missing nullability on method `getParticipants` return
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender.UnreadConversation#getReadPendingIntent():
-    Missing nullability on method `getReadPendingIntent` return
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender.UnreadConversation#getRemoteInput():
-    Missing nullability on method `getRemoteInput` return
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender.UnreadConversation#getReplyPendingIntent():
-    Missing nullability on method `getReplyPendingIntent` return
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder#Builder(String) parameter #0:
-    Missing nullability on parameter `name` in method `Builder`
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder#addMessage(String):
-    Missing nullability on method `addMessage` return
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder#addMessage(String) parameter #0:
-    Missing nullability on parameter `message` in method `addMessage`
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder#build():
-    Missing nullability on method `build` return
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder#setLatestTimestamp(long):
-    Missing nullability on method `setLatestTimestamp` return
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder#setReadPendingIntent(android.app.PendingIntent):
-    Missing nullability on method `setReadPendingIntent` return
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder#setReadPendingIntent(android.app.PendingIntent) parameter #0:
-    Missing nullability on parameter `pendingIntent` in method `setReadPendingIntent`
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder#setReplyAction(android.app.PendingIntent, androidx.core.app.RemoteInput):
-    Missing nullability on method `setReplyAction` return
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder#setReplyAction(android.app.PendingIntent, androidx.core.app.RemoteInput) parameter #0:
-    Missing nullability on parameter `pendingIntent` in method `setReplyAction`
-MissingNullability: androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder#setReplyAction(android.app.PendingIntent, androidx.core.app.RemoteInput) parameter #1:
-    Missing nullability on parameter `remoteInput` in method `setReplyAction`
-MissingNullability: androidx.core.app.NotificationCompat.Extender#extend(androidx.core.app.NotificationCompat.Builder):
-    Missing nullability on method `extend` return
-MissingNullability: androidx.core.app.NotificationCompat.Extender#extend(androidx.core.app.NotificationCompat.Builder) parameter #0:
-    Missing nullability on parameter `builder` in method `extend`
-MissingNullability: androidx.core.app.NotificationCompat.InboxStyle#InboxStyle(androidx.core.app.NotificationCompat.Builder) parameter #0:
-    Missing nullability on parameter `builder` in method `InboxStyle`
-MissingNullability: androidx.core.app.NotificationCompat.InboxStyle#addLine(CharSequence):
-    Missing nullability on method `addLine` return
-MissingNullability: androidx.core.app.NotificationCompat.InboxStyle#addLine(CharSequence) parameter #0:
-    Missing nullability on parameter `cs` in method `addLine`
-MissingNullability: androidx.core.app.NotificationCompat.InboxStyle#setBigContentTitle(CharSequence):
-    Missing nullability on method `setBigContentTitle` return
-MissingNullability: androidx.core.app.NotificationCompat.InboxStyle#setBigContentTitle(CharSequence) parameter #0:
-    Missing nullability on parameter `title` in method `setBigContentTitle`
-MissingNullability: androidx.core.app.NotificationCompat.InboxStyle#setSummaryText(CharSequence):
-    Missing nullability on method `setSummaryText` return
-MissingNullability: androidx.core.app.NotificationCompat.InboxStyle#setSummaryText(CharSequence) parameter #0:
-    Missing nullability on parameter `cs` in method `setSummaryText`
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle#addCompatExtras(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `extras` in method `addCompatExtras`
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle#addMessage(CharSequence, long, CharSequence) parameter #0:
-    Missing nullability on parameter `text` in method `addMessage`
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle#addMessage(CharSequence, long, CharSequence) parameter #2:
-    Missing nullability on parameter `sender` in method `addMessage`
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle#addMessage(CharSequence, long, androidx.core.app.Person):
-    Missing nullability on method `addMessage` return
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle#addMessage(CharSequence, long, androidx.core.app.Person) parameter #0:
-    Missing nullability on parameter `text` in method `addMessage`
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle#addMessage(CharSequence, long, androidx.core.app.Person) parameter #2:
-    Missing nullability on parameter `person` in method `addMessage`
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle#addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message):
-    Missing nullability on method `addMessage` return
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle#addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message) parameter #0:
-    Missing nullability on parameter `message` in method `addMessage`
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle#extractMessagingStyleFromNotification(android.app.Notification) parameter #0:
-    Missing nullability on parameter `notification` in method `extractMessagingStyleFromNotification`
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle#getMessages():
-    Missing nullability on method `getMessages` return
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle#getUser():
-    Missing nullability on method `getUser` return
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle#setConversationTitle(CharSequence):
-    Missing nullability on method `setConversationTitle` return
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle#setGroupConversation(boolean):
-    Missing nullability on method `setGroupConversation` return
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle.Message#Message(CharSequence, long, CharSequence) parameter #0:
-    Missing nullability on parameter `text` in method `Message`
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle.Message#Message(CharSequence, long, CharSequence) parameter #2:
-    Missing nullability on parameter `sender` in method `Message`
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle.Message#Message(CharSequence, long, androidx.core.app.Person) parameter #0:
-    Missing nullability on parameter `text` in method `Message`
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle.Message#setData(String, android.net.Uri):
-    Missing nullability on method `setData` return
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle.Message#setData(String, android.net.Uri) parameter #0:
-    Missing nullability on parameter `dataMimeType` in method `setData`
-MissingNullability: androidx.core.app.NotificationCompat.MessagingStyle.Message#setData(String, android.net.Uri) parameter #1:
-    Missing nullability on parameter `dataUri` in method `setData`
-MissingNullability: androidx.core.app.NotificationCompat.Style#build():
-    Missing nullability on method `build` return
-MissingNullability: androidx.core.app.NotificationCompat.Style#setBuilder(androidx.core.app.NotificationCompat.Builder) parameter #0:
-    Missing nullability on parameter `builder` in method `setBuilder`
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#WearableExtender(android.app.Notification) parameter #0:
-    Missing nullability on parameter `notification` in method `WearableExtender`
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#addAction(androidx.core.app.NotificationCompat.Action):
-    Missing nullability on method `addAction` return
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#addAction(androidx.core.app.NotificationCompat.Action) parameter #0:
-    Missing nullability on parameter `action` in method `addAction`
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#addActions(java.util.List<androidx.core.app.NotificationCompat.Action>):
-    Missing nullability on method `addActions` return
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#addActions(java.util.List<androidx.core.app.NotificationCompat.Action>) parameter #0:
-    Missing nullability on parameter `actions` in method `addActions`
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#addPage(android.app.Notification) parameter #0:
-    Missing nullability on parameter `page` in method `addPage`
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#addPages(java.util.List<android.app.Notification>) parameter #0:
-    Missing nullability on parameter `pages` in method `addPages`
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#clearActions():
-    Missing nullability on method `clearActions` return
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#clone():
-    Missing nullability on method `clone` return
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#extend(androidx.core.app.NotificationCompat.Builder):
-    Missing nullability on method `extend` return
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#extend(androidx.core.app.NotificationCompat.Builder) parameter #0:
-    Missing nullability on parameter `builder` in method `extend`
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#getActions():
-    Missing nullability on method `getActions` return
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#getBridgeTag():
-    Missing nullability on method `getBridgeTag` return
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#getDismissalId():
-    Missing nullability on method `getDismissalId` return
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#setBackground(android.graphics.Bitmap) parameter #0:
-    Missing nullability on parameter `background` in method `setBackground`
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#setBridgeTag(String):
-    Missing nullability on method `setBridgeTag` return
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#setBridgeTag(String) parameter #0:
-    Missing nullability on parameter `bridgeTag` in method `setBridgeTag`
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#setContentAction(int):
-    Missing nullability on method `setContentAction` return
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#setContentIntentAvailableOffline(boolean):
-    Missing nullability on method `setContentIntentAvailableOffline` return
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#setDismissalId(String):
-    Missing nullability on method `setDismissalId` return
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#setDismissalId(String) parameter #0:
-    Missing nullability on parameter `dismissalId` in method `setDismissalId`
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#setDisplayIntent(android.app.PendingIntent) parameter #0:
-    Missing nullability on parameter `intent` in method `setDisplayIntent`
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#setHintContentIntentLaunchesActivity(boolean):
-    Missing nullability on method `setHintContentIntentLaunchesActivity` return
-MissingNullability: androidx.core.app.NotificationCompat.WearableExtender#setStartScrollBottom(boolean):
-    Missing nullability on method `setStartScrollBottom` return
 MissingNullability: androidx.core.app.NotificationCompatSideChannelService#cancel(String, int, String) parameter #0:
     Missing nullability on parameter `packageName` in method `cancel`
 MissingNullability: androidx.core.app.NotificationCompatSideChannelService#cancel(String, int, String) parameter #2:
diff --git a/core/core/api/current.txt b/core/core/api/current.txt
index 34eec64..ba78e54 100644
--- a/core/core/api/current.txt
+++ b/core/core/api/current.txt
@@ -240,6 +240,7 @@
     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 androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+    method public static CharSequence? getSettingsText(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);
@@ -271,10 +272,13 @@
     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_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
     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_HISTORIC_MESSAGES = "android.messages.historic";
     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";
@@ -282,6 +286,8 @@
     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_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
     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";
@@ -314,6 +320,7 @@
     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 String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
     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
@@ -488,6 +495,7 @@
     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 setSettingsText(CharSequence?);
     method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
     method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
     method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
@@ -560,11 +568,13 @@
     ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
     ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
     method public void addCompatExtras(android.os.Bundle);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message);
     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!> getHistoricMessages();
     method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
     method public androidx.core.app.Person getUser();
     method @Deprecated public CharSequence? getUserDisplayName();
@@ -1419,7 +1429,7 @@
     field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
   }
 
-  public class MailTo {
+  public final class MailTo {
     method public String? getBcc();
     method public String? getBody();
     method public String? getCc();
diff --git a/core/core/api/public_plus_experimental_1.5.0-alpha01.txt b/core/core/api/public_plus_experimental_1.5.0-alpha01.txt
index 4b0337f..8e9c745 100644
--- a/core/core/api/public_plus_experimental_1.5.0-alpha01.txt
+++ b/core/core/api/public_plus_experimental_1.5.0-alpha01.txt
@@ -240,6 +240,7 @@
     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 androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+    method public static CharSequence? getSettingsText(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);
@@ -271,10 +272,13 @@
     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_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
     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_HISTORIC_MESSAGES = "android.messages.historic";
     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";
@@ -282,6 +286,8 @@
     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_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
     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";
@@ -314,6 +320,7 @@
     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 String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
     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
@@ -488,6 +495,7 @@
     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 setSettingsText(CharSequence?);
     method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
     method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
     method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
@@ -560,11 +568,13 @@
     ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
     ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
     method public void addCompatExtras(android.os.Bundle);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message);
     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!> getHistoricMessages();
     method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
     method public androidx.core.app.Person getUser();
     method @Deprecated public CharSequence? getUserDisplayName();
@@ -1417,7 +1427,7 @@
     field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
   }
 
-  public class MailTo {
+  public final class MailTo {
     method public String? getBcc();
     method public String? getBody();
     method public String? getCc();
diff --git a/core/core/api/public_plus_experimental_current.txt b/core/core/api/public_plus_experimental_current.txt
index 4b0337f..8e9c745 100644
--- a/core/core/api/public_plus_experimental_current.txt
+++ b/core/core/api/public_plus_experimental_current.txt
@@ -240,6 +240,7 @@
     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 androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+    method public static CharSequence? getSettingsText(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);
@@ -271,10 +272,13 @@
     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_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
     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_HISTORIC_MESSAGES = "android.messages.historic";
     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";
@@ -282,6 +286,8 @@
     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_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
     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";
@@ -314,6 +320,7 @@
     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 String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
     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
@@ -488,6 +495,7 @@
     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 setSettingsText(CharSequence?);
     method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
     method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
     method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
@@ -560,11 +568,13 @@
     ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
     ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
     method public void addCompatExtras(android.os.Bundle);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message);
     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!> getHistoricMessages();
     method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
     method public androidx.core.app.Person getUser();
     method @Deprecated public CharSequence? getUserDisplayName();
@@ -1417,7 +1427,7 @@
     field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
   }
 
-  public class MailTo {
+  public final class MailTo {
     method public String? getBcc();
     method public String? getBody();
     method public String? getCc();
diff --git a/core/core/api/restricted_1.5.0-alpha01.txt b/core/core/api/restricted_1.5.0-alpha01.txt
index 6e7096f..f892963 100644
--- a/core/core/api/restricted_1.5.0-alpha01.txt
+++ b/core/core/api/restricted_1.5.0-alpha01.txt
@@ -285,6 +285,7 @@
     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 androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+    method public static CharSequence? getSettingsText(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);
@@ -316,10 +317,13 @@
     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_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
     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_HISTORIC_MESSAGES = "android.messages.historic";
     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";
@@ -327,6 +331,8 @@
     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_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
     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";
@@ -359,6 +365,7 @@
     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 String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
     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
@@ -543,6 +550,7 @@
     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 setSettingsText(CharSequence?);
     method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
     method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
     method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
@@ -620,11 +628,13 @@
   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 androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message);
     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!> getHistoricMessages();
     method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
     method public androidx.core.app.Person getUser();
     method @Deprecated public CharSequence? getUserDisplayName();
@@ -1722,7 +1732,7 @@
   @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 class MailTo {
+  public final class MailTo {
     method public String? getBcc();
     method public String? getBody();
     method public String? getCc();
diff --git a/core/core/api/restricted_current.txt b/core/core/api/restricted_current.txt
index 6e7096f..f892963 100644
--- a/core/core/api/restricted_current.txt
+++ b/core/core/api/restricted_current.txt
@@ -285,6 +285,7 @@
     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 androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+    method public static CharSequence? getSettingsText(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);
@@ -316,10 +317,13 @@
     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_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
     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_HISTORIC_MESSAGES = "android.messages.historic";
     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";
@@ -327,6 +331,8 @@
     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_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
     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";
@@ -359,6 +365,7 @@
     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 String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
     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
@@ -543,6 +550,7 @@
     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 setSettingsText(CharSequence?);
     method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
     method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
     method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
@@ -620,11 +628,13 @@
   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 androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message);
     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!> getHistoricMessages();
     method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
     method public androidx.core.app.Person getUser();
     method @Deprecated public CharSequence? getUserDisplayName();
@@ -1722,7 +1732,7 @@
   @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 class MailTo {
+  public final class MailTo {
     method public String? getBcc();
     method public String? getBody();
     method public String? getCc();
diff --git a/core/core/src/androidTest/java/androidx/core/app/NotificationCompatTest.java b/core/core/src/androidTest/java/androidx/core/app/NotificationCompatTest.java
index 2442b67..0265c81 100644
--- a/core/core/src/androidTest/java/androidx/core/app/NotificationCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/app/NotificationCompatTest.java
@@ -164,6 +164,43 @@
     }
 
     @Test
+    public void testSettingsText() {
+        String settingsText = "testSettingsText";
+        Notification n = new NotificationCompat.Builder(mActivityTestRule.getActivity())
+                .setSettingsText(settingsText)
+                .build();
+        if (Build.VERSION.SDK_INT >= 26) {
+            assertEquals(settingsText, NotificationCompat.getSettingsText(n));
+        } else {
+            assertEquals(null, NotificationCompat.getSettingsText(n));
+        }
+    }
+
+    @Test
+    public void testShowWhen() {
+        // NOTE: It's very difficult to unit test the built notification on JellyBean because
+        // there was no extras field and the only affect is that the RemoteViews object has some
+        // different internal state.  However, this unit test still validates that the
+        // notification is built successfully (without throwing an exception).
+        {
+            Notification n = new NotificationCompat.Builder(mActivityTestRule.getActivity())
+                    .setShowWhen(true)
+                    .build();
+            if (Build.VERSION.SDK_INT >= 19) {
+                assertTrue(n.extras.getBoolean(NotificationCompat.EXTRA_SHOW_WHEN));
+            }
+        }
+        {
+            Notification n = new NotificationCompat.Builder(mActivityTestRule.getActivity())
+                    .setShowWhen(false)
+                    .build();
+            if (Build.VERSION.SDK_INT >= 19) {
+                assertFalse(n.extras.getBoolean(NotificationCompat.EXTRA_SHOW_WHEN));
+            }
+        }
+    }
+
+    @Test
     public void testNotificationChannel() throws Throwable {
         String channelId = "new ID";
         Notification n  = new NotificationCompat.Builder(mActivityTestRule.getActivity())
@@ -838,6 +875,39 @@
         assertTrue(result.get(1).getPerson().isImportant());
     }
 
+    @SdkSuppress(minSdkVersion = 16)
+    @Test
+    public void testMessagingStyle_historicMessage() {
+        NotificationCompat.MessagingStyle messagingStyle =
+                new NotificationCompat.MessagingStyle("self name");
+        Person person = new Person.Builder().setName("test name").setKey("key").build();
+        Person person2 = new Person.Builder()
+                .setName("test name 2").setKey("key 2").setImportant(true).build();
+        messagingStyle.addHistoricMessage(new Message("text", 200, person));
+        messagingStyle.addHistoricMessage(new Message("text2", 300, person2));
+
+        Notification notification = new NotificationCompat.Builder(mContext, "test id")
+                .setSmallIcon(1)
+                .setContentTitle("test title")
+                .setStyle(messagingStyle)
+                .build();
+
+        List<Message> result = NotificationCompat.MessagingStyle
+                .extractMessagingStyleFromNotification(notification)
+                .getHistoricMessages();
+
+        assertEquals(2, result.size());
+        assertEquals("text", result.get(0).getText());
+        assertEquals(200, result.get(0).getTimestamp());
+        assertEquals("test name", result.get(0).getPerson().getName());
+        assertEquals("key", result.get(0).getPerson().getKey());
+        assertEquals("text2", result.get(1).getText());
+        assertEquals(300, result.get(1).getTimestamp());
+        assertEquals("test name 2", result.get(1).getPerson().getName());
+        assertEquals("key 2", result.get(1).getPerson().getKey());
+        assertTrue(result.get(1).getPerson().isImportant());
+    }
+
     @Test
     public void testMessagingStyle_requiresNonEmptyUserName() {
         try {
diff --git a/core/core/src/androidTest/java/androidx/core/view/WindowInsetsCompatActivityTest.kt b/core/core/src/androidTest/java/androidx/core/view/WindowInsetsCompatActivityTest.kt
index 70780d3..e6e4edd 100644
--- a/core/core/src/androidTest/java/androidx/core/view/WindowInsetsCompatActivityTest.kt
+++ b/core/core/src/androidTest/java/androidx/core/view/WindowInsetsCompatActivityTest.kt
@@ -204,6 +204,7 @@
     }
 
     @SdkSuppress(minSdkVersion = 23)
+    @FlakyTest(detail = "IME tests are inherently flaky, but still useful for local testing.")
     @Test
     fun systemBars_rootInsets() {
         // Test do not currently work on Cuttlefish
diff --git a/core/core/src/main/java/androidx/core/app/NotificationCompat.java b/core/core/src/main/java/androidx/core/app/NotificationCompat.java
index cb15b5e..35f094a 100644
--- a/core/core/src/main/java/androidx/core/app/NotificationCompat.java
+++ b/core/core/src/main/java/androidx/core/app/NotificationCompat.java
@@ -81,6 +81,48 @@
 public class NotificationCompat {
 
     /**
+     * An activity that provides a user interface for adjusting notification preferences for its
+     * containing application.
+     */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
+    public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES =
+            "android.intent.category.NOTIFICATION_PREFERENCES";
+
+    /**
+     * Optional extra for {@link #INTENT_CATEGORY_NOTIFICATION_PREFERENCES}. If provided, will
+     * contain a {@link NotificationChannelCompat#getId() channel id} that can be used to narrow
+     * down what settings should be shown in the target app.
+     */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
+    public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
+
+    /**
+     * Optional extra for {@link #INTENT_CATEGORY_NOTIFICATION_PREFERENCES}. If provided, will
+     * contain a {@link NotificationChannelGroupCompat#getId() group id} that can be used to narrow
+     * down what settings should be shown in the target app.
+     */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
+    public static final String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+
+    /**
+     * Optional extra for {@link #INTENT_CATEGORY_NOTIFICATION_PREFERENCES}. If provided, will
+     * contain the tag provided to
+     * {@link NotificationManagerCompat#notify(String, int, Notification)}
+     * that can be used to narrow down what settings should be shown in the target app.
+     */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
+    public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
+
+    /**
+     * Optional extra for {@link #INTENT_CATEGORY_NOTIFICATION_PREFERENCES}. If provided, will
+     * contain the id provided to
+     * {@link NotificationManagerCompat#notify(String, int, Notification)}
+     * that can be used to narrow down what settings should be shown in the target app.
+     */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
+    public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+
+    /**
      * Use all default values (where applicable).
      */
     public static final int DEFAULT_ALL = ~0;
@@ -245,24 +287,28 @@
      * {@link #getExtras extras} key: this is the title of the notification,
      * as supplied to {@link Builder#setContentTitle(CharSequence)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_TITLE = "android.title";
 
     /**
      * {@link #getExtras extras} key: this is the title of the notification when shown in expanded
      * form, e.g. as supplied to {@link BigTextStyle#setBigContentTitle(CharSequence)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_TITLE_BIG = EXTRA_TITLE + ".big";
 
     /**
      * {@link #getExtras extras} key: this is the main text payload, as supplied to
      * {@link Builder#setContentText(CharSequence)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_TEXT = "android.text";
 
     /**
      * {@link #getExtras extras} key: this is a third line of text, as supplied to
      * {@link Builder#setSubText(CharSequence)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_SUB_TEXT = "android.subText";
 
     /**
@@ -279,12 +325,14 @@
      *
      * @see Builder#setRemoteInputHistory(CharSequence[])
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
 
     /**
      * {@link #getExtras extras} key: this is a small piece of additional text as supplied to
      * {@link Builder#setContentInfo(CharSequence)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_INFO_TEXT = "android.infoText";
 
     /**
@@ -292,6 +340,7 @@
      * alongside expanded notifications, as supplied to (e.g.)
      * {@link BigTextStyle#setSummaryText(CharSequence)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
 
     /**
@@ -299,12 +348,14 @@
      * {@link BigTextStyle} notification, as supplied to
      * {@link BigTextStyle#bigText(CharSequence)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_BIG_TEXT = "android.bigText";
 
     /**
      * {@link #getExtras extras} key: this is the resource ID of the notification's main small icon,
      * as supplied to {@link Builder#setSmallIcon(int)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_SMALL_ICON = "android.icon";
 
     /**
@@ -312,6 +363,7 @@
      * showing the notification payload, as
      * supplied to {@link Builder#setLargeIcon(android.graphics.Bitmap)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_LARGE_ICON = "android.largeIcon";
 
     /**
@@ -320,24 +372,28 @@
      * shown in its expanded form, as supplied to
      * {@link BigPictureStyle#bigLargeIcon(android.graphics.Bitmap)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_LARGE_ICON_BIG = EXTRA_LARGE_ICON + ".big";
 
     /**
      * {@link #getExtras extras} key: this is the progress value supplied to
      * {@link Builder#setProgress(int, int, boolean)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_PROGRESS = "android.progress";
 
     /**
      * {@link #getExtras extras} key: this is the maximum value supplied to
      * {@link Builder#setProgress(int, int, boolean)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
 
     /**
      * {@link #getExtras extras} key: whether the progress bar is indeterminate, supplied to
      * {@link Builder#setProgress(int, int, boolean)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
 
     /**
@@ -345,6 +401,7 @@
      * should be shown as a count-up timer (specifically a {@link android.widget.Chronometer})
      * instead of a timestamp, as supplied to {@link Builder#setUsesChronometer(boolean)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
 
     /**
@@ -352,12 +409,14 @@
      * down instead of counting up. Is only relevant if key {@link #EXTRA_SHOW_CHRONOMETER} is
      * present. This extra is a boolean. The default is (@code false).
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
 
     /**
      * {@link #getExtras extras} key: whether the when field set using {@link Builder#setWhen}
      * should be shown, as supplied to {@link Builder#setShowWhen(boolean)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_SHOW_WHEN = "android.showWhen";
 
     /**
@@ -365,6 +424,7 @@
      * expanded notifications, supplied to
      * {@link BigPictureStyle#bigPicture(android.graphics.Bitmap)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_PICTURE = "android.picture";
 
     /**
@@ -372,12 +432,14 @@
      * expanded notifications, each of which was supplied to
      * {@link InboxStyle#addLine(CharSequence)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_TEXT_LINES = "android.textLines";
 
     /**
      * {@link #getExtras extras} key: A string representing the name of the specific
      * {@link android.app.Notification.Style} used to create this notification.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_TEMPLATE = "android.template";
 
     /**
@@ -385,6 +447,7 @@
      * notification relates to, each of which was supplied to
      * {@link Builder#addPerson(String)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_PEOPLE = "android.people";
 
     /**
@@ -396,6 +459,7 @@
      * BitmapFactory.decodeStream}; all other content types will be ignored. The content provider
      * URI used for this purpose must require no permissions to read the image data.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
 
     /**
@@ -403,42 +467,58 @@
      * {@link android.media.session.MediaSession.Token} associated with a
      * {@link android.app.Notification.MediaStyle} notification.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
 
     /**
      * {@link #getExtras extras} key: the indices of actions to be shown in the compact view,
      * as supplied to (e.g.) {@link Notification.MediaStyle#setShowActionsInCompactView(int...)}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
 
     /**
-     * Notification key: the username to be displayed for all messages sent by the user
-     * including direct replies {@link MessagingStyle} notification.
+     * {@link #getExtras extras} key: the username to be displayed for all messages sent by the
+     * user including direct replies {@link MessagingStyle} notification.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
 
     /**
-     * Notification key: the person to display for all messages sent by the user, including direct
-     * replies to {@link MessagingStyle} notifications.
+     * {@link #getExtras extras} key: the person to display for all messages sent by the user,
+     * including direct replies to {@link MessagingStyle} notifications.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
 
     /**
-     * Notification key: a {@link String} to be displayed as the title to a conversation
-     * represented by a {@link MessagingStyle}.
+     * {@link #getExtras extras} key: a {@link String} to be displayed as the title to a
+     * conversation represented by a {@link MessagingStyle}.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
 
     /**
-     * Notification key: an array of {@link Bundle} objects representing
-     * {@link MessagingStyle.Message} objects for a {@link MessagingStyle} notification.
+     * {@link #getExtras extras} key: an array of {@link MessagingStyle.Message}
+     * bundles provided by a {@link android.app.Notification.MessagingStyle} notification.
+     * This extra is a parcelable array of {@link Bundle} objects.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_MESSAGES = "android.messages";
 
     /**
-     * Notification key: whether the {@link NotificationCompat.MessagingStyle} notification
-     * represents a group conversation.
+     * {@link #getExtras extras} key: an array of {@link MessagingStyle#addHistoricMessage historic}
+     * {@link MessagingStyle.Message} bundles provided by a {@link MessagingStyle} notification.
+     * This extra is a parcelable array of {@link Bundle} objects.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
+    public static final String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
+
+    /**
+     * {@link #getExtras extras} key: whether the {@link NotificationCompat.MessagingStyle}
+     * notification represents a group conversation.
+     */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
 
     /**
@@ -446,6 +526,7 @@
      * for conversation titles as SDK < P uses the title to denote group status. This hidden title
      * doesn't appear in the notification shade.
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
 
     /**
@@ -472,6 +553,7 @@
      * }
      * </pre>
      */
+    @SuppressLint("ActionValue")  // Field & value copied from android.app.Notification
     public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
 
     /**
@@ -732,6 +814,7 @@
         boolean mChronometerCountDown;
         Style mStyle;
         CharSequence mSubText;
+        CharSequence mSettingsText;
         CharSequence[] mRemoteInputHistory;
         int mProgressMax;
         int mProgress;
@@ -805,6 +888,9 @@
         /**
          * Set the time that the event occurred.  Notifications in the panel are
          * sorted by this time.
+         *
+         * <p>For apps targeting {@link android.os.Build.VERSION_CODES#N} and above, this time is
+         * not shown anymore by default and must be opted into using {@link #setShowWhen(boolean)}
          */
         public @NonNull Builder setWhen(long when) {
             mNotification.when = when;
@@ -814,6 +900,9 @@
         /**
          * Control whether the timestamp set with {@link #setWhen(long) setWhen} is shown
          * in the content view.
+         *
+         * <p>For apps targeting {@link android.os.Build.VERSION_CODES#N} and above, this
+         * defaults to {@code false}. For earlier apps, the default is {@code true}.
          */
         public @NonNull Builder setShowWhen(boolean show) {
             mShowWhen = show;
@@ -941,6 +1030,25 @@
         }
 
         /**
+         * Provides text that will appear as a link to your application's settings.
+         *
+         * <p>This text does not appear within notification {@link Style templates} but may
+         * appear when the user uses an affordance to learn more about the notification.
+         * Additionally, this text will not appear unless you provide a valid link target by
+         * handling {@link #INTENT_CATEGORY_NOTIFICATION_PREFERENCES}.
+         *
+         * <p>This text is meant to be concise description about what the user can customize
+         * when they click on this link. The recommended maximum length is 40 characters.
+         *
+         * <p>Prior to {@link Build.VERSION_CODES#O} this field has no effect.
+         */
+        @NonNull
+        public Builder setSettingsText(@Nullable CharSequence text) {
+            mSettingsText = limitCharSequenceLength(text);
+            return this;
+        }
+
+        /**
          * Set the remote input history.
          *
          * This should be set to the most recent inputs that have been sent
@@ -2487,6 +2595,7 @@
         public static final int MAXIMUM_RETAINED_MESSAGES = 25;
 
         private final List<Message> mMessages = new ArrayList<>();
+        private final List<Message> mHistoricMessages = new ArrayList<>();
         private Person mUser;
         private @Nullable CharSequence mConversationTitle;
         private @Nullable Boolean mIsGroupConversation;
@@ -2624,6 +2733,27 @@
         }
 
         /**
+         * Adds a {@link Message} for historic context in this notification.
+         *
+         * <p>Messages should be added as historic if they are not the main subject of the
+         * notification but may give context to a conversation. The system may choose to present
+         * them only when relevant, e.g. when replying to a message through a {@link RemoteInput}.
+         *
+         * <p>The messages should be added in chronologic order, i.e. the oldest first,
+         * the newest last.
+         *
+         * @param message The historic {@link Message} to be added
+         * @return this object for method chaining
+         */
+        public @NonNull MessagingStyle addHistoricMessage(@NonNull Message message) {
+            mHistoricMessages.add(message);
+            if (mHistoricMessages.size() > MAXIMUM_RETAINED_MESSAGES) {
+                mHistoricMessages.remove(0);
+            }
+            return this;
+        }
+
+        /**
          * Gets the list of {@code Message} objects that represent the notification
          */
         public @NonNull List<Message> getMessages() {
@@ -2631,6 +2761,13 @@
         }
 
         /**
+         * Gets the list of historic {@code Message}s in the notification.
+         */
+        public @NonNull List<Message> getHistoricMessages() {
+            return mHistoricMessages;
+        }
+
+        /**
          * Sets whether this conversation notification represents a group.
          * @param isGroupConversation {@code true} if the conversation represents a group,
          * {@code false} otherwise.
@@ -2718,6 +2855,16 @@
                     frameworkStyle = new Notification.MessagingStyle(mUser.getName());
                 }
 
+                for (MessagingStyle.Message message : mMessages) {
+                    frameworkStyle.addMessage(message.toAndroidMessage());
+                }
+
+                if (Build.VERSION.SDK_INT >= 26) {
+                    for (MessagingStyle.Message historicMessage : mHistoricMessages) {
+                        frameworkStyle.addHistoricMessage(historicMessage.toAndroidMessage());
+                    }
+                }
+
                 // In SDK < 28, base Android will assume a MessagingStyle notification is a group
                 // chat if the conversation title is set. In compat, this isn't the case as we've
                 // introduced #setGroupConversation. When we apply these settings to base Android
@@ -2734,34 +2881,6 @@
                 if (Build.VERSION.SDK_INT >= 28) {
                     frameworkStyle.setGroupConversation(mIsGroupConversation);
                 }
-
-                for (MessagingStyle.Message compatMessage : mMessages) {
-                    Notification.MessagingStyle.Message frameworkMessage;
-
-                    // Use Person for P and above
-                    if (Build.VERSION.SDK_INT >= 28) {
-                        Person compatMessagePerson = compatMessage.getPerson();
-                        frameworkMessage = new Notification.MessagingStyle.Message(
-                                compatMessage.getText(),
-                                compatMessage.getTimestamp(),
-                                compatMessagePerson == null
-                                        ? null
-                                        : compatMessagePerson.toAndroidPerson());
-                    } else {
-                        CharSequence name = null;
-                        if (compatMessage.getPerson() != null) {
-                            name = compatMessage.getPerson().getName();
-                        }
-                        frameworkMessage = new Notification.MessagingStyle.Message(
-                                compatMessage.getText(), compatMessage.getTimestamp(), name);
-                    }
-
-                    if (compatMessage.getDataMimeType() != null) {
-                        frameworkMessage.setData(
-                                compatMessage.getDataMimeType(), compatMessage.getDataUri());
-                    }
-                    frameworkStyle.addMessage(frameworkMessage);
-                }
                 frameworkStyle.setBuilder(builder.getBuilder());
             } else {
                 MessagingStyle.Message latestIncomingMessage = findLatestIncomingMessage();
@@ -2869,8 +2988,12 @@
                 extras.putCharSequence(EXTRA_CONVERSATION_TITLE, mConversationTitle);
             }
             if (!mMessages.isEmpty()) {
-                extras.putParcelableArray(
-                        EXTRA_MESSAGES, Message.getBundleArrayForMessages(mMessages));
+                extras.putParcelableArray(EXTRA_MESSAGES,
+                        Message.getBundleArrayForMessages(mMessages));
+            }
+            if (!mHistoricMessages.isEmpty()) {
+                extras.putParcelableArray(EXTRA_HISTORIC_MESSAGES,
+                        Message.getBundleArrayForMessages(mHistoricMessages));
             }
             if (mIsGroupConversation != null) {
                 extras.putBoolean(EXTRA_IS_GROUP_CONVERSATION, mIsGroupConversation);
@@ -2899,9 +3022,13 @@
             if (mConversationTitle == null) {
                 mConversationTitle = extras.getCharSequence(EXTRA_HIDDEN_CONVERSATION_TITLE);
             }
-            Parcelable[] parcelables = extras.getParcelableArray(EXTRA_MESSAGES);
-            if (parcelables != null) {
-                mMessages.addAll(Message.getMessagesFromBundleArray(parcelables));
+            Parcelable[] messages = extras.getParcelableArray(EXTRA_MESSAGES);
+            if (messages != null) {
+                mMessages.addAll(Message.getMessagesFromBundleArray(messages));
+            }
+            Parcelable[] historicMessages = extras.getParcelableArray(EXTRA_HISTORIC_MESSAGES);
+            if (historicMessages != null) {
+                mHistoricMessages.addAll(Message.getMessagesFromBundleArray(historicMessages));
             }
             if (extras.containsKey(EXTRA_IS_GROUP_CONVERSATION)) {
                 mIsGroupConversation = extras.getBoolean(EXTRA_IS_GROUP_CONVERSATION);
@@ -3144,6 +3271,34 @@
                     return null;
                 }
             }
+
+            /**
+             * Converts this compat {@link Message} to the base Android framework
+             * {@link android.app.Notification.MessagingStyle.Message}.
+             * @hide
+             */
+            @RestrictTo(LIBRARY_GROUP_PREFIX)
+            @NonNull
+            @RequiresApi(24)
+            Notification.MessagingStyle.Message toAndroidMessage() {
+                Notification.MessagingStyle.Message frameworkMessage;
+                Person person = getPerson();
+                // Use Person for P and above
+                if (Build.VERSION.SDK_INT >= 28) {
+                    frameworkMessage = new Notification.MessagingStyle.Message(
+                            getText(), getTimestamp(),
+                            person == null ? null : person.toAndroidPerson());
+                } else {
+                    frameworkMessage = new Notification.MessagingStyle.Message(
+                            getText(), getTimestamp(),
+                            person == null ? null : person.getName());
+                }
+
+                if (getDataMimeType() != null) {
+                    frameworkMessage.setData(getDataMimeType(), getDataUri());
+                }
+                return frameworkMessage;
+            }
         }
     }
 
@@ -6275,6 +6430,17 @@
     }
 
     /**
+     * Returns the settings text provided to {@link Builder#setSettingsText(CharSequence)}.
+     */
+    public static @Nullable CharSequence getSettingsText(@NonNull Notification notification) {
+        if (Build.VERSION.SDK_INT >= 26) {
+            return notification.getSettingsText();
+        } else {
+            return null;
+        }
+    }
+
+    /**
      * Gets the {@link LocusIdCompat} associated with this notification.
      *
      * <p>Used by the Android system to correlate objects (such as
diff --git a/core/core/src/main/java/androidx/core/app/NotificationCompatBuilder.java b/core/core/src/main/java/androidx/core/app/NotificationCompatBuilder.java
index 35f062e..72c6190 100644
--- a/core/core/src/main/java/androidx/core/app/NotificationCompatBuilder.java
+++ b/core/core/src/main/java/androidx/core/app/NotificationCompatBuilder.java
@@ -126,9 +126,10 @@
             mContentView = b.mContentView;
             mBigContentView = b.mBigContentView;
         }
-        if (Build.VERSION.SDK_INT >= 19) {
+        if (Build.VERSION.SDK_INT >= 17) {
             mBuilder.setShowWhen(b.mShowWhen);
-
+        }
+        if (Build.VERSION.SDK_INT >= 19) {
             if (Build.VERSION.SDK_INT < 21) {
                 final List<String> people = combineLists(getPeople(b.mPersonList), b.mPeople);
                 if (people != null && !people.isEmpty()) {
@@ -210,6 +211,7 @@
         }
         if (Build.VERSION.SDK_INT >= 26) {
             mBuilder.setBadgeIconType(b.mBadgeIcon)
+                    .setSettingsText(b.mSettingsText)
                     .setShortcutId(b.mShortcutId)
                     .setTimeoutAfter(b.mTimeout)
                     .setGroupAlertBehavior(b.mGroupAlertBehavior);
diff --git a/core/core/src/main/java/androidx/core/net/MailTo.java b/core/core/src/main/java/androidx/core/net/MailTo.java
index c941f5d..758ba47 100644
--- a/core/core/src/main/java/androidx/core/net/MailTo.java
+++ b/core/core/src/main/java/androidx/core/net/MailTo.java
@@ -32,7 +32,7 @@
  * <p>This class parses a mailto scheme URI and then can be queried for the parsed parameters.
  * This implements RFC 6068.
  */
-public class MailTo {
+public final class MailTo {
     public static final String MAILTO_SCHEME = "mailto:";
 
     // Well known headers
diff --git a/hilt/hilt-common/api/1.0.0-alpha02.txt b/hilt/hilt-common/api/1.0.0-alpha02.txt
new file mode 100644
index 0000000..0cca321
--- /dev/null
+++ b/hilt/hilt-common/api/1.0.0-alpha02.txt
@@ -0,0 +1,22 @@
+// Signature format: 3.0
+package androidx.hilt {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.PARAMETER) public @interface Assisted {
+  }
+
+}
+
+package androidx.hilt.lifecycle {
+
+  @dagger.hilt.GeneratesRootInput @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.CONSTRUCTOR) public @interface ViewModelInject {
+  }
+
+}
+
+package androidx.hilt.work {
+
+  @dagger.hilt.GeneratesRootInput @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.CONSTRUCTOR) public @interface WorkerInject {
+  }
+
+}
+
diff --git a/hilt/hilt-common/api/current.txt b/hilt/hilt-common/api/current.txt
new file mode 100644
index 0000000..0cca321
--- /dev/null
+++ b/hilt/hilt-common/api/current.txt
@@ -0,0 +1,22 @@
+// Signature format: 3.0
+package androidx.hilt {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.PARAMETER) public @interface Assisted {
+  }
+
+}
+
+package androidx.hilt.lifecycle {
+
+  @dagger.hilt.GeneratesRootInput @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.CONSTRUCTOR) public @interface ViewModelInject {
+  }
+
+}
+
+package androidx.hilt.work {
+
+  @dagger.hilt.GeneratesRootInput @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.CONSTRUCTOR) public @interface WorkerInject {
+  }
+
+}
+
diff --git a/hilt/hilt-common/api/public_plus_experimental_1.0.0-alpha02.txt b/hilt/hilt-common/api/public_plus_experimental_1.0.0-alpha02.txt
new file mode 100644
index 0000000..0cca321
--- /dev/null
+++ b/hilt/hilt-common/api/public_plus_experimental_1.0.0-alpha02.txt
@@ -0,0 +1,22 @@
+// Signature format: 3.0
+package androidx.hilt {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.PARAMETER) public @interface Assisted {
+  }
+
+}
+
+package androidx.hilt.lifecycle {
+
+  @dagger.hilt.GeneratesRootInput @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.CONSTRUCTOR) public @interface ViewModelInject {
+  }
+
+}
+
+package androidx.hilt.work {
+
+  @dagger.hilt.GeneratesRootInput @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.CONSTRUCTOR) public @interface WorkerInject {
+  }
+
+}
+
diff --git a/hilt/hilt-common/api/public_plus_experimental_current.txt b/hilt/hilt-common/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..0cca321
--- /dev/null
+++ b/hilt/hilt-common/api/public_plus_experimental_current.txt
@@ -0,0 +1,22 @@
+// Signature format: 3.0
+package androidx.hilt {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.PARAMETER) public @interface Assisted {
+  }
+
+}
+
+package androidx.hilt.lifecycle {
+
+  @dagger.hilt.GeneratesRootInput @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.CONSTRUCTOR) public @interface ViewModelInject {
+  }
+
+}
+
+package androidx.hilt.work {
+
+  @dagger.hilt.GeneratesRootInput @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.CONSTRUCTOR) public @interface WorkerInject {
+  }
+
+}
+
diff --git a/hilt/hilt-common/api/res-1.0.0-alpha02.txt b/hilt/hilt-common/api/res-1.0.0-alpha02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/hilt/hilt-common/api/res-1.0.0-alpha02.txt
diff --git a/hilt/hilt-common/api/res-current.txt b/hilt/hilt-common/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/hilt/hilt-common/api/res-current.txt
diff --git a/hilt/hilt-common/api/restricted_1.0.0-alpha02.txt b/hilt/hilt-common/api/restricted_1.0.0-alpha02.txt
new file mode 100644
index 0000000..0cca321
--- /dev/null
+++ b/hilt/hilt-common/api/restricted_1.0.0-alpha02.txt
@@ -0,0 +1,22 @@
+// Signature format: 3.0
+package androidx.hilt {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.PARAMETER) public @interface Assisted {
+  }
+
+}
+
+package androidx.hilt.lifecycle {
+
+  @dagger.hilt.GeneratesRootInput @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.CONSTRUCTOR) public @interface ViewModelInject {
+  }
+
+}
+
+package androidx.hilt.work {
+
+  @dagger.hilt.GeneratesRootInput @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.CONSTRUCTOR) public @interface WorkerInject {
+  }
+
+}
+
diff --git a/hilt/hilt-common/api/restricted_current.txt b/hilt/hilt-common/api/restricted_current.txt
new file mode 100644
index 0000000..0cca321
--- /dev/null
+++ b/hilt/hilt-common/api/restricted_current.txt
@@ -0,0 +1,22 @@
+// Signature format: 3.0
+package androidx.hilt {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.PARAMETER) public @interface Assisted {
+  }
+
+}
+
+package androidx.hilt.lifecycle {
+
+  @dagger.hilt.GeneratesRootInput @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.CONSTRUCTOR) public @interface ViewModelInject {
+  }
+
+}
+
+package androidx.hilt.work {
+
+  @dagger.hilt.GeneratesRootInput @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.CONSTRUCTOR) public @interface WorkerInject {
+  }
+
+}
+
diff --git a/hilt/hilt-lifecycle-viewmodel/api/1.0.0-alpha02.txt b/hilt/hilt-lifecycle-viewmodel/api/1.0.0-alpha02.txt
new file mode 100644
index 0000000..3b419e4
--- /dev/null
+++ b/hilt/hilt-lifecycle-viewmodel/api/1.0.0-alpha02.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.hilt.lifecycle {
+
+  public final class HiltViewModelFactory extends androidx.lifecycle.AbstractSavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    method protected <T extends androidx.lifecycle.ViewModel> T create(String, Class<T!>, androidx.lifecycle.SavedStateHandle);
+  }
+
+}
+
diff --git a/hilt/hilt-lifecycle-viewmodel/api/current.txt b/hilt/hilt-lifecycle-viewmodel/api/current.txt
new file mode 100644
index 0000000..3b419e4
--- /dev/null
+++ b/hilt/hilt-lifecycle-viewmodel/api/current.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.hilt.lifecycle {
+
+  public final class HiltViewModelFactory extends androidx.lifecycle.AbstractSavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    method protected <T extends androidx.lifecycle.ViewModel> T create(String, Class<T!>, androidx.lifecycle.SavedStateHandle);
+  }
+
+}
+
diff --git a/hilt/hilt-lifecycle-viewmodel/api/public_plus_experimental_1.0.0-alpha02.txt b/hilt/hilt-lifecycle-viewmodel/api/public_plus_experimental_1.0.0-alpha02.txt
new file mode 100644
index 0000000..3b419e4
--- /dev/null
+++ b/hilt/hilt-lifecycle-viewmodel/api/public_plus_experimental_1.0.0-alpha02.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.hilt.lifecycle {
+
+  public final class HiltViewModelFactory extends androidx.lifecycle.AbstractSavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    method protected <T extends androidx.lifecycle.ViewModel> T create(String, Class<T!>, androidx.lifecycle.SavedStateHandle);
+  }
+
+}
+
diff --git a/hilt/hilt-lifecycle-viewmodel/api/public_plus_experimental_current.txt b/hilt/hilt-lifecycle-viewmodel/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..3b419e4
--- /dev/null
+++ b/hilt/hilt-lifecycle-viewmodel/api/public_plus_experimental_current.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.hilt.lifecycle {
+
+  public final class HiltViewModelFactory extends androidx.lifecycle.AbstractSavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    method protected <T extends androidx.lifecycle.ViewModel> T create(String, Class<T!>, androidx.lifecycle.SavedStateHandle);
+  }
+
+}
+
diff --git a/hilt/hilt-lifecycle-viewmodel/api/res-1.0.0-alpha02.txt b/hilt/hilt-lifecycle-viewmodel/api/res-1.0.0-alpha02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/hilt/hilt-lifecycle-viewmodel/api/res-1.0.0-alpha02.txt
diff --git a/hilt/hilt-lifecycle-viewmodel/api/res-current.txt b/hilt/hilt-lifecycle-viewmodel/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/hilt/hilt-lifecycle-viewmodel/api/res-current.txt
diff --git a/hilt/hilt-lifecycle-viewmodel/api/restricted_1.0.0-alpha02.txt b/hilt/hilt-lifecycle-viewmodel/api/restricted_1.0.0-alpha02.txt
new file mode 100644
index 0000000..560a3c0
--- /dev/null
+++ b/hilt/hilt-lifecycle-viewmodel/api/restricted_1.0.0-alpha02.txt
@@ -0,0 +1,23 @@
+// Signature format: 3.0
+package androidx.hilt.lifecycle {
+
+  public final class HiltViewModelFactory extends androidx.lifecycle.AbstractSavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    method protected <T extends androidx.lifecycle.ViewModel> T create(String, Class<T!>, androidx.lifecycle.SavedStateHandle);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface ViewModelAssistedFactory<T extends androidx.lifecycle.ViewModel> {
+    method public T create(androidx.lifecycle.SavedStateHandle);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ViewModelFactoryModules {
+  }
+
+  @dagger.Module @dagger.hilt.InstallIn(ActivityComponent.class) public abstract static class ViewModelFactoryModules.ActivityModule {
+    ctor public ViewModelFactoryModules.ActivityModule();
+  }
+
+  @dagger.Module @dagger.hilt.InstallIn(FragmentComponent.class) public static final class ViewModelFactoryModules.FragmentModule {
+  }
+
+}
+
diff --git a/hilt/hilt-lifecycle-viewmodel/api/restricted_current.txt b/hilt/hilt-lifecycle-viewmodel/api/restricted_current.txt
new file mode 100644
index 0000000..560a3c0
--- /dev/null
+++ b/hilt/hilt-lifecycle-viewmodel/api/restricted_current.txt
@@ -0,0 +1,23 @@
+// Signature format: 3.0
+package androidx.hilt.lifecycle {
+
+  public final class HiltViewModelFactory extends androidx.lifecycle.AbstractSavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    method protected <T extends androidx.lifecycle.ViewModel> T create(String, Class<T!>, androidx.lifecycle.SavedStateHandle);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface ViewModelAssistedFactory<T extends androidx.lifecycle.ViewModel> {
+    method public T create(androidx.lifecycle.SavedStateHandle);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ViewModelFactoryModules {
+  }
+
+  @dagger.Module @dagger.hilt.InstallIn(ActivityComponent.class) public abstract static class ViewModelFactoryModules.ActivityModule {
+    ctor public ViewModelFactoryModules.ActivityModule();
+  }
+
+  @dagger.Module @dagger.hilt.InstallIn(FragmentComponent.class) public static final class ViewModelFactoryModules.FragmentModule {
+  }
+
+}
+
diff --git a/hilt/hilt-lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/HiltViewModelFactory.java b/hilt/hilt-lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/HiltViewModelFactory.java
index 86398c0..2a266a3 100644
--- a/hilt/hilt-lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/HiltViewModelFactory.java
+++ b/hilt/hilt-lifecycle-viewmodel/src/main/java/androidx/hilt/lifecycle/HiltViewModelFactory.java
@@ -20,6 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
 import androidx.lifecycle.AbstractSavedStateViewModelFactory;
 import androidx.lifecycle.SavedStateHandle;
 import androidx.lifecycle.SavedStateViewModelFactory;
@@ -47,6 +48,8 @@
     private final Map<String,
             Provider<ViewModelAssistedFactory<? extends ViewModel>>> mViewModelFactories;
 
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
     HiltViewModelFactory(
             @NonNull SavedStateRegistryOwner owner,
             @Nullable Bundle defaultArgs,
diff --git a/hilt/hilt-work/api/1.0.0-alpha02.txt b/hilt/hilt-work/api/1.0.0-alpha02.txt
new file mode 100644
index 0000000..9f9ddd8
--- /dev/null
+++ b/hilt/hilt-work/api/1.0.0-alpha02.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.hilt.work {
+
+  public final class HiltWorkerFactory extends androidx.work.WorkerFactory {
+    method public androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+  }
+
+}
+
diff --git a/hilt/hilt-work/api/current.txt b/hilt/hilt-work/api/current.txt
new file mode 100644
index 0000000..9f9ddd8
--- /dev/null
+++ b/hilt/hilt-work/api/current.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.hilt.work {
+
+  public final class HiltWorkerFactory extends androidx.work.WorkerFactory {
+    method public androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+  }
+
+}
+
diff --git a/hilt/hilt-work/api/public_plus_experimental_1.0.0-alpha02.txt b/hilt/hilt-work/api/public_plus_experimental_1.0.0-alpha02.txt
new file mode 100644
index 0000000..9f9ddd8
--- /dev/null
+++ b/hilt/hilt-work/api/public_plus_experimental_1.0.0-alpha02.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.hilt.work {
+
+  public final class HiltWorkerFactory extends androidx.work.WorkerFactory {
+    method public androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+  }
+
+}
+
diff --git a/hilt/hilt-work/api/public_plus_experimental_current.txt b/hilt/hilt-work/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..9f9ddd8
--- /dev/null
+++ b/hilt/hilt-work/api/public_plus_experimental_current.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.hilt.work {
+
+  public final class HiltWorkerFactory extends androidx.work.WorkerFactory {
+    method public androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+  }
+
+}
+
diff --git a/hilt/hilt-work/api/res-1.0.0-alpha02.txt b/hilt/hilt-work/api/res-1.0.0-alpha02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/hilt/hilt-work/api/res-1.0.0-alpha02.txt
diff --git a/hilt/hilt-work/api/res-current.txt b/hilt/hilt-work/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/hilt/hilt-work/api/res-current.txt
diff --git a/hilt/hilt-work/api/restricted_1.0.0-alpha02.txt b/hilt/hilt-work/api/restricted_1.0.0-alpha02.txt
new file mode 100644
index 0000000..7ae0e1f
--- /dev/null
+++ b/hilt/hilt-work/api/restricted_1.0.0-alpha02.txt
@@ -0,0 +1,17 @@
+// Signature format: 3.0
+package androidx.hilt.work {
+
+  public final class HiltWorkerFactory extends androidx.work.WorkerFactory {
+    method public androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface WorkerAssistedFactory<T extends androidx.work.ListenableWorker> {
+    method public T create(android.content.Context, androidx.work.WorkerParameters);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @dagger.Module @dagger.hilt.InstallIn(ApplicationComponent.class) public abstract class WorkerFactoryModule {
+    ctor public WorkerFactoryModule();
+  }
+
+}
+
diff --git a/hilt/hilt-work/api/restricted_current.txt b/hilt/hilt-work/api/restricted_current.txt
new file mode 100644
index 0000000..7ae0e1f
--- /dev/null
+++ b/hilt/hilt-work/api/restricted_current.txt
@@ -0,0 +1,17 @@
+// Signature format: 3.0
+package androidx.hilt.work {
+
+  public final class HiltWorkerFactory extends androidx.work.WorkerFactory {
+    method public androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface WorkerAssistedFactory<T extends androidx.work.ListenableWorker> {
+    method public T create(android.content.Context, androidx.work.WorkerParameters);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @dagger.Module @dagger.hilt.InstallIn(ApplicationComponent.class) public abstract class WorkerFactoryModule {
+    ctor public WorkerFactoryModule();
+  }
+
+}
+
diff --git a/hilt/hilt-work/src/main/java/androidx/hilt/work/HiltWorkerFactory.java b/hilt/hilt-work/src/main/java/androidx/hilt/work/HiltWorkerFactory.java
index 6df7b6d..732dbec 100644
--- a/hilt/hilt-work/src/main/java/androidx/hilt/work/HiltWorkerFactory.java
+++ b/hilt/hilt-work/src/main/java/androidx/hilt/work/HiltWorkerFactory.java
@@ -20,6 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
 import androidx.work.ListenableWorker;
 import androidx.work.WorkerParameters;
 
@@ -38,7 +39,9 @@
     private final Map<String,
             Provider<WorkerAssistedFactory<? extends ListenableWorker>>> mWorkerFactories;
 
-    public HiltWorkerFactory(@NonNull Map<String,
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    HiltWorkerFactory(@NonNull Map<String,
             Provider<WorkerAssistedFactory<? extends ListenableWorker>>> workerFactories) {
         mWorkerFactories = workerFactories;
     }
diff --git a/paging/common/api/3.0.0-alpha04.txt b/paging/common/api/3.0.0-alpha04.txt
new file mode 100644
index 0000000..80803ed
--- /dev/null
+++ b/paging/common/api/3.0.0-alpha04.txt
@@ -0,0 +1,452 @@
+// Signature format: 3.0
+package androidx.paging {
+
+  public final class CachedPagingDataKt {
+    method @CheckResult public static <T> kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>> cachedIn(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+  }
+
+  public final class CancelableChannelFlowKt {
+  }
+
+  public final class CombinedLoadStates {
+    ctor public CombinedLoadStates(androidx.paging.LoadStates source, androidx.paging.LoadStates? mediator);
+    method public androidx.paging.LoadStates component1();
+    method public androidx.paging.LoadStates? component2();
+    method public androidx.paging.CombinedLoadStates copy(androidx.paging.LoadStates source, androidx.paging.LoadStates? mediator);
+    method public androidx.paging.LoadState getAppend();
+    method public androidx.paging.LoadStates? getMediator();
+    method public androidx.paging.LoadState getPrepend();
+    method public androidx.paging.LoadState getRefresh();
+    method public androidx.paging.LoadStates getSource();
+    property public final androidx.paging.LoadState append;
+    property public final androidx.paging.LoadState prepend;
+    property public final androidx.paging.LoadState refresh;
+  }
+
+  public abstract class DataSource<Key, Value> {
+    method @AnyThread public void addInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
+    method @AnyThread public final void addInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
+    method @AnyThread public void invalidate();
+    method @WorkerThread public boolean isInvalid();
+    method public <ToValue> androidx.paging.DataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method public <ToValue> androidx.paging.DataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @AnyThread public void removeInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
+    method @AnyThread public final void removeInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
+    property @WorkerThread public boolean isInvalid;
+  }
+
+  public abstract static class DataSource.Factory<Key, Value> {
+    ctor public DataSource.Factory();
+    method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory(kotlinx.coroutines.CoroutineDispatcher fetchDispatcher = Dispatchers.IO);
+    method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory();
+    method public abstract androidx.paging.DataSource<Key,Value> create();
+    method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+  }
+
+  public static interface DataSource.InvalidatedCallback {
+    method @AnyThread public void onInvalidated();
+  }
+
+  @kotlin.RequiresOptIn public @interface ExperimentalPagingApi {
+  }
+
+  @Deprecated public abstract class ItemKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
+    ctor @Deprecated public ItemKeyedDataSource();
+    method @Deprecated public abstract Key getKey(Value item);
+    method @Deprecated public abstract void loadAfter(androidx.paging.ItemKeyedDataSource.LoadParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadCallback<Value> callback);
+    method @Deprecated public abstract void loadBefore(androidx.paging.ItemKeyedDataSource.LoadParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadCallback<Value> callback);
+    method @Deprecated public abstract void loadInitial(androidx.paging.ItemKeyedDataSource.LoadInitialParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadInitialCallback<Value> callback);
+    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
+    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
+  }
+
+  @Deprecated public abstract static class ItemKeyedDataSource.LoadCallback<Value> {
+    ctor @Deprecated public ItemKeyedDataSource.LoadCallback();
+    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data);
+  }
+
+  @Deprecated public abstract static class ItemKeyedDataSource.LoadInitialCallback<Value> extends androidx.paging.ItemKeyedDataSource.LoadCallback<Value> {
+    ctor @Deprecated public ItemKeyedDataSource.LoadInitialCallback();
+    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, int position, int totalCount);
+  }
+
+  @Deprecated public static class ItemKeyedDataSource.LoadInitialParams<Key> {
+    ctor @Deprecated public ItemKeyedDataSource.LoadInitialParams(Key? requestedInitialKey, int requestedLoadSize, boolean placeholdersEnabled);
+    field @Deprecated public final boolean placeholdersEnabled;
+    field @Deprecated public final Key? requestedInitialKey;
+    field @Deprecated public final int requestedLoadSize;
+  }
+
+  @Deprecated public static class ItemKeyedDataSource.LoadParams<Key> {
+    ctor @Deprecated public ItemKeyedDataSource.LoadParams(Key key, int requestedLoadSize);
+    field @Deprecated public final Key key;
+    field @Deprecated public final int requestedLoadSize;
+  }
+
+  public abstract sealed class LoadState {
+    method public final boolean getEndOfPaginationReached();
+  }
+
+  public static final class LoadState.Error extends androidx.paging.LoadState {
+    ctor public LoadState.Error(Throwable error);
+    method public Throwable getError();
+  }
+
+  public static final class LoadState.Loading extends androidx.paging.LoadState {
+    field public static final androidx.paging.LoadState.Loading INSTANCE;
+  }
+
+  public static final class LoadState.NotLoading extends androidx.paging.LoadState {
+    ctor public LoadState.NotLoading(boolean endOfPaginationReached);
+  }
+
+  public final class LoadStates {
+    ctor public LoadStates(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append);
+    method public androidx.paging.LoadState component1();
+    method public androidx.paging.LoadState component2();
+    method public androidx.paging.LoadState component3();
+    method public androidx.paging.LoadStates copy(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append);
+    method public androidx.paging.LoadState getAppend();
+    method public androidx.paging.LoadState getPrepend();
+    method public androidx.paging.LoadState getRefresh();
+  }
+
+  public enum LoadType {
+    method public static androidx.paging.LoadType valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.paging.LoadType[] values();
+    enum_constant public static final androidx.paging.LoadType APPEND;
+    enum_constant public static final androidx.paging.LoadType PREPEND;
+    enum_constant public static final androidx.paging.LoadType REFRESH;
+  }
+
+  public final class PageEventKt {
+  }
+
+  @Deprecated public abstract class PageKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
+    ctor @Deprecated public PageKeyedDataSource();
+    method @Deprecated public abstract void loadAfter(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
+    method @Deprecated public abstract void loadBefore(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
+    method @Deprecated public abstract void loadInitial(androidx.paging.PageKeyedDataSource.LoadInitialParams<Key> params, androidx.paging.PageKeyedDataSource.LoadInitialCallback<Key,Value> callback);
+    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
+    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
+  }
+
+  @Deprecated public abstract static class PageKeyedDataSource.LoadCallback<Key, Value> {
+    ctor @Deprecated public PageKeyedDataSource.LoadCallback();
+    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, Key? adjacentPageKey);
+  }
+
+  @Deprecated public abstract static class PageKeyedDataSource.LoadInitialCallback<Key, Value> {
+    ctor @Deprecated public PageKeyedDataSource.LoadInitialCallback();
+    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, int position, int totalCount, Key? previousPageKey, Key? nextPageKey);
+    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, Key? previousPageKey, Key? nextPageKey);
+  }
+
+  @Deprecated public static class PageKeyedDataSource.LoadInitialParams<Key> {
+    ctor @Deprecated public PageKeyedDataSource.LoadInitialParams(int requestedLoadSize, boolean placeholdersEnabled);
+    field @Deprecated public final boolean placeholdersEnabled;
+    field @Deprecated public final int requestedLoadSize;
+  }
+
+  @Deprecated public static class PageKeyedDataSource.LoadParams<Key> {
+    ctor @Deprecated public PageKeyedDataSource.LoadParams(Key key, int requestedLoadSize);
+    field @Deprecated public final Key key;
+    field @Deprecated public final int requestedLoadSize;
+  }
+
+  @Deprecated public abstract class PagedList<T> extends java.util.AbstractList<T> {
+    method @Deprecated public final void addWeakCallback(java.util.List<? extends T>? previousSnapshot, androidx.paging.PagedList.Callback callback);
+    method @Deprecated public final void addWeakCallback(androidx.paging.PagedList.Callback callback);
+    method @Deprecated public final void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+    method @Deprecated public abstract void detach();
+    method @Deprecated public T? get(int index);
+    method @Deprecated public final androidx.paging.PagedList.Config getConfig();
+    method @Deprecated public final androidx.paging.DataSource<?,T> getDataSource();
+    method @Deprecated public abstract Object? getLastKey();
+    method @Deprecated public final int getLoadedCount();
+    method @Deprecated public final int getPositionOffset();
+    method @Deprecated public int getSize();
+    method @Deprecated public abstract boolean isDetached();
+    method @Deprecated public boolean isImmutable();
+    method @Deprecated public final void loadAround(int index);
+    method @Deprecated public final void removeWeakCallback(androidx.paging.PagedList.Callback callback);
+    method @Deprecated public final void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+    method @Deprecated public void retry();
+    method @Deprecated public final java.util.List<T> snapshot();
+    property @Deprecated public final androidx.paging.DataSource<?,T> dataSource;
+    property public abstract boolean isDetached;
+    property public boolean isImmutable;
+    property public abstract Object? lastKey;
+    property public final int loadedCount;
+    property public final int positionOffset;
+    property public int size;
+  }
+
+  @Deprecated @MainThread public abstract static class PagedList.BoundaryCallback<T> {
+    ctor @Deprecated public PagedList.BoundaryCallback();
+    method @Deprecated public void onItemAtEndLoaded(T itemAtEnd);
+    method @Deprecated public void onItemAtFrontLoaded(T itemAtFront);
+    method @Deprecated public void onZeroItemsLoaded();
+  }
+
+  @Deprecated public static final class PagedList.Builder<Key, Value> {
+    ctor @Deprecated public PagedList.Builder(androidx.paging.DataSource<Key,Value> dataSource, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public PagedList.Builder(androidx.paging.DataSource<Key,Value> dataSource, int pageSize);
+    ctor @Deprecated public PagedList.Builder(androidx.paging.PagingSource<Key,Value> pagingSource, androidx.paging.PagingSource.LoadResult.Page<Key,Value> initialPage, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public PagedList.Builder(androidx.paging.PagingSource<Key,Value> pagingSource, androidx.paging.PagingSource.LoadResult.Page<Key,Value> initialPage, int pageSize);
+    method @Deprecated public androidx.paging.PagedList<Value> build();
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setCoroutineScope(kotlinx.coroutines.CoroutineScope coroutineScope);
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setFetchDispatcher(kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setFetchExecutor(java.util.concurrent.Executor fetchExecutor);
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setInitialKey(Key? initialKey);
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setNotifyDispatcher(kotlinx.coroutines.CoroutineDispatcher notifyDispatcher);
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setNotifyExecutor(java.util.concurrent.Executor notifyExecutor);
+  }
+
+  @Deprecated public abstract static class PagedList.Callback {
+    ctor @Deprecated public PagedList.Callback();
+    method @Deprecated public abstract void onChanged(int position, int count);
+    method @Deprecated public abstract void onInserted(int position, int count);
+    method @Deprecated public abstract void onRemoved(int position, int count);
+  }
+
+  @Deprecated public static final class PagedList.Config {
+    field @Deprecated public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
+    field @Deprecated public final boolean enablePlaceholders;
+    field @Deprecated public final int initialLoadSizeHint;
+    field @Deprecated public final int maxSize;
+    field @Deprecated public final int pageSize;
+    field @Deprecated public final int prefetchDistance;
+  }
+
+  @Deprecated public static final class PagedList.Config.Builder {
+    ctor @Deprecated public PagedList.Config.Builder();
+    method @Deprecated public androidx.paging.PagedList.Config build();
+    method @Deprecated public androidx.paging.PagedList.Config.Builder setEnablePlaceholders(boolean enablePlaceholders);
+    method @Deprecated public androidx.paging.PagedList.Config.Builder setInitialLoadSizeHint(@IntRange(from=1) int initialLoadSizeHint);
+    method @Deprecated public androidx.paging.PagedList.Config.Builder setMaxSize(@IntRange(from=2) int maxSize);
+    method @Deprecated public androidx.paging.PagedList.Config.Builder setPageSize(@IntRange(from=1) int pageSize);
+    method @Deprecated public androidx.paging.PagedList.Config.Builder setPrefetchDistance(@IntRange(from=0) int prefetchDistance);
+  }
+
+  public final class PagedListConfigKt {
+  }
+
+  public final class PagedListKt {
+  }
+
+  public final class Pager<Key, Value> {
+    ctor public Pager(androidx.paging.PagingConfig config, Key? initialKey, androidx.paging.RemoteMediator<Key,Value>? remoteMediator, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+    ctor public Pager(androidx.paging.PagingConfig config, Key? initialKey, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+    ctor public Pager(androidx.paging.PagingConfig config, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+    method public kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>> getFlow();
+    property public final kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>> flow;
+  }
+
+  public final class PagingConfig {
+    ctor public PagingConfig(int pageSize, @IntRange(from=null) int prefetchDistance, boolean enablePlaceholders, @IntRange(from=null) int initialLoadSize, @IntRange(from=null) int maxSize, int jumpThreshold);
+    ctor public PagingConfig(int pageSize, @IntRange(from=null) int prefetchDistance, boolean enablePlaceholders, @IntRange(from=null) int initialLoadSize, @IntRange(from=null) int maxSize);
+    ctor public PagingConfig(int pageSize, @IntRange(from=null) int prefetchDistance, boolean enablePlaceholders, @IntRange(from=null) int initialLoadSize);
+    ctor public PagingConfig(int pageSize, @IntRange(from=null) int prefetchDistance, boolean enablePlaceholders);
+    ctor public PagingConfig(int pageSize, @IntRange(from=null) int prefetchDistance);
+    ctor public PagingConfig(int pageSize);
+    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;
+  }
+
+  public static final class PagingConfig.Companion {
+  }
+
+  public final class PagingData<T> {
+    method public static <T> androidx.paging.PagingData<T> empty();
+    method @CheckResult public androidx.paging.PagingData<T> filter(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method @CheckResult public <R> androidx.paging.PagingData<R> flatMap(kotlin.jvm.functions.Function1<? super T,? extends java.lang.Iterable<? extends R>> transform);
+    method @CheckResult public androidx.paging.PagingData<T> insertFooterItem(T item);
+    method @CheckResult public androidx.paging.PagingData<T> insertHeaderItem(T item);
+    method @CheckResult public static <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T> pagingData, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
+    method @CheckResult public <R> androidx.paging.PagingData<R> map(kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    field public static final androidx.paging.PagingData.Companion Companion;
+  }
+
+  public static final class PagingData.Companion {
+    method public <T> androidx.paging.PagingData<T> empty();
+    method @CheckResult public <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T> pagingData, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
+  }
+
+  public final class PagingDataKt {
+  }
+
+  public abstract class PagingSource<Key, Value> {
+    ctor public PagingSource();
+    method public final boolean getInvalid();
+    method public boolean getJumpingSupported();
+    method public boolean getKeyReuseSupported();
+    method @androidx.paging.ExperimentalPagingApi 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;
+    property public boolean keyReuseSupported;
+  }
+
+  public abstract static sealed class PagingSource.LoadParams<Key> {
+    method public abstract Key? getKey();
+    method public final int getLoadSize();
+    method @Deprecated public final int getPageSize();
+    method public final boolean getPlaceholdersEnabled();
+    property public abstract Key? key;
+  }
+
+  public static final class PagingSource.LoadParams.Append<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
+    ctor public PagingSource.LoadParams.Append(Key key, int loadSize, boolean placeholdersEnabled, int pageSize);
+    ctor public PagingSource.LoadParams.Append(Key key, int loadSize, boolean placeholdersEnabled);
+    method public Key getKey();
+  }
+
+  public static final class PagingSource.LoadParams.Prepend<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
+    ctor public PagingSource.LoadParams.Prepend(Key key, int loadSize, boolean placeholdersEnabled, int pageSize);
+    ctor public PagingSource.LoadParams.Prepend(Key key, int loadSize, boolean placeholdersEnabled);
+    method public Key getKey();
+  }
+
+  public static final class PagingSource.LoadParams.Refresh<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
+    ctor public PagingSource.LoadParams.Refresh(Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+    ctor public PagingSource.LoadParams.Refresh(Key? key, int loadSize, boolean placeholdersEnabled);
+    method public Key? getKey();
+  }
+
+  public abstract static sealed class PagingSource.LoadResult<Key, Value> {
+  }
+
+  public static final class PagingSource.LoadResult.Error<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
+    ctor public PagingSource.LoadResult.Error(Throwable throwable);
+    method public Throwable component1();
+    method public androidx.paging.PagingSource.LoadResult.Error<Key,Value> copy(Throwable throwable);
+    method public Throwable getThrowable();
+  }
+
+  public static final class PagingSource.LoadResult.Page<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
+    ctor public PagingSource.LoadResult.Page(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey, @IntRange(from=null) int itemsBefore, @IntRange(from=null) int itemsAfter);
+    ctor public PagingSource.LoadResult.Page(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey);
+    method public java.util.List<Value> component1();
+    method public Key? component2();
+    method public Key? component3();
+    method public int component4();
+    method public int component5();
+    method public androidx.paging.PagingSource.LoadResult.Page<Key,Value> copy(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey, int itemsBefore, int itemsAfter);
+    method public java.util.List<Value> getData();
+    method public int getItemsAfter();
+    method public int getItemsBefore();
+    method public Key? getNextKey();
+    method public Key? getPrevKey();
+    field public static final int COUNT_UNDEFINED = -2147483648; // 0x80000000
+    field public static final androidx.paging.PagingSource.LoadResult.Page.Companion Companion;
+  }
+
+  public static final class PagingSource.LoadResult.Page.Companion {
+  }
+
+  public final class PagingSourceKt {
+  }
+
+  public final class PagingState<Key, Value> {
+    ctor public PagingState(java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> pages, Integer? anchorPosition, androidx.paging.PagingConfig config, @IntRange(from=null) int leadingPlaceholderCount);
+    method public Value? closestItemToPosition(int anchorPosition);
+    method public androidx.paging.PagingSource.LoadResult.Page<Key,Value>? closestPageToPosition(int anchorPosition);
+    method public Value? firstItemOrNull();
+    method public Integer? getAnchorPosition();
+    method public androidx.paging.PagingConfig getConfig();
+    method public java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> getPages();
+    method public boolean isEmpty();
+    method public Value? lastItemOrNull();
+  }
+
+  @Deprecated public abstract class PositionalDataSource<T> extends androidx.paging.DataSource<java.lang.Integer,T> {
+    ctor @Deprecated public PositionalDataSource();
+    method @Deprecated public static final int computeInitialLoadPosition(androidx.paging.PositionalDataSource.LoadInitialParams params, int totalCount);
+    method @Deprecated public static final int computeInitialLoadSize(androidx.paging.PositionalDataSource.LoadInitialParams params, int initialLoadPosition, int totalCount);
+    method @Deprecated @WorkerThread public abstract void loadInitial(androidx.paging.PositionalDataSource.LoadInitialParams params, androidx.paging.PositionalDataSource.LoadInitialCallback<T> callback);
+    method @Deprecated @WorkerThread public abstract void loadRange(androidx.paging.PositionalDataSource.LoadRangeParams params, androidx.paging.PositionalDataSource.LoadRangeCallback<T> callback);
+    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> map(androidx.arch.core.util.Function<T,V> function);
+    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> map(kotlin.jvm.functions.Function1<? super T,? extends V> function);
+    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> mapByPage(androidx.arch.core.util.Function<java.util.List<T>,java.util.List<V>> function);
+    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends T>,? extends java.util.List<? extends V>> function);
+  }
+
+  @Deprecated public abstract static class PositionalDataSource.LoadInitialCallback<T> {
+    ctor @Deprecated public PositionalDataSource.LoadInitialCallback();
+    method @Deprecated public abstract void onResult(java.util.List<? extends T> data, int position, int totalCount);
+    method @Deprecated public abstract void onResult(java.util.List<? extends T> data, int position);
+  }
+
+  @Deprecated public static class PositionalDataSource.LoadInitialParams {
+    ctor @Deprecated public PositionalDataSource.LoadInitialParams(int requestedStartPosition, int requestedLoadSize, int pageSize, boolean placeholdersEnabled);
+    field @Deprecated public final int pageSize;
+    field @Deprecated public final boolean placeholdersEnabled;
+    field @Deprecated public final int requestedLoadSize;
+    field @Deprecated public final int requestedStartPosition;
+  }
+
+  @Deprecated public abstract static class PositionalDataSource.LoadRangeCallback<T> {
+    ctor @Deprecated public PositionalDataSource.LoadRangeCallback();
+    method @Deprecated public abstract void onResult(java.util.List<? extends T> data);
+  }
+
+  @Deprecated public static class PositionalDataSource.LoadRangeParams {
+    ctor @Deprecated public PositionalDataSource.LoadRangeParams(int startPosition, int loadSize);
+    field @Deprecated public final int loadSize;
+    field @Deprecated public final int startPosition;
+  }
+
+  @androidx.paging.ExperimentalPagingApi 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);
+  }
+
+  public enum RemoteMediator.InitializeAction {
+    method public static androidx.paging.RemoteMediator.InitializeAction valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.paging.RemoteMediator.InitializeAction[] values();
+    enum_constant public static final androidx.paging.RemoteMediator.InitializeAction LAUNCH_INITIAL_REFRESH;
+    enum_constant public static final androidx.paging.RemoteMediator.InitializeAction SKIP_INITIAL_REFRESH;
+  }
+
+  public abstract static sealed class RemoteMediator.MediatorResult {
+  }
+
+  public static final class RemoteMediator.MediatorResult.Error extends androidx.paging.RemoteMediator.MediatorResult {
+    ctor public RemoteMediator.MediatorResult.Error(Throwable throwable);
+    method public Throwable getThrowable();
+  }
+
+  public static final class RemoteMediator.MediatorResult.Success extends androidx.paging.RemoteMediator.MediatorResult {
+    ctor public RemoteMediator.MediatorResult.Success(boolean endOfPaginationReached);
+    method public boolean endOfPaginationReached();
+  }
+
+  public final class SeparatorsKt {
+  }
+
+}
+
+package androidx.paging.multicast {
+
+  public final class ChannelManagerKt {
+  }
+
+}
+
diff --git a/paging/common/api/public_plus_experimental_3.0.0-alpha04.txt b/paging/common/api/public_plus_experimental_3.0.0-alpha04.txt
new file mode 100644
index 0000000..e6aeb78
--- /dev/null
+++ b/paging/common/api/public_plus_experimental_3.0.0-alpha04.txt
@@ -0,0 +1,454 @@
+// Signature format: 3.0
+package androidx.paging {
+
+  public final class CachedPagingDataKt {
+    method @CheckResult public static <T> kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>> cachedIn(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+  }
+
+  public final class CancelableChannelFlowKt {
+  }
+
+  public final class CombinedLoadStates {
+    ctor public CombinedLoadStates(androidx.paging.LoadStates source, androidx.paging.LoadStates? mediator);
+    method public androidx.paging.LoadStates component1();
+    method public androidx.paging.LoadStates? component2();
+    method public androidx.paging.CombinedLoadStates copy(androidx.paging.LoadStates source, androidx.paging.LoadStates? mediator);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public inline void forEach(kotlin.jvm.functions.Function3<? super androidx.paging.LoadType,? super java.lang.Boolean,? super androidx.paging.LoadState,kotlin.Unit> op);
+    method public androidx.paging.LoadState getAppend();
+    method public androidx.paging.LoadStates? getMediator();
+    method public androidx.paging.LoadState getPrepend();
+    method public androidx.paging.LoadState getRefresh();
+    method public androidx.paging.LoadStates getSource();
+    property public final androidx.paging.LoadState append;
+    property public final androidx.paging.LoadState prepend;
+    property public final androidx.paging.LoadState refresh;
+  }
+
+  public abstract class DataSource<Key, Value> {
+    method @AnyThread public void addInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
+    method @AnyThread public final void addInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
+    method @AnyThread public void invalidate();
+    method @WorkerThread public boolean isInvalid();
+    method public <ToValue> androidx.paging.DataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method public <ToValue> androidx.paging.DataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @AnyThread public void removeInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
+    method @AnyThread public final void removeInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
+    property @WorkerThread public boolean isInvalid;
+  }
+
+  public abstract static class DataSource.Factory<Key, Value> {
+    ctor public DataSource.Factory();
+    method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory(kotlinx.coroutines.CoroutineDispatcher fetchDispatcher = Dispatchers.IO);
+    method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory();
+    method public abstract androidx.paging.DataSource<Key,Value> create();
+    method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+  }
+
+  public static interface DataSource.InvalidatedCallback {
+    method @AnyThread public void onInvalidated();
+  }
+
+  @kotlin.RequiresOptIn public @interface ExperimentalPagingApi {
+  }
+
+  @Deprecated public abstract class ItemKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
+    ctor @Deprecated public ItemKeyedDataSource();
+    method @Deprecated public abstract Key getKey(Value item);
+    method @Deprecated public abstract void loadAfter(androidx.paging.ItemKeyedDataSource.LoadParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadCallback<Value> callback);
+    method @Deprecated public abstract void loadBefore(androidx.paging.ItemKeyedDataSource.LoadParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadCallback<Value> callback);
+    method @Deprecated public abstract void loadInitial(androidx.paging.ItemKeyedDataSource.LoadInitialParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadInitialCallback<Value> callback);
+    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
+    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
+  }
+
+  @Deprecated public abstract static class ItemKeyedDataSource.LoadCallback<Value> {
+    ctor @Deprecated public ItemKeyedDataSource.LoadCallback();
+    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data);
+  }
+
+  @Deprecated public abstract static class ItemKeyedDataSource.LoadInitialCallback<Value> extends androidx.paging.ItemKeyedDataSource.LoadCallback<Value> {
+    ctor @Deprecated public ItemKeyedDataSource.LoadInitialCallback();
+    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, int position, int totalCount);
+  }
+
+  @Deprecated public static class ItemKeyedDataSource.LoadInitialParams<Key> {
+    ctor @Deprecated public ItemKeyedDataSource.LoadInitialParams(Key? requestedInitialKey, int requestedLoadSize, boolean placeholdersEnabled);
+    field @Deprecated public final boolean placeholdersEnabled;
+    field @Deprecated public final Key? requestedInitialKey;
+    field @Deprecated public final int requestedLoadSize;
+  }
+
+  @Deprecated public static class ItemKeyedDataSource.LoadParams<Key> {
+    ctor @Deprecated public ItemKeyedDataSource.LoadParams(Key key, int requestedLoadSize);
+    field @Deprecated public final Key key;
+    field @Deprecated public final int requestedLoadSize;
+  }
+
+  public abstract sealed class LoadState {
+    method public final boolean getEndOfPaginationReached();
+  }
+
+  public static final class LoadState.Error extends androidx.paging.LoadState {
+    ctor public LoadState.Error(Throwable error);
+    method public Throwable getError();
+  }
+
+  public static final class LoadState.Loading extends androidx.paging.LoadState {
+    field public static final androidx.paging.LoadState.Loading INSTANCE;
+  }
+
+  public static final class LoadState.NotLoading extends androidx.paging.LoadState {
+    ctor public LoadState.NotLoading(boolean endOfPaginationReached);
+  }
+
+  public final class LoadStates {
+    ctor public LoadStates(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append);
+    method public androidx.paging.LoadState component1();
+    method public androidx.paging.LoadState component2();
+    method public androidx.paging.LoadState component3();
+    method public androidx.paging.LoadStates copy(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public inline void forEach(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> op);
+    method public androidx.paging.LoadState getAppend();
+    method public androidx.paging.LoadState getPrepend();
+    method public androidx.paging.LoadState getRefresh();
+  }
+
+  public enum LoadType {
+    method public static androidx.paging.LoadType valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.paging.LoadType[] values();
+    enum_constant public static final androidx.paging.LoadType APPEND;
+    enum_constant public static final androidx.paging.LoadType PREPEND;
+    enum_constant public static final androidx.paging.LoadType REFRESH;
+  }
+
+  public final class PageEventKt {
+  }
+
+  @Deprecated public abstract class PageKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
+    ctor @Deprecated public PageKeyedDataSource();
+    method @Deprecated public abstract void loadAfter(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
+    method @Deprecated public abstract void loadBefore(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
+    method @Deprecated public abstract void loadInitial(androidx.paging.PageKeyedDataSource.LoadInitialParams<Key> params, androidx.paging.PageKeyedDataSource.LoadInitialCallback<Key,Value> callback);
+    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
+    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
+  }
+
+  @Deprecated public abstract static class PageKeyedDataSource.LoadCallback<Key, Value> {
+    ctor @Deprecated public PageKeyedDataSource.LoadCallback();
+    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, Key? adjacentPageKey);
+  }
+
+  @Deprecated public abstract static class PageKeyedDataSource.LoadInitialCallback<Key, Value> {
+    ctor @Deprecated public PageKeyedDataSource.LoadInitialCallback();
+    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, int position, int totalCount, Key? previousPageKey, Key? nextPageKey);
+    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, Key? previousPageKey, Key? nextPageKey);
+  }
+
+  @Deprecated public static class PageKeyedDataSource.LoadInitialParams<Key> {
+    ctor @Deprecated public PageKeyedDataSource.LoadInitialParams(int requestedLoadSize, boolean placeholdersEnabled);
+    field @Deprecated public final boolean placeholdersEnabled;
+    field @Deprecated public final int requestedLoadSize;
+  }
+
+  @Deprecated public static class PageKeyedDataSource.LoadParams<Key> {
+    ctor @Deprecated public PageKeyedDataSource.LoadParams(Key key, int requestedLoadSize);
+    field @Deprecated public final Key key;
+    field @Deprecated public final int requestedLoadSize;
+  }
+
+  @Deprecated public abstract class PagedList<T> extends java.util.AbstractList<T> {
+    method @Deprecated public final void addWeakCallback(java.util.List<? extends T>? previousSnapshot, androidx.paging.PagedList.Callback callback);
+    method @Deprecated public final void addWeakCallback(androidx.paging.PagedList.Callback callback);
+    method @Deprecated public final void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+    method @Deprecated public abstract void detach();
+    method @Deprecated public T? get(int index);
+    method @Deprecated public final androidx.paging.PagedList.Config getConfig();
+    method @Deprecated public final androidx.paging.DataSource<?,T> getDataSource();
+    method @Deprecated public abstract Object? getLastKey();
+    method @Deprecated public final int getLoadedCount();
+    method @Deprecated public final int getPositionOffset();
+    method @Deprecated public int getSize();
+    method @Deprecated public abstract boolean isDetached();
+    method @Deprecated public boolean isImmutable();
+    method @Deprecated public final void loadAround(int index);
+    method @Deprecated public final void removeWeakCallback(androidx.paging.PagedList.Callback callback);
+    method @Deprecated public final void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+    method @Deprecated public void retry();
+    method @Deprecated public final java.util.List<T> snapshot();
+    property @Deprecated public final androidx.paging.DataSource<?,T> dataSource;
+    property public abstract boolean isDetached;
+    property public boolean isImmutable;
+    property public abstract Object? lastKey;
+    property public final int loadedCount;
+    property public final int positionOffset;
+    property public int size;
+  }
+
+  @Deprecated @MainThread public abstract static class PagedList.BoundaryCallback<T> {
+    ctor @Deprecated public PagedList.BoundaryCallback();
+    method @Deprecated public void onItemAtEndLoaded(T itemAtEnd);
+    method @Deprecated public void onItemAtFrontLoaded(T itemAtFront);
+    method @Deprecated public void onZeroItemsLoaded();
+  }
+
+  @Deprecated public static final class PagedList.Builder<Key, Value> {
+    ctor @Deprecated public PagedList.Builder(androidx.paging.DataSource<Key,Value> dataSource, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public PagedList.Builder(androidx.paging.DataSource<Key,Value> dataSource, int pageSize);
+    ctor @Deprecated public PagedList.Builder(androidx.paging.PagingSource<Key,Value> pagingSource, androidx.paging.PagingSource.LoadResult.Page<Key,Value> initialPage, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public PagedList.Builder(androidx.paging.PagingSource<Key,Value> pagingSource, androidx.paging.PagingSource.LoadResult.Page<Key,Value> initialPage, int pageSize);
+    method @Deprecated public androidx.paging.PagedList<Value> build();
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setCoroutineScope(kotlinx.coroutines.CoroutineScope coroutineScope);
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setFetchDispatcher(kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setFetchExecutor(java.util.concurrent.Executor fetchExecutor);
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setInitialKey(Key? initialKey);
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setNotifyDispatcher(kotlinx.coroutines.CoroutineDispatcher notifyDispatcher);
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setNotifyExecutor(java.util.concurrent.Executor notifyExecutor);
+  }
+
+  @Deprecated public abstract static class PagedList.Callback {
+    ctor @Deprecated public PagedList.Callback();
+    method @Deprecated public abstract void onChanged(int position, int count);
+    method @Deprecated public abstract void onInserted(int position, int count);
+    method @Deprecated public abstract void onRemoved(int position, int count);
+  }
+
+  @Deprecated public static final class PagedList.Config {
+    field @Deprecated public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
+    field @Deprecated public final boolean enablePlaceholders;
+    field @Deprecated public final int initialLoadSizeHint;
+    field @Deprecated public final int maxSize;
+    field @Deprecated public final int pageSize;
+    field @Deprecated public final int prefetchDistance;
+  }
+
+  @Deprecated public static final class PagedList.Config.Builder {
+    ctor @Deprecated public PagedList.Config.Builder();
+    method @Deprecated public androidx.paging.PagedList.Config build();
+    method @Deprecated public androidx.paging.PagedList.Config.Builder setEnablePlaceholders(boolean enablePlaceholders);
+    method @Deprecated public androidx.paging.PagedList.Config.Builder setInitialLoadSizeHint(@IntRange(from=1) int initialLoadSizeHint);
+    method @Deprecated public androidx.paging.PagedList.Config.Builder setMaxSize(@IntRange(from=2) int maxSize);
+    method @Deprecated public androidx.paging.PagedList.Config.Builder setPageSize(@IntRange(from=1) int pageSize);
+    method @Deprecated public androidx.paging.PagedList.Config.Builder setPrefetchDistance(@IntRange(from=0) int prefetchDistance);
+  }
+
+  public final class PagedListConfigKt {
+  }
+
+  public final class PagedListKt {
+  }
+
+  public final class Pager<Key, Value> {
+    ctor public Pager(androidx.paging.PagingConfig config, Key? initialKey, androidx.paging.RemoteMediator<Key,Value>? remoteMediator, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+    ctor public Pager(androidx.paging.PagingConfig config, Key? initialKey, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+    ctor public Pager(androidx.paging.PagingConfig config, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+    method public kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>> getFlow();
+    property public final kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>> flow;
+  }
+
+  public final class PagingConfig {
+    ctor public PagingConfig(int pageSize, @IntRange(from=null) int prefetchDistance, boolean enablePlaceholders, @IntRange(from=null) int initialLoadSize, @IntRange(from=null) int maxSize, int jumpThreshold);
+    ctor public PagingConfig(int pageSize, @IntRange(from=null) int prefetchDistance, boolean enablePlaceholders, @IntRange(from=null) int initialLoadSize, @IntRange(from=null) int maxSize);
+    ctor public PagingConfig(int pageSize, @IntRange(from=null) int prefetchDistance, boolean enablePlaceholders, @IntRange(from=null) int initialLoadSize);
+    ctor public PagingConfig(int pageSize, @IntRange(from=null) int prefetchDistance, boolean enablePlaceholders);
+    ctor public PagingConfig(int pageSize, @IntRange(from=null) int prefetchDistance);
+    ctor public PagingConfig(int pageSize);
+    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;
+  }
+
+  public static final class PagingConfig.Companion {
+  }
+
+  public final class PagingData<T> {
+    method public static <T> androidx.paging.PagingData<T> empty();
+    method @CheckResult public androidx.paging.PagingData<T> filter(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method @CheckResult public <R> androidx.paging.PagingData<R> flatMap(kotlin.jvm.functions.Function1<? super T,? extends java.lang.Iterable<? extends R>> transform);
+    method @CheckResult public androidx.paging.PagingData<T> insertFooterItem(T item);
+    method @CheckResult public androidx.paging.PagingData<T> insertHeaderItem(T item);
+    method @CheckResult public static <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T> pagingData, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
+    method @CheckResult public <R> androidx.paging.PagingData<R> map(kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    field public static final androidx.paging.PagingData.Companion Companion;
+  }
+
+  public static final class PagingData.Companion {
+    method public <T> androidx.paging.PagingData<T> empty();
+    method @CheckResult public <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T> pagingData, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
+  }
+
+  public final class PagingDataKt {
+  }
+
+  public abstract class PagingSource<Key, Value> {
+    ctor public PagingSource();
+    method public final boolean getInvalid();
+    method public boolean getJumpingSupported();
+    method public boolean getKeyReuseSupported();
+    method @androidx.paging.ExperimentalPagingApi 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;
+    property public boolean keyReuseSupported;
+  }
+
+  public abstract static sealed class PagingSource.LoadParams<Key> {
+    method public abstract Key? getKey();
+    method public final int getLoadSize();
+    method @Deprecated public final int getPageSize();
+    method public final boolean getPlaceholdersEnabled();
+    property public abstract Key? key;
+  }
+
+  public static final class PagingSource.LoadParams.Append<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
+    ctor public PagingSource.LoadParams.Append(Key key, int loadSize, boolean placeholdersEnabled, int pageSize);
+    ctor public PagingSource.LoadParams.Append(Key key, int loadSize, boolean placeholdersEnabled);
+    method public Key getKey();
+  }
+
+  public static final class PagingSource.LoadParams.Prepend<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
+    ctor public PagingSource.LoadParams.Prepend(Key key, int loadSize, boolean placeholdersEnabled, int pageSize);
+    ctor public PagingSource.LoadParams.Prepend(Key key, int loadSize, boolean placeholdersEnabled);
+    method public Key getKey();
+  }
+
+  public static final class PagingSource.LoadParams.Refresh<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
+    ctor public PagingSource.LoadParams.Refresh(Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+    ctor public PagingSource.LoadParams.Refresh(Key? key, int loadSize, boolean placeholdersEnabled);
+    method public Key? getKey();
+  }
+
+  public abstract static sealed class PagingSource.LoadResult<Key, Value> {
+  }
+
+  public static final class PagingSource.LoadResult.Error<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
+    ctor public PagingSource.LoadResult.Error(Throwable throwable);
+    method public Throwable component1();
+    method public androidx.paging.PagingSource.LoadResult.Error<Key,Value> copy(Throwable throwable);
+    method public Throwable getThrowable();
+  }
+
+  public static final class PagingSource.LoadResult.Page<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
+    ctor public PagingSource.LoadResult.Page(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey, @IntRange(from=null) int itemsBefore, @IntRange(from=null) int itemsAfter);
+    ctor public PagingSource.LoadResult.Page(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey);
+    method public java.util.List<Value> component1();
+    method public Key? component2();
+    method public Key? component3();
+    method public int component4();
+    method public int component5();
+    method public androidx.paging.PagingSource.LoadResult.Page<Key,Value> copy(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey, int itemsBefore, int itemsAfter);
+    method public java.util.List<Value> getData();
+    method public int getItemsAfter();
+    method public int getItemsBefore();
+    method public Key? getNextKey();
+    method public Key? getPrevKey();
+    field public static final int COUNT_UNDEFINED = -2147483648; // 0x80000000
+    field public static final androidx.paging.PagingSource.LoadResult.Page.Companion Companion;
+  }
+
+  public static final class PagingSource.LoadResult.Page.Companion {
+  }
+
+  public final class PagingSourceKt {
+  }
+
+  public final class PagingState<Key, Value> {
+    ctor public PagingState(java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> pages, Integer? anchorPosition, androidx.paging.PagingConfig config, @IntRange(from=null) int leadingPlaceholderCount);
+    method public Value? closestItemToPosition(int anchorPosition);
+    method public androidx.paging.PagingSource.LoadResult.Page<Key,Value>? closestPageToPosition(int anchorPosition);
+    method public Value? firstItemOrNull();
+    method public Integer? getAnchorPosition();
+    method public androidx.paging.PagingConfig getConfig();
+    method public java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> getPages();
+    method public boolean isEmpty();
+    method public Value? lastItemOrNull();
+  }
+
+  @Deprecated public abstract class PositionalDataSource<T> extends androidx.paging.DataSource<java.lang.Integer,T> {
+    ctor @Deprecated public PositionalDataSource();
+    method @Deprecated public static final int computeInitialLoadPosition(androidx.paging.PositionalDataSource.LoadInitialParams params, int totalCount);
+    method @Deprecated public static final int computeInitialLoadSize(androidx.paging.PositionalDataSource.LoadInitialParams params, int initialLoadPosition, int totalCount);
+    method @Deprecated @WorkerThread public abstract void loadInitial(androidx.paging.PositionalDataSource.LoadInitialParams params, androidx.paging.PositionalDataSource.LoadInitialCallback<T> callback);
+    method @Deprecated @WorkerThread public abstract void loadRange(androidx.paging.PositionalDataSource.LoadRangeParams params, androidx.paging.PositionalDataSource.LoadRangeCallback<T> callback);
+    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> map(androidx.arch.core.util.Function<T,V> function);
+    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> map(kotlin.jvm.functions.Function1<? super T,? extends V> function);
+    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> mapByPage(androidx.arch.core.util.Function<java.util.List<T>,java.util.List<V>> function);
+    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends T>,? extends java.util.List<? extends V>> function);
+  }
+
+  @Deprecated public abstract static class PositionalDataSource.LoadInitialCallback<T> {
+    ctor @Deprecated public PositionalDataSource.LoadInitialCallback();
+    method @Deprecated public abstract void onResult(java.util.List<? extends T> data, int position, int totalCount);
+    method @Deprecated public abstract void onResult(java.util.List<? extends T> data, int position);
+  }
+
+  @Deprecated public static class PositionalDataSource.LoadInitialParams {
+    ctor @Deprecated public PositionalDataSource.LoadInitialParams(int requestedStartPosition, int requestedLoadSize, int pageSize, boolean placeholdersEnabled);
+    field @Deprecated public final int pageSize;
+    field @Deprecated public final boolean placeholdersEnabled;
+    field @Deprecated public final int requestedLoadSize;
+    field @Deprecated public final int requestedStartPosition;
+  }
+
+  @Deprecated public abstract static class PositionalDataSource.LoadRangeCallback<T> {
+    ctor @Deprecated public PositionalDataSource.LoadRangeCallback();
+    method @Deprecated public abstract void onResult(java.util.List<? extends T> data);
+  }
+
+  @Deprecated public static class PositionalDataSource.LoadRangeParams {
+    ctor @Deprecated public PositionalDataSource.LoadRangeParams(int startPosition, int loadSize);
+    field @Deprecated public final int loadSize;
+    field @Deprecated public final int startPosition;
+  }
+
+  @androidx.paging.ExperimentalPagingApi 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);
+  }
+
+  public enum RemoteMediator.InitializeAction {
+    method public static androidx.paging.RemoteMediator.InitializeAction valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.paging.RemoteMediator.InitializeAction[] values();
+    enum_constant public static final androidx.paging.RemoteMediator.InitializeAction LAUNCH_INITIAL_REFRESH;
+    enum_constant public static final androidx.paging.RemoteMediator.InitializeAction SKIP_INITIAL_REFRESH;
+  }
+
+  public abstract static sealed class RemoteMediator.MediatorResult {
+  }
+
+  public static final class RemoteMediator.MediatorResult.Error extends androidx.paging.RemoteMediator.MediatorResult {
+    ctor public RemoteMediator.MediatorResult.Error(Throwable throwable);
+    method public Throwable getThrowable();
+  }
+
+  public static final class RemoteMediator.MediatorResult.Success extends androidx.paging.RemoteMediator.MediatorResult {
+    ctor public RemoteMediator.MediatorResult.Success(boolean endOfPaginationReached);
+    method public boolean endOfPaginationReached();
+  }
+
+  public final class SeparatorsKt {
+  }
+
+}
+
+package androidx.paging.multicast {
+
+  public final class ChannelManagerKt {
+  }
+
+}
+
diff --git a/paging/common/api/restricted_3.0.0-alpha04.txt b/paging/common/api/restricted_3.0.0-alpha04.txt
new file mode 100644
index 0000000..80803ed
--- /dev/null
+++ b/paging/common/api/restricted_3.0.0-alpha04.txt
@@ -0,0 +1,452 @@
+// Signature format: 3.0
+package androidx.paging {
+
+  public final class CachedPagingDataKt {
+    method @CheckResult public static <T> kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>> cachedIn(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+  }
+
+  public final class CancelableChannelFlowKt {
+  }
+
+  public final class CombinedLoadStates {
+    ctor public CombinedLoadStates(androidx.paging.LoadStates source, androidx.paging.LoadStates? mediator);
+    method public androidx.paging.LoadStates component1();
+    method public androidx.paging.LoadStates? component2();
+    method public androidx.paging.CombinedLoadStates copy(androidx.paging.LoadStates source, androidx.paging.LoadStates? mediator);
+    method public androidx.paging.LoadState getAppend();
+    method public androidx.paging.LoadStates? getMediator();
+    method public androidx.paging.LoadState getPrepend();
+    method public androidx.paging.LoadState getRefresh();
+    method public androidx.paging.LoadStates getSource();
+    property public final androidx.paging.LoadState append;
+    property public final androidx.paging.LoadState prepend;
+    property public final androidx.paging.LoadState refresh;
+  }
+
+  public abstract class DataSource<Key, Value> {
+    method @AnyThread public void addInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
+    method @AnyThread public final void addInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
+    method @AnyThread public void invalidate();
+    method @WorkerThread public boolean isInvalid();
+    method public <ToValue> androidx.paging.DataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method public <ToValue> androidx.paging.DataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @AnyThread public void removeInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
+    method @AnyThread public final void removeInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
+    property @WorkerThread public boolean isInvalid;
+  }
+
+  public abstract static class DataSource.Factory<Key, Value> {
+    ctor public DataSource.Factory();
+    method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory(kotlinx.coroutines.CoroutineDispatcher fetchDispatcher = Dispatchers.IO);
+    method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory();
+    method public abstract androidx.paging.DataSource<Key,Value> create();
+    method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+  }
+
+  public static interface DataSource.InvalidatedCallback {
+    method @AnyThread public void onInvalidated();
+  }
+
+  @kotlin.RequiresOptIn public @interface ExperimentalPagingApi {
+  }
+
+  @Deprecated public abstract class ItemKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
+    ctor @Deprecated public ItemKeyedDataSource();
+    method @Deprecated public abstract Key getKey(Value item);
+    method @Deprecated public abstract void loadAfter(androidx.paging.ItemKeyedDataSource.LoadParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadCallback<Value> callback);
+    method @Deprecated public abstract void loadBefore(androidx.paging.ItemKeyedDataSource.LoadParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadCallback<Value> callback);
+    method @Deprecated public abstract void loadInitial(androidx.paging.ItemKeyedDataSource.LoadInitialParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadInitialCallback<Value> callback);
+    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
+    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
+  }
+
+  @Deprecated public abstract static class ItemKeyedDataSource.LoadCallback<Value> {
+    ctor @Deprecated public ItemKeyedDataSource.LoadCallback();
+    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data);
+  }
+
+  @Deprecated public abstract static class ItemKeyedDataSource.LoadInitialCallback<Value> extends androidx.paging.ItemKeyedDataSource.LoadCallback<Value> {
+    ctor @Deprecated public ItemKeyedDataSource.LoadInitialCallback();
+    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, int position, int totalCount);
+  }
+
+  @Deprecated public static class ItemKeyedDataSource.LoadInitialParams<Key> {
+    ctor @Deprecated public ItemKeyedDataSource.LoadInitialParams(Key? requestedInitialKey, int requestedLoadSize, boolean placeholdersEnabled);
+    field @Deprecated public final boolean placeholdersEnabled;
+    field @Deprecated public final Key? requestedInitialKey;
+    field @Deprecated public final int requestedLoadSize;
+  }
+
+  @Deprecated public static class ItemKeyedDataSource.LoadParams<Key> {
+    ctor @Deprecated public ItemKeyedDataSource.LoadParams(Key key, int requestedLoadSize);
+    field @Deprecated public final Key key;
+    field @Deprecated public final int requestedLoadSize;
+  }
+
+  public abstract sealed class LoadState {
+    method public final boolean getEndOfPaginationReached();
+  }
+
+  public static final class LoadState.Error extends androidx.paging.LoadState {
+    ctor public LoadState.Error(Throwable error);
+    method public Throwable getError();
+  }
+
+  public static final class LoadState.Loading extends androidx.paging.LoadState {
+    field public static final androidx.paging.LoadState.Loading INSTANCE;
+  }
+
+  public static final class LoadState.NotLoading extends androidx.paging.LoadState {
+    ctor public LoadState.NotLoading(boolean endOfPaginationReached);
+  }
+
+  public final class LoadStates {
+    ctor public LoadStates(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append);
+    method public androidx.paging.LoadState component1();
+    method public androidx.paging.LoadState component2();
+    method public androidx.paging.LoadState component3();
+    method public androidx.paging.LoadStates copy(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append);
+    method public androidx.paging.LoadState getAppend();
+    method public androidx.paging.LoadState getPrepend();
+    method public androidx.paging.LoadState getRefresh();
+  }
+
+  public enum LoadType {
+    method public static androidx.paging.LoadType valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.paging.LoadType[] values();
+    enum_constant public static final androidx.paging.LoadType APPEND;
+    enum_constant public static final androidx.paging.LoadType PREPEND;
+    enum_constant public static final androidx.paging.LoadType REFRESH;
+  }
+
+  public final class PageEventKt {
+  }
+
+  @Deprecated public abstract class PageKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
+    ctor @Deprecated public PageKeyedDataSource();
+    method @Deprecated public abstract void loadAfter(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
+    method @Deprecated public abstract void loadBefore(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
+    method @Deprecated public abstract void loadInitial(androidx.paging.PageKeyedDataSource.LoadInitialParams<Key> params, androidx.paging.PageKeyedDataSource.LoadInitialCallback<Key,Value> callback);
+    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
+    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
+  }
+
+  @Deprecated public abstract static class PageKeyedDataSource.LoadCallback<Key, Value> {
+    ctor @Deprecated public PageKeyedDataSource.LoadCallback();
+    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, Key? adjacentPageKey);
+  }
+
+  @Deprecated public abstract static class PageKeyedDataSource.LoadInitialCallback<Key, Value> {
+    ctor @Deprecated public PageKeyedDataSource.LoadInitialCallback();
+    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, int position, int totalCount, Key? previousPageKey, Key? nextPageKey);
+    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, Key? previousPageKey, Key? nextPageKey);
+  }
+
+  @Deprecated public static class PageKeyedDataSource.LoadInitialParams<Key> {
+    ctor @Deprecated public PageKeyedDataSource.LoadInitialParams(int requestedLoadSize, boolean placeholdersEnabled);
+    field @Deprecated public final boolean placeholdersEnabled;
+    field @Deprecated public final int requestedLoadSize;
+  }
+
+  @Deprecated public static class PageKeyedDataSource.LoadParams<Key> {
+    ctor @Deprecated public PageKeyedDataSource.LoadParams(Key key, int requestedLoadSize);
+    field @Deprecated public final Key key;
+    field @Deprecated public final int requestedLoadSize;
+  }
+
+  @Deprecated public abstract class PagedList<T> extends java.util.AbstractList<T> {
+    method @Deprecated public final void addWeakCallback(java.util.List<? extends T>? previousSnapshot, androidx.paging.PagedList.Callback callback);
+    method @Deprecated public final void addWeakCallback(androidx.paging.PagedList.Callback callback);
+    method @Deprecated public final void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+    method @Deprecated public abstract void detach();
+    method @Deprecated public T? get(int index);
+    method @Deprecated public final androidx.paging.PagedList.Config getConfig();
+    method @Deprecated public final androidx.paging.DataSource<?,T> getDataSource();
+    method @Deprecated public abstract Object? getLastKey();
+    method @Deprecated public final int getLoadedCount();
+    method @Deprecated public final int getPositionOffset();
+    method @Deprecated public int getSize();
+    method @Deprecated public abstract boolean isDetached();
+    method @Deprecated public boolean isImmutable();
+    method @Deprecated public final void loadAround(int index);
+    method @Deprecated public final void removeWeakCallback(androidx.paging.PagedList.Callback callback);
+    method @Deprecated public final void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+    method @Deprecated public void retry();
+    method @Deprecated public final java.util.List<T> snapshot();
+    property @Deprecated public final androidx.paging.DataSource<?,T> dataSource;
+    property public abstract boolean isDetached;
+    property public boolean isImmutable;
+    property public abstract Object? lastKey;
+    property public final int loadedCount;
+    property public final int positionOffset;
+    property public int size;
+  }
+
+  @Deprecated @MainThread public abstract static class PagedList.BoundaryCallback<T> {
+    ctor @Deprecated public PagedList.BoundaryCallback();
+    method @Deprecated public void onItemAtEndLoaded(T itemAtEnd);
+    method @Deprecated public void onItemAtFrontLoaded(T itemAtFront);
+    method @Deprecated public void onZeroItemsLoaded();
+  }
+
+  @Deprecated public static final class PagedList.Builder<Key, Value> {
+    ctor @Deprecated public PagedList.Builder(androidx.paging.DataSource<Key,Value> dataSource, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public PagedList.Builder(androidx.paging.DataSource<Key,Value> dataSource, int pageSize);
+    ctor @Deprecated public PagedList.Builder(androidx.paging.PagingSource<Key,Value> pagingSource, androidx.paging.PagingSource.LoadResult.Page<Key,Value> initialPage, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public PagedList.Builder(androidx.paging.PagingSource<Key,Value> pagingSource, androidx.paging.PagingSource.LoadResult.Page<Key,Value> initialPage, int pageSize);
+    method @Deprecated public androidx.paging.PagedList<Value> build();
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setCoroutineScope(kotlinx.coroutines.CoroutineScope coroutineScope);
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setFetchDispatcher(kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setFetchExecutor(java.util.concurrent.Executor fetchExecutor);
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setInitialKey(Key? initialKey);
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setNotifyDispatcher(kotlinx.coroutines.CoroutineDispatcher notifyDispatcher);
+    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setNotifyExecutor(java.util.concurrent.Executor notifyExecutor);
+  }
+
+  @Deprecated public abstract static class PagedList.Callback {
+    ctor @Deprecated public PagedList.Callback();
+    method @Deprecated public abstract void onChanged(int position, int count);
+    method @Deprecated public abstract void onInserted(int position, int count);
+    method @Deprecated public abstract void onRemoved(int position, int count);
+  }
+
+  @Deprecated public static final class PagedList.Config {
+    field @Deprecated public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
+    field @Deprecated public final boolean enablePlaceholders;
+    field @Deprecated public final int initialLoadSizeHint;
+    field @Deprecated public final int maxSize;
+    field @Deprecated public final int pageSize;
+    field @Deprecated public final int prefetchDistance;
+  }
+
+  @Deprecated public static final class PagedList.Config.Builder {
+    ctor @Deprecated public PagedList.Config.Builder();
+    method @Deprecated public androidx.paging.PagedList.Config build();
+    method @Deprecated public androidx.paging.PagedList.Config.Builder setEnablePlaceholders(boolean enablePlaceholders);
+    method @Deprecated public androidx.paging.PagedList.Config.Builder setInitialLoadSizeHint(@IntRange(from=1) int initialLoadSizeHint);
+    method @Deprecated public androidx.paging.PagedList.Config.Builder setMaxSize(@IntRange(from=2) int maxSize);
+    method @Deprecated public androidx.paging.PagedList.Config.Builder setPageSize(@IntRange(from=1) int pageSize);
+    method @Deprecated public androidx.paging.PagedList.Config.Builder setPrefetchDistance(@IntRange(from=0) int prefetchDistance);
+  }
+
+  public final class PagedListConfigKt {
+  }
+
+  public final class PagedListKt {
+  }
+
+  public final class Pager<Key, Value> {
+    ctor public Pager(androidx.paging.PagingConfig config, Key? initialKey, androidx.paging.RemoteMediator<Key,Value>? remoteMediator, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+    ctor public Pager(androidx.paging.PagingConfig config, Key? initialKey, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+    ctor public Pager(androidx.paging.PagingConfig config, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+    method public kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>> getFlow();
+    property public final kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>> flow;
+  }
+
+  public final class PagingConfig {
+    ctor public PagingConfig(int pageSize, @IntRange(from=null) int prefetchDistance, boolean enablePlaceholders, @IntRange(from=null) int initialLoadSize, @IntRange(from=null) int maxSize, int jumpThreshold);
+    ctor public PagingConfig(int pageSize, @IntRange(from=null) int prefetchDistance, boolean enablePlaceholders, @IntRange(from=null) int initialLoadSize, @IntRange(from=null) int maxSize);
+    ctor public PagingConfig(int pageSize, @IntRange(from=null) int prefetchDistance, boolean enablePlaceholders, @IntRange(from=null) int initialLoadSize);
+    ctor public PagingConfig(int pageSize, @IntRange(from=null) int prefetchDistance, boolean enablePlaceholders);
+    ctor public PagingConfig(int pageSize, @IntRange(from=null) int prefetchDistance);
+    ctor public PagingConfig(int pageSize);
+    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;
+  }
+
+  public static final class PagingConfig.Companion {
+  }
+
+  public final class PagingData<T> {
+    method public static <T> androidx.paging.PagingData<T> empty();
+    method @CheckResult public androidx.paging.PagingData<T> filter(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method @CheckResult public <R> androidx.paging.PagingData<R> flatMap(kotlin.jvm.functions.Function1<? super T,? extends java.lang.Iterable<? extends R>> transform);
+    method @CheckResult public androidx.paging.PagingData<T> insertFooterItem(T item);
+    method @CheckResult public androidx.paging.PagingData<T> insertHeaderItem(T item);
+    method @CheckResult public static <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T> pagingData, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
+    method @CheckResult public <R> androidx.paging.PagingData<R> map(kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    field public static final androidx.paging.PagingData.Companion Companion;
+  }
+
+  public static final class PagingData.Companion {
+    method public <T> androidx.paging.PagingData<T> empty();
+    method @CheckResult public <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T> pagingData, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
+  }
+
+  public final class PagingDataKt {
+  }
+
+  public abstract class PagingSource<Key, Value> {
+    ctor public PagingSource();
+    method public final boolean getInvalid();
+    method public boolean getJumpingSupported();
+    method public boolean getKeyReuseSupported();
+    method @androidx.paging.ExperimentalPagingApi 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;
+    property public boolean keyReuseSupported;
+  }
+
+  public abstract static sealed class PagingSource.LoadParams<Key> {
+    method public abstract Key? getKey();
+    method public final int getLoadSize();
+    method @Deprecated public final int getPageSize();
+    method public final boolean getPlaceholdersEnabled();
+    property public abstract Key? key;
+  }
+
+  public static final class PagingSource.LoadParams.Append<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
+    ctor public PagingSource.LoadParams.Append(Key key, int loadSize, boolean placeholdersEnabled, int pageSize);
+    ctor public PagingSource.LoadParams.Append(Key key, int loadSize, boolean placeholdersEnabled);
+    method public Key getKey();
+  }
+
+  public static final class PagingSource.LoadParams.Prepend<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
+    ctor public PagingSource.LoadParams.Prepend(Key key, int loadSize, boolean placeholdersEnabled, int pageSize);
+    ctor public PagingSource.LoadParams.Prepend(Key key, int loadSize, boolean placeholdersEnabled);
+    method public Key getKey();
+  }
+
+  public static final class PagingSource.LoadParams.Refresh<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
+    ctor public PagingSource.LoadParams.Refresh(Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+    ctor public PagingSource.LoadParams.Refresh(Key? key, int loadSize, boolean placeholdersEnabled);
+    method public Key? getKey();
+  }
+
+  public abstract static sealed class PagingSource.LoadResult<Key, Value> {
+  }
+
+  public static final class PagingSource.LoadResult.Error<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
+    ctor public PagingSource.LoadResult.Error(Throwable throwable);
+    method public Throwable component1();
+    method public androidx.paging.PagingSource.LoadResult.Error<Key,Value> copy(Throwable throwable);
+    method public Throwable getThrowable();
+  }
+
+  public static final class PagingSource.LoadResult.Page<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
+    ctor public PagingSource.LoadResult.Page(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey, @IntRange(from=null) int itemsBefore, @IntRange(from=null) int itemsAfter);
+    ctor public PagingSource.LoadResult.Page(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey);
+    method public java.util.List<Value> component1();
+    method public Key? component2();
+    method public Key? component3();
+    method public int component4();
+    method public int component5();
+    method public androidx.paging.PagingSource.LoadResult.Page<Key,Value> copy(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey, int itemsBefore, int itemsAfter);
+    method public java.util.List<Value> getData();
+    method public int getItemsAfter();
+    method public int getItemsBefore();
+    method public Key? getNextKey();
+    method public Key? getPrevKey();
+    field public static final int COUNT_UNDEFINED = -2147483648; // 0x80000000
+    field public static final androidx.paging.PagingSource.LoadResult.Page.Companion Companion;
+  }
+
+  public static final class PagingSource.LoadResult.Page.Companion {
+  }
+
+  public final class PagingSourceKt {
+  }
+
+  public final class PagingState<Key, Value> {
+    ctor public PagingState(java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> pages, Integer? anchorPosition, androidx.paging.PagingConfig config, @IntRange(from=null) int leadingPlaceholderCount);
+    method public Value? closestItemToPosition(int anchorPosition);
+    method public androidx.paging.PagingSource.LoadResult.Page<Key,Value>? closestPageToPosition(int anchorPosition);
+    method public Value? firstItemOrNull();
+    method public Integer? getAnchorPosition();
+    method public androidx.paging.PagingConfig getConfig();
+    method public java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> getPages();
+    method public boolean isEmpty();
+    method public Value? lastItemOrNull();
+  }
+
+  @Deprecated public abstract class PositionalDataSource<T> extends androidx.paging.DataSource<java.lang.Integer,T> {
+    ctor @Deprecated public PositionalDataSource();
+    method @Deprecated public static final int computeInitialLoadPosition(androidx.paging.PositionalDataSource.LoadInitialParams params, int totalCount);
+    method @Deprecated public static final int computeInitialLoadSize(androidx.paging.PositionalDataSource.LoadInitialParams params, int initialLoadPosition, int totalCount);
+    method @Deprecated @WorkerThread public abstract void loadInitial(androidx.paging.PositionalDataSource.LoadInitialParams params, androidx.paging.PositionalDataSource.LoadInitialCallback<T> callback);
+    method @Deprecated @WorkerThread public abstract void loadRange(androidx.paging.PositionalDataSource.LoadRangeParams params, androidx.paging.PositionalDataSource.LoadRangeCallback<T> callback);
+    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> map(androidx.arch.core.util.Function<T,V> function);
+    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> map(kotlin.jvm.functions.Function1<? super T,? extends V> function);
+    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> mapByPage(androidx.arch.core.util.Function<java.util.List<T>,java.util.List<V>> function);
+    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends T>,? extends java.util.List<? extends V>> function);
+  }
+
+  @Deprecated public abstract static class PositionalDataSource.LoadInitialCallback<T> {
+    ctor @Deprecated public PositionalDataSource.LoadInitialCallback();
+    method @Deprecated public abstract void onResult(java.util.List<? extends T> data, int position, int totalCount);
+    method @Deprecated public abstract void onResult(java.util.List<? extends T> data, int position);
+  }
+
+  @Deprecated public static class PositionalDataSource.LoadInitialParams {
+    ctor @Deprecated public PositionalDataSource.LoadInitialParams(int requestedStartPosition, int requestedLoadSize, int pageSize, boolean placeholdersEnabled);
+    field @Deprecated public final int pageSize;
+    field @Deprecated public final boolean placeholdersEnabled;
+    field @Deprecated public final int requestedLoadSize;
+    field @Deprecated public final int requestedStartPosition;
+  }
+
+  @Deprecated public abstract static class PositionalDataSource.LoadRangeCallback<T> {
+    ctor @Deprecated public PositionalDataSource.LoadRangeCallback();
+    method @Deprecated public abstract void onResult(java.util.List<? extends T> data);
+  }
+
+  @Deprecated public static class PositionalDataSource.LoadRangeParams {
+    ctor @Deprecated public PositionalDataSource.LoadRangeParams(int startPosition, int loadSize);
+    field @Deprecated public final int loadSize;
+    field @Deprecated public final int startPosition;
+  }
+
+  @androidx.paging.ExperimentalPagingApi 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);
+  }
+
+  public enum RemoteMediator.InitializeAction {
+    method public static androidx.paging.RemoteMediator.InitializeAction valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.paging.RemoteMediator.InitializeAction[] values();
+    enum_constant public static final androidx.paging.RemoteMediator.InitializeAction LAUNCH_INITIAL_REFRESH;
+    enum_constant public static final androidx.paging.RemoteMediator.InitializeAction SKIP_INITIAL_REFRESH;
+  }
+
+  public abstract static sealed class RemoteMediator.MediatorResult {
+  }
+
+  public static final class RemoteMediator.MediatorResult.Error extends androidx.paging.RemoteMediator.MediatorResult {
+    ctor public RemoteMediator.MediatorResult.Error(Throwable throwable);
+    method public Throwable getThrowable();
+  }
+
+  public static final class RemoteMediator.MediatorResult.Success extends androidx.paging.RemoteMediator.MediatorResult {
+    ctor public RemoteMediator.MediatorResult.Success(boolean endOfPaginationReached);
+    method public boolean endOfPaginationReached();
+  }
+
+  public final class SeparatorsKt {
+  }
+
+}
+
+package androidx.paging.multicast {
+
+  public final class ChannelManagerKt {
+  }
+
+}
+
diff --git a/paging/common/ktx/api/3.0.0-alpha04.txt b/paging/common/ktx/api/3.0.0-alpha04.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/paging/common/ktx/api/3.0.0-alpha04.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/paging/common/ktx/api/public_plus_experimental_3.0.0-alpha04.txt b/paging/common/ktx/api/public_plus_experimental_3.0.0-alpha04.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/paging/common/ktx/api/public_plus_experimental_3.0.0-alpha04.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/paging/common/ktx/api/restricted_3.0.0-alpha04.txt b/paging/common/ktx/api/restricted_3.0.0-alpha04.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/paging/common/ktx/api/restricted_3.0.0-alpha04.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/paging/guava/api/3.0.0-alpha04.txt b/paging/guava/api/3.0.0-alpha04.txt
new file mode 100644
index 0000000..a440d78
--- /dev/null
+++ b/paging/guava/api/3.0.0-alpha04.txt
@@ -0,0 +1,19 @@
+// Signature format: 3.0
+package androidx.paging {
+
+  public abstract class ListenableFuturePagingSource<Key, Value> extends androidx.paging.PagingSource<Key,Value> {
+    ctor public ListenableFuturePagingSource();
+    method public suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> p, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> $completion);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.paging.PagingSource.LoadResult<Key,Value>> loadFuture(androidx.paging.PagingSource.LoadParams<Key> params);
+  }
+
+  @androidx.paging.ExperimentalPagingApi public abstract class ListenableFutureRemoteMediator<Key, Value> extends androidx.paging.RemoteMediator<Key,Value> {
+    ctor public ListenableFutureRemoteMediator();
+    method public final suspend Object? initialize(kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.InitializeAction> p);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.paging.RemoteMediator.InitializeAction> initializeFuture();
+    method public final 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 com.google.common.util.concurrent.ListenableFuture<androidx.paging.RemoteMediator.MediatorResult> loadFuture(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state);
+  }
+
+}
+
diff --git a/paging/guava/api/public_plus_experimental_3.0.0-alpha04.txt b/paging/guava/api/public_plus_experimental_3.0.0-alpha04.txt
new file mode 100644
index 0000000..a440d78
--- /dev/null
+++ b/paging/guava/api/public_plus_experimental_3.0.0-alpha04.txt
@@ -0,0 +1,19 @@
+// Signature format: 3.0
+package androidx.paging {
+
+  public abstract class ListenableFuturePagingSource<Key, Value> extends androidx.paging.PagingSource<Key,Value> {
+    ctor public ListenableFuturePagingSource();
+    method public suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> p, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> $completion);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.paging.PagingSource.LoadResult<Key,Value>> loadFuture(androidx.paging.PagingSource.LoadParams<Key> params);
+  }
+
+  @androidx.paging.ExperimentalPagingApi public abstract class ListenableFutureRemoteMediator<Key, Value> extends androidx.paging.RemoteMediator<Key,Value> {
+    ctor public ListenableFutureRemoteMediator();
+    method public final suspend Object? initialize(kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.InitializeAction> p);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.paging.RemoteMediator.InitializeAction> initializeFuture();
+    method public final 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 com.google.common.util.concurrent.ListenableFuture<androidx.paging.RemoteMediator.MediatorResult> loadFuture(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state);
+  }
+
+}
+
diff --git a/paging/guava/api/res-3.0.0-alpha04.txt b/paging/guava/api/res-3.0.0-alpha04.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/paging/guava/api/res-3.0.0-alpha04.txt
diff --git a/paging/guava/api/restricted_3.0.0-alpha04.txt b/paging/guava/api/restricted_3.0.0-alpha04.txt
new file mode 100644
index 0000000..a440d78
--- /dev/null
+++ b/paging/guava/api/restricted_3.0.0-alpha04.txt
@@ -0,0 +1,19 @@
+// Signature format: 3.0
+package androidx.paging {
+
+  public abstract class ListenableFuturePagingSource<Key, Value> extends androidx.paging.PagingSource<Key,Value> {
+    ctor public ListenableFuturePagingSource();
+    method public suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> p, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> $completion);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.paging.PagingSource.LoadResult<Key,Value>> loadFuture(androidx.paging.PagingSource.LoadParams<Key> params);
+  }
+
+  @androidx.paging.ExperimentalPagingApi public abstract class ListenableFutureRemoteMediator<Key, Value> extends androidx.paging.RemoteMediator<Key,Value> {
+    ctor public ListenableFutureRemoteMediator();
+    method public final suspend Object? initialize(kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.InitializeAction> p);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.paging.RemoteMediator.InitializeAction> initializeFuture();
+    method public final 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 com.google.common.util.concurrent.ListenableFuture<androidx.paging.RemoteMediator.MediatorResult> loadFuture(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state);
+  }
+
+}
+
diff --git a/paging/runtime/api/3.0.0-alpha04.txt b/paging/runtime/api/3.0.0-alpha04.txt
new file mode 100644
index 0000000..072f3457
--- /dev/null
+++ b/paging/runtime/api/3.0.0-alpha04.txt
@@ -0,0 +1,133 @@
+// Signature format: 3.0
+package androidx.paging {
+
+  @Deprecated public class AsyncPagedListDiffer<T> {
+    ctor @Deprecated public AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter<?> adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
+    ctor @Deprecated public AsyncPagedListDiffer(androidx.recyclerview.widget.ListUpdateCallback listUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T> config);
+    method @Deprecated public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+    method @Deprecated public void addPagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
+    method @Deprecated public final void addPagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
+    method @Deprecated public androidx.paging.PagedList<T>? getCurrentList();
+    method @Deprecated public T? getItem(int index);
+    method @Deprecated public int getItemCount();
+    method @Deprecated public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+    method @Deprecated public void removePagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
+    method @Deprecated public final void removePagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
+    method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList);
+    method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
+    property public androidx.paging.PagedList<T>? currentList;
+    property public int itemCount;
+  }
+
+  @Deprecated public static interface AsyncPagedListDiffer.PagedListListener<T> {
+    method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
+  }
+
+  public final class AsyncPagingDataDiffer<T> {
+    ctor public AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, androidx.recyclerview.widget.ListUpdateCallback updateCallback, kotlinx.coroutines.CoroutineDispatcher mainDispatcher, kotlinx.coroutines.CoroutineDispatcher workerDispatcher);
+    ctor public AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, androidx.recyclerview.widget.ListUpdateCallback updateCallback, kotlinx.coroutines.CoroutineDispatcher mainDispatcher);
+    ctor public AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, androidx.recyclerview.widget.ListUpdateCallback updateCallback);
+    method @androidx.paging.ExperimentalPagingApi public void addDataRefreshListener(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> listener);
+    method public void addLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+    method public kotlinx.coroutines.flow.Flow<java.lang.Boolean> getDataRefreshFlow();
+    method public T? getItem(int index);
+    method public int getItemCount();
+    method public kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> getLoadStateFlow();
+    method public void refresh();
+    method @androidx.paging.ExperimentalPagingApi public void removeDataRefreshListener(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> listener);
+    method public void removeLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+    method public void retry();
+    method public suspend Object? submitData(androidx.paging.PagingData<T> pagingData, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public void submitData(androidx.lifecycle.Lifecycle lifecycle, androidx.paging.PagingData<T> pagingData);
+    property public final kotlinx.coroutines.flow.Flow<java.lang.Boolean> dataRefreshFlow;
+    property public final int itemCount;
+    property public final kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> loadStateFlow;
+  }
+
+  @Deprecated public final class LivePagedListBuilder<Key, Value> {
+    ctor @Deprecated public LivePagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public LivePagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+    ctor @Deprecated public LivePagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public LivePagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, int pageSize);
+    method @Deprecated public androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> build();
+    method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+    method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setCoroutineScope(kotlinx.coroutines.CoroutineScope coroutineScope);
+    method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setFetchExecutor(java.util.concurrent.Executor fetchExecutor);
+    method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+  }
+
+  public final class LivePagedListKt {
+    method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
+    method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
+    method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, kotlinx.coroutines.CoroutineScope coroutineScope = GlobalScope, kotlinx.coroutines.CoroutineDispatcher fetchDispatcher = ArchTaskExecutor.getIOThreadExecutor().asCoroutineDispatcher());
+    method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, kotlinx.coroutines.CoroutineScope coroutineScope = GlobalScope, kotlinx.coroutines.CoroutineDispatcher fetchDispatcher = ArchTaskExecutor.getIOThreadExecutor().asCoroutineDispatcher());
+  }
+
+  public abstract class LoadStateAdapter<VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+    ctor public LoadStateAdapter();
+    method public boolean displayLoadStateAsItem(androidx.paging.LoadState loadState);
+    method public final int getItemCount();
+    method public final int getItemViewType(int position);
+    method public final androidx.paging.LoadState getLoadState();
+    method public int getStateViewType(androidx.paging.LoadState loadState);
+    method public final void onBindViewHolder(VH holder, int position);
+    method public abstract void onBindViewHolder(VH holder, androidx.paging.LoadState loadState);
+    method public final VH onCreateViewHolder(android.view.ViewGroup parent, int viewType);
+    method public abstract VH onCreateViewHolder(android.view.ViewGroup parent, androidx.paging.LoadState loadState);
+    method public final void setLoadState(androidx.paging.LoadState loadState);
+    property public final androidx.paging.LoadState loadState;
+  }
+
+  public final class NullPaddedListDiffHelperKt {
+  }
+
+  @Deprecated public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+    ctor @Deprecated protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
+    ctor @Deprecated protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
+    method @Deprecated public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+    method @Deprecated public androidx.paging.PagedList<T>? getCurrentList();
+    method @Deprecated protected T? getItem(int position);
+    method @Deprecated public int getItemCount();
+    method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? currentList);
+    method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
+    method @Deprecated public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+    method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList);
+    method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
+    method @Deprecated public final androidx.recyclerview.widget.ConcatAdapter withLoadStateFooter(androidx.paging.LoadStateAdapter<?> footer);
+    method @Deprecated public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeader(androidx.paging.LoadStateAdapter<?> header);
+    method @Deprecated public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeaderAndFooter(androidx.paging.LoadStateAdapter<?> header, androidx.paging.LoadStateAdapter<?> footer);
+    property public androidx.paging.PagedList<T>? currentList;
+  }
+
+  public abstract class PagingDataAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+    ctor public PagingDataAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, kotlinx.coroutines.CoroutineDispatcher mainDispatcher, kotlinx.coroutines.CoroutineDispatcher workerDispatcher);
+    ctor public PagingDataAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, kotlinx.coroutines.CoroutineDispatcher mainDispatcher);
+    ctor public PagingDataAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
+    method @androidx.paging.ExperimentalPagingApi public final void addDataRefreshListener(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> listener);
+    method public final void addLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+    method public final kotlinx.coroutines.flow.Flow<java.lang.Boolean> getDataRefreshFlow();
+    method protected final T? getItem(int position);
+    method public int getItemCount();
+    method public final long getItemId(int position);
+    method public final kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> getLoadStateFlow();
+    method public final void refresh();
+    method @androidx.paging.ExperimentalPagingApi public final void removeDataRefreshListener(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> listener);
+    method public final void removeLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+    method public final void retry();
+    method public final suspend Object? submitData(androidx.paging.PagingData<T> pagingData, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public final void submitData(androidx.lifecycle.Lifecycle lifecycle, androidx.paging.PagingData<T> pagingData);
+    method public final androidx.recyclerview.widget.ConcatAdapter withLoadStateFooter(androidx.paging.LoadStateAdapter<?> footer);
+    method public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeader(androidx.paging.LoadStateAdapter<?> header);
+    method public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeaderAndFooter(androidx.paging.LoadStateAdapter<?> header, androidx.paging.LoadStateAdapter<?> footer);
+    property public final kotlinx.coroutines.flow.Flow<java.lang.Boolean> dataRefreshFlow;
+    property public final kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> loadStateFlow;
+  }
+
+  public final class PagingLiveData {
+    method public static <T> androidx.lifecycle.LiveData<androidx.paging.PagingData<T>> cachedIn(androidx.lifecycle.LiveData<androidx.paging.PagingData<T>>, androidx.lifecycle.Lifecycle lifecycle);
+    method public static <T> androidx.lifecycle.LiveData<androidx.paging.PagingData<T>> cachedIn(androidx.lifecycle.LiveData<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+    method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagingData<Value>> getLiveData(androidx.paging.Pager<Key,Value>);
+  }
+
+}
+
diff --git a/paging/runtime/api/public_plus_experimental_3.0.0-alpha04.txt b/paging/runtime/api/public_plus_experimental_3.0.0-alpha04.txt
new file mode 100644
index 0000000..072f3457
--- /dev/null
+++ b/paging/runtime/api/public_plus_experimental_3.0.0-alpha04.txt
@@ -0,0 +1,133 @@
+// Signature format: 3.0
+package androidx.paging {
+
+  @Deprecated public class AsyncPagedListDiffer<T> {
+    ctor @Deprecated public AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter<?> adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
+    ctor @Deprecated public AsyncPagedListDiffer(androidx.recyclerview.widget.ListUpdateCallback listUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T> config);
+    method @Deprecated public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+    method @Deprecated public void addPagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
+    method @Deprecated public final void addPagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
+    method @Deprecated public androidx.paging.PagedList<T>? getCurrentList();
+    method @Deprecated public T? getItem(int index);
+    method @Deprecated public int getItemCount();
+    method @Deprecated public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+    method @Deprecated public void removePagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
+    method @Deprecated public final void removePagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
+    method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList);
+    method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
+    property public androidx.paging.PagedList<T>? currentList;
+    property public int itemCount;
+  }
+
+  @Deprecated public static interface AsyncPagedListDiffer.PagedListListener<T> {
+    method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
+  }
+
+  public final class AsyncPagingDataDiffer<T> {
+    ctor public AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, androidx.recyclerview.widget.ListUpdateCallback updateCallback, kotlinx.coroutines.CoroutineDispatcher mainDispatcher, kotlinx.coroutines.CoroutineDispatcher workerDispatcher);
+    ctor public AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, androidx.recyclerview.widget.ListUpdateCallback updateCallback, kotlinx.coroutines.CoroutineDispatcher mainDispatcher);
+    ctor public AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, androidx.recyclerview.widget.ListUpdateCallback updateCallback);
+    method @androidx.paging.ExperimentalPagingApi public void addDataRefreshListener(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> listener);
+    method public void addLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+    method public kotlinx.coroutines.flow.Flow<java.lang.Boolean> getDataRefreshFlow();
+    method public T? getItem(int index);
+    method public int getItemCount();
+    method public kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> getLoadStateFlow();
+    method public void refresh();
+    method @androidx.paging.ExperimentalPagingApi public void removeDataRefreshListener(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> listener);
+    method public void removeLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+    method public void retry();
+    method public suspend Object? submitData(androidx.paging.PagingData<T> pagingData, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public void submitData(androidx.lifecycle.Lifecycle lifecycle, androidx.paging.PagingData<T> pagingData);
+    property public final kotlinx.coroutines.flow.Flow<java.lang.Boolean> dataRefreshFlow;
+    property public final int itemCount;
+    property public final kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> loadStateFlow;
+  }
+
+  @Deprecated public final class LivePagedListBuilder<Key, Value> {
+    ctor @Deprecated public LivePagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public LivePagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+    ctor @Deprecated public LivePagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public LivePagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, int pageSize);
+    method @Deprecated public androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> build();
+    method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+    method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setCoroutineScope(kotlinx.coroutines.CoroutineScope coroutineScope);
+    method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setFetchExecutor(java.util.concurrent.Executor fetchExecutor);
+    method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+  }
+
+  public final class LivePagedListKt {
+    method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
+    method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
+    method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, kotlinx.coroutines.CoroutineScope coroutineScope = GlobalScope, kotlinx.coroutines.CoroutineDispatcher fetchDispatcher = ArchTaskExecutor.getIOThreadExecutor().asCoroutineDispatcher());
+    method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, kotlinx.coroutines.CoroutineScope coroutineScope = GlobalScope, kotlinx.coroutines.CoroutineDispatcher fetchDispatcher = ArchTaskExecutor.getIOThreadExecutor().asCoroutineDispatcher());
+  }
+
+  public abstract class LoadStateAdapter<VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+    ctor public LoadStateAdapter();
+    method public boolean displayLoadStateAsItem(androidx.paging.LoadState loadState);
+    method public final int getItemCount();
+    method public final int getItemViewType(int position);
+    method public final androidx.paging.LoadState getLoadState();
+    method public int getStateViewType(androidx.paging.LoadState loadState);
+    method public final void onBindViewHolder(VH holder, int position);
+    method public abstract void onBindViewHolder(VH holder, androidx.paging.LoadState loadState);
+    method public final VH onCreateViewHolder(android.view.ViewGroup parent, int viewType);
+    method public abstract VH onCreateViewHolder(android.view.ViewGroup parent, androidx.paging.LoadState loadState);
+    method public final void setLoadState(androidx.paging.LoadState loadState);
+    property public final androidx.paging.LoadState loadState;
+  }
+
+  public final class NullPaddedListDiffHelperKt {
+  }
+
+  @Deprecated public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+    ctor @Deprecated protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
+    ctor @Deprecated protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
+    method @Deprecated public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+    method @Deprecated public androidx.paging.PagedList<T>? getCurrentList();
+    method @Deprecated protected T? getItem(int position);
+    method @Deprecated public int getItemCount();
+    method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? currentList);
+    method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
+    method @Deprecated public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+    method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList);
+    method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
+    method @Deprecated public final androidx.recyclerview.widget.ConcatAdapter withLoadStateFooter(androidx.paging.LoadStateAdapter<?> footer);
+    method @Deprecated public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeader(androidx.paging.LoadStateAdapter<?> header);
+    method @Deprecated public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeaderAndFooter(androidx.paging.LoadStateAdapter<?> header, androidx.paging.LoadStateAdapter<?> footer);
+    property public androidx.paging.PagedList<T>? currentList;
+  }
+
+  public abstract class PagingDataAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+    ctor public PagingDataAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, kotlinx.coroutines.CoroutineDispatcher mainDispatcher, kotlinx.coroutines.CoroutineDispatcher workerDispatcher);
+    ctor public PagingDataAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, kotlinx.coroutines.CoroutineDispatcher mainDispatcher);
+    ctor public PagingDataAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
+    method @androidx.paging.ExperimentalPagingApi public final void addDataRefreshListener(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> listener);
+    method public final void addLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+    method public final kotlinx.coroutines.flow.Flow<java.lang.Boolean> getDataRefreshFlow();
+    method protected final T? getItem(int position);
+    method public int getItemCount();
+    method public final long getItemId(int position);
+    method public final kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> getLoadStateFlow();
+    method public final void refresh();
+    method @androidx.paging.ExperimentalPagingApi public final void removeDataRefreshListener(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> listener);
+    method public final void removeLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+    method public final void retry();
+    method public final suspend Object? submitData(androidx.paging.PagingData<T> pagingData, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public final void submitData(androidx.lifecycle.Lifecycle lifecycle, androidx.paging.PagingData<T> pagingData);
+    method public final androidx.recyclerview.widget.ConcatAdapter withLoadStateFooter(androidx.paging.LoadStateAdapter<?> footer);
+    method public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeader(androidx.paging.LoadStateAdapter<?> header);
+    method public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeaderAndFooter(androidx.paging.LoadStateAdapter<?> header, androidx.paging.LoadStateAdapter<?> footer);
+    property public final kotlinx.coroutines.flow.Flow<java.lang.Boolean> dataRefreshFlow;
+    property public final kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> loadStateFlow;
+  }
+
+  public final class PagingLiveData {
+    method public static <T> androidx.lifecycle.LiveData<androidx.paging.PagingData<T>> cachedIn(androidx.lifecycle.LiveData<androidx.paging.PagingData<T>>, androidx.lifecycle.Lifecycle lifecycle);
+    method public static <T> androidx.lifecycle.LiveData<androidx.paging.PagingData<T>> cachedIn(androidx.lifecycle.LiveData<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+    method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagingData<Value>> getLiveData(androidx.paging.Pager<Key,Value>);
+  }
+
+}
+
diff --git a/paging/runtime/api/res-3.0.0-alpha04.txt b/paging/runtime/api/res-3.0.0-alpha04.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/paging/runtime/api/res-3.0.0-alpha04.txt
diff --git a/paging/runtime/api/restricted_3.0.0-alpha04.txt b/paging/runtime/api/restricted_3.0.0-alpha04.txt
new file mode 100644
index 0000000..072f3457
--- /dev/null
+++ b/paging/runtime/api/restricted_3.0.0-alpha04.txt
@@ -0,0 +1,133 @@
+// Signature format: 3.0
+package androidx.paging {
+
+  @Deprecated public class AsyncPagedListDiffer<T> {
+    ctor @Deprecated public AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter<?> adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
+    ctor @Deprecated public AsyncPagedListDiffer(androidx.recyclerview.widget.ListUpdateCallback listUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T> config);
+    method @Deprecated public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+    method @Deprecated public void addPagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
+    method @Deprecated public final void addPagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
+    method @Deprecated public androidx.paging.PagedList<T>? getCurrentList();
+    method @Deprecated public T? getItem(int index);
+    method @Deprecated public int getItemCount();
+    method @Deprecated public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+    method @Deprecated public void removePagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
+    method @Deprecated public final void removePagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
+    method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList);
+    method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
+    property public androidx.paging.PagedList<T>? currentList;
+    property public int itemCount;
+  }
+
+  @Deprecated public static interface AsyncPagedListDiffer.PagedListListener<T> {
+    method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
+  }
+
+  public final class AsyncPagingDataDiffer<T> {
+    ctor public AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, androidx.recyclerview.widget.ListUpdateCallback updateCallback, kotlinx.coroutines.CoroutineDispatcher mainDispatcher, kotlinx.coroutines.CoroutineDispatcher workerDispatcher);
+    ctor public AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, androidx.recyclerview.widget.ListUpdateCallback updateCallback, kotlinx.coroutines.CoroutineDispatcher mainDispatcher);
+    ctor public AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, androidx.recyclerview.widget.ListUpdateCallback updateCallback);
+    method @androidx.paging.ExperimentalPagingApi public void addDataRefreshListener(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> listener);
+    method public void addLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+    method public kotlinx.coroutines.flow.Flow<java.lang.Boolean> getDataRefreshFlow();
+    method public T? getItem(int index);
+    method public int getItemCount();
+    method public kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> getLoadStateFlow();
+    method public void refresh();
+    method @androidx.paging.ExperimentalPagingApi public void removeDataRefreshListener(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> listener);
+    method public void removeLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+    method public void retry();
+    method public suspend Object? submitData(androidx.paging.PagingData<T> pagingData, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public void submitData(androidx.lifecycle.Lifecycle lifecycle, androidx.paging.PagingData<T> pagingData);
+    property public final kotlinx.coroutines.flow.Flow<java.lang.Boolean> dataRefreshFlow;
+    property public final int itemCount;
+    property public final kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> loadStateFlow;
+  }
+
+  @Deprecated public final class LivePagedListBuilder<Key, Value> {
+    ctor @Deprecated public LivePagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public LivePagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+    ctor @Deprecated public LivePagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public LivePagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, int pageSize);
+    method @Deprecated public androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> build();
+    method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+    method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setCoroutineScope(kotlinx.coroutines.CoroutineScope coroutineScope);
+    method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setFetchExecutor(java.util.concurrent.Executor fetchExecutor);
+    method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+  }
+
+  public final class LivePagedListKt {
+    method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
+    method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
+    method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, kotlinx.coroutines.CoroutineScope coroutineScope = GlobalScope, kotlinx.coroutines.CoroutineDispatcher fetchDispatcher = ArchTaskExecutor.getIOThreadExecutor().asCoroutineDispatcher());
+    method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, kotlinx.coroutines.CoroutineScope coroutineScope = GlobalScope, kotlinx.coroutines.CoroutineDispatcher fetchDispatcher = ArchTaskExecutor.getIOThreadExecutor().asCoroutineDispatcher());
+  }
+
+  public abstract class LoadStateAdapter<VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+    ctor public LoadStateAdapter();
+    method public boolean displayLoadStateAsItem(androidx.paging.LoadState loadState);
+    method public final int getItemCount();
+    method public final int getItemViewType(int position);
+    method public final androidx.paging.LoadState getLoadState();
+    method public int getStateViewType(androidx.paging.LoadState loadState);
+    method public final void onBindViewHolder(VH holder, int position);
+    method public abstract void onBindViewHolder(VH holder, androidx.paging.LoadState loadState);
+    method public final VH onCreateViewHolder(android.view.ViewGroup parent, int viewType);
+    method public abstract VH onCreateViewHolder(android.view.ViewGroup parent, androidx.paging.LoadState loadState);
+    method public final void setLoadState(androidx.paging.LoadState loadState);
+    property public final androidx.paging.LoadState loadState;
+  }
+
+  public final class NullPaddedListDiffHelperKt {
+  }
+
+  @Deprecated public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+    ctor @Deprecated protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
+    ctor @Deprecated protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
+    method @Deprecated public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+    method @Deprecated public androidx.paging.PagedList<T>? getCurrentList();
+    method @Deprecated protected T? getItem(int position);
+    method @Deprecated public int getItemCount();
+    method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? currentList);
+    method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
+    method @Deprecated public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+    method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList);
+    method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
+    method @Deprecated public final androidx.recyclerview.widget.ConcatAdapter withLoadStateFooter(androidx.paging.LoadStateAdapter<?> footer);
+    method @Deprecated public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeader(androidx.paging.LoadStateAdapter<?> header);
+    method @Deprecated public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeaderAndFooter(androidx.paging.LoadStateAdapter<?> header, androidx.paging.LoadStateAdapter<?> footer);
+    property public androidx.paging.PagedList<T>? currentList;
+  }
+
+  public abstract class PagingDataAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+    ctor public PagingDataAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, kotlinx.coroutines.CoroutineDispatcher mainDispatcher, kotlinx.coroutines.CoroutineDispatcher workerDispatcher);
+    ctor public PagingDataAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, kotlinx.coroutines.CoroutineDispatcher mainDispatcher);
+    ctor public PagingDataAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
+    method @androidx.paging.ExperimentalPagingApi public final void addDataRefreshListener(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> listener);
+    method public final void addLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+    method public final kotlinx.coroutines.flow.Flow<java.lang.Boolean> getDataRefreshFlow();
+    method protected final T? getItem(int position);
+    method public int getItemCount();
+    method public final long getItemId(int position);
+    method public final kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> getLoadStateFlow();
+    method public final void refresh();
+    method @androidx.paging.ExperimentalPagingApi public final void removeDataRefreshListener(kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> listener);
+    method public final void removeLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+    method public final void retry();
+    method public final suspend Object? submitData(androidx.paging.PagingData<T> pagingData, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public final void submitData(androidx.lifecycle.Lifecycle lifecycle, androidx.paging.PagingData<T> pagingData);
+    method public final androidx.recyclerview.widget.ConcatAdapter withLoadStateFooter(androidx.paging.LoadStateAdapter<?> footer);
+    method public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeader(androidx.paging.LoadStateAdapter<?> header);
+    method public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeaderAndFooter(androidx.paging.LoadStateAdapter<?> header, androidx.paging.LoadStateAdapter<?> footer);
+    property public final kotlinx.coroutines.flow.Flow<java.lang.Boolean> dataRefreshFlow;
+    property public final kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> loadStateFlow;
+  }
+
+  public final class PagingLiveData {
+    method public static <T> androidx.lifecycle.LiveData<androidx.paging.PagingData<T>> cachedIn(androidx.lifecycle.LiveData<androidx.paging.PagingData<T>>, androidx.lifecycle.Lifecycle lifecycle);
+    method public static <T> androidx.lifecycle.LiveData<androidx.paging.PagingData<T>> cachedIn(androidx.lifecycle.LiveData<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+    method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagingData<Value>> getLiveData(androidx.paging.Pager<Key,Value>);
+  }
+
+}
+
diff --git a/paging/runtime/ktx/api/3.0.0-alpha04.txt b/paging/runtime/ktx/api/3.0.0-alpha04.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/paging/runtime/ktx/api/3.0.0-alpha04.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/paging/runtime/ktx/api/public_plus_experimental_3.0.0-alpha04.txt b/paging/runtime/ktx/api/public_plus_experimental_3.0.0-alpha04.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/paging/runtime/ktx/api/public_plus_experimental_3.0.0-alpha04.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/paging/runtime/ktx/api/res-3.0.0-alpha04.txt b/paging/runtime/ktx/api/res-3.0.0-alpha04.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/paging/runtime/ktx/api/res-3.0.0-alpha04.txt
diff --git a/paging/runtime/ktx/api/restricted_3.0.0-alpha04.txt b/paging/runtime/ktx/api/restricted_3.0.0-alpha04.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/paging/runtime/ktx/api/restricted_3.0.0-alpha04.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/paging/rxjava2/api/3.0.0-alpha04.txt b/paging/rxjava2/api/3.0.0-alpha04.txt
new file mode 100644
index 0000000..4923f87
--- /dev/null
+++ b/paging/rxjava2/api/3.0.0-alpha04.txt
@@ -0,0 +1,54 @@
+// Signature format: 3.0
+package androidx.paging {
+
+  @Deprecated public final class RxPagedListBuilder<Key, Value> {
+    ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, int pageSize);
+    ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+    method @Deprecated public io.reactivex.Flowable<androidx.paging.PagedList<Value>> buildFlowable(io.reactivex.BackpressureStrategy backpressureStrategy);
+    method @Deprecated public io.reactivex.Observable<androidx.paging.PagedList<Value>> buildObservable();
+    method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+    method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setFetchScheduler(io.reactivex.Scheduler scheduler);
+    method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+    method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setNotifyScheduler(io.reactivex.Scheduler scheduler);
+  }
+
+  public final class RxPagedListKt {
+    method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null, io.reactivex.BackpressureStrategy backpressureStrategy = io.reactivex.BackpressureStrategy.LATEST);
+    method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null, io.reactivex.BackpressureStrategy backpressureStrategy = io.reactivex.BackpressureStrategy.LATEST);
+    method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null, io.reactivex.BackpressureStrategy backpressureStrategy = io.reactivex.BackpressureStrategy.LATEST);
+    method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null, io.reactivex.BackpressureStrategy backpressureStrategy = io.reactivex.BackpressureStrategy.LATEST);
+    method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null);
+    method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null);
+    method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null);
+    method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null);
+  }
+
+}
+
+package androidx.paging.rxjava2 {
+
+  public final class PagingRx {
+    method public static <T> io.reactivex.Observable<androidx.paging.PagingData<T>> cachedIn(io.reactivex.Observable<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+    method public static <T> io.reactivex.Flowable<androidx.paging.PagingData<T>> cachedIn(io.reactivex.Flowable<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+    method public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagingData<Value>> getFlowable(androidx.paging.Pager<Key,Value>);
+    method public static <Key, Value> io.reactivex.Observable<androidx.paging.PagingData<Value>> getObservable(androidx.paging.Pager<Key,Value>);
+  }
+
+  public abstract class RxPagingSource<Key, Value> extends androidx.paging.PagingSource<Key,Value> {
+    ctor public RxPagingSource();
+    method public final suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
+    method public abstract io.reactivex.Single<androidx.paging.PagingSource.LoadResult<Key,Value>> loadSingle(androidx.paging.PagingSource.LoadParams<Key> params);
+  }
+
+  @androidx.paging.ExperimentalPagingApi public abstract class RxRemoteMediator<Key, Value> extends androidx.paging.RemoteMediator<Key,Value> {
+    ctor public RxRemoteMediator();
+    method public final suspend Object? initialize(kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.InitializeAction> p);
+    method public io.reactivex.Single<androidx.paging.RemoteMediator.InitializeAction> initializeSingle();
+    method public final 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 io.reactivex.Single<androidx.paging.RemoteMediator.MediatorResult> loadSingle(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state);
+  }
+
+}
+
diff --git a/paging/rxjava2/api/public_plus_experimental_3.0.0-alpha04.txt b/paging/rxjava2/api/public_plus_experimental_3.0.0-alpha04.txt
new file mode 100644
index 0000000..4923f87
--- /dev/null
+++ b/paging/rxjava2/api/public_plus_experimental_3.0.0-alpha04.txt
@@ -0,0 +1,54 @@
+// Signature format: 3.0
+package androidx.paging {
+
+  @Deprecated public final class RxPagedListBuilder<Key, Value> {
+    ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, int pageSize);
+    ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+    method @Deprecated public io.reactivex.Flowable<androidx.paging.PagedList<Value>> buildFlowable(io.reactivex.BackpressureStrategy backpressureStrategy);
+    method @Deprecated public io.reactivex.Observable<androidx.paging.PagedList<Value>> buildObservable();
+    method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+    method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setFetchScheduler(io.reactivex.Scheduler scheduler);
+    method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+    method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setNotifyScheduler(io.reactivex.Scheduler scheduler);
+  }
+
+  public final class RxPagedListKt {
+    method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null, io.reactivex.BackpressureStrategy backpressureStrategy = io.reactivex.BackpressureStrategy.LATEST);
+    method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null, io.reactivex.BackpressureStrategy backpressureStrategy = io.reactivex.BackpressureStrategy.LATEST);
+    method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null, io.reactivex.BackpressureStrategy backpressureStrategy = io.reactivex.BackpressureStrategy.LATEST);
+    method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null, io.reactivex.BackpressureStrategy backpressureStrategy = io.reactivex.BackpressureStrategy.LATEST);
+    method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null);
+    method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null);
+    method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null);
+    method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null);
+  }
+
+}
+
+package androidx.paging.rxjava2 {
+
+  public final class PagingRx {
+    method public static <T> io.reactivex.Observable<androidx.paging.PagingData<T>> cachedIn(io.reactivex.Observable<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+    method public static <T> io.reactivex.Flowable<androidx.paging.PagingData<T>> cachedIn(io.reactivex.Flowable<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+    method public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagingData<Value>> getFlowable(androidx.paging.Pager<Key,Value>);
+    method public static <Key, Value> io.reactivex.Observable<androidx.paging.PagingData<Value>> getObservable(androidx.paging.Pager<Key,Value>);
+  }
+
+  public abstract class RxPagingSource<Key, Value> extends androidx.paging.PagingSource<Key,Value> {
+    ctor public RxPagingSource();
+    method public final suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
+    method public abstract io.reactivex.Single<androidx.paging.PagingSource.LoadResult<Key,Value>> loadSingle(androidx.paging.PagingSource.LoadParams<Key> params);
+  }
+
+  @androidx.paging.ExperimentalPagingApi public abstract class RxRemoteMediator<Key, Value> extends androidx.paging.RemoteMediator<Key,Value> {
+    ctor public RxRemoteMediator();
+    method public final suspend Object? initialize(kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.InitializeAction> p);
+    method public io.reactivex.Single<androidx.paging.RemoteMediator.InitializeAction> initializeSingle();
+    method public final 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 io.reactivex.Single<androidx.paging.RemoteMediator.MediatorResult> loadSingle(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state);
+  }
+
+}
+
diff --git a/paging/rxjava2/api/res-3.0.0-alpha04.txt b/paging/rxjava2/api/res-3.0.0-alpha04.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/paging/rxjava2/api/res-3.0.0-alpha04.txt
diff --git a/paging/rxjava2/api/restricted_3.0.0-alpha04.txt b/paging/rxjava2/api/restricted_3.0.0-alpha04.txt
new file mode 100644
index 0000000..4923f87
--- /dev/null
+++ b/paging/rxjava2/api/restricted_3.0.0-alpha04.txt
@@ -0,0 +1,54 @@
+// Signature format: 3.0
+package androidx.paging {
+
+  @Deprecated public final class RxPagedListBuilder<Key, Value> {
+    ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, int pageSize);
+    ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+    method @Deprecated public io.reactivex.Flowable<androidx.paging.PagedList<Value>> buildFlowable(io.reactivex.BackpressureStrategy backpressureStrategy);
+    method @Deprecated public io.reactivex.Observable<androidx.paging.PagedList<Value>> buildObservable();
+    method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+    method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setFetchScheduler(io.reactivex.Scheduler scheduler);
+    method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+    method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setNotifyScheduler(io.reactivex.Scheduler scheduler);
+  }
+
+  public final class RxPagedListKt {
+    method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null, io.reactivex.BackpressureStrategy backpressureStrategy = io.reactivex.BackpressureStrategy.LATEST);
+    method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null, io.reactivex.BackpressureStrategy backpressureStrategy = io.reactivex.BackpressureStrategy.LATEST);
+    method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null, io.reactivex.BackpressureStrategy backpressureStrategy = io.reactivex.BackpressureStrategy.LATEST);
+    method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null, io.reactivex.BackpressureStrategy backpressureStrategy = io.reactivex.BackpressureStrategy.LATEST);
+    method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null);
+    method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null);
+    method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null);
+    method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null);
+  }
+
+}
+
+package androidx.paging.rxjava2 {
+
+  public final class PagingRx {
+    method public static <T> io.reactivex.Observable<androidx.paging.PagingData<T>> cachedIn(io.reactivex.Observable<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+    method public static <T> io.reactivex.Flowable<androidx.paging.PagingData<T>> cachedIn(io.reactivex.Flowable<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+    method public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagingData<Value>> getFlowable(androidx.paging.Pager<Key,Value>);
+    method public static <Key, Value> io.reactivex.Observable<androidx.paging.PagingData<Value>> getObservable(androidx.paging.Pager<Key,Value>);
+  }
+
+  public abstract class RxPagingSource<Key, Value> extends androidx.paging.PagingSource<Key,Value> {
+    ctor public RxPagingSource();
+    method public final suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
+    method public abstract io.reactivex.Single<androidx.paging.PagingSource.LoadResult<Key,Value>> loadSingle(androidx.paging.PagingSource.LoadParams<Key> params);
+  }
+
+  @androidx.paging.ExperimentalPagingApi public abstract class RxRemoteMediator<Key, Value> extends androidx.paging.RemoteMediator<Key,Value> {
+    ctor public RxRemoteMediator();
+    method public final suspend Object? initialize(kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.InitializeAction> p);
+    method public io.reactivex.Single<androidx.paging.RemoteMediator.InitializeAction> initializeSingle();
+    method public final 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 io.reactivex.Single<androidx.paging.RemoteMediator.MediatorResult> loadSingle(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state);
+  }
+
+}
+
diff --git a/paging/rxjava2/ktx/api/3.0.0-alpha04.txt b/paging/rxjava2/ktx/api/3.0.0-alpha04.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/paging/rxjava2/ktx/api/3.0.0-alpha04.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/paging/rxjava2/ktx/api/public_plus_experimental_3.0.0-alpha04.txt b/paging/rxjava2/ktx/api/public_plus_experimental_3.0.0-alpha04.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/paging/rxjava2/ktx/api/public_plus_experimental_3.0.0-alpha04.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/paging/rxjava2/ktx/api/res-3.0.0-alpha04.txt b/paging/rxjava2/ktx/api/res-3.0.0-alpha04.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/paging/rxjava2/ktx/api/res-3.0.0-alpha04.txt
diff --git a/paging/rxjava2/ktx/api/restricted_3.0.0-alpha04.txt b/paging/rxjava2/ktx/api/restricted_3.0.0-alpha04.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/paging/rxjava2/ktx/api/restricted_3.0.0-alpha04.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/playground-common/idea.properties b/playground-common/idea.properties
new file mode 100644
index 0000000..2e9bff1
--- /dev/null
+++ b/playground-common/idea.properties
@@ -0,0 +1,192 @@
+# Use ${idea.home.path} macro to specify location relative to IDE installation home.
+# Use ${xxx} where xxx is any Java property (including defined in previous lines of this file) to refer to its value.
+# Note for Windows users: please make sure you're using forward slashes (e.g. c:/idea/system).
+
+#---------------------------------------------------------------------
+# Uncomment this option if you want to customize path to IDE config folder. Make sure you're using forward slashes.
+#---------------------------------------------------------------------
+idea.config.path=${user.home}/.AndroidStudioAndroidXPlayground/config
+
+#---------------------------------------------------------------------
+# Uncomment this option if you want to customize path to IDE system folder. Make sure you're using forward slashes.
+#---------------------------------------------------------------------
+idea.system.path=${user.home}/.AndroidStudioAndroidXPlayground/system
+
+#---------------------------------------------------------------------
+# Uncomment this option if you want to customize path to user installed plugins folder. Make sure you're using forward slashes.
+#---------------------------------------------------------------------
+idea.plugins.path=${idea.config.path}/plugins
+
+#---------------------------------------------------------------------
+# Uncomment this option if you want to customize path to IDE logs folder. Make sure you're using forward slashes.
+#---------------------------------------------------------------------
+idea.log.path=${idea.system.path}/log
+
+#---------------------------------------------------------------------
+# Maximum file size (kilobytes) IDE should provide code assistance for.
+# The larger file is the slower its editor works and higher overall system memory requirements are
+# if code assistance is enabled. Remove this property or set to very large number if you need
+# code assistance for any files available regardless their size.
+#---------------------------------------------------------------------
+idea.max.intellisense.filesize=2500
+
+#---------------------------------------------------------------------
+# Maximum file size (kilobytes) IDE is able to open.
+#---------------------------------------------------------------------
+idea.max.content.load.filesize=20000
+
+#---------------------------------------------------------------------
+# This option controls console cyclic buffer: keeps the console output size not higher than the specified buffer size (Kb).
+# Older lines are deleted. In order to disable cycle buffer use idea.cycle.buffer.size=disabled
+#---------------------------------------------------------------------
+idea.cycle.buffer.size=1024
+
+#---------------------------------------------------------------------
+# Configure if a special launcher should be used when running processes from within IDE.
+# Using Launcher enables "soft exit" and "thread dump" features
+#---------------------------------------------------------------------
+idea.no.launcher=false
+
+#---------------------------------------------------------------------
+# To avoid too long classpath
+#---------------------------------------------------------------------
+idea.dynamic.classpath=false
+
+#---------------------------------------------------------------------
+# Uncomment this property to prevent IDE from throwing ProcessCanceledException when user activity
+# detected. This option is only useful for plugin developers, while debugging PSI related activities
+# performed in background error analysis thread.
+# DO NOT UNCOMMENT THIS UNLESS YOU'RE DEBUGGING IDE ITSELF. Significant slowdowns and lockups will happen otherwise.
+#---------------------------------------------------------------------
+#idea.ProcessCanceledException=disabled
+
+#---------------------------------------------------------------------
+# There are two possible values of idea.popup.weight property: "heavy" and "medium".
+# If you have WM configured as "Focus follows mouse with Auto Raise" then you have to
+# set this property to "medium". It prevents problems with popup menus on some
+# configurations.
+#---------------------------------------------------------------------
+idea.popup.weight=heavy
+
+#---------------------------------------------------------------------
+# Removing this property may lead to editor performance degradation under Windows.
+#---------------------------------------------------------------------
+sun.java2d.d3d=false
+
+#---------------------------------------------------------------------
+# Set swing.bufferPerWindow=false to workaround a slow scrolling in JDK6 (see IDEA-35883),
+# But this may lead to performance degradation in JDK8, because it disables a double buffering,
+# which is needed to eliminate tearing on blit-accelerated scrolling and to restore
+# a frame buffer content without the usual repainting, even when the EDT is blocked.
+#---------------------------------------------------------------------
+swing.bufferPerWindow=true
+
+#---------------------------------------------------------------------
+# Removing this property may lead to editor performance degradation under X Window.
+#---------------------------------------------------------------------
+sun.java2d.pmoffscreen=false
+
+#---------------------------------------------------------------------
+# Enables HiDPI support in JBRE
+#---------------------------------------------------------------------
+sun.java2d.uiScale.enabled=true
+
+#---------------------------------------------------------------------
+# Applicable to the Swing text components displaying HTML (except JEditorPane).
+# Rebases CSS size map depending on the component's font size to let relative
+# font size values (smaller, larger) scale properly. JBRE only.
+#---------------------------------------------------------------------
+javax.swing.rebaseCssSizeMap=true
+
+#---------------------------------------------------------------------
+# Workaround to avoid long hangs while accessing clipboard under Mac OS X.
+#---------------------------------------------------------------------
+#ide.mac.useNativeClipboard=True
+
+#---------------------------------------------------------------------
+# Maximum size (kilobytes) IDEA will load for showing past file contents -
+# in Show Diff or when calculating Digest Diff
+#---------------------------------------------------------------------
+#idea.max.vcs.loaded.size.kb=20480
+
+#---------------------------------------------------------------------
+# IDEA file chooser peeks inside directories to detect whether they contain a valid project
+# (to mark such directories with a corresponding icon).
+# Uncommenting the option prevents this behavior outside of user home directory.
+#---------------------------------------------------------------------
+#idea.chooser.lookup.for.project.dirs=false
+
+#-----------------------------------------------------------------------
+# Experimental option that does a number of things to make truly smooth scrolling possible:
+#
+# * Enables hardware-accelerated scrolling.
+#     Blit-acceleration copies as much of the rendered area as possible and then repaints only newly exposed region.
+#     This helps to improve scrolling performance and to reduce CPU usage (especially if drawing is compute-intensive).
+#
+# * Enables "true double buffering".
+#     True double buffering is needed to eliminate tearing on blit-accelerated scrolling and to restore
+#     frame buffer content without the usual repainting, even when the EDT is blocked.
+#
+# * Adds "idea.true.smooth.scrolling.debug" option.
+#     Checks whether blit-accelerated scrolling is feasible, and if so, checks whether true double buffering is available.
+#
+# * Enables handling of high-precision mouse wheel events.
+#     Although Java 7 introduced MouseWheelEven.getPreciseWheelRotation() method, JScrollPane doesn't use it so far.
+#     Depends on the Editor / General / Smooth Scrolling setting, remote desktop detection and power save mode state.
+#     Ideally, we need to patch the runtime (on Windows, Linux and Mac OS) to improve handling of the fine-grained input data.
+#     This feature can be toggled via "idea.true.smooth.scrolling.high.precision" option.
+#
+# * Enables handling of pixel-perfect scrolling events.
+#     Currently this mode is available only under Mac OS with JetBrains Runtime.
+#     This feature can be toggled via "idea.true.smooth.scrolling.pixel.perfect" option.
+#
+# * Enables interpolation of scrolling input (scrollbar, mouse wheel, touchpad, keys, etc).
+#     Smooths input which lacks both spatial and temporal resolution, performs the rendering asynchronously.
+#     Depends on the Editor / General / Smooth Scrolling setting, remote desktop detection and power save mode state.
+#     The feature can be tweaked using the following options:
+#       "idea.true.smooth.scrolling.interpolation" - the main switch
+#       "idea.true.smooth.scrolling.interpolation.scrollbar" - scrollbar interpolation
+#       "idea.true.smooth.scrolling.interpolation.scrollbar.delay" - initial delay for scrollbar interpolation (ms)
+#       "idea.true.smooth.scrolling.interpolation.mouse.wheel" - mouse wheel / touchpad interpolation
+#       "idea.true.smooth.scrolling.interpolation.mouse.wheel.delay.min" - minimum initial delay for mouse wheel interpolation (ms)
+#       "idea.true.smooth.scrolling.interpolation.mouse.wheel.delay.max" - maximum initial delay for mouse wheel interpolation (ms)
+#       "idea.true.smooth.scrolling.interpolation.precision.touchpad" - precision touchpad interpolation
+#       "idea.true.smooth.scrolling.interpolation.precision.touchpad.delay" - initial delay for precision touchpad interpolation (ms)
+#       "idea.true.smooth.scrolling.interpolation.other" - interpolation of other input sources
+#       "idea.true.smooth.scrolling.interpolation.other.delay" - initial delay for other input source interpolation (ms)
+#
+# * Adds on-demand horizontal scrollbar in editor.
+#     The horizontal scrollbar is shown only when it's actually needed for currently visible content.
+#     This helps to save editor space and to prevent occasional horizontal "jitter" on vertical touchpad scrolling.
+#     This feature can be toggled via "idea.true.smooth.scrolling.dynamic.scrollbars" option.
+#-----------------------------------------------------------------------
+#idea.true.smooth.scrolling=true
+
+#---------------------------------------------------------------------
+# IDEA can copy library .jar files to prevent their locking.
+# By default this behavior is enabled on Windows and disabled on other platforms.
+# Uncomment this property to override.
+#---------------------------------------------------------------------
+# idea.jars.nocopy=false
+
+#---------------------------------------------------------------------
+# The VM option value to be used to start a JVM in debug mode.
+# Some JREs define it in a different way (-XXdebug in Oracle VM)
+#---------------------------------------------------------------------
+idea.xdebug.key=-Xdebug
+
+#-----------------------------------------------------------------------
+# Change to 'disabled' if you don't want to receive instant visual notifications
+# about fatal errors that happen to an IDE or plugins installed.
+#-----------------------------------------------------------------------
+idea.fatal.error.notification=enabled
+
+#-----------------------------------------------------------------------
+# Enable internal actions menu
+#-----------------------------------------------------------------------
+idea.is.internal=false
+
+#-----------------------------------------------------------------------
+# Disable automatic update checks
+#-----------------------------------------------------------------------
+ide.no.platform.update=true
diff --git a/playground-common/playground-include-settings.gradle b/playground-common/playground-include-settings.gradle
index 82e0cf3..b8ec5d7 100644
--- a/playground-common/playground-include-settings.gradle
+++ b/playground-common/playground-include-settings.gradle
@@ -100,3 +100,21 @@
 ext.includeProject = this.&includeProject
 ext.selectProjectsFromAndroidX = this.&selectProjectsFromAndroidX
 ext.setupPlayground = this.&setupPlayground
+
+// validate JVM version to print an understandable error if it is not set to the
+// required value (11)
+def jvmVersion = System.getProperty("java.vm.specification.version")
+if (jvmVersion != "11") {
+    def guidance;
+    if (startParameter.projectProperties.containsKey('android.injected.invoked.from.ide')) {
+        guidance = "Make sure to set the gradle JDK to JDK 11 in the project settings." +
+                   "(File -> Project Structure)"
+    } else {
+        guidance = "Make sure your JAVA_HOME environment variable points to Java 11 JDK."
+    }
+    throw new IllegalStateException("""
+            AndroidX build must be invoked with JDK 11.
+            $guidance
+            Current version: $jvmVersion
+            Current JAVA HOME: ${System.getProperty("java.home")}""".stripIndent());
+}
diff --git a/playground-common/studio.vmoptions b/playground-common/studio.vmoptions
new file mode 100644
index 0000000..1b3bd90
--- /dev/null
+++ b/playground-common/studio.vmoptions
@@ -0,0 +1 @@
+-Xmx4g
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 94dbd3e..d74b490 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
@@ -26,7 +26,8 @@
 import androidx.ui.foundation.Icon
 import androidx.ui.foundation.ScrollableColumn
 import androidx.ui.foundation.Text
-import androidx.ui.foundation.TextField
+import androidx.ui.foundation.BaseTextField
+import androidx.ui.foundation.ExperimentalFoundationApi
 import androidx.ui.graphics.compositeOver
 import androidx.ui.input.TextFieldValue
 import androidx.ui.layout.fillMaxWidth
@@ -94,9 +95,10 @@
 }
 
 /**
- * [TextField] that edits the current [filterText], providing [onFilter] when edited.
+ * [BaseTextField] that edits the current [filterText], providing [onFilter] when edited.
  */
 @Composable
+@OptIn(ExperimentalFoundationApi::class)
 private fun FilterField(
     filterText: TextFieldValue,
     onFilter: (TextFieldValue) -> Unit,
@@ -106,7 +108,7 @@
     @Suppress("DEPRECATION")
     val focusModifier = FocusModifier()
     // TODO: replace with Material text field when available
-    TextField(
+    BaseTextField(
         modifier = modifier + focusModifier,
         value = filterText,
         >
diff --git a/ui/ui-core/api/0.1.0-dev16.txt b/ui/ui-core/api/0.1.0-dev16.txt
index 6e7a200..2798289 100644
--- a/ui/ui-core/api/0.1.0-dev16.txt
+++ b/ui/ui-core/api/0.1.0-dev16.txt
@@ -2331,6 +2331,7 @@
 
   public final class SemanticsActions {
     method public androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.CustomAccessibilityAction>> getCustomActions();
+    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
     method @Deprecated public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getScrollBackward();
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> getScrollBy();
@@ -2339,6 +2340,7 @@
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> getSetSelection();
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.ui.text.AnnotatedString,java.lang.Boolean>>> getSetText();
     property public final androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.CustomAccessibilityAction>> CustomActions;
+    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.ui.text.TextLayoutResult>,java.lang.Boolean>>> GetTextLayoutResult;
     property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnClick;
     property @Deprecated public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> ScrollBackward;
     property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> ScrollBy;
@@ -2382,6 +2384,7 @@
     method public static boolean getFocused(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static String getTestTag(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static androidx.ui.text.AnnotatedString getText(androidx.ui.semantics.SemanticsPropertyReceiver);
+    method public static void getTextLayoutResult(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.text.TextLayoutResult>,java.lang.Boolean> action);
     method public static androidx.ui.text.TextRange getTextSelectionRange(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static void hidden(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static void onClick(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
diff --git a/ui/ui-core/api/current.txt b/ui/ui-core/api/current.txt
index 6e7a200..2798289 100644
--- a/ui/ui-core/api/current.txt
+++ b/ui/ui-core/api/current.txt
@@ -2331,6 +2331,7 @@
 
   public final class SemanticsActions {
     method public androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.CustomAccessibilityAction>> getCustomActions();
+    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
     method @Deprecated public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getScrollBackward();
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> getScrollBy();
@@ -2339,6 +2340,7 @@
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> getSetSelection();
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.ui.text.AnnotatedString,java.lang.Boolean>>> getSetText();
     property public final androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.CustomAccessibilityAction>> CustomActions;
+    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.ui.text.TextLayoutResult>,java.lang.Boolean>>> GetTextLayoutResult;
     property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnClick;
     property @Deprecated public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> ScrollBackward;
     property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> ScrollBy;
@@ -2382,6 +2384,7 @@
     method public static boolean getFocused(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static String getTestTag(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static androidx.ui.text.AnnotatedString getText(androidx.ui.semantics.SemanticsPropertyReceiver);
+    method public static void getTextLayoutResult(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.text.TextLayoutResult>,java.lang.Boolean> action);
     method public static androidx.ui.text.TextRange getTextSelectionRange(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static void hidden(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static void onClick(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
diff --git a/ui/ui-core/api/public_plus_experimental_0.1.0-dev16.txt b/ui/ui-core/api/public_plus_experimental_0.1.0-dev16.txt
index 6e7a200..2798289 100644
--- a/ui/ui-core/api/public_plus_experimental_0.1.0-dev16.txt
+++ b/ui/ui-core/api/public_plus_experimental_0.1.0-dev16.txt
@@ -2331,6 +2331,7 @@
 
   public final class SemanticsActions {
     method public androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.CustomAccessibilityAction>> getCustomActions();
+    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
     method @Deprecated public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getScrollBackward();
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> getScrollBy();
@@ -2339,6 +2340,7 @@
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> getSetSelection();
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.ui.text.AnnotatedString,java.lang.Boolean>>> getSetText();
     property public final androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.CustomAccessibilityAction>> CustomActions;
+    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.ui.text.TextLayoutResult>,java.lang.Boolean>>> GetTextLayoutResult;
     property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnClick;
     property @Deprecated public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> ScrollBackward;
     property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> ScrollBy;
@@ -2382,6 +2384,7 @@
     method public static boolean getFocused(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static String getTestTag(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static androidx.ui.text.AnnotatedString getText(androidx.ui.semantics.SemanticsPropertyReceiver);
+    method public static void getTextLayoutResult(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.text.TextLayoutResult>,java.lang.Boolean> action);
     method public static androidx.ui.text.TextRange getTextSelectionRange(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static void hidden(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static void onClick(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
diff --git a/ui/ui-core/api/public_plus_experimental_current.txt b/ui/ui-core/api/public_plus_experimental_current.txt
index 6e7a200..2798289 100644
--- a/ui/ui-core/api/public_plus_experimental_current.txt
+++ b/ui/ui-core/api/public_plus_experimental_current.txt
@@ -2331,6 +2331,7 @@
 
   public final class SemanticsActions {
     method public androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.CustomAccessibilityAction>> getCustomActions();
+    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
     method @Deprecated public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getScrollBackward();
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> getScrollBy();
@@ -2339,6 +2340,7 @@
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> getSetSelection();
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.ui.text.AnnotatedString,java.lang.Boolean>>> getSetText();
     property public final androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.CustomAccessibilityAction>> CustomActions;
+    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.ui.text.TextLayoutResult>,java.lang.Boolean>>> GetTextLayoutResult;
     property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnClick;
     property @Deprecated public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> ScrollBackward;
     property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> ScrollBy;
@@ -2382,6 +2384,7 @@
     method public static boolean getFocused(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static String getTestTag(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static androidx.ui.text.AnnotatedString getText(androidx.ui.semantics.SemanticsPropertyReceiver);
+    method public static void getTextLayoutResult(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.text.TextLayoutResult>,java.lang.Boolean> action);
     method public static androidx.ui.text.TextRange getTextSelectionRange(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static void hidden(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static void onClick(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
diff --git a/ui/ui-core/api/restricted_0.1.0-dev16.txt b/ui/ui-core/api/restricted_0.1.0-dev16.txt
index f977cd7..2147144 100644
--- a/ui/ui-core/api/restricted_0.1.0-dev16.txt
+++ b/ui/ui-core/api/restricted_0.1.0-dev16.txt
@@ -2392,6 +2392,7 @@
 
   public final class SemanticsActions {
     method public androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.CustomAccessibilityAction>> getCustomActions();
+    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
     method @Deprecated public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getScrollBackward();
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> getScrollBy();
@@ -2400,6 +2401,7 @@
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> getSetSelection();
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.ui.text.AnnotatedString,java.lang.Boolean>>> getSetText();
     property public final androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.CustomAccessibilityAction>> CustomActions;
+    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.ui.text.TextLayoutResult>,java.lang.Boolean>>> GetTextLayoutResult;
     property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnClick;
     property @Deprecated public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> ScrollBackward;
     property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> ScrollBy;
@@ -2443,6 +2445,7 @@
     method public static boolean getFocused(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static String getTestTag(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static androidx.ui.text.AnnotatedString getText(androidx.ui.semantics.SemanticsPropertyReceiver);
+    method public static void getTextLayoutResult(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.text.TextLayoutResult>,java.lang.Boolean> action);
     method public static androidx.ui.text.TextRange getTextSelectionRange(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static void hidden(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static void onClick(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
diff --git a/ui/ui-core/api/restricted_current.txt b/ui/ui-core/api/restricted_current.txt
index f977cd7..2147144 100644
--- a/ui/ui-core/api/restricted_current.txt
+++ b/ui/ui-core/api/restricted_current.txt
@@ -2392,6 +2392,7 @@
 
   public final class SemanticsActions {
     method public androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.CustomAccessibilityAction>> getCustomActions();
+    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
     method @Deprecated public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getScrollBackward();
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> getScrollBy();
@@ -2400,6 +2401,7 @@
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> getSetSelection();
     method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.ui.text.AnnotatedString,java.lang.Boolean>>> getSetText();
     property public final androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.CustomAccessibilityAction>> CustomActions;
+    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.ui.text.TextLayoutResult>,java.lang.Boolean>>> GetTextLayoutResult;
     property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnClick;
     property @Deprecated public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> ScrollBackward;
     property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> ScrollBy;
@@ -2443,6 +2445,7 @@
     method public static boolean getFocused(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static String getTestTag(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static androidx.ui.text.AnnotatedString getText(androidx.ui.semantics.SemanticsPropertyReceiver);
+    method public static void getTextLayoutResult(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function1<? super java.util.List<androidx.ui.text.TextLayoutResult>,java.lang.Boolean> action);
     method public static androidx.ui.text.TextRange getTextSelectionRange(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static void hidden(androidx.ui.semantics.SemanticsPropertyReceiver);
     method public static void onClick(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
diff --git a/ui/ui-core/integration-tests/ui-core-demos/build.gradle b/ui/ui-core/integration-tests/ui-core-demos/build.gradle
index 96800fa..8aaadc2 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/build.gradle
+++ b/ui/ui-core/integration-tests/ui-core-demos/build.gradle
@@ -18,6 +18,7 @@
     implementation project(":compose:integration-tests:demos:common")
     implementation project(":compose:ui:ui")
     implementation project(":compose:foundation:foundation-layout")
+    implementation project(":compose:foundation:foundation-text")
     implementation project(":compose:ui:ui-text")
     implementation project(":compose:animation:animation")
     implementation project(":compose:foundation:foundation")
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/ui/core/demos/PopupDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/ui/core/demos/PopupDemo.kt
index f654f90..8922d4a 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/ui/core/demos/PopupDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/ui/core/demos/PopupDemo.kt
@@ -27,7 +27,6 @@
 import androidx.ui.foundation.ContentGravity
 import androidx.ui.foundation.ScrollableColumn
 import androidx.ui.foundation.Text
-import androidx.ui.foundation.TextField
 import androidx.ui.foundation.background
 import androidx.ui.foundation.clickable
 import androidx.ui.foundation.shape.corner.CircleShape
@@ -46,6 +45,7 @@
 import androidx.ui.layout.preferredSize
 import androidx.ui.layout.preferredWidth
 import androidx.ui.text.style.TextAlign
+import androidx.ui.text.CoreTextField
 import androidx.ui.unit.Dp
 import androidx.ui.unit.dp
 
@@ -479,7 +479,7 @@
     color: Color = Color.White
 ) {
     val state = state { TextFieldValue(initialText) }
-    TextField(
+    CoreTextField(
         value = state.value,
         modifier = modifier.background(color = color),
         keyboardType = keyboardType,
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/ui/core/demos/autofill/ExplicitAutofillTypesDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/ui/core/demos/autofill/ExplicitAutofillTypesDemo.kt
index 972c57d..77fe9fc 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/ui/core/demos/autofill/ExplicitAutofillTypesDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/ui/core/demos/autofill/ExplicitAutofillTypesDemo.kt
@@ -29,15 +29,15 @@
 import androidx.ui.core.toComposeRect
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.Text
-import androidx.ui.foundation.TextField
+import androidx.ui.geometry.Offset
 import androidx.ui.input.ImeAction
 import androidx.ui.input.KeyboardType
+import androidx.ui.input.TextFieldValue
 import androidx.ui.layout.Column
 import androidx.ui.layout.Spacer
 import androidx.ui.layout.preferredHeight
 import androidx.ui.material.MaterialTheme
-import androidx.ui.geometry.Offset
-import androidx.ui.input.TextFieldValue
+import androidx.ui.text.CoreTextField
 import androidx.ui.unit.dp
 
 @Composable
@@ -54,7 +54,7 @@
             autofillTypes = listOf(AutofillType.PersonFullName),
              nameState.value = TextFieldValue(it) }
         ) { autofillNode ->
-            TextField(
+            CoreTextField(
                 value = nameState.value,
                 keyboardType = KeyboardType.Text,
                 imeAction = ImeAction.Unspecified,
@@ -77,7 +77,7 @@
             autofillTypes = listOf(AutofillType.EmailAddress),
              emailState.value = TextFieldValue(it) }
         ) { autofillNode ->
-            TextField(
+            CoreTextField(
                 value = emailState.value,
                 keyboardType = KeyboardType.Text,
                 imeAction = ImeAction.Unspecified,
diff --git a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/gesture/LongPressDragGestureFilterTest.kt b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/gesture/LongPressDragGestureFilterTest.kt
index d4816af..89ea6d5 100644
--- a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/gesture/LongPressDragGestureFilterTest.kt
+++ b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/gesture/LongPressDragGestureFilterTest.kt
@@ -98,7 +98,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f, 50f))
+            arrayOf(PointerCoords(50f, 50f)),
+            view
         )
         val move = MotionEvent(
             0,
@@ -106,7 +107,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(51f, 50f))
+            arrayOf(PointerCoords(51f, 50f)),
+            view
         )
         val up = MotionEvent(
             0,
@@ -114,7 +116,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(51f, 50f))
+            arrayOf(PointerCoords(51f, 50f)),
+            view
         )
         activityTestRule.runOnUiThreadIR {
             view.dispatchTouchEvent(down)
@@ -134,7 +137,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f, 50f))
+            arrayOf(PointerCoords(50f, 50f)),
+            view
         )
         val move = MotionEvent(
             0,
@@ -142,7 +146,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(51f, 50f))
+            arrayOf(PointerCoords(51f, 50f)),
+            view
         )
         val cancel = MotionEvent(
             0,
@@ -150,7 +155,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(51f, 50f))
+            arrayOf(PointerCoords(51f, 50f)),
+            view
         )
         activityTestRule.runOnUiThreadIR {
             view.dispatchTouchEvent(down)
@@ -170,7 +176,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f, 50f))
+            arrayOf(PointerCoords(50f, 50f)),
+            view
         )
         waitForLongPress {
             view.dispatchTouchEvent(down)
@@ -189,7 +196,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f, 50f))
+            arrayOf(PointerCoords(50f, 50f)),
+            view
         )
         waitForLongPress {
             view.dispatchTouchEvent(down)
@@ -200,7 +208,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(51f, 50f))
+            arrayOf(PointerCoords(51f, 50f)),
+            view
         )
         view.dispatchTouchEvent(move)
 
@@ -222,7 +231,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f, 50f))
+            arrayOf(PointerCoords(50f, 50f)),
+            view
         )
         waitForLongPress {
             view.dispatchTouchEvent(down)
@@ -233,7 +243,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(51f, 50f))
+            arrayOf(PointerCoords(51f, 50f)),
+            view
         )
         view.dispatchTouchEvent(up)
 
@@ -254,7 +265,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f, 50f))
+            arrayOf(PointerCoords(50f, 50f)),
+            view
         )
         waitForLongPress {
             view.dispatchTouchEvent(down)
@@ -265,7 +277,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(51f, 50f))
+            arrayOf(PointerCoords(51f, 50f)),
+            view
         )
         view.dispatchTouchEvent(move)
         val up = MotionEvent(
@@ -274,7 +287,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(51f, 50f))
+            arrayOf(PointerCoords(51f, 50f)),
+            view
         )
         view.dispatchTouchEvent(up)
 
@@ -297,7 +311,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f, 50f))
+            arrayOf(PointerCoords(50f, 50f)),
+            view
         )
         waitForLongPress {
             view.dispatchTouchEvent(down)
@@ -308,7 +323,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f, 50f))
+            arrayOf(PointerCoords(50f, 50f)),
+            view
         )
         view.dispatchTouchEvent(cancel)
 
@@ -328,7 +344,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f, 50f))
+            arrayOf(PointerCoords(50f, 50f)),
+            view
         )
         waitForLongPress {
             view.dispatchTouchEvent(down)
@@ -339,7 +356,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(51f, 50f))
+            arrayOf(PointerCoords(51f, 50f)),
+            view
         )
         view.dispatchTouchEvent(move)
         val cancel = MotionEvent(
@@ -348,7 +366,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(51f, 50f))
+            arrayOf(PointerCoords(51f, 50f)),
+            view
         )
         view.dispatchTouchEvent(cancel)
 
diff --git a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/gesture/ScaleGestureFilterTest.kt b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/gesture/ScaleGestureFilterTest.kt
index a879adb..a45de17 100644
--- a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/gesture/ScaleGestureFilterTest.kt
+++ b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/gesture/ScaleGestureFilterTest.kt
@@ -101,7 +101,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(touchSlop * 1, 50f))
+            arrayOf(PointerCoords(touchSlop * 1, 50f)),
+            view
         )
         val down2 = MotionEvent(
             10,
@@ -112,7 +113,8 @@
             arrayOf(
                 PointerCoords(touchSlop * 1, 50f),
                 PointerCoords(touchSlop * 3, 50f)
-            )
+            ),
+            view
         )
         val move = MotionEvent(
             20,
@@ -126,7 +128,8 @@
             arrayOf(
                 PointerCoords(touchSlop * 0 + TinyNum, 50f),
                 PointerCoords(touchSlop * 4 - TinyNum, 50f)
-            )
+            ),
+            view
         )
         val up = MotionEvent(
             30,
@@ -140,7 +143,8 @@
             arrayOf(
                 PointerCoords(touchSlop * 0 + TinyNum, 50f),
                 PointerCoords(touchSlop * 4 - TinyNum, 50f)
-            )
+            ),
+            view
         )
         val up2 = MotionEvent(
             40,
@@ -152,7 +156,8 @@
             ),
             arrayOf(
                 PointerCoords(touchSlop * 4 - TinyNum, 50f)
-            )
+            ),
+            view
         )
 
         activityTestRule.runOnUiThreadIR {
@@ -177,7 +182,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(touchSlop * 1, 50f))
+            arrayOf(PointerCoords(touchSlop * 1, 50f)),
+            view
         )
         val down2 = MotionEvent(
             10,
@@ -188,7 +194,8 @@
             arrayOf(
                 PointerCoords(touchSlop * 1, 50f),
                 PointerCoords(touchSlop * 3, 50f)
-            )
+            ),
+            view
         )
         val move = MotionEvent(
             20,
@@ -202,7 +209,8 @@
             arrayOf(
                 PointerCoords(touchSlop * 0 - TinyNum, 50f),
                 PointerCoords(touchSlop * 4 + TinyNum, 50f)
-            )
+            ),
+            view
         )
         val up = MotionEvent(
             30,
@@ -216,7 +224,8 @@
             arrayOf(
                 PointerCoords(touchSlop * 0 - TinyNum, 50f),
                 PointerCoords(touchSlop * 4 + TinyNum, 50f)
-            )
+            ),
+            view
         )
         val up2 = MotionEvent(
             40,
@@ -228,7 +237,8 @@
             ),
             arrayOf(
                 PointerCoords(touchSlop * 4 + TinyNum, 50f)
-            )
+            ),
+            view
         )
 
         activityTestRule.runOnUiThreadIR {
@@ -258,7 +268,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(touchSlop * 1, 50f))
+            arrayOf(PointerCoords(touchSlop * 1, 50f)),
+            view
         )
         val down2 = MotionEvent(
             10,
@@ -269,7 +280,8 @@
             arrayOf(
                 PointerCoords(touchSlop * 1, 50f),
                 PointerCoords(touchSlop * 3, 50f)
-            )
+            ),
+            view
         )
         val move = MotionEvent(
             20,
@@ -283,7 +295,8 @@
             arrayOf(
                 PointerCoords(touchSlop * 0 - TinyNum, 50f),
                 PointerCoords(touchSlop * 4 + TinyNum, 50f)
-            )
+            ),
+            view
         )
         val cancel = MotionEvent(
             30,
@@ -297,7 +310,8 @@
             arrayOf(
                 PointerCoords(touchSlop * 0 - TinyNum, 50f),
                 PointerCoords(touchSlop * 4 + TinyNum, 50f)
-            )
+            ),
+            view
         )
 
         activityTestRule.runOnUiThreadIR {
@@ -326,7 +340,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(touchSlop * 1, 50f))
+            arrayOf(PointerCoords(touchSlop * 1, 50f)),
+            view
         )
         val down2 = MotionEvent(
             10,
@@ -337,7 +352,8 @@
             arrayOf(
                 PointerCoords(touchSlop * 1, 50f),
                 PointerCoords(touchSlop * 3, 50f)
-            )
+            ),
+            view
         )
         val move = MotionEvent(
             20,
@@ -351,7 +367,8 @@
             arrayOf(
                 PointerCoords(touchSlop * -1, 50f),
                 PointerCoords(touchSlop * 5, 50f)
-            )
+            ),
+            view
         )
 
         activityTestRule.runOnUiThreadIR {
@@ -374,7 +391,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(touchSlop * 1, 50f))
+            arrayOf(PointerCoords(touchSlop * 1, 50f)),
+            view
         )
         val down2 = MotionEvent(
             10,
@@ -388,7 +406,8 @@
             arrayOf(
                 PointerCoords(touchSlop * 1, 50f),
                 PointerCoords(touchSlop * 6, 50f)
-            )
+            ),
+            view
         )
         val move = MotionEvent(
             20,
@@ -402,7 +421,8 @@
             arrayOf(
                 PointerCoords(touchSlop * 3, 50f),
                 PointerCoords(touchSlop * 4, 50f)
-            )
+            ),
+            view
         )
 
         activityTestRule.runOnUiThreadIR {
diff --git a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/gesture/TouchSlopDragGestureFilterTest.kt b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/gesture/TouchSlopDragGestureFilterTest.kt
index 74f79cb..83919d5 100644
--- a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/gesture/TouchSlopDragGestureFilterTest.kt
+++ b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/gesture/TouchSlopDragGestureFilterTest.kt
@@ -66,7 +66,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f, 50f))
+            arrayOf(PointerCoords(50f, 50f)),
+            view
         )
         val move = MotionEvent(
             20,
@@ -74,7 +75,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f + touchSlop - TinyNum, 50f))
+            arrayOf(PointerCoords(50f + touchSlop - TinyNum, 50f)),
+            view
         )
         val up = MotionEvent(
             30,
@@ -82,7 +84,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f + touchSlop - TinyNum, 50f))
+            arrayOf(PointerCoords(50f + touchSlop - TinyNum, 50f)),
+            view
         )
 
         activityTestRule.runOnUiThreadIR {
@@ -105,7 +108,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f, 50f))
+            arrayOf(PointerCoords(50f, 50f)),
+            view
         )
         val move = MotionEvent(
             20,
@@ -113,7 +117,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f + touchSlop + TinyNum, 50f))
+            arrayOf(PointerCoords(50f + touchSlop + TinyNum, 50f)),
+            view
         )
         val up = MotionEvent(
             30,
@@ -121,7 +126,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f + touchSlop + TinyNum, 50f))
+            arrayOf(PointerCoords(50f + touchSlop + TinyNum, 50f)),
+            view
         )
 
         activityTestRule.runOnUiThreadIR {
@@ -152,7 +158,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f, 50f))
+            arrayOf(PointerCoords(50f, 50f)),
+            view
         )
         val move = MotionEvent(
             20,
@@ -160,7 +167,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f + touchSlop + TinyNum, 50f))
+            arrayOf(PointerCoords(50f + touchSlop + TinyNum, 50f)),
+            view
         )
         val cancel = MotionEvent(
             30,
@@ -168,7 +176,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f + touchSlop, 50f))
+            arrayOf(PointerCoords(50f + touchSlop, 50f)),
+            view
         )
 
         activityTestRule.runOnUiThreadIR {
@@ -197,7 +206,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f, 50f))
+            arrayOf(PointerCoords(50f, 50f)),
+            view
         )
 
         activityTestRule.runOnUiThreadIR {
@@ -223,7 +233,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f, 50f))
+            arrayOf(PointerCoords(50f, 50f)),
+            view
         )
         val move = MotionEvent(
             20,
@@ -231,7 +242,8 @@
             1,
             0,
             arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(50f + movement, 50f))
+            arrayOf(PointerCoords(50f + movement, 50f)),
+            view
         )
 
         activityTestRule.runOnUiThreadIR {
diff --git a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/gesture/utils.kt b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/gesture/utils.kt
index d50e43b..c7fea86 100644
--- a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/gesture/utils.kt
+++ b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/gesture/utils.kt
@@ -17,6 +17,7 @@
 package androidx.ui.core.gesture
 
 import android.view.MotionEvent
+import android.view.View
 
 // We only need this because IR compiler doesn't like converting lambdas to Runnables
 @Suppress("DEPRECATION")
@@ -29,29 +30,57 @@
     runOnUiThread(runnable)
 }
 
+/**
+ * Creates a simple [MotionEvent].
+ *
+ * @param dispatchTarget The [View] that the [MotionEvent] is going to be dispatched to. This
+ * guarantees that the MotionEvent is created correctly for both Compose (which relies on raw
+ * coordinates being correct) and Android (which requires that local coordinates are correct).
+ */
 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
-)
+    pointerCoords: Array<MotionEvent.PointerCoords>,
+    dispatchTarget: View
+): MotionEvent {
+
+    val locationOnScreen = IntArray(2) { 0 }
+    dispatchTarget.getLocationOnScreen(locationOnScreen)
+
+    pointerCoords.forEach {
+        it.x += locationOnScreen[0]
+        it.y += locationOnScreen[1]
+    }
+
+    val motionEvent = MotionEvent.obtain(
+        0,
+        eventTime.toLong(),
+        action + (actionIndex shl MotionEvent.ACTION_POINTER_INDEX_SHIFT),
+        numPointers,
+        pointerProperties,
+        pointerCoords,
+        0,
+        0,
+        0f,
+        0f,
+        0,
+        0,
+        0,
+        0
+    ).apply {
+        offsetLocation(-locationOnScreen[0].toFloat(), -locationOnScreen[1].toFloat())
+    }
+
+    pointerCoords.forEach {
+        it.x -= locationOnScreen[0]
+        it.y -= locationOnScreen[1]
+    }
+
+    return motionEvent
+}
 
 @Suppress("RemoveRedundantQualifierName")
 internal fun PointerProperties(id: Int) =
diff --git a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/test/ClipPointerInputTest.kt b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/test/ClipPointerInputTest.kt
index f897944..f2f687d 100644
--- a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/test/ClipPointerInputTest.kt
+++ b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/core/test/ClipPointerInputTest.kt
@@ -79,13 +79,13 @@
      * 4 .     t .   . t     .
      *   .........   .........
      *
-     * 4 LayoutNodes with PointerInputModifiers that are positioned by their parent LayoutNode
-     * and where pointer input is clipped by a modifier on the parent. 4 touches touch just inside
-     * the parent LayoutNode and inside the child LayoutNodes. 8 touches touch just outside the
+     * 4 LayoutNodes with PointerInputModifiers that are positioned by offset modifiers and where
+     * pointer input is clipped by a modifier on the parent. 4 touches touch just inside the
+     * parent LayoutNode and inside the child LayoutNodes. 8 touches touch just outside the
      * parent LayoutNode but inside the child LayoutNodes.
      *
-     * Because layout node bounds are not used to clip pointer input hit testing, all pointers
-     * should hit.
+     * Because clipToBounds is being used on the parent LayoutNode, only the 4 touches inside the
+     * parent LayoutNode should hit.
      */
     @Test
     fun clipToBounds_childrenOffsetViaLayout_onlyCorrectPointersHit() {
@@ -169,7 +169,8 @@
                     1,
                     0,
                     arrayOf(PointerProperties(0)),
-                    arrayOf(PointerCoords(value.x, value.y))
+                    arrayOf(PointerCoords(value.x, value.y)),
+                    view
                 )
             )
         }
@@ -184,6 +185,9 @@
         // Assert
 
         assertThat(loggingPim1.log).isEqualTo(listOf(Offset(1f, 1f)))
+        assertThat(loggingPim2.log).isEqualTo(listOf(Offset(0f, 1f)))
+        assertThat(loggingPim3.log).isEqualTo(listOf(Offset(1f, 0f)))
+        assertThat(loggingPim4.log).isEqualTo(listOf(Offset(0f, 0f)))
     }
 
     /**
@@ -207,11 +211,11 @@
      * parent LayoutNode and inside the child LayoutNodes. 8 touches touch just outside the
      * parent LayoutNode but inside the child LayoutNodes.
      *
-     * Because layout node bounds are not used to clip pointer input hit testing, all pointers
-     * should hit.
+     * Because clipToBounds is being used on the parent LayoutNode, only the 4 touches inside the
+     * parent LayoutNode should hit.
      */
     @Test
-    fun childrenOffsetViaModifier_onlyCorrectPointersHit() {
+    fun clipToBounds_childrenOffsetViaModifier_onlyCorrectPointersHit() {
 
         val setupLatch = CountDownLatch(2)
 
@@ -292,7 +296,8 @@
                     1,
                     0,
                     arrayOf(PointerProperties(0)),
-                    arrayOf(PointerCoords(value.x, value.y))
+                    arrayOf(PointerCoords(value.x, value.y)),
+                    view
                 )
             )
         }
@@ -307,6 +312,9 @@
         // Assert
 
         assertThat(loggingPim1.log).isEqualTo(listOf(Offset(1f, 1f)))
+        assertThat(loggingPim2.log).isEqualTo(listOf(Offset(0f, 1f)))
+        assertThat(loggingPim3.log).isEqualTo(listOf(Offset(1f, 0f)))
+        assertThat(loggingPim4.log).isEqualTo(listOf(Offset(0f, 0f)))
     }
 
     @Composable
diff --git a/ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidComposeViewAccessibilityDelegateCompat.kt b/ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidComposeViewAccessibilityDelegateCompat.kt
index 7f10611..f23f474 100644
--- a/ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidComposeViewAccessibilityDelegateCompat.kt
+++ b/ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidComposeViewAccessibilityDelegateCompat.kt
@@ -17,14 +17,22 @@
 package androidx.ui.core
 
 import android.content.Context
+import android.graphics.RectF
+import android.os.Build
 import android.os.Bundle
 import android.os.Handler
 import android.os.Looper
+import android.util.Log
 import android.view.MotionEvent
 import android.view.View
 import android.view.ViewParent
 import android.view.accessibility.AccessibilityEvent
 import android.view.accessibility.AccessibilityManager
+import android.view.accessibility.AccessibilityNodeInfo
+import android.view.accessibility.AccessibilityNodeInfo.EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH
+import android.view.accessibility.AccessibilityNodeInfo.EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX
+import android.view.accessibility.AccessibilityNodeInfo.EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY
+import android.view.accessibility.AccessibilityNodeProvider
 import androidx.annotation.IntRange
 import androidx.collection.SparseArrayCompat
 import androidx.core.view.AccessibilityDelegateCompat
@@ -35,11 +43,15 @@
 import androidx.ui.core.semantics.findChildById
 import androidx.ui.core.semantics.getAllSemanticsNodesToMap
 import androidx.ui.core.semantics.getOrNull
+import androidx.ui.geometry.Rect
 import androidx.ui.semantics.CustomAccessibilityAction
 import androidx.ui.semantics.SemanticsActions
 import androidx.ui.semantics.SemanticsActions.CustomActions
 import androidx.ui.semantics.SemanticsProperties
 import androidx.ui.text.AnnotatedString
+import androidx.ui.text.TextLayoutResult
+import androidx.ui.text.length
+import androidx.ui.unit.toRect
 import androidx.ui.util.fastForEach
 
 internal class AndroidComposeViewAccessibilityDelegateCompat(val view: AndroidComposeView) :
@@ -48,6 +60,7 @@
         /** Virtual node identifier value for invalid nodes. */
         const val InvalidId = Integer.MIN_VALUE
         const val ClassName = "android.view.View"
+        const val LogTag = "AccessibilityDelegate"
         /**
          * Intent size limitations prevent sending over a megabyte of data. Limit
          * text length to 100K characters - 200KB.
@@ -97,7 +110,8 @@
     private val accessibilityManager: AccessibilityManager =
         view.context.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
     private val handler = Handler(Looper.getMainLooper())
-    private var nodeProvider: AccessibilityNodeProviderCompat = MyNodeProvider()
+    private var nodeProvider: AccessibilityNodeProviderCompat =
+        AccessibilityNodeProviderCompat(MyNodeProvider())
     private var focusedVirtualViewId = InvalidId
     // For actionIdToId and labelToActionId, the keys are the virtualViewIds. The value of
     // actionIdToLabel holds assigned custom action id to custom action label mapping. The
@@ -133,8 +147,7 @@
         })
     }
 
-    fun createNodeInfo(virtualViewId: Int):
-            AccessibilityNodeInfoCompat {
+    private fun createNodeInfo(virtualViewId: Int): AccessibilityNodeInfo {
         val info: AccessibilityNodeInfoCompat = AccessibilityNodeInfoCompat.obtain()
         // the hidden property is often not there
         info.isVisibleToUser = true
@@ -147,7 +160,7 @@
             semanticsNode = view.semanticsOwner.rootSemanticsNode.findChildById(virtualViewId)
             if (semanticsNode == null) {
                 // throw IllegalStateException("Semantics node $virtualViewId is not attached")
-                return info
+                return info.unwrap()
             }
             info.setSource(view, semanticsNode.id)
             // TODO(b/154023028): Semantics: Immediate children of the root node report parent ==
@@ -264,6 +277,10 @@
                         AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_WORD or
                         AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PARAGRAPH
         }
+        if (Build.VERSION.SDK_INT >= 26 && !info.text.isNullOrEmpty() &&
+            semanticsNode.config.contains(SemanticsActions.GetTextLayoutResult)) {
+            info.unwrap().availableExtraData = listOf(EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY)
+        }
 
         val rangeInfo =
             semanticsNode.config.getOrNull(SemanticsProperties.AccessibilityRangeInfo)
@@ -333,7 +350,7 @@
             labelToActionId.put(virtualViewId, currentLabelToActionId)
         }
 
-        return info
+        return info.unwrap()
     }
 
     /**
@@ -490,18 +507,17 @@
         return false
     }
 
-    fun performActionHelper(
+    private fun performActionHelper(
         virtualViewId: Int,
         action: Int,
         arguments: Bundle?
     ): Boolean {
-        val node: SemanticsNode
-        if (virtualViewId == AccessibilityNodeProviderCompat.HOST_VIEW_ID) {
-            node = view.semanticsOwner.rootSemanticsNode
-        } else {
-            node = view.semanticsOwner.rootSemanticsNode.findChildById(virtualViewId)
-                ?: return false
-        }
+        val node: SemanticsNode =
+            if (virtualViewId == AccessibilityNodeProviderCompat.HOST_VIEW_ID) {
+                view.semanticsOwner.rootSemanticsNode
+            } else {
+                view.semanticsOwner.rootSemanticsNode.findChildById(virtualViewId) ?: return false
+            }
         when (action) {
             AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS ->
                 return requestAccessibilityFocus(virtualViewId)
@@ -593,6 +609,91 @@
         }
     }
 
+    private fun addExtraDataToAccessibilityNodeInfoHelper(
+        virtualViewId: Int,
+        info: AccessibilityNodeInfo,
+        extraDataKey: String,
+        arguments: Bundle?
+    ) {
+        val node: SemanticsNode =
+            if (virtualViewId == AccessibilityNodeProviderCompat.HOST_VIEW_ID) {
+                view.semanticsOwner.rootSemanticsNode
+            } else {
+                view.semanticsOwner.rootSemanticsNode.findChildById(virtualViewId) ?: return
+            }
+        // TODO(b/157474582): This only works for single text/text field
+        if (node.config.contains(SemanticsProperties.Text) &&
+            node.config.contains(SemanticsActions.GetTextLayoutResult) &&
+            arguments != null && extraDataKey == EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY) {
+            val positionInfoStartIndex = arguments.getInt(
+                EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX, -1
+            )
+            val positionInfoLength = arguments.getInt(
+                EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH, -1
+            )
+            if ((positionInfoLength <= 0) || (positionInfoStartIndex < 0) ||
+                (positionInfoStartIndex >= node.config[SemanticsProperties.Text].length)) {
+                Log.e(LogTag, "Invalid arguments for accessibility character locations")
+                return
+            }
+            val textLayoutResults = mutableListOf<TextLayoutResult>()
+            // Note now it only works for single Text/TextField until we fix the merging issue.
+            val textLayoutResult: TextLayoutResult
+            if (node.config[SemanticsActions.GetTextLayoutResult].action(textLayoutResults)) {
+                textLayoutResult = textLayoutResults[0]
+            } else {
+                return
+            }
+            val boundingRects = mutableListOf<RectF?>()
+            val textNode: SemanticsNode? = node.findNonEmptyTextChild()
+            for (i in 0 until positionInfoLength) {
+                val bounds = textLayoutResult.getBoundingBox(positionInfoStartIndex + i)
+                val screenBounds: Rect?
+                // Only the visible/partial visible locations are used.
+                if (textNode != null) {
+                    screenBounds = toScreenCoords(textNode, bounds)
+                } else {
+                    screenBounds = bounds
+                }
+                if (screenBounds == null) {
+                    boundingRects.add(null)
+                } else {
+                    boundingRects.add(
+                        RectF(
+                            screenBounds.left,
+                            screenBounds.top,
+                            screenBounds.right,
+                            screenBounds.bottom
+                        )
+                    )
+                }
+            }
+            info.extras.putParcelableArray(extraDataKey, boundingRects.toTypedArray())
+        }
+    }
+
+    private fun toScreenCoords(textNode: SemanticsNode, bounds: Rect): Rect? {
+        val screenBounds = bounds.shift(textNode.globalPosition)
+        val globalBounds = textNode.globalBounds.toRect()
+        if (screenBounds.overlaps(globalBounds)) {
+            return screenBounds.intersect(globalBounds)
+        }
+        return null
+    }
+
+    // TODO: this only works for single text/text field.
+    private fun SemanticsNode.findNonEmptyTextChild(): SemanticsNode? {
+        if (this.unmergedConfig.contains(SemanticsProperties.Text) &&
+            this.unmergedConfig[SemanticsProperties.Text].length != 0) {
+            return this
+        }
+        unmergedChildren().fastForEach {
+            val result = it.findNonEmptyTextChild()
+            if (result != null) return result
+        }
+        return null
+    }
+
     /**
      * Dispatches hover {@link android.view.MotionEvent}s to the virtual view hierarchy when
      * the Explore by Touch feature is enabled.
@@ -1049,9 +1150,10 @@
         return null
     }
 
-    inner class MyNodeProvider : AccessibilityNodeProviderCompat() {
+    // TODO(b/160820721): use AccessibilityNodeProviderCompat instead of AccessibilityNodeProvider
+    inner class MyNodeProvider : AccessibilityNodeProvider() {
         override fun createAccessibilityNodeInfo(virtualViewId: Int):
-                AccessibilityNodeInfoCompat? {
+                AccessibilityNodeInfo? {
             return createNodeInfo(virtualViewId)
         }
 
@@ -1062,5 +1164,14 @@
         ): Boolean {
             return performActionHelper(virtualViewId, action, arguments)
         }
+
+        override fun addExtraDataToAccessibilityNodeInfo(
+            virtualViewId: Int,
+            info: AccessibilityNodeInfo,
+            extraDataKey: String,
+            arguments: Bundle?
+        ) {
+            addExtraDataToAccessibilityNodeInfoHelper(virtualViewId, info, extraDataKey, arguments)
+        }
     }
 }
diff --git a/ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsNode.kt b/ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsNode.kt
index 3bed72e..1f1817a 100644
--- a/ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsNode.kt
+++ b/ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsNode.kt
@@ -138,7 +138,7 @@
     private val isMergingSemanticsOfDescendants: Boolean
         get() = mergingEnabled && unmergedConfig.isMergingSemanticsOfDescendants
 
-    private fun unmergedChildren(): List<SemanticsNode> {
+    internal fun unmergedChildren(): List<SemanticsNode> {
         val unmergedChildren: MutableList<SemanticsNode> = mutableListOf()
 
         val semanticsChildren = componentNode.findOneLayerOfSemanticsWrappers()
diff --git a/ui/ui-core/src/commonMain/kotlin/androidx/ui/semantics/SemanticsProperties.kt b/ui/ui-core/src/commonMain/kotlin/androidx/ui/semantics/SemanticsProperties.kt
index 0b852e6..98c1c85 100644
--- a/ui/ui-core/src/commonMain/kotlin/androidx/ui/semantics/SemanticsProperties.kt
+++ b/ui/ui-core/src/commonMain/kotlin/androidx/ui/semantics/SemanticsProperties.kt
@@ -17,6 +17,7 @@
 package androidx.ui.semantics
 
 import androidx.ui.text.AnnotatedString
+import androidx.ui.text.TextLayoutResult
 import androidx.ui.text.TextRange
 import kotlin.reflect.KProperty
 
@@ -110,6 +111,15 @@
  */
 object SemanticsActions {
     /**
+     * Action to get a Text/TextField node's [TextLayoutResult]. The result is the first element
+     * of layout(the argument of the AccessibilityAction).
+     *
+     * @see SemanticsPropertyReceiver.getTextLayoutResult
+     */
+    val GetTextLayoutResult = SemanticsPropertyKey<AccessibilityAction<
+                (MutableList<TextLayoutResult>) -> Boolean>>("GetTextLayoutResult")
+
+    /**
      * Action to be performed when the node is clicked.
      *
      * @see SemanticsPropertyReceiver.onClick
@@ -329,6 +339,19 @@
 var SemanticsPropertyReceiver.customActions by SemanticsActions.CustomActions
 
 /**
+ * This function adds the [SemanticsActions.GetTextLayoutResult] to the [SemanticsPropertyReceiver].
+ *
+ * @param label Optional label for this action.
+ * @param action Action to be performed when the [SemanticsActions.GetTextLayoutResult] is called.
+ */
+fun SemanticsPropertyReceiver.getTextLayoutResult(
+    label: String? = null,
+    action: (MutableList<TextLayoutResult>) -> Boolean
+) {
+    this[SemanticsActions.GetTextLayoutResult] = AccessibilityAction(label, action)
+}
+
+/**
  * This function adds the [SemanticsActions.OnClick] to the [SemanticsPropertyReceiver].
  *
  * @param label Optional label for this action.
diff --git a/ui/ui-foundation/api/0.1.0-dev16.txt b/ui/ui-foundation/api/0.1.0-dev16.txt
index 2bf2f26..68f2ab6 100644
--- a/ui/ui-foundation/api/0.1.0-dev16.txt
+++ b/ui/ui-foundation/api/0.1.0-dev16.txt
@@ -12,6 +12,10 @@
     method @Deprecated public static androidx.ui.core.Modifier drawBackground-a_xWPtA(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
   }
 
+  public final class BaseTextFieldKt {
+    method @androidx.compose.Composable @androidx.ui.foundation.ExperimentalFoundationApi public static void BaseTextField-63P0bO0(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit>  kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long cursorColor = contentColor());
+  }
+
   @androidx.compose.Immutable public final class Border {
     method public float component1();
     method public androidx.ui.graphics.Brush component2();
@@ -71,6 +75,9 @@
     method public static androidx.ui.core.Modifier drawBorder-vGsXmEw(androidx.ui.core.Modifier, float size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
   }
 
+  @kotlin.RequiresOptIn(message="This foundation API is experimental and is likely to change or be removed in the " + "future.") public @interface ExperimentalFoundationApi {
+  }
+
   public final class IconKt {
     method @androidx.compose.Composable public static void Icon-A4lfJGc(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
     method @androidx.compose.Composable public static void Icon-RCipKA8(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
@@ -189,27 +196,6 @@
     field public static final androidx.ui.foundation.Strings INSTANCE;
   }
 
-  public final class TextFieldKt {
-    method @androidx.compose.Composable public static void TextField-63P0bO0(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit>  kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long cursorColor = contentColor());
-    method @Deprecated @androidx.compose.Composable public static void TextField-DBcCkQs(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit>  androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long cursorColor = contentColor());
-  }
-
-  @Deprecated @androidx.compose.Immutable public final class TextFieldValue {
-    ctor @Deprecated public TextFieldValue(String text, androidx.ui.text.TextRange selection);
-    ctor @Deprecated public TextFieldValue();
-    method @Deprecated public String component1();
-    method @Deprecated public androidx.ui.text.TextRange component2();
-    method @Deprecated @androidx.compose.Immutable public androidx.ui.foundation.TextFieldValue copy(String text, androidx.ui.text.TextRange selection);
-    method @Deprecated public androidx.ui.text.TextRange getSelection();
-    method @Deprecated public String getText();
-    field @Deprecated public static final androidx.ui.foundation.TextFieldValue.Companion Companion;
-  }
-
-  @Deprecated public static final class TextFieldValue.Companion {
-    method @Deprecated public androidx.ui.savedinstancestate.Saver<androidx.ui.foundation.TextFieldValue,java.lang.Object> getSaver();
-    property @Deprecated public final androidx.ui.savedinstancestate.Saver<androidx.ui.foundation.TextFieldValue,java.lang.Object> Saver;
-  }
-
   public final class TextKt {
     method @androidx.compose.Composable public static void ProvideTextStyle(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method @androidx.compose.Composable public static void Text-0VOI5ok(String text, androidx.ui.core.Modifier modifier = Modifier, long color = Color.Unset, long fontSize = TextUnit.Inherit, androidx.ui.text.font.FontStyle? fontStyle = null, androidx.ui.text.font.FontWeight? fontWeight = null, androidx.ui.text.font.FontFamily? fontFamily = null, long letterSpacing = TextUnit.Inherit, androidx.ui.text.style.TextDecoration? textDecoration = null, androidx.ui.text.style.TextAlign? textAlign = null, long lineHeight = TextUnit.Inherit, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, boolean softWrap = true, int maxLines = 2147483647, java.util.Map<java.lang.String,androidx.ui.text.InlineTextContent> inlineContent = mapOf(), kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  androidx.ui.text.TextStyle style = currentTextStyle());
diff --git a/ui/ui-foundation/api/current.txt b/ui/ui-foundation/api/current.txt
index 2bf2f26..68f2ab6 100644
--- a/ui/ui-foundation/api/current.txt
+++ b/ui/ui-foundation/api/current.txt
@@ -12,6 +12,10 @@
     method @Deprecated public static androidx.ui.core.Modifier drawBackground-a_xWPtA(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
   }
 
+  public final class BaseTextFieldKt {
+    method @androidx.compose.Composable @androidx.ui.foundation.ExperimentalFoundationApi public static void BaseTextField-63P0bO0(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit>  kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long cursorColor = contentColor());
+  }
+
   @androidx.compose.Immutable public final class Border {
     method public float component1();
     method public androidx.ui.graphics.Brush component2();
@@ -71,6 +75,9 @@
     method public static androidx.ui.core.Modifier drawBorder-vGsXmEw(androidx.ui.core.Modifier, float size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
   }
 
+  @kotlin.RequiresOptIn(message="This foundation API is experimental and is likely to change or be removed in the " + "future.") public @interface ExperimentalFoundationApi {
+  }
+
   public final class IconKt {
     method @androidx.compose.Composable public static void Icon-A4lfJGc(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
     method @androidx.compose.Composable public static void Icon-RCipKA8(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
@@ -189,27 +196,6 @@
     field public static final androidx.ui.foundation.Strings INSTANCE;
   }
 
-  public final class TextFieldKt {
-    method @androidx.compose.Composable public static void TextField-63P0bO0(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit>  kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long cursorColor = contentColor());
-    method @Deprecated @androidx.compose.Composable public static void TextField-DBcCkQs(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit>  androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long cursorColor = contentColor());
-  }
-
-  @Deprecated @androidx.compose.Immutable public final class TextFieldValue {
-    ctor @Deprecated public TextFieldValue(String text, androidx.ui.text.TextRange selection);
-    ctor @Deprecated public TextFieldValue();
-    method @Deprecated public String component1();
-    method @Deprecated public androidx.ui.text.TextRange component2();
-    method @Deprecated @androidx.compose.Immutable public androidx.ui.foundation.TextFieldValue copy(String text, androidx.ui.text.TextRange selection);
-    method @Deprecated public androidx.ui.text.TextRange getSelection();
-    method @Deprecated public String getText();
-    field @Deprecated public static final androidx.ui.foundation.TextFieldValue.Companion Companion;
-  }
-
-  @Deprecated public static final class TextFieldValue.Companion {
-    method @Deprecated public androidx.ui.savedinstancestate.Saver<androidx.ui.foundation.TextFieldValue,java.lang.Object> getSaver();
-    property @Deprecated public final androidx.ui.savedinstancestate.Saver<androidx.ui.foundation.TextFieldValue,java.lang.Object> Saver;
-  }
-
   public final class TextKt {
     method @androidx.compose.Composable public static void ProvideTextStyle(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method @androidx.compose.Composable public static void Text-0VOI5ok(String text, androidx.ui.core.Modifier modifier = Modifier, long color = Color.Unset, long fontSize = TextUnit.Inherit, androidx.ui.text.font.FontStyle? fontStyle = null, androidx.ui.text.font.FontWeight? fontWeight = null, androidx.ui.text.font.FontFamily? fontFamily = null, long letterSpacing = TextUnit.Inherit, androidx.ui.text.style.TextDecoration? textDecoration = null, androidx.ui.text.style.TextAlign? textAlign = null, long lineHeight = TextUnit.Inherit, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, boolean softWrap = true, int maxLines = 2147483647, java.util.Map<java.lang.String,androidx.ui.text.InlineTextContent> inlineContent = mapOf(), kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  androidx.ui.text.TextStyle style = currentTextStyle());
diff --git a/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev16.txt b/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev16.txt
index 2bf2f26..68f2ab6 100644
--- a/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev16.txt
+++ b/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev16.txt
@@ -12,6 +12,10 @@
     method @Deprecated public static androidx.ui.core.Modifier drawBackground-a_xWPtA(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
   }
 
+  public final class BaseTextFieldKt {
+    method @androidx.compose.Composable @androidx.ui.foundation.ExperimentalFoundationApi public static void BaseTextField-63P0bO0(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit>  kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long cursorColor = contentColor());
+  }
+
   @androidx.compose.Immutable public final class Border {
     method public float component1();
     method public androidx.ui.graphics.Brush component2();
@@ -71,6 +75,9 @@
     method public static androidx.ui.core.Modifier drawBorder-vGsXmEw(androidx.ui.core.Modifier, float size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
   }
 
+  @kotlin.RequiresOptIn(message="This foundation API is experimental and is likely to change or be removed in the " + "future.") public @interface ExperimentalFoundationApi {
+  }
+
   public final class IconKt {
     method @androidx.compose.Composable public static void Icon-A4lfJGc(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
     method @androidx.compose.Composable public static void Icon-RCipKA8(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
@@ -189,27 +196,6 @@
     field public static final androidx.ui.foundation.Strings INSTANCE;
   }
 
-  public final class TextFieldKt {
-    method @androidx.compose.Composable public static void TextField-63P0bO0(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit>  kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long cursorColor = contentColor());
-    method @Deprecated @androidx.compose.Composable public static void TextField-DBcCkQs(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit>  androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long cursorColor = contentColor());
-  }
-
-  @Deprecated @androidx.compose.Immutable public final class TextFieldValue {
-    ctor @Deprecated public TextFieldValue(String text, androidx.ui.text.TextRange selection);
-    ctor @Deprecated public TextFieldValue();
-    method @Deprecated public String component1();
-    method @Deprecated public androidx.ui.text.TextRange component2();
-    method @Deprecated @androidx.compose.Immutable public androidx.ui.foundation.TextFieldValue copy(String text, androidx.ui.text.TextRange selection);
-    method @Deprecated public androidx.ui.text.TextRange getSelection();
-    method @Deprecated public String getText();
-    field @Deprecated public static final androidx.ui.foundation.TextFieldValue.Companion Companion;
-  }
-
-  @Deprecated public static final class TextFieldValue.Companion {
-    method @Deprecated public androidx.ui.savedinstancestate.Saver<androidx.ui.foundation.TextFieldValue,java.lang.Object> getSaver();
-    property @Deprecated public final androidx.ui.savedinstancestate.Saver<androidx.ui.foundation.TextFieldValue,java.lang.Object> Saver;
-  }
-
   public final class TextKt {
     method @androidx.compose.Composable public static void ProvideTextStyle(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method @androidx.compose.Composable public static void Text-0VOI5ok(String text, androidx.ui.core.Modifier modifier = Modifier, long color = Color.Unset, long fontSize = TextUnit.Inherit, androidx.ui.text.font.FontStyle? fontStyle = null, androidx.ui.text.font.FontWeight? fontWeight = null, androidx.ui.text.font.FontFamily? fontFamily = null, long letterSpacing = TextUnit.Inherit, androidx.ui.text.style.TextDecoration? textDecoration = null, androidx.ui.text.style.TextAlign? textAlign = null, long lineHeight = TextUnit.Inherit, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, boolean softWrap = true, int maxLines = 2147483647, java.util.Map<java.lang.String,androidx.ui.text.InlineTextContent> inlineContent = mapOf(), kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  androidx.ui.text.TextStyle style = currentTextStyle());
diff --git a/ui/ui-foundation/api/public_plus_experimental_current.txt b/ui/ui-foundation/api/public_plus_experimental_current.txt
index 2bf2f26..68f2ab6 100644
--- a/ui/ui-foundation/api/public_plus_experimental_current.txt
+++ b/ui/ui-foundation/api/public_plus_experimental_current.txt
@@ -12,6 +12,10 @@
     method @Deprecated public static androidx.ui.core.Modifier drawBackground-a_xWPtA(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
   }
 
+  public final class BaseTextFieldKt {
+    method @androidx.compose.Composable @androidx.ui.foundation.ExperimentalFoundationApi public static void BaseTextField-63P0bO0(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit>  kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long cursorColor = contentColor());
+  }
+
   @androidx.compose.Immutable public final class Border {
     method public float component1();
     method public androidx.ui.graphics.Brush component2();
@@ -71,6 +75,9 @@
     method public static androidx.ui.core.Modifier drawBorder-vGsXmEw(androidx.ui.core.Modifier, float size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
   }
 
+  @kotlin.RequiresOptIn(message="This foundation API is experimental and is likely to change or be removed in the " + "future.") public @interface ExperimentalFoundationApi {
+  }
+
   public final class IconKt {
     method @androidx.compose.Composable public static void Icon-A4lfJGc(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
     method @androidx.compose.Composable public static void Icon-RCipKA8(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
@@ -189,27 +196,6 @@
     field public static final androidx.ui.foundation.Strings INSTANCE;
   }
 
-  public final class TextFieldKt {
-    method @androidx.compose.Composable public static void TextField-63P0bO0(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit>  kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long cursorColor = contentColor());
-    method @Deprecated @androidx.compose.Composable public static void TextField-DBcCkQs(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit>  androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long cursorColor = contentColor());
-  }
-
-  @Deprecated @androidx.compose.Immutable public final class TextFieldValue {
-    ctor @Deprecated public TextFieldValue(String text, androidx.ui.text.TextRange selection);
-    ctor @Deprecated public TextFieldValue();
-    method @Deprecated public String component1();
-    method @Deprecated public androidx.ui.text.TextRange component2();
-    method @Deprecated @androidx.compose.Immutable public androidx.ui.foundation.TextFieldValue copy(String text, androidx.ui.text.TextRange selection);
-    method @Deprecated public androidx.ui.text.TextRange getSelection();
-    method @Deprecated public String getText();
-    field @Deprecated public static final androidx.ui.foundation.TextFieldValue.Companion Companion;
-  }
-
-  @Deprecated public static final class TextFieldValue.Companion {
-    method @Deprecated public androidx.ui.savedinstancestate.Saver<androidx.ui.foundation.TextFieldValue,java.lang.Object> getSaver();
-    property @Deprecated public final androidx.ui.savedinstancestate.Saver<androidx.ui.foundation.TextFieldValue,java.lang.Object> Saver;
-  }
-
   public final class TextKt {
     method @androidx.compose.Composable public static void ProvideTextStyle(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method @androidx.compose.Composable public static void Text-0VOI5ok(String text, androidx.ui.core.Modifier modifier = Modifier, long color = Color.Unset, long fontSize = TextUnit.Inherit, androidx.ui.text.font.FontStyle? fontStyle = null, androidx.ui.text.font.FontWeight? fontWeight = null, androidx.ui.text.font.FontFamily? fontFamily = null, long letterSpacing = TextUnit.Inherit, androidx.ui.text.style.TextDecoration? textDecoration = null, androidx.ui.text.style.TextAlign? textAlign = null, long lineHeight = TextUnit.Inherit, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, boolean softWrap = true, int maxLines = 2147483647, java.util.Map<java.lang.String,androidx.ui.text.InlineTextContent> inlineContent = mapOf(), kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  androidx.ui.text.TextStyle style = currentTextStyle());
diff --git a/ui/ui-foundation/api/restricted_0.1.0-dev16.txt b/ui/ui-foundation/api/restricted_0.1.0-dev16.txt
index 2bf2f26..68f2ab6 100644
--- a/ui/ui-foundation/api/restricted_0.1.0-dev16.txt
+++ b/ui/ui-foundation/api/restricted_0.1.0-dev16.txt
@@ -12,6 +12,10 @@
     method @Deprecated public static androidx.ui.core.Modifier drawBackground-a_xWPtA(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
   }
 
+  public final class BaseTextFieldKt {
+    method @androidx.compose.Composable @androidx.ui.foundation.ExperimentalFoundationApi public static void BaseTextField-63P0bO0(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit>  kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long cursorColor = contentColor());
+  }
+
   @androidx.compose.Immutable public final class Border {
     method public float component1();
     method public androidx.ui.graphics.Brush component2();
@@ -71,6 +75,9 @@
     method public static androidx.ui.core.Modifier drawBorder-vGsXmEw(androidx.ui.core.Modifier, float size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
   }
 
+  @kotlin.RequiresOptIn(message="This foundation API is experimental and is likely to change or be removed in the " + "future.") public @interface ExperimentalFoundationApi {
+  }
+
   public final class IconKt {
     method @androidx.compose.Composable public static void Icon-A4lfJGc(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
     method @androidx.compose.Composable public static void Icon-RCipKA8(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
@@ -189,27 +196,6 @@
     field public static final androidx.ui.foundation.Strings INSTANCE;
   }
 
-  public final class TextFieldKt {
-    method @androidx.compose.Composable public static void TextField-63P0bO0(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit>  kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long cursorColor = contentColor());
-    method @Deprecated @androidx.compose.Composable public static void TextField-DBcCkQs(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit>  androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long cursorColor = contentColor());
-  }
-
-  @Deprecated @androidx.compose.Immutable public final class TextFieldValue {
-    ctor @Deprecated public TextFieldValue(String text, androidx.ui.text.TextRange selection);
-    ctor @Deprecated public TextFieldValue();
-    method @Deprecated public String component1();
-    method @Deprecated public androidx.ui.text.TextRange component2();
-    method @Deprecated @androidx.compose.Immutable public androidx.ui.foundation.TextFieldValue copy(String text, androidx.ui.text.TextRange selection);
-    method @Deprecated public androidx.ui.text.TextRange getSelection();
-    method @Deprecated public String getText();
-    field @Deprecated public static final androidx.ui.foundation.TextFieldValue.Companion Companion;
-  }
-
-  @Deprecated public static final class TextFieldValue.Companion {
-    method @Deprecated public androidx.ui.savedinstancestate.Saver<androidx.ui.foundation.TextFieldValue,java.lang.Object> getSaver();
-    property @Deprecated public final androidx.ui.savedinstancestate.Saver<androidx.ui.foundation.TextFieldValue,java.lang.Object> Saver;
-  }
-
   public final class TextKt {
     method @androidx.compose.Composable public static void ProvideTextStyle(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method @androidx.compose.Composable public static void Text-0VOI5ok(String text, androidx.ui.core.Modifier modifier = Modifier, long color = Color.Unset, long fontSize = TextUnit.Inherit, androidx.ui.text.font.FontStyle? fontStyle = null, androidx.ui.text.font.FontWeight? fontWeight = null, androidx.ui.text.font.FontFamily? fontFamily = null, long letterSpacing = TextUnit.Inherit, androidx.ui.text.style.TextDecoration? textDecoration = null, androidx.ui.text.style.TextAlign? textAlign = null, long lineHeight = TextUnit.Inherit, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, boolean softWrap = true, int maxLines = 2147483647, java.util.Map<java.lang.String,androidx.ui.text.InlineTextContent> inlineContent = mapOf(), kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  androidx.ui.text.TextStyle style = currentTextStyle());
diff --git a/ui/ui-foundation/api/restricted_current.txt b/ui/ui-foundation/api/restricted_current.txt
index 2bf2f26..68f2ab6 100644
--- a/ui/ui-foundation/api/restricted_current.txt
+++ b/ui/ui-foundation/api/restricted_current.txt
@@ -12,6 +12,10 @@
     method @Deprecated public static androidx.ui.core.Modifier drawBackground-a_xWPtA(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
   }
 
+  public final class BaseTextFieldKt {
+    method @androidx.compose.Composable @androidx.ui.foundation.ExperimentalFoundationApi public static void BaseTextField-63P0bO0(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit>  kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long cursorColor = contentColor());
+  }
+
   @androidx.compose.Immutable public final class Border {
     method public float component1();
     method public androidx.ui.graphics.Brush component2();
@@ -71,6 +75,9 @@
     method public static androidx.ui.core.Modifier drawBorder-vGsXmEw(androidx.ui.core.Modifier, float size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
   }
 
+  @kotlin.RequiresOptIn(message="This foundation API is experimental and is likely to change or be removed in the " + "future.") public @interface ExperimentalFoundationApi {
+  }
+
   public final class IconKt {
     method @androidx.compose.Composable public static void Icon-A4lfJGc(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
     method @androidx.compose.Composable public static void Icon-RCipKA8(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
@@ -189,27 +196,6 @@
     field public static final androidx.ui.foundation.Strings INSTANCE;
   }
 
-  public final class TextFieldKt {
-    method @androidx.compose.Composable public static void TextField-63P0bO0(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit>  kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long cursorColor = contentColor());
-    method @Deprecated @androidx.compose.Composable public static void TextField-DBcCkQs(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit>  androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long cursorColor = contentColor());
-  }
-
-  @Deprecated @androidx.compose.Immutable public final class TextFieldValue {
-    ctor @Deprecated public TextFieldValue(String text, androidx.ui.text.TextRange selection);
-    ctor @Deprecated public TextFieldValue();
-    method @Deprecated public String component1();
-    method @Deprecated public androidx.ui.text.TextRange component2();
-    method @Deprecated @androidx.compose.Immutable public androidx.ui.foundation.TextFieldValue copy(String text, androidx.ui.text.TextRange selection);
-    method @Deprecated public androidx.ui.text.TextRange getSelection();
-    method @Deprecated public String getText();
-    field @Deprecated public static final androidx.ui.foundation.TextFieldValue.Companion Companion;
-  }
-
-  @Deprecated public static final class TextFieldValue.Companion {
-    method @Deprecated public androidx.ui.savedinstancestate.Saver<androidx.ui.foundation.TextFieldValue,java.lang.Object> getSaver();
-    property @Deprecated public final androidx.ui.savedinstancestate.Saver<androidx.ui.foundation.TextFieldValue,java.lang.Object> Saver;
-  }
-
   public final class TextKt {
     method @androidx.compose.Composable public static void ProvideTextStyle(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
     method @androidx.compose.Composable public static void Text-0VOI5ok(String text, androidx.ui.core.Modifier modifier = Modifier, long color = Color.Unset, long fontSize = TextUnit.Inherit, androidx.ui.text.font.FontStyle? fontStyle = null, androidx.ui.text.font.FontWeight? fontWeight = null, androidx.ui.text.font.FontFamily? fontFamily = null, long letterSpacing = TextUnit.Inherit, androidx.ui.text.style.TextDecoration? textDecoration = null, androidx.ui.text.style.TextAlign? textAlign = null, long lineHeight = TextUnit.Inherit, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, boolean softWrap = true, int maxLines = 2147483647, java.util.Map<java.lang.String,androidx.ui.text.InlineTextContent> inlineContent = mapOf(), kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit>  androidx.ui.text.TextStyle style = currentTextStyle());
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/TextFieldSample.kt b/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/TextFieldSample.kt
index 5775958..27aa324 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/TextFieldSample.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/TextFieldSample.kt
@@ -20,16 +20,18 @@
 import androidx.compose.Composable
 import androidx.compose.getValue
 import androidx.compose.setValue
-import androidx.ui.foundation.TextField
+import androidx.ui.foundation.BaseTextField
+import androidx.ui.foundation.ExperimentalFoundationApi
 import androidx.ui.input.TextFieldValue
 import androidx.ui.layout.Stack
 import androidx.ui.savedinstancestate.savedInstanceState
 
 @Sampled
 @Composable
+@OptIn(ExperimentalFoundationApi::class)
 fun TextFieldSample() {
     var value by savedInstanceState(saver = TextFieldValue.Saver) { TextFieldValue() }
-    TextField(
+    BaseTextField(
         value = value,
          value = it }
     )
@@ -37,10 +39,11 @@
 
 @Sampled
 @Composable
+@OptIn(ExperimentalFoundationApi::class)
 fun PlaceholderTextFieldSample() {
     val state = savedInstanceState(saver = TextFieldValue.Saver) { TextFieldValue() }
     Stack {
-        TextField(
+        BaseTextField(
             value = state.value,
              state.value = it }
         )
diff --git a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/ui/foundation/SoftwareKeyboardTest.kt b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/ui/foundation/SoftwareKeyboardTest.kt
index a635fa1..296db4d 100644
--- a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/ui/foundation/SoftwareKeyboardTest.kt
+++ b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/ui/foundation/SoftwareKeyboardTest.kt
@@ -25,9 +25,9 @@
 import androidx.ui.input.TextInputService
 import androidx.ui.layout.fillMaxSize
 import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
-import androidx.ui.test.onNode
 import androidx.ui.test.hasInputMethodsSupport
+import androidx.ui.test.onNode
+import androidx.ui.test.performClick
 import androidx.ui.test.runOnIdle
 import androidx.ui.text.SoftwareKeyboardController
 import com.nhaarman.mockitokotlin2.any
@@ -42,6 +42,7 @@
 
 @SmallTest
 @RunWith(JUnit4::class)
+@OptIn(ExperimentalFoundationApi::class)
 class SoftwareKeyboardTest {
     @get:Rule
     val composeTestRule = createComposeRule()
@@ -60,7 +61,7 @@
                 TextInputServiceAmbient provides textInputService
             ) {
                 val state = state { TextFieldValue("") }
-                TextField(
+                BaseTextField(
                     value = state.value,
                     modifier = Modifier.fillMaxSize(),
                     >
diff --git a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/ui/foundation/TextFieldCursorTest.kt b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/ui/foundation/TextFieldCursorTest.kt
index 32f3433..f618206 100644
--- a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/ui/foundation/TextFieldCursorTest.kt
+++ b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/ui/foundation/TextFieldCursorTest.kt
@@ -46,6 +46,7 @@
 import kotlin.math.roundToInt
 
 @LargeTest
+@OptIn(ExperimentalFoundationApi::class)
 class TextFieldCursorTest {
 
     @get:Rule
@@ -60,7 +61,7 @@
         val height = 20.dp
         val latch = CountDownLatch(1)
         composeTestRule.setContent {
-            TextField(
+            BaseTextField(
                 value = TextFieldValue(),
                 >
                 textStyle = TextStyle(color = Color.White, background = Color.White),
@@ -95,7 +96,7 @@
             // the cursor to be next to the navigation bar which affects the red color to be a bit
             // different - possibly anti-aliasing.
             Box(Modifier.padding(10.dp)) {
-                TextField(
+                BaseTextField(
                     value = TextFieldValue(),
                     >
                     textStyle = TextStyle(color = Color.White, background = Color.White),
diff --git a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/ui/foundation/TextFieldOnValueChangeTextFieldValueTest.kt b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/ui/foundation/TextFieldOnValueChangeTextFieldValueTest.kt
index d822a9e..32725ff 100644
--- a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/ui/foundation/TextFieldOnValueChangeTextFieldValueTest.kt
+++ b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/ui/foundation/TextFieldOnValueChangeTextFieldValueTest.kt
@@ -54,6 +54,7 @@
 
 @SmallTest
 @RunWith(JUnit4::class)
+@OptIn(ExperimentalFoundationApi::class)
 class TextFieldOnValueChangeTextFieldValueTest {
     @get:Rule
     val composeTestRule = createComposeRule()
@@ -80,7 +81,7 @@
                         TextRange.Zero
                     )
                 }
-                TextField(
+                BaseTextField(
                     value = state.value,
                     >
                         state.value = it
diff --git a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/ui/foundation/TextFieldTest.kt b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/ui/foundation/TextFieldTest.kt
index 4bfad76..7892085 100644
--- a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/ui/foundation/TextFieldTest.kt
+++ b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/ui/foundation/TextFieldTest.kt
@@ -74,6 +74,7 @@
 
 @SmallTest
 @RunWith(JUnit4::class)
+@OptIn(ExperimentalFoundationApi::class)
 class TextFieldTest {
     @get:Rule
     val composeTestRule = createComposeRule()
@@ -94,7 +95,7 @@
             ) {
                 // TODO(b/161297615): Replace FocusModifier with Modifier.focus()
                 focusModifier = FocusModifier()
-                TextField(
+                BaseTextField(
                     value = state.value,
                     modifier = Modifier.fillMaxSize() + focusModifier,
                      state.value = it }
@@ -112,7 +113,7 @@
     @Composable
     private fun TextFieldApp() {
         val state = state { androidx.ui.input.TextFieldValue("") }
-        TextField(
+        BaseTextField(
             value = state.value,
             modifier = Modifier.fillMaxSize(),
             >
@@ -182,7 +183,7 @@
     @Composable
     private fun OnlyDigitsApp() {
         val state = state { androidx.ui.input.TextFieldValue("") }
-        TextField(
+        BaseTextField(
             value = state.value,
             modifier = Modifier.fillMaxSize(),
             >
@@ -266,7 +267,7 @@
                 TextInputServiceAmbient provides textInputService
             ) {
                 val state = state { androidx.ui.input.TextFieldValue("") }
-                TextField(
+                BaseTextField(
                     value = state.value,
                     modifier = Modifier.fillMaxSize(),
                     >
@@ -321,7 +322,7 @@
         var size: Int? = null
         composeTestRule.setContent {
             Box {
-                TextField(
+                BaseTextField(
                     value = androidx.ui.input.TextFieldValue(),
                     >
                     modifier = Modifier.onPositioned {
@@ -342,7 +343,7 @@
         var size: Int? = null
         composeTestRule.setContent {
             Box {
-                TextField(
+                BaseTextField(
                     value = androidx.ui.input.TextFieldValue(),
                     >
                     modifier = Modifier
@@ -367,7 +368,7 @@
         composeTestRule.setContent {
             Box(Modifier.preferredSize(parentSize)) {
                 Row {
-                    TextField(
+                    BaseTextField(
                         value = androidx.ui.input.TextFieldValue(),
                         >
                         modifier = Modifier
@@ -417,7 +418,7 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun textFieldNotFocused_cursorNotRendered() {
         composeTestRule.setContent {
-            TextField(
+            BaseTextField(
                 value = androidx.ui.input.TextFieldValue(),
                 >
                 textColor = Color.White,
@@ -440,7 +441,7 @@
     @Test
     fun defaultSemantics() {
         composeTestRule.setContent {
-            TextField(
+            BaseTextField(
                 modifier = Modifier.testTag("textField"),
                 value = androidx.ui.input.TextFieldValue(),
                 >
@@ -455,7 +456,7 @@
     @Test
     fun setImeAction_isReflectedInSemantics() {
         composeTestRule.setContent {
-            TextField(
+            BaseTextField(
                 value = androidx.ui.input.TextFieldValue(),
                 imeAction = ImeAction.Search,
                 >
diff --git a/ui/ui-foundation/src/commonMain/kotlin/androidx/ui/foundation/TextField.kt b/ui/ui-foundation/src/commonMain/kotlin/androidx/ui/foundation/BaseTextField.kt
similarity index 72%
rename from ui/ui-foundation/src/commonMain/kotlin/androidx/ui/foundation/TextField.kt
rename to ui/ui-foundation/src/commonMain/kotlin/androidx/ui/foundation/BaseTextField.kt
index 3fad560..cb238a5 100644
--- a/ui/ui-foundation/src/commonMain/kotlin/androidx/ui/foundation/TextField.kt
+++ b/ui/ui-foundation/src/commonMain/kotlin/androidx/ui/foundation/BaseTextField.kt
@@ -21,8 +21,6 @@
 import androidx.animation.keyframes
 import androidx.animation.repeatable
 import androidx.compose.Composable
-import androidx.compose.Immutable
-import androidx.compose.Stable
 import androidx.compose.State
 import androidx.compose.getValue
 import androidx.compose.mutableStateOf
@@ -42,17 +40,15 @@
 import androidx.ui.graphics.useOrElse
 import androidx.ui.input.ImeAction
 import androidx.ui.input.KeyboardType
+import androidx.ui.input.TextFieldValue
 import androidx.ui.input.VisualTransformation
 import androidx.ui.layout.defaultMinSizeConstraints
-import androidx.ui.savedinstancestate.Saver
-import androidx.ui.savedinstancestate.listSaver
 import androidx.ui.text.AnnotatedString
 import androidx.ui.text.CoreTextField
 import androidx.ui.text.InternalTextApi
 import androidx.ui.text.SoftwareKeyboardController
 import androidx.ui.text.TextFieldDelegate
 import androidx.ui.text.TextLayoutResult
-import androidx.ui.text.TextRange
 import androidx.ui.text.TextStyle
 import androidx.ui.text.constrain
 import androidx.ui.unit.dp
@@ -64,115 +60,14 @@
     set
 
 /**
- * A class holding information about the editing state.
- *
- * The input service updates text selection or cursor as well as text. You can observe and
- * control the selection, cursor and text altogether.
- *
- * @param text the text will be rendered
- * @param selection the selection range. If the selection is collapsed, it represents cursor
- * location. Do not specify outside of the text buffer.
- */
-@Suppress("DEPRECATION")
-@Deprecated(
-    "Please use androidx.ui.input.TextFieldValue instead",
-    ReplaceWith("TextFieldValue", "androidx.ui.input.TextFieldValue")
-)
-@Immutable
-data class TextFieldValue(
-    @Stable
-    val text: String = "",
-    @Stable
-    val selection: TextRange = TextRange.Zero
-) {
-    companion object {
-        /**
-         * The default [Saver] implementation for [TextFieldValue].
-         */
-        @Deprecated(
-            "Please use androidx.ui.input.TextFieldValue.Saver instead",
-            ReplaceWith(
-                "androidx.ui.input.TextFieldValue.Saver",
-                "androidx.ui.input.TextFieldValue.Companion.Saver"
-            )
-        )
-        val Saver = listSaver<TextFieldValue, Any>(
-            save = {
-                listOf(it.text, it.selection.start, it.selection.end)
-            },
-            restore = {
-                TextFieldValue(it[0] as String, TextRange(it[1] as Int, it[2] as Int))
-            }
-        )
-    }
-}
-
-@Suppress("DEPRECATION")
-@Composable
-@Deprecated("Use the TextField with androidx.ui.input.TextFieldValue instead.")
-fun TextField(
-    value: TextFieldValue,
-    onValueChange: (TextFieldValue) -> Unit,
-    modifier: Modifier = Modifier,
-    textColor: Color = Color.Unset,
-    textStyle: TextStyle = currentTextStyle(),
-    keyboardType: KeyboardType = KeyboardType.Text,
-    imeAction: ImeAction = ImeAction.Unspecified,
-    onFocusChange: (Boolean) -> Unit = {},
-    onImeActionPerformed: (ImeAction) -> Unit = {},
-    visualTransformation: VisualTransformation = VisualTransformation.None,
-    onTextLayout: (TextLayoutResult) -> Unit = {},
-    onTextInputStarted: (SoftwareKeyboardController) -> Unit = {},
-    cursorColor: Color = contentColor()
-) {
-    val fullModel = state { androidx.ui.input.TextFieldValue() }
-    if (fullModel.value.text != value.text || fullModel.value.selection != value.selection) {
-        @OptIn(InternalTextApi::class)
-        fullModel.value = androidx.ui.input.TextFieldValue(
-            text = value.text,
-            selection = value.selection.constrain(0, value.text.length)
-        )
-    }
-
-    val onValueChangeWrapper: (androidx.ui.input.TextFieldValue) -> Unit = {
-        val prevState = fullModel.value
-        fullModel.value = it
-        if (prevState.text != it.text || prevState.selection != it.selection) {
-            onValueChange(
-                TextFieldValue(
-                    it.text,
-                    it.selection
-                )
-            )
-        }
-    }
-
-    TextField(
-        value = fullModel.value,
-        >
-        modifier = modifier,
-        textColor = textColor,
-        textStyle = textStyle,
-        keyboardType = keyboardType,
-        imeAction = imeAction,
-        >
-        >
-        visualTransformation = visualTransformation,
-        >
-        >
-        cursorColor = cursorColor
-    )
-}
-
-/**
  * Composable that enables users to edit text via hardware or software keyboard.
  *
  * Whenever the user edits the text, [onValueChange] is called with the most up to date state
- * represented by [androidx.ui.input.TextFieldValue]. [androidx.ui.input.TextFieldValue] contains
+ * represented by [TextFieldValue]. [TextFieldValue] contains
  * the text entered by user, as well as selection, cursor and text composition information.
  * Please check [TextFieldValue] for the description of its contents.
  *
- * It is crucial that the value provided in the [onValueChange] is fed back into [TextField] in
+ * It is crucial that the value provided in the [onValueChange] is fed back into [BaseTextField] in
  * order to have the final state of the text being displayed. Example usage:
  * @sample androidx.ui.foundation.samples.TextFieldSample
  *
@@ -191,9 +86,9 @@
  * For example, if you need to include a hint in your TextField you can write a composable as below:
  * @sample androidx.ui.foundation.samples.PlaceholderTextFieldSample
  *
- * @param value The [androidx.ui.input.TextFieldValue] to be shown in the [TextField].
+ * @param value The [TextFieldValue] to be shown in the [BaseTextField].
  * @param onValueChange Called when the input service updates values in
- * [androidx.ui.input.TextFieldValue].
+ * [TextFieldValue].
  * @param modifier optional [Modifier] for this text field.
  * @param textColor [Color] to apply to the text. If [Color.Unset], and [textStyle] has no color
  * set, this will be [contentColor].
@@ -227,9 +122,10 @@
  * @see VisualTransformation
  */
 @Composable
-fun TextField(
-    value: androidx.ui.input.TextFieldValue,
-    onValueChange: (androidx.ui.input.TextFieldValue) -> Unit,
+@ExperimentalFoundationApi
+fun BaseTextField(
+    value: TextFieldValue,
+    onValueChange: (TextFieldValue) -> Unit,
     modifier: Modifier = Modifier,
     textColor: Color = Color.Unset,
     textStyle: TextStyle = currentTextStyle(),
@@ -242,10 +138,10 @@
     onTextInputStarted: (SoftwareKeyboardController) -> Unit = {},
     cursorColor: Color = contentColor()
 ) {
-    val fullModel = state { androidx.ui.input.TextFieldValue() }
+    val fullModel = state { TextFieldValue() }
     if (fullModel.value != value) {
         @OptIn(InternalTextApi::class)
-        fullModel.value = androidx.ui.input.TextFieldValue(
+        fullModel.value = TextFieldValue(
             text = value.text,
             selection = value.selection.constrain(0, value.text.length),
             composition = value.composition?.constrain(0, value.text.length)
@@ -319,7 +215,7 @@
 private fun Modifier.cursorModifier(
     color: AnimatedValue<Color, *>,
     cursorState: CursorState,
-    textFieldValue: State<androidx.ui.input.TextFieldValue>,
+    textFieldValue: State<TextFieldValue>,
     visualTransformation: VisualTransformation
 ): Modifier {
     return if (cursorState.focused && textFieldValue.value.selection.collapsed) {
@@ -336,7 +232,7 @@
 private data class CursorModifier(
     val color: AnimatedValue<Color, *>,
     val cursorState: CursorState,
-    val textFieldValue: State<androidx.ui.input.TextFieldValue>,
+    val textFieldValue: State<TextFieldValue>,
     val visualTransformation: VisualTransformation
 ) : DrawModifier {
     override fun ContentDrawScope.draw() {
diff --git a/ui/ui-foundation/src/commonMain/kotlin/androidx/ui/foundation/ExperimentalFoundationApi.kt b/ui/ui-foundation/src/commonMain/kotlin/androidx/ui/foundation/ExperimentalFoundationApi.kt
new file mode 100644
index 0000000..e683bb4
--- /dev/null
+++ b/ui/ui-foundation/src/commonMain/kotlin/androidx/ui/foundation/ExperimentalFoundationApi.kt
@@ -0,0 +1,21 @@
+/*
+ * 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.foundation
+
+@RequiresOptIn("This foundation API is experimental and is likely to change or be removed in the " +
+        "future.")
+annotation class ExperimentalFoundationApi
\ No newline at end of file
diff --git a/ui/ui-material/api/0.1.0-dev16.txt b/ui/ui-material/api/0.1.0-dev16.txt
index 7da7a33..42eeefe 100644
--- a/ui/ui-material/api/0.1.0-dev16.txt
+++ b/ui/ui-material/api/0.1.0-dev16.txt
@@ -141,11 +141,6 @@
     property public abstract androidx.ui.material.Emphasis medium;
   }
 
-  public final class FilledTextFieldKt {
-    method @androidx.compose.Composable public static void FilledTextField-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
-    method @androidx.compose.Composable public static void FilledTextField-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
-  }
-
   public final class FloatingActionButtonKt {
     method @androidx.compose.Composable public static void ExtendedFloatingActionButton-r9QhOOE(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)), long backgroundColor = MaterialTheme.colors.secondary, long contentColor = contentColorFor(backgroundColor), float elevation = 6.dp);
     method @androidx.compose.Composable public static void FloatingActionButton-rf6Y9PE(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), long backgroundColor = MaterialTheme.colors.secondary, long contentColor = contentColorFor(backgroundColor), float elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
@@ -317,6 +312,13 @@
   public final class TextFieldImplKt {
   }
 
+  public final class TextFieldKt {
+    method @Deprecated @androidx.compose.Composable public static void FilledTextField-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method @Deprecated @androidx.compose.Composable public static void FilledTextField-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method @androidx.compose.Composable public static void TextField-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method @androidx.compose.Composable public static void TextField-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+  }
+
   @androidx.compose.Immutable public final class 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();
diff --git a/ui/ui-material/api/current.txt b/ui/ui-material/api/current.txt
index 7da7a33..42eeefe 100644
--- a/ui/ui-material/api/current.txt
+++ b/ui/ui-material/api/current.txt
@@ -141,11 +141,6 @@
     property public abstract androidx.ui.material.Emphasis medium;
   }
 
-  public final class FilledTextFieldKt {
-    method @androidx.compose.Composable public static void FilledTextField-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
-    method @androidx.compose.Composable public static void FilledTextField-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
-  }
-
   public final class FloatingActionButtonKt {
     method @androidx.compose.Composable public static void ExtendedFloatingActionButton-r9QhOOE(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)), long backgroundColor = MaterialTheme.colors.secondary, long contentColor = contentColorFor(backgroundColor), float elevation = 6.dp);
     method @androidx.compose.Composable public static void FloatingActionButton-rf6Y9PE(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), long backgroundColor = MaterialTheme.colors.secondary, long contentColor = contentColorFor(backgroundColor), float elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
@@ -317,6 +312,13 @@
   public final class TextFieldImplKt {
   }
 
+  public final class TextFieldKt {
+    method @Deprecated @androidx.compose.Composable public static void FilledTextField-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method @Deprecated @androidx.compose.Composable public static void FilledTextField-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method @androidx.compose.Composable public static void TextField-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method @androidx.compose.Composable public static void TextField-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+  }
+
   @androidx.compose.Immutable public final class 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();
diff --git a/ui/ui-material/api/public_plus_experimental_0.1.0-dev16.txt b/ui/ui-material/api/public_plus_experimental_0.1.0-dev16.txt
index 7da7a33..42eeefe 100644
--- a/ui/ui-material/api/public_plus_experimental_0.1.0-dev16.txt
+++ b/ui/ui-material/api/public_plus_experimental_0.1.0-dev16.txt
@@ -141,11 +141,6 @@
     property public abstract androidx.ui.material.Emphasis medium;
   }
 
-  public final class FilledTextFieldKt {
-    method @androidx.compose.Composable public static void FilledTextField-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
-    method @androidx.compose.Composable public static void FilledTextField-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
-  }
-
   public final class FloatingActionButtonKt {
     method @androidx.compose.Composable public static void ExtendedFloatingActionButton-r9QhOOE(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)), long backgroundColor = MaterialTheme.colors.secondary, long contentColor = contentColorFor(backgroundColor), float elevation = 6.dp);
     method @androidx.compose.Composable public static void FloatingActionButton-rf6Y9PE(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), long backgroundColor = MaterialTheme.colors.secondary, long contentColor = contentColorFor(backgroundColor), float elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
@@ -317,6 +312,13 @@
   public final class TextFieldImplKt {
   }
 
+  public final class TextFieldKt {
+    method @Deprecated @androidx.compose.Composable public static void FilledTextField-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method @Deprecated @androidx.compose.Composable public static void FilledTextField-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method @androidx.compose.Composable public static void TextField-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method @androidx.compose.Composable public static void TextField-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+  }
+
   @androidx.compose.Immutable public final class 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();
diff --git a/ui/ui-material/api/public_plus_experimental_current.txt b/ui/ui-material/api/public_plus_experimental_current.txt
index 7da7a33..42eeefe 100644
--- a/ui/ui-material/api/public_plus_experimental_current.txt
+++ b/ui/ui-material/api/public_plus_experimental_current.txt
@@ -141,11 +141,6 @@
     property public abstract androidx.ui.material.Emphasis medium;
   }
 
-  public final class FilledTextFieldKt {
-    method @androidx.compose.Composable public static void FilledTextField-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
-    method @androidx.compose.Composable public static void FilledTextField-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
-  }
-
   public final class FloatingActionButtonKt {
     method @androidx.compose.Composable public static void ExtendedFloatingActionButton-r9QhOOE(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)), long backgroundColor = MaterialTheme.colors.secondary, long contentColor = contentColorFor(backgroundColor), float elevation = 6.dp);
     method @androidx.compose.Composable public static void FloatingActionButton-rf6Y9PE(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), long backgroundColor = MaterialTheme.colors.secondary, long contentColor = contentColorFor(backgroundColor), float elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
@@ -317,6 +312,13 @@
   public final class TextFieldImplKt {
   }
 
+  public final class TextFieldKt {
+    method @Deprecated @androidx.compose.Composable public static void FilledTextField-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method @Deprecated @androidx.compose.Composable public static void FilledTextField-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method @androidx.compose.Composable public static void TextField-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method @androidx.compose.Composable public static void TextField-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+  }
+
   @androidx.compose.Immutable public final class 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();
diff --git a/ui/ui-material/api/restricted_0.1.0-dev16.txt b/ui/ui-material/api/restricted_0.1.0-dev16.txt
index c00c493..c0d1804 100644
--- a/ui/ui-material/api/restricted_0.1.0-dev16.txt
+++ b/ui/ui-material/api/restricted_0.1.0-dev16.txt
@@ -142,11 +142,6 @@
     property public abstract androidx.ui.material.Emphasis medium;
   }
 
-  public final class FilledTextFieldKt {
-    method @androidx.compose.Composable public static void FilledTextField-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
-    method @androidx.compose.Composable public static void FilledTextField-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
-  }
-
   public final class FloatingActionButtonKt {
     method @androidx.compose.Composable public static void ExtendedFloatingActionButton-r9QhOOE(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)), long backgroundColor = MaterialTheme.colors.secondary, long contentColor = contentColorFor(backgroundColor), float elevation = 6.dp);
     method @androidx.compose.Composable public static void FloatingActionButton-rf6Y9PE(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), long backgroundColor = MaterialTheme.colors.secondary, long contentColor = contentColorFor(backgroundColor), float elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
@@ -318,6 +313,13 @@
   public final class TextFieldImplKt {
   }
 
+  public final class TextFieldKt {
+    method @Deprecated @androidx.compose.Composable public static void FilledTextField-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method @Deprecated @androidx.compose.Composable public static void FilledTextField-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method @androidx.compose.Composable public static void TextField-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method @androidx.compose.Composable public static void TextField-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+  }
+
   @androidx.compose.Immutable public final class 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();
diff --git a/ui/ui-material/api/restricted_current.txt b/ui/ui-material/api/restricted_current.txt
index c00c493..c0d1804 100644
--- a/ui/ui-material/api/restricted_current.txt
+++ b/ui/ui-material/api/restricted_current.txt
@@ -142,11 +142,6 @@
     property public abstract androidx.ui.material.Emphasis medium;
   }
 
-  public final class FilledTextFieldKt {
-    method @androidx.compose.Composable public static void FilledTextField-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
-    method @androidx.compose.Composable public static void FilledTextField-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
-  }
-
   public final class FloatingActionButtonKt {
     method @androidx.compose.Composable public static void ExtendedFloatingActionButton-r9QhOOE(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)), long backgroundColor = MaterialTheme.colors.secondary, long contentColor = contentColorFor(backgroundColor), float elevation = 6.dp);
     method @androidx.compose.Composable public static void FloatingActionButton-rf6Y9PE(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(CornerSize(50)), long backgroundColor = MaterialTheme.colors.secondary, long contentColor = contentColorFor(backgroundColor), float elevation = 6.dp, kotlin.jvm.functions.Function0<kotlin.Unit> icon);
@@ -318,6 +313,13 @@
   public final class TextFieldImplKt {
   }
 
+  public final class TextFieldKt {
+    method @Deprecated @androidx.compose.Composable public static void FilledTextField-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method @Deprecated @androidx.compose.Composable public static void FilledTextField-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method @androidx.compose.Composable public static void TextField-Vmoa5zc(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+    method @androidx.compose.Composable public static void TextField-o4GafH0(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, kotlin.jvm.functions.Function0<kotlin.Unit> label, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle textStyle = currentTextStyle(), kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder = null, kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon = null, kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon = null, boolean isErrorValue = false, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function2<? super androidx.ui.input.ImeAction,? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  _, _ ->  }, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>  kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit>  long activeColor = MaterialTheme.colors.primary, long inactiveColor = MaterialTheme.colors.onSurface, long errorColor = MaterialTheme.colors.error, long backgroundColor = MaterialTheme.colors.onSurface, androidx.ui.graphics.Shape shape = MaterialTheme.shapes.small.copy(ZeroCornerSize, ZeroCornerSize));
+  }
+
   @androidx.compose.Immutable public final class 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();
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
index df22042..b701611 100644
--- 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
@@ -39,10 +39,10 @@
 import androidx.ui.layout.preferredWidth
 import androidx.ui.material.Checkbox
 import androidx.ui.material.EmphasisAmbient
-import androidx.ui.material.FilledTextField
 import androidx.ui.material.MaterialTheme
 import androidx.ui.material.OutlinedTextField
 import androidx.ui.material.RadioButton
+import androidx.ui.material.TextField
 import androidx.ui.material.icons.Icons
 import androidx.ui.material.icons.filled.Favorite
 import androidx.ui.material.icons.filled.Info
@@ -95,7 +95,7 @@
         val textField: @Composable () -> Unit = @Composable {
             when (selectedTextField) {
                 TextFieldType.Filled ->
-                    FilledTextField(
+                    TextField(
                         value = text,
                          text = it },
                         label = {
diff --git a/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/TextFieldSamples.kt b/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/TextFieldSamples.kt
index c3f4da4..d048a62 100644
--- a/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/TextFieldSamples.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/ui/material/samples/TextFieldSamples.kt
@@ -30,9 +30,9 @@
 import androidx.ui.layout.Column
 import androidx.ui.layout.padding
 import androidx.ui.material.EmphasisAmbient
-import androidx.ui.material.FilledTextField
 import androidx.ui.material.MaterialTheme
 import androidx.ui.material.OutlinedTextField
+import androidx.ui.material.TextField
 import androidx.ui.material.icons.Icons
 import androidx.ui.material.icons.filled.Favorite
 import androidx.ui.material.icons.filled.Info
@@ -45,8 +45,7 @@
 fun SimpleFilledTextFieldSample() {
     var text by savedInstanceState { "" }
 
-    FilledTextField(
-        value = text,
+    TextField(value = text,
          text = it },
         label = { Text("Label") }
     )
@@ -69,8 +68,7 @@
 fun FilledTextFieldWithIcons() {
     var text by savedInstanceState { "" }
 
-    FilledTextField(
-        value = text,
+    TextField(value = text,
          text = it },
         label = { Text("Label") },
         leadingIcon = { Icon(Icons.Filled.Favorite) },
@@ -83,8 +81,7 @@
 fun FilledTextFieldWithPlaceholder() {
     var text by savedInstanceState { "" }
 
-    FilledTextField(
-        value = text,
+    TextField(value = text,
          text = it },
         label = { Text("Email") },
         placeholder = { Text("example@gmail.com") }
@@ -97,7 +94,7 @@
     var text by savedInstanceState { "" }
     val isValid = text.count() > 5 && '@' in text
 
-    FilledTextField(
+    TextField(
         value = text,
          text = it },
         label = {
@@ -115,7 +112,7 @@
     val invalidInput = text.count() < 5 || '@' !in text
 
     Column {
-        FilledTextField(
+        TextField(
             value = text,
              text = it },
             label = {
@@ -141,7 +138,7 @@
 @Composable
 fun PasswordFilledTextField() {
     var password by savedInstanceState { "" }
-    FilledTextField(
+    TextField(
         value = password,
          password = it },
         label = { Text("Enter password") },
@@ -157,8 +154,7 @@
         TextFieldValue("example", TextRange(0, 7))
     }
 
-    FilledTextField(
-        value = text,
+    TextField(value = text,
          text = it },
         label = { Text("Label") }
     )
@@ -183,8 +179,7 @@
 fun TextFieldWithHideKeyboardOnImeAction() {
     var text by savedInstanceState { "" }
 
-    FilledTextField(
-        value = text,
+    TextField(value = text,
          text = it },
         label = { Text("Label") },
         imeAction = ImeAction.Done,
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/textfield/FilledTextFieldTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/textfield/FilledTextFieldTest.kt
index 6a71f16..27a4261 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/textfield/FilledTextFieldTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/textfield/FilledTextFieldTest.kt
@@ -46,7 +46,7 @@
 import androidx.ui.layout.height
 import androidx.ui.layout.preferredHeight
 import androidx.ui.layout.preferredSize
-import androidx.ui.material.FilledTextField
+import androidx.ui.material.TextField
 import androidx.ui.material.MaterialTheme
 import androidx.ui.material.runOnIdleWithDensity
 import androidx.ui.material.setMaterialContent
@@ -99,7 +99,7 @@
     @Test
     fun testFilledTextField_minimumHeight() {
         testRule.setMaterialContentForSizeAssertions {
-            FilledTextField(
+            TextField(
                 value = "input",
                 >
                 label = {},
@@ -110,7 +110,7 @@
     }
 
     @Test
-    fun testTextFields_singleFocus() {
+    fun testFilledTextFields_singleFocus() {
         var textField1Focused = false
         val textField1Tag = "TextField1"
 
@@ -119,14 +119,14 @@
 
         testRule.setMaterialContent {
             Column {
-                FilledTextField(
+                TextField(
                     modifier = Modifier.testTag(textField1Tag),
                     value = "input1",
                     >
                     label = {},
                      textField1Focused = it }
                 )
-                FilledTextField(
+                TextField(
                     modifier = Modifier.testTag(textField2Tag),
                     value = "input2",
                     >
@@ -156,7 +156,7 @@
         var focused = false
         testRule.setMaterialContent {
             Box {
-                FilledTextField(
+                TextField(
                     modifier = Modifier.testTag(TextfieldTag),
                     value = "input",
                     >
@@ -182,7 +182,7 @@
         val labelPosition = Ref<Offset>()
         testRule.setMaterialContent {
             Box {
-                FilledTextField(
+                TextField(
                     value = "",
                     >
                     label = {
@@ -224,7 +224,7 @@
         val labelPosition = Ref<Offset>()
         testRule.setMaterialContent {
             Box {
-                FilledTextField(
+                TextField(
                     value = "",
                     >
                     modifier = Modifier.preferredHeight(height),
@@ -260,7 +260,7 @@
         val baseline = Ref<Float>()
         testRule.setMaterialContent {
             Box {
-                FilledTextField(
+                TextField(
                     modifier = Modifier.testTag(TextfieldTag),
                     value = "",
                     >
@@ -300,7 +300,7 @@
         val baseline = Ref<Float>()
         testRule.setMaterialContent {
             Box {
-                FilledTextField(
+                TextField(
                     value = "input",
                     >
                     label = {
@@ -336,7 +336,7 @@
         val placeholderPosition = Ref<Offset>()
         testRule.setMaterialContent {
             Box {
-                FilledTextField(
+                TextField(
                     modifier = Modifier
                         .preferredHeight(60.dp)
                         .testTag(TextfieldTag),
@@ -379,7 +379,7 @@
         val height = 60.dp
         testRule.setMaterialContent {
             Box {
-                FilledTextField(
+                TextField(
                     modifier = Modifier.preferredHeight(height).testTag(TextfieldTag),
                     value = "",
                     >
@@ -419,7 +419,7 @@
         val placeholderPosition = Ref<Offset>()
         testRule.setMaterialContent {
             Column {
-                FilledTextField(
+                TextField(
                     modifier = Modifier.testTag(TextfieldTag),
                     value = "input",
                     >
@@ -446,7 +446,7 @@
     @Test
     fun testFilledTextField_placeholderColorAndTextStyle() {
         testRule.setMaterialContent {
-            FilledTextField(
+            TextField(
                 modifier = Modifier.testTag(TextfieldTag),
                 value = "",
                 >
@@ -479,7 +479,7 @@
         val trailingSize = Ref<IntSize>()
 
         testRule.setMaterialContent {
-            FilledTextField(
+            TextField(
                 value = "text",
                 >
                 modifier = Modifier.preferredSize(textFieldWidth, textFieldHeight),
@@ -528,7 +528,7 @@
         val labelPosition = Ref<Offset>()
         testRule.setMaterialContent {
             Box {
-                FilledTextField(
+                TextField(
                     value = "",
                     >
                     modifier = Modifier.preferredHeight(height),
@@ -557,7 +557,7 @@
         val labelPosition = Ref<Offset>()
         testRule.setMaterialContent {
             Box {
-                FilledTextField(
+                TextField(
                     value = "",
                     >
                     modifier = Modifier.preferredHeight(height),
@@ -582,7 +582,7 @@
     @Test
     fun testFilledTextField_colorInLeadingTrailing_whenValidInput() {
         testRule.setMaterialContent {
-            FilledTextField(
+            TextField(
                 value = "",
                 >
                 label = {},
@@ -610,7 +610,7 @@
     @Test
     fun testFilledTextField_colorInLeadingTrailing_whenInvalidInput() {
         testRule.setMaterialContent {
-            FilledTextField(
+            TextField(
                 value = "",
                 >
                 label = {},
@@ -637,8 +637,8 @@
             Providers(
                 TextInputServiceAmbient provides textInputService
             ) {
-                var text = state { TextFieldValue("") }
-                FilledTextField(
+                val text = state { TextFieldValue("") }
+                TextField(
                     modifier = Modifier.testTag(TextfieldTag),
                     value = text.value,
                      text.value = it },
@@ -666,7 +666,7 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun testFilledTextField_visualTransformationPropagated() {
         testRule.setMaterialContent {
-            FilledTextField(
+            TextField(
                 modifier = Modifier.testTag(TextfieldTag),
                 value = "qwerty",
                 >
@@ -696,7 +696,7 @@
 
         testRule.setMaterialContent {
             Stack(Modifier.background(color = Color.White)) {
-                FilledTextField(
+                TextField(
                     modifier = Modifier.testTag(TextfieldTag),
                     value = "",
                     >
@@ -745,7 +745,7 @@
         var controller: SoftwareKeyboardController? = null
 
         testRule.setMaterialContent {
-            FilledTextField(
+            TextField(
                 modifier = Modifier.testTag(TextfieldTag),
                 value = "",
                 >
@@ -770,7 +770,7 @@
         var controller: SoftwareKeyboardController? = null
 
         testRule.setMaterialContent {
-            FilledTextField(
+            TextField(
                 modifier = Modifier.testTag(TextfieldTag),
                 value = "",
                 >
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/textfield/TextFieldScreenshotTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/textfield/TextFieldScreenshotTest.kt
index 7389518..7995e22 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/textfield/TextFieldScreenshotTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/textfield/TextFieldScreenshotTest.kt
@@ -27,9 +27,9 @@
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.Text
 import androidx.ui.layout.rtl
-import androidx.ui.material.FilledTextField
 import androidx.ui.material.GOLDEN_MATERIAL
 import androidx.ui.material.OutlinedTextField
+import androidx.ui.material.TextField
 import androidx.ui.material.setMaterialContent
 import androidx.ui.test.captureToBitmap
 import androidx.ui.test.createComposeRule
@@ -123,8 +123,7 @@
     fun filledTextField_withInput() {
         composeTestRule.setMaterialContent {
             Box(Modifier.semantics(mergeAllDescendants = true) {}.testTag(TextFieldTag)) {
-                FilledTextField(
-                    value = "Text",
+                TextField(value = "Text",
                     >
                     label = { Text("Label") }
                 )
@@ -138,8 +137,7 @@
     fun filledTextField_notFocused() {
         composeTestRule.setMaterialContent {
             Box(Modifier.semantics(mergeAllDescendants = true) {}.testTag(TextFieldTag)) {
-                FilledTextField(
-                    value = "",
+                TextField(value = "",
                     >
                     label = { Text("Label") }
                 )
@@ -153,8 +151,7 @@
     fun filledTextField_focused() {
         composeTestRule.setMaterialContent {
             Box(Modifier.semantics(mergeAllDescendants = true) {}.testTag(TextFieldTag)) {
-                FilledTextField(
-                    value = "",
+                TextField(value = "",
                     >
                     label = { Text("Label") }
                 )
@@ -171,8 +168,7 @@
     fun filledTextField_focused_rtl() {
         composeTestRule.setMaterialContent {
             Box(Modifier.semantics(mergeAllDescendants = true) {}.testTag(TextFieldTag).rtl) {
-                FilledTextField(
-                    value = "",
+                TextField(value = "",
                     >
                     label = { Text("Label") }
                 )
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/textfield/TextFieldTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/textfield/TextFieldTest.kt
index 7795b03..cdd294f 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/textfield/TextFieldTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/textfield/TextFieldTest.kt
@@ -22,7 +22,8 @@
 import androidx.test.filters.SdkSuppress
 import androidx.ui.core.Modifier
 import androidx.ui.core.testTag
-import androidx.ui.foundation.TextField
+import androidx.ui.foundation.BaseTextField
+import androidx.ui.foundation.ExperimentalFoundationApi
 import androidx.ui.foundation.background
 import androidx.ui.graphics.Color
 import androidx.ui.input.TextFieldValue
@@ -50,6 +51,7 @@
 
 @MediumTest
 @RunWith(JUnit4::class)
+@OptIn(ExperimentalFoundationApi::class)
 class TextFieldTest {
 
     private val TextfieldTag = "textField"
@@ -72,7 +74,7 @@
                     remember { scrollerPosition },
                     Modifier.preferredSize(width = 300.dp, height = 50.dp)
                 ) {
-                    TextField(
+                    BaseTextField(
                         value = TextFieldValue(LONG_TEXT),
                         >
                     )
@@ -96,7 +98,7 @@
                     remember { scrollerPosition },
                     Modifier.preferredSize(width = 300.dp, height = 50.dp)
                 ) {
-                    TextField(
+                    BaseTextField(
                         value = TextFieldValue(text),
                         >
                     )
@@ -129,7 +131,7 @@
                         remember { scrollerPosition },
                         Modifier.preferredSize(textFieldSize.toDp())
                     ) {
-                        TextField(
+                        BaseTextField(
                             value = TextFieldValue(LONG_TEXT),
                             >
                         )
@@ -157,7 +159,7 @@
                     remember { scrollerPosition },
                     Modifier.preferredSize(width = 300.dp, height = 50.dp).testTag(TextfieldTag)
                 ) {
-                    TextField(
+                    BaseTextField(
                         value = TextFieldValue(LONG_TEXT),
                         >
                     )
@@ -199,7 +201,7 @@
                 scrollerPosition,
                 Modifier.preferredSize(width = 300.dp, height = 50.dp).testTag(TextfieldTag)
             ) {
-                TextField(
+                BaseTextField(
                     value = TextFieldValue(LONG_TEXT),
                     >
                 )
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/FilledTextField.kt b/ui/ui-material/src/main/java/androidx/ui/material/TextField.kt
similarity index 61%
rename from ui/ui-material/src/main/java/androidx/ui/material/FilledTextField.kt
rename to ui/ui-material/src/main/java/androidx/ui/material/TextField.kt
index 95c43ea..cfbc54d 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/FilledTextField.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/TextField.kt
@@ -57,6 +57,8 @@
  * Material Design implementation of a
  * [Filled TextField](https://material.io/components/text-fields/#filled-text-field)
  *
+ * If you are looking for an outlined version, see [OutlinedTextField].
+ *
  * A simple example looks like:
  *
  * @sample androidx.ui.material.samples.SimpleFilledTextFieldSample
@@ -136,7 +138,7 @@
  * @param shape the shape of the text field's container
  */
 @Composable
-fun FilledTextField(
+fun TextField(
     value: String,
     onValueChange: (String) -> Unit,
     label: @Composable () -> Unit,
@@ -202,6 +204,164 @@
  * Material Design implementation of a
  * [Filled TextField](https://material.io/components/text-fields/#filled-text-field)
  *
+ * A simple example looks like:
+ *
+ * @sample androidx.ui.material.samples.SimpleFilledTextFieldSample
+ *
+ * You may provide a placeholder:
+ *
+ * @sample androidx.ui.material.samples.FilledTextFieldWithPlaceholder
+ *
+ * You can also provide leading and trailing icons:
+ *
+ * @sample androidx.ui.material.samples.FilledTextFieldWithIcons
+ *
+ * To handle the error input state, use [isErrorValue] parameter:
+ *
+ * @sample androidx.ui.material.samples.FilledTextFieldWithErrorState
+ *
+ * Additionally, you may provide additional message at the bottom:
+ *
+ * @sample androidx.ui.material.samples.TextFieldWithHelperMessage
+ *
+ * Password text field example:
+ *
+ * @sample androidx.ui.material.samples.PasswordFilledTextField
+ *
+ * Hiding a software keyboard on IME action performed:
+ *
+ * @sample androidx.ui.material.samples.TextFieldWithHideKeyboardOnImeAction
+ *
+ * If apart from input text change you also want to observe the cursor location, selection range,
+ * or IME composition use the FilledTextField overload with the [TextFieldValue] parameter instead.
+ *
+ * @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
+ * @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 the text field is not in focus
+ * @param modifier a [Modifier] for this text field
+ * @param textStyle the style to be applied to the input text. The default [textStyle] uses the
+ * [currentTextStyle] defined by the theme
+ * @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 leadingIcon the optional leading icon to be displayed at the beginning of the text field
+ * container
+ * @param trailingIcon the optional trailing icon to be displayed at the end of the text field
+ * container
+ * @param isErrorValue indicates if the text field's current value is in error. If set to true, the
+ * label, bottom indicator and trailing icon will be displayed in [errorColor] color
+ * @param visualTransformation transforms the visual representation of the input [value].
+ * For example, you can use [androidx.ui.input.PasswordVisualTransformation] to create a password
+ * text field. By default no visual transformation is applied
+ * @param keyboardType the keyboard type to be used with the text field.
+ * Note that the input type is not guaranteed. For example, an IME may send a non-ASCII character
+ * even if you set the keyboard type to [KeyboardType.Ascii]
+ * @param imeAction the IME action honored by the IME. The 'enter' key on the soft keyboard input
+ * will show a corresponding icon. For example, search icon may be shown if [ImeAction.Search] is
+ * selected. When a user taps on that 'enter' key, the [onImeActionPerformed] callback is called
+ * with the specified [ImeAction]
+ * @param onImeActionPerformed is triggered when the input service performs an [ImeAction].
+ * Note that the emitted IME action may be different from what you specified through the
+ * [imeAction] field. The callback also exposes a [SoftwareKeyboardController] instance as a
+ * parameter that can be used to request to hide the software keyboard
+ * @param onFocusChanged a callback to be invoked when the text field receives or loses focus
+ * If the boolean parameter value is `true`, it means the text field has focus, and vice versa
+ * @param onTextInputStarted a callback to be invoked when the connection with the platform's text
+ * input service (e.g. software keyboard on Android) has been established. Called with the
+ * [SoftwareKeyboardController] instance that can be used to request to show or hide the software
+ * keyboard
+ * @param activeColor the color of the label, bottom indicator and the cursor when the text field is
+ * in focus
+ * @param inactiveColor the color of either the input text or placeholder when the text field is in
+ * focus, and the color of the label and bottom indicator when the text field is not in focus
+ * @param errorColor the alternative color of the label, bottom indicator, cursor and trailing icon
+ * used when [isErrorValue] is set to true
+ * @param backgroundColor the background color of the text field's container. To the 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
+ */
+@Deprecated(
+    "FilledTextField has been renamed to TextField for better discoverability. Use " +
+            "TextField instead", replaceWith = ReplaceWith(
+        "TextField(" +
+                "value = value," +
+                "  +
+                " label = label," +
+                " modifier = modifier, " +
+                "textStyle = textStyle," +
+                " placeholder = placeholder," +
+                " leadingIcon = leadingIcon," +
+                " trailingIcon = trailingIcon," +
+                " isErrorValue = isErrorValue," +
+                " visualTransformation = visualTransformation, keyboardType = keyboardType," +
+                " imeAction = imeAction," +
+                "  +
+                "  +
+                "  +
+                " activeColor = activeColor," +
+                " inactiveColor = inactiveColor," +
+                " errorColor = errorColor," +
+                " backgroundColor = backgroundColor," +
+                " shape = shape)",
+        "androidx.ui.material.TextField"
+    )
+)
+@Composable
+fun FilledTextField(
+    value: String,
+    onValueChange: (String) -> Unit,
+    label: @Composable () -> Unit,
+    modifier: Modifier = Modifier,
+    textStyle: TextStyle = currentTextStyle(),
+    placeholder: @Composable (() -> Unit)? = null,
+    leadingIcon: @Composable (() -> Unit)? = null,
+    trailingIcon: @Composable (() -> Unit)? = null,
+    isErrorValue: Boolean = false,
+    visualTransformation: VisualTransformation = VisualTransformation.None,
+    keyboardType: KeyboardType = KeyboardType.Text,
+    imeAction: ImeAction = ImeAction.Unspecified,
+    onImeActionPerformed: (ImeAction, SoftwareKeyboardController?) -> Unit = { _, _ -> },
+    onFocusChanged: (Boolean) -> Unit = {},
+    onTextInputStarted: (SoftwareKeyboardController) -> Unit = {},
+    activeColor: Color = MaterialTheme.colors.primary,
+    inactiveColor: Color = MaterialTheme.colors.onSurface,
+    errorColor: Color = MaterialTheme.colors.error,
+    backgroundColor: Color = MaterialTheme.colors.onSurface,
+    shape: Shape =
+        MaterialTheme.shapes.small.copy(bottomLeft = ZeroCornerSize, bottomRight = ZeroCornerSize)
+) {
+    TextField(
+        value = value,
+        >
+        label = label,
+        modifier = modifier,
+        textStyle = textStyle,
+        placeholder = placeholder,
+        leadingIcon = leadingIcon,
+        trailingIcon = trailingIcon,
+        isErrorValue = isErrorValue,
+        visualTransformation = visualTransformation,
+        keyboardType = keyboardType,
+        imeAction = imeAction,
+        >
+        >
+        >
+        activeColor = activeColor,
+        inactiveColor = inactiveColor,
+        errorColor = errorColor,
+        backgroundColor = backgroundColor,
+        shape = shape
+    )
+}
+
+/**
+ * Material Design implementation of a
+ * [Filled TextField](https://material.io/components/text-fields/#filled-text-field)
+ *
+ * If you are looking for an outlined version, see [OutlinedTextField].
+ *
  * See example usage:
  * @sample androidx.ui.material.samples.FilledTextFieldSample
  *
@@ -257,7 +417,7 @@
  * @param shape the shape of the text field's container
  */
 @Composable
-fun FilledTextField(
+fun TextField(
     value: TextFieldValue,
     onValueChange: (TextFieldValue) -> Unit,
     label: @Composable () -> Unit,
@@ -305,6 +465,138 @@
     )
 }
 
+/**
+ * Material Design implementation of a
+ * [Filled TextField](https://material.io/components/text-fields/#filled-text-field)
+ *
+ * See example usage:
+ * @sample androidx.ui.material.samples.FilledTextFieldSample
+ *
+ * This overload provides access to the input text, cursor position, selection range and
+ * IME composition. If you only want to observe an input text change, use the FilledTextField
+ * overload with the [String] parameter instead.
+ *
+ * @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
+ * @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 the text field is not in focus
+ * @param modifier a [Modifier] for this text field
+ * @param textStyle the style to be applied to the input text. The default [textStyle] uses the
+ * [currentTextStyle] defined by the theme
+ * @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 leadingIcon the optional leading icon to be displayed at the beginning of the text field
+ * container
+ * @param trailingIcon the optional trailing icon to be displayed at the end of the text field
+ * container
+ * @param isErrorValue indicates if the text field's current value is in error. If set to true, the
+ * label, bottom indicator and trailing icon will be displayed in [errorColor] color
+ * @param visualTransformation transforms the visual representation of the input [value].
+ * For example, you can use [androidx.ui.input.PasswordVisualTransformation] to create a password
+ * text field. By default no visual transformation is applied
+ * @param keyboardType the keyboard type to be used with the text field.
+ * Note that the input type is not guaranteed. For example, an IME may send a non-ASCII character
+ * even if you set the keyboard type to [KeyboardType.Ascii]
+ * @param imeAction the IME action honored by the IME. The 'enter' key on the soft keyboard input
+ * will show a corresponding icon. For example, search icon may be shown if [ImeAction.Search] is
+ * selected. When a user taps on that 'enter' key, the [onImeActionPerformed] callback is called
+ * with the specified [ImeAction]
+ * @param onImeActionPerformed is triggered when the input service performs an [ImeAction].
+ * Note that the emitted IME action may be different from what you specified through the
+ * [imeAction] field. The callback also exposes a [SoftwareKeyboardController] instance as a
+ * parameter that can be used to request to hide the software keyboard
+ * @param onFocusChanged a callback to be invoked when the text field receives or loses focus
+ * If the boolean parameter value is `true`, it means the text field has focus, and vice versa
+ * @param onTextInputStarted a callback to be invoked when the connection with the platform's text
+ * input service (e.g. software keyboard on Android) has been established. Called with the
+ * [SoftwareKeyboardController] instance that can be used to request to show or hide the software
+ * keyboard
+ * @param activeColor the color of the label, bottom indicator and the cursor when the text field is
+ * in focus
+ * @param inactiveColor the color of either the input text or placeholder when the text field is in
+ * focus, and the color of the label and bottom indicator when the text field is not in focus
+ * @param errorColor the alternative color of the label, bottom indicator, cursor and trailing icon
+ * used when [isErrorValue] is set to true
+ * @param backgroundColor the background color of the text field's container. To the 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
+ */
+@Deprecated(
+    "FilledTextField has been renamed to TextField for better discoverability. Use " +
+            "TextField instead", replaceWith = ReplaceWith(
+        "TextField(" +
+                "value = value," +
+                "  +
+                " label = label," +
+                " modifier = modifier, " +
+                "textStyle = textStyle," +
+                " placeholder = placeholder," +
+                " leadingIcon = leadingIcon," +
+                " trailingIcon = trailingIcon," +
+                " isErrorValue = isErrorValue," +
+                " visualTransformation = visualTransformation, keyboardType = keyboardType," +
+                " imeAction = imeAction," +
+                "  +
+                "  +
+                "  +
+                " activeColor = activeColor," +
+                " inactiveColor = inactiveColor," +
+                " errorColor = errorColor," +
+                " backgroundColor = backgroundColor," +
+                " shape = shape)",
+        "androidx.ui.material.TextField"
+    )
+)
+@Composable
+fun FilledTextField(
+    value: TextFieldValue,
+    onValueChange: (TextFieldValue) -> Unit,
+    label: @Composable () -> Unit,
+    modifier: Modifier = Modifier,
+    textStyle: TextStyle = currentTextStyle(),
+    placeholder: @Composable (() -> Unit)? = null,
+    leadingIcon: @Composable (() -> Unit)? = null,
+    trailingIcon: @Composable (() -> Unit)? = null,
+    isErrorValue: Boolean = false,
+    visualTransformation: VisualTransformation = VisualTransformation.None,
+    keyboardType: KeyboardType = KeyboardType.Text,
+    imeAction: ImeAction = ImeAction.Unspecified,
+    onImeActionPerformed: (ImeAction, SoftwareKeyboardController?) -> Unit = { _, _ -> },
+    onFocusChanged: (Boolean) -> Unit = {},
+    onTextInputStarted: (SoftwareKeyboardController) -> Unit = {},
+    activeColor: Color = MaterialTheme.colors.primary,
+    inactiveColor: Color = MaterialTheme.colors.onSurface,
+    errorColor: Color = MaterialTheme.colors.error,
+    backgroundColor: Color = MaterialTheme.colors.onSurface,
+    shape: Shape =
+        MaterialTheme.shapes.small.copy(bottomLeft = ZeroCornerSize, bottomRight = ZeroCornerSize)
+) {
+    TextField(
+        value = value,
+        >
+        label = label,
+        modifier = modifier,
+        textStyle = textStyle,
+        placeholder = placeholder,
+        leadingIcon = leadingIcon,
+        trailingIcon = trailingIcon,
+        isErrorValue = isErrorValue,
+        visualTransformation = visualTransformation,
+        keyboardType = keyboardType,
+        imeAction = imeAction,
+        >
+        >
+        >
+        activeColor = activeColor,
+        inactiveColor = inactiveColor,
+        errorColor = errorColor,
+        backgroundColor = backgroundColor,
+        shape = shape
+    )
+}
+
 @Composable
 internal fun FilledTextFieldLayout(
     textFieldModifier: Modifier = Modifier,
@@ -354,7 +646,7 @@
 }
 
 /**
- * Layout of the text field, label and placeholder part in [FilledTextField]
+ * Layout of the text field, label and placeholder part in [TextField]
  */
 @Composable
 private fun TextFieldWithLabelLayout(
@@ -430,7 +722,7 @@
 }
 
 /**
- * Layout of the leading and trailing icons and the text field part in [FilledTextField].
+ * Layout of the leading and trailing icons and the text field part in [TextField].
  * It differs from the Row as it does not lose the minHeight constraint which is needed to
  * correctly place the text field and label.
  * Should be revisited if b/154202249 is fixed so that Row could be used instead
@@ -517,7 +809,7 @@
 
 /**
  * Places the provided text field, placeholder and label with respect to the baseline offsets in
- * [FilledTextField]
+ * [TextField]
  */
 private fun Placeable.PlacementScope.placeLabelAndTextfield(
     width: Int,
@@ -545,7 +837,7 @@
 }
 
 /**
- * Places the provided text field and placeholder center vertically in [FilledTextField]
+ * Places the provided text field and placeholder center vertically in [TextField]
  */
 private fun Placeable.PlacementScope.placeTextfield(
     height: Int,
@@ -563,7 +855,7 @@
 }
 
 /**
- * A draw modifier that draws a bottom indicator line in [FilledTextField]
+ * A draw modifier that draws a bottom indicator line in [TextField]
  */
 private fun Modifier.drawIndicatorLine(lineWidth: Dp, color: Color): Modifier {
     return drawBehind {
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/TextFieldImpl.kt b/ui/ui-material/src/main/java/androidx/ui/material/TextFieldImpl.kt
index 44581d7..d2373ef 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/TextFieldImpl.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/TextFieldImpl.kt
@@ -54,7 +54,8 @@
 import androidx.ui.core.offset
 import androidx.ui.foundation.ContentColorAmbient
 import androidx.ui.foundation.ProvideTextStyle
-import androidx.ui.foundation.TextField
+import androidx.ui.foundation.BaseTextField
+import androidx.ui.foundation.ExperimentalFoundationApi
 import androidx.ui.foundation.clickable
 import androidx.ui.foundation.gestures.rememberScrollableController
 import androidx.ui.foundation.gestures.scrollable
@@ -82,9 +83,10 @@
 }
 
 /**
- * Implementation of the [FilledTextField] and [OutlinedTextField]
+ * Implementation of the [TextField] and [OutlinedTextField]
  */
 @Composable
+@OptIn(ExperimentalFoundationApi::class)
 internal fun TextFieldImpl(
     type: TextFieldType,
     value: TextFieldValue,
@@ -146,7 +148,7 @@
                 },
                 modifier = tagModifier
             ) {
-                TextField(
+                BaseTextField(
                     value = value,
                     modifier = focusModifier,
                     textStyle = textStyle,
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/ErrorMessagesTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/ErrorMessagesTest.kt
index 4036a2a..1564f0f 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/ErrorMessagesTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/ErrorMessagesTest.kt
@@ -54,6 +54,8 @@
                 "Node #X at (X, X, X, X)px, Tag: 'MyButton'\n" +
                 "Disabled = 'kotlin.Unit'\n" +
                 "Text = 'Toggle'\n" +
+                "GetTextLayoutResult = 'AccessibilityAction(label=null, action=Function1<" +
+                "java.util.List<androidx.ui.text.TextLayoutResult>, java.lang.Boolean>)'\n" +
                 "MergeDescendants = 'true'\n" +
                 "Has 1 sibling\n" +
                 "Selector used: (TestTag = 'MyButton')"
@@ -229,6 +231,8 @@
                 "The node is no longer in the tree, last known semantics:\n" +
                 "Node #X at (X, X, X, X)px\n" +
                 "Text = 'Hello'\n" +
+                "GetTextLayoutResult = 'AccessibilityAction(label=null, action=Function1<" +
+                "java.util.List<androidx.ui.text.TextLayoutResult>, java.lang.Boolean>)'\n" +
                 "Has 1 sibling\n" +
                 "Original selector: Text = 'Hello' (ignoreCase: false)"
         ) {
@@ -254,6 +258,8 @@
                 "The node is no longer in the tree, last known semantics:\n" +
                 "Node #X at (X, X, X, X)px\n" +
                 "Text = 'Hello'\n" +
+                "GetTextLayoutResult = 'AccessibilityAction(label=null, action=Function1<" +
+                "java.util.List<androidx.ui.text.TextLayoutResult>, java.lang.Boolean>)'\n" +
                 "Has 1 sibling\n" +
                 "Original selector: Text = 'Hello' (ignoreCase: false)"
         ) {
@@ -279,6 +285,8 @@
                 "The node is no longer in the tree, last known semantics:\n" +
                 "Node #X at (X, X, X, X)px\n" +
                 "Text = 'Hello'\n" +
+                "GetTextLayoutResult = 'AccessibilityAction(label=null, action=Function1<" +
+                "java.util.List<androidx.ui.text.TextLayoutResult>, java.lang.Boolean>)'\n" +
                 "Has 1 sibling\n" +
                 "Original selector: Text = 'Hello' (ignoreCase: false)"
         ) {
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/PrintToStringTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/PrintToStringTest.kt
index afd122c..6da687b 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/PrintToStringTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/PrintToStringTest.kt
@@ -69,6 +69,8 @@
         assertThat(obfuscateNodesInfo(result)).isEqualTo("" +
                 "Node #X at (X, X, X, X)px\n" +
                 "Text = 'Hello'\n" +
+                "GetTextLayoutResult = 'AccessibilityAction(label=null, action=Function1<java" +
+                ".util.List<androidx.ui.text.TextLayoutResult>, java.lang.Boolean>)'\n" +
                 "Has 1 sibling")
     }
 
@@ -85,9 +87,13 @@
         assertThat(obfuscateNodesInfo(result)).isEqualTo("" +
                 "1) Node #X at (X, X, X, X)px\n" +
                 "Text = 'Hello'\n" +
+                "GetTextLayoutResult = 'AccessibilityAction(label=null, action=Function1<java" +
+                ".util.List<androidx.ui.text.TextLayoutResult>, java.lang.Boolean>)'\n" +
                 "Has 1 sibling\n" +
                 "2) Node #X at (X, X, X, X)px\n" +
                 "Text = 'World'\n" +
+                "GetTextLayoutResult = 'AccessibilityAction(label=null, action=Function1<java" +
+                ".util.List<androidx.ui.text.TextLayoutResult>, java.lang.Boolean>)'\n" +
                 "Has 1 sibling")
     }
 
@@ -117,9 +123,15 @@
                 "    |    \n" +
                 "    |    Text = 'Button'\n" +
+                "    |    GetTextLayoutResult = 'AccessibilityAction(label=null, " +
+                "action=Function1<java.util.List<androidx.ui.text.TextLayoutResult>, java.lang" +
+                ".Boolean>)'\n" +
                 "    |    MergeDescendants = 'true'\n" +
                 "    |-Node #X at (X, X, X, X)px\n" +
-                "      Text = 'Hello'")
+                "      Text = 'Hello'\n" +
+                "      GetTextLayoutResult = 'AccessibilityAction(label=null, " +
+                "action=Function1<java.util.List<androidx.ui.text.TextLayoutResult>, java.lang" +
+                ".Boolean>)'")
     }
 
     @Test
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/TextActionsTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/TextActionsTest.kt
index c92a955..4dedfed 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/TextActionsTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/TextActionsTest.kt
@@ -21,7 +21,8 @@
 import androidx.test.filters.MediumTest
 import androidx.ui.core.Modifier
 import androidx.ui.core.testTag
-import androidx.ui.foundation.TextField
+import androidx.ui.foundation.BaseTextField
+import androidx.ui.foundation.ExperimentalFoundationApi
 import androidx.ui.input.ImeAction
 import androidx.ui.input.TextFieldValue
 import androidx.ui.test.util.BoundaryNode
@@ -43,13 +44,14 @@
     val composeTestRule = createComposeRule()
 
     @Composable
+    @OptIn(ExperimentalFoundationApi::class)
     fun TextFieldUi(
         imeAction: ImeAction = ImeAction.Unspecified,
         onImeActionPerformed: (ImeAction) -> Unit = {},
         textCallback: (String) -> Unit = {}
     ) {
         val state = state { TextFieldValue("") }
-        TextField(
+        BaseTextField(
             modifier = Modifier.testTag(fieldTag),
             value = state.value,
             imeAction = imeAction,
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/build.gradle b/ui/ui-text/integration-tests/ui-text-compose-demos/build.gradle
index fa9965d..ac9c41b 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/build.gradle
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/build.gradle
@@ -19,6 +19,7 @@
     implementation project(":compose:ui:ui")
     implementation project(":compose:foundation:foundation")
     implementation project(":compose:foundation:foundation-layout")
+    implementation project(":compose:foundation:foundation-text")
     implementation project(":compose:ui:ui-text")
     implementation project(":compose:ui:ui-text:samples")
 }
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/ComposeInputField.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/ComposeInputField.kt
index 3dd01e0..c705658 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/ComposeInputField.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/ComposeInputField.kt
@@ -20,11 +20,11 @@
 import androidx.compose.key
 import androidx.compose.state
 import androidx.ui.foundation.ScrollableColumn
-import androidx.ui.foundation.TextField
 import androidx.ui.input.ImeAction
 import androidx.ui.input.KeyboardType
 import androidx.ui.input.TextFieldValue
 import androidx.ui.savedinstancestate.savedInstanceState
+import androidx.ui.text.CoreTextField
 import androidx.ui.text.SoftwareKeyboardController
 import androidx.ui.text.TextStyle
 
@@ -82,7 +82,7 @@
 ) {
     val controller = state<SoftwareKeyboardController?> { null }
     val state = savedInstanceState(saver = TextFieldValue.Saver) { TextFieldValue() }
-    TextField(
+    CoreTextField(
         value = state.value,
         keyboardType = keyboardType,
         imeAction = imeAction,
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/ComposeInputFieldFocusTransition.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/ComposeInputFieldFocusTransition.kt
index e3140a6..d9dc8b4 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/ComposeInputFieldFocusTransition.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/ComposeInputFieldFocusTransition.kt
@@ -20,11 +20,11 @@
 import androidx.compose.state
 import androidx.ui.core.focus.FocusModifier
 import androidx.ui.foundation.ScrollableColumn
-import androidx.ui.foundation.TextField
 import androidx.ui.graphics.Color
 import androidx.ui.input.ImeAction
 import androidx.ui.input.TextFieldValue
 import androidx.ui.savedinstancestate.savedInstanceState
+import androidx.ui.text.CoreTextField
 import androidx.ui.text.TextStyle
 import androidx.ui.unit.sp
 
@@ -59,11 +59,10 @@
     } else {
         Color.Black
     }
-    TextField(
+    CoreTextField(
         value = state.value,
         modifier = focusModifier,
-        textColor = color,
-        textStyle = TextStyle(fontSize = 32.sp),
+        textStyle = TextStyle(color = color, fontSize = 32.sp),
         >
             state.value = it
         },
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/ComposeInputFieldTrickyUseCase.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/ComposeInputFieldTrickyUseCase.kt
index 012c2ec..e12b0da 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/ComposeInputFieldTrickyUseCase.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/ComposeInputFieldTrickyUseCase.kt
@@ -18,10 +18,10 @@
 
 import androidx.compose.Composable
 import androidx.ui.foundation.ScrollableColumn
-import androidx.ui.foundation.TextField
 import androidx.ui.input.KeyboardType
 import androidx.ui.input.TextFieldValue
 import androidx.ui.savedinstancestate.savedInstanceState
+import androidx.ui.text.CoreTextField
 import androidx.ui.text.TextStyle
 import androidx.ui.unit.sp
 
@@ -39,7 +39,7 @@
 @Composable
 private fun RejectNonDigits() {
     val state = savedInstanceState(saver = TextFieldValue.Saver) { TextFieldValue() }
-    TextField(
+    CoreTextField(
         value = state.value,
         textStyle = TextStyle(fontSize = 32.sp),
         >
@@ -54,7 +54,7 @@
 @Composable
 private fun RejectComposition() {
     val state = savedInstanceState(saver = TextFieldValue.Saver) { TextFieldValue() }
-    TextField(
+    CoreTextField(
         value = state.value,
         textStyle = TextStyle(fontSize = 32.sp),
         >
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/ComposeVariousInputField.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/ComposeVariousInputField.kt
index 3fc0785..24c9c19 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/ComposeVariousInputField.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/ComposeVariousInputField.kt
@@ -27,7 +27,6 @@
 import androidx.ui.foundation.Box
 import androidx.ui.foundation.ScrollableColumn
 import androidx.ui.foundation.Text
-import androidx.ui.foundation.TextField
 import androidx.ui.foundation.background
 import androidx.ui.geometry.Rect
 import androidx.ui.graphics.Color
@@ -41,6 +40,7 @@
 import androidx.ui.intl.LocaleList
 import androidx.ui.savedinstancestate.savedInstanceState
 import androidx.ui.text.AnnotatedString
+import androidx.ui.text.CoreTextField
 import androidx.ui.text.TextLayoutResult
 import androidx.ui.text.TextRange
 import androidx.ui.text.TextStyle
@@ -261,7 +261,7 @@
     visualTransformation: VisualTransformation
 ) {
     val state = savedInstanceState(saver = TextFieldValue.Saver) { TextFieldValue() }
-    TextField(
+    CoreTextField(
         value = state.value,
         keyboardType = keyboardType,
         imeAction = imeAction,
@@ -289,7 +289,7 @@
     val state = savedInstanceState(saver = TextFieldValue.Saver) { TextFieldValue() }
 
     val inputField = @Composable {
-        TextField(
+        CoreTextField(
             modifier = Modifier.layoutId("inputField"),
             value = state.value,
              state.value = it },
@@ -320,7 +320,7 @@
     val state = savedInstanceState(saver = TextFieldValue.Saver) { TextFieldValue() }
     val layoutResult = state<TextLayoutResult?> { null }
     Layout({
-        TextField(
+        CoreTextField(
             modifier = Modifier.layoutId("inputField"),
             value = state.value,
              state.value = it },
@@ -348,7 +348,7 @@
                     )
                 // Place the custom cursor aligned with center of the original cursor.
                 val cursorX = (cursorRect.left + cursorRect.right) / 2 -
-                            (cursorPlacable.width / 2)
+                        (cursorPlacable.width / 2)
                 cursorPlacable.place(cursorX.roundToInt(), cursorRect.top.roundToInt())
             }
         }
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/TailFollowingTextField.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/TailFollowingTextField.kt
index ff406da..c9fda8d 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/TailFollowingTextField.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/TailFollowingTextField.kt
@@ -22,7 +22,6 @@
 import androidx.ui.core.Modifier
 import androidx.ui.core.clipToBounds
 import androidx.ui.core.constrainWidth
-import androidx.ui.foundation.TextField
 import androidx.ui.foundation.background
 import androidx.ui.graphics.Color
 import androidx.ui.input.TextFieldValue
@@ -31,6 +30,7 @@
 import androidx.ui.layout.height
 import androidx.ui.layout.padding
 import androidx.ui.savedinstancestate.savedInstanceState
+import androidx.ui.text.CoreTextField
 import androidx.ui.text.TextStyle
 import androidx.ui.unit.dp
 import androidx.ui.unit.min
@@ -77,7 +77,7 @@
 ) {
     Layout(
         children = @Composable {
-            TextField(
+            CoreTextField(
                 value = value,
                 >
                 textStyle = textStyle
@@ -113,7 +113,7 @@
 ) {
     Layout(
         children = @Composable {
-            TextField(
+            CoreTextField(
                 value = value,
                 >
                 textStyle = textStyle
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/TextFieldWIthScroller.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/TextFieldWIthScroller.kt
index ab7feb5..1cd7674 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/TextFieldWIthScroller.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/ui/text/demos/TextFieldWIthScroller.kt
@@ -20,9 +20,9 @@
 import androidx.compose.state
 import androidx.ui.core.Modifier
 import androidx.ui.foundation.ScrollableColumn
-import androidx.ui.foundation.TextField
 import androidx.ui.input.TextFieldValue
 import androidx.ui.layout.padding
+import androidx.ui.text.CoreTextField
 import androidx.ui.unit.dp
 
 @Composable
@@ -33,7 +33,7 @@
                 text = List(100) { "Line: $it" }.joinToString("\n")
             )
         }
-        TextField(
+        CoreTextField(
             value = state.value,
              state.value = it },
             modifier = Modifier
diff --git a/ui/ui-text/src/commonMain/kotlin/androidx/ui/text/CoreText.kt b/ui/ui-text/src/commonMain/kotlin/androidx/ui/text/CoreText.kt
index 31c9e93..97f1d54 100644
--- a/ui/ui-text/src/commonMain/kotlin/androidx/ui/text/CoreText.kt
+++ b/ui/ui-text/src/commonMain/kotlin/androidx/ui/text/CoreText.kt
@@ -35,10 +35,12 @@
 import androidx.ui.core.onPositioned
 import androidx.ui.core.selection.Selectable
 import androidx.ui.core.selection.SelectionRegistrarAmbient
+import androidx.ui.core.semantics.semantics
 import androidx.ui.geometry.Offset
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.drawscope.drawCanvas
 import androidx.ui.graphics.Paint
+import androidx.ui.semantics.getTextLayoutResult
 import androidx.ui.text.font.Font
 import androidx.ui.text.selection.MultiWidgetSelectionDelegate
 import androidx.ui.text.style.TextAlign
@@ -151,6 +153,15 @@
                 }
                 state.previousGlobalPosition = newGlobalPosition
             }
+        }.semantics {
+            getTextLayoutResult {
+                if (state.layoutResult != null) {
+                    it.add(state.layoutResult!!)
+                    true
+                } else {
+                    false
+                }
+            }
         },
         minIntrinsicWidthMeasureBlock = { _, _ ->
             state.textDelegate.layoutIntrinsics(layoutDirection)
diff --git a/ui/ui-text/src/commonMain/kotlin/androidx/ui/text/CoreTextField.kt b/ui/ui-text/src/commonMain/kotlin/androidx/ui/text/CoreTextField.kt
index 62ce6bd..f677d38 100644
--- a/ui/ui-text/src/commonMain/kotlin/androidx/ui/text/CoreTextField.kt
+++ b/ui/ui-text/src/commonMain/kotlin/androidx/ui/text/CoreTextField.kt
@@ -61,6 +61,7 @@
 import androidx.ui.text.selection.TextFieldSelectionManager
 import kotlin.math.max
 import androidx.ui.semantics.focused
+import androidx.ui.semantics.getTextLayoutResult
 import androidx.ui.semantics.setSelection
 import androidx.ui.semantics.setText
 import androidx.ui.semantics.text
@@ -342,7 +343,7 @@
         }
 
         val semanticsModifier = semanticsModifier(value, imeAction, focusModifier,
-            onValueChangeWrapper)
+            state, onValueChangeWrapper)
 
         onDispose { manager.hideSelectionToolbar() }
 
@@ -507,6 +508,7 @@
     value: TextFieldValue,
     imeAction: ImeAction,
     focusModifier: FocusModifier,
+    state: TextFieldState,
     onValueChange: (TextFieldValue) -> Unit
 ): Modifier {
     return Modifier.semantics {
@@ -515,6 +517,14 @@
         this.text = AnnotatedString(value.text)
         this.textSelectionRange = value.selection
         this.focused = focusModifier.focusState == FocusState.Focused
+        getTextLayoutResult {
+            if (state.layoutResult != null) {
+                it.add(state.layoutResult!!)
+                true
+            } else {
+                false
+            }
+        }
         setText {
             onValueChange(TextFieldValue(it.text, TextRange(it.text.length)))
             true
diff --git a/work/workmanager-ktx/src/main/java/androidx/work/CoroutineWorker.kt b/work/workmanager-ktx/src/main/java/androidx/work/CoroutineWorker.kt
index fa05791..22f8775 100644
--- a/work/workmanager-ktx/src/main/java/androidx/work/CoroutineWorker.kt
+++ b/work/workmanager-ktx/src/main/java/androidx/work/CoroutineWorker.kt
@@ -100,7 +100,7 @@
 
     /**
      * Makes the [CoroutineWorker] run in the context of a foreground [android.app.Service]. This
-     * is a suspending function unlike the [setProgressAsync] API which returns a
+     * is a suspending function unlike the [setForegroundAsync] API which returns a
      * [ListenableFuture].
      *
      * @param foregroundInfo The [ForegroundInfo]