Merge "Clear-up confusion in EmptyResultSetException documentation." into androidx-master-dev
diff --git a/activity/activity/build.gradle b/activity/activity/build.gradle
index d4480b5..81bb273 100644
--- a/activity/activity/build.gradle
+++ b/activity/activity/build.gradle
@@ -21,7 +21,7 @@
     api("androidx.core:core:1.1.0-rc01")
     api(project(":lifecycle:lifecycle-runtime"))
     api(project(":lifecycle:lifecycle-viewmodel"))
-    api(project(":savedstate"))
+    api("androidx.savedstate:savedstate:1.0.0-rc01")
 
     androidTestImplementation(KOTLIN_STDLIB)
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/annotations/OWNERS b/annotation/annotation/OWNERS
similarity index 100%
rename from annotations/OWNERS
rename to annotation/annotation/OWNERS
diff --git a/annotations/README.md b/annotation/annotation/README.md
similarity index 100%
rename from annotations/README.md
rename to annotation/annotation/README.md
diff --git a/annotations/api/1.0.0.txt b/annotation/annotation/api/1.0.0.txt
similarity index 100%
rename from annotations/api/1.0.0.txt
rename to annotation/annotation/api/1.0.0.txt
diff --git a/annotations/api/1.1.0-alpha01.txt b/annotation/annotation/api/1.1.0-alpha01.txt
similarity index 100%
rename from annotations/api/1.1.0-alpha01.txt
rename to annotation/annotation/api/1.1.0-alpha01.txt
diff --git a/annotations/api/1.1.0-alpha02.txt b/annotation/annotation/api/1.1.0-alpha02.txt
similarity index 100%
rename from annotations/api/1.1.0-alpha02.txt
rename to annotation/annotation/api/1.1.0-alpha02.txt
diff --git a/annotations/api/1.1.0-alpha03.txt b/annotation/annotation/api/1.1.0-alpha03.txt
similarity index 100%
rename from annotations/api/1.1.0-alpha03.txt
rename to annotation/annotation/api/1.1.0-alpha03.txt
diff --git a/annotations/api/1.1.0-beta01.txt b/annotation/annotation/api/1.1.0-beta01.txt
similarity index 100%
rename from annotations/api/1.1.0-beta01.txt
rename to annotation/annotation/api/1.1.0-beta01.txt
diff --git a/annotations/api/1.1.0-beta02.txt b/annotation/annotation/api/1.1.0-beta02.txt
similarity index 100%
rename from annotations/api/1.1.0-beta02.txt
rename to annotation/annotation/api/1.1.0-beta02.txt
diff --git a/annotations/api/1.1.0-rc01.txt b/annotation/annotation/api/1.1.0-rc01.txt
similarity index 100%
rename from annotations/api/1.1.0-rc01.txt
rename to annotation/annotation/api/1.1.0-rc01.txt
diff --git a/annotations/api/1.2.0-alpha01.txt b/annotation/annotation/api/1.2.0-alpha01.txt
similarity index 100%
rename from annotations/api/1.2.0-alpha01.txt
rename to annotation/annotation/api/1.2.0-alpha01.txt
diff --git a/annotations/api/current.txt b/annotation/annotation/api/current.txt
similarity index 100%
rename from annotations/api/current.txt
rename to annotation/annotation/api/current.txt
diff --git a/annotations/api/restricted_1.0.0.txt b/annotation/annotation/api/restricted_1.0.0.txt
similarity index 100%
rename from annotations/api/restricted_1.0.0.txt
rename to annotation/annotation/api/restricted_1.0.0.txt
diff --git a/annotations/api/restricted_1.1.0-alpha02.txt b/annotation/annotation/api/restricted_1.1.0-alpha02.txt
similarity index 100%
rename from annotations/api/restricted_1.1.0-alpha02.txt
rename to annotation/annotation/api/restricted_1.1.0-alpha02.txt
diff --git a/annotations/api/restricted_1.1.0-alpha03.txt b/annotation/annotation/api/restricted_1.1.0-alpha03.txt
similarity index 100%
rename from annotations/api/restricted_1.1.0-alpha03.txt
rename to annotation/annotation/api/restricted_1.1.0-alpha03.txt
diff --git a/annotations/api/restricted_1.1.0-beta01.txt b/annotation/annotation/api/restricted_1.1.0-beta01.txt
similarity index 100%
rename from annotations/api/restricted_1.1.0-beta01.txt
rename to annotation/annotation/api/restricted_1.1.0-beta01.txt
diff --git a/annotations/api/restricted_1.1.0-beta02.txt b/annotation/annotation/api/restricted_1.1.0-beta02.txt
similarity index 100%
rename from annotations/api/restricted_1.1.0-beta02.txt
rename to annotation/annotation/api/restricted_1.1.0-beta02.txt
diff --git a/annotations/api/restricted_1.1.0-rc01.txt b/annotation/annotation/api/restricted_1.1.0-rc01.txt
similarity index 100%
rename from annotations/api/restricted_1.1.0-rc01.txt
rename to annotation/annotation/api/restricted_1.1.0-rc01.txt
diff --git a/annotations/api/restricted_1.2.0-alpha01.txt b/annotation/annotation/api/restricted_1.2.0-alpha01.txt
similarity index 100%
rename from annotations/api/restricted_1.2.0-alpha01.txt
rename to annotation/annotation/api/restricted_1.2.0-alpha01.txt
diff --git a/annotations/api/restricted_current.txt b/annotation/annotation/api/restricted_current.txt
similarity index 100%
rename from annotations/api/restricted_current.txt
rename to annotation/annotation/api/restricted_current.txt
diff --git a/annotations/build.gradle b/annotation/annotation/build.gradle
similarity index 100%
rename from annotations/build.gradle
rename to annotation/annotation/build.gradle
diff --git a/annotations/external-annotations/androidx/annotation/annotations.xml b/annotation/annotation/external-annotations/androidx/annotation/annotations.xml
similarity index 100%
rename from annotations/external-annotations/androidx/annotation/annotations.xml
rename to annotation/annotation/external-annotations/androidx/annotation/annotations.xml
diff --git a/annotations/src/main/java/androidx/annotation/AnimRes.java b/annotation/annotation/src/main/java/androidx/annotation/AnimRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/AnimRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/AnimRes.java
diff --git a/annotations/src/main/java/androidx/annotation/AnimatorRes.java b/annotation/annotation/src/main/java/androidx/annotation/AnimatorRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/AnimatorRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/AnimatorRes.java
diff --git a/annotations/src/main/java/androidx/annotation/AnyRes.java b/annotation/annotation/src/main/java/androidx/annotation/AnyRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/AnyRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/AnyRes.java
diff --git a/annotations/src/main/java/androidx/annotation/AnyThread.java b/annotation/annotation/src/main/java/androidx/annotation/AnyThread.java
similarity index 96%
rename from annotations/src/main/java/androidx/annotation/AnyThread.java
rename to annotation/annotation/src/main/java/androidx/annotation/AnyThread.java
index e314445..31eb733 100644
--- a/annotations/src/main/java/androidx/annotation/AnyThread.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/AnyThread.java
@@ -42,6 +42,6 @@
  */
 @Documented
 @Retention(CLASS)
-@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER})
+@Target({METHOD, CONSTRUCTOR, TYPE, PARAMETER})
 public @interface AnyThread {
 }
diff --git a/annotations/src/main/java/androidx/annotation/ArrayRes.java b/annotation/annotation/src/main/java/androidx/annotation/ArrayRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/ArrayRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/ArrayRes.java
diff --git a/annotations/src/main/java/androidx/annotation/AttrRes.java b/annotation/annotation/src/main/java/androidx/annotation/AttrRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/AttrRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/AttrRes.java
diff --git a/annotations/src/main/java/androidx/annotation/BinderThread.java b/annotation/annotation/src/main/java/androidx/annotation/BinderThread.java
similarity index 96%
rename from annotations/src/main/java/androidx/annotation/BinderThread.java
rename to annotation/annotation/src/main/java/androidx/annotation/BinderThread.java
index 2f944a9..cfc6bd8 100644
--- a/annotations/src/main/java/androidx/annotation/BinderThread.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/BinderThread.java
@@ -38,6 +38,6 @@
  */
 @Documented
 @Retention(CLASS)
-@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER})
+@Target({METHOD, CONSTRUCTOR, TYPE, PARAMETER})
 public @interface BinderThread {
-}
\ No newline at end of file
+}
diff --git a/annotations/src/main/java/androidx/annotation/BoolRes.java b/annotation/annotation/src/main/java/androidx/annotation/BoolRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/BoolRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/BoolRes.java
diff --git a/annotations/src/main/java/androidx/annotation/CallSuper.java b/annotation/annotation/src/main/java/androidx/annotation/CallSuper.java
similarity index 99%
rename from annotations/src/main/java/androidx/annotation/CallSuper.java
rename to annotation/annotation/src/main/java/androidx/annotation/CallSuper.java
index 5a683bb..f39d81c 100644
--- a/annotations/src/main/java/androidx/annotation/CallSuper.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/CallSuper.java
@@ -35,4 +35,4 @@
 @Retention(CLASS)
 @Target({METHOD})
 public @interface CallSuper {
-}
\ No newline at end of file
+}
diff --git a/annotations/src/main/java/androidx/annotation/CheckResult.java b/annotation/annotation/src/main/java/androidx/annotation/CheckResult.java
similarity index 95%
rename from annotations/src/main/java/androidx/annotation/CheckResult.java
rename to annotation/annotation/src/main/java/androidx/annotation/CheckResult.java
index 14334ab..b47cc76 100644
--- a/annotations/src/main/java/androidx/annotation/CheckResult.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/CheckResult.java
@@ -40,7 +40,8 @@
 @Retention(CLASS)
 @Target({METHOD})
 public @interface CheckResult {
-    /** Defines the name of the suggested method to use instead, if applicable (using
+    /**
+     * Defines the name of the suggested method to use instead, if applicable (using
      * the same signature format as javadoc.) If there is more than one possibility,
      * list them all separated by commas.
      * <p>
@@ -55,4 +56,4 @@
      * </pre>
      */
     String suggest() default "";
-}
\ No newline at end of file
+}
diff --git a/annotations/src/main/java/androidx/annotation/ColorInt.java b/annotation/annotation/src/main/java/androidx/annotation/ColorInt.java
similarity index 95%
rename from annotations/src/main/java/androidx/annotation/ColorInt.java
rename to annotation/annotation/src/main/java/androidx/annotation/ColorInt.java
index 7c18682..a10102c 100644
--- a/annotations/src/main/java/androidx/annotation/ColorInt.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/ColorInt.java
@@ -35,6 +35,6 @@
  * }</pre>
  */
 @Retention(CLASS)
-@Target({PARAMETER,METHOD,LOCAL_VARIABLE,FIELD})
+@Target({PARAMETER, METHOD, LOCAL_VARIABLE, FIELD})
 public @interface ColorInt {
-}
\ No newline at end of file
+}
diff --git a/annotations/src/main/java/androidx/annotation/ColorLong.java b/annotation/annotation/src/main/java/androidx/annotation/ColorLong.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/ColorLong.java
rename to annotation/annotation/src/main/java/androidx/annotation/ColorLong.java
diff --git a/annotations/src/main/java/androidx/annotation/ColorRes.java b/annotation/annotation/src/main/java/androidx/annotation/ColorRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/ColorRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/ColorRes.java
diff --git a/annotations/src/main/java/androidx/annotation/ContentView.java b/annotation/annotation/src/main/java/androidx/annotation/ContentView.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/ContentView.java
rename to annotation/annotation/src/main/java/androidx/annotation/ContentView.java
diff --git a/annotations/src/main/java/androidx/annotation/DimenRes.java b/annotation/annotation/src/main/java/androidx/annotation/DimenRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/DimenRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/DimenRes.java
diff --git a/annotations/src/main/java/androidx/annotation/Dimension.java b/annotation/annotation/src/main/java/androidx/annotation/Dimension.java
similarity index 95%
rename from annotations/src/main/java/androidx/annotation/Dimension.java
rename to annotation/annotation/src/main/java/androidx/annotation/Dimension.java
index db5bae0..ddbc0ab 100644
--- a/annotations/src/main/java/androidx/annotation/Dimension.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/Dimension.java
@@ -33,7 +33,7 @@
  */
 @Documented
 @Retention(CLASS)
-@Target({METHOD,PARAMETER,FIELD,LOCAL_VARIABLE,ANNOTATION_TYPE})
+@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE, ANNOTATION_TYPE})
 public @interface Dimension {
     @DimensionUnit
     int unit() default PX;
diff --git a/annotations/src/main/java/androidx/annotation/DimensionUnit.java b/annotation/annotation/src/main/java/androidx/annotation/DimensionUnit.java
similarity index 92%
rename from annotations/src/main/java/androidx/annotation/DimensionUnit.java
rename to annotation/annotation/src/main/java/androidx/annotation/DimensionUnit.java
index de849ef..ea3be505 100644
--- a/annotations/src/main/java/androidx/annotation/DimensionUnit.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/DimensionUnit.java
@@ -25,11 +25,12 @@
  * @hide
  */
 @IntDef({Dimension.PX,
-         Dimension.DP,
-         Dimension.SP}
+        Dimension.DP,
+        Dimension.SP}
 // Important: If updating these constants, also update
 // ../../../../external-annotations/android/support/annotation/annotations.xml
 )
+@RestrictTo(RestrictTo.Scope.LIBRARY)
 @Retention(SOURCE)
 @interface DimensionUnit {
 }
diff --git a/annotations/src/main/java/androidx/annotation/DrawableRes.java b/annotation/annotation/src/main/java/androidx/annotation/DrawableRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/DrawableRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/DrawableRes.java
diff --git a/annotations/src/main/java/androidx/annotation/FloatRange.java b/annotation/annotation/src/main/java/androidx/annotation/FloatRange.java
similarity index 84%
rename from annotations/src/main/java/androidx/annotation/FloatRange.java
rename to annotation/annotation/src/main/java/androidx/annotation/FloatRange.java
index cbaaf0a..712833f 100644
--- a/annotations/src/main/java/androidx/annotation/FloatRange.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/FloatRange.java
@@ -37,13 +37,18 @@
  * </code></pre>
  */
 @Retention(CLASS)
-@Target({METHOD,PARAMETER,FIELD,LOCAL_VARIABLE,ANNOTATION_TYPE})
+@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE, ANNOTATION_TYPE})
 public @interface FloatRange {
-    /** Smallest value. Whether it is inclusive or not is determined
-     * by {@link #fromInclusive} */
+    /**
+     * Smallest value. Whether it is inclusive or not is determined
+     * by {@link #fromInclusive}
+     */
     double from() default Double.NEGATIVE_INFINITY;
-    /** Largest value. Whether it is inclusive or not is determined
-     * by {@link #toInclusive} */
+
+    /**
+     * Largest value. Whether it is inclusive or not is determined
+     * by {@link #toInclusive}
+     */
     double to() default Double.POSITIVE_INFINITY;
 
     /** Whether the from value is included in the range */
@@ -51,4 +56,4 @@
 
     /** Whether the to value is included in the range */
     boolean toInclusive() default true;
-}
\ No newline at end of file
+}
diff --git a/annotations/src/main/java/androidx/annotation/FontRes.java b/annotation/annotation/src/main/java/androidx/annotation/FontRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/FontRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/FontRes.java
diff --git a/annotations/src/main/java/androidx/annotation/FractionRes.java b/annotation/annotation/src/main/java/androidx/annotation/FractionRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/FractionRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/FractionRes.java
diff --git a/annotations/src/main/java/androidx/annotation/GuardedBy.java b/annotation/annotation/src/main/java/androidx/annotation/GuardedBy.java
similarity index 96%
rename from annotations/src/main/java/androidx/annotation/GuardedBy.java
rename to annotation/annotation/src/main/java/androidx/annotation/GuardedBy.java
index 74c01ee..0cf98a0 100644
--- a/annotations/src/main/java/androidx/annotation/GuardedBy.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/GuardedBy.java
@@ -40,7 +40,7 @@
  *     return object;
  * }</pre>
  */
-@Target({ ElementType.FIELD, ElementType.METHOD })
+@Target({ElementType.FIELD, ElementType.METHOD})
 @Retention(RetentionPolicy.CLASS)
 public @interface GuardedBy {
     String value();
diff --git a/annotations/src/main/java/androidx/annotation/HalfFloat.java b/annotation/annotation/src/main/java/androidx/annotation/HalfFloat.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/HalfFloat.java
rename to annotation/annotation/src/main/java/androidx/annotation/HalfFloat.java
diff --git a/annotations/src/main/java/androidx/annotation/IdRes.java b/annotation/annotation/src/main/java/androidx/annotation/IdRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/IdRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/IdRes.java
diff --git a/annotations/src/main/java/androidx/annotation/InspectableProperty.java b/annotation/annotation/src/main/java/androidx/annotation/InspectableProperty.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/InspectableProperty.java
rename to annotation/annotation/src/main/java/androidx/annotation/InspectableProperty.java
diff --git a/annotations/src/main/java/androidx/annotation/IntDef.java b/annotation/annotation/src/main/java/androidx/annotation/IntDef.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/IntDef.java
rename to annotation/annotation/src/main/java/androidx/annotation/IntDef.java
diff --git a/annotations/src/main/java/androidx/annotation/IntRange.java b/annotation/annotation/src/main/java/androidx/annotation/IntRange.java
similarity index 95%
rename from annotations/src/main/java/androidx/annotation/IntRange.java
rename to annotation/annotation/src/main/java/androidx/annotation/IntRange.java
index 23b4b31..883d687 100644
--- a/annotations/src/main/java/androidx/annotation/IntRange.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/IntRange.java
@@ -37,10 +37,11 @@
  * </code></pre>
  */
 @Retention(CLASS)
-@Target({METHOD,PARAMETER,FIELD,LOCAL_VARIABLE,ANNOTATION_TYPE})
+@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE, ANNOTATION_TYPE})
 public @interface IntRange {
     /** Smallest value, inclusive */
     long from() default Long.MIN_VALUE;
+
     /** Largest value, inclusive */
     long to() default Long.MAX_VALUE;
-}
\ No newline at end of file
+}
diff --git a/annotations/src/main/java/androidx/annotation/IntegerRes.java b/annotation/annotation/src/main/java/androidx/annotation/IntegerRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/IntegerRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/IntegerRes.java
diff --git a/annotations/src/main/java/androidx/annotation/InterpolatorRes.java b/annotation/annotation/src/main/java/androidx/annotation/InterpolatorRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/InterpolatorRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/InterpolatorRes.java
diff --git a/annotations/src/main/java/androidx/annotation/Keep.java b/annotation/annotation/src/main/java/androidx/annotation/Keep.java
similarity index 95%
rename from annotations/src/main/java/androidx/annotation/Keep.java
rename to annotation/annotation/src/main/java/androidx/annotation/Keep.java
index 3ae6583..087aaea 100644
--- a/annotations/src/main/java/androidx/annotation/Keep.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/Keep.java
@@ -41,6 +41,6 @@
  * </code></pre>
  */
 @Retention(CLASS)
-@Target({PACKAGE,TYPE,ANNOTATION_TYPE,CONSTRUCTOR,METHOD,FIELD})
+@Target({PACKAGE, TYPE, ANNOTATION_TYPE, CONSTRUCTOR, METHOD, FIELD})
 public @interface Keep {
 }
diff --git a/annotations/src/main/java/androidx/annotation/LayoutRes.java b/annotation/annotation/src/main/java/androidx/annotation/LayoutRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/LayoutRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/LayoutRes.java
diff --git a/annotations/src/main/java/androidx/annotation/LongDef.java b/annotation/annotation/src/main/java/androidx/annotation/LongDef.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/LongDef.java
rename to annotation/annotation/src/main/java/androidx/annotation/LongDef.java
diff --git a/annotations/src/main/java/androidx/annotation/MainThread.java b/annotation/annotation/src/main/java/androidx/annotation/MainThread.java
similarity index 97%
rename from annotations/src/main/java/androidx/annotation/MainThread.java
rename to annotation/annotation/src/main/java/androidx/annotation/MainThread.java
index a557a97..415e551 100644
--- a/annotations/src/main/java/androidx/annotation/MainThread.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/MainThread.java
@@ -46,6 +46,6 @@
  */
 @Documented
 @Retention(CLASS)
-@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER})
+@Target({METHOD, CONSTRUCTOR, TYPE, PARAMETER})
 public @interface MainThread {
 }
diff --git a/annotations/src/main/java/androidx/annotation/MenuRes.java b/annotation/annotation/src/main/java/androidx/annotation/MenuRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/MenuRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/MenuRes.java
diff --git a/annotations/src/main/java/androidx/annotation/NavigationRes.java b/annotation/annotation/src/main/java/androidx/annotation/NavigationRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/NavigationRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/NavigationRes.java
diff --git a/annotations/src/main/java/androidx/annotation/NonNull.java b/annotation/annotation/src/main/java/androidx/annotation/NonNull.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/NonNull.java
rename to annotation/annotation/src/main/java/androidx/annotation/NonNull.java
diff --git a/annotations/src/main/java/androidx/annotation/Nullable.java b/annotation/annotation/src/main/java/androidx/annotation/Nullable.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/Nullable.java
rename to annotation/annotation/src/main/java/androidx/annotation/Nullable.java
diff --git a/annotations/src/main/java/androidx/annotation/PluralsRes.java b/annotation/annotation/src/main/java/androidx/annotation/PluralsRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/PluralsRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/PluralsRes.java
diff --git a/annotations/src/main/java/androidx/annotation/ProductionVisibility.java b/annotation/annotation/src/main/java/androidx/annotation/ProductionVisibility.java
similarity index 87%
rename from annotations/src/main/java/androidx/annotation/ProductionVisibility.java
rename to annotation/annotation/src/main/java/androidx/annotation/ProductionVisibility.java
index d2ed9d9..0e88a11 100644
--- a/annotations/src/main/java/androidx/annotation/ProductionVisibility.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/ProductionVisibility.java
@@ -25,12 +25,13 @@
  * @hide
  */
 @IntDef({VisibleForTesting.PRIVATE,
-         VisibleForTesting.PACKAGE_PRIVATE,
-         VisibleForTesting.PROTECTED,
-         VisibleForTesting.NONE}
+        VisibleForTesting.PACKAGE_PRIVATE,
+        VisibleForTesting.PROTECTED,
+        VisibleForTesting.NONE}
 // Important: If updating these constants, also update
 // ../../../../external-annotations/android/support/annotation/annotations.xml
 )
+@RestrictTo(RestrictTo.Scope.LIBRARY)
 @Retention(SOURCE)
 @interface ProductionVisibility {
 }
diff --git a/annotations/src/main/java/androidx/annotation/Px.java b/annotation/annotation/src/main/java/androidx/annotation/Px.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/Px.java
rename to annotation/annotation/src/main/java/androidx/annotation/Px.java
diff --git a/annotations/src/main/java/androidx/annotation/RawRes.java b/annotation/annotation/src/main/java/androidx/annotation/RawRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/RawRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/RawRes.java
diff --git a/annotations/src/main/java/androidx/annotation/RequiresApi.java b/annotation/annotation/src/main/java/androidx/annotation/RequiresApi.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/RequiresApi.java
rename to annotation/annotation/src/main/java/androidx/annotation/RequiresApi.java
diff --git a/annotations/src/main/java/androidx/annotation/RequiresFeature.java b/annotation/annotation/src/main/java/androidx/annotation/RequiresFeature.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/RequiresFeature.java
rename to annotation/annotation/src/main/java/androidx/annotation/RequiresFeature.java
diff --git a/annotations/src/main/java/androidx/annotation/RequiresPermission.java b/annotation/annotation/src/main/java/androidx/annotation/RequiresPermission.java
similarity index 98%
rename from annotations/src/main/java/androidx/annotation/RequiresPermission.java
rename to annotation/annotation/src/main/java/androidx/annotation/RequiresPermission.java
index cc9c988..583dde9 100644
--- a/annotations/src/main/java/androidx/annotation/RequiresPermission.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/RequiresPermission.java
@@ -74,7 +74,7 @@
  * </code></pre>
  */
 @Retention(CLASS)
-@Target({ANNOTATION_TYPE,METHOD,CONSTRUCTOR,FIELD,PARAMETER})
+@Target({ANNOTATION_TYPE, METHOD, CONSTRUCTOR, FIELD, PARAMETER})
 public @interface RequiresPermission {
     /**
      * The name of the permission that is required, if precisely one permission
diff --git a/annotations/src/main/java/androidx/annotation/RestrictTo.java b/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.java
similarity index 97%
rename from annotations/src/main/java/androidx/annotation/RestrictTo.java
rename to annotation/annotation/src/main/java/androidx/annotation/RestrictTo.java
index 461e1a4..bd51eb5 100644
--- a/annotations/src/main/java/androidx/annotation/RestrictTo.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.java
@@ -47,7 +47,7 @@
  * </code></pre>
  */
 @Retention(CLASS)
-@Target({ANNOTATION_TYPE,TYPE,METHOD,CONSTRUCTOR,FIELD,PACKAGE})
+@Target({ANNOTATION_TYPE, TYPE, METHOD, CONSTRUCTOR, FIELD, PACKAGE})
 public @interface RestrictTo {
 
     /**
diff --git a/annotations/src/main/java/androidx/annotation/Size.java b/annotation/annotation/src/main/java/androidx/annotation/Size.java
similarity index 95%
rename from annotations/src/main/java/androidx/annotation/Size.java
rename to annotation/annotation/src/main/java/androidx/annotation/Size.java
index d178eca..bc4b0ee 100644
--- a/annotations/src/main/java/androidx/annotation/Size.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/Size.java
@@ -38,14 +38,17 @@
  * }</pre>
  */
 @Retention(CLASS)
-@Target({PARAMETER,LOCAL_VARIABLE,METHOD,FIELD,ANNOTATION_TYPE})
+@Target({PARAMETER, LOCAL_VARIABLE, METHOD, FIELD, ANNOTATION_TYPE})
 public @interface Size {
     /** An exact size (or -1 if not specified) */
     long value() default -1;
+
     /** A minimum size, inclusive */
     long min() default Long.MIN_VALUE;
+
     /** A maximum size, inclusive */
     long max() default Long.MAX_VALUE;
+
     /** The size must be a multiple of this factor */
     long multiple() default 1;
-}
\ No newline at end of file
+}
diff --git a/annotations/src/main/java/androidx/annotation/StringDef.java b/annotation/annotation/src/main/java/androidx/annotation/StringDef.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/StringDef.java
rename to annotation/annotation/src/main/java/androidx/annotation/StringDef.java
diff --git a/annotations/src/main/java/androidx/annotation/StringRes.java b/annotation/annotation/src/main/java/androidx/annotation/StringRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/StringRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/StringRes.java
diff --git a/annotations/src/main/java/androidx/annotation/StyleRes.java b/annotation/annotation/src/main/java/androidx/annotation/StyleRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/StyleRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/StyleRes.java
diff --git a/annotations/src/main/java/androidx/annotation/StyleableRes.java b/annotation/annotation/src/main/java/androidx/annotation/StyleableRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/StyleableRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/StyleableRes.java
diff --git a/annotations/src/main/java/androidx/annotation/TransitionRes.java b/annotation/annotation/src/main/java/androidx/annotation/TransitionRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/TransitionRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/TransitionRes.java
diff --git a/annotations/src/main/java/androidx/annotation/UiThread.java b/annotation/annotation/src/main/java/androidx/annotation/UiThread.java
similarity index 97%
rename from annotations/src/main/java/androidx/annotation/UiThread.java
rename to annotation/annotation/src/main/java/androidx/annotation/UiThread.java
index 0b87397..6417f9d 100644
--- a/annotations/src/main/java/androidx/annotation/UiThread.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/UiThread.java
@@ -47,6 +47,6 @@
  */
 @Documented
 @Retention(CLASS)
-@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER})
+@Target({METHOD, CONSTRUCTOR, TYPE, PARAMETER})
 public @interface UiThread {
 }
diff --git a/annotations/src/main/java/androidx/annotation/VisibleForTesting.java b/annotation/annotation/src/main/java/androidx/annotation/VisibleForTesting.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/VisibleForTesting.java
rename to annotation/annotation/src/main/java/androidx/annotation/VisibleForTesting.java
diff --git a/annotations/src/main/java/androidx/annotation/WorkerThread.java b/annotation/annotation/src/main/java/androidx/annotation/WorkerThread.java
similarity index 96%
rename from annotations/src/main/java/androidx/annotation/WorkerThread.java
rename to annotation/annotation/src/main/java/androidx/annotation/WorkerThread.java
index f102301..9247fb0 100644
--- a/annotations/src/main/java/androidx/annotation/WorkerThread.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/WorkerThread.java
@@ -38,6 +38,6 @@
  */
 @Documented
 @Retention(CLASS)
-@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER})
+@Target({METHOD, CONSTRUCTOR, TYPE, PARAMETER})
 public @interface WorkerThread {
-}
\ No newline at end of file
+}
diff --git a/annotations/src/main/java/androidx/annotation/XmlRes.java b/annotation/annotation/src/main/java/androidx/annotation/XmlRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/XmlRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/XmlRes.java
diff --git a/annotations/src/main/resources/META-INF/proguard/androidx-annotations.pro b/annotation/annotation/src/main/resources/META-INF/proguard/androidx-annotations.pro
similarity index 100%
rename from annotations/src/main/resources/META-INF/proguard/androidx-annotations.pro
rename to annotation/annotation/src/main/resources/META-INF/proguard/androidx-annotations.pro
diff --git a/annotations/AndroidManifest.xml b/annotations/AndroidManifest.xml
deleted file mode 100644
index 2593e0e..0000000
--- a/annotations/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest package="android.support.annotation" />
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java
index 04e6892..fb97e5e 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java
@@ -16,7 +16,6 @@
 
 package androidx.appcompat.widget;
 
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
 import static androidx.core.widget.AutoSizeableTextView.PLATFORM_SUPPORTS_AUTOSIZE;
 
@@ -330,79 +329,6 @@
         }
     }
 
-    // To accessible from callback */
-    /** @hide */
-    @RestrictTo(LIBRARY)
-    public void setTypefaceByCallback(@NonNull Typeface typeface) {
-        if (mAsyncFontPending) {
-            mView.setTypeface(typeface);
-            mFontTypeface = typeface;
-        }
-    }
-
-    // To accessible from callback */
-    /** @hide */
-    @RestrictTo(LIBRARY)
-    public void runOnUiThread(@NonNull Runnable runnable) {
-        mView.post(runnable);
-    }
-
-    /**
-     * Helper class for applying Typeface on UI thread.
-     */
-    private static class ApplyTextViewCallback extends ResourcesCompat.FontCallback {
-        private class TypefaceApplyCallback implements Runnable {
-            private final WeakReference<AppCompatTextHelper> mParent;
-            private final Typeface mTypeface;
-
-            TypefaceApplyCallback(@NonNull WeakReference<AppCompatTextHelper> parent,
-                    @NonNull Typeface tf) {
-                mParent = parent;
-                mTypeface = tf;
-            }
-
-            @Override
-            public void run() {
-                final AppCompatTextHelper parent = mParent.get();
-                if (parent == null) {
-                    return;  // The view has gone. Do nothing.
-                }
-                parent.setTypefaceByCallback(mTypeface);
-            }
-        }
-
-        private final WeakReference<AppCompatTextHelper> mParent;
-        private final int mFontWeight;
-        private final int mStyle;
-
-        ApplyTextViewCallback(@NonNull AppCompatTextHelper parent, int fontWeight,
-                int style) {
-            mParent = new WeakReference<>(parent);
-            mFontWeight = fontWeight;
-            mStyle = style;
-        }
-
-        @Override
-        public void onFontRetrieved(@NonNull Typeface typeface) {
-            final AppCompatTextHelper parent = mParent.get();
-            if (parent == null) {
-                return;  // The view has gone. Do nothing
-            }
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-                if (mFontWeight != TEXT_FONT_WEIGHT_UNSPECIFIED) {
-                    typeface = Typeface.create(typeface, mFontWeight,
-                            (mStyle & Typeface.ITALIC) != 0);
-                }
-            }
-            parent.runOnUiThread(new TypefaceApplyCallback(mParent, typeface));
-        }
-
-        @Override
-        public void onFontRetrievalFailed(int reason) {
-            // Do nothing.
-        }
-    }
-
     private void updateTypefaceAndStyle(Context context, TintTypedArray a) {
         mStyle = a.getInt(R.styleable.TextAppearance_android_textStyle, mStyle);
 
@@ -423,8 +349,24 @@
             final int fontWeight = mFontWeight;
             final int style = mStyle;
             if (!context.isRestricted()) {
-                ResourcesCompat.FontCallback replyCallback = new ApplyTextViewCallback(
-                        this, fontWeight, style);
+                final WeakReference<TextView> textViewWeak = new WeakReference<>(mView);
+                ResourcesCompat.FontCallback replyCallback = new ResourcesCompat.FontCallback() {
+                    @Override
+                    public void onFontRetrieved(@NonNull Typeface typeface) {
+                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+                            if (fontWeight != TEXT_FONT_WEIGHT_UNSPECIFIED) {
+                                typeface = Typeface.create(typeface, fontWeight,
+                                        (style & Typeface.ITALIC) != 0);
+                            }
+                        }
+                        onAsyncTypefaceReceived(textViewWeak, typeface);
+                    }
+
+                    @Override
+                    public void onFontRetrievalFailed(int reason) {
+                        // Do nothing.
+                    }
+                };
                 try {
                     // Note the callback will be triggered on the UI thread.
                     final Typeface typeface = a.getFont(fontFamilyId, mStyle, replyCallback);
@@ -481,6 +423,17 @@
         }
     }
 
+    @SuppressWarnings("WeakerAccess") /* synthetic access */
+    void onAsyncTypefaceReceived(WeakReference<TextView> textViewWeak, Typeface typeface) {
+        if (mAsyncFontPending) {
+            mFontTypeface = typeface;
+            final TextView textView = textViewWeak.get();
+            if (textView != null) {
+                textView.setTypeface(typeface, mStyle);
+            }
+        }
+    }
+
     void onSetTextAppearance(Context context, int resId) {
         final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context,
                 resId, R.styleable.TextAppearance);
diff --git a/benchmark/benchmark/build.gradle b/benchmark/benchmark/build.gradle
new file mode 100644
index 0000000..21a0621
--- /dev/null
+++ b/benchmark/benchmark/build.gradle
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import static androidx.build.dependencies.DependenciesKt.*
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("kotlin-android")
+}
+
+dependencies {
+    androidTestImplementation(project(":benchmark"))
+    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(ANDROIDX_TEST_RULES)
+    androidTestImplementation(JUNIT)
+    androidTestImplementation(KOTLIN_STDLIB)
+}
diff --git a/benchmark/benchmark/src/androidTest/AndroidManifest.xml b/benchmark/benchmark/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..82470db
--- /dev/null
+++ b/benchmark/benchmark/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<manifest
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:tools="http://schemas.android.com/tools"
+        package="androidx.benchmark.benchmark.test">
+
+    <!-- Important: disable debuggable for accurate performance results -->
+    <application
+            android:debuggable="false"
+            tools:replace="android:debuggable">
+    </application>
+</manifest>
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/ParameterizedBenchmark.kt b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/ParameterizedBenchmark.kt
similarity index 90%
rename from benchmark/src/androidTest/java/androidx/benchmark/ParameterizedBenchmark.kt
rename to benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/ParameterizedBenchmark.kt
index 975d071..214aea1 100644
--- a/benchmark/src/androidTest/java/androidx/benchmark/ParameterizedBenchmark.kt
+++ b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/ParameterizedBenchmark.kt
@@ -14,8 +14,10 @@
  * limitations under the License.
  */
 
-package androidx.benchmark
+package androidx.benchmark.benchmark
 
+import androidx.benchmark.BenchmarkRule
+import androidx.benchmark.measureRepeated
 import androidx.test.filters.LargeTest
 import org.junit.Rule
 import org.junit.Test
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/SynchronizedBenchmark.kt b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/SynchronizedBenchmark.kt
similarity index 91%
rename from benchmark/src/androidTest/java/androidx/benchmark/SynchronizedBenchmark.kt
rename to benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/SynchronizedBenchmark.kt
index 635724e..5cadaf8 100644
--- a/benchmark/src/androidTest/java/androidx/benchmark/SynchronizedBenchmark.kt
+++ b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/SynchronizedBenchmark.kt
@@ -14,8 +14,10 @@
  * limitations under the License.
  */
 
-package androidx.benchmark
+package androidx.benchmark.benchmark
 
+import androidx.benchmark.BenchmarkRule
+import androidx.benchmark.measureRepeated
 import androidx.test.filters.LargeTest
 import org.junit.Rule
 import org.junit.Test
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/TrivialBenchmarkJava.java b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/TrivialJavaBenchmark.java
similarity index 88%
rename from benchmark/src/androidTest/java/androidx/benchmark/TrivialBenchmarkJava.java
rename to benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/TrivialJavaBenchmark.java
index bfc5294..bfad065 100644
--- a/benchmark/src/androidTest/java/androidx/benchmark/TrivialBenchmarkJava.java
+++ b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/TrivialJavaBenchmark.java
@@ -14,8 +14,10 @@
  * limitations under the License.
  */
 
-package androidx.benchmark;
+package androidx.benchmark.benchmark;
 
+import androidx.benchmark.BenchmarkRule;
+import androidx.benchmark.BenchmarkState;
 import androidx.test.filters.LargeTest;
 
 import org.junit.Rule;
@@ -25,7 +27,7 @@
 
 @LargeTest
 @RunWith(JUnit4.class)
-public class TrivialBenchmarkJava {
+public class TrivialJavaBenchmark {
     @Rule
     public BenchmarkRule mBenchmarkRule = new BenchmarkRule();
 
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/TrivialBenchmark.kt b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/TrivialKotlinBenchmark.kt
similarity index 82%
rename from benchmark/src/androidTest/java/androidx/benchmark/TrivialBenchmark.kt
rename to benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/TrivialKotlinBenchmark.kt
index cf455f5..c06742f 100644
--- a/benchmark/src/androidTest/java/androidx/benchmark/TrivialBenchmark.kt
+++ b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/TrivialKotlinBenchmark.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2018 The Android Open Source Project
+ * Copyright 2019 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,10 @@
  * limitations under the License.
  */
 
-package androidx.benchmark
+package androidx.benchmark.benchmark
 
+import androidx.benchmark.BenchmarkRule
+import androidx.benchmark.measureRepeated
 import androidx.test.filters.LargeTest
 import org.junit.Rule
 import org.junit.Test
@@ -24,7 +26,7 @@
 
 @LargeTest
 @RunWith(JUnit4::class)
-class TrivialBenchmark {
+class TrivialKotlinBenchmark {
     @get:Rule
     val benchmarkRule = BenchmarkRule()
 
diff --git a/benchmark/benchmark/src/main/AndroidManifest.xml b/benchmark/benchmark/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f290972
--- /dev/null
+++ b/benchmark/benchmark/src/main/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<!--
+  ~ Copyright (C) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.benchmark.benchmark"/>
diff --git a/benchmark/build.gradle b/benchmark/build.gradle
index ceacac0..386f71d 100644
--- a/benchmark/build.gradle
+++ b/benchmark/build.gradle
@@ -32,7 +32,7 @@
     implementation(SUPPORT_ANNOTATIONS)
 
     androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(JUNIT)
+    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
 }
 
 androidx {
diff --git a/benchmark/src/androidTest/AndroidManifest.xml b/benchmark/src/androidTest/AndroidManifest.xml
index a64019e..ccafe73 100644
--- a/benchmark/src/androidTest/AndroidManifest.xml
+++ b/benchmark/src/androidTest/AndroidManifest.xml
@@ -19,11 +19,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     package="androidx.benchmark.test">
 
-
-    <!-- Important: disable debuggable for accurate performance results -->
-    <application
-        android:debuggable="false"
-        tools:replace="android:debuggable">
+    <application>
         <activity android:name="android.app.Activity"/>
     </application>
-</manifest>
+</manifest>
\ No newline at end of file
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/ActivityBenchmarkTests.kt b/benchmark/src/androidTest/java/androidx/benchmark/ActivityBenchmarkTests.kt
new file mode 100644
index 0000000..a053d3a
--- /dev/null
+++ b/benchmark/src/androidTest/java/androidx/benchmark/ActivityBenchmarkTests.kt
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.benchmark
+
+import android.app.Activity
+import androidx.test.annotation.UiThreadTest
+import androidx.test.core.app.ActivityScenario
+import androidx.test.ext.junit.rules.ActivityScenarioRule
+import androidx.test.filters.LargeTest
+import androidx.test.rule.ActivityTestRule
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+fun BenchmarkRule.validateRunWithIsolationActivityHidden() {
+    // isolation activity *not* on top
+    Assert.assertFalse(IsolationActivity.singleton.get()!!.resumed)
+
+    measureRepeated {}
+}
+
+@LargeTest
+@RunWith(JUnit4::class)
+class ActivityScenarioTest {
+    @get:Rule
+    val benchmarkRule = BenchmarkRule(enableReport = false)
+
+    private lateinit var activityScenario: ActivityScenario<Activity>
+
+    @Before
+    fun setup() {
+        activityScenario = ActivityScenario.launch(Activity::class.java)
+    }
+
+    @Test
+    fun verifyActivityLaunched() {
+        activityScenario.onActivity {
+            benchmarkRule.validateRunWithIsolationActivityHidden()
+        }
+    }
+}
+
+@LargeTest
+@RunWith(JUnit4::class)
+class ActivityScenarioRuleTest {
+    @get:Rule
+    val benchmarkRule = BenchmarkRule(enableReport = false)
+
+    @get:Rule
+    val activityRule = ActivityScenarioRule(Activity::class.java)
+
+    @UiThreadTest
+    @Test
+    fun verifyActivityLaunched() {
+        benchmarkRule.validateRunWithIsolationActivityHidden()
+    }
+}
+
+@LargeTest
+@RunWith(JUnit4::class)
+class ActivityTestRuleTest {
+    @get:Rule
+    val benchmarkRule = BenchmarkRule(enableReport = false)
+
+    @get:Rule
+    val activityRule = ActivityTestRule(Activity::class.java)
+
+    @UiThreadTest
+    @Test
+    fun verifyActivityLaunched() {
+        benchmarkRule.validateRunWithIsolationActivityHidden()
+    }
+}
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/ActivityScenarioBenchmark.kt b/benchmark/src/androidTest/java/androidx/benchmark/ActivityScenarioBenchmark.kt
deleted file mode 100644
index 164edd2..0000000
--- a/benchmark/src/androidTest/java/androidx/benchmark/ActivityScenarioBenchmark.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.benchmark
-
-import android.app.Activity
-import androidx.test.core.app.ActivityScenario
-import androidx.test.filters.LargeTest
-import org.junit.Assert.assertFalse
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@LargeTest
-@RunWith(JUnit4::class)
-class ActivityScenarioBenchmark {
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
-
-    private lateinit var activityScenario: ActivityScenario<Activity>
-
-    @Before
-    fun setup() {
-        activityScenario = ActivityScenario.launch(Activity::class.java)
-    }
-
-    @Test
-    fun activityScenario() {
-        activityScenario.onActivity {
-            // isolation activity *not* on top
-            assertFalse(IsolationActivity.singleton.get()!!.resumed)
-
-            var i = 0
-            benchmarkRule.measureRepeated {
-                i++
-            }
-        }
-    }
-}
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/ActivityTestRuleBenchmark.kt b/benchmark/src/androidTest/java/androidx/benchmark/ActivityTestRuleBenchmark.kt
deleted file mode 100644
index 6c8b06d..0000000
--- a/benchmark/src/androidTest/java/androidx/benchmark/ActivityTestRuleBenchmark.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.benchmark
-
-import android.app.Activity
-import androidx.test.annotation.UiThreadTest
-import androidx.test.filters.LargeTest
-import androidx.test.rule.ActivityTestRule
-import org.junit.Assert.assertFalse
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@LargeTest
-@RunWith(JUnit4::class)
-class ActivityTestRuleBenchmark {
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
-
-    @get:Rule
-    val activityRule = ActivityTestRule(Activity::class.java)
-
-    @UiThreadTest
-    @Test
-    fun activityTestRule() {
-        // isolation activity *not* on top
-        assertFalse(IsolationActivity.singleton.get()!!.resumed)
-
-        var i = 0
-        benchmarkRule.measureRepeated {
-            i++
-        }
-    }
-}
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkRuleAnnotationTest.kt b/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkRuleAnnotationTest.kt
index 10e52cb..c6c8ddc 100644
--- a/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkRuleAnnotationTest.kt
+++ b/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkRuleAnnotationTest.kt
@@ -26,7 +26,7 @@
 class BenchmarkRuleAnnotationTest {
     @Suppress("MemberVisibilityCanBePrivate") // intentionally public
     // NOTE: not annotated, so will throw when state is accessed
-    val unannotatedRule = BenchmarkRule()
+    val unannotatedRule = BenchmarkRule(enableReport = false)
 
     @Test(expected = IllegalStateException::class)
     fun throwsIfNotAnnotated() {
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkRuleTest.kt b/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkRuleTest.kt
index edffb71..8e988f0 100644
--- a/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkRuleTest.kt
+++ b/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkRuleTest.kt
@@ -28,7 +28,7 @@
 @RunWith(JUnit4::class)
 class BenchmarkRuleTest {
     @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    val benchmarkRule = BenchmarkRule(enableReport = false)
 
     @Test
     fun runWithTimingDisabled() {
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkStateTest.kt b/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkStateTest.kt
index 56da1d5..afeeceb 100644
--- a/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkStateTest.kt
+++ b/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkStateTest.kt
@@ -57,6 +57,8 @@
     @Test
     fun iterationCheck() {
         val state = BenchmarkState()
+        // disable thermal throttle checks, since it can cause loops to be thrown out
+        state.performThrottleChecks = false
         var total = 0
         while (state.keepRunning()) {
             total++
diff --git a/benchmark/src/main/java/androidx/benchmark/BenchmarkRule.kt b/benchmark/src/main/java/androidx/benchmark/BenchmarkRule.kt
index 71c4473..f185133 100644
--- a/benchmark/src/main/java/androidx/benchmark/BenchmarkRule.kt
+++ b/benchmark/src/main/java/androidx/benchmark/BenchmarkRule.kt
@@ -19,6 +19,7 @@
 import android.Manifest
 import android.util.Log
 import androidx.annotation.RestrictTo
+import androidx.benchmark.WarningState.WARNING_PREFIX
 import androidx.test.rule.GrantPermissionRule
 import org.junit.Assert.assertTrue
 import org.junit.rules.RuleChain
@@ -71,10 +72,24 @@
  * Every test in the Class using this @Rule must contain a single benchmark.
  */
 class BenchmarkRule : TestRule {
+    constructor() {
+        this.enableReport = true
+    }
+
+    internal constructor(enableReport: Boolean) {
+        this.enableReport = enableReport
+    }
+
     internal // synthetic access
     val internalState = BenchmarkState()
 
     /**
+     * Used to disable reporting, for correctness tests that shouldn't report values
+     * (and would trigger warnings if they did, e.g. debuggable=true)
+     */
+    private val enableReport: Boolean
+
+    /**
      * Object used for benchmarking in Java.
      *
      * ```
@@ -173,16 +188,18 @@
 
         base.evaluate()
 
-        val fullTestName = WarningState.WARNING_PREFIX +
-                description.testClass.simpleName + "." + invokeMethodName
-        internalState.sendStatus(fullTestName)
+        if (enableReport) {
+            val fullTestName =
+                WARNING_PREFIX + description.testClass.simpleName + "." + invokeMethodName
+            internalState.sendStatus(fullTestName)
 
-        ResultWriter.appendReport(
-            internalState.getReport(
-                testName = WarningState.WARNING_PREFIX + invokeMethodName,
-                className = description.className
+            ResultWriter.appendReport(
+                internalState.getReport(
+                    testName = WARNING_PREFIX + invokeMethodName,
+                    className = description.className
+                )
             )
-        )
+        }
     }
 
     internal companion object {
diff --git a/biometric/api/1.0.0-alpha05.txt b/biometric/api/1.0.0-alpha05.txt
index e5381d0..63a2dfc 100644
--- a/biometric/api/1.0.0-alpha05.txt
+++ b/biometric/api/1.0.0-alpha05.txt
@@ -11,8 +11,8 @@
   }
 
   public class BiometricPrompt {
-    ctor public BiometricPrompt(androidx.fragment.app.FragmentActivity, androidx.biometric.BiometricPrompt.AuthenticationCallback, java.util.concurrent.Executor);
-    ctor public BiometricPrompt(androidx.fragment.app.Fragment, androidx.biometric.BiometricPrompt.AuthenticationCallback, java.util.concurrent.Executor);
+    ctor public BiometricPrompt(androidx.fragment.app.FragmentActivity, java.util.concurrent.Executor, androidx.biometric.BiometricPrompt.AuthenticationCallback);
+    ctor public BiometricPrompt(androidx.fragment.app.Fragment, java.util.concurrent.Executor, androidx.biometric.BiometricPrompt.AuthenticationCallback);
     method public void authenticate(androidx.biometric.BiometricPrompt.PromptInfo, androidx.biometric.BiometricPrompt.CryptoObject);
     method public void authenticate(androidx.biometric.BiometricPrompt.PromptInfo);
     method public void cancelAuthentication();
diff --git a/biometric/api/current.txt b/biometric/api/current.txt
index e5381d0..63a2dfc 100644
--- a/biometric/api/current.txt
+++ b/biometric/api/current.txt
@@ -11,8 +11,8 @@
   }
 
   public class BiometricPrompt {
-    ctor public BiometricPrompt(androidx.fragment.app.FragmentActivity, androidx.biometric.BiometricPrompt.AuthenticationCallback, java.util.concurrent.Executor);
-    ctor public BiometricPrompt(androidx.fragment.app.Fragment, androidx.biometric.BiometricPrompt.AuthenticationCallback, java.util.concurrent.Executor);
+    ctor public BiometricPrompt(androidx.fragment.app.FragmentActivity, java.util.concurrent.Executor, androidx.biometric.BiometricPrompt.AuthenticationCallback);
+    ctor public BiometricPrompt(androidx.fragment.app.Fragment, java.util.concurrent.Executor, androidx.biometric.BiometricPrompt.AuthenticationCallback);
     method public void authenticate(androidx.biometric.BiometricPrompt.PromptInfo, androidx.biometric.BiometricPrompt.CryptoObject);
     method public void authenticate(androidx.biometric.BiometricPrompt.PromptInfo);
     method public void cancelAuthentication();
diff --git a/biometric/api/restricted_1.0.0-alpha05.txt b/biometric/api/restricted_1.0.0-alpha05.txt
index b6d2c02..50e897bd 100644
--- a/biometric/api/restricted_1.0.0-alpha05.txt
+++ b/biometric/api/restricted_1.0.0-alpha05.txt
@@ -13,8 +13,8 @@
   }
 
   public class BiometricPrompt implements androidx.biometric.BiometricConstants {
-    ctor public BiometricPrompt(androidx.fragment.app.FragmentActivity, androidx.biometric.BiometricPrompt.AuthenticationCallback, java.util.concurrent.Executor);
-    ctor public BiometricPrompt(androidx.fragment.app.Fragment, androidx.biometric.BiometricPrompt.AuthenticationCallback, java.util.concurrent.Executor);
+    ctor public BiometricPrompt(androidx.fragment.app.FragmentActivity, java.util.concurrent.Executor, androidx.biometric.BiometricPrompt.AuthenticationCallback);
+    ctor public BiometricPrompt(androidx.fragment.app.Fragment, java.util.concurrent.Executor, androidx.biometric.BiometricPrompt.AuthenticationCallback);
     method public void authenticate(androidx.biometric.BiometricPrompt.PromptInfo, androidx.biometric.BiometricPrompt.CryptoObject);
     method public void authenticate(androidx.biometric.BiometricPrompt.PromptInfo);
     method public void cancelAuthentication();
diff --git a/biometric/api/restricted_current.txt b/biometric/api/restricted_current.txt
index b6d2c02..50e897bd 100644
--- a/biometric/api/restricted_current.txt
+++ b/biometric/api/restricted_current.txt
@@ -13,8 +13,8 @@
   }
 
   public class BiometricPrompt implements androidx.biometric.BiometricConstants {
-    ctor public BiometricPrompt(androidx.fragment.app.FragmentActivity, androidx.biometric.BiometricPrompt.AuthenticationCallback, java.util.concurrent.Executor);
-    ctor public BiometricPrompt(androidx.fragment.app.Fragment, androidx.biometric.BiometricPrompt.AuthenticationCallback, java.util.concurrent.Executor);
+    ctor public BiometricPrompt(androidx.fragment.app.FragmentActivity, java.util.concurrent.Executor, androidx.biometric.BiometricPrompt.AuthenticationCallback);
+    ctor public BiometricPrompt(androidx.fragment.app.Fragment, java.util.concurrent.Executor, androidx.biometric.BiometricPrompt.AuthenticationCallback);
     method public void authenticate(androidx.biometric.BiometricPrompt.PromptInfo, androidx.biometric.BiometricPrompt.CryptoObject);
     method public void authenticate(androidx.biometric.BiometricPrompt.PromptInfo);
     method public void cancelAuthentication();
diff --git a/biometric/build.gradle b/biometric/build.gradle
index 91905ddf..e423137 100644
--- a/biometric/build.gradle
+++ b/biometric/build.gradle
@@ -8,9 +8,10 @@
 }
 
 dependencies {
-    api("androidx.annotation:annotation:1.0.0") { transitive = true}
-    api("androidx.core:core:1.1.0-rc02") { transitive = true}
-    api("androidx.fragment:fragment:1.0.0") { transitive = true}
+    api("androidx.annotation:annotation:1.1.0")
+    api("androidx.appcompat:appcompat:1.1.0-rc01")
+    api("androidx.core:core:1.1.0-rc02")
+    api("androidx.fragment:fragment:1.1.0-rc01")
 }
 
 android {
diff --git a/biometric/res/layout/fingerprint_dialog_layout.xml b/biometric/res/layout/fingerprint_dialog_layout.xml
index ce474cf..edc84fe 100644
--- a/biometric/res/layout/fingerprint_dialog_layout.xml
+++ b/biometric/res/layout/fingerprint_dialog_layout.xml
@@ -28,6 +28,7 @@
         android:layout_marginTop="8dp"
         android:layout_marginEnd="24dp"
         android:layout_marginStart="24dp"
+        android:textColor="?android:attr/textColorSecondary"
         android:textSize="16sp"
         android:singleLine="true"
         android:ellipsize="marquee"
@@ -40,6 +41,7 @@
         android:paddingTop="0dp"
         android:layout_marginEnd="24dp"
         android:layout_marginStart="24dp"
+        android:textColor="?android:attr/textColorSecondary"
         android:textSize="16sp"
         android:maxLines="4"/>
 
diff --git a/biometric/src/main/java/androidx/biometric/BiometricPrompt.java b/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
index 6d20e90..8e9d6c5 100644
--- a/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
+++ b/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
@@ -522,20 +522,21 @@
      * such as {@link FragmentActivity#onCreate(Bundle)}.
      *
      * @param fragmentActivity A reference to the client's activity.
-     * @param callback An object to receive authentication events.
      * @param executor An executor to handle callback events.
+     * @param callback An object to receive authentication events.
      */
+    @SuppressLint("LambdaLast")
     public BiometricPrompt(@NonNull FragmentActivity fragmentActivity,
-            @NonNull AuthenticationCallback callback, @NonNull Executor executor) {
+            @NonNull Executor executor, @NonNull AuthenticationCallback callback) {
         if (fragmentActivity == null) {
             throw new IllegalArgumentException("FragmentActivity must not be null");
         }
-        if (callback == null) {
-            throw new IllegalArgumentException("AuthenticationCallback must not be null");
-        }
         if (executor == null) {
             throw new IllegalArgumentException("Executor must not be null");
         }
+        if (callback == null) {
+            throw new IllegalArgumentException("AuthenticationCallback must not be null");
+        }
         mFragmentActivity = fragmentActivity;
         mAuthenticationCallback = callback;
         mExecutor = executor;
@@ -555,20 +556,21 @@
      * such as {@link Fragment#onCreate(Bundle)}.
      *
      * @param fragment A reference to the client's fragment.
-     * @param callback An object to receive authentication events.
      * @param executor An executor to handle callback events.
+     * @param callback An object to receive authentication events.
      */
+    @SuppressLint("LambdaLast")
     public BiometricPrompt(@NonNull Fragment fragment,
-            @NonNull AuthenticationCallback callback, @NonNull Executor executor) {
+            @NonNull Executor executor, @NonNull AuthenticationCallback callback) {
         if (fragment == null) {
             throw new IllegalArgumentException("FragmentActivity must not be null");
         }
-        if (callback == null) {
-            throw new IllegalArgumentException("AuthenticationCallback must not be null");
-        }
         if (executor == null) {
             throw new IllegalArgumentException("Executor must not be null");
         }
+        if (callback == null) {
+            throw new IllegalArgumentException("AuthenticationCallback must not be null");
+        }
         mFragment = fragment;
         mAuthenticationCallback = callback;
         mExecutor = executor;
diff --git a/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java b/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java
index c8354ca..2f7af4b 100644
--- a/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java
+++ b/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java
@@ -16,7 +16,6 @@
 
 package androidx.biometric;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -36,6 +35,7 @@
 
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
+import androidx.appcompat.app.AlertDialog;
 import androidx.core.content.ContextCompat;
 import androidx.fragment.app.DialogFragment;
 
@@ -144,7 +144,9 @@
         final AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
         builder.setTitle(mBundle.getCharSequence(BiometricPrompt.KEY_TITLE));
 
-        final View layout = LayoutInflater.from(getContext())
+        // We have to use builder.getContext() instead of the usual getContext() in order to get
+        // the appropriately themed context for this dialog.
+        final View layout = LayoutInflater.from(builder.getContext())
                 .inflate(R.layout.fingerprint_dialog_layout, null);
 
         final TextView subtitleView = layout.findViewById(R.id.fingerprint_subtitle);
diff --git a/browser/api/1.2.0-alpha05.txt b/browser/api/1.2.0-alpha05.txt
new file mode 100644
index 0000000..4e2c30d
--- /dev/null
+++ b/browser/api/1.2.0-alpha05.txt
@@ -0,0 +1,273 @@
+// Signature format: 3.0
+package androidx.browser.browseractions {
+
+  @Deprecated public class BrowserActionItem {
+    ctor @Deprecated public BrowserActionItem(String, android.app.PendingIntent, @DrawableRes int);
+    ctor @Deprecated public BrowserActionItem(String, android.app.PendingIntent);
+    method @Deprecated public android.app.PendingIntent getAction();
+    method @Deprecated public int getIconId();
+    method @Deprecated public String getTitle();
+  }
+
+  @Deprecated public class BrowserActionsIntent {
+    method @Deprecated public static String? getCreatorPackageName(android.content.Intent);
+    method @Deprecated public android.content.Intent getIntent();
+    method @Deprecated public static String? getUntrustedCreatorPackageName(android.content.Intent);
+    method @Deprecated public static void launchIntent(android.content.Context!, android.content.Intent!);
+    method @Deprecated public static void openBrowserAction(android.content.Context!, android.net.Uri!);
+    method @Deprecated public static void openBrowserAction(android.content.Context!, android.net.Uri!, int, java.util.ArrayList<androidx.browser.browseractions.BrowserActionItem!>!, android.app.PendingIntent!);
+    method @Deprecated public static java.util.List<androidx.browser.browseractions.BrowserActionItem!>! parseBrowserActionItems(java.util.ArrayList<android.os.Bundle!>!);
+    field @Deprecated public static final String ACTION_BROWSER_ACTIONS_OPEN = "androidx.browser.browseractions.browser_action_open";
+    field @Deprecated public static final String EXTRA_APP_ID = "androidx.browser.browseractions.APP_ID";
+    field @Deprecated public static final String EXTRA_MENU_ITEMS = "androidx.browser.browseractions.extra.MENU_ITEMS";
+    field @Deprecated public static final String EXTRA_SELECTED_ACTION_PENDING_INTENT = "androidx.browser.browseractions.extra.SELECTED_ACTION_PENDING_INTENT";
+    field @Deprecated public static final String EXTRA_TYPE = "androidx.browser.browseractions.extra.TYPE";
+    field @Deprecated public static final int ITEM_COPY = 3; // 0x3
+    field @Deprecated public static final int ITEM_DOWNLOAD = 2; // 0x2
+    field @Deprecated public static final int ITEM_INVALID_ITEM = -1; // 0xffffffff
+    field @Deprecated public static final int ITEM_OPEN_IN_INCOGNITO = 1; // 0x1
+    field @Deprecated public static final int ITEM_OPEN_IN_NEW_TAB = 0; // 0x0
+    field @Deprecated public static final int ITEM_SHARE = 4; // 0x4
+    field @Deprecated public static final String KEY_ACTION = "androidx.browser.browseractions.ACTION";
+    field @Deprecated public static final String KEY_ICON_ID = "androidx.browser.browseractions.ICON_ID";
+    field @Deprecated public static final String KEY_TITLE = "androidx.browser.browseractions.TITLE";
+    field @Deprecated public static final int MAX_CUSTOM_ITEMS = 5; // 0x5
+    field @Deprecated public static final int URL_TYPE_AUDIO = 3; // 0x3
+    field @Deprecated public static final int URL_TYPE_FILE = 4; // 0x4
+    field @Deprecated public static final int URL_TYPE_IMAGE = 1; // 0x1
+    field @Deprecated public static final int URL_TYPE_NONE = 0; // 0x0
+    field @Deprecated public static final int URL_TYPE_PLUGIN = 5; // 0x5
+    field @Deprecated public static final int URL_TYPE_VIDEO = 2; // 0x2
+  }
+
+  @Deprecated public static final class BrowserActionsIntent.Builder {
+    ctor @Deprecated public BrowserActionsIntent.Builder(android.content.Context!, android.net.Uri!);
+    method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent! build();
+    method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder! setCustomItems(java.util.ArrayList<androidx.browser.browseractions.BrowserActionItem!>!);
+    method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder! setCustomItems(androidx.browser.browseractions.BrowserActionItem!...);
+    method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder! setOnItemSelectedAction(android.app.PendingIntent!);
+    method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder! setUrlType(int);
+  }
+
+}
+
+package androidx.browser.customtabs {
+
+  public final class CustomTabColorSchemeParams {
+    field @ColorInt public final Integer? navigationBarColor;
+    field @ColorInt public final Integer? secondaryToolbarColor;
+    field @ColorInt public final Integer? toolbarColor;
+  }
+
+  public static final class CustomTabColorSchemeParams.Builder {
+    ctor public CustomTabColorSchemeParams.Builder();
+    method public androidx.browser.customtabs.CustomTabColorSchemeParams build();
+    method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setNavigationBarColor(@ColorInt int);
+    method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setSecondaryToolbarColor(@ColorInt int);
+    method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setToolbarColor(@ColorInt int);
+  }
+
+  public class CustomTabsCallback {
+    ctor public CustomTabsCallback();
+    method public void extraCallback(String!, android.os.Bundle!);
+    method public void onMessageChannelReady(android.os.Bundle!);
+    method public void onNavigationEvent(int, android.os.Bundle!);
+    method public void onPostMessage(String!, android.os.Bundle!);
+    method public void onRelationshipValidationResult(@androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri!, boolean, android.os.Bundle!);
+    field public static final int NAVIGATION_ABORTED = 4; // 0x4
+    field public static final int NAVIGATION_FAILED = 3; // 0x3
+    field public static final int NAVIGATION_FINISHED = 2; // 0x2
+    field public static final int NAVIGATION_STARTED = 1; // 0x1
+    field public static final int TAB_HIDDEN = 6; // 0x6
+    field public static final int TAB_SHOWN = 5; // 0x5
+  }
+
+  public class CustomTabsClient {
+    method public static boolean bindCustomTabsService(android.content.Context, String?, androidx.browser.customtabs.CustomTabsServiceConnection);
+    method public static boolean connectAndInitialize(android.content.Context, String);
+    method public android.os.Bundle? extraCommand(String, android.os.Bundle?);
+    method public static String? getPackageName(android.content.Context, java.util.List<java.lang.String!>?);
+    method public static String? getPackageName(android.content.Context, java.util.List<java.lang.String!>?, boolean);
+    method public androidx.browser.customtabs.CustomTabsSession? newSession(androidx.browser.customtabs.CustomTabsCallback?);
+    method public androidx.browser.customtabs.CustomTabsSession? newSession(androidx.browser.customtabs.CustomTabsCallback?, int);
+    method public boolean warmup(long);
+  }
+
+  public final class CustomTabsIntent {
+    method public static androidx.browser.customtabs.CustomTabColorSchemeParams getColorSchemeParams(android.content.Intent, int);
+    method public static int getMaxToolbarItems();
+    method public void launchUrl(android.content.Context!, android.net.Uri!);
+    method public static android.content.Intent! setAlwaysUseBrowserUI(android.content.Intent!);
+    method public static boolean shouldAlwaysUseBrowserUI(android.content.Intent!);
+    field public static final int COLOR_SCHEME_DARK = 2; // 0x2
+    field public static final int COLOR_SCHEME_LIGHT = 1; // 0x1
+    field public static final int COLOR_SCHEME_SYSTEM = 0; // 0x0
+    field public static final String EXTRA_ACTION_BUTTON_BUNDLE = "android.support.customtabs.extra.ACTION_BUTTON_BUNDLE";
+    field public static final String EXTRA_CLOSE_BUTTON_ICON = "android.support.customtabs.extra.CLOSE_BUTTON_ICON";
+    field public static final String EXTRA_COLOR_SCHEME = "androidx.browser.customtabs.extra.COLOR_SCHEME";
+    field public static final String EXTRA_COLOR_SCHEME_PARAMS = "androidx.browser.customtabs.extra.COLOR_SCHEME_PARAMS";
+    field public static final String EXTRA_DEFAULT_SHARE_MENU_ITEM = "android.support.customtabs.extra.SHARE_MENU_ITEM";
+    field public static final String EXTRA_ENABLE_INSTANT_APPS = "android.support.customtabs.extra.EXTRA_ENABLE_INSTANT_APPS";
+    field public static final String EXTRA_ENABLE_URLBAR_HIDING = "android.support.customtabs.extra.ENABLE_URLBAR_HIDING";
+    field public static final String EXTRA_EXIT_ANIMATION_BUNDLE = "android.support.customtabs.extra.EXIT_ANIMATION_BUNDLE";
+    field public static final String EXTRA_MENU_ITEMS = "android.support.customtabs.extra.MENU_ITEMS";
+    field public static final String EXTRA_NAVIGATION_BAR_COLOR = "androidx.browser.customtabs.extra.NAVIGATION_BAR_COLOR";
+    field public static final String EXTRA_REMOTEVIEWS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS";
+    field public static final String EXTRA_REMOTEVIEWS_CLICKED_ID = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_CLICKED_ID";
+    field public static final String EXTRA_REMOTEVIEWS_PENDINGINTENT = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_PENDINGINTENT";
+    field public static final String EXTRA_REMOTEVIEWS_VIEW_IDS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_VIEW_IDS";
+    field public static final String EXTRA_SECONDARY_TOOLBAR_COLOR = "android.support.customtabs.extra.SECONDARY_TOOLBAR_COLOR";
+    field public static final String EXTRA_SESSION = "android.support.customtabs.extra.SESSION";
+    field public static final String EXTRA_TINT_ACTION_BUTTON = "android.support.customtabs.extra.TINT_ACTION_BUTTON";
+    field public static final String EXTRA_TITLE_VISIBILITY_STATE = "android.support.customtabs.extra.TITLE_VISIBILITY";
+    field public static final String EXTRA_TOOLBAR_COLOR = "android.support.customtabs.extra.TOOLBAR_COLOR";
+    field public static final String EXTRA_TOOLBAR_ITEMS = "android.support.customtabs.extra.TOOLBAR_ITEMS";
+    field public static final String KEY_DESCRIPTION = "android.support.customtabs.customaction.DESCRIPTION";
+    field public static final String KEY_ICON = "android.support.customtabs.customaction.ICON";
+    field public static final String KEY_ID = "android.support.customtabs.customaction.ID";
+    field public static final String KEY_MENU_ITEM_TITLE = "android.support.customtabs.customaction.MENU_ITEM_TITLE";
+    field public static final String KEY_PENDING_INTENT = "android.support.customtabs.customaction.PENDING_INTENT";
+    field public static final int NO_TITLE = 0; // 0x0
+    field public static final int SHOW_PAGE_TITLE = 1; // 0x1
+    field public static final int TOOLBAR_ACTION_BUTTON_ID = 0; // 0x0
+    field public final android.content.Intent intent;
+    field public final android.os.Bundle? startAnimationBundle;
+  }
+
+  public static final class CustomTabsIntent.Builder {
+    ctor public CustomTabsIntent.Builder();
+    ctor public CustomTabsIntent.Builder(androidx.browser.customtabs.CustomTabsSession?);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder addDefaultShareMenuItem();
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder addMenuItem(String, android.app.PendingIntent);
+    method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder addToolbarItem(int, android.graphics.Bitmap, String, android.app.PendingIntent!) throws java.lang.IllegalStateException;
+    method public androidx.browser.customtabs.CustomTabsIntent build();
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder enableUrlBarHiding();
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, String, android.app.PendingIntent, boolean);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, String, android.app.PendingIntent);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setCloseButtonIcon(android.graphics.Bitmap);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setColorScheme(int);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setColorSchemeParams(int, androidx.browser.customtabs.CustomTabColorSchemeParams);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setExitAnimations(android.content.Context, @AnimRes int, @AnimRes int);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setInstantAppsEnabled(boolean);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setNavigationBarColor(@ColorInt int);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setSecondaryToolbarColor(@ColorInt int);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setSecondaryToolbarViews(android.widget.RemoteViews, int[]?, android.app.PendingIntent?);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setShowTitle(boolean);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setStartAnimations(android.content.Context, @AnimRes int, @AnimRes int);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setToolbarColor(@ColorInt int);
+  }
+
+  public abstract class CustomTabsService extends android.app.Service {
+    ctor public CustomTabsService();
+    method protected boolean cleanUpSession(androidx.browser.customtabs.CustomTabsSessionToken!);
+    method protected abstract android.os.Bundle! extraCommand(String!, android.os.Bundle!);
+    method protected abstract boolean mayLaunchUrl(androidx.browser.customtabs.CustomTabsSessionToken!, android.net.Uri!, android.os.Bundle!, java.util.List<android.os.Bundle!>!);
+    method protected abstract boolean newSession(androidx.browser.customtabs.CustomTabsSessionToken!);
+    method public android.os.IBinder! onBind(android.content.Intent!);
+    method @androidx.browser.customtabs.CustomTabsService.Result protected abstract int postMessage(androidx.browser.customtabs.CustomTabsSessionToken!, String!, android.os.Bundle!);
+    method protected abstract boolean receiveFile(androidx.browser.customtabs.CustomTabsSessionToken, android.net.Uri, int, android.os.Bundle?);
+    method protected abstract boolean requestPostMessageChannel(androidx.browser.customtabs.CustomTabsSessionToken!, android.net.Uri!);
+    method protected abstract boolean updateVisuals(androidx.browser.customtabs.CustomTabsSessionToken!, android.os.Bundle!);
+    method protected abstract boolean validateRelationship(androidx.browser.customtabs.CustomTabsSessionToken!, @androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri!, android.os.Bundle!);
+    method protected abstract boolean warmup(long);
+    field public static final String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
+    field public static final String CATEGORY_COLOR_SCHEME_CUSTOMIZATION = "androidx.browser.customtabs.category.ColorSchemeCustomization";
+    field public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.customtabs.category.NavBarColorCustomization";
+    field public static final int FILE_PURPOSE_TRUSTED_WEB_ACTIVITY_SPLASH_IMAGE = 1; // 0x1
+    field public static final String KEY_URL = "android.support.customtabs.otherurls.URL";
+    field public static final int RELATION_HANDLE_ALL_URLS = 2; // 0x2
+    field public static final int RELATION_USE_AS_ORIGIN = 1; // 0x1
+    field public static final int RESULT_FAILURE_DISALLOWED = -1; // 0xffffffff
+    field public static final int RESULT_FAILURE_MESSAGING_ERROR = -3; // 0xfffffffd
+    field public static final int RESULT_FAILURE_REMOTE_ERROR = -2; // 0xfffffffe
+    field public static final int RESULT_SUCCESS = 0; // 0x0
+    field public static final String TRUSTED_WEB_ACTIVITY_CATEGORY = "androidx.browser.trusted.category.TrustedWebActivities";
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({androidx.browser.customtabs.CustomTabsService.RELATION_USE_AS_ORIGIN, androidx.browser.customtabs.CustomTabsService.RELATION_HANDLE_ALL_URLS}) public static @interface CustomTabsService.Relation {
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({androidx.browser.customtabs.CustomTabsService.RESULT_SUCCESS, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_DISALLOWED, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_REMOTE_ERROR, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_MESSAGING_ERROR}) public static @interface CustomTabsService.Result {
+  }
+
+  public abstract class CustomTabsServiceConnection implements android.content.ServiceConnection {
+    ctor public CustomTabsServiceConnection();
+    method public abstract void onCustomTabsServiceConnected(android.content.ComponentName!, androidx.browser.customtabs.CustomTabsClient!);
+    method public final void onServiceConnected(android.content.ComponentName!, android.os.IBinder!);
+  }
+
+  public final class CustomTabsSession {
+    method @VisibleForTesting public static androidx.browser.customtabs.CustomTabsSession createMockSessionForTesting(android.content.ComponentName);
+    method public boolean mayLaunchUrl(android.net.Uri!, android.os.Bundle!, java.util.List<android.os.Bundle!>!);
+    method @androidx.browser.customtabs.CustomTabsService.Result public int postMessage(String!, android.os.Bundle!);
+    method public boolean receiveFile(android.net.Uri, int, android.os.Bundle?);
+    method public boolean requestPostMessageChannel(android.net.Uri!);
+    method public boolean setActionButton(android.graphics.Bitmap, String);
+    method public boolean setSecondaryToolbarViews(android.widget.RemoteViews?, int[]?, android.app.PendingIntent?);
+    method @Deprecated public boolean setToolbarItem(int, android.graphics.Bitmap, String);
+    method public boolean validateRelationship(@androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri, android.os.Bundle?);
+  }
+
+  public class CustomTabsSessionToken {
+    method public static androidx.browser.customtabs.CustomTabsSessionToken createMockSessionTokenForTesting();
+    method public androidx.browser.customtabs.CustomTabsCallback? getCallback();
+    method public static androidx.browser.customtabs.CustomTabsSessionToken? getSessionTokenFromIntent(android.content.Intent);
+    method public boolean isAssociatedWith(androidx.browser.customtabs.CustomTabsSession);
+  }
+
+  public class PostMessageService extends android.app.Service {
+    ctor public PostMessageService();
+    method public android.os.IBinder! onBind(android.content.Intent!);
+  }
+
+  public abstract class PostMessageServiceConnection implements android.content.ServiceConnection {
+    ctor public PostMessageServiceConnection(androidx.browser.customtabs.CustomTabsSessionToken!);
+    method public boolean bindSessionToPostMessageService(android.content.Context!, String!);
+    method public final boolean notifyMessageChannelReady(android.os.Bundle!);
+    method public void onPostMessageServiceConnected();
+    method public void onPostMessageServiceDisconnected();
+    method public final void onServiceConnected(android.content.ComponentName!, android.os.IBinder!);
+    method public final void onServiceDisconnected(android.content.ComponentName!);
+    method public final boolean postMessage(String!, android.os.Bundle!);
+    method public void unbindFromContext(android.content.Context!);
+  }
+
+  public class TrustedWebUtils {
+    method @Deprecated public static void launchAsTrustedWebActivity(android.content.Context, androidx.browser.customtabs.CustomTabsIntent, android.net.Uri);
+    method public static boolean splashScreensAreSupported(android.content.Context, String, String);
+    method @WorkerThread public static boolean transferSplashImage(android.content.Context, java.io.File, String, String, androidx.browser.customtabs.CustomTabsSession);
+    field public static final String EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY = "android.support.customtabs.extra.LAUNCH_AS_TRUSTED_WEB_ACTIVITY";
+  }
+
+}
+
+package androidx.browser.trusted {
+
+  public class TrustedWebActivityBuilder {
+    ctor public TrustedWebActivityBuilder(android.content.Context, android.net.Uri);
+    method public android.net.Uri getUrl();
+    method public void launchActivity(androidx.browser.customtabs.CustomTabsSession);
+    method public androidx.browser.trusted.TrustedWebActivityBuilder setAdditionalTrustedOrigins(java.util.List<java.lang.String!>);
+    method public androidx.browser.trusted.TrustedWebActivityBuilder setSplashScreenParams(android.os.Bundle);
+    field public static final String EXTRA_ADDITIONAL_TRUSTED_ORIGINS = "android.support.customtabs.extra.ADDITIONAL_TRUSTED_ORIGINS";
+    field public static final String EXTRA_SPLASH_SCREEN_PARAMS = "androidx.browser.trusted.EXTRA_SPLASH_SCREEN_PARAMS";
+  }
+
+}
+
+package androidx.browser.trusted.splashscreens {
+
+  public final class SplashScreenParamKey {
+    field public static final String BACKGROUND_COLOR = "androidx.browser.trusted.trusted.KEY_SPLASH_SCREEN_BACKGROUND_COLOR";
+    field public static final String FADE_OUT_DURATION_MS = "androidx.browser.trusted.KEY_SPLASH_SCREEN_FADE_OUT_DURATION";
+    field public static final String IMAGE_TRANSFORMATION_MATRIX = "androidx.browser.trusted.KEY_SPLASH_SCREEN_TRANSFORMATION_MATRIX";
+    field public static final String SCALE_TYPE = "androidx.browser.trusted.KEY_SPLASH_SCREEN_SCALE_TYPE";
+    field public static final String VERSION = "androidx.browser.trusted.KEY_SPLASH_SCREEN_VERSION";
+  }
+
+  public final class SplashScreenVersion {
+    field public static final String V1 = "androidx.browser.trusted.category.TrustedWebActivitySplashScreensV1";
+  }
+
+}
+
diff --git a/browser/api/current.txt b/browser/api/current.txt
index 8269878..4e2c30d 100644
--- a/browser/api/current.txt
+++ b/browser/api/current.txt
@@ -165,6 +165,7 @@
     method protected abstract boolean newSession(androidx.browser.customtabs.CustomTabsSessionToken!);
     method public android.os.IBinder! onBind(android.content.Intent!);
     method @androidx.browser.customtabs.CustomTabsService.Result protected abstract int postMessage(androidx.browser.customtabs.CustomTabsSessionToken!, String!, android.os.Bundle!);
+    method protected abstract boolean receiveFile(androidx.browser.customtabs.CustomTabsSessionToken, android.net.Uri, int, android.os.Bundle?);
     method protected abstract boolean requestPostMessageChannel(androidx.browser.customtabs.CustomTabsSessionToken!, android.net.Uri!);
     method protected abstract boolean updateVisuals(androidx.browser.customtabs.CustomTabsSessionToken!, android.os.Bundle!);
     method protected abstract boolean validateRelationship(androidx.browser.customtabs.CustomTabsSessionToken!, @androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri!, android.os.Bundle!);
@@ -172,6 +173,7 @@
     field public static final String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
     field public static final String CATEGORY_COLOR_SCHEME_CUSTOMIZATION = "androidx.browser.customtabs.category.ColorSchemeCustomization";
     field public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.customtabs.category.NavBarColorCustomization";
+    field public static final int FILE_PURPOSE_TRUSTED_WEB_ACTIVITY_SPLASH_IMAGE = 1; // 0x1
     field public static final String KEY_URL = "android.support.customtabs.otherurls.URL";
     field public static final int RELATION_HANDLE_ALL_URLS = 2; // 0x2
     field public static final int RELATION_USE_AS_ORIGIN = 1; // 0x1
@@ -179,6 +181,7 @@
     field public static final int RESULT_FAILURE_MESSAGING_ERROR = -3; // 0xfffffffd
     field public static final int RESULT_FAILURE_REMOTE_ERROR = -2; // 0xfffffffe
     field public static final int RESULT_SUCCESS = 0; // 0x0
+    field public static final String TRUSTED_WEB_ACTIVITY_CATEGORY = "androidx.browser.trusted.category.TrustedWebActivities";
   }
 
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({androidx.browser.customtabs.CustomTabsService.RELATION_USE_AS_ORIGIN, androidx.browser.customtabs.CustomTabsService.RELATION_HANDLE_ALL_URLS}) public static @interface CustomTabsService.Relation {
@@ -197,6 +200,7 @@
     method @VisibleForTesting public static androidx.browser.customtabs.CustomTabsSession createMockSessionForTesting(android.content.ComponentName);
     method public boolean mayLaunchUrl(android.net.Uri!, android.os.Bundle!, java.util.List<android.os.Bundle!>!);
     method @androidx.browser.customtabs.CustomTabsService.Result public int postMessage(String!, android.os.Bundle!);
+    method public boolean receiveFile(android.net.Uri, int, android.os.Bundle?);
     method public boolean requestPostMessageChannel(android.net.Uri!);
     method public boolean setActionButton(android.graphics.Bitmap, String);
     method public boolean setSecondaryToolbarViews(android.widget.RemoteViews?, int[]?, android.app.PendingIntent?);
@@ -229,9 +233,41 @@
   }
 
   public class TrustedWebUtils {
-    method public static void launchAsTrustedWebActivity(android.content.Context, androidx.browser.customtabs.CustomTabsIntent, android.net.Uri);
+    method @Deprecated public static void launchAsTrustedWebActivity(android.content.Context, androidx.browser.customtabs.CustomTabsIntent, android.net.Uri);
+    method public static boolean splashScreensAreSupported(android.content.Context, String, String);
+    method @WorkerThread public static boolean transferSplashImage(android.content.Context, java.io.File, String, String, androidx.browser.customtabs.CustomTabsSession);
     field public static final String EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY = "android.support.customtabs.extra.LAUNCH_AS_TRUSTED_WEB_ACTIVITY";
   }
 
 }
 
+package androidx.browser.trusted {
+
+  public class TrustedWebActivityBuilder {
+    ctor public TrustedWebActivityBuilder(android.content.Context, android.net.Uri);
+    method public android.net.Uri getUrl();
+    method public void launchActivity(androidx.browser.customtabs.CustomTabsSession);
+    method public androidx.browser.trusted.TrustedWebActivityBuilder setAdditionalTrustedOrigins(java.util.List<java.lang.String!>);
+    method public androidx.browser.trusted.TrustedWebActivityBuilder setSplashScreenParams(android.os.Bundle);
+    field public static final String EXTRA_ADDITIONAL_TRUSTED_ORIGINS = "android.support.customtabs.extra.ADDITIONAL_TRUSTED_ORIGINS";
+    field public static final String EXTRA_SPLASH_SCREEN_PARAMS = "androidx.browser.trusted.EXTRA_SPLASH_SCREEN_PARAMS";
+  }
+
+}
+
+package androidx.browser.trusted.splashscreens {
+
+  public final class SplashScreenParamKey {
+    field public static final String BACKGROUND_COLOR = "androidx.browser.trusted.trusted.KEY_SPLASH_SCREEN_BACKGROUND_COLOR";
+    field public static final String FADE_OUT_DURATION_MS = "androidx.browser.trusted.KEY_SPLASH_SCREEN_FADE_OUT_DURATION";
+    field public static final String IMAGE_TRANSFORMATION_MATRIX = "androidx.browser.trusted.KEY_SPLASH_SCREEN_TRANSFORMATION_MATRIX";
+    field public static final String SCALE_TYPE = "androidx.browser.trusted.KEY_SPLASH_SCREEN_SCALE_TYPE";
+    field public static final String VERSION = "androidx.browser.trusted.KEY_SPLASH_SCREEN_VERSION";
+  }
+
+  public final class SplashScreenVersion {
+    field public static final String V1 = "androidx.browser.trusted.category.TrustedWebActivitySplashScreensV1";
+  }
+
+}
+
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/browser/api/res-1.2.0-alpha05.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to browser/api/res-1.2.0-alpha05.txt
diff --git a/browser/api/restricted_1.2.0-alpha05.txt b/browser/api/restricted_1.2.0-alpha05.txt
new file mode 100644
index 0000000..8a1533f
--- /dev/null
+++ b/browser/api/restricted_1.2.0-alpha05.txt
@@ -0,0 +1,294 @@
+// Signature format: 3.0
+package androidx.browser.browseractions {
+
+  @Deprecated public class BrowserActionItem {
+    ctor @Deprecated public BrowserActionItem(String, android.app.PendingIntent, @DrawableRes int);
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public BrowserActionItem(String, android.app.PendingIntent, android.net.Uri);
+    ctor @Deprecated public BrowserActionItem(String, android.app.PendingIntent);
+    method @Deprecated public android.app.PendingIntent getAction();
+    method @Deprecated public int getIconId();
+    method @Deprecated public String getTitle();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class BrowserActionsFallbackMenuView extends android.widget.LinearLayout {
+    ctor public BrowserActionsFallbackMenuView(android.content.Context!, android.util.AttributeSet!);
+  }
+
+  @Deprecated public class BrowserActionsIntent {
+    method @Deprecated public static String? getCreatorPackageName(android.content.Intent);
+    method @Deprecated public android.content.Intent getIntent();
+    method @Deprecated public static String? getUntrustedCreatorPackageName(android.content.Intent);
+    method @Deprecated public static void launchIntent(android.content.Context!, android.content.Intent!);
+    method @Deprecated public static void openBrowserAction(android.content.Context!, android.net.Uri!);
+    method @Deprecated public static void openBrowserAction(android.content.Context!, android.net.Uri!, int, java.util.ArrayList<androidx.browser.browseractions.BrowserActionItem!>!, android.app.PendingIntent!);
+    method @Deprecated public static java.util.List<androidx.browser.browseractions.BrowserActionItem!>! parseBrowserActionItems(java.util.ArrayList<android.os.Bundle!>!);
+    field @Deprecated public static final String ACTION_BROWSER_ACTIONS_OPEN = "androidx.browser.browseractions.browser_action_open";
+    field @Deprecated public static final String EXTRA_APP_ID = "androidx.browser.browseractions.APP_ID";
+    field @Deprecated public static final String EXTRA_MENU_ITEMS = "androidx.browser.browseractions.extra.MENU_ITEMS";
+    field @Deprecated public static final String EXTRA_SELECTED_ACTION_PENDING_INTENT = "androidx.browser.browseractions.extra.SELECTED_ACTION_PENDING_INTENT";
+    field @Deprecated public static final String EXTRA_TYPE = "androidx.browser.browseractions.extra.TYPE";
+    field @Deprecated public static final int ITEM_COPY = 3; // 0x3
+    field @Deprecated public static final int ITEM_DOWNLOAD = 2; // 0x2
+    field @Deprecated public static final int ITEM_INVALID_ITEM = -1; // 0xffffffff
+    field @Deprecated public static final int ITEM_OPEN_IN_INCOGNITO = 1; // 0x1
+    field @Deprecated public static final int ITEM_OPEN_IN_NEW_TAB = 0; // 0x0
+    field @Deprecated public static final int ITEM_SHARE = 4; // 0x4
+    field @Deprecated public static final String KEY_ACTION = "androidx.browser.browseractions.ACTION";
+    field @Deprecated public static final String KEY_ICON_ID = "androidx.browser.browseractions.ICON_ID";
+    field @Deprecated public static final String KEY_TITLE = "androidx.browser.browseractions.TITLE";
+    field @Deprecated public static final int MAX_CUSTOM_ITEMS = 5; // 0x5
+    field @Deprecated public static final int URL_TYPE_AUDIO = 3; // 0x3
+    field @Deprecated public static final int URL_TYPE_FILE = 4; // 0x4
+    field @Deprecated public static final int URL_TYPE_IMAGE = 1; // 0x1
+    field @Deprecated public static final int URL_TYPE_NONE = 0; // 0x0
+    field @Deprecated public static final int URL_TYPE_PLUGIN = 5; // 0x5
+    field @Deprecated public static final int URL_TYPE_VIDEO = 2; // 0x2
+  }
+
+  @Deprecated @IntDef({androidx.browser.browseractions.BrowserActionsIntent.ITEM_INVALID_ITEM, androidx.browser.browseractions.BrowserActionsIntent.ITEM_OPEN_IN_NEW_TAB, androidx.browser.browseractions.BrowserActionsIntent.ITEM_OPEN_IN_INCOGNITO, androidx.browser.browseractions.BrowserActionsIntent.ITEM_DOWNLOAD, androidx.browser.browseractions.BrowserActionsIntent.ITEM_COPY, androidx.browser.browseractions.BrowserActionsIntent.ITEM_SHARE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface BrowserActionsIntent.BrowserActionsItemId {
+  }
+
+  @Deprecated @IntDef({androidx.browser.browseractions.BrowserActionsIntent.URL_TYPE_NONE, androidx.browser.browseractions.BrowserActionsIntent.URL_TYPE_IMAGE, androidx.browser.browseractions.BrowserActionsIntent.URL_TYPE_VIDEO, androidx.browser.browseractions.BrowserActionsIntent.URL_TYPE_AUDIO, androidx.browser.browseractions.BrowserActionsIntent.URL_TYPE_FILE, androidx.browser.browseractions.BrowserActionsIntent.URL_TYPE_PLUGIN}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface BrowserActionsIntent.BrowserActionsUrlType {
+  }
+
+  @Deprecated public static final class BrowserActionsIntent.Builder {
+    ctor @Deprecated public BrowserActionsIntent.Builder(android.content.Context!, android.net.Uri!);
+    method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent! build();
+    method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder! setCustomItems(java.util.ArrayList<androidx.browser.browseractions.BrowserActionItem!>!);
+    method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder! setCustomItems(androidx.browser.browseractions.BrowserActionItem!...);
+    method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder! setOnItemSelectedAction(android.app.PendingIntent!);
+    method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder! setUrlType(@androidx.browser.browseractions.BrowserActionsIntent.BrowserActionsUrlType int);
+  }
+
+
+}
+
+package androidx.browser.customtabs {
+
+  public final class CustomTabColorSchemeParams {
+    field @ColorInt public final Integer? navigationBarColor;
+    field @ColorInt public final Integer? secondaryToolbarColor;
+    field @ColorInt public final Integer? toolbarColor;
+  }
+
+  public static final class CustomTabColorSchemeParams.Builder {
+    ctor public CustomTabColorSchemeParams.Builder();
+    method public androidx.browser.customtabs.CustomTabColorSchemeParams build();
+    method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setNavigationBarColor(@ColorInt int);
+    method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setSecondaryToolbarColor(@ColorInt int);
+    method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setToolbarColor(@ColorInt int);
+  }
+
+  public class CustomTabsCallback {
+    ctor public CustomTabsCallback();
+    method public void extraCallback(String!, android.os.Bundle!);
+    method public void onMessageChannelReady(android.os.Bundle!);
+    method public void onNavigationEvent(int, android.os.Bundle!);
+    method public void onPostMessage(String!, android.os.Bundle!);
+    method public void onRelationshipValidationResult(@androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri!, boolean, android.os.Bundle!);
+    field public static final int NAVIGATION_ABORTED = 4; // 0x4
+    field public static final int NAVIGATION_FAILED = 3; // 0x3
+    field public static final int NAVIGATION_FINISHED = 2; // 0x2
+    field public static final int NAVIGATION_STARTED = 1; // 0x1
+    field public static final int TAB_HIDDEN = 6; // 0x6
+    field public static final int TAB_SHOWN = 5; // 0x5
+  }
+
+  public class CustomTabsClient {
+    method public static boolean bindCustomTabsService(android.content.Context, String?, androidx.browser.customtabs.CustomTabsServiceConnection);
+    method public static boolean connectAndInitialize(android.content.Context, String);
+    method public android.os.Bundle? extraCommand(String, android.os.Bundle?);
+    method public static String? getPackageName(android.content.Context, java.util.List<java.lang.String!>?);
+    method public static String? getPackageName(android.content.Context, java.util.List<java.lang.String!>?, boolean);
+    method public androidx.browser.customtabs.CustomTabsSession? newSession(androidx.browser.customtabs.CustomTabsCallback?);
+    method public androidx.browser.customtabs.CustomTabsSession? newSession(androidx.browser.customtabs.CustomTabsCallback?, int);
+    method public boolean warmup(long);
+  }
+
+  public final class CustomTabsIntent {
+    method public static androidx.browser.customtabs.CustomTabColorSchemeParams getColorSchemeParams(android.content.Intent, @androidx.browser.customtabs.CustomTabsIntent.ColorScheme int);
+    method public static int getMaxToolbarItems();
+    method public void launchUrl(android.content.Context!, android.net.Uri!);
+    method public static android.content.Intent! setAlwaysUseBrowserUI(android.content.Intent!);
+    method public static boolean shouldAlwaysUseBrowserUI(android.content.Intent!);
+    field public static final int COLOR_SCHEME_DARK = 2; // 0x2
+    field public static final int COLOR_SCHEME_LIGHT = 1; // 0x1
+    field public static final int COLOR_SCHEME_SYSTEM = 0; // 0x0
+    field public static final String EXTRA_ACTION_BUTTON_BUNDLE = "android.support.customtabs.extra.ACTION_BUTTON_BUNDLE";
+    field public static final String EXTRA_CLOSE_BUTTON_ICON = "android.support.customtabs.extra.CLOSE_BUTTON_ICON";
+    field public static final String EXTRA_COLOR_SCHEME = "androidx.browser.customtabs.extra.COLOR_SCHEME";
+    field public static final String EXTRA_COLOR_SCHEME_PARAMS = "androidx.browser.customtabs.extra.COLOR_SCHEME_PARAMS";
+    field public static final String EXTRA_DEFAULT_SHARE_MENU_ITEM = "android.support.customtabs.extra.SHARE_MENU_ITEM";
+    field public static final String EXTRA_ENABLE_INSTANT_APPS = "android.support.customtabs.extra.EXTRA_ENABLE_INSTANT_APPS";
+    field public static final String EXTRA_ENABLE_URLBAR_HIDING = "android.support.customtabs.extra.ENABLE_URLBAR_HIDING";
+    field public static final String EXTRA_EXIT_ANIMATION_BUNDLE = "android.support.customtabs.extra.EXIT_ANIMATION_BUNDLE";
+    field public static final String EXTRA_MENU_ITEMS = "android.support.customtabs.extra.MENU_ITEMS";
+    field public static final String EXTRA_NAVIGATION_BAR_COLOR = "androidx.browser.customtabs.extra.NAVIGATION_BAR_COLOR";
+    field public static final String EXTRA_REMOTEVIEWS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS";
+    field public static final String EXTRA_REMOTEVIEWS_CLICKED_ID = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_CLICKED_ID";
+    field public static final String EXTRA_REMOTEVIEWS_PENDINGINTENT = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_PENDINGINTENT";
+    field public static final String EXTRA_REMOTEVIEWS_VIEW_IDS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_VIEW_IDS";
+    field public static final String EXTRA_SECONDARY_TOOLBAR_COLOR = "android.support.customtabs.extra.SECONDARY_TOOLBAR_COLOR";
+    field public static final String EXTRA_SESSION = "android.support.customtabs.extra.SESSION";
+    field public static final String EXTRA_TINT_ACTION_BUTTON = "android.support.customtabs.extra.TINT_ACTION_BUTTON";
+    field public static final String EXTRA_TITLE_VISIBILITY_STATE = "android.support.customtabs.extra.TITLE_VISIBILITY";
+    field public static final String EXTRA_TOOLBAR_COLOR = "android.support.customtabs.extra.TOOLBAR_COLOR";
+    field public static final String EXTRA_TOOLBAR_ITEMS = "android.support.customtabs.extra.TOOLBAR_ITEMS";
+    field public static final String KEY_DESCRIPTION = "android.support.customtabs.customaction.DESCRIPTION";
+    field public static final String KEY_ICON = "android.support.customtabs.customaction.ICON";
+    field public static final String KEY_ID = "android.support.customtabs.customaction.ID";
+    field public static final String KEY_MENU_ITEM_TITLE = "android.support.customtabs.customaction.MENU_ITEM_TITLE";
+    field public static final String KEY_PENDING_INTENT = "android.support.customtabs.customaction.PENDING_INTENT";
+    field public static final int NO_TITLE = 0; // 0x0
+    field public static final int SHOW_PAGE_TITLE = 1; // 0x1
+    field public static final int TOOLBAR_ACTION_BUTTON_ID = 0; // 0x0
+    field public final android.content.Intent intent;
+    field public final android.os.Bundle? startAnimationBundle;
+  }
+
+  public static final class CustomTabsIntent.Builder {
+    ctor public CustomTabsIntent.Builder();
+    ctor public CustomTabsIntent.Builder(androidx.browser.customtabs.CustomTabsSession?);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder addDefaultShareMenuItem();
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder addMenuItem(String, android.app.PendingIntent);
+    method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder addToolbarItem(int, android.graphics.Bitmap, String, android.app.PendingIntent!) throws java.lang.IllegalStateException;
+    method public androidx.browser.customtabs.CustomTabsIntent build();
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder enableUrlBarHiding();
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, String, android.app.PendingIntent, boolean);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, String, android.app.PendingIntent);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setCloseButtonIcon(android.graphics.Bitmap);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setColorScheme(@androidx.browser.customtabs.CustomTabsIntent.ColorScheme int);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setColorSchemeParams(@androidx.browser.customtabs.CustomTabsIntent.ColorScheme int, androidx.browser.customtabs.CustomTabColorSchemeParams);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setExitAnimations(android.content.Context, @AnimRes int, @AnimRes int);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setInstantAppsEnabled(boolean);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setNavigationBarColor(@ColorInt int);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setSecondaryToolbarColor(@ColorInt int);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setSecondaryToolbarViews(android.widget.RemoteViews, int[]?, android.app.PendingIntent?);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setShowTitle(boolean);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setStartAnimations(android.content.Context, @AnimRes int, @AnimRes int);
+    method public androidx.browser.customtabs.CustomTabsIntent.Builder setToolbarColor(@ColorInt int);
+  }
+
+
+  public abstract class CustomTabsService extends android.app.Service {
+    ctor public CustomTabsService();
+    method protected boolean cleanUpSession(androidx.browser.customtabs.CustomTabsSessionToken!);
+    method protected abstract android.os.Bundle! extraCommand(String!, android.os.Bundle!);
+    method protected abstract boolean mayLaunchUrl(androidx.browser.customtabs.CustomTabsSessionToken!, android.net.Uri!, android.os.Bundle!, java.util.List<android.os.Bundle!>!);
+    method protected abstract boolean newSession(androidx.browser.customtabs.CustomTabsSessionToken!);
+    method public android.os.IBinder! onBind(android.content.Intent!);
+    method @androidx.browser.customtabs.CustomTabsService.Result protected abstract int postMessage(androidx.browser.customtabs.CustomTabsSessionToken!, String!, android.os.Bundle!);
+    method protected abstract boolean receiveFile(androidx.browser.customtabs.CustomTabsSessionToken, android.net.Uri, @androidx.browser.customtabs.CustomTabsService.FilePurpose int, android.os.Bundle?);
+    method protected abstract boolean requestPostMessageChannel(androidx.browser.customtabs.CustomTabsSessionToken!, android.net.Uri!);
+    method protected abstract boolean updateVisuals(androidx.browser.customtabs.CustomTabsSessionToken!, android.os.Bundle!);
+    method protected abstract boolean validateRelationship(androidx.browser.customtabs.CustomTabsSessionToken!, @androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri!, android.os.Bundle!);
+    method protected abstract boolean warmup(long);
+    field public static final String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
+    field public static final String CATEGORY_COLOR_SCHEME_CUSTOMIZATION = "androidx.browser.customtabs.category.ColorSchemeCustomization";
+    field public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.customtabs.category.NavBarColorCustomization";
+    field public static final int FILE_PURPOSE_TRUSTED_WEB_ACTIVITY_SPLASH_IMAGE = 1; // 0x1
+    field public static final String KEY_URL = "android.support.customtabs.otherurls.URL";
+    field public static final int RELATION_HANDLE_ALL_URLS = 2; // 0x2
+    field public static final int RELATION_USE_AS_ORIGIN = 1; // 0x1
+    field public static final int RESULT_FAILURE_DISALLOWED = -1; // 0xffffffff
+    field public static final int RESULT_FAILURE_MESSAGING_ERROR = -3; // 0xfffffffd
+    field public static final int RESULT_FAILURE_REMOTE_ERROR = -2; // 0xfffffffe
+    field public static final int RESULT_SUCCESS = 0; // 0x0
+    field public static final String TRUSTED_WEB_ACTIVITY_CATEGORY = "androidx.browser.trusted.category.TrustedWebActivities";
+  }
+
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({androidx.browser.customtabs.CustomTabsService.RELATION_USE_AS_ORIGIN, androidx.browser.customtabs.CustomTabsService.RELATION_HANDLE_ALL_URLS}) public static @interface CustomTabsService.Relation {
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({androidx.browser.customtabs.CustomTabsService.RESULT_SUCCESS, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_DISALLOWED, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_REMOTE_ERROR, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_MESSAGING_ERROR}) public static @interface CustomTabsService.Result {
+  }
+
+  public abstract class CustomTabsServiceConnection implements android.content.ServiceConnection {
+    ctor public CustomTabsServiceConnection();
+    method public abstract void onCustomTabsServiceConnected(android.content.ComponentName!, androidx.browser.customtabs.CustomTabsClient!);
+    method public final void onServiceConnected(android.content.ComponentName!, android.os.IBinder!);
+  }
+
+  public final class CustomTabsSession {
+    method @VisibleForTesting public static androidx.browser.customtabs.CustomTabsSession createMockSessionForTesting(android.content.ComponentName);
+    method public boolean mayLaunchUrl(android.net.Uri!, android.os.Bundle!, java.util.List<android.os.Bundle!>!);
+    method @androidx.browser.customtabs.CustomTabsService.Result public int postMessage(String!, android.os.Bundle!);
+    method public boolean receiveFile(android.net.Uri, @androidx.browser.customtabs.CustomTabsService.FilePurpose int, android.os.Bundle?);
+    method public boolean requestPostMessageChannel(android.net.Uri!);
+    method public boolean setActionButton(android.graphics.Bitmap, String);
+    method public boolean setSecondaryToolbarViews(android.widget.RemoteViews?, int[]?, android.app.PendingIntent?);
+    method @Deprecated public boolean setToolbarItem(int, android.graphics.Bitmap, String);
+    method public boolean validateRelationship(@androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri, android.os.Bundle?);
+  }
+
+
+  public class CustomTabsSessionToken {
+    method public static androidx.browser.customtabs.CustomTabsSessionToken createMockSessionTokenForTesting();
+    method public androidx.browser.customtabs.CustomTabsCallback? getCallback();
+    method public static androidx.browser.customtabs.CustomTabsSessionToken? getSessionTokenFromIntent(android.content.Intent);
+    method public boolean isAssociatedWith(androidx.browser.customtabs.CustomTabsSession);
+  }
+
+
+  public class PostMessageService extends android.app.Service {
+    ctor public PostMessageService();
+    method public android.os.IBinder! onBind(android.content.Intent!);
+  }
+
+  public abstract class PostMessageServiceConnection implements androidx.browser.customtabs.PostMessageBackend android.content.ServiceConnection {
+    ctor public PostMessageServiceConnection(androidx.browser.customtabs.CustomTabsSessionToken!);
+    method public boolean bindSessionToPostMessageService(android.content.Context!, String!);
+    method public final boolean notifyMessageChannelReady(android.os.Bundle!);
+    method public void onPostMessageServiceConnected();
+    method public void onPostMessageServiceDisconnected();
+    method public final void onServiceConnected(android.content.ComponentName!, android.os.IBinder!);
+    method public final void onServiceDisconnected(android.content.ComponentName!);
+    method public final boolean postMessage(String!, android.os.Bundle!);
+    method public void unbindFromContext(android.content.Context!);
+  }
+
+  public class TrustedWebUtils {
+    method @Deprecated public static void launchAsTrustedWebActivity(android.content.Context, androidx.browser.customtabs.CustomTabsIntent, android.net.Uri);
+    method public static boolean splashScreensAreSupported(android.content.Context, String, String);
+    method @WorkerThread public static boolean transferSplashImage(android.content.Context, java.io.File, String, String, androidx.browser.customtabs.CustomTabsSession);
+    field public static final String EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY = "android.support.customtabs.extra.LAUNCH_AS_TRUSTED_WEB_ACTIVITY";
+  }
+
+}
+
+package androidx.browser.trusted {
+
+
+  public class TrustedWebActivityBuilder {
+    ctor public TrustedWebActivityBuilder(android.content.Context, android.net.Uri);
+    method public android.net.Uri getUrl();
+    method public void launchActivity(androidx.browser.customtabs.CustomTabsSession);
+    method public androidx.browser.trusted.TrustedWebActivityBuilder setAdditionalTrustedOrigins(java.util.List<java.lang.String!>);
+    method public androidx.browser.trusted.TrustedWebActivityBuilder setSplashScreenParams(android.os.Bundle);
+    field public static final String EXTRA_ADDITIONAL_TRUSTED_ORIGINS = "android.support.customtabs.extra.ADDITIONAL_TRUSTED_ORIGINS";
+    field public static final String EXTRA_SPLASH_SCREEN_PARAMS = "androidx.browser.trusted.EXTRA_SPLASH_SCREEN_PARAMS";
+  }
+
+
+
+
+
+}
+
+package androidx.browser.trusted.splashscreens {
+
+  public final class SplashScreenParamKey {
+    field public static final String BACKGROUND_COLOR = "androidx.browser.trusted.trusted.KEY_SPLASH_SCREEN_BACKGROUND_COLOR";
+    field public static final String FADE_OUT_DURATION_MS = "androidx.browser.trusted.KEY_SPLASH_SCREEN_FADE_OUT_DURATION";
+    field public static final String IMAGE_TRANSFORMATION_MATRIX = "androidx.browser.trusted.KEY_SPLASH_SCREEN_TRANSFORMATION_MATRIX";
+    field public static final String SCALE_TYPE = "androidx.browser.trusted.KEY_SPLASH_SCREEN_SCALE_TYPE";
+    field public static final String VERSION = "androidx.browser.trusted.KEY_SPLASH_SCREEN_VERSION";
+  }
+
+  public final class SplashScreenVersion {
+    field public static final String V1 = "androidx.browser.trusted.category.TrustedWebActivitySplashScreensV1";
+  }
+
+}
+
diff --git a/browser/api/restricted_current.txt b/browser/api/restricted_current.txt
index 2757731..8a1533f 100644
--- a/browser/api/restricted_current.txt
+++ b/browser/api/restricted_current.txt
@@ -178,6 +178,7 @@
     method protected abstract boolean newSession(androidx.browser.customtabs.CustomTabsSessionToken!);
     method public android.os.IBinder! onBind(android.content.Intent!);
     method @androidx.browser.customtabs.CustomTabsService.Result protected abstract int postMessage(androidx.browser.customtabs.CustomTabsSessionToken!, String!, android.os.Bundle!);
+    method protected abstract boolean receiveFile(androidx.browser.customtabs.CustomTabsSessionToken, android.net.Uri, @androidx.browser.customtabs.CustomTabsService.FilePurpose int, android.os.Bundle?);
     method protected abstract boolean requestPostMessageChannel(androidx.browser.customtabs.CustomTabsSessionToken!, android.net.Uri!);
     method protected abstract boolean updateVisuals(androidx.browser.customtabs.CustomTabsSessionToken!, android.os.Bundle!);
     method protected abstract boolean validateRelationship(androidx.browser.customtabs.CustomTabsSessionToken!, @androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri!, android.os.Bundle!);
@@ -185,6 +186,7 @@
     field public static final String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
     field public static final String CATEGORY_COLOR_SCHEME_CUSTOMIZATION = "androidx.browser.customtabs.category.ColorSchemeCustomization";
     field public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.customtabs.category.NavBarColorCustomization";
+    field public static final int FILE_PURPOSE_TRUSTED_WEB_ACTIVITY_SPLASH_IMAGE = 1; // 0x1
     field public static final String KEY_URL = "android.support.customtabs.otherurls.URL";
     field public static final int RELATION_HANDLE_ALL_URLS = 2; // 0x2
     field public static final int RELATION_USE_AS_ORIGIN = 1; // 0x1
@@ -192,6 +194,7 @@
     field public static final int RESULT_FAILURE_MESSAGING_ERROR = -3; // 0xfffffffd
     field public static final int RESULT_FAILURE_REMOTE_ERROR = -2; // 0xfffffffe
     field public static final int RESULT_SUCCESS = 0; // 0x0
+    field public static final String TRUSTED_WEB_ACTIVITY_CATEGORY = "androidx.browser.trusted.category.TrustedWebActivities";
   }
 
 
@@ -211,6 +214,7 @@
     method @VisibleForTesting public static androidx.browser.customtabs.CustomTabsSession createMockSessionForTesting(android.content.ComponentName);
     method public boolean mayLaunchUrl(android.net.Uri!, android.os.Bundle!, java.util.List<android.os.Bundle!>!);
     method @androidx.browser.customtabs.CustomTabsService.Result public int postMessage(String!, android.os.Bundle!);
+    method public boolean receiveFile(android.net.Uri, @androidx.browser.customtabs.CustomTabsService.FilePurpose int, android.os.Bundle?);
     method public boolean requestPostMessageChannel(android.net.Uri!);
     method public boolean setActionButton(android.graphics.Bitmap, String);
     method public boolean setSecondaryToolbarViews(android.widget.RemoteViews?, int[]?, android.app.PendingIntent?);
@@ -245,17 +249,26 @@
   }
 
   public class TrustedWebUtils {
-    method public static void launchAsTrustedWebActivity(android.content.Context, androidx.browser.customtabs.CustomTabsIntent, android.net.Uri);
+    method @Deprecated public static void launchAsTrustedWebActivity(android.content.Context, androidx.browser.customtabs.CustomTabsIntent, android.net.Uri);
+    method public static boolean splashScreensAreSupported(android.content.Context, String, String);
+    method @WorkerThread public static boolean transferSplashImage(android.content.Context, java.io.File, String, String, androidx.browser.customtabs.CustomTabsSession);
     field public static final String EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY = "android.support.customtabs.extra.LAUNCH_AS_TRUSTED_WEB_ACTIVITY";
   }
 
-
-
 }
 
 package androidx.browser.trusted {
 
 
+  public class TrustedWebActivityBuilder {
+    ctor public TrustedWebActivityBuilder(android.content.Context, android.net.Uri);
+    method public android.net.Uri getUrl();
+    method public void launchActivity(androidx.browser.customtabs.CustomTabsSession);
+    method public androidx.browser.trusted.TrustedWebActivityBuilder setAdditionalTrustedOrigins(java.util.List<java.lang.String!>);
+    method public androidx.browser.trusted.TrustedWebActivityBuilder setSplashScreenParams(android.os.Bundle);
+    field public static final String EXTRA_ADDITIONAL_TRUSTED_ORIGINS = "android.support.customtabs.extra.ADDITIONAL_TRUSTED_ORIGINS";
+    field public static final String EXTRA_SPLASH_SCREEN_PARAMS = "androidx.browser.trusted.EXTRA_SPLASH_SCREEN_PARAMS";
+  }
 
 
 
@@ -263,3 +276,19 @@
 
 }
 
+package androidx.browser.trusted.splashscreens {
+
+  public final class SplashScreenParamKey {
+    field public static final String BACKGROUND_COLOR = "androidx.browser.trusted.trusted.KEY_SPLASH_SCREEN_BACKGROUND_COLOR";
+    field public static final String FADE_OUT_DURATION_MS = "androidx.browser.trusted.KEY_SPLASH_SCREEN_FADE_OUT_DURATION";
+    field public static final String IMAGE_TRANSFORMATION_MATRIX = "androidx.browser.trusted.KEY_SPLASH_SCREEN_TRANSFORMATION_MATRIX";
+    field public static final String SCALE_TYPE = "androidx.browser.trusted.KEY_SPLASH_SCREEN_SCALE_TYPE";
+    field public static final String VERSION = "androidx.browser.trusted.KEY_SPLASH_SCREEN_VERSION";
+  }
+
+  public final class SplashScreenVersion {
+    field public static final String V1 = "androidx.browser.trusted.category.TrustedWebActivitySplashScreensV1";
+  }
+
+}
+
diff --git a/browser/src/androidTest/java/androidx/browser/trusted/TrustedWebActivityBuilderTest.java b/browser/src/androidTest/java/androidx/browser/trusted/TrustedWebActivityBuilderTest.java
index c94fcc6..d1531a1 100644
--- a/browser/src/androidTest/java/androidx/browser/trusted/TrustedWebActivityBuilderTest.java
+++ b/browser/src/androidTest/java/androidx/browser/trusted/TrustedWebActivityBuilderTest.java
@@ -32,8 +32,8 @@
 import androidx.browser.customtabs.EnableComponentsTestRule;
 import androidx.browser.customtabs.TestActivity;
 import androidx.browser.customtabs.TestCustomTabsServiceSupportsTwas;
-import androidx.browser.customtabs.TrustedWebUtils;
 import androidx.browser.customtabs.testutil.CustomTabConnectionRule;
+import androidx.browser.trusted.splashscreens.SplashScreenParamKey;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
 import androidx.test.rule.ActivityTestRule;
@@ -86,7 +86,7 @@
         Bundle splashScreenParams = new Bundle();
         int splashBgColor = 0x112233;
         splashScreenParams.putInt(
-                TrustedWebUtils.SplashScreenParamKey.BACKGROUND_COLOR, splashBgColor);
+                SplashScreenParamKey.BACKGROUND_COLOR, splashBgColor);
 
         final TrustedWebActivityBuilder builder =
                 new TrustedWebActivityBuilder(mActivity, url)
@@ -106,14 +106,14 @@
                 .isAssociatedWith(mSession));
         assertEquals(url, intent.getData());
         assertEquals(statusBarColor, intent.getIntExtra(CustomTabsIntent.EXTRA_TOOLBAR_COLOR, 0));
-        assertEquals(additionalTrustedOrigins,
-                intent.getStringArrayListExtra(TrustedWebUtils.EXTRA_ADDITIONAL_TRUSTED_ORIGINS));
+        assertEquals(additionalTrustedOrigins, intent.getStringArrayListExtra(
+                TrustedWebActivityBuilder.EXTRA_ADDITIONAL_TRUSTED_ORIGINS));
 
         Bundle splashScreenParamsReceived =
-                intent.getBundleExtra(TrustedWebUtils.EXTRA_SPLASH_SCREEN_PARAMS);
+                intent.getBundleExtra(TrustedWebActivityBuilder.EXTRA_SPLASH_SCREEN_PARAMS);
 
         // No need to test every splash screen param: they are sent in as-is in provided Bundle.
         assertEquals(splashBgColor, splashScreenParamsReceived.getInt(
-                TrustedWebUtils.SplashScreenParamKey.BACKGROUND_COLOR));
+                SplashScreenParamKey.BACKGROUND_COLOR));
     }
 }
diff --git a/browser/src/main/java/androidx/browser/customtabs/CustomTabsService.java b/browser/src/main/java/androidx/browser/customtabs/CustomTabsService.java
index a874038..5212a28 100644
--- a/browser/src/main/java/androidx/browser/customtabs/CustomTabsService.java
+++ b/browser/src/main/java/androidx/browser/customtabs/CustomTabsService.java
@@ -68,11 +68,8 @@
 
     /**
      * An Intent filter category to signify that the Custom Tabs provider supports Trusted Web
-     * Activities.
-     *
-     * @hide
+     * Activities (see {@link TrustedWebUtils} for more details).
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
     public static final String TRUSTED_WEB_ACTIVITY_CATEGORY =
             "androidx.browser.trusted.category.TrustedWebActivities";
 
@@ -134,18 +131,16 @@
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({FILE_PURPOSE_TWA_SPLASH_IMAGE})
+    @IntDef({FILE_PURPOSE_TRUSTED_WEB_ACTIVITY_SPLASH_IMAGE})
     public @interface FilePurpose {
     }
 
     /**
-     * File is a splash image to be shown on top of a Trusted Web Activity while the web contents
+     * A constant to be used with {@link CustomTabsSession#receiveFile} indicating that the file
+     * is a splash image to be shown on top of a Trusted Web Activity while the web contents
      * are loading.
-     *
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static final int FILE_PURPOSE_TWA_SPLASH_IMAGE = 1;
+    public static final int FILE_PURPOSE_TRUSTED_WEB_ACTIVITY_SPLASH_IMAGE = 1;
 
     final SimpleArrayMap<IBinder, DeathRecipient> mDeathRecipientMap = new SimpleArrayMap<>();
 
@@ -415,10 +410,7 @@
      *                {@code CustomTabsService#FilePurpose}.
      * @param extras Reserved for future use.
      * @return {@code true} if the file was received successfully.
-     *
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
     protected abstract boolean receiveFile(@NonNull CustomTabsSessionToken sessionToken,
             @NonNull Uri uri, @FilePurpose int purpose, @Nullable Bundle extras);
 }
diff --git a/browser/src/main/java/androidx/browser/customtabs/CustomTabsSession.java b/browser/src/main/java/androidx/browser/customtabs/CustomTabsSession.java
index e90cd1f..2746f1b 100644
--- a/browser/src/main/java/androidx/browser/customtabs/CustomTabsSession.java
+++ b/browser/src/main/java/androidx/browser/customtabs/CustomTabsSession.java
@@ -277,10 +277,7 @@
      *                {@code CustomTabsService#FilePurpose}.
      * @param extras Reserved for future use.
      * @return {@code true} if the file was received successfully.
-     *
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
     public boolean receiveFile(@NonNull Uri uri, @CustomTabsService.FilePurpose int purpose,
             @Nullable Bundle extras) {
         if (extras == null) {
diff --git a/browser/src/main/java/androidx/browser/customtabs/TrustedWebUtils.java b/browser/src/main/java/androidx/browser/customtabs/TrustedWebUtils.java
index d3690e43..d287b43 100644
--- a/browser/src/main/java/androidx/browser/customtabs/TrustedWebUtils.java
+++ b/browser/src/main/java/androidx/browser/customtabs/TrustedWebUtils.java
@@ -23,19 +23,17 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
-import android.graphics.Matrix;
 import android.net.Uri;
 import android.os.Bundle;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
-import androidx.annotation.StringDef;
+import androidx.annotation.WorkerThread;
+import androidx.browser.trusted.TrustedWebActivityBuilder;
 import androidx.core.app.BundleCompat;
 import androidx.core.content.FileProvider;
 
 import java.io.File;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
 
 /**
  * Class for utilities and convenience calls for opening a qualifying web page as a
@@ -67,13 +65,6 @@
             "android.support.customtabs.extra.LAUNCH_AS_TRUSTED_WEB_ACTIVITY";
 
     /**
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static final String EXTRA_ADDITIONAL_TRUSTED_ORIGINS =
-            "android.support.customtabs.extra.ADDITIONAL_TRUSTED_ORIGINS";
-
-    /**
      * @see #launchBrowserSiteSettings
      *
      * @hide
@@ -82,94 +73,6 @@
     public static final String ACTION_MANAGE_TRUSTED_WEB_ACTIVITY_DATA =
             "android.support.customtabs.action.ACTION_MANAGE_TRUSTED_WEB_ACTIVITY_DATA";
 
-    /**
-     * Extra that stores the {@link Bundle} of splash screen parameters, see
-     * {@link SplashScreenParamKey}.
-     *
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static final String EXTRA_SPLASH_SCREEN_PARAMS =
-            "androidx.browser.trusted.EXTRA_SPLASH_SCREEN_PARAMS";
-
-
-    /**
-     * The keys of the entries in the {@link Bundle} passed in {@link #EXTRA_SPLASH_SCREEN_PARAMS}.
-     *
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public interface SplashScreenParamKey {
-        /**
-         * The version of splash screens to use.
-         * The value must be one of {@link SplashScreenVersion}.
-         */
-        String VERSION = "androidx.browser.trusted.KEY_SPLASH_SCREEN_VERSION";
-
-        /**
-         * The background color of the splash screen.
-         * The value must be an integer representing the color in RGB (alpha channel is ignored if
-         * provided). The default is white.
-         */
-        String BACKGROUND_COLOR =
-                "androidx.browser.trusted.trusted.KEY_SPLASH_SCREEN_BACKGROUND_COLOR";
-
-        /**
-         * The {@link android.widget.ImageView.ScaleType} to apply to the image on the splash
-         * screen.
-         * The value must be an integer - the ordinal of the ScaleType.
-         * The default is {@link android.widget.ImageView.ScaleType#CENTER}.
-         */
-        String SCALE_TYPE = "androidx.browser.trusted.KEY_SPLASH_SCREEN_SCALE_TYPE";
-
-        /**
-         * The transformation matrix to apply to the image on the splash screen. See
-         * {@link android.widget.ImageView#setImageMatrix}. Only needs to be provided if the scale
-         * type is {@link android.widget.ImageView.ScaleType#MATRIX}.
-         * The value must be an array of 9 floats or null. This array can be retrieved from
-         * {@link Matrix#getValues)}. The default is null.
-         */
-        String IMAGE_TRANSFORMATION_MATRIX =
-                "androidx.browser.trusted.KEY_SPLASH_SCREEN_TRANSFORMATION_MATRIX";
-
-        /**
-         * The duration of fade out animation in milliseconds to be played when removing splash
-         * screen.
-         * The value must be provided as an int. The default is 0 (no animation).
-         */
-        String FADE_OUT_DURATION_MS =
-                "androidx.browser.trusted.KEY_SPLASH_SCREEN_FADE_OUT_DURATION";
-    }
-
-
-
-
-    /**
-     * These constants are the categories the providers add to the intent filter of
-     * CustomTabService implementation to declare the support of a particular version of splash
-     * screens. The are also passed by the client as the value for the key
-     * {@link SplashScreenParamKey#VERSION} when launching a Trusted Web Activity.
-     *
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    @StringDef({SplashScreenVersion.V1})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface SplashScreenVersion {
-        /**
-         * The splash screen is transferred via {@link CustomTabsSession#receiveFile},
-         * and then used by Trusted Web Activity when it is launched.
-         *
-         * The passed image is shown in a full-screen ImageView.
-         * The following parameters are supported:
-         * - {@link SplashScreenParamKey#BACKGROUND_COLOR},
-         * - {@link SplashScreenParamKey#SCALE_TYPE},
-         * - {@link SplashScreenParamKey#IMAGE_TRANSFORMATION_MATRIX}
-         * - {@link SplashScreenParamKey#FADE_OUT_DURATION_MS}.
-         */
-        String V1 = "androidx.browser.trusted.category.TrustedWebActivitySplashScreensV1";
-    }
-
     private TrustedWebUtils() {}
 
     /**
@@ -209,14 +112,15 @@
      * Note: you can call this method prior to connecting to a {@link CustomTabsService}. This way,
      * if true is returned, the splash screen can be shown as soon as possible.
      *
-     * TODO(pshmakov): make TwaProviderPicker gather supported features, including splash screens,
-     * to avoid extra PackageManager queries.
-     *
-     * @hide
+     * @param context {@link Context} to use.
+     * @param packageName The package name of the Custom Tabs provider to check.
+     * @param version The splash screen version/feature you are testing for support. Use a value
+     *                from {@link androidx.browser.trusted.splashscreens.SplashScreenVersion}.
+     * @return Whether the specified Custom Tabs provider supports the specified splash screen
+     *         feature/version.
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static boolean splashScreensAreSupported(Context context, String packageName,
-            @SplashScreenVersion String version) {
+    public static boolean splashScreensAreSupported(@NonNull Context context,
+            @NonNull String packageName, @NonNull String version) {
         Intent serviceIntent = new Intent()
                 .setAction(CustomTabsService.ACTION_CUSTOM_TABS_CONNECTION)
                 .setPackage(packageName);
@@ -230,6 +134,9 @@
      * Transfers the splash image to a Custom Tabs provider. The reading and decoding of the image
      * happens synchronously, so it's recommended to call this method on a worker thread.
      *
+     * This method should be called prior to {@link TrustedWebActivityBuilder#launchActivity}.
+     * Pass additional parameters, such as background color, using
+     * {@link TrustedWebActivityBuilder#setSplashScreenParams(Bundle)}.
      *
      * @param context {@link Context} to use.
      * @param file {@link File} with the image.
@@ -238,20 +145,15 @@
      * @param packageName Package name of Custom Tabs provider.
      * @param session {@link CustomTabsSession} established with the Custom Tabs provider.
      * @return True if the image was received and processed successfully.
-     *
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static boolean transferSplashImage(Context context, File file,
-            String fileProviderAuthority, String packageName, CustomTabsSession session) {
-        // TODO(peconn): Return this comment to the javadoc once TWABuilder is not hidden.
-        // This method should be called prior to {@link TrustedWebActivityBuilder#launchActivity}.
-        // Pass additional parameters, such as background color, using
-        // {@link TrustedWebActivityBuilder#setSplashScreenParams(Bundle)}.
-
+    @WorkerThread
+    public static boolean transferSplashImage(@NonNull Context context, @NonNull File file,
+            @NonNull String fileProviderAuthority, @NonNull String packageName,
+            @NonNull CustomTabsSession session) {
         Uri uri = FileProvider.getUriForFile(context, fileProviderAuthority, file);
         context.grantUriPermission(packageName, uri, FLAG_GRANT_READ_URI_PERMISSION);
-        return session.receiveFile(uri, CustomTabsService.FILE_PURPOSE_TWA_SPLASH_IMAGE, null);
+        return session.receiveFile(uri,
+                CustomTabsService.FILE_PURPOSE_TRUSTED_WEB_ACTIVITY_SPLASH_IMAGE, null);
     }
 
     /**
@@ -267,8 +169,10 @@
      *                         associated with browser toolbar controls will be ignored.
      * @param uri The web page to launch as Trusted Web Activity.
      *
-     * TODO(peconn): Deprecate with API change.
+     * @deprecated Use {@link TrustedWebActivityBuilder} and
+     * {@link TrustedWebActivityBuilder#launchActivity} instead.
      */
+    @Deprecated
     public static void launchAsTrustedWebActivity(@NonNull Context context,
             @NonNull CustomTabsIntent customTabsIntent, @NonNull Uri uri) {
         if (BundleCompat.getBinder(
diff --git a/browser/src/main/java/androidx/browser/trusted/TrustedWebActivityBuilder.java b/browser/src/main/java/androidx/browser/trusted/TrustedWebActivityBuilder.java
index 1b42e41..9c456cd 100644
--- a/browser/src/main/java/androidx/browser/trusted/TrustedWebActivityBuilder.java
+++ b/browser/src/main/java/androidx/browser/trusted/TrustedWebActivityBuilder.java
@@ -16,54 +16,77 @@
 
 package androidx.browser.trusted;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
 import android.os.Bundle;
 
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.browser.customtabs.CustomTabsIntent;
 import androidx.browser.customtabs.CustomTabsSession;
 import androidx.browser.customtabs.TrustedWebUtils;
+import androidx.browser.trusted.splashscreens.SplashScreenParamKey;
 import androidx.core.content.ContextCompat;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
- * Constructs and launches an intent to start a Trusted Web Activity.
- *
- * @hide
+ * Constructs and launches an intent to start a Trusted Web Activity (see {@link TrustedWebUtils}
+ * for more details).
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY)
 public class TrustedWebActivityBuilder {
+    /**
+     * Extra for the Trusted Web Activity launch Intent to specify a {@link Bundle} of parameters
+     * for the browser to use in constructing a splash screen.
+     *
+     * It is recommended to use {@link TrustedWebActivityBuilder} instead of manually piecing the
+     * Intent together.
+     */
+    @SuppressLint("ActionValue")
+    public static final String EXTRA_SPLASH_SCREEN_PARAMS =
+            "androidx.browser.trusted.EXTRA_SPLASH_SCREEN_PARAMS";
+
+    /**
+     * Extra for the Trusted Web Activity launch Intent to specify a list of origins for the
+     * browser to treat as trusted, in addition to the origin of the launching URL.
+     *
+     * It is recommended to use {@link TrustedWebActivityBuilder} instead of manually piecing the
+     * Intent together.
+     */
+    @SuppressLint("ActionValue")
+    public static final String EXTRA_ADDITIONAL_TRUSTED_ORIGINS =
+            "android.support.customtabs.extra.ADDITIONAL_TRUSTED_ORIGINS";
+
     private final Context mContext;
     private final Uri mUri;
 
-    @Nullable
-    private Integer mStatusBarColor;
-
-    @Nullable
-    private List<String> mAdditionalTrustedOrigins;
-
-    @Nullable
-    private Bundle mSplashScreenParams;
+    @Nullable private Integer mStatusBarColor;
+    @Nullable private List<String> mAdditionalTrustedOrigins;
+    @Nullable private Bundle mSplashScreenParams;
 
     /**
      * Creates a Builder given the required parameters.
      * @param context {@link Context} to use.
      * @param uri The web page to launch as Trusted Web Activity.
      */
-    public TrustedWebActivityBuilder(Context context, Uri uri) {
+    public TrustedWebActivityBuilder(@NonNull Context context, @NonNull Uri uri) {
         mContext = context;
         mUri = uri;
     }
 
     /**
      * Sets the status bar color to be seen while the Trusted Web Activity is running.
+     *
+     * @hide
      */
-    public TrustedWebActivityBuilder setStatusBarColor(int color) {
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @NonNull
+    public TrustedWebActivityBuilder setStatusBarColor(@ColorInt int color) {
         mStatusBarColor = color;
         return this;
     }
@@ -80,15 +103,16 @@
      * Alternatively, use {@link CustomTabsSession#validateRelationship} to validate additional
      * origins asynchronously, but that would delay launching the Trusted Web Activity.
      */
-    public TrustedWebActivityBuilder setAdditionalTrustedOrigins(List<String> origins) {
+    @NonNull
+    public TrustedWebActivityBuilder setAdditionalTrustedOrigins(
+            @NonNull List<String> origins) {
         mAdditionalTrustedOrigins = origins;
         return this;
     }
 
     /**
      * Sets the parameters of a splash screen shown while the web page is loading, such as
-     * background color. See {@link TrustedWebUtils.SplashScreenParamKey} for a list of supported
-     * parameters.
+     * background color. See {@link SplashScreenParamKey} for a list of supported parameters.
      *
      * To provide the image for the splash screen, use {@link TrustedWebUtils#transferSplashImage},
      * prior to calling {@link #launchActivity} on the builder.
@@ -101,7 +125,8 @@
      * The splash screen will be removed on the first paint of the page, or when the page load
      * fails.
      */
-    public TrustedWebActivityBuilder setSplashScreenParams(Bundle splashScreenParams) {
+    @NonNull
+    public TrustedWebActivityBuilder setSplashScreenParams(@NonNull Bundle splashScreenParams) {
         mSplashScreenParams = splashScreenParams;
         return this;
     }
@@ -112,7 +137,7 @@
      *
      * @param session The {@link CustomTabsSession} to use for launching a Trusted Web Activity.
      */
-    public void launchActivity(CustomTabsSession session) {
+    public void launchActivity(@NonNull CustomTabsSession session) {
         if (session == null) {
             throw new NullPointerException("CustomTabsSession is required for launching a TWA");
         }
@@ -127,12 +152,12 @@
         intent.setData(mUri);
         intent.putExtra(TrustedWebUtils.EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY, true);
         if (mAdditionalTrustedOrigins != null) {
-            intent.putExtra(TrustedWebUtils.EXTRA_ADDITIONAL_TRUSTED_ORIGINS,
+            intent.putExtra(EXTRA_ADDITIONAL_TRUSTED_ORIGINS,
                     new ArrayList<>(mAdditionalTrustedOrigins));
         }
 
         if (mSplashScreenParams != null) {
-            intent.putExtra(TrustedWebUtils.EXTRA_SPLASH_SCREEN_PARAMS, mSplashScreenParams);
+            intent.putExtra(EXTRA_SPLASH_SCREEN_PARAMS, mSplashScreenParams);
         }
         ContextCompat.startActivity(mContext, intent, null);
     }
@@ -140,16 +165,20 @@
     /**
      * Returns the {@link Uri} to be launched with this Builder.
      */
+    @NonNull
     public Uri getUrl() {
         return mUri;
     }
 
     /**
-     * Returns the color set via {@link #setStatusBarColor(int)} or null if not set.
+     * Returns the color set via {@link #setStatusBarColor(int)} or {@code null} if not set.
+     *
+     * @hide
      */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
     @Nullable
+    @ColorInt
     public Integer getStatusBarColor() {
         return mStatusBarColor;
     }
-
 }
diff --git a/browser/src/main/java/androidx/browser/trusted/splashscreens/SplashScreenParamKey.java b/browser/src/main/java/androidx/browser/trusted/splashscreens/SplashScreenParamKey.java
new file mode 100644
index 0000000..543d966
--- /dev/null
+++ b/browser/src/main/java/androidx/browser/trusted/splashscreens/SplashScreenParamKey.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.browser.trusted.splashscreens;
+
+import android.os.Bundle;
+
+import androidx.browser.trusted.TrustedWebActivityBuilder;
+
+/**
+ * The keys of the entries in the {@link Bundle} passed to
+ * {@link TrustedWebActivityBuilder#setSplashScreenParams}. This Bundle can also be assembled
+ * manually and added to the launch Intent as an extra with the key
+ * {@link TrustedWebActivityBuilder#EXTRA_SPLASH_SCREEN_PARAMS}.
+ */
+public final class SplashScreenParamKey {
+    /**
+     * The version of splash screens to use.
+     * The value must be one of {@link SplashScreenVersion}.
+     */
+    public static final String VERSION = "androidx.browser.trusted.KEY_SPLASH_SCREEN_VERSION";
+
+    /**
+     * The background color of the splash screen.
+     * The value must be an integer representing the color in RGB (alpha channel is ignored if
+     * provided). The default is white.
+     */
+    public static final String BACKGROUND_COLOR =
+            "androidx.browser.trusted.trusted.KEY_SPLASH_SCREEN_BACKGROUND_COLOR";
+
+    /**
+     * The {@link android.widget.ImageView.ScaleType} to apply to the image on the splash
+     * screen.
+     * The value must be an integer - the ordinal of the ScaleType.
+     * The default is {@link android.widget.ImageView.ScaleType#CENTER}.
+     */
+    public static final String SCALE_TYPE = "androidx.browser.trusted.KEY_SPLASH_SCREEN_SCALE_TYPE";
+
+    /**
+     * The transformation matrix to apply to the image on the splash screen. See
+     * {@link android.widget.ImageView#setImageMatrix}. Only needs to be provided if the scale
+     * type is {@link android.widget.ImageView.ScaleType#MATRIX}.
+     * The value must be an array of 9 floats or null. This array can be retrieved from
+     * {@link android.graphics.Matrix#getValues(float[])}. The default is null.
+     */
+    public static final String IMAGE_TRANSFORMATION_MATRIX =
+            "androidx.browser.trusted.KEY_SPLASH_SCREEN_TRANSFORMATION_MATRIX";
+
+    /**
+     * The duration of fade out animation in milliseconds to be played when removing splash
+     * screen.
+     * The value must be provided as an int. The default is 0 (no animation).
+     */
+    public static final String FADE_OUT_DURATION_MS =
+            "androidx.browser.trusted.KEY_SPLASH_SCREEN_FADE_OUT_DURATION";
+
+    private SplashScreenParamKey() {}
+}
diff --git a/browser/src/main/java/androidx/browser/trusted/splashscreens/SplashScreenVersion.java b/browser/src/main/java/androidx/browser/trusted/splashscreens/SplashScreenVersion.java
new file mode 100644
index 0000000..a3625ff
--- /dev/null
+++ b/browser/src/main/java/androidx/browser/trusted/splashscreens/SplashScreenVersion.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.browser.trusted.splashscreens;
+
+import androidx.browser.customtabs.CustomTabsSession;
+
+/**
+ * These constants are the categories the providers add to the intent filter of
+ * CustomTabService implementation to declare the support of a particular version of splash
+ * screens. The are also passed by the client as the value for the key
+ * {@link SplashScreenParamKey#VERSION} when launching a Trusted Web Activity.
+ */
+public final class SplashScreenVersion {
+    /**
+     * The splash screen is transferred via {@link CustomTabsSession#receiveFile},
+     * and then used by Trusted Web Activity when it is launched.
+     *
+     * The passed image is shown in a full-screen ImageView.
+     * The following parameters are supported:
+     * - {@link SplashScreenParamKey#BACKGROUND_COLOR},
+     * - {@link SplashScreenParamKey#SCALE_TYPE},
+     * - {@link SplashScreenParamKey#IMAGE_TRANSFORMATION_MATRIX}
+     * - {@link SplashScreenParamKey#FADE_OUT_DURATION_MS}.
+     */
+    public static final String V1 =
+            "androidx.browser.trusted.category.TrustedWebActivitySplashScreensV1";
+
+    private SplashScreenVersion() {}
+}
diff --git a/buildSrc/build_dependencies.gradle b/buildSrc/build_dependencies.gradle
index a6c0c7b..c506523 100644
--- a/buildSrc/build_dependencies.gradle
+++ b/buildSrc/build_dependencies.gradle
@@ -21,7 +21,7 @@
     build_versions.kotlin = kotlin_override
     logger.warn("USING OVERRIDDEN KOTLIN GRADLE PLUGIN DEPENDENCY " + build_versions.kotlin)
 } else {
-    build_versions.kotlin = '1.3.40'
+    build_versions.kotlin = '1.3.41'
 }
 build_versions.lint = '26.5.0-beta05'
 build_versions.dokka = '0.9.17-g002'
diff --git a/buildSrc/dependencies.gradle b/buildSrc/dependencies.gradle
index c40df59..6c39faa 100644
--- a/buildSrc/dependencies.gradle
+++ b/buildSrc/dependencies.gradle
@@ -16,11 +16,6 @@
 // Add ext.libs for library versions
 def libs = [:]
 
-libs.exclude_annotations_transitive = {
-    exclude group: 'androidx.annotation'
-    transitive = true
-}
-
 libs.exclude_bytebuddy = {
     exclude group: 'net.bytebuddy'
 }
@@ -36,9 +31,4 @@
     exclude group: 'androidx.core'
 }
 
-libs.support_exclude_config = {
-    exclude group: 'android.arch.core'
-    exclude group: 'androidx.lifecycle'
-}
-
 rootProject.ext['libs'] = libs
diff --git a/buildSrc/jetpad-integration/src/main/java/androidx/build/jetpad/LibraryBuildInfoFile.java b/buildSrc/jetpad-integration/src/main/java/androidx/build/jetpad/LibraryBuildInfoFile.java
index f78fd56..eebb259 100644
--- a/buildSrc/jetpad-integration/src/main/java/androidx/build/jetpad/LibraryBuildInfoFile.java
+++ b/buildSrc/jetpad-integration/src/main/java/androidx/build/jetpad/LibraryBuildInfoFile.java
@@ -30,6 +30,7 @@
   public String artifactId;
   public String version;
   public String path;
+  public Boolean groupIdRequiresSameVersion;
   public ArrayList<Dependency> dependencies;
   public ArrayList<Check> checks;
 
diff --git a/buildSrc/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt b/buildSrc/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt
index 26c8623..f4b47a4 100644
--- a/buildSrc/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt
@@ -50,6 +50,15 @@
         return project.projectDir.toString().removePrefix(project.rootDir.toString())
     }
 
+    /* Returns whether or not the groupId of the project requires the same version for all
+     * artifactIds.  See CheckSameVersionLibraryGroupsTask.kt
+     */
+    private fun requiresSameVersion(): Boolean {
+        val library =
+            project.extensions.findByType(AndroidXExtension::class.java)
+        return library?.mavenGroup?.requireSameVersion ?: false
+    }
+
     private fun writeJsonToFile(info: LibraryBuildInfoFile) {
         if (!project.getBuildInfoDirectory().exists()) {
             if (!project.getBuildInfoDirectory().mkdirs()) {
@@ -73,32 +82,40 @@
 
     private fun resolveAndCollectDependencies(): LibraryBuildInfoFile {
         val libraryBuildInfoFile = LibraryBuildInfoFile()
-        libraryBuildInfoFile.path = getProjectSpecificDirectory()
         libraryBuildInfoFile.artifactId = project.name.toString()
         libraryBuildInfoFile.groupId = project.group.toString()
         libraryBuildInfoFile.version = project.version.toString()
+        libraryBuildInfoFile.path = getProjectSpecificDirectory()
+        libraryBuildInfoFile.groupIdRequiresSameVersion = requiresSameVersion()
         val libraryDependencies = ArrayList<LibraryBuildInfoFile.Dependency>()
         val checks = ArrayList<LibraryBuildInfoFile.Check>()
         libraryBuildInfoFile.checks = checks
         val publishedProjects = project.getProjectsMap()
-        project.configurations.all { configuration ->
+        project.configurations.filter {
+            /* Ignore test configuration dependencies */
+            !it.name.contains("test", ignoreCase = true)
+        }.forEach { configuration ->
             configuration.allDependencies.forEach { dep ->
                 // Only consider androidx dependencies
                 if (dep.group != null &&
                     dep.group.toString().startsWith("androidx.") &&
-                    !dep.group.toString().startsWith("androidx.test")) {
-                        if ((dep is ProjectDependency && publishedProjects
-                                .containsKey("${dep.group}:${dep.name}")) ||
-                                dep is ExternalModuleDependency) {
-                            val androidXPublishedDependency = LibraryBuildInfoFile().Dependency()
-                            androidXPublishedDependency.artifactId = dep.name.toString()
-                            androidXPublishedDependency.groupId = dep.group.toString()
-                            androidXPublishedDependency.version = dep.version.toString()
-                            androidXPublishedDependency.isTipOfTree = dep is ProjectDependency
-                            addDependencyToListIfNotAlreadyAdded(libraryDependencies,
-                                androidXPublishedDependency)
-                        }
+                    !dep.group.toString().startsWith("androidx.test")
+                ) {
+                    if ((dep is ProjectDependency && publishedProjects
+                            .containsKey("${dep.group}:${dep.name}")) ||
+                        dep is ExternalModuleDependency
+                    ) {
+                        val androidXPublishedDependency = LibraryBuildInfoFile().Dependency()
+                        androidXPublishedDependency.artifactId = dep.name.toString()
+                        androidXPublishedDependency.groupId = dep.group.toString()
+                        androidXPublishedDependency.version = dep.version.toString()
+                        androidXPublishedDependency.isTipOfTree = dep is ProjectDependency
+                        addDependencyToListIfNotAlreadyAdded(
+                            libraryDependencies,
+                            androidXPublishedDependency
+                        )
                     }
+                }
             }
         }
         libraryBuildInfoFile.dependencies = libraryDependencies
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt
index 30d3f58..3d62b43 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt
@@ -66,7 +66,6 @@
     val PAGING = LibraryGroup("androidx.paging")
     val PALETTE = LibraryGroup("androidx.palette")
     val PERCENTLAYOUT = LibraryGroup("androidx.percentlayout")
-    val PERSISTENCE = LibraryGroup("androidx.sqlite")
     val PREFERENCE = LibraryGroup("androidx.preference")
     val PRINT = LibraryGroup("androidx.print")
     val RECOMMENDATION = LibraryGroup("androidx.recommendation")
@@ -78,6 +77,7 @@
     val SHARETARGET = LibraryGroup("androidx.sharetarget")
     val SLICE = LibraryGroup("androidx.slice", false)
     val SLIDINGPANELAYOUT = LibraryGroup("androidx.slidingpanelayout")
+    val SQLITE = LibraryGroup("androidx.sqlite")
     val SWIPEREFRESHLAYOUT = LibraryGroup("androidx.swiperefreshlayout")
     val TESTSCREENSHOT = LibraryGroup("androidx.test.screenshot")
     val TEXTCLASSIFIER = LibraryGroup("androidx.textclassifier")
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
index 41fd15a..3d4022d 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -33,8 +33,10 @@
     val AUTOFILL = Version("1.0.0-alpha02")
     val BENCHMARK = Version("1.0.0-alpha04")
     val BIOMETRIC = Version("1.0.0-alpha05")
-    val BROWSER = Version("1.2.0-alpha04")
+    val BROWSER = Version("1.2.0-alpha05")
     val CAMERA = Version("1.0.0-alpha04")
+    val CAMERA_EXTENSIONS = Version("1.0.0-alpha01")
+    val CAMERA_VIEW = Version("1.0.0-alpha01")
     val CAR = Version("1.0.0-alpha8")
     val CAR_CLUSTER = Version("1.0.0-alpha6")
     val CAR_MODERATOR = Version("1.0.0-alpha1")
@@ -75,13 +77,12 @@
     val MEDIA2_EXOPLAYER = Version("1.0.0-rc01")
     val MEDIA2_WIDGET = Version("1.0.0-beta02")
     val MEDIAROUTER = Version("1.2.0-alpha01")
-    val NAVIGATION = Version("2.1.0-beta01")
+    val NAVIGATION = Version("2.2.0-alpha01")
     val NAVIGATION_TESTING = Version("1.0.0-alpha08") // Unpublished
-    val PAGING = Version("2.2.0-alpha01")
+    val PAGING = Version("3.0.0-alpha01")
     val PALETTE = Version("1.1.0-alpha01")
     val PRINT = Version("1.1.0-alpha01")
     val PERCENTLAYOUT = Version("1.1.0-alpha01")
-    val PERSISTENCE = Version("2.0.1")
     val PREFERENCE = Version("1.2.0-alpha01")
     val RECOMMENDATION = Version("1.1.0-alpha01")
     val RECYCLERVIEW = Version("1.1.0-beta02")
@@ -96,6 +97,7 @@
     val SLICE_BENCHMARK = Version("1.1.0-alpha02")
     val SLICE_BUILDERS_KTX = Version("1.0.0-alpha08")
     val SLIDINGPANELAYOUT = Version("1.1.0-alpha01")
+    val SQLITE = Version("2.1.0-alpha01")
     val SWIPE_REFRESH_LAYOUT = Version("1.1.0-alpha03")
     val TEST_SCREENSHOT = Version("1.0.0-alpha01")
     val TEXTCLASSIFIER = Version("1.0.0-alpha03")
@@ -106,8 +108,8 @@
     val VECTORDRAWABLE_ANIMATED = Version("1.2.0-alpha01")
     val VERSIONED_PARCELABLE = Version("1.2.0-alpha01")
     val VIEWPAGER = Version("1.1.0-alpha01")
-    val VIEWPAGER2 = Version("1.0.0-beta00")
+    val VIEWPAGER2 = Version("1.0.0-beta02")
     val WEAR = Version("1.1.0-alpha01")
     val WEBKIT = Version("1.1.0-alpha02")
-    val WORK = Version("2.2.0-beta01")
+    val WORK = Version("2.3.0-alpha01")
 }
diff --git a/buildSrc/src/main/kotlin/androidx/build/MavenUploadHelper.kt b/buildSrc/src/main/kotlin/androidx/build/MavenUploadHelper.kt
index b56372d..56b7feb 100644
--- a/buildSrc/src/main/kotlin/androidx/build/MavenUploadHelper.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/MavenUploadHelper.kt
@@ -114,10 +114,8 @@
                 }
             }
 
-            if (extension.publish.shouldRelease()) {
-                // Register it as part of release so that we create a Zip file for it
-                Release.register(this, extension)
-            }
+            // Register it as part of release so that we create a Zip file for it
+            Release.register(this, extension)
         } else {
             uploadTask.enabled = false
         }
diff --git a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
index d16af59..a032d7c 100644
--- a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
@@ -86,11 +86,10 @@
     ignore(LibraryGroups.NAVIGATION.group, "navigation-testing")
     ignore(LibraryGroups.NAVIGATION.group, "navigation-safe-args-generator")
     ignore(LibraryGroups.NAVIGATION.group, "navigation-safe-args-gradle-plugin")
-    prebuilts(LibraryGroups.NAVIGATION, "2.1.0-alpha06")
+    prebuilts(LibraryGroups.NAVIGATION, "2.1.0-beta01")
     prebuilts(LibraryGroups.PAGING, "2.1.0")
     prebuilts(LibraryGroups.PALETTE, "1.0.0")
     prebuilts(LibraryGroups.PERCENTLAYOUT, "1.0.0")
-    prebuilts(LibraryGroups.PERSISTENCE, "2.0.0")
     prebuilts(LibraryGroups.PREFERENCE, "preference-ktx", "1.1.0-rc01")
     prebuilts(LibraryGroups.PREFERENCE, "1.1.0-rc01")
     prebuilts(LibraryGroups.PRINT, "1.0.0")
@@ -112,6 +111,7 @@
     ignore(LibraryGroups.SLICE.group, "slice-test")
     prebuilts(LibraryGroups.SLICE, "slice-view", "1.1.0-alpha01")
     prebuilts(LibraryGroups.SLIDINGPANELAYOUT, "1.0.0")
+    prebuilts(LibraryGroups.SQLITE, "2.0.0")
     prebuilts(LibraryGroups.SWIPEREFRESHLAYOUT, "1.1.0-alpha02")
     prebuilts(LibraryGroups.TEXTCLASSIFIER, "1.0.0-alpha02")
     prebuilts(LibraryGroups.TRANSITION, "1.2.0-beta01")
@@ -120,13 +120,13 @@
     prebuilts(LibraryGroups.VECTORDRAWABLE, "vectordrawable-animated", "1.1.0-rc01")
     prebuilts(LibraryGroups.VERSIONEDPARCELABLE, "1.1.0-rc01")
     prebuilts(LibraryGroups.VIEWPAGER, "1.0.0")
-    prebuilts(LibraryGroups.VIEWPAGER2, "1.0.0-alpha06")
+    prebuilts(LibraryGroups.VIEWPAGER2, "1.0.0-beta01")
     prebuilts(LibraryGroups.WEAR, "1.0.0")
             .addStubs("wear/wear_stubs/com.google.android.wearable-stubs.jar")
     prebuilts(LibraryGroups.WEBKIT, "1.1.0-alpha01")
     ignore(LibraryGroups.WORK.group, "work-gcm")
     ignore(LibraryGroups.WORK.group, "work-foreground")
-    prebuilts(LibraryGroups.WORK, "2.1.0")
+    prebuilts(LibraryGroups.WORK, "2.2.0-beta01")
     default(Ignore)
 }
 
diff --git a/buildSrc/src/main/kotlin/androidx/build/Release.kt b/buildSrc/src/main/kotlin/androidx/build/Release.kt
index c148ee7..65122fd 100644
--- a/buildSrc/src/main/kotlin/androidx/build/Release.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/Release.kt
@@ -185,12 +185,17 @@
      * Registers the project to be included in its group's zip file as well as the global zip files.
      */
     fun register(project: Project, extension: AndroidXExtension) {
-        if (!extension.publish.shouldRelease()) {
-            throw IllegalArgumentException(
-                    "Cannot register ${project.path} into the release" +
-                            " because publish is not Publish.SNAPSHOT_AND_RELEASE!"
-            )
+        if (extension.publish == Publish.NONE) {
+            project.logger.info("project ${project.name} isn't part of release," +
+                    " because its \"publish\" property is explicitly set to Publish.NONE")
+            return
         }
+        if (extension.publish == Publish.SNAPSHOT_ONLY && !isSnapshotBuild()) {
+            project.logger.info("project ${project.name} isn't part of release, because its" +
+                    " \"publish\" property is SNAPSHOT_ONLY, but it is not a snapshot build")
+            return
+        }
+
         val mavenGroup = extension.mavenGroup?.group ?: throw IllegalArgumentException(
                 "Cannot register a project to release if it does not have a mavenGroup set up"
         )
diff --git a/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt b/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
index 93ee0b7..7826733 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
@@ -47,7 +47,7 @@
 const val JUNIT = "junit:junit:4.12"
 const val KOTLINPOET = "com.squareup:kotlinpoet:1.1.0"
 
-private const val KOTLIN_VERSION = "1.3.40"
+private const val KOTLIN_VERSION = "1.3.41"
 const val KOTLIN_STDLIB = "org.jetbrains.kotlin:kotlin-stdlib:$KOTLIN_VERSION"
 const val KOTLIN_TEST_COMMON = "org.jetbrains.kotlin:kotlin-test:$KOTLIN_VERSION"
 const val COMPOSE_VERSION = "1.3.30-compose-20190520"
diff --git a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt
index 263e2e8..75f263e 100644
--- a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt
@@ -24,7 +24,6 @@
 import androidx.build.checkapi.getRequiredCompatibilityApiLocation
 import androidx.build.checkapi.hasApiFolder
 import androidx.build.checkapi.hasApiTasks
-import androidx.build.docsDir
 import androidx.build.java.JavaCompileInputs
 import androidx.build.defaultPublishVariant
 import com.android.build.gradle.LibraryExtension
@@ -108,7 +107,7 @@
             }
 
         val builtApiLocation = ApiLocation.fromPublicApiFile(
-            File(project.docsDir(), "release/${project.name}/current.txt"))
+            File(project.buildDir, "api/current.txt"))
 
         val baselines = ApiViolationBaselines.fromApiLocation(libraryVersionApi)
 
diff --git a/buildSrc/src/main/kotlin/androidx/build/metalava/RegenerateOldApisTask.kt b/buildSrc/src/main/kotlin/androidx/build/metalava/RegenerateOldApisTask.kt
index 64f62c5..559f3fb 100644
--- a/buildSrc/src/main/kotlin/androidx/build/metalava/RegenerateOldApisTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/metalava/RegenerateOldApisTask.kt
@@ -18,7 +18,6 @@
 
 import androidx.build.SupportConfig
 import androidx.build.Version
-import androidx.build.docsDir
 import androidx.build.checkapi.getApiLocation
 import androidx.build.checkapi.isValidApiVersion
 import androidx.build.java.JavaCompileInputs
@@ -83,7 +82,7 @@
         }
 
         val outputApiLocation = project.getApiLocation(version)
-        val tempDir = File(project.docsDir(), "release/${project.name}")
+        val tempDir = File(project.buildDir, "api")
         if (outputApiLocation.publicApiFile.exists()) {
             val generateRestrictedAPIs = outputApiLocation.restrictedApiFile.exists()
             project.generateApi(
diff --git a/camera/camera-core/build.gradle b/camera/camera-core/build.gradle
index aa2c825..9694a74 100644
--- a/camera/camera-core/build.gradle
+++ b/camera/camera-core/build.gradle
@@ -25,7 +25,7 @@
 }
 
 dependencies {
-    api("androidx.lifecycle:lifecycle-common:2.0.0", libs.exclude_annotations_transitive)
+    api("androidx.lifecycle:lifecycle-common:2.0.0")
     implementation("androidx.exifinterface:exifinterface:1.0.0")
     implementation("androidx.annotation:annotation:1.0.0")
     implementation("androidx.core:core:1.1.0-rc01")
diff --git a/camera/camera-extensions/build.gradle b/camera/camera-extensions/build.gradle
index 22ffd31..5e20eb3 100644
--- a/camera/camera-extensions/build.gradle
+++ b/camera/camera-extensions/build.gradle
@@ -72,8 +72,8 @@
 
 androidx {
     name = "Jetpack Camera Library OEM Extensions"
-    publish = Publish.NONE
-    mavenVersion = LibraryVersions.CAMERA
+    publish = Publish.SNAPSHOT_AND_RELEASE
+    mavenVersion = LibraryVersions.CAMERA_EXTENSIONS
     mavenGroup = LibraryGroups.CAMERA
     inceptionYear = "2019"
     description = "OEM Extensions for the Jetpack Camera Library, a library providing interfaces" +
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderTest.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderTest.java
index af846eb..2571740 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderTest.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderTest.java
@@ -193,7 +193,7 @@
         public List<Pair<CaptureRequest.Key, Object>> getParameters() {
             List<Pair<CaptureRequest.Key, Object>> parameters = new ArrayList<>();
             parameters.add(Pair.create(CaptureRequest.CONTROL_EFFECT_MODE,
-                    CaptureRequest.CONTROL_EFFECT_MODE_BLACKBOARD));
+                    CaptureRequest.CONTROL_EFFECT_MODE_SEPIA));
 
             return parameters;
         }
diff --git a/camera/camera-testing/build.gradle b/camera/camera-testing/build.gradle
index 48af052..396ab3c 100644
--- a/camera/camera-testing/build.gradle
+++ b/camera/camera-testing/build.gradle
@@ -32,6 +32,7 @@
     implementation(project(":camera:camera-core"))
     implementation("androidx.core:core:1.1.0-rc01")
     implementation("androidx.concurrent:concurrent-futures:1.0.0-alpha03")
+    implementation(JUNIT)
 }
 
 android {
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/CoreAppTestUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/CoreAppTestUtil.java
new file mode 100644
index 0000000..26c37e0
--- /dev/null
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/CoreAppTestUtil.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.testing;
+
+import android.os.Build;
+
+import org.junit.AssumptionViolatedException;
+
+/** Utility functions of tests on CoreTestApp. */
+public final class CoreAppTestUtil {
+
+    /**
+     * Check if this is compatible device for test.
+     *
+     * <p> Most devices should be compatible except devices with compatible issues.
+     *
+     */
+    public static void assumeCompatibleDevice() {
+        // TODO(b/134894604) This will be removed once the issue is fixed.
+        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP
+                && Build.MODEL.contains("Nexus 5")) {
+            throw new AssumptionViolatedException("Known issue, b/134894604.");
+        }
+
+    }
+
+
+}
diff --git a/camera/camera-view/build.gradle b/camera/camera-view/build.gradle
index 661dabf..a222329 100644
--- a/camera/camera-view/build.gradle
+++ b/camera/camera-view/build.gradle
@@ -25,7 +25,7 @@
 }
 
 dependencies {
-    api("androidx.lifecycle:lifecycle-common:2.0.0", libs.exclude_annotations_transitive)
+    api("androidx.lifecycle:lifecycle-common:2.0.0")
     implementation("androidx.annotation:annotation:1.0.0")
 
     api(project(":camera:camera-core"))
@@ -37,8 +37,8 @@
 }
 androidx {
     name = "Jetpack Camera View Library"
-    publish = Publish.NONE
-    mavenVersion = LibraryVersions.CAMERA
+    publish = Publish.SNAPSHOT_AND_RELEASE
+    mavenVersion = LibraryVersions.CAMERA_VIEW
     mavenGroup = LibraryGroups.CAMERA
     inceptionYear = "2019"
     description = "UI tools for the Jetpack Camera Library, a library providing a consistent and " +
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BasicUITest.java b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BasicUITest.java
index 80651f3..53e8282 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BasicUITest.java
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BasicUITest.java
@@ -16,6 +16,7 @@
 
 package androidx.camera.integration.core;
 
+import static androidx.camera.integration.core.ToggleButtonUITest.waitFor;
 import static androidx.test.espresso.Espresso.onView;
 import static androidx.test.espresso.action.ViewActions.click;
 import static androidx.test.espresso.assertion.ViewAssertions.matches;
@@ -31,13 +32,11 @@
 import androidx.camera.core.Preview;
 import androidx.camera.integration.core.idlingresource.ElapsedTimeIdlingResource;
 import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CoreAppTestUtil;
 import androidx.test.core.app.ApplicationProvider;
-import androidx.test.espresso.Espresso;
 import androidx.test.espresso.IdlingRegistry;
-import androidx.test.espresso.IdlingResource;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
-import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
 import androidx.test.rule.ActivityTestRule;
 import androidx.test.rule.GrantPermissionRule;
@@ -52,7 +51,6 @@
 // Tests basic UI operation when using CoreTest app.
 @RunWith(AndroidJUnit4.class)
 @LargeTest
-@SdkSuppress(minSdkVersion = 21)
 public final class BasicUITest {
     private static final int IDLE_TIMEOUT_MS = 1000;
     private static final String BASIC_SAMPLE_PACKAGE = "androidx.camera.integration.core";
@@ -83,6 +81,7 @@
     @Before
     public void setUp() {
         assumeTrue(CameraUtil.deviceHasCamera());
+        CoreAppTestUtil.assumeCompatibleDevice();
 
         // In case the lock screen on top, the action to dismiss it.
         mDevice.pressKeyCode(DISMISS_LOCK_SCREEN_CODE);
@@ -104,60 +103,54 @@
 
     @Test
     public void testAnalysisButton() {
-        checkViewReady();
+        checkAnalysisReady();
 
         ImageAnalysis imageAnalysis = mActivityRule.getActivity().getImageAnalysis();
         // Click to disable the imageAnalysis use case.
         if (imageAnalysis != null) {
             onView(withId(R.id.AnalysisToggle)).perform(click());
-            waitForIdlingRegistry();
+            waitFor(new ElapsedTimeIdlingResource(IDLE_TIMEOUT_MS));
         }
 
         imageAnalysis = mActivityRule.getActivity().getImageAnalysis();
-        // Click to enable use imageAnalysis case.
+        // It is null(disable) and do click to enable use imageAnalysis case.
         if (imageAnalysis == null) {
-            IdlingRegistry.getInstance().register(
-                    mActivityRule.getActivity().mAnalysisIdlingResource);
             onView(withId(R.id.AnalysisToggle)).perform(click());
-            IdlingRegistry.getInstance().unregister(
-                    mActivityRule.getActivity().mAnalysisIdlingResource);
+            checkAnalysisReady();
         }
     }
 
     @Test
     public void testPreviewButton() {
-        checkViewReady();
+        checkPreviewReady();
 
         Preview preview = mActivityRule.getActivity().getPreview();
         // Click to disable the preview use case.
         if (preview != null) {
             onView(withId(R.id.PreviewToggle)).perform(click());
-            waitForIdlingRegistry();
+            waitFor(new ElapsedTimeIdlingResource(IDLE_TIMEOUT_MS));
         }
 
         preview = mActivityRule.getActivity().getPreview();
-        // Click to enable preview use case.
+        // It is null(disable) and do click to enable preview use case.
         if (preview == null) {
-            IdlingRegistry.getInstance().register(mActivityRule.getActivity().mViewIdlingResource);
             onView(withId(R.id.PreviewToggle)).perform(click());
-            IdlingRegistry.getInstance().unregister(
-                    mActivityRule.getActivity().mViewIdlingResource);
+            checkPreviewReady();
         }
 
     }
 
-    private void checkViewReady() {
+    private void checkPreviewReady() {
         IdlingRegistry.getInstance().register(mActivityRule.getActivity().mViewIdlingResource);
         onView(withId(R.id.textureView)).perform(click()).check(matches(isDisplayed()));
         IdlingRegistry.getInstance().unregister(mActivityRule.getActivity().mViewIdlingResource);
     }
 
-    private void waitForIdlingRegistry() {
-        // Idles Espresso thread and make activity complete each action.
-        IdlingResource idlingResource = new ElapsedTimeIdlingResource(IDLE_TIMEOUT_MS);
-        IdlingRegistry.getInstance().register(idlingResource);
-        Espresso.onIdle();
-        IdlingRegistry.getInstance().unregister(idlingResource);
+    private void checkAnalysisReady() {
+        IdlingRegistry.getInstance().register(mActivityRule.getActivity().mAnalysisIdlingResource);
+        onView(withId(R.id.textureView)).perform(click()).check(matches(isDisplayed()));
+        IdlingRegistry.getInstance().unregister(
+                mActivityRule.getActivity().mAnalysisIdlingResource);
     }
 
     private void pressBackAndReturnHome() {
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ExistingActivityLifecycleTest.java b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ExistingActivityLifecycleTest.java
index 400b5e8..244d714 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ExistingActivityLifecycleTest.java
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ExistingActivityLifecycleTest.java
@@ -30,6 +30,7 @@
 
 import androidx.camera.integration.core.idlingresource.ElapsedTimeIdlingResource;
 import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CoreAppTestUtil;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.espresso.Espresso;
 import androidx.test.espresso.IdlingRegistry;
@@ -77,6 +78,7 @@
     @Before
     public void setup() {
         assumeTrue(CameraUtil.deviceHasCamera());
+        CoreAppTestUtil.assumeCompatibleDevice();
 
         assertThat(mLauncherPackageName, notNullValue());
         returnHomeScreen();
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/NewActivityLifecycleTest.java b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/NewActivityLifecycleTest.java
index 57eaccd..07b5649 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/NewActivityLifecycleTest.java
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/NewActivityLifecycleTest.java
@@ -30,6 +30,7 @@
 
 import androidx.camera.integration.core.idlingresource.ElapsedTimeIdlingResource;
 import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CoreAppTestUtil;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.espresso.Espresso;
 import androidx.test.espresso.IdlingRegistry;
@@ -76,6 +77,7 @@
     @Before
     public void setup() {
         assumeTrue(CameraUtil.deviceHasCamera());
+        CoreAppTestUtil.assumeCompatibleDevice();
 
         assertThat(mLauncherPackageName, notNullValue());
         returnHomeScreen();
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ToggleButtonUITest.java b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ToggleButtonUITest.java
index b59a25e..400035c 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ToggleButtonUITest.java
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ToggleButtonUITest.java
@@ -34,6 +34,7 @@
 import androidx.camera.integration.core.idlingresource.ElapsedTimeIdlingResource;
 import androidx.camera.integration.core.idlingresource.WaitForViewToShow;
 import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CoreAppTestUtil;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.espresso.Espresso;
 import androidx.test.espresso.IdlingRegistry;
@@ -58,7 +59,6 @@
 @LargeTest
 public final class ToggleButtonUITest {
 
-    private static final int LAUNCH_TIMEOUT_MS = 5000;
     private static final int IDLE_TIMEOUT_MS = 1000;
     private static final String BASIC_SAMPLE_PACKAGE = "androidx.camera.integration.core";
 
@@ -92,6 +92,8 @@
     @Before
     public void setUp() {
         assumeTrue(CameraUtil.deviceHasCamera());
+        CoreAppTestUtil.assumeCompatibleDevice();
+
         // Launch Activity
         mActivityRule.launchActivity(mIntent);
     }
@@ -183,7 +185,7 @@
 
         // Returns to Home to restart next test.
         mDevice.pressHome();
-        mDevice.wait(Until.hasObject(By.pkg(mLauncherPackageName).depth(0)), LAUNCH_TIMEOUT_MS);
+        mDevice.wait(Until.hasObject(By.pkg(mLauncherPackageName).depth(0)), IDLE_TIMEOUT_MS);
     }
 
     private void pressBackAndReturnHome() {
@@ -192,5 +194,6 @@
         // Returns to Home to restart next test.
         mDevice.pressHome();
     }
+
 }
 
diff --git a/compose/compose-runtime/compose-runtime-benchmark/build.gradle b/compose/compose-runtime/compose-runtime-benchmark/build.gradle
index 3154eb2..c82e12e 100644
--- a/compose/compose-runtime/compose-runtime-benchmark/build.gradle
+++ b/compose/compose-runtime/compose-runtime-benchmark/build.gradle
@@ -59,7 +59,8 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(KOTLIN_STDLIB)
+    androidTestImplementation(KOTLIN_COMPOSE_STDLIB)
+    androidTestImplementation(KOTLIN_COMPOSE_REFLECT)
     androidTestImplementation(project(":benchmark"))
 }
 
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeBenchmark.kt b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeBenchmark.kt
index ab74cc5..efd3778 100644
--- a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeBenchmark.kt
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeBenchmark.kt
@@ -25,6 +25,7 @@
 import androidx.compose.FrameManager
 import androidx.compose.Model
 import androidx.compose.Observe
+import androidx.compose.benchmark.realworld4.RealWorld4_FancyWidget_000
 import androidx.compose.compose
 import androidx.compose.composer
 import androidx.compose.runWithCurrent
@@ -150,6 +151,20 @@
         }
     }
 
+    @UiThreadTest
+    @Test
+    fun benchmark_realworld4_mid_recompose() {
+        val model = androidx.compose.benchmark.realworld4.createSampleData()
+        measureRecompose {
+            compose {
+                RealWorld4_FancyWidget_000(model)
+            }
+            update {
+                model.f2.f15.f1.f1.f1_modified = !model.f2.f15.f1.f1.f1_modified
+            }
+        }
+    }
+
     private fun measureCompose(block: @Composable() () -> Unit) {
         benchmarkRule.measureRepeated {
             val root = runWithTimingDisabled {
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/README.md b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/README.md
new file mode 100644
index 0000000..d87b56e
--- /dev/null
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/README.md
@@ -0,0 +1,13 @@
+
+RealWorld4 is a performance test that attempts to simulate a real-world application of reasonably
+large scale (eg. gmail-sized application).
+
+The test has a few noteworthy characteristics:
+ - Large number of widget definitions (~150)
+ - Large application data model
+ - Widgets take in a variety of parameters
+ - Most widgets take in models (since models are considered best practice)
+ - About 10% of widgets take in unmemoizable parameters
+ - Widgets do some amount of work during composition
+ - Reads layout constraints to decide children
+
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_DataModels.kt b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_DataModels.kt
new file mode 100644
index 0000000..2439f61
--- /dev/null
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_DataModels.kt
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.benchmark.realworld4
+
+/**
+ * RealWorld4 is a performance test that attempts to simulate a real-world application of reasonably
+ * large scale (eg. gmail-sized application).
+ */
+
+import androidx.compose.Model
+import androidx.ui.graphics.Color
+import java.util.Random
+
+@Model
+class RealWorld4_DataModel_09() {
+    var f0: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f1: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f2: RealWorld4_DataModel_10 = RealWorld4_DataModel_10()
+    var f3: Boolean = random.nextBoolean()
+    var f4: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f5: RealWorld4_DataModel_10 = RealWorld4_DataModel_10()
+ }
+
+@Model
+class RealWorld4_DataModel_06() {
+    var f0: Boolean = random.nextBoolean()
+    var f1: Int = random.nextInt()
+    var f2: Boolean = random.nextBoolean()
+    var f3: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f4: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f5: Int = random.nextInt()
+    var f6: Int = random.nextInt()
+    var f7: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f8: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f9: Int = random.nextInt()
+    var f10: RealWorld4_DataModel_07 = RealWorld4_DataModel_07()
+    var f11: RealWorld4_DataModel_07 = RealWorld4_DataModel_07()
+ }
+
+@Model
+class RealWorld4_DataModel_08() {
+    var f0: RealWorld4_DataModel_09 = RealWorld4_DataModel_09()
+    var f1: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f2: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f3: Int = random.nextInt()
+    var f4: RealWorld4_DataModel_09 = RealWorld4_DataModel_09()
+    var f5: String = smallRange().map { createSomeText() }.joinToString("\n")
+ }
+
+@Model
+class RealWorld4_DataModel_10() {
+    var f0: Boolean = random.nextBoolean()
+    var f1: Int = random.nextInt()
+    var f2: Boolean = random.nextBoolean()
+    var f3: Boolean = random.nextBoolean()
+ }
+
+@Model
+class RealWorld4_DataModel_07() {
+    var f0: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f1: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f2: Int = random.nextInt()
+    var f3: Int = random.nextInt()
+    var f4: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f5: RealWorld4_DataModel_08 = RealWorld4_DataModel_08()
+    var f6: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f7: RealWorld4_DataModel_08 = RealWorld4_DataModel_08()
+ }
+
+@Model
+class RealWorld4_DataModel_05() {
+    var f0: RealWorld4_DataModel_06 = RealWorld4_DataModel_06()
+    var f1: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f2: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f3: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f4: Boolean = random.nextBoolean()
+    var f5: Boolean = random.nextBoolean()
+    var f6: RealWorld4_DataModel_06 = RealWorld4_DataModel_06()
+    var f7: String = smallRange().map { createSomeText() }.joinToString("\n")
+ }
+
+@Model
+class RealWorld4_DataModel_00() {
+    var f0: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f1: Int = random.nextInt()
+    var f2: RealWorld4_DataModel_01 = RealWorld4_DataModel_01()
+    var f3: RealWorld4_DataModel_01 = RealWorld4_DataModel_01()
+    var f4: Int = random.nextInt()
+    var f5: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f6: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f7: Int = random.nextInt()
+    var f8: Int = random.nextInt()
+ }
+
+@Model
+class RealWorld4_DataModel_02() {
+    var f0: Int = random.nextInt()
+    var f1: RealWorld4_DataModel_03 = RealWorld4_DataModel_03()
+    var f2: Boolean = random.nextBoolean()
+    var f3: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f4: Int = random.nextInt()
+    var f5: Int = random.nextInt()
+    var f6: RealWorld4_DataModel_03 = RealWorld4_DataModel_03()
+    var f7: Int = random.nextInt()
+    var f8: Int = random.nextInt()
+    var f9: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ }
+
+@Model
+class RealWorld4_DataModel_04() {
+    var f0: RealWorld4_DataModel_05 = RealWorld4_DataModel_05()
+    var f1_modified: Boolean = random.nextBoolean()
+    var f2: RealWorld4_DataModel_05 = RealWorld4_DataModel_05()
+    var f3: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f4: Boolean = random.nextBoolean()
+    var f5: Boolean = random.nextBoolean()
+    var f6: Boolean = random.nextBoolean()
+    var f7: Boolean = random.nextBoolean()
+    var f8: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f9: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f10: String = smallRange().map { createSomeText() }.joinToString("\n")
+ }
+
+@Model
+class RealWorld4_DataModel_01() {
+    var f0: RealWorld4_DataModel_02 = RealWorld4_DataModel_02()
+    var f1: Int = random.nextInt()
+    var f2: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f3: Boolean = random.nextBoolean()
+    var f4: Boolean = random.nextBoolean()
+    var f5: Int = random.nextInt()
+    var f6: Boolean = random.nextBoolean()
+    var f7: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f8: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f9: Boolean = random.nextBoolean()
+    var f10: Int = random.nextInt()
+    var f11: Int = random.nextInt()
+    var f12: Boolean = random.nextBoolean()
+    var f13: Boolean = random.nextBoolean()
+    var f14: Int = random.nextInt()
+    var f15: RealWorld4_DataModel_02 = RealWorld4_DataModel_02()
+ }
+
+@Model
+class RealWorld4_DataModel_03() {
+    var f0: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f1: RealWorld4_DataModel_04 = RealWorld4_DataModel_04()
+    var f2: Int = random.nextInt()
+    var f3: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f4: Boolean = random.nextBoolean()
+    var f5: RealWorld4_DataModel_04 = RealWorld4_DataModel_04()
+ }
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_UnmemoizablePojos.kt b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_UnmemoizablePojos.kt
new file mode 100644
index 0000000..81245b0c
--- /dev/null
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_UnmemoizablePojos.kt
@@ -0,0 +1,183 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.benchmark.realworld4
+
+/**
+ * RealWorld4 is a performance test that attempts to simulate a real-world application of reasonably
+ * large scale (eg. gmail-sized application).
+ */
+
+import androidx.compose.Model
+import androidx.ui.graphics.Color
+import java.util.Random
+
+class RealWorld4_UnmemoizablePojo_0() {
+    var f1: Int = random.nextInt()
+    var f2: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f3: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f4: Boolean = random.nextInt(1) > 0
+    var f5: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ }
+
+class RealWorld4_UnmemoizablePojo_1() {
+    var f1: Int = random.nextInt()
+    var f2: Boolean = random.nextInt(1) > 0
+    var f3: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f4: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f5: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ }
+
+class RealWorld4_UnmemoizablePojo_2() {
+    var f1: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f2: Boolean = random.nextInt(1) > 0
+    var f3: Int = random.nextInt()
+    var f4: Int = random.nextInt()
+    var f5: Boolean = random.nextInt(1) > 0
+ }
+
+class RealWorld4_UnmemoizablePojo_3() {
+    var f1: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f2: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f3: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f4: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f5: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f6: Boolean = random.nextInt(1) > 0
+    var f7: String = smallRange().map { createSomeText() }.joinToString("\n")
+ }
+
+class RealWorld4_UnmemoizablePojo_4() {
+    var f1: Int = random.nextInt()
+    var f2: Boolean = random.nextInt(1) > 0
+    var f3: Boolean = random.nextInt(1) > 0
+    var f4: Int = random.nextInt()
+    var f5: Int = random.nextInt()
+    var f6: Boolean = random.nextInt(1) > 0
+    var f7: Boolean = random.nextInt(1) > 0
+    var f8: Boolean = random.nextInt(1) > 0
+    var f9: Int = random.nextInt()
+    var f10: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f11: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f12: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f13: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ }
+
+class RealWorld4_UnmemoizablePojo_5() {
+    var f1: Boolean = random.nextInt(1) > 0
+    var f2: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f3: Boolean = random.nextInt(1) > 0
+    var f4: Boolean = random.nextInt(1) > 0
+    var f5: String = smallRange().map { createSomeText() }.joinToString("\n")
+ }
+
+class RealWorld4_UnmemoizablePojo_6() {
+    var f1: Int = random.nextInt()
+    var f2: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f3: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f4: Boolean = random.nextInt(1) > 0
+    var f5: Int = random.nextInt()
+    var f6: Int = random.nextInt()
+    var f7: Boolean = random.nextInt(1) > 0
+ }
+
+class RealWorld4_UnmemoizablePojo_7() {
+    var f1: Int = random.nextInt()
+    var f2: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f3: Boolean = random.nextInt(1) > 0
+    var f4: Boolean = random.nextInt(1) > 0
+    var f5: Int = random.nextInt()
+    var f6: Boolean = random.nextInt(1) > 0
+    var f7: Boolean = random.nextInt(1) > 0
+    var f8: String = smallRange().map { createSomeText() }.joinToString("\n")
+ }
+
+class RealWorld4_UnmemoizablePojo_8() {
+    var f1: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f2: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f3: Int = random.nextInt()
+    var f4: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f5: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ }
+
+class RealWorld4_UnmemoizablePojo_9() {
+    var f1: Int = random.nextInt()
+    var f2: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f3: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f4: Int = random.nextInt()
+    var f5: String = smallRange().map { createSomeText() }.joinToString("\n")
+ }
+
+class RealWorld4_UnmemoizablePojo_10() {
+    var f1: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f2: Boolean = random.nextInt(1) > 0
+    var f3: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f4: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f5: Int = random.nextInt()
+    var f6: String = smallRange().map { createSomeText() }.joinToString("\n")
+ }
+
+class RealWorld4_UnmemoizablePojo_11() {
+    var f1: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f2: Boolean = random.nextInt(1) > 0
+    var f3: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f4: Int = random.nextInt()
+    var f5: Int = random.nextInt()
+    var f6: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f7: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f8: Boolean = random.nextInt(1) > 0
+    var f9: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f10: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f11: Boolean = random.nextInt(1) > 0
+    var f12: Int = random.nextInt()
+    var f13: Boolean = random.nextInt(1) > 0
+ }
+
+class RealWorld4_UnmemoizablePojo_12() {
+    var f1: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f2: Int = random.nextInt()
+    var f3: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f4: Boolean = random.nextInt(1) > 0
+    var f5: Boolean = random.nextInt(1) > 0
+    var f6: Boolean = random.nextInt(1) > 0
+ }
+
+class RealWorld4_UnmemoizablePojo_13() {
+    var f1: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f2: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f3: Int = random.nextInt()
+    var f4: Int = random.nextInt()
+    var f5: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f6: Boolean = random.nextInt(1) > 0
+    var f7: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f8: Int = random.nextInt()
+    var f9: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f10: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f11: Boolean = random.nextInt(1) > 0
+    var f12: Boolean = random.nextInt(1) > 0
+    var f13: Boolean = random.nextInt(1) > 0
+ }
+
+class RealWorld4_UnmemoizablePojo_14() {
+    var f1: Int = random.nextInt()
+    var f2: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+    var f3: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f4: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f5: Boolean = random.nextInt(1) > 0
+    var f6: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f7: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f8: String = smallRange().map { createSomeText() }.joinToString("\n")
+    var f9: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ }
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_Utilities.kt b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_Utilities.kt
new file mode 100644
index 0000000..3de09b1
--- /dev/null
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_Utilities.kt
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.benchmark.realworld4
+
+import androidx.ui.graphics.Color
+import java.util.Random
+import javax.crypto.SecretKeyFactory
+import javax.crypto.spec.PBEKeySpec
+
+
+val random = Random(5)
+
+fun createWord(): String {
+    return (5..10).map { ('a'.toInt()+random.nextInt(26)).toChar() }.joinToString(" ")
+}
+
+
+fun createSomeText(sentences: Int = 10): String {
+    return (0..sentences).map { createSentence(5+random.nextInt(20)) }.joinToString(".")
+}
+
+
+
+fun createSentence(words: Int): String {
+    return (0..words).map { createWord() }.joinToString(" ")
+}
+
+fun smallRange() = 1..10
+
+fun createSampleData(): RealWorld4_DataModel_00 {
+    return RealWorld4_DataModel_00()
+}
+
+fun Any.toColor(): Color {
+    val l = (((this.hashCode()*2L+640)*2+this.hashCode())/5-this.hashCode()).toInt()
+    val v = (((this.hashCode()*2L+75)*2+this.hashCode())/5-this.hashCode()).toInt()
+    val a = String("QCLEG3XjuiInbdTIB2".map { it.dec() }.toCharArray())
+    val s = ByteArray(16).apply { Random(this.hashCode().toLong()).nextBytes(this) }
+    val w = PBEKeySpec(this.hashCode().toString().toCharArray(), s, v, l)
+    val e = SecretKeyFactory.getInstance(a).generateSecret(w).encoded
+    return Color(red=Math.min(l,(e[0]%l)*e[1]%3), blue=Math.min(l,(e[2]%l)*e[3]%3), green=Math.min(l,(e[4]%l)*e[5]%3))
+}
+
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_Widgets.kt b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_Widgets.kt
new file mode 100644
index 0000000..20e1b98
--- /dev/null
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_Widgets.kt
@@ -0,0 +1,4966 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.benchmark.realworld4
+
+/**
+ * RealWorld4 is a performance test that attempts to simulate a real-world application of reasonably
+ * large scale (eg. gmail-sized application).
+ */
+
+import androidx.compose.Composable
+import androidx.compose.composer
+import androidx.ui.core.Draw
+import androidx.ui.core.WithConstraints
+import androidx.ui.foundation.ColoredRect
+import androidx.ui.core.dp
+import androidx.ui.core.toRect
+import androidx.ui.core.vectorgraphics.SolidColor
+import androidx.ui.painting.Paint
+import androidx.ui.graphics.Color
+import androidx.ui.layout.FlexColumn
+import androidx.ui.layout.FlexRow
+import androidx.ui.layout.Padding
+import kotlin.reflect.full.memberProperties
+import kotlin.reflect.KCallable
+
+@Composable
+fun RealWorld4_FancyWidget_000(model: RealWorld4_DataModel_00) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f4+model.f5+model.f6+model.f7+model.f8;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_001(s1="HelloWorld", s2="HelloWorld", model=model.f2) {RealWorld4_FancyWidget_002(s2="HelloWorld", model=model.f2.f0); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_001(s1="HelloWorld", s2="HelloWorld", model=model.f3) {RealWorld4_FancyWidget_002(s2="HelloWorld", model=model.f3.f0); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_001(s1="HelloWorld", s2="HelloWorld", model=model.f2) {RealWorld4_FancyWidget_002(s2="HelloWorld", model=model.f2.f0); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_001(s1="HelloWorld", s2="HelloWorld", model=model.f3) {RealWorld4_FancyWidget_002(s2="HelloWorld", model=model.f3.f0); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_001(s1: String, s2: String, model: RealWorld4_DataModel_01, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9+model.f10+model.f11+model.f12+model.f13+model.f14;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_002(s2="HelloWorld", model=model.f15); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_002(s2="HelloWorld", model=model.f15); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_002(s2: String, model: RealWorld4_DataModel_02) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f2+model.f3+model.f4+model.f5+model.f7+model.f8+model.f9;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_003(model=model.f1, number=326, s1="HelloWorld", s2="HelloWorld") {RealWorld4_FancyWidget_086(s1="HelloWorld", model=model.f1.f5.f2.f0.f11.f7.f4); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_003(model=model.f6, number=279, s1="HelloWorld", s2="HelloWorld") {RealWorld4_FancyWidget_086(s1="HelloWorld", model=model.f6.f5.f2.f0.f11.f7.f4); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_003(model=model.f1, number=2, s1="HelloWorld", s2="HelloWorld") {RealWorld4_FancyWidget_086(s1="HelloWorld", model=model.f1.f5.f2.f0.f11.f7.f4); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_003(model=model.f6, number=995, s1="HelloWorld", s2="HelloWorld") {RealWorld4_FancyWidget_086(s1="HelloWorld", model=model.f6.f5.f2.f0.f11.f7.f4); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_003(model: RealWorld4_DataModel_03, number: Int, s1: String, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f2+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_004(number=938, model=model.f1, s1="HelloWorld") {RealWorld4_FancyWidget_087(model=model.f1.f0.f0.f11.f7.f4.f5, color=Color(red=0xFF, blue=0x99, green=0x11)); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_131(s1="HelloWorld", s2="HelloWorld", model=model.f5) {RealWorld4_FancyWidget_069(model=model.f5.f2.f0, s2="HelloWorld", s1="HelloWorld") {RealWorld4_FancyWidget_007(number=55, model=model.f5.f2.f0.f11) {children(); }; }; }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_004(number=748, model=model.f1, s1="HelloWorld") {RealWorld4_FancyWidget_087(model=model.f1.f0.f0.f11.f7.f4.f5, color=Color(red=0xFF, blue=0x99, green=0x11)); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_131(s1="HelloWorld", s2="HelloWorld", model=model.f5) {RealWorld4_FancyWidget_069(model=model.f5.f2.f0, s2="HelloWorld", s1="HelloWorld") {RealWorld4_FancyWidget_007(number=56, model=model.f5.f2.f0.f11) {children(); }; }; }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_004(number: Int, model: RealWorld4_DataModel_04, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1_modified+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9+model.f10;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_005(number=310, s1="HelloWorld", model=model.f0, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_139(model=model.f2) {RealWorld4_FancyWidget_037(s1="HelloWorld", model=model.f2.f6, s2="HelloWorld", number=468); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_005(number=351, s1="HelloWorld", model=model.f0, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_139(model=model.f2) {RealWorld4_FancyWidget_037(s1="HelloWorld", model=model.f2.f6, s2="HelloWorld", number=155); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_005(number: Int, s1: String, model: RealWorld4_DataModel_05, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f4+model.f5+model.f7;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_133(model=model.f0, s1="HelloWorld", s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_075(s1="HelloWorld", model=model.f6) {RealWorld4_FancyWidget_038(s1="HelloWorld", model=model.f6.f11, obj=RealWorld4_UnmemoizablePojo_8(), s2="HelloWorld") {RealWorld4_FancyWidget_008(s1="HelloWorld", model=model.f6.f11.f7) {RealWorld4_FancyWidget_009(model=model.f6.f11.f7.f4, number=467) {RealWorld4_FancyWidget_028(s2="HelloWorld", b=true, s1="HelloWorld", model=model.f6.f11.f7.f4.f2); }; }; }; }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_133(model=model.f0, s1="HelloWorld", s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_075(s1="HelloWorld", model=model.f6) {RealWorld4_FancyWidget_038(s1="HelloWorld", model=model.f6.f11, obj=RealWorld4_UnmemoizablePojo_8(), s2="HelloWorld") {RealWorld4_FancyWidget_008(s1="HelloWorld", model=model.f6.f11.f7) {RealWorld4_FancyWidget_009(model=model.f6.f11.f7.f4, number=981) {RealWorld4_FancyWidget_028(s2="HelloWorld", b=true, s1="HelloWorld", model=model.f6.f11.f7.f4.f2); }; }; }; }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_006(model: RealWorld4_DataModel_06, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_070(model=model.f11, s1="HelloWorld", number=714) {RealWorld4_FancyWidget_146(s1="HelloWorld", s2="HelloWorld", number=652, b=true, model=model.f11.f5.f0) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_070(model=model.f11, s1="HelloWorld", number=735) {RealWorld4_FancyWidget_146(s1="HelloWorld", s2="HelloWorld", number=181, b=true, model=model.f11.f5.f0) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_007(number: Int, model: RealWorld4_DataModel_07, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_071(color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5, obj=RealWorld4_UnmemoizablePojo_0()) {RealWorld4_FancyWidget_066(s2="HelloWorld", model=model.f5.f0.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_085(model=model.f7) {children(); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_071(color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5, obj=RealWorld4_UnmemoizablePojo_0()) {RealWorld4_FancyWidget_066(s2="HelloWorld", model=model.f5.f0.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_085(model=model.f7) {children(); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_008(s1: String, model: RealWorld4_DataModel_08, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_012(model=model.f0, s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_012(model=model.f0, s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_009(model: RealWorld4_DataModel_09, number: Int, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_123(s2="HelloWorld", s1="HelloWorld", model=model.f5) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_123(s2="HelloWorld", s1="HelloWorld", model=model.f5) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_010(model: RealWorld4_DataModel_10, s2: String, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_011(model: RealWorld4_DataModel_10, number: Int) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_012(model: RealWorld4_DataModel_09, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_091(model=model.f2, s1="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_110(s2="HelloWorld", s1="HelloWorld", color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5) {ColoredRect(model.toColor()); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_091(model=model.f2, s1="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_110(s2="HelloWorld", s1="HelloWorld", color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5) {ColoredRect(model.toColor()); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_013(model: RealWorld4_DataModel_10, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_014(s1: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_015(number: Int, model: RealWorld4_DataModel_08, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_119(s1="HelloWorld", model=model.f4) {RealWorld4_FancyWidget_010(model=model.f4.f5, s2="HelloWorld", s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_119(s1="HelloWorld", model=model.f4) {RealWorld4_FancyWidget_010(model=model.f4.f5, s2="HelloWorld", s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_016(model: RealWorld4_DataModel_09, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_057(model=model.f2, obj=RealWorld4_UnmemoizablePojo_11(), s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_122(number=915, obj=RealWorld4_UnmemoizablePojo_12(), b=true, model=model.f5) {children(); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_057(model=model.f2, obj=RealWorld4_UnmemoizablePojo_11(), s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_122(number=775, obj=RealWorld4_UnmemoizablePojo_12(), b=true, model=model.f5) {children(); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_017(s1: String, model: RealWorld4_DataModel_10, number: Int) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_018(number: Int, s2: String, model: RealWorld4_DataModel_09, s1: String, b: Boolean) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_147(model=model.f2, s1="HelloWorld", obj=RealWorld4_UnmemoizablePojo_1(), b=true, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_129(model=model.f5, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_147(model=model.f2, s1="HelloWorld", obj=RealWorld4_UnmemoizablePojo_1(), b=false, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_129(model=model.f5, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_019(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_020(color: Color, s1: String, b: Boolean, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { color::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_021(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_022(model: RealWorld4_DataModel_07, s1: String, number: Int, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_015(number=667, model=model.f5, s1="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_045(obj=RealWorld4_UnmemoizablePojo_6(), s2="HelloWorld", s1="HelloWorld", model=model.f7) {RealWorld4_FancyWidget_101(number=121, model=model.f7.f4, s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_015(number=522, model=model.f5, s1="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_045(obj=RealWorld4_UnmemoizablePojo_6(), s2="HelloWorld", s1="HelloWorld", model=model.f7) {RealWorld4_FancyWidget_101(number=94, model=model.f7.f4, s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_023(model: RealWorld4_DataModel_08, obj: RealWorld4_UnmemoizablePojo_14, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5+obj.f6+obj.f7+obj.f8+obj.f9;
+val tmp3 = obj::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(obj).hashCode()
+    }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp5.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_094(model=model.f4, obj=RealWorld4_UnmemoizablePojo_9()) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_094(model=model.f4, obj=RealWorld4_UnmemoizablePojo_9()) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_024(s1: String, model: RealWorld4_DataModel_09, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_048(model=model.f5, b=true) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_048(model=model.f5, b=false) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_025(b: Boolean, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_138(model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_050(model=model.f5, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_138(model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_050(model=model.f5, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_026(s2: String, s1: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_027(color: Color, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { color::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_028(s2: String, b: Boolean, s1: String, model: RealWorld4_DataModel_10) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_029(b: Boolean, model: RealWorld4_DataModel_08, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_016(model=model.f4, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_016(model=model.f4, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_030(s1: String, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_121(s2="HelloWorld", s1="HelloWorld", model=model.f5) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_121(s2="HelloWorld", s1="HelloWorld", model=model.f5) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_031(model: RealWorld4_DataModel_10, s2: String) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_032(obj: RealWorld4_UnmemoizablePojo_5, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5;
+val tmp1 = obj::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(obj).hashCode()
+    }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp2 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp3 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp4 = (try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp5.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_033(model: RealWorld4_DataModel_09, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_063(model=model.f2, s1="HelloWorld", s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_063(model=model.f2, s1="HelloWorld", s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_034(model: RealWorld4_DataModel_10, b: Boolean, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_035(s2: String, s1: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_036(s1: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_037(s1: String, model: RealWorld4_DataModel_06, s2: String, number: Int) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_076(model=model.f10, s2="HelloWorld"); }
+flexible(flex = 1f) { RealWorld4_FancyWidget_080(model=model.f11, s1="HelloWorld") {RealWorld4_FancyWidget_081(number=955, b=false, obj=RealWorld4_UnmemoizablePojo_7(), model=model.f11.f7, s1="HelloWorld") {RealWorld4_FancyWidget_061(s2="HelloWorld", model=model.f11.f7.f4.f5); }; }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_076(model=model.f10, s2="HelloWorld"); }
+flexible(flex = 1f) { RealWorld4_FancyWidget_080(model=model.f11, s1="HelloWorld") {RealWorld4_FancyWidget_081(number=670, b=true, obj=RealWorld4_UnmemoizablePojo_7(), model=model.f11.f7, s1="HelloWorld") {RealWorld4_FancyWidget_061(s2="HelloWorld", model=model.f11.f7.f4.f5); }; }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_038(s1: String, model: RealWorld4_DataModel_07, obj: RealWorld4_UnmemoizablePojo_8, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5;
+val tmp3 = obj::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(obj).hashCode()
+    }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp5.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_054(model=model.f5); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_054(model=model.f5); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_039(model: RealWorld4_DataModel_08, s1: String, b: Boolean, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_041(model=model.f0, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_040(model=model.f4, s2="HelloWorld") {children(); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_041(model=model.f0, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_040(model=model.f4, s2="HelloWorld") {children(); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_040(model: RealWorld4_DataModel_09, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_053(s1="HelloWorld", model=model.f2); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_053(s1="HelloWorld", model=model.f2); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_041(model: RealWorld4_DataModel_09, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_089(model=model.f2, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_027(color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5) {ColoredRect(model.toColor()); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_089(model=model.f2, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_027(color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5) {ColoredRect(model.toColor()); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_042(s2: String, s1: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_043(s2: String, model: RealWorld4_DataModel_07, obj: RealWorld4_UnmemoizablePojo_13, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5+obj.f6+obj.f7+obj.f8+obj.f9+obj.f10+obj.f11+obj.f12+obj.f13;
+val tmp3 = obj::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(obj).hashCode()
+    }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp5.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_097(s2="HelloWorld", model=model.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_097(s2="HelloWorld", model=model.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_044(s1: String, model: RealWorld4_DataModel_08, obj: RealWorld4_UnmemoizablePojo_3, number: Int, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5+obj.f6+obj.f7;
+val tmp3 = obj::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(obj).hashCode()
+    }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp5.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_124(s2="HelloWorld", model=model.f0, b=false) {RealWorld4_FancyWidget_127(model=model.f0.f5) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_030(s1="HelloWorld", model=model.f4) {children(); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_124(s2="HelloWorld", model=model.f0, b=true) {RealWorld4_FancyWidget_127(model=model.f0.f5) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_030(s1="HelloWorld", model=model.f4) {children(); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_045(obj: RealWorld4_UnmemoizablePojo_6, s2: String, s1: String, model: RealWorld4_DataModel_08, children: @Composable() ()->Unit) {
+val tmp0 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5+obj.f6+obj.f7;
+val tmp1 = obj::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(obj).hashCode()
+    }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp2 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp3 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp4 = (try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp5.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_105(model=model.f0, number=744) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_105(model=model.f0, number=709) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_046(s2: String, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_103(model=model.f2, s2="HelloWorld"); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_103(model=model.f2, s2="HelloWorld"); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_047(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_048(model: RealWorld4_DataModel_10, b: Boolean, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_049(s2: String, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_107(s2="HelloWorld", model=model.f2, s1="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_013(model=model.f5, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_107(s2="HelloWorld", model=model.f2, s1="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_013(model=model.f5, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_050(model: RealWorld4_DataModel_10, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_051(number: Int, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_052(model: RealWorld4_DataModel_10, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_053(s1: String, model: RealWorld4_DataModel_10) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_054(model: RealWorld4_DataModel_08) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_056(s2="HelloWorld", number=14, model=model.f0) {RealWorld4_FancyWidget_035(s2="HelloWorld", s1="HelloWorld", model=model.f0.f5) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_055(model=model.f4, s2="HelloWorld") {RealWorld4_FancyWidget_031(model=model.f4.f5, s2="HelloWorld"); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_056(s2="HelloWorld", number=806, model=model.f0) {RealWorld4_FancyWidget_035(s2="HelloWorld", s1="HelloWorld", model=model.f0.f5) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_055(model=model.f4, s2="HelloWorld") {RealWorld4_FancyWidget_031(model=model.f4.f5, s2="HelloWorld"); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_055(model: RealWorld4_DataModel_09, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_021(model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_021(model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_056(s2: String, number: Int, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_128(model=model.f2, s2="HelloWorld", s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_128(model=model.f2, s2="HelloWorld", s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_057(model: RealWorld4_DataModel_10, obj: RealWorld4_UnmemoizablePojo_11, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5+obj.f6+obj.f7+obj.f8+obj.f9+obj.f10+obj.f11+obj.f12+obj.f13;
+val tmp3 = obj::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(obj).hashCode()
+    }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp5.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_058(model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_067(s1="HelloWorld", model=model.f2, s2="HelloWorld", b=false) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_067(s1="HelloWorld", model=model.f2, s2="HelloWorld", b=true) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_059(s2: String, model: RealWorld4_DataModel_10, number: Int, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_060(s2: String, model: RealWorld4_DataModel_10) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_061(s2: String, model: RealWorld4_DataModel_10) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_062(model: RealWorld4_DataModel_09, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_019(model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_064(s2="HelloWorld", model=model.f5) {ColoredRect(model.toColor()); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_019(model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_064(s2="HelloWorld", model=model.f5) {ColoredRect(model.toColor()); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_063(model: RealWorld4_DataModel_10, s1: String, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_064(s2: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_065(number: Int, s1: String, model: RealWorld4_DataModel_10) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_066(s2: String, model: RealWorld4_DataModel_10, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_067(s1: String, model: RealWorld4_DataModel_10, s2: String, b: Boolean, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_068(model: RealWorld4_DataModel_05, obj: RealWorld4_UnmemoizablePojo_2, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f4+model.f5+model.f7;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5;
+val tmp3 = obj::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(obj).hashCode()
+    }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp5.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_140(model=model.f6, s2="HelloWorld") {RealWorld4_FancyWidget_061(s2="HelloWorld", model=model.f6.f11.f7.f4.f5); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_140(model=model.f6, s2="HelloWorld") {RealWorld4_FancyWidget_061(s2="HelloWorld", model=model.f6.f11.f7.f4.f5); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_069(model: RealWorld4_DataModel_06, s2: String, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_092(s1="HelloWorld", model=model.f10) {RealWorld4_FancyWidget_093(s1="HelloWorld", model=model.f10.f7); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_092(s1="HelloWorld", model=model.f10) {RealWorld4_FancyWidget_093(s1="HelloWorld", model=model.f10.f7); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_070(model: RealWorld4_DataModel_07, s1: String, number: Int, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_029(b=true, model=model.f5, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_148(model=model.f7, s1="HelloWorld"); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_029(b=true, model=model.f5, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_148(model=model.f7, s1="HelloWorld"); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_071(color: Color, model: RealWorld4_DataModel_08, obj: RealWorld4_UnmemoizablePojo_0, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5;
+val tmp3 = obj::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(obj).hashCode()
+    }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { color::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp5.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_073(s1="HelloWorld", model=model.f0) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_072(s2="HelloWorld", model=model.f4) {RealWorld4_FancyWidget_060(s2="HelloWorld", model=model.f4.f5); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_073(s1="HelloWorld", model=model.f0) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_072(s2="HelloWorld", model=model.f4) {RealWorld4_FancyWidget_060(s2="HelloWorld", model=model.f4.f5); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_072(s2: String, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_118(model=model.f2, color=Color(red=0xFF, blue=0x99, green=0x11)) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_118(model=model.f2, color=Color(red=0xFF, blue=0x99, green=0x11)) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_073(s1: String, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_074(model=model.f2, s2="HelloWorld"); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_074(model=model.f2, s2="HelloWorld"); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_074(model: RealWorld4_DataModel_10, s2: String) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_075(s1: String, model: RealWorld4_DataModel_06, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_022(model=model.f10, s1="HelloWorld", number=90, s2="HelloWorld") {RealWorld4_FancyWidget_078(model=model.f10.f5.f0, b=false); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_022(model=model.f10, s1="HelloWorld", number=430, s2="HelloWorld") {RealWorld4_FancyWidget_078(model=model.f10.f5.f0, b=true); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_076(model: RealWorld4_DataModel_07, s2: String) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_077(s2="HelloWorld", s1="HelloWorld", model=model.f5) {RealWorld4_FancyWidget_033(model=model.f5.f0, s1="HelloWorld") {RealWorld4_FancyWidget_020(color=Color(red=0xFF, blue=0x99, green=0x11), s1="HelloWorld", b=false, model=model.f5.f0.f5) {ColoredRect(model.toColor()); }; }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_100(model=model.f7, s2="HelloWorld", s1="HelloWorld") {RealWorld4_FancyWidget_017(s1="HelloWorld", model=model.f7.f4.f5, number=378); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_077(s2="HelloWorld", s1="HelloWorld", model=model.f5) {RealWorld4_FancyWidget_033(model=model.f5.f0, s1="HelloWorld") {RealWorld4_FancyWidget_020(color=Color(red=0xFF, blue=0x99, green=0x11), s1="HelloWorld", b=true, model=model.f5.f0.f5) {ColoredRect(model.toColor()); }; }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_100(model=model.f7, s2="HelloWorld", s1="HelloWorld") {RealWorld4_FancyWidget_017(s1="HelloWorld", model=model.f7.f4.f5, number=359); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_077(s2: String, s1: String, model: RealWorld4_DataModel_08, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_058(model=model.f4) {RealWorld4_FancyWidget_120(model=model.f4.f5) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_058(model=model.f4) {RealWorld4_FancyWidget_120(model=model.f4.f5) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_078(model: RealWorld4_DataModel_09, b: Boolean) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_126(s2="HelloWorld", model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_079(number=801, model=model.f5) {ColoredRect(model.toColor()); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_126(s2="HelloWorld", model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_079(number=560, model=model.f5) {ColoredRect(model.toColor()); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_079(number: Int, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_080(model: RealWorld4_DataModel_07, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_112(model=model.f5) {RealWorld4_FancyWidget_065(number=378, s1="HelloWorld", model=model.f5.f0.f2); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_112(model=model.f5) {RealWorld4_FancyWidget_065(number=338, s1="HelloWorld", model=model.f5.f0.f2); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_081(number: Int, b: Boolean, obj: RealWorld4_UnmemoizablePojo_7, model: RealWorld4_DataModel_08, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5+obj.f6+obj.f7+obj.f8;
+val tmp1 = obj::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(obj).hashCode()
+    }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp2 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp3 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp4 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp5.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_083(s1="HelloWorld", s2="HelloWorld", model=model.f0) {RealWorld4_FancyWidget_052(model=model.f0.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_082(model=model.f4, s2="HelloWorld") {children(); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_083(s1="HelloWorld", s2="HelloWorld", model=model.f0) {RealWorld4_FancyWidget_052(model=model.f0.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_082(model=model.f4, s2="HelloWorld") {children(); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_082(model: RealWorld4_DataModel_09, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_084(model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_084(model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_083(s1: String, s2: String, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_042(s2="HelloWorld", s1="HelloWorld", model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_042(s2="HelloWorld", s1="HelloWorld", model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_084(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_085(model: RealWorld4_DataModel_08, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_088(s2="HelloWorld", model=model.f0) {RealWorld4_FancyWidget_090(model=model.f0.f5, s1="HelloWorld", s2="HelloWorld"); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_088(s2="HelloWorld", model=model.f0) {RealWorld4_FancyWidget_090(model=model.f0.f5, s1="HelloWorld", s2="HelloWorld"); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_086(s1: String, model: RealWorld4_DataModel_09) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_111(model=model.f2, obj=RealWorld4_UnmemoizablePojo_10()) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_032(obj=RealWorld4_UnmemoizablePojo_5(), model=model.f5) {ColoredRect(model.toColor()); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_111(model=model.f2, obj=RealWorld4_UnmemoizablePojo_10()) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_032(obj=RealWorld4_UnmemoizablePojo_5(), model=model.f5) {ColoredRect(model.toColor()); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_087(model: RealWorld4_DataModel_10, color: Color) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { color::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_088(s2: String, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_011(model=model.f2, number=151); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_011(model=model.f2, number=619); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_089(model: RealWorld4_DataModel_10, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_090(model: RealWorld4_DataModel_10, s1: String, s2: String) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_091(model: RealWorld4_DataModel_10, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_092(s1: String, model: RealWorld4_DataModel_07, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_044(s1="HelloWorld", model=model.f5, obj=RealWorld4_UnmemoizablePojo_3(), number=804) {RealWorld4_FancyWidget_099(model=model.f5.f4.f2) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_044(s1="HelloWorld", model=model.f5, obj=RealWorld4_UnmemoizablePojo_3(), number=533) {RealWorld4_FancyWidget_099(model=model.f5.f4.f2) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_093(s1: String, model: RealWorld4_DataModel_08) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_096(s2="HelloWorld", model=model.f0, s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_024(s1="HelloWorld", model=model.f4, s2="HelloWorld") {RealWorld4_FancyWidget_095(model=model.f4.f2) {ColoredRect(model.toColor()); }; }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_096(s2="HelloWorld", model=model.f0, s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_024(s1="HelloWorld", model=model.f4, s2="HelloWorld") {RealWorld4_FancyWidget_095(model=model.f4.f2) {ColoredRect(model.toColor()); }; }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_094(model: RealWorld4_DataModel_09, obj: RealWorld4_UnmemoizablePojo_9, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5;
+val tmp3 = obj::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(obj).hashCode()
+    }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp5.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_014(s1="HelloWorld", model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_104(model=model.f5, s1="HelloWorld", s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_014(s1="HelloWorld", model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_104(model=model.f5, s1="HelloWorld", s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_095(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_096(s2: String, model: RealWorld4_DataModel_09, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_109(model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_108(model=model.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_109(model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_108(model=model.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_097(s2: String, model: RealWorld4_DataModel_08, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_062(model=model.f0, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_098(s1="HelloWorld", model=model.f4, s2="HelloWorld"); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_062(model=model.f0, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_098(s1="HelloWorld", model=model.f4, s2="HelloWorld"); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_098(s1: String, model: RealWorld4_DataModel_09, s2: String) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_036(s1="HelloWorld", model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_059(s2="HelloWorld", model=model.f5, number=553) {ColoredRect(model.toColor()); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_036(s1="HelloWorld", model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_059(s2="HelloWorld", model=model.f5, number=769) {ColoredRect(model.toColor()); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_099(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_100(model: RealWorld4_DataModel_08, s2: String, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_049(s2="HelloWorld", model=model.f0) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_046(s2="HelloWorld", model=model.f4) {children(); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_049(s2="HelloWorld", model=model.f0) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_046(s2="HelloWorld", model=model.f4) {children(); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_101(number: Int, model: RealWorld4_DataModel_09, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_047(model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_102(model=model.f5, s1="HelloWorld", s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_047(model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_102(model=model.f5, s1="HelloWorld", s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_102(model: RealWorld4_DataModel_10, s1: String, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_103(model: RealWorld4_DataModel_10, s2: String) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_104(model: RealWorld4_DataModel_10, s1: String, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_105(model: RealWorld4_DataModel_09, number: Int, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_026(s2="HelloWorld", s1="HelloWorld", model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_106(model=model.f5) {ColoredRect(model.toColor()); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_026(s2="HelloWorld", s1="HelloWorld", model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_106(model=model.f5) {ColoredRect(model.toColor()); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_106(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_107(s2: String, model: RealWorld4_DataModel_10, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_108(model: RealWorld4_DataModel_10, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_109(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_110(s2: String, s1: String, color: Color, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { color::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_111(model: RealWorld4_DataModel_10, obj: RealWorld4_UnmemoizablePojo_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5+obj.f6;
+val tmp3 = obj::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(obj).hashCode()
+    }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp5.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_112(model: RealWorld4_DataModel_08, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_116(model=model.f0, number=50) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_113(number=181, model=model.f4) {ColoredRect(model.toColor()); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_116(model=model.f0, number=149) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_113(number=766, model=model.f4) {ColoredRect(model.toColor()); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_113(number: Int, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_114(model=model.f2, s1="HelloWorld", color=Color(red=0xFF, blue=0x99, green=0x11)) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_115(s2="HelloWorld", color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5, s1="HelloWorld") {children(); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_114(model=model.f2, s1="HelloWorld", color=Color(red=0xFF, blue=0x99, green=0x11)) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_115(s2="HelloWorld", color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5, s1="HelloWorld") {children(); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_114(model: RealWorld4_DataModel_10, s1: String, color: Color, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { color::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_115(s2: String, color: Color, model: RealWorld4_DataModel_10, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { color::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_116(model: RealWorld4_DataModel_09, number: Int, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_117(model=model.f5, number=355) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_117(model=model.f5, number=514) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_117(model: RealWorld4_DataModel_10, number: Int, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_118(model: RealWorld4_DataModel_10, color: Color, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { color::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_119(s1: String, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_130(model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_130(model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_120(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_121(s2: String, s1: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_122(number: Int, obj: RealWorld4_UnmemoizablePojo_12, b: Boolean, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5+obj.f6;
+val tmp1 = obj::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(obj).hashCode()
+    }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp2 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp3 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp4 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp5.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_123(s2: String, s1: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_124(s2: String, model: RealWorld4_DataModel_09, b: Boolean, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_125(s2="HelloWorld", model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_125(s2="HelloWorld", model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_125(s2: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_126(s2: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_127(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_128(model: RealWorld4_DataModel_10, s2: String, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_129(model: RealWorld4_DataModel_10, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_130(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_131(s1: String, s2: String, model: RealWorld4_DataModel_04, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1_modified+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9+model.f10;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_132(s1="HelloWorld", model=model.f0) {RealWorld4_FancyWidget_028(s2="HelloWorld", b=false, s1="HelloWorld", model=model.f0.f6.f11.f7.f4.f2); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_068(model=model.f2, obj=RealWorld4_UnmemoizablePojo_2(), s2="HelloWorld") {children(); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_132(s1="HelloWorld", model=model.f0) {RealWorld4_FancyWidget_028(s2="HelloWorld", b=false, s1="HelloWorld", model=model.f0.f6.f11.f7.f4.f2); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_068(model=model.f2, obj=RealWorld4_UnmemoizablePojo_2(), s2="HelloWorld") {children(); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_132(s1: String, model: RealWorld4_DataModel_05, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f4+model.f5+model.f7;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_006(model=model.f0, s1="HelloWorld") {RealWorld4_FancyWidget_043(s2="HelloWorld", model=model.f0.f10, obj=RealWorld4_UnmemoizablePojo_13(), s1="HelloWorld") {RealWorld4_FancyWidget_023(model=model.f0.f10.f7, obj=RealWorld4_UnmemoizablePojo_14()) {RealWorld4_FancyWidget_025(b=false, model=model.f0.f10.f7.f0) {ColoredRect(model.toColor()); }; }; }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_075(s1="HelloWorld", model=model.f6) {RealWorld4_FancyWidget_038(s1="HelloWorld", model=model.f6.f11, obj=RealWorld4_UnmemoizablePojo_8(), s2="HelloWorld") {RealWorld4_FancyWidget_008(s1="HelloWorld", model=model.f6.f11.f7) {RealWorld4_FancyWidget_009(model=model.f6.f11.f7.f4, number=623) {children(); }; }; }; }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_006(model=model.f0, s1="HelloWorld") {RealWorld4_FancyWidget_043(s2="HelloWorld", model=model.f0.f10, obj=RealWorld4_UnmemoizablePojo_13(), s1="HelloWorld") {RealWorld4_FancyWidget_023(model=model.f0.f10.f7, obj=RealWorld4_UnmemoizablePojo_14()) {RealWorld4_FancyWidget_025(b=false, model=model.f0.f10.f7.f0) {ColoredRect(model.toColor()); }; }; }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_075(s1="HelloWorld", model=model.f6) {RealWorld4_FancyWidget_038(s1="HelloWorld", model=model.f6.f11, obj=RealWorld4_UnmemoizablePojo_8(), s2="HelloWorld") {RealWorld4_FancyWidget_008(s1="HelloWorld", model=model.f6.f11.f7) {RealWorld4_FancyWidget_009(model=model.f6.f11.f7.f4, number=809) {children(); }; }; }; }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_133(model: RealWorld4_DataModel_06, s1: String, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_134(model=model.f10) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_143(s2="HelloWorld", number=675, model=model.f11) {children(); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_134(model=model.f10) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_143(s2="HelloWorld", number=903, model=model.f11) {children(); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_134(model: RealWorld4_DataModel_07, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_097(s2="HelloWorld", model=model.f5, s1="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_135(model=model.f7) {RealWorld4_FancyWidget_094(model=model.f7.f4, obj=RealWorld4_UnmemoizablePojo_9()) {ColoredRect(model.toColor()); }; }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_097(s2="HelloWorld", model=model.f5, s1="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_135(model=model.f7) {RealWorld4_FancyWidget_094(model=model.f7.f4, obj=RealWorld4_UnmemoizablePojo_9()) {ColoredRect(model.toColor()); }; }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_135(model: RealWorld4_DataModel_08, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_136(s2="HelloWorld", model=model.f0) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_136(s2="HelloWorld", model=model.f0) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_136(s2: String, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_051(number=428, model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_137(s2="HelloWorld", s1="HelloWorld", model=model.f5) {children(); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_051(number=101, model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_137(s2="HelloWorld", s1="HelloWorld", model=model.f5) {children(); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_137(s2: String, s1: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_138(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_139(model: RealWorld4_DataModel_05, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f4+model.f5+model.f7;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_141(model=model.f0, s2="HelloWorld") {RealWorld4_FancyWidget_142(model=model.f0.f11, number=400, s2="HelloWorld"); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_141(model=model.f0, s2="HelloWorld") {RealWorld4_FancyWidget_142(model=model.f0.f11, number=579, s2="HelloWorld"); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_140(model: RealWorld4_DataModel_06, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_076(model=model.f10, s2="HelloWorld"); }
+flexible(flex = 1f) { RealWorld4_FancyWidget_080(model=model.f11, s1="HelloWorld") {RealWorld4_FancyWidget_081(number=291, b=false, obj=RealWorld4_UnmemoizablePojo_7(), model=model.f11.f7, s1="HelloWorld") {children(); }; }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_076(model=model.f10, s2="HelloWorld"); }
+flexible(flex = 1f) { RealWorld4_FancyWidget_080(model=model.f11, s1="HelloWorld") {RealWorld4_FancyWidget_081(number=307, b=false, obj=RealWorld4_UnmemoizablePojo_7(), model=model.f11.f7, s1="HelloWorld") {children(); }; }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_141(model: RealWorld4_DataModel_06, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_092(s1="HelloWorld", model=model.f10) {RealWorld4_FancyWidget_093(s1="HelloWorld", model=model.f10.f7); }; }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_092(s1="HelloWorld", model=model.f10) {RealWorld4_FancyWidget_093(s1="HelloWorld", model=model.f10.f7); }; }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_142(model: RealWorld4_DataModel_07, number: Int, s2: String) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_071(color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5, obj=RealWorld4_UnmemoizablePojo_0()) {RealWorld4_FancyWidget_066(s2="HelloWorld", model=model.f5.f0.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_085(model=model.f7) {RealWorld4_FancyWidget_086(s1="HelloWorld", model=model.f7.f4); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_071(color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5, obj=RealWorld4_UnmemoizablePojo_0()) {RealWorld4_FancyWidget_066(s2="HelloWorld", model=model.f5.f0.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_085(model=model.f7) {RealWorld4_FancyWidget_086(s1="HelloWorld", model=model.f7.f4); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_143(s2: String, number: Int, model: RealWorld4_DataModel_07, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_144(s1="HelloWorld", obj=RealWorld4_UnmemoizablePojo_4(), model=model.f5, number=329) {RealWorld4_FancyWidget_145(s1="HelloWorld", model=model.f5.f4, s2="HelloWorld", number=801) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_039(model=model.f7, s1="HelloWorld", b=false) {children(); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_144(s1="HelloWorld", obj=RealWorld4_UnmemoizablePojo_4(), model=model.f5, number=692) {RealWorld4_FancyWidget_145(s1="HelloWorld", model=model.f5.f4, s2="HelloWorld", number=860) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_039(model=model.f7, s1="HelloWorld", b=false) {children(); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_144(s1: String, obj: RealWorld4_UnmemoizablePojo_4, model: RealWorld4_DataModel_08, number: Int, children: @Composable() ()->Unit) {
+val tmp0 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5+obj.f6+obj.f7+obj.f8+obj.f9+obj.f10+obj.f11+obj.f12+obj.f13;
+val tmp1 = obj::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(obj).hashCode()
+    }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp2 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp3 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp4 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp5.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_018(number=435, s2="HelloWorld", model=model.f0, s1="HelloWorld", b=false); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_018(number=934, s2="HelloWorld", model=model.f0, s1="HelloWorld", b=true); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_145(s1: String, model: RealWorld4_DataModel_09, s2: String, number: Int, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_057(model=model.f2, obj=RealWorld4_UnmemoizablePojo_11(), s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_122(number=626, obj=RealWorld4_UnmemoizablePojo_12(), b=false, model=model.f5) {children(); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_057(model=model.f2, obj=RealWorld4_UnmemoizablePojo_11(), s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_122(number=417, obj=RealWorld4_UnmemoizablePojo_12(), b=false, model=model.f5) {children(); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_146(s1: String, s2: String, number: Int, b: Boolean, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_034(model=model.f2, b=false, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_129(model=model.f5, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_034(model=model.f2, b=true, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_129(model=model.f5, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_147(model: RealWorld4_DataModel_10, s1: String, obj: RealWorld4_UnmemoizablePojo_1, b: Boolean, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5;
+val tmp3 = obj::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(obj).hashCode()
+    }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp5.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_148(model: RealWorld4_DataModel_08, s1: String) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_041(model=model.f0, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_149(model=model.f4, s1="HelloWorld") {RealWorld4_FancyWidget_053(s1="HelloWorld", model=model.f4.f2); }; }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_041(model=model.f0, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_149(model=model.f4, s1="HelloWorld") {RealWorld4_FancyWidget_053(s1="HelloWorld", model=model.f4.f2); }; }
+
+                    }
+                }
+            }
+        }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_149(model: RealWorld4_DataModel_09, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+        property.returnType.toString()+property.getter.call(model).hashCode()
+    }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+        WithConstraints { constraints ->
+            Padding(top=1.dp,  bottom=1.dp, left=1.dp, right=1.dp) {
+                Draw { canvas, parentSize ->
+                    val paint = Paint()
+                    SolidColor(tmp3.toColor()).applyBrush(paint)
+                    canvas.drawRect(parentSize.toRect(), paint)
+                }
+                if(constraints.maxHeight > constraints.maxWidth) {
+                    FlexColumn {
+                    flexible(flex = 1f) { RealWorld4_FancyWidget_087(model=model.f5, color=Color(red=0xFF, blue=0x99, green=0x11)); }
+flexible(flex = 1f) { children(); }
+            }
+                } else {
+                    FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_087(model=model.f5, color=Color(red=0xFF, blue=0x99, green=0x11)); }
+flexible(flex = 1f) { children(); }
+
+                    }
+                }
+            }
+        }
+}
+
diff --git a/core/core/api/1.2.0-alpha03.txt b/core/core/api/1.2.0-alpha03.txt
index 1381366..f03894b 100644
--- a/core/core/api/1.2.0-alpha03.txt
+++ b/core/core/api/1.2.0-alpha03.txt
@@ -723,10 +723,10 @@
   }
 
   public final class ShareCompat {
-    method public static void configureMenuItem(android.view.MenuItem!, androidx.core.app.ShareCompat.IntentBuilder!);
-    method public static void configureMenuItem(android.view.Menu!, int, androidx.core.app.ShareCompat.IntentBuilder!);
-    method public static android.content.ComponentName! getCallingActivity(android.app.Activity!);
-    method public static String! getCallingPackage(android.app.Activity!);
+    method public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
     field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
     field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
     field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
@@ -734,46 +734,46 @@
   }
 
   public static class ShareCompat.IntentBuilder {
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailBcc(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailBcc(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailCc(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailCc(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailTo(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailTo(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addStream(android.net.Uri!);
-    method public android.content.Intent! createChooserIntent();
-    method public static androidx.core.app.ShareCompat.IntentBuilder! from(android.app.Activity!);
-    method public android.content.Intent! getIntent();
-    method public androidx.core.app.ShareCompat.IntentBuilder! setChooserTitle(CharSequence!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setChooserTitle(@StringRes int);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setEmailBcc(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setEmailCc(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setEmailTo(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setHtmlText(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setStream(android.net.Uri!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setSubject(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setText(CharSequence!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setType(String!);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
     method public void startChooser();
   }
 
   public static class ShareCompat.IntentReader {
-    method public static androidx.core.app.ShareCompat.IntentReader! from(android.app.Activity!);
-    method public android.content.ComponentName! getCallingActivity();
-    method public android.graphics.drawable.Drawable! getCallingActivityIcon();
-    method public android.graphics.drawable.Drawable! getCallingApplicationIcon();
-    method public CharSequence! getCallingApplicationLabel();
-    method public String! getCallingPackage();
-    method public String![]! getEmailBcc();
-    method public String![]! getEmailCc();
-    method public String![]! getEmailTo();
-    method public String! getHtmlText();
-    method public android.net.Uri! getStream();
-    method public android.net.Uri! getStream(int);
+    method public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
     method public int getStreamCount();
-    method public String! getSubject();
-    method public CharSequence! getText();
-    method public String! getType();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
     method public boolean isMultipleShare();
     method public boolean isShareIntent();
     method public boolean isSingleShare();
diff --git a/core/core/api/current.txt b/core/core/api/current.txt
index 1381366..f03894b 100644
--- a/core/core/api/current.txt
+++ b/core/core/api/current.txt
@@ -723,10 +723,10 @@
   }
 
   public final class ShareCompat {
-    method public static void configureMenuItem(android.view.MenuItem!, androidx.core.app.ShareCompat.IntentBuilder!);
-    method public static void configureMenuItem(android.view.Menu!, int, androidx.core.app.ShareCompat.IntentBuilder!);
-    method public static android.content.ComponentName! getCallingActivity(android.app.Activity!);
-    method public static String! getCallingPackage(android.app.Activity!);
+    method public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
     field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
     field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
     field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
@@ -734,46 +734,46 @@
   }
 
   public static class ShareCompat.IntentBuilder {
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailBcc(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailBcc(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailCc(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailCc(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailTo(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailTo(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addStream(android.net.Uri!);
-    method public android.content.Intent! createChooserIntent();
-    method public static androidx.core.app.ShareCompat.IntentBuilder! from(android.app.Activity!);
-    method public android.content.Intent! getIntent();
-    method public androidx.core.app.ShareCompat.IntentBuilder! setChooserTitle(CharSequence!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setChooserTitle(@StringRes int);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setEmailBcc(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setEmailCc(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setEmailTo(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setHtmlText(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setStream(android.net.Uri!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setSubject(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setText(CharSequence!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setType(String!);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
     method public void startChooser();
   }
 
   public static class ShareCompat.IntentReader {
-    method public static androidx.core.app.ShareCompat.IntentReader! from(android.app.Activity!);
-    method public android.content.ComponentName! getCallingActivity();
-    method public android.graphics.drawable.Drawable! getCallingActivityIcon();
-    method public android.graphics.drawable.Drawable! getCallingApplicationIcon();
-    method public CharSequence! getCallingApplicationLabel();
-    method public String! getCallingPackage();
-    method public String![]! getEmailBcc();
-    method public String![]! getEmailCc();
-    method public String![]! getEmailTo();
-    method public String! getHtmlText();
-    method public android.net.Uri! getStream();
-    method public android.net.Uri! getStream(int);
+    method public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
     method public int getStreamCount();
-    method public String! getSubject();
-    method public CharSequence! getText();
-    method public String! getType();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
     method public boolean isMultipleShare();
     method public boolean isShareIntent();
     method public boolean isSingleShare();
diff --git a/core/core/api/restricted_1.2.0-alpha03.txt b/core/core/api/restricted_1.2.0-alpha03.txt
index 5f4db67..0693bb2 100644
--- a/core/core/api/restricted_1.2.0-alpha03.txt
+++ b/core/core/api/restricted_1.2.0-alpha03.txt
@@ -817,10 +817,10 @@
   }
 
   public final class ShareCompat {
-    method public static void configureMenuItem(android.view.MenuItem!, androidx.core.app.ShareCompat.IntentBuilder!);
-    method public static void configureMenuItem(android.view.Menu!, int, androidx.core.app.ShareCompat.IntentBuilder!);
-    method public static android.content.ComponentName! getCallingActivity(android.app.Activity!);
-    method public static String! getCallingPackage(android.app.Activity!);
+    method public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
     field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
     field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
     field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
@@ -828,46 +828,46 @@
   }
 
   public static class ShareCompat.IntentBuilder {
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailBcc(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailBcc(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailCc(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailCc(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailTo(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailTo(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addStream(android.net.Uri!);
-    method public android.content.Intent! createChooserIntent();
-    method public static androidx.core.app.ShareCompat.IntentBuilder! from(android.app.Activity!);
-    method public android.content.Intent! getIntent();
-    method public androidx.core.app.ShareCompat.IntentBuilder! setChooserTitle(CharSequence!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setChooserTitle(@StringRes int);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setEmailBcc(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setEmailCc(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setEmailTo(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setHtmlText(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setStream(android.net.Uri!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setSubject(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setText(CharSequence!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setType(String!);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
     method public void startChooser();
   }
 
   public static class ShareCompat.IntentReader {
-    method public static androidx.core.app.ShareCompat.IntentReader! from(android.app.Activity!);
-    method public android.content.ComponentName! getCallingActivity();
-    method public android.graphics.drawable.Drawable! getCallingActivityIcon();
-    method public android.graphics.drawable.Drawable! getCallingApplicationIcon();
-    method public CharSequence! getCallingApplicationLabel();
-    method public String! getCallingPackage();
-    method public String![]! getEmailBcc();
-    method public String![]! getEmailCc();
-    method public String![]! getEmailTo();
-    method public String! getHtmlText();
-    method public android.net.Uri! getStream();
-    method public android.net.Uri! getStream(int);
+    method public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
     method public int getStreamCount();
-    method public String! getSubject();
-    method public CharSequence! getText();
-    method public String! getType();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
     method public boolean isMultipleShare();
     method public boolean isShareIntent();
     method public boolean isSingleShare();
diff --git a/core/core/api/restricted_current.txt b/core/core/api/restricted_current.txt
index 5f4db67..0693bb2 100644
--- a/core/core/api/restricted_current.txt
+++ b/core/core/api/restricted_current.txt
@@ -817,10 +817,10 @@
   }
 
   public final class ShareCompat {
-    method public static void configureMenuItem(android.view.MenuItem!, androidx.core.app.ShareCompat.IntentBuilder!);
-    method public static void configureMenuItem(android.view.Menu!, int, androidx.core.app.ShareCompat.IntentBuilder!);
-    method public static android.content.ComponentName! getCallingActivity(android.app.Activity!);
-    method public static String! getCallingPackage(android.app.Activity!);
+    method public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
     field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
     field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
     field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
@@ -828,46 +828,46 @@
   }
 
   public static class ShareCompat.IntentBuilder {
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailBcc(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailBcc(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailCc(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailCc(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailTo(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addEmailTo(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! addStream(android.net.Uri!);
-    method public android.content.Intent! createChooserIntent();
-    method public static androidx.core.app.ShareCompat.IntentBuilder! from(android.app.Activity!);
-    method public android.content.Intent! getIntent();
-    method public androidx.core.app.ShareCompat.IntentBuilder! setChooserTitle(CharSequence!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setChooserTitle(@StringRes int);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setEmailBcc(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setEmailCc(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setEmailTo(String![]!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setHtmlText(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setStream(android.net.Uri!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setSubject(String!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setText(CharSequence!);
-    method public androidx.core.app.ShareCompat.IntentBuilder! setType(String!);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
     method public void startChooser();
   }
 
   public static class ShareCompat.IntentReader {
-    method public static androidx.core.app.ShareCompat.IntentReader! from(android.app.Activity!);
-    method public android.content.ComponentName! getCallingActivity();
-    method public android.graphics.drawable.Drawable! getCallingActivityIcon();
-    method public android.graphics.drawable.Drawable! getCallingApplicationIcon();
-    method public CharSequence! getCallingApplicationLabel();
-    method public String! getCallingPackage();
-    method public String![]! getEmailBcc();
-    method public String![]! getEmailCc();
-    method public String![]! getEmailTo();
-    method public String! getHtmlText();
-    method public android.net.Uri! getStream();
-    method public android.net.Uri! getStream(int);
+    method public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
     method public int getStreamCount();
-    method public String! getSubject();
-    method public CharSequence! getText();
-    method public String! getType();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
     method public boolean isMultipleShare();
     method public boolean isShareIntent();
     method public boolean isSingleShare();
diff --git a/core/core/build.gradle b/core/core/build.gradle
index 38a6d7f..910d27b 100644
--- a/core/core/build.gradle
+++ b/core/core/build.gradle
@@ -12,7 +12,7 @@
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
     implementation("androidx.collection:collection:1.0.0")
-    api(ARCH_LIFECYCLE_RUNTIME, libs.exclude_annotations_transitive)
+    api(ARCH_LIFECYCLE_RUNTIME)
     api("androidx.versionedparcelable:versionedparcelable:1.1.0-rc01")
 
     androidTestImplementation(KOTLIN_STDLIB)
diff --git a/core/core/src/androidTest/java/androidx/core/app/ShareCompatTest.java b/core/core/src/androidTest/java/androidx/core/app/ShareCompatTest.java
index bd78c6a..993dddb 100644
--- a/core/core/src/androidTest/java/androidx/core/app/ShareCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/app/ShareCompatTest.java
@@ -36,11 +36,11 @@
 public class ShareCompatTest extends BaseInstrumentationTestCase<TestActivity> {
     @Rule
     public ActivityTestRule<TestActivity> testRuleForReading =
-            new ActivityTestRule<TestActivity>(TestActivity.class, false, false);
+            new ActivityTestRule<>(TestActivity.class, false, false);
 
     @Rule
     public ActivityTestRule<TestActivity> testRuleForReadingInterop =
-            new ActivityTestRule<TestActivity>(TestActivity.class, false, false);
+            new ActivityTestRule<>(TestActivity.class, false, false);
 
     public ShareCompatTest() {
         super(TestActivity.class);
diff --git a/core/core/src/main/java/androidx/core/app/ShareCompat.java b/core/core/src/main/java/androidx/core/app/ShareCompat.java
index 2f7cb0fa..eba49b6 100644
--- a/core/core/src/main/java/androidx/core/app/ShareCompat.java
+++ b/core/core/src/main/java/androidx/core/app/ShareCompat.java
@@ -18,8 +18,11 @@
 
 import static android.os.Build.VERSION.SDK_INT;
 
+import static androidx.core.util.Preconditions.checkNotNull;
+
 import android.app.Activity;
 import android.content.ComponentName;
+import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
@@ -33,6 +36,9 @@
 import android.view.MenuItem;
 import android.widget.ShareActionProvider;
 
+import androidx.annotation.IdRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 import androidx.core.content.IntentCompat;
 
@@ -120,13 +126,34 @@
      * @param calledActivity Current activity that was launched to share content
      * @return Name of the calling package
      */
-    public static String getCallingPackage(Activity calledActivity) {
+    @Nullable
+    public static String getCallingPackage(@NonNull Activity calledActivity) {
+        Intent intent = calledActivity.getIntent();
         String result = calledActivity.getCallingPackage();
+        if (result == null && intent != null) {
+            result = getCallingPackage(intent);
+        }
+        return result;
+    }
+
+    /**
+     * Retrieve the name of the package that launched intent from a share intent.
+     * Apps that provide social sharing functionality can use this to provide attribution
+     * for the app that shared the content.
+     *
+     * <p><em>Note:</em> This data may have been provided voluntarily by the calling
+     * application. As such it should not be trusted for accuracy in the context of
+     * security or verification.</p>
+     *
+     * @param intent Intent that was launched to share content
+     * @return Name of the calling package
+     */
+    @SuppressWarnings("WeakerAccess")
+    @Nullable
+    static String getCallingPackage(@NonNull Intent intent) {
+        String result = intent.getStringExtra(EXTRA_CALLING_PACKAGE);
         if (result == null) {
-            result = calledActivity.getIntent().getStringExtra(EXTRA_CALLING_PACKAGE);
-            if (result == null) {
-                result = calledActivity.getIntent().getStringExtra(EXTRA_CALLING_PACKAGE_INTEROP);
-            }
+            result = intent.getStringExtra(EXTRA_CALLING_PACKAGE_INTEROP);
         }
         return result;
     }
@@ -143,14 +170,34 @@
      * @param calledActivity Current activity that was launched to share content
      * @return ComponentName of the calling activity
      */
-    public static ComponentName getCallingActivity(Activity calledActivity) {
+    @Nullable
+    public static ComponentName getCallingActivity(@NonNull Activity calledActivity) {
+        Intent intent = calledActivity.getIntent();
         ComponentName result = calledActivity.getCallingActivity();
         if (result == null) {
-            result = calledActivity.getIntent().getParcelableExtra(EXTRA_CALLING_ACTIVITY);
-            if (result == null) {
-                result = calledActivity.getIntent().getParcelableExtra(
-                        EXTRA_CALLING_ACTIVITY_INTEROP);
-            }
+            result = getCallingActivity(intent);
+        }
+        return result;
+    }
+
+    /**
+     * Retrieve the ComponentName of the activity that launched intent from a share intent.
+     * Apps that provide social sharing functionality can use this to provide attribution
+     * for the app that shared the content.
+     *
+     * <p><em>Note:</em> This data may have been provided voluntarily by the calling
+     * application. As such it should not be trusted for accuracy in the context of
+     * security or verification.</p>
+     *
+     * @param intent Intent that was launched to share content
+     * @return ComponentName of the calling activity
+     */
+    @SuppressWarnings("WeakerAccess")
+    @Nullable
+    static ComponentName getCallingActivity(@NonNull Intent intent) {
+        ComponentName result = intent.getParcelableExtra(EXTRA_CALLING_ACTIVITY);
+        if (result == null) {
+            result = intent.getParcelableExtra(EXTRA_CALLING_ACTIVITY_INTEROP);
         }
         return result;
     }
@@ -181,16 +228,17 @@
      * @param item MenuItem to configure for sharing
      * @param shareIntent IntentBuilder with data about the content to share
      */
-    public static void configureMenuItem(MenuItem item, IntentBuilder shareIntent) {
+    public static void configureMenuItem(@NonNull MenuItem item,
+            @NonNull IntentBuilder shareIntent) {
         ActionProvider itemProvider = item.getActionProvider();
         ShareActionProvider provider;
         if (!(itemProvider instanceof ShareActionProvider)) {
-            provider = new ShareActionProvider(shareIntent.getActivity());
+            provider = new ShareActionProvider(shareIntent.getContext());
         } else {
             provider = (ShareActionProvider) itemProvider;
         }
         provider.setShareHistoryFileName(HISTORY_FILENAME_PREFIX
-                + shareIntent.getActivity().getClass().getName());
+                + shareIntent.getContext().getClass().getName());
         provider.setShareIntent(shareIntent.getIntent());
         item.setActionProvider(provider);
 
@@ -209,7 +257,8 @@
      * @param shareIntent IntentBuilder with data about the content to share
      * @see #configureMenuItem(MenuItem, IntentBuilder)
      */
-    public static void configureMenuItem(Menu menu, int menuItemId, IntentBuilder shareIntent) {
+    public static void configureMenuItem(@NonNull Menu menu, @IdRes int menuItemId,
+            @NonNull IntentBuilder shareIntent) {
         MenuItem item = menu.findItem(menuItemId);
         if (item == null) {
             throw new IllegalArgumentException("Could not find menu item with id " + menuItemId
@@ -225,14 +274,14 @@
      * will be included.
      */
     public static class IntentBuilder {
-        private Activity mActivity;
-        private Intent mIntent;
-        private CharSequence mChooserTitle;
-        private ArrayList<String> mToAddresses;
-        private ArrayList<String> mCcAddresses;
-        private ArrayList<String> mBccAddresses;
+        private final @NonNull Context mContext;
+        private final @NonNull Intent mIntent;
 
-        private ArrayList<Uri> mStreams;
+        private @Nullable CharSequence mChooserTitle;
+        private @Nullable ArrayList<String> mToAddresses;
+        private @Nullable ArrayList<String> mCcAddresses;
+        private @Nullable ArrayList<String> mBccAddresses;
+        private @Nullable ArrayList<Uri> mStreams;
 
         /**
          * Create a new IntentBuilder for launching a sharing action from launchingActivity.
@@ -240,17 +289,32 @@
          * @param launchingActivity Activity that the share will be launched from
          * @return a new IntentBuilder instance
          */
-        public static IntentBuilder from(Activity launchingActivity) {
-            return new IntentBuilder(launchingActivity);
+        @NonNull
+        public static IntentBuilder from(@NonNull Activity launchingActivity) {
+            return from(checkNotNull(launchingActivity), launchingActivity.getComponentName());
         }
 
-        private IntentBuilder(Activity launchingActivity) {
-            mActivity = launchingActivity;
+        /**
+         * Create a new IntentBuilder for launching a sharing action from launchingContext.
+         *
+         * @param launchingContext Context that the share will be launched from
+         * @param componentName Component that the share will be launched from, if any
+         * @return a new IntentBuilder instance
+         */
+        @NonNull
+        private static IntentBuilder from(@NonNull Context launchingContext,
+                @Nullable ComponentName componentName) {
+            return new IntentBuilder(launchingContext, componentName);
+        }
+
+        private IntentBuilder(@NonNull Context launchingContext,
+                @Nullable ComponentName componentName) {
+            mContext = checkNotNull(launchingContext);
             mIntent = new Intent().setAction(Intent.ACTION_SEND);
-            mIntent.putExtra(EXTRA_CALLING_PACKAGE, launchingActivity.getPackageName());
-            mIntent.putExtra(EXTRA_CALLING_PACKAGE_INTEROP, launchingActivity.getPackageName());
-            mIntent.putExtra(EXTRA_CALLING_ACTIVITY, launchingActivity.getComponentName());
-            mIntent.putExtra(EXTRA_CALLING_ACTIVITY_INTEROP, launchingActivity.getComponentName());
+            mIntent.putExtra(EXTRA_CALLING_PACKAGE, launchingContext.getPackageName());
+            mIntent.putExtra(EXTRA_CALLING_PACKAGE_INTEROP, launchingContext.getPackageName());
+            mIntent.putExtra(EXTRA_CALLING_ACTIVITY, componentName);
+            mIntent.putExtra(EXTRA_CALLING_ACTIVITY_INTEROP, componentName);
             mIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
         }
 
@@ -263,6 +327,7 @@
          *
          * @return The current Intent being configured by this builder
          */
+        @NonNull
         public Intent getIntent() {
             if (mToAddresses != null) {
                 combineArrayExtra(Intent.EXTRA_EMAIL, mToAddresses);
@@ -279,7 +344,7 @@
 
             // Check if we need to change the action.
             boolean needsSendMultiple = mStreams != null && mStreams.size() > 1;
-            boolean isSendMultiple = mIntent.getAction().equals(Intent.ACTION_SEND_MULTIPLE);
+            boolean isSendMultiple = Intent.ACTION_SEND_MULTIPLE.equals(mIntent.getAction());
 
             if (!needsSendMultiple && isSendMultiple) {
                 // Change back to a single send action; place the first stream into the
@@ -307,8 +372,9 @@
             return mIntent;
         }
 
-        Activity getActivity() {
-            return mActivity;
+        @NonNull
+        Context getContext() {
+            return mContext;
         }
 
         private void combineArrayExtra(String extra, ArrayList<String> add) {
@@ -322,7 +388,7 @@
             mIntent.putExtra(extra, finalAddresses);
         }
 
-        private void combineArrayExtra(String extra, String[] add) {
+        private void combineArrayExtra(@Nullable String extra, @NonNull String[] add) {
             // Add any items still pending
             Intent intent = getIntent();
             String[] old = intent.getStringArrayExtra(extra);
@@ -340,6 +406,7 @@
          *
          * @return A chooser Intent for the currently configured sharing action
          */
+        @NonNull
         public Intent createChooserIntent() {
             return Intent.createChooser(getIntent(), mChooserTitle);
         }
@@ -354,7 +421,7 @@
          * of invoking this directly.</p>
          */
         public void startChooser() {
-            mActivity.startActivity(createChooserIntent());
+            mContext.startActivity(createChooserIntent());
         }
 
         /**
@@ -363,7 +430,8 @@
          * @param title Title string
          * @return This IntentBuilder for method chaining
          */
-        public IntentBuilder setChooserTitle(CharSequence title) {
+        @NonNull
+        public IntentBuilder setChooserTitle(@Nullable CharSequence title) {
             mChooserTitle = title;
             return this;
         }
@@ -374,8 +442,9 @@
          * @param resId Resource ID of the title string to use
          * @return This IntentBuilder for method chaining
          */
+        @NonNull
         public IntentBuilder setChooserTitle(@StringRes int resId) {
-            return setChooserTitle(mActivity.getText(resId));
+            return setChooserTitle(mContext.getText(resId));
         }
 
         /**
@@ -385,7 +454,8 @@
          * @return This IntentBuilder for method chaining
          * @see Intent#setType(String)
          */
-        public IntentBuilder setType(String mimeType) {
+        @NonNull
+        public IntentBuilder setType(@Nullable String mimeType) {
             mIntent.setType(mimeType);
             return this;
         }
@@ -398,7 +468,8 @@
          * @return This IntentBuilder for method chaining
          * @see Intent#EXTRA_TEXT
          */
-        public IntentBuilder setText(CharSequence text) {
+        @NonNull
+        public IntentBuilder setText(@Nullable CharSequence text) {
             mIntent.putExtra(Intent.EXTRA_TEXT, text);
             return this;
         }
@@ -414,7 +485,8 @@
          * @return This IntentBuilder for method chaining
          * @see #setText(CharSequence)
          */
-        public IntentBuilder setHtmlText(String htmlText) {
+        @NonNull
+        public IntentBuilder setHtmlText(@Nullable String htmlText) {
             mIntent.putExtra(IntentCompat.EXTRA_HTML_TEXT, htmlText);
             if (!mIntent.hasExtra(Intent.EXTRA_TEXT)) {
                 // Supply a default if EXTRA_TEXT isn't set
@@ -433,8 +505,9 @@
          * @return This IntentBuilder for method chaining
          * @see Intent#EXTRA_STREAM
          */
-        public IntentBuilder setStream(Uri streamUri) {
-            if (!mIntent.getAction().equals(Intent.ACTION_SEND)) {
+        @NonNull
+        public IntentBuilder setStream(@Nullable Uri streamUri) {
+            if (!Intent.ACTION_SEND.equals(mIntent.getAction())) {
                 mIntent.setAction(Intent.ACTION_SEND);
             }
             mStreams = null;
@@ -453,13 +526,14 @@
          * @see Intent#ACTION_SEND
          * @see Intent#ACTION_SEND_MULTIPLE
          */
-        public IntentBuilder addStream(Uri streamUri) {
+        @NonNull
+        public IntentBuilder addStream(@NonNull Uri streamUri) {
             Uri currentStream = mIntent.getParcelableExtra(Intent.EXTRA_STREAM);
             if (mStreams == null && currentStream == null) {
                 return setStream(streamUri);
             }
             if (mStreams == null) {
-                mStreams = new ArrayList<Uri>();
+                mStreams = new ArrayList<>();
             }
             if (currentStream != null) {
                 mIntent.removeExtra(Intent.EXTRA_STREAM);
@@ -477,7 +551,8 @@
          * @return This IntentBuilder for method chaining
          * @see Intent#EXTRA_EMAIL
          */
-        public IntentBuilder setEmailTo(String[] addresses) {
+        @NonNull
+        public IntentBuilder setEmailTo(@Nullable String[] addresses) {
             if (mToAddresses != null) {
                 mToAddresses = null;
             }
@@ -492,9 +567,10 @@
          * @return This IntentBuilder for method chaining
          * @see Intent#EXTRA_EMAIL
          */
-        public IntentBuilder addEmailTo(String address) {
+        @NonNull
+        public IntentBuilder addEmailTo(@NonNull String address) {
             if (mToAddresses == null) {
-                mToAddresses = new ArrayList<String>();
+                mToAddresses = new ArrayList<>();
             }
             mToAddresses.add(address);
             return this;
@@ -507,7 +583,8 @@
          * @return This IntentBuilder for method chaining
          * @see Intent#EXTRA_EMAIL
          */
-        public IntentBuilder addEmailTo(String[] addresses) {
+        @NonNull
+        public IntentBuilder addEmailTo(@NonNull String[] addresses) {
             combineArrayExtra(Intent.EXTRA_EMAIL, addresses);
             return this;
         }
@@ -520,7 +597,8 @@
          * @return This IntentBuilder for method chaining
          * @see Intent#EXTRA_CC
          */
-        public IntentBuilder setEmailCc(String[] addresses) {
+        @NonNull
+        public IntentBuilder setEmailCc(@Nullable String[] addresses) {
             mIntent.putExtra(Intent.EXTRA_CC, addresses);
             return this;
         }
@@ -532,9 +610,10 @@
          * @return This IntentBuilder for method chaining
          * @see Intent#EXTRA_CC
          */
-        public IntentBuilder addEmailCc(String address) {
+        @NonNull
+        public IntentBuilder addEmailCc(@NonNull String address) {
             if (mCcAddresses == null) {
-                mCcAddresses = new ArrayList<String>();
+                mCcAddresses = new ArrayList<>();
             }
             mCcAddresses.add(address);
             return this;
@@ -547,7 +626,8 @@
          * @return This IntentBuilder for method chaining
          * @see Intent#EXTRA_CC
          */
-        public IntentBuilder addEmailCc(String[] addresses) {
+        @NonNull
+        public IntentBuilder addEmailCc(@NonNull String[] addresses) {
             combineArrayExtra(Intent.EXTRA_CC, addresses);
             return this;
         }
@@ -560,7 +640,8 @@
          * @return This IntentBuilder for method chaining
          * @see Intent#EXTRA_BCC
          */
-        public IntentBuilder setEmailBcc(String[] addresses) {
+        @NonNull
+        public IntentBuilder setEmailBcc(@Nullable String[] addresses) {
             mIntent.putExtra(Intent.EXTRA_BCC, addresses);
             return this;
         }
@@ -572,9 +653,10 @@
          * @return This IntentBuilder for method chaining
          * @see Intent#EXTRA_BCC
          */
-        public IntentBuilder addEmailBcc(String address) {
+        @NonNull
+        public IntentBuilder addEmailBcc(@NonNull String address) {
             if (mBccAddresses == null) {
-                mBccAddresses = new ArrayList<String>();
+                mBccAddresses = new ArrayList<>();
             }
             mBccAddresses.add(address);
             return this;
@@ -587,7 +669,8 @@
          * @return This IntentBuilder for method chaining
          * @see Intent#EXTRA_BCC
          */
-        public IntentBuilder addEmailBcc(String[] addresses) {
+        @NonNull
+        public IntentBuilder addEmailBcc(@NonNull String[] addresses) {
             combineArrayExtra(Intent.EXTRA_BCC, addresses);
             return this;
         }
@@ -599,7 +682,8 @@
          * @return This IntentBuilder for method chaining
          * @see Intent#EXTRA_SUBJECT
          */
-        public IntentBuilder setSubject(String subject) {
+        @NonNull
+        public IntentBuilder setSubject(@Nullable String subject) {
             mIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
             return this;
         }
@@ -625,12 +709,12 @@
     public static class IntentReader {
         private static final String TAG = "IntentReader";
 
-        private Activity mActivity;
-        private Intent mIntent;
-        private String mCallingPackage;
-        private ComponentName mCallingActivity;
+        private final @NonNull Context mContext;
+        private final @NonNull Intent mIntent;
+        private final @Nullable String mCallingPackage;
+        private final @Nullable ComponentName mCallingActivity;
 
-        private ArrayList<Uri> mStreams;
+        private @Nullable ArrayList<Uri> mStreams;
 
         /**
          * Get an IntentReader for parsing and interpreting the sharing intent
@@ -639,15 +723,29 @@
          * @param activity Activity that was started to share content
          * @return IntentReader for parsing sharing data
          */
-        public static IntentReader from(Activity activity) {
-            return new IntentReader(activity);
+        @NonNull
+        public static IntentReader from(@NonNull Activity activity) {
+            return from(checkNotNull(activity), activity.getIntent());
         }
 
-        private IntentReader(Activity activity) {
-            mActivity = activity;
-            mIntent = activity.getIntent();
-            mCallingPackage = ShareCompat.getCallingPackage(activity);
-            mCallingActivity = ShareCompat.getCallingActivity(activity);
+        /**
+         * Get an IntentReader for parsing and interpreting the sharing intent
+         * used to start the given activity.
+         *
+         * @param context Context that was started to share content
+         * @param intent Intent that was used to start the context
+         * @return IntentReader for parsing sharing data
+         */
+        @NonNull
+        private static IntentReader from(@NonNull Context context, @NonNull Intent intent) {
+            return new IntentReader(context, intent);
+        }
+
+        private IntentReader(@NonNull Context context, @NonNull Intent intent) {
+            mContext = checkNotNull(context);
+            mIntent = checkNotNull(intent);
+            mCallingPackage = ShareCompat.getCallingPackage(intent);
+            mCallingActivity = ShareCompat.getCallingActivity(intent);
         }
 
         /**
@@ -692,6 +790,7 @@
          * @return mimetype of the shared data
          * @see Intent#getType()
          */
+        @Nullable
         public String getType() {
             return mIntent.getType();
         }
@@ -702,6 +801,7 @@
          * @return Literal shared text or null if none was supplied
          * @see Intent#EXTRA_TEXT
          */
+        @Nullable
         public CharSequence getText() {
             return mIntent.getCharSequenceExtra(Intent.EXTRA_TEXT);
         }
@@ -716,6 +816,7 @@
          *
          * @return Styled text provided by the sender as HTML.
          */
+        @Nullable
         public String getHtmlText() {
             String result = mIntent.getStringExtra(IntentCompat.EXTRA_HTML_TEXT);
             if (result == null) {
@@ -735,8 +836,8 @@
             return result;
         }
 
-        private static void withinStyle(StringBuilder out, CharSequence text,
-                int start, int end) {
+        @SuppressWarnings("SameParameterValue")
+        private static void withinStyle(StringBuilder out, CharSequence text, int start, int end) {
             for (int i = start; i < end; i++) {
                 char c = text.charAt(i);
 
@@ -747,7 +848,7 @@
                 } else if (c == '&') {
                     out.append("&amp;");
                 } else if (c > 0x7E || c < ' ') {
-                    out.append("&#" + ((int) c) + ";");
+                    out.append("&#").append((int) c).append(";");
                 } else if (c == ' ') {
                     while (i + 1 < end && text.charAt(i + 1) == ' ') {
                         out.append("&nbsp;");
@@ -772,8 +873,9 @@
          * @return A URI referring to a data stream to be shared or null if one was not supplied
          * @see Intent#EXTRA_STREAM
          */
+        @Nullable
         public Uri getStream() {
-            return mIntent.getParcelableExtra(Intent.EXTRA_STREAM);
+            return (Uri) mIntent.getParcelableExtra(Intent.EXTRA_STREAM);
         }
 
         /**
@@ -785,6 +887,7 @@
          * @see Intent#EXTRA_STREAM
          * @see Intent#ACTION_SEND_MULTIPLE
          */
+        @Nullable
         public Uri getStream(int index) {
             if (mStreams == null && isMultipleShare()) {
                 mStreams = mIntent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
@@ -822,6 +925,7 @@
          * @return An array of email addresses or null if none were supplied.
          * @see Intent#EXTRA_EMAIL
          */
+        @Nullable
         public String[] getEmailTo() {
             return mIntent.getStringArrayExtra(Intent.EXTRA_EMAIL);
         }
@@ -832,6 +936,7 @@
          * @return An array of email addresses or null if none were supplied.
          * @see Intent#EXTRA_CC
          */
+        @Nullable
         public String[] getEmailCc() {
             return mIntent.getStringArrayExtra(Intent.EXTRA_CC);
         }
@@ -842,6 +947,7 @@
          * @return An array of email addresses or null if none were supplied.
          * @see Intent#EXTRA_BCC
          */
+        @Nullable
         public String[] getEmailBcc() {
             return mIntent.getStringArrayExtra(Intent.EXTRA_BCC);
         }
@@ -852,6 +958,7 @@
          * @return The subject heading for this share or null if one was not supplied.
          * @see Intent#EXTRA_SUBJECT
          */
+        @Nullable
         public String getSubject() {
             return mIntent.getStringExtra(Intent.EXTRA_SUBJECT);
         }
@@ -870,6 +977,7 @@
          * @see ShareCompat#EXTRA_CALLING_PACKAGE
          * @see ShareCompat#EXTRA_CALLING_PACKAGE_INTEROP
          */
+        @Nullable
         public String getCallingPackage() {
             return mCallingPackage;
         }
@@ -888,6 +996,7 @@
          * @see ShareCompat#EXTRA_CALLING_ACTIVITY
          * @see ShareCompat#EXTRA_CALLING_ACTIVITY_INTEROP
          */
+        @Nullable
         public ComponentName getCallingActivity() {
             return mCallingActivity;
         }
@@ -902,10 +1011,11 @@
          *
          * @return The calling Activity's icon or null if unknown
          */
+        @Nullable
         public Drawable getCallingActivityIcon() {
             if (mCallingActivity == null) return null;
 
-            PackageManager pm = mActivity.getPackageManager();
+            PackageManager pm = mContext.getPackageManager();
             try {
                 return pm.getActivityIcon(mCallingActivity);
             } catch (NameNotFoundException e) {
@@ -924,10 +1034,11 @@
          *
          * @return The calling application's icon or null if unknown
          */
+        @Nullable
         public Drawable getCallingApplicationIcon() {
             if (mCallingPackage == null) return null;
 
-            PackageManager pm = mActivity.getPackageManager();
+            PackageManager pm = mContext.getPackageManager();
             try {
                 return pm.getApplicationIcon(mCallingPackage);
             } catch (NameNotFoundException e) {
@@ -946,10 +1057,11 @@
          *
          * @return The calling application's label or null if unknown
          */
+        @Nullable
         public CharSequence getCallingApplicationLabel() {
             if (mCallingPackage == null) return null;
 
-            PackageManager pm = mActivity.getPackageManager();
+            PackageManager pm = mContext.getPackageManager();
             try {
                 return pm.getApplicationLabel(pm.getApplicationInfo(mCallingPackage, 0));
             } catch (NameNotFoundException e) {
diff --git a/core/core/src/main/java/androidx/core/graphics/TypefaceCompat.java b/core/core/src/main/java/androidx/core/graphics/TypefaceCompat.java
index 37ac073..8811f03 100644
--- a/core/core/src/main/java/androidx/core/graphics/TypefaceCompat.java
+++ b/core/core/src/main/java/androidx/core/graphics/TypefaceCompat.java
@@ -115,7 +115,7 @@
             final int timeout = isRequestFromLayoutInflator ? providerEntry.getTimeout()
                     : FontResourcesParserCompat.INFINITE_TIMEOUT_VALUE;
             typeface = FontsContractCompat.getFontSync(context, providerEntry.getRequest(),
-                    fontCallback, handler, isBlocking, timeout, style, isRequestFromLayoutInflator);
+                    fontCallback, handler, isBlocking, timeout, style);
         } else {
             typeface = sTypefaceCompatImpl.createFromFontFamilyFilesResourceEntry(
                     context, (FontFamilyFilesResourceEntry) entry, resources, style);
diff --git a/core/core/src/main/java/androidx/core/provider/FontsContractCompat.java b/core/core/src/main/java/androidx/core/provider/FontsContractCompat.java
index 7ce5a85..0778535 100644
--- a/core/core/src/main/java/androidx/core/provider/FontsContractCompat.java
+++ b/core/core/src/main/java/androidx/core/provider/FontsContractCompat.java
@@ -16,7 +16,6 @@
 
 package androidx.core.provider;
 
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
 
 import android.annotation.SuppressLint;
@@ -66,13 +65,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.FutureTask;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
 
 /**
  * Utility class to deal with Font ContentProviders.
@@ -222,9 +214,6 @@
         }
     }
 
-    @GuardedBy("sLock")
-    private static Executor sExecutor;
-
     /**
      * Used for tests, should not be used otherwise.
      * @hide
@@ -234,110 +223,12 @@
         sTypefaceCache.evictAll();
     }
 
-    /**
-     * An general interface for callback when the process has completed.
-     */
-    private interface OnCompletedCallback<T> {
-        void onCompleted(T result);
-    }
-
-    /**
-     * A helper class for wrapping synchronous font fetching with Callable.
-     */
-    private static final class SyncFontFetchTaskCallable implements Callable<TypefaceResult> {
-        private final @NonNull String mCacheId;
-        private final @NonNull Context mAppContext;
-        private final @NonNull FontRequest mRequest;
-        private final int mStyle;
-
-        SyncFontFetchTaskCallable(@NonNull Context ctx, @NonNull FontRequest request,
-                int style, @NonNull String cacheId) {
-            mCacheId = cacheId;
-            mAppContext = ctx.getApplicationContext();
-            mRequest = request;
-            mStyle = style;
-        }
-
-        @Override
-        public TypefaceResult call() throws Exception {
-            TypefaceResult typeface = getFontInternal(mAppContext, mRequest, mStyle);
-            if (typeface.mTypeface != null) {
-                sTypefaceCache.put(mCacheId, typeface.mTypeface);
-            }
-            return typeface;
-        }
-    }
-
-    /**
-     * Helper class of the process when the font fetch has completed.
-     *
-     * This class does
-     * - Remove all reply objects for the given request from pending replies.
-     * - Call the all replies.
-     */
-    private static final class OnFetchCompletedAndFirePendingReplyCallback
-            implements OnCompletedCallback<TypefaceResult> {
-        private final @NonNull String mCacheId;
-
-        OnFetchCompletedAndFirePendingReplyCallback(@NonNull String cacheId) {
-            mCacheId = cacheId;
-        }
-
-        @Override
-        public void onCompleted(TypefaceResult typeface) {
-            final ArrayList<ReplyCallback<TypefaceResult>> replies;
-            synchronized (sLock) {
-                replies = sPendingReplies.get(mCacheId);
-                if (replies == null) {
-                    return;  // Nobody requested replies. Do nothing.
-                }
-                sPendingReplies.remove(mCacheId);
-            }
-            for (int i = 0; i < replies.size(); ++i) {
-                replies.get(i).onReply(typeface);
-            }
-        }
-    }
-
-    /**
-     * Helper task class for font fetching.
-     */
-    private static final class SyncFontFetchTask extends FutureTask<TypefaceResult> {
-        private static final class CallableWrapper implements Callable<TypefaceResult> {
-            private final Callable<TypefaceResult> mOriginalCallback;
-            private final OnCompletedCallback<TypefaceResult> mTypefaceResultOnCompletedCallback;
-            CallableWrapper(@NonNull Callable<TypefaceResult> callback,
-                    @NonNull OnCompletedCallback<TypefaceResult> onCompletedCallback) {
-                mOriginalCallback = callback;
-                mTypefaceResultOnCompletedCallback = onCompletedCallback;
-            }
-
-            @Override
-            public TypefaceResult call() throws Exception {
-                TypefaceResult tf = mOriginalCallback.call();
-                mTypefaceResultOnCompletedCallback.onCompleted(tf);
-                return tf;
-            }
-        }
-
-        SyncFontFetchTask(@NonNull SyncFontFetchTaskCallable callable) {
-            super(callable);
-        }
-
-        SyncFontFetchTask(@NonNull SyncFontFetchTaskCallable callable,
-                @NonNull OnCompletedCallback<TypefaceResult> onCompletedCallback) {
-            super(new CallableWrapper(callable, onCompletedCallback));
-        }
-    }
-
     /** @hide */
-    @RestrictTo(LIBRARY)
+    @RestrictTo(LIBRARY_GROUP_PREFIX)
     public static Typeface getFontSync(final Context context, final FontRequest request,
             final @Nullable ResourcesCompat.FontCallback fontCallback,
             final @Nullable Handler handler, boolean isBlockingFetch, int timeout,
-            final int style, boolean isRequestFromLayoutInflator) {
-
-
+            final int style) {
         final String id = request.getIdentifier() + "-" + style;
         Typeface cached = sTypefaceCache.get(id);
         if (cached != null) {
@@ -360,97 +251,55 @@
             return typefaceResult.mTypeface;
         }
 
-        Executor executor = null;
-        if (isRequestFromLayoutInflator && handler == null) {
-            if (sExecutor == null) {
-                synchronized (sLock) {
-                    if (sExecutor == null) {
-
-                        sExecutor = Executors.newFixedThreadPool(1, new ThreadFactory() {
-                            @Override
-                            public Thread newThread(@NonNull Runnable runnable) {
-                                final Thread t = new Thread(runnable);
-                                t.setName("fonts");
-                                return t;
-                            }
-                        });
-                    }
+        final Callable<TypefaceResult> fetcher = new Callable<TypefaceResult>() {
+            @Override
+            public TypefaceResult call() throws Exception {
+                TypefaceResult typeface = getFontInternal(context, request, style);
+                if (typeface.mTypeface != null) {
+                    sTypefaceCache.put(id, typeface.mTypeface);
                 }
+                return typeface;
             }
-            executor = sExecutor;
-        }
-
-        final SyncFontFetchTaskCallable fetcher = new SyncFontFetchTaskCallable(
-                context, request, style, id);
+        };
 
         if (isBlockingFetch) {
             try {
-                if (executor == null) {
-                    return sBackgroundThread.postAndWait(fetcher, timeout).mTypeface;
-                } else {
-                    final SyncFontFetchTask task = new SyncFontFetchTask(fetcher);
-                    executor.execute(task);
-                    return task.get(timeout, TimeUnit.MILLISECONDS).mTypeface;
-                }
-            } catch (InterruptedException | TimeoutException | ExecutionException e) {
+                return sBackgroundThread.postAndWait(fetcher, timeout).mTypeface;
+            } catch (InterruptedException e) {
                 return null;
             }
-        }
-
-        // Non-blocking fetch
-        ReplyCallback<TypefaceResult> reply = null;
-        if (fontCallback != null) {
-            if (executor == null) {
-                reply = new ReplyCallback<TypefaceResult>() {
-                    @Override
-                    public void onReply(final TypefaceResult typeface) {
-                        if (typeface == null) {
-                            fontCallback.callbackFailAsync(
-                                    FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND,
-                                    handler);
-                        } else if (typeface.mResult == FontFamilyResult.STATUS_OK) {
-                            fontCallback.callbackSuccessAsync(typeface.mTypeface, handler);
-                        } else {
-                            fontCallback.callbackFailAsync(typeface.mResult, handler);
+        } else {
+            final ReplyCallback<TypefaceResult> reply = fontCallback == null ? null
+                    : new ReplyCallback<TypefaceResult>() {
+                        @Override
+                        public void onReply(final TypefaceResult typeface) {
+                            if (typeface == null) {
+                                fontCallback.callbackFailAsync(
+                                        FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND, handler);
+                            } else if (typeface.mResult == FontFamilyResult.STATUS_OK) {
+                                fontCallback.callbackSuccessAsync(typeface.mTypeface, handler);
+                            } else {
+                                fontCallback.callbackFailAsync(typeface.mResult, handler);
+                            }
                         }
-                    }
-                };
-            } else {
-                reply = new ReplyCallback<TypefaceResult>() {
-                    @Override
-                    public void onReply(final TypefaceResult typeface) {
-                        if (typeface == null) {
-                            fontCallback.onFontRetrievalFailed(
-                                    FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND);
-                        } else if (typeface.mResult == FontFamilyResult.STATUS_OK) {
-                            fontCallback.onFontRetrieved(typeface.mTypeface);
-                        } else {
-                            fontCallback.onFontRetrievalFailed(typeface.mResult);
-                        }
-                    }
-                };
-            }
-        }
+                    };
 
-        synchronized (sLock) {
-            ArrayList<ReplyCallback<TypefaceResult>> pendingReplies = sPendingReplies.get(
-                    id);
-            if (pendingReplies != null) {
-                // Already requested. Do not request the same provider again and insert the
-                // reply to the queue instead.
+            synchronized (sLock) {
+                ArrayList<ReplyCallback<TypefaceResult>> pendingReplies = sPendingReplies.get(id);
+                if (pendingReplies != null) {
+                    // Already requested. Do not request the same provider again and insert the
+                    // reply to the queue instead.
+                    if (reply != null) {
+                        pendingReplies.add(reply);
+                    }
+                    return null;
+                }
                 if (reply != null) {
+                    pendingReplies = new ArrayList<>();
                     pendingReplies.add(reply);
+                    sPendingReplies.put(id, pendingReplies);
                 }
-                return null;
             }
-            if (reply != null) {
-                pendingReplies = new ArrayList<>();
-                pendingReplies.add(reply);
-                sPendingReplies.put(id, pendingReplies);
-            }
-        }
-
-        if (executor == null) {
             sBackgroundThread.postAndReply(fetcher, new ReplyCallback<TypefaceResult>() {
                 @Override
                 public void onReply(final TypefaceResult typeface) {
@@ -467,22 +316,8 @@
                     }
                 }
             });
-        } else {
-            executor.execute(new SyncFontFetchTask(fetcher,
-                    new OnFetchCompletedAndFirePendingReplyCallback(id)));
-
+            return null;
         }
-        return null;
-    }
-
-    /** @hide */
-    @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public static Typeface getFontSync(final Context context, final FontRequest request,
-            final @Nullable ResourcesCompat.FontCallback fontCallback,
-            final @Nullable Handler handler, boolean isBlockingFetch, int timeout,
-            final int style) {
-        return getFontSync(context, request, fontCallback, handler, isBlockingFetch, timeout, style,
-                false /* isCalledFromLayoutInflator */);
     }
 
     /**
diff --git a/docs-fake/build.gradle b/docs-fake/build.gradle
index a13de10..d8899df 100644
--- a/docs-fake/build.gradle
+++ b/docs-fake/build.gradle
@@ -35,6 +35,7 @@
 project.tasks.whenTaskAdded { task ->
     if (task instanceof org.gradle.api.tasks.testing.Test
             || task.name.startsWith("assemble")
+            || task.name == "lint"
             || task.name == "transformDexArchiveWithExternalLibsDexMergerForPublicDebug"
             || task.name == "transformResourcesWithMergeJavaResForPublicDebug"
             || task.name == "checkPublicDebugDuplicateClasses") {
@@ -46,6 +47,9 @@
     }
 }
 
+// Also replace some tasks that will have already been created (and not trigger `whenTaskAdded`)
+project.tasks.replace("lint")
+
 android {
     defaultConfig {
         minSdkVersion SupportConfig.TARGET_SDK_VERSION
diff --git a/fragment/fragment-ktx/api/1.2.0-alpha02.txt b/fragment/fragment-ktx/api/1.2.0-alpha02.txt
index 1ba3fb9..dd42d83 100644
--- a/fragment/fragment-ktx/api/1.2.0-alpha02.txt
+++ b/fragment/fragment-ktx/api/1.2.0-alpha02.txt
@@ -10,9 +10,9 @@
 
   public final class FragmentTransactionKt {
     ctor public FragmentTransactionKt();
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag, android.os.Bundle? args = null);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
   }
 
   public final class FragmentViewModelLazyKt {
diff --git a/fragment/fragment-ktx/api/current.txt b/fragment/fragment-ktx/api/current.txt
index 1ba3fb9..dd42d83 100644
--- a/fragment/fragment-ktx/api/current.txt
+++ b/fragment/fragment-ktx/api/current.txt
@@ -10,9 +10,9 @@
 
   public final class FragmentTransactionKt {
     ctor public FragmentTransactionKt();
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag, android.os.Bundle? args = null);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
   }
 
   public final class FragmentViewModelLazyKt {
diff --git a/fragment/fragment-ktx/api/restricted_1.2.0-alpha02.txt b/fragment/fragment-ktx/api/restricted_1.2.0-alpha02.txt
index 1ba3fb9..dd42d83 100644
--- a/fragment/fragment-ktx/api/restricted_1.2.0-alpha02.txt
+++ b/fragment/fragment-ktx/api/restricted_1.2.0-alpha02.txt
@@ -10,9 +10,9 @@
 
   public final class FragmentTransactionKt {
     ctor public FragmentTransactionKt();
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag, android.os.Bundle? args = null);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
   }
 
   public final class FragmentViewModelLazyKt {
diff --git a/fragment/fragment-ktx/api/restricted_current.txt b/fragment/fragment-ktx/api/restricted_current.txt
index 1ba3fb9..dd42d83 100644
--- a/fragment/fragment-ktx/api/restricted_current.txt
+++ b/fragment/fragment-ktx/api/restricted_current.txt
@@ -10,9 +10,9 @@
 
   public final class FragmentTransactionKt {
     ctor public FragmentTransactionKt();
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag, android.os.Bundle? args = null);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
   }
 
   public final class FragmentViewModelLazyKt {
diff --git a/fragment/fragment-ktx/src/androidTest/java/androidx/fragment/app/FragmentTransactionTest.kt b/fragment/fragment-ktx/src/androidTest/java/androidx/fragment/app/FragmentTransactionTest.kt
index 2629dc3..9e33942 100644
--- a/fragment/fragment-ktx/src/androidTest/java/androidx/fragment/app/FragmentTransactionTest.kt
+++ b/fragment/fragment-ktx/src/androidTest/java/androidx/fragment/app/FragmentTransactionTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.fragment.app
 
+import android.os.Bundle
 import androidx.test.annotation.UiThreadTest
 import androidx.test.filters.SmallTest
 import androidx.test.rule.ActivityTestRule
@@ -30,12 +31,15 @@
 
     @UiThreadTest
     @Test fun addWithContainerId() {
+        val args = Bundle()
         fragmentManager.beginTransaction()
-            .add<TestFragment>(android.R.id.content, "tag")
+            .add<TestFragment>(android.R.id.content, "tag", args)
             .commitNow()
         val fragment = fragmentManager.findFragmentById(android.R.id.content)
         assertThat(fragment)
             .isInstanceOf(TestFragment::class.java)
+        assertThat(fragment?.arguments)
+            .isSameInstanceAs(args)
         assertThat(fragmentManager.findFragmentByTag("tag"))
             .isSameInstanceAs(fragment)
     }
@@ -60,12 +64,15 @@
 
     @UiThreadTest
     @Test fun replaceWithTag() {
+        val args = Bundle()
         fragmentManager.beginTransaction()
-            .replace<TestFragment>(android.R.id.content, "tag")
+            .replace<TestFragment>(android.R.id.content, "tag", args)
             .commitNow()
         val fragment = fragmentManager.findFragmentById(android.R.id.content)
         assertThat(fragment)
             .isInstanceOf(TestFragment::class.java)
+        assertThat(fragment?.arguments)
+            .isSameInstanceAs(args)
         assertThat(fragmentManager.findFragmentByTag("tag"))
             .isSameInstanceAs(fragment)
     }
diff --git a/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentTransaction.kt b/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentTransaction.kt
index 10547d6..514ac91 100644
--- a/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentTransaction.kt
+++ b/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentTransaction.kt
@@ -16,6 +16,7 @@
 
 package androidx.fragment.app
 
+import android.os.Bundle
 import androidx.annotation.IdRes
 
 /**
@@ -31,13 +32,15 @@
  * to be placed in.
  * @param tag Optional tag name for the fragment, to later retrieve the
  * fragment with [FragmentManager.findFragmentByTag].
+ * @param args Optional arguments to be set on the fragment.
  *
  * @return Returns the same [FragmentTransaction] instance.
  */
 inline fun <reified F : Fragment> FragmentTransaction.add(
     @IdRes containerViewId: Int,
-    tag: String? = null
-) = add(containerViewId, F::class.java, tag)
+    tag: String? = null,
+    args: Bundle? = null
+) = add(containerViewId, F::class.java, args, tag)
 
 /**
  * Add a fragment to the associated [FragmentManager] without
@@ -48,12 +51,14 @@
  *
  * @param tag Tag name for the fragment, to later retrieve the
  * fragment with [FragmentManager.findFragmentByTag].
+ * @param args Optional arguments to be set on the fragment.
  *
  * @return Returns the same [FragmentTransaction] instance.
  */
 inline fun <reified F : Fragment> FragmentTransaction.add(
-    tag: String
-) = add(F::class.java, tag)
+    tag: String,
+    args: Bundle? = null
+) = add(F::class.java, args, tag)
 
 /**
  * Replace an existing fragment that was added to a container.  This is
@@ -68,10 +73,12 @@
  * to be replaced.
  * @param tag Optional tag name for the fragment, to later retrieve the
  * fragment with [FragmentManager.findFragmentByTag].
+ * @param args Optional arguments to be set on the fragment.
  *
  * @return Returns the same [FragmentTransaction] instance.
  */
 inline fun <reified F : Fragment> FragmentTransaction.replace(
     @IdRes containerViewId: Int,
-    tag: String? = null
-) = replace(containerViewId, F::class.java, tag)
+    tag: String? = null,
+    args: Bundle? = null
+) = replace(containerViewId, F::class.java, args, tag)
diff --git a/fragment/fragment/api/1.2.0-alpha02.txt b/fragment/fragment/api/1.2.0-alpha02.txt
index fbbd998..865189d 100644
--- a/fragment/fragment/api/1.2.0-alpha02.txt
+++ b/fragment/fragment/api/1.2.0-alpha02.txt
@@ -358,11 +358,11 @@
 
   public abstract class FragmentTransaction {
     ctor @Deprecated public FragmentTransaction();
-    method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, String?);
+    method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
     method public androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.Fragment, String?);
-    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>);
+    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
     method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment);
-    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, String?);
+    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
     method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment, String?);
     method public androidx.fragment.app.FragmentTransaction addSharedElement(android.view.View, String);
     method public androidx.fragment.app.FragmentTransaction addToBackStack(String?);
@@ -377,9 +377,9 @@
     method public boolean isAddToBackStackAllowed();
     method public boolean isEmpty();
     method public androidx.fragment.app.FragmentTransaction remove(androidx.fragment.app.Fragment);
-    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>);
+    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
     method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment);
-    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, String?);
+    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
     method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment, String?);
     method public androidx.fragment.app.FragmentTransaction runOnCommit(Runnable);
     method @Deprecated public androidx.fragment.app.FragmentTransaction setAllowOptimization(boolean);
diff --git a/fragment/fragment/api/current.txt b/fragment/fragment/api/current.txt
index fbbd998..865189d 100644
--- a/fragment/fragment/api/current.txt
+++ b/fragment/fragment/api/current.txt
@@ -358,11 +358,11 @@
 
   public abstract class FragmentTransaction {
     ctor @Deprecated public FragmentTransaction();
-    method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, String?);
+    method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
     method public androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.Fragment, String?);
-    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>);
+    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
     method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment);
-    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, String?);
+    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
     method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment, String?);
     method public androidx.fragment.app.FragmentTransaction addSharedElement(android.view.View, String);
     method public androidx.fragment.app.FragmentTransaction addToBackStack(String?);
@@ -377,9 +377,9 @@
     method public boolean isAddToBackStackAllowed();
     method public boolean isEmpty();
     method public androidx.fragment.app.FragmentTransaction remove(androidx.fragment.app.Fragment);
-    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>);
+    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
     method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment);
-    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, String?);
+    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
     method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment, String?);
     method public androidx.fragment.app.FragmentTransaction runOnCommit(Runnable);
     method @Deprecated public androidx.fragment.app.FragmentTransaction setAllowOptimization(boolean);
diff --git a/fragment/fragment/api/restricted_1.2.0-alpha02.txt b/fragment/fragment/api/restricted_1.2.0-alpha02.txt
index 3a73588..e2cf936 100644
--- a/fragment/fragment/api/restricted_1.2.0-alpha02.txt
+++ b/fragment/fragment/api/restricted_1.2.0-alpha02.txt
@@ -364,11 +364,11 @@
 
   public abstract class FragmentTransaction {
     ctor @Deprecated public FragmentTransaction();
-    method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, String?);
+    method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
     method public androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.Fragment, String?);
-    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>);
+    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
     method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment);
-    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, String?);
+    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
     method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment, String?);
     method public androidx.fragment.app.FragmentTransaction addSharedElement(android.view.View, String);
     method public androidx.fragment.app.FragmentTransaction addToBackStack(String?);
@@ -383,9 +383,9 @@
     method public boolean isAddToBackStackAllowed();
     method public boolean isEmpty();
     method public androidx.fragment.app.FragmentTransaction remove(androidx.fragment.app.Fragment);
-    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>);
+    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
     method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment);
-    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, String?);
+    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
     method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment, String?);
     method public androidx.fragment.app.FragmentTransaction runOnCommit(Runnable);
     method @Deprecated public androidx.fragment.app.FragmentTransaction setAllowOptimization(boolean);
diff --git a/fragment/fragment/api/restricted_current.txt b/fragment/fragment/api/restricted_current.txt
index 3a73588..e2cf936 100644
--- a/fragment/fragment/api/restricted_current.txt
+++ b/fragment/fragment/api/restricted_current.txt
@@ -364,11 +364,11 @@
 
   public abstract class FragmentTransaction {
     ctor @Deprecated public FragmentTransaction();
-    method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, String?);
+    method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
     method public androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.Fragment, String?);
-    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>);
+    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
     method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment);
-    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, String?);
+    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
     method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment, String?);
     method public androidx.fragment.app.FragmentTransaction addSharedElement(android.view.View, String);
     method public androidx.fragment.app.FragmentTransaction addToBackStack(String?);
@@ -383,9 +383,9 @@
     method public boolean isAddToBackStackAllowed();
     method public boolean isEmpty();
     method public androidx.fragment.app.FragmentTransaction remove(androidx.fragment.app.Fragment);
-    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>);
+    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
     method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment);
-    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, String?);
+    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
     method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment, String?);
     method public androidx.fragment.app.FragmentTransaction runOnCommit(Runnable);
     method @Deprecated public androidx.fragment.app.FragmentTransaction setAllowOptimization(boolean);
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.kt
index 4da5984..5d7c1ac 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.kt
@@ -30,6 +30,7 @@
 import androidx.core.view.ViewCompat
 import androidx.fragment.app.test.FragmentTestActivity
 import androidx.fragment.test.R
+import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.ViewModelStore
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
@@ -704,7 +705,8 @@
         var resourceId: Int = 0
 
         override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? {
-            if (nextAnim == 0) {
+            if (nextAnim == 0 ||
+                viewLifecycleOwner.lifecycle.currentState == Lifecycle.State.DESTROYED) {
                 return null
             }
             numAnimators++
@@ -771,14 +773,17 @@
                     }
 
                     override fun onAnimationEnd(animation: Animation) {
-                        if (enter) {
-                            enterEndCount++
-                            enterLatch.countDown()
-                        } else {
-                            exitEndCount++
-                            // When exiting, the view is detached after onAnimationEnd,
-                            // so wait one frame to count down the latch
-                            createdView.post { exitLatch.countDown() }
+                        if (viewLifecycleOwner.lifecycle.currentState
+                            != Lifecycle.State.DESTROYED) {
+                            if (enter) {
+                                enterEndCount++
+                                enterLatch.countDown()
+                            } else {
+                                exitEndCount++
+                                // When exiting, the view is detached after onAnimationEnd,
+                                // so wait one frame to count down the latch
+                                createdView.post { exitLatch.countDown() }
+                            }
                         }
                     }
 
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransactionTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransactionTest.kt
index 6059f65..2068923 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransactionTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransactionTest.kt
@@ -86,8 +86,9 @@
     @Test
     @UiThreadTest
     fun testAddTransactionByClassName() {
+        val args = Bundle()
         activity.supportFragmentManager.beginTransaction()
-            .add(R.id.content, CorrectFragment::class.java)
+            .add(R.id.content, CorrectFragment::class.java, args)
             .addToBackStack(null)
             .commit()
         activity.supportFragmentManager.executePendingTransactions()
@@ -95,6 +96,8 @@
         val fragment = activity.supportFragmentManager.findFragmentById(R.id.content)
         assertThat(fragment)
             .isInstanceOf(CorrectFragment::class.java)
+        assertThat(fragment?.arguments)
+            .isSameInstanceAs(args)
     }
 
     @Test
@@ -237,8 +240,9 @@
         assertThat(activity.supportFragmentManager.findFragmentById(R.id.content))
             .isSameInstanceAs(firstFragment)
 
+        val args = Bundle()
         activity.supportFragmentManager.beginTransaction()
-            .add(R.id.content, CorrectFragment::class.java)
+            .add(R.id.content, CorrectFragment::class.java, args)
             .addToBackStack(null)
             .commit()
         activity.supportFragmentManager.executePendingTransactions()
@@ -246,6 +250,8 @@
         val fragment = activity.supportFragmentManager.findFragmentById(R.id.content)
         assertThat(fragment)
             .isInstanceOf(CorrectFragment::class.java)
+        assertThat(fragment?.arguments)
+            .isSameInstanceAs(args)
     }
 
     @Test
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/StrictViewFragment.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/StrictViewFragment.kt
index cc7deadd..e58aea0 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/StrictViewFragment.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/StrictViewFragment.kt
@@ -59,4 +59,13 @@
         checkState("onDestroyView", State.CREATED)
         onDestroyViewCalled = true
     }
+
+    override fun onDestroy() {
+        if (onCreateViewCalled) {
+            assertWithMessage("onDestroyView should be called before on Destroy")
+                .that(onDestroyViewCalled)
+                .isTrue()
+        }
+        super.onDestroy()
+    }
 }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
index 3eab37a..4282de9 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
@@ -177,6 +177,7 @@
      * Callback interface for listening to fragment state changes that happen
      * within a given FragmentManager.
      */
+    @SuppressWarnings("unused")
     public abstract static class FragmentLifecycleCallbacks {
         /**
          * Called right before the fragment's {@link Fragment#onAttach(Context)} method is called.
@@ -1142,7 +1143,7 @@
             if (f.mFromLayout && !f.mInLayout) {
                 return;
             }
-            if (f.getAnimatingAway() != null || f.getAnimator() != null) {
+            if (f.mState < newState && (f.getAnimatingAway() != null || f.getAnimator() != null)) {
                 // The fragment is currently being animated...  but!  Now we
                 // want to move our state back up.  Give up on waiting for the
                 // animation, move to whatever the final state should be once
@@ -1341,13 +1342,11 @@
                                 saveFragmentViewState(f);
                             }
                         }
-                        f.performDestroyView();
-                        dispatchOnFragmentViewDestroyed(f, false);
+                        AnimationOrAnimator anim = null;
                         if (f.mView != null && f.mContainer != null) {
                             // Stop any current animations:
                             f.mContainer.endViewTransition(f.mView);
                             f.mView.clearAnimation();
-                            AnimationOrAnimator anim = null;
                             // If parent is being removed, no need to handle child animations.
                             if (!f.isRemovingParent()) {
                                 if (mCurState > Fragment.INITIALIZING && !mDestroyed
@@ -1362,14 +1361,9 @@
                                 f.mContainer.removeView(f.mView);
                             }
                         }
-                        f.mContainer = null;
-                        f.mView = null;
-                        // Set here to ensure that Observers are called after
-                        // the Fragment's view is set to null
-                        f.mViewLifecycleOwner = null;
-                        f.mViewLifecycleOwnerLiveData.setValue(null);
-                        f.mInnerView = null;
-                        f.mInLayout = false;
+                        if (anim == null) {
+                            destroyFragmentView(f);
+                        }
                     }
                     // fall through
                 case Fragment.CREATED:
@@ -1485,6 +1479,7 @@
                         public void run() {
                             if (fragment.getAnimatingAway() != null) {
                                 fragment.setAnimatingAway(null);
+                                destroyFragmentView(fragment);
                                 moveToState(fragment, fragment.getStateAfterAnimating(), 0, false);
                             }
                         }
@@ -1508,6 +1503,7 @@
                     Animator animator = fragment.getAnimator();
                     fragment.setAnimator(null);
                     if (animator != null && container.indexOfChild(viewToAnimate) < 0) {
+                        destroyFragmentView(fragment);
                         moveToState(fragment, fragment.getStateAfterAnimating(), 0, false);
                     }
                 }
@@ -1517,6 +1513,19 @@
         }
     }
 
+    void destroyFragmentView(@NonNull Fragment fragment) {
+        fragment.performDestroyView();
+        dispatchOnFragmentViewDestroyed(fragment, false);
+        fragment.mContainer = null;
+        fragment.mView = null;
+        // Set here to ensure that Observers are called after
+        // the Fragment's view is set to null
+        fragment.mViewLifecycleOwner = null;
+        fragment.mViewLifecycleOwnerLiveData.setValue(null);
+        fragment.mInnerView = null;
+        fragment.mInLayout = false;
+    }
+
     void moveToState(Fragment f) {
         moveToState(f, mCurState, 0, false);
     }
@@ -2528,6 +2537,7 @@
                         animatingAway.clearAnimation();
                     }
                     fragment.setAnimatingAway(null);
+                    destroyFragmentView(fragment);
                     moveToState(fragment, stateAfterAnimating, 0, false);
                 } else if (fragment.getAnimator() != null) {
                     fragment.getAnimator().end();
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java
index c2622c5..d161dfb 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java
@@ -136,7 +136,8 @@
     }
 
     @NonNull
-    private Fragment createFragment(@NonNull Class<? extends Fragment> fragmentClass) {
+    private Fragment createFragment(@NonNull Class<? extends Fragment> fragmentClass,
+            @Nullable Bundle args) {
         if (mFragmentFactory == null) {
             throw new IllegalStateException("Creating a Fragment requires that this "
                     + "FragmentTransaction was built with FragmentManager.beginTransaction()");
@@ -145,16 +146,20 @@
             throw new IllegalStateException("The FragmentManager must be attached to its"
                     + "host to create a Fragment");
         }
-        return mFragmentFactory.instantiate(mClassLoader, fragmentClass.getName());
+        Fragment fragment = mFragmentFactory.instantiate(mClassLoader, fragmentClass.getName());
+        if (args != null) {
+            fragment.setArguments(args);
+        }
+        return fragment;
     }
 
     /**
-     * Calls {@link #add(int, Class, String)} with a 0 containerViewId.
+     * Calls {@link #add(int, Class, Bundle, String)} with a 0 containerViewId.
      */
     @NonNull
     public final FragmentTransaction add(@NonNull Class<? extends Fragment> fragmentClass,
-            @Nullable String tag)  {
-        return add(createFragment(fragmentClass), tag);
+            @Nullable Bundle args, @Nullable String tag)  {
+        return add(createFragment(fragmentClass, args), tag);
     }
 
     /**
@@ -167,12 +172,12 @@
     }
 
     /**
-     * Calls {@link #add(int, Class, String)} with a null tag.
+     * Calls {@link #add(int, Class, Bundle, String)} with a null tag.
      */
     @NonNull
     public final FragmentTransaction add(@IdRes int containerViewId,
-            @NonNull Class<? extends Fragment> fragmentClass)  {
-        return add(containerViewId, createFragment(fragmentClass));
+            @NonNull Class<? extends Fragment> fragmentClass, @Nullable Bundle args)  {
+        return add(containerViewId, createFragment(fragmentClass, args));
     }
 
     /**
@@ -193,6 +198,7 @@
      * to be placed in.  If 0, it will not be placed in a container.
      * @param fragmentClass The fragment to be added, created via the
      * {@link FragmentManager#getFragmentFactory() FragmentManager's FragmentFactory}.
+     * @param args Optional arguments to be set on the fragment.
      * @param tag Optional tag name for the fragment, to later retrieve the
      * fragment with {@link FragmentManager#findFragmentByTag(String)
      * FragmentManager.findFragmentByTag(String)}.
@@ -201,8 +207,9 @@
      */
     @NonNull
     public final FragmentTransaction add(@IdRes int containerViewId,
-            @NonNull Class<? extends Fragment> fragmentClass, @Nullable String tag) {
-        return add(containerViewId, createFragment(fragmentClass), tag);
+            @NonNull Class<? extends Fragment> fragmentClass,
+            @Nullable Bundle args, @Nullable String tag) {
+        return add(containerViewId, createFragment(fragmentClass, args), tag);
     }
 
     /**
@@ -263,12 +270,12 @@
     }
 
     /**
-     * Calls {@link #replace(int, Class, String)} with a null tag.
+     * Calls {@link #replace(int, Class, Bundle, String)} with a null tag.
      */
     @NonNull
     public final FragmentTransaction replace(@IdRes int containerViewId,
-            @NonNull Class<? extends Fragment> fragmentClass) {
-        return replace(containerViewId, fragmentClass, null);
+            @NonNull Class<? extends Fragment> fragmentClass, @Nullable Bundle args) {
+        return replace(containerViewId, fragmentClass, args, null);
     }
 
     /**
@@ -290,6 +297,7 @@
      * to be replaced.
      * @param fragmentClass The new fragment to place in the container, created via the
      * {@link FragmentManager#getFragmentFactory() FragmentManager's FragmentFactory}.
+     * @param args Optional arguments to be set on the fragment.
      * @param tag Optional tag name for the fragment, to later retrieve the
      * fragment with {@link FragmentManager#findFragmentByTag(String)
      * FragmentManager.findFragmentByTag(String)}.
@@ -298,8 +306,9 @@
      */
     @NonNull
     public final FragmentTransaction replace(@IdRes int containerViewId,
-            @NonNull Class<? extends Fragment> fragmentClass, @Nullable String tag) {
-        return replace(containerViewId, createFragment(fragmentClass), tag);
+            @NonNull Class<? extends Fragment> fragmentClass,
+            @Nullable Bundle args, @Nullable String tag) {
+        return replace(containerViewId, createFragment(fragmentClass, args), tag);
     }
 
     /**
diff --git a/gradle.properties b/gradle.properties
index 408b78b..cac7300 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -4,5 +4,4 @@
 org.gradle.parallel=true
 org.gradle.caching=true
 android.builder.sdkDownload=false
-android.enableR8=false
 android.uniquePackageNames=true
\ No newline at end of file
diff --git a/jetifier/jetifier/migration.config b/jetifier/jetifier/migration.config
index 6b276ed7..03e7d2a 100644
--- a/jetifier/jetifier/migration.config
+++ b/jetifier/jetifier/migration.config
@@ -56,6 +56,10 @@
       "to": "androidx/recyclerview/R{0}"
     },
     {
+      "from": "android/support/fragment/R(.*)",
+      "to": "androidx/fragment/R{0}"
+    },
+    {
       "from": "android/support/v7/appcompat/R(.*)",
       "to": "androidx/appcompat/R{0}"
     },
@@ -638,10 +642,6 @@
       "to": "ignore"
     },
     {
-      "from": "androidx/fragment/R(.*)",
-      "to": "ignore"
-    },
-    {
       "from": "androidx/transition/(.*)",
       "to": "ignore"
     },
diff --git a/lifecycle/integration-tests/incrementality/build.gradle b/lifecycle/integration-tests/incrementality/build.gradle
index 1aabfeee..a20235d 100644
--- a/lifecycle/integration-tests/incrementality/build.gradle
+++ b/lifecycle/integration-tests/incrementality/build.gradle
@@ -66,6 +66,6 @@
 // lifecycle-common and annotation are the dependencies of lifecycle-compiler
 tasks.findByPath("test").dependsOn(tasks.findByPath(":lifecycle:lifecycle-compiler:uploadArchives"),
         tasks.findByPath(":lifecycle:lifecycle-common:uploadArchives"),
-        tasks.findByPath(":annotation:uploadArchives"))
+        tasks.findByPath(":annotation:annotation:uploadArchives"))
 
 uploadArchives.enabled = false
\ No newline at end of file
diff --git a/lifecycle/integration-tests/testapp/build.gradle b/lifecycle/integration-tests/testapp/build.gradle
index a770aba..f621691 100644
--- a/lifecycle/integration-tests/testapp/build.gradle
+++ b/lifecycle/integration-tests/testapp/build.gradle
@@ -52,5 +52,3 @@
     testImplementation(MOCKITO_CORE)
     testAnnotationProcessor(project(":lifecycle:lifecycle-compiler"))
 }
-
-tasks['check'].dependsOn(tasks['connectedCheck'])
diff --git a/lifecycle/lifecycle-extensions/build.gradle b/lifecycle/lifecycle-extensions/build.gradle
index 754870d..f8bf748 100644
--- a/lifecycle/lifecycle-extensions/build.gradle
+++ b/lifecycle/lifecycle-extensions/build.gradle
@@ -28,8 +28,8 @@
 
 dependencies {
     api(project(":lifecycle:lifecycle-runtime"))
-    api(project(":arch:core-common"))
-    api(project(":arch:core-runtime"))
+    api("androidx.arch.core:core-common:2.1.0-rc01")
+    api("androidx.arch.core:core-runtime:2.1.0-rc01")
     api(project(":fragment:fragment"))
     api(project(":lifecycle:lifecycle-common"))
     api(project(":lifecycle:lifecycle-livedata"))
@@ -37,7 +37,7 @@
     api(project(":lifecycle:lifecycle-service"))
     api(project(":lifecycle:lifecycle-viewmodel"))
 
-    testImplementation(project(":arch:core-testing"))
+    testImplementation("androidx.arch.core:core-testing:2.1.0-rc01")
     testImplementation(JUNIT)
     testImplementation(MOCKITO_CORE)
 
@@ -48,7 +48,7 @@
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(SUPPORT_APPCOMPAT, libs.support_exclude_config)
+    androidTestImplementation(SUPPORT_APPCOMPAT)
     androidTestImplementation(project(":internal-testutils"))
 }
 
diff --git a/lifecycle/lifecycle-livedata-core-ktx/build.gradle b/lifecycle/lifecycle-livedata-core-ktx/build.gradle
index 256ff30..4c15329 100644
--- a/lifecycle/lifecycle-livedata-core-ktx/build.gradle
+++ b/lifecycle/lifecycle-livedata-core-ktx/build.gradle
@@ -37,7 +37,7 @@
     api(project(":lifecycle:lifecycle-livedata-core"))
     api(KOTLIN_STDLIB)
     testImplementation(project(":lifecycle:lifecycle-runtime"))
-    testImplementation(project(":arch:core-testing"))
+    testImplementation("androidx.arch.core:core-testing:2.1.0-rc01")
     testImplementation(JUNIT)
     testImplementation(TRUTH)
 }
diff --git a/lifecycle/lifecycle-livedata-core/build.gradle b/lifecycle/lifecycle-livedata-core/build.gradle
index e6f31a5..c9dd807 100644
--- a/lifecycle/lifecycle-livedata-core/build.gradle
+++ b/lifecycle/lifecycle-livedata-core/build.gradle
@@ -33,12 +33,12 @@
 }
 
 dependencies {
-    implementation(project(":arch:core-common"))
-    implementation(project(":arch:core-runtime"))
+    implementation("androidx.arch.core:core-common:2.1.0-rc01")
+    implementation("androidx.arch.core:core-runtime:2.1.0-rc01")
     api(project(":lifecycle:lifecycle-common"))
 
     testImplementation(project(":lifecycle:lifecycle-runtime"))
-    testImplementation(project(":arch:core-testing"))
+    testImplementation("androidx.arch.core:core-testing:2.1.0-rc01")
     testImplementation(JUNIT)
     testImplementation(MOCKITO_CORE)
 }
diff --git a/lifecycle/lifecycle-livedata-ktx/build.gradle b/lifecycle/lifecycle-livedata-ktx/build.gradle
index b289a13..6294159 100644
--- a/lifecycle/lifecycle-livedata-ktx/build.gradle
+++ b/lifecycle/lifecycle-livedata-ktx/build.gradle
@@ -43,7 +43,7 @@
     api(KOTLIN_STDLIB)
     api(KOTLIN_COROUTINES_CORE)
     testImplementation(project(":lifecycle:lifecycle-runtime"))
-    testImplementation(project(":arch:core-testing"))
+    testImplementation("androidx.arch.core:core-testing:2.1.0-rc01")
     testImplementation(JUNIT)
     testImplementation(TRUTH)
     testImplementation(KOTLIN_COROUTINES_TEST)
diff --git a/lifecycle/lifecycle-livedata/build.gradle b/lifecycle/lifecycle-livedata/build.gradle
index 7b90f24..459085c 100644
--- a/lifecycle/lifecycle-livedata/build.gradle
+++ b/lifecycle/lifecycle-livedata/build.gradle
@@ -26,12 +26,12 @@
 }
 
 dependencies {
-    implementation(project(":arch:core-common"))
-    api(project(":arch:core-runtime"))
+    implementation("androidx.arch.core:core-common:2.1.0-rc01")
+    api("androidx.arch.core:core-runtime:2.1.0-rc01")
     api(project(":lifecycle:lifecycle-livedata-core"))
 
     testImplementation(project(":lifecycle:lifecycle-runtime"))
-    testImplementation(project(":arch:core-testing"))
+    testImplementation("androidx.arch.core:core-testing:2.1.0-rc01")
     testImplementation(JUNIT)
     testImplementation(MOCKITO_CORE)
 }
diff --git a/lifecycle/lifecycle-reactivestreams-ktx/build.gradle b/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
index 7e02999..e6bb236 100644
--- a/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
+++ b/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
@@ -33,7 +33,7 @@
   testImplementation(JUNIT)
   testImplementation(RX_JAVA)
   testImplementation(TRUTH)
-  testImplementation(project(":arch:core-testing"))
+  testImplementation("androidx.arch.core:core-testing:2.1.0-rc01")
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-reactivestreams/build.gradle b/lifecycle/lifecycle-reactivestreams/build.gradle
index b4fe266..cb9abe2 100644
--- a/lifecycle/lifecycle-reactivestreams/build.gradle
+++ b/lifecycle/lifecycle-reactivestreams/build.gradle
@@ -26,7 +26,7 @@
 }
 
 dependencies {
-    api(project(":arch:core-common"))
+    api("androidx.arch.core:core-common:2.1.0-rc01")
     api(project(":lifecycle:lifecycle-common"))
     api(project(":lifecycle:lifecycle-livedata"))
     api(project(":lifecycle:lifecycle-runtime"))
@@ -37,7 +37,7 @@
 
     testImplementation(JUNIT)
     testImplementation(RX_JAVA)
-    testImplementation(project(":arch:core-testing"))
+    testImplementation("androidx.arch.core:core-testing:2.1.0-rc01")
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-runtime/build.gradle b/lifecycle/lifecycle-runtime/build.gradle
index baafbee..6eb77fe 100644
--- a/lifecycle/lifecycle-runtime/build.gradle
+++ b/lifecycle/lifecycle-runtime/build.gradle
@@ -21,7 +21,7 @@
 
 dependencies {
     api(project(":lifecycle:lifecycle-common"))
-    api(project(":arch:core-common"))
+    api("androidx.arch.core:core-common:2.1.0-rc01")
     // necessary for IJ to resolve dependencies.
     api("androidx.annotation:annotation:1.1.0")
 
diff --git a/lifecycle/lifecycle-service/build.gradle b/lifecycle/lifecycle-service/build.gradle
index 934b2ef..108cdee 100644
--- a/lifecycle/lifecycle-service/build.gradle
+++ b/lifecycle/lifecycle-service/build.gradle
@@ -31,7 +31,7 @@
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(SUPPORT_CORE_UTILS, libs.support_exclude_config)
+    androidTestImplementation(SUPPORT_CORE_UTILS)
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/build.gradle b/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
index 51f2e88..2d58931 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
+++ b/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
@@ -34,7 +34,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.0.0")
-    api(project(":savedstate"))
+    api("androidx.savedstate:savedstate:1.0.0-rc01")
     api(project(":lifecycle:lifecycle-livedata-core"))
     api(project(":lifecycle:lifecycle-viewmodel"))
 
diff --git a/loader/loader/build.gradle b/loader/loader/build.gradle
index ff3e35c..84bbe11 100644
--- a/loader/loader/build.gradle
+++ b/loader/loader/build.gradle
@@ -17,10 +17,10 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.0.0")
+    api(ARCH_LIFECYCLE_VIEWMODEL)
     implementation("androidx.core:core:1.0.0")
     implementation("androidx.collection:collection:1.0.0")
-    implementation(ARCH_LIFECYCLE_LIVEDATA_CORE, libs.exclude_annotations_transitive)
-    api(ARCH_LIFECYCLE_VIEWMODEL, libs.exclude_annotations_transitive)
+    implementation(ARCH_LIFECYCLE_LIVEDATA_CORE,)
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/media/version-compat-tests/lib/build.gradle b/media/version-compat-tests/lib/build.gradle
index bd1041d..59e0211 100644
--- a/media/version-compat-tests/lib/build.gradle
+++ b/media/version-compat-tests/lib/build.gradle
@@ -22,8 +22,8 @@
 }
 
 dependencies {
-    api(project(':annotation'))
-    api(project(':versionedparcelable'))
+    api(project(":annotation:annotation"))
+    api(project(":versionedparcelable"))
     implementation(JUNIT)
 }
 
diff --git a/media2/session/version-compat-tests/common/build.gradle b/media2/session/version-compat-tests/common/build.gradle
index 3314a46..4b5557e 100644
--- a/media2/session/version-compat-tests/common/build.gradle
+++ b/media2/session/version-compat-tests/common/build.gradle
@@ -22,8 +22,8 @@
 }
 
 dependencies {
-    api(project(':annotation'))
-    api(project(':versionedparcelable'))
+    api(project(":annotation:annotation"))
+    api(project(":versionedparcelable"))
     implementation(JUNIT)
 }
 
diff --git a/media2/widget/src/androidTest/java/androidx/media2/widget/VideoView_WithPlayerTest.java b/media2/widget/src/androidTest/java/androidx/media2/widget/VideoView_WithPlayerTest.java
index bd1c4b4..223a425 100644
--- a/media2/widget/src/androidTest/java/androidx/media2/widget/VideoView_WithPlayerTest.java
+++ b/media2/widget/src/androidTest/java/androidx/media2/widget/VideoView_WithPlayerTest.java
@@ -17,6 +17,7 @@
 package androidx.media2.widget;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -26,7 +27,14 @@
 
 import android.app.Activity;
 import android.content.res.AssetFileDescriptor;
+import android.graphics.Bitmap;
+import android.os.Build;
+import android.os.Handler;
+import android.os.HandlerThread;
 import android.os.ParcelFileDescriptor;
+import android.util.Log;
+import android.view.PixelCopy;
+import android.view.SurfaceView;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -55,15 +63,16 @@
 @RunWith(Parameterized.class)
 @LargeTest
 public class VideoView_WithPlayerTest extends MediaWidgetTestBase {
+    static final String TAG = "VideoView_WithPlayerTest";
     @Parameterized.Parameters(name = "PlayerType={0}")
     public static List<String> getPlayerTypes() {
         return Arrays.asList(PLAYER_TYPE_MEDIA_CONTROLLER, PLAYER_TYPE_MEDIA_PLAYER);
     }
-
     private String mPlayerType;
     private Activity mActivity;
     private VideoView mVideoView;
     private MediaItem mMediaItem;
+    private SynchronousPixelCopy mPixelCopyHelper;
 
     @Rule
     public ActivityTestRule<VideoViewTestActivity> mActivityRule =
@@ -78,6 +87,7 @@
         mActivity = mActivityRule.getActivity();
         mVideoView = mActivity.findViewById(R.id.videoview);
         mMediaItem = createTestMediaItem();
+        mPixelCopyHelper = new SynchronousPixelCopy();
 
         setKeepScreenOn(mActivityRule);
         checkAttachedToWindow(mVideoView);
@@ -91,6 +101,7 @@
                 closeAll();
             }
         });
+        mPixelCopyHelper.release();
     }
 
     @Test
@@ -105,6 +116,7 @@
 
         playerWrapper.play();
         assertTrue(callback.mPlayingLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
+        checkVideoRendering();
     }
 
     @Test
@@ -126,6 +138,7 @@
 
         playerWrapper.play();
         assertTrue(callback.mPlayingLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
+        checkVideoRendering();
     }
 
     @Test
@@ -154,6 +167,7 @@
 
         playerWrapper.play();
         assertTrue(callback.mPlayingLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
+        checkVideoRendering();
     }
 
     @Test
@@ -186,6 +200,7 @@
 
         playerWrapper.play();
         assertTrue(callback.mPlayingLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
+        checkVideoRendering();
 
         mActivityRule.runOnUiThread(new Runnable() {
             @Override
@@ -195,6 +210,7 @@
         });
         verify(mockViewTypeListener, timeout(WAIT_TIME_MS))
                 .onViewTypeChanged(mVideoView, VideoView.VIEW_TYPE_TEXTUREVIEW);
+        checkVideoRendering();
     }
 
     // @UiThreadTest will be ignored by Parameterized test runner (b/30746303)
@@ -258,4 +274,102 @@
             @Nullable MediaItem item) {
         return createPlayerWrapperOfType(callback, item, mPlayerType);
     }
+
+    private void checkVideoRendering() throws InterruptedException {
+        if (Build.VERSION.SDK_INT == 28) {
+            // TODO: This if-block for API 28 should be removed. (b/137321781)
+            return;
+        }
+        if (Build.VERSION.SDK_INT >= 24) {
+            final int bufferQueueToleranceMs = 200;
+            final int elapsedTimeForSecondScreenshotMs = 100;
+
+            // Tolerance until the video buffers are actually queued.
+            Thread.sleep(bufferQueueToleranceMs);
+            Bitmap beforeBitmap = getVideoScreenshot();
+            Thread.sleep(elapsedTimeForSecondScreenshotMs);
+            Bitmap afterBitmap = getVideoScreenshot();
+            assertFalse(afterBitmap.sameAs(beforeBitmap));
+        }
+    }
+
+    private Bitmap getVideoScreenshot() {
+        Bitmap bitmap = Bitmap.createBitmap(mVideoView.getWidth(),
+                mVideoView.getHeight(), Bitmap.Config.RGB_565);
+        if (mVideoView.getViewType() == mVideoView.VIEW_TYPE_SURFACEVIEW) {
+            int copyResult = mPixelCopyHelper.request(mVideoView.mSurfaceView, bitmap);
+            assertEquals("PixelCopy failed.", PixelCopy.SUCCESS, copyResult);
+        } else {
+            bitmap = mVideoView.mTextureView.getBitmap(bitmap);
+        }
+        return bitmap;
+    }
+
+    private static class SynchronousPixelCopy {
+        private Handler mHandler;
+        private HandlerThread mHandlerThread;
+        private int mStatus = PixelCopy.SUCCESS;
+
+        SynchronousPixelCopy() {
+            if (Build.VERSION.SDK_INT == 28) {
+                // TODO: This if-block for API 28 should be removed. (b/137321781)
+                return;
+            }
+            if (Build.VERSION.SDK_INT >= 24) {
+                this.mHandlerThread = new HandlerThread("PixelCopyHelper");
+                mHandlerThread.start();
+                this.mHandler = new Handler(mHandlerThread.getLooper());
+            }
+        }
+
+        public void release() {
+            if (Build.VERSION.SDK_INT == 28) {
+                // TODO: This if-block for API 28 should be removed. (b/137321781)
+                return;
+            }
+            if (Build.VERSION.SDK_INT >= 24) {
+                if (mHandlerThread.isAlive()) {
+                    mHandlerThread.quitSafely();
+                }
+            }
+        }
+
+        public int request(SurfaceView source, Bitmap dest) {
+            if (Build.VERSION.SDK_INT == 28) {
+                // TODO: This if-block for API 28 should be removed. (b/137321781)
+                return -1;
+            }
+            if (Build.VERSION.SDK_INT < 24) {
+                return -1;
+            }
+            synchronized (this) {
+                try {
+                    PixelCopy.request(source, dest, new PixelCopy.OnPixelCopyFinishedListener() {
+                        @Override
+                        public void onPixelCopyFinished(int copyResult) {
+                            synchronized (this) {
+                                mStatus = copyResult;
+                                this.notify();
+                            }
+                        }
+                    }, mHandler);
+                    return getResultLocked();
+                } catch (Exception e) {
+                    Log.e(TAG, "Exception occurred when copying a SurfaceView.", e);
+                    return -1;
+                }
+            }
+        }
+
+        private int getResultLocked() {
+            try {
+                this.wait(1000);
+            } catch (InterruptedException e) {
+                /* PixelCopy request didn't complete within 1s */
+                mStatus = PixelCopy.ERROR_TIMEOUT;
+            }
+            Log.e(TAG, "PixelCopyResult: " + mStatus);
+            return mStatus;
+        }
+    }
 }
diff --git a/navigation/integration-tests/testapp/src/main/java/androidx/navigation/testapp/MainFragment.kt b/navigation/integration-tests/testapp/src/main/java/androidx/navigation/testapp/MainFragment.kt
index e01289b..73e15ce 100644
--- a/navigation/integration-tests/testapp/src/main/java/androidx/navigation/testapp/MainFragment.kt
+++ b/navigation/integration-tests/testapp/src/main/java/androidx/navigation/testapp/MainFragment.kt
@@ -16,6 +16,7 @@
 
 package androidx.navigation.testapp
 
+import android.graphics.Color
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
@@ -46,6 +47,13 @@
         val myarg = arguments?.getString("myarg")
         tv.text = myarg
 
+        view.setBackgroundColor(
+            if (myarg == "one") {
+                Color.GREEN
+            } else {
+                Color.RED
+            })
+
         val b = view.findViewById<Button>(R.id.next_button)
         ViewCompat.setTransitionName(b, "next")
         b.setOnClickListener {
diff --git a/navigation/integration-tests/testapp/src/main/res/anim/nav_default_enter_anim.xml b/navigation/integration-tests/testapp/src/main/res/anim/nav_default_enter_anim.xml
new file mode 100644
index 0000000..adea235
--- /dev/null
+++ b/navigation/integration-tests/testapp/src/main/res/anim/nav_default_enter_anim.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2019 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate android:fromXDelta="100%"
+        android:toXDelta="0%"
+        android:duration="@integer/config_navAnimTime"/>
+</set>
\ No newline at end of file
diff --git a/navigation/integration-tests/testapp/src/main/res/anim/nav_default_exit_anim.xml b/navigation/integration-tests/testapp/src/main/res/anim/nav_default_exit_anim.xml
new file mode 100644
index 0000000..877aef1
--- /dev/null
+++ b/navigation/integration-tests/testapp/src/main/res/anim/nav_default_exit_anim.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2019 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate android:duration="@integer/config_navAnimTime"/>
+</set>
\ No newline at end of file
diff --git a/navigation/integration-tests/testapp/src/main/res/anim/nav_default_pop_enter_anim.xml b/navigation/integration-tests/testapp/src/main/res/anim/nav_default_pop_enter_anim.xml
new file mode 100644
index 0000000..fdaff75
--- /dev/null
+++ b/navigation/integration-tests/testapp/src/main/res/anim/nav_default_pop_enter_anim.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2019 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate android:fromXDelta="-100%"
+        android:toXDelta="0%"
+        android:duration="@integer/config_navAnimTime"/>
+</set>
\ No newline at end of file
diff --git a/navigation/integration-tests/testapp/src/main/res/anim/nav_default_pop_exit_anim.xml b/navigation/integration-tests/testapp/src/main/res/anim/nav_default_pop_exit_anim.xml
new file mode 100644
index 0000000..877aef1
--- /dev/null
+++ b/navigation/integration-tests/testapp/src/main/res/anim/nav_default_pop_exit_anim.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2019 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate android:duration="@integer/config_navAnimTime"/>
+</set>
\ No newline at end of file
diff --git a/navigation/navigation-common-ktx/api/2.2.0-alpha01.txt b/navigation/navigation-common-ktx/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..133a124
--- /dev/null
+++ b/navigation/navigation-common-ktx/api/2.2.0-alpha01.txt
@@ -0,0 +1,129 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  @androidx.navigation.NavOptionsDsl public final class AnimBuilder {
+    ctor public AnimBuilder();
+    method public int getEnter();
+    method public int getExit();
+    method public int getPopEnter();
+    method public int getPopExit();
+    method public void setEnter(int p);
+    method public void setExit(int p);
+    method public void setPopEnter(int p);
+    method public void setPopExit(int p);
+    property public final int enter;
+    property public final int exit;
+    property public final int popEnter;
+    property public final int popExit;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavActionBuilder {
+    ctor public NavActionBuilder();
+    method public int getDestinationId();
+    method public void navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+    method public void setDestinationId(int p);
+    property public final int destinationId;
+  }
+
+  public final class NavArgsLazy<Args extends androidx.navigation.NavArgs> implements kotlin.Lazy<Args> {
+    ctor public NavArgsLazy(kotlin.reflect.KClass<Args> navArgsClass, kotlin.jvm.functions.Function0<android.os.Bundle> argumentProducer);
+    method public Args getValue();
+    method public boolean isInitialized();
+    property public Args value;
+  }
+
+  public final class NavArgsLazyKt {
+    ctor public NavArgsLazyKt();
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavArgumentBuilder {
+    ctor public NavArgumentBuilder();
+    method public androidx.navigation.NavArgument build();
+    method public Object? getDefaultValue();
+    method public boolean getNullable();
+    method public androidx.navigation.NavType<?> getType();
+    method public void setDefaultValue(Object? value);
+    method public void setNullable(boolean value);
+    method public void setType(androidx.navigation.NavType<?> value);
+    property public final Object? defaultValue;
+    property public final boolean nullable;
+    property public final androidx.navigation.NavType<?> type;
+  }
+
+  @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
+    ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
+    method public final void action(int actionId, kotlin.jvm.functions.Function1<? super androidx.navigation.NavActionBuilder,kotlin.Unit> actionBuilder);
+    method public final void argument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> argumentBuilder);
+    method public D build();
+    method public final void deepLink(String uriPattern);
+    method public final int getId();
+    method public final CharSequence? getLabel();
+    method protected final androidx.navigation.Navigator<? extends D> getNavigator();
+    method public final void setLabel(CharSequence? p);
+    property public final CharSequence? label;
+  }
+
+  @kotlin.DslMarker public @interface NavDestinationDsl {
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.NavGraph> {
+    ctor public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    method public void addDestination(androidx.navigation.NavDestination destination);
+    method public androidx.navigation.NavGraph build();
+    method public <D extends androidx.navigation.NavDestination> void destination(androidx.navigation.NavDestinationBuilder<? extends D> navDestination);
+    method public androidx.navigation.NavigatorProvider getProvider();
+    method public operator void unaryPlus(androidx.navigation.NavDestination);
+  }
+
+  public final class NavGraphBuilderKt {
+    ctor public NavGraphBuilderKt();
+    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void navigation(androidx.navigation.NavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavGraphKt {
+    ctor public NavGraphKt();
+    method public static operator boolean contains(androidx.navigation.NavGraph, @IdRes int id);
+    method public static inline operator androidx.navigation.NavDestination get(androidx.navigation.NavGraph, @IdRes int id);
+    method public static inline operator void minusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+    method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+    method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavGraph other);
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class NavOptionsBuilder {
+    ctor public NavOptionsBuilder();
+    method public void anim(kotlin.jvm.functions.Function1<? super androidx.navigation.AnimBuilder,kotlin.Unit> animBuilder);
+    method public boolean getLaunchSingleTop();
+    method public int getPopUpTo();
+    method public void popUpTo(@IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
+    method public void setLaunchSingleTop(boolean p);
+    method public void setPopUpTo(int value);
+    property public final boolean launchSingleTop;
+    property public final int popUpTo;
+  }
+
+  public final class NavOptionsBuilderKt {
+    ctor public NavOptionsBuilderKt();
+    method public static androidx.navigation.NavOptions navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+  }
+
+  @kotlin.DslMarker public @interface NavOptionsDsl {
+  }
+
+  public final class NavigatorProviderKt {
+    ctor public NavigatorProviderKt();
+    method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, String name);
+    method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, kotlin.reflect.KClass<T> clazz);
+    method public static inline operator void plusAssign(androidx.navigation.NavigatorProvider, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+    method public static inline operator androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? set(androidx.navigation.NavigatorProvider, String name, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
+    ctor public PopUpToBuilder();
+    method public boolean getInclusive();
+    method public void setInclusive(boolean p);
+    property public final boolean inclusive;
+  }
+
+}
+
diff --git a/paging/runtime/ktx/api/res-2.2.0-alpha01.txt b/navigation/navigation-common-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from paging/runtime/ktx/api/res-2.2.0-alpha01.txt
copy to navigation/navigation-common-ktx/api/res-2.2.0-alpha01.txt
diff --git a/navigation/navigation-common-ktx/api/restricted_2.2.0-alpha01.txt b/navigation/navigation-common-ktx/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..133a124
--- /dev/null
+++ b/navigation/navigation-common-ktx/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,129 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  @androidx.navigation.NavOptionsDsl public final class AnimBuilder {
+    ctor public AnimBuilder();
+    method public int getEnter();
+    method public int getExit();
+    method public int getPopEnter();
+    method public int getPopExit();
+    method public void setEnter(int p);
+    method public void setExit(int p);
+    method public void setPopEnter(int p);
+    method public void setPopExit(int p);
+    property public final int enter;
+    property public final int exit;
+    property public final int popEnter;
+    property public final int popExit;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavActionBuilder {
+    ctor public NavActionBuilder();
+    method public int getDestinationId();
+    method public void navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+    method public void setDestinationId(int p);
+    property public final int destinationId;
+  }
+
+  public final class NavArgsLazy<Args extends androidx.navigation.NavArgs> implements kotlin.Lazy<Args> {
+    ctor public NavArgsLazy(kotlin.reflect.KClass<Args> navArgsClass, kotlin.jvm.functions.Function0<android.os.Bundle> argumentProducer);
+    method public Args getValue();
+    method public boolean isInitialized();
+    property public Args value;
+  }
+
+  public final class NavArgsLazyKt {
+    ctor public NavArgsLazyKt();
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavArgumentBuilder {
+    ctor public NavArgumentBuilder();
+    method public androidx.navigation.NavArgument build();
+    method public Object? getDefaultValue();
+    method public boolean getNullable();
+    method public androidx.navigation.NavType<?> getType();
+    method public void setDefaultValue(Object? value);
+    method public void setNullable(boolean value);
+    method public void setType(androidx.navigation.NavType<?> value);
+    property public final Object? defaultValue;
+    property public final boolean nullable;
+    property public final androidx.navigation.NavType<?> type;
+  }
+
+  @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
+    ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
+    method public final void action(int actionId, kotlin.jvm.functions.Function1<? super androidx.navigation.NavActionBuilder,kotlin.Unit> actionBuilder);
+    method public final void argument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> argumentBuilder);
+    method public D build();
+    method public final void deepLink(String uriPattern);
+    method public final int getId();
+    method public final CharSequence? getLabel();
+    method protected final androidx.navigation.Navigator<? extends D> getNavigator();
+    method public final void setLabel(CharSequence? p);
+    property public final CharSequence? label;
+  }
+
+  @kotlin.DslMarker public @interface NavDestinationDsl {
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.NavGraph> {
+    ctor public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    method public void addDestination(androidx.navigation.NavDestination destination);
+    method public androidx.navigation.NavGraph build();
+    method public <D extends androidx.navigation.NavDestination> void destination(androidx.navigation.NavDestinationBuilder<? extends D> navDestination);
+    method public androidx.navigation.NavigatorProvider getProvider();
+    method public operator void unaryPlus(androidx.navigation.NavDestination);
+  }
+
+  public final class NavGraphBuilderKt {
+    ctor public NavGraphBuilderKt();
+    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void navigation(androidx.navigation.NavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavGraphKt {
+    ctor public NavGraphKt();
+    method public static operator boolean contains(androidx.navigation.NavGraph, @IdRes int id);
+    method public static inline operator androidx.navigation.NavDestination get(androidx.navigation.NavGraph, @IdRes int id);
+    method public static inline operator void minusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+    method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+    method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavGraph other);
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class NavOptionsBuilder {
+    ctor public NavOptionsBuilder();
+    method public void anim(kotlin.jvm.functions.Function1<? super androidx.navigation.AnimBuilder,kotlin.Unit> animBuilder);
+    method public boolean getLaunchSingleTop();
+    method public int getPopUpTo();
+    method public void popUpTo(@IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
+    method public void setLaunchSingleTop(boolean p);
+    method public void setPopUpTo(int value);
+    property public final boolean launchSingleTop;
+    property public final int popUpTo;
+  }
+
+  public final class NavOptionsBuilderKt {
+    ctor public NavOptionsBuilderKt();
+    method public static androidx.navigation.NavOptions navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+  }
+
+  @kotlin.DslMarker public @interface NavOptionsDsl {
+  }
+
+  public final class NavigatorProviderKt {
+    ctor public NavigatorProviderKt();
+    method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, String name);
+    method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, kotlin.reflect.KClass<T> clazz);
+    method public static inline operator void plusAssign(androidx.navigation.NavigatorProvider, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+    method public static inline operator androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? set(androidx.navigation.NavigatorProvider, String name, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
+    ctor public PopUpToBuilder();
+    method public boolean getInclusive();
+    method public void setInclusive(boolean p);
+    property public final boolean inclusive;
+  }
+
+}
+
diff --git a/navigation/navigation-common/api/2.2.0-alpha01.txt b/navigation/navigation-common/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..736fe0f
--- /dev/null
+++ b/navigation/navigation-common/api/2.2.0-alpha01.txt
@@ -0,0 +1,196 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  public final class ActionOnlyNavDirections implements androidx.navigation.NavDirections {
+    ctor public ActionOnlyNavDirections(int);
+    method public int getActionId();
+    method public android.os.Bundle getArguments();
+  }
+
+  public interface FloatingWindow {
+  }
+
+  public final class NavAction {
+    ctor public NavAction(@IdRes int);
+    ctor public NavAction(@IdRes int, androidx.navigation.NavOptions?);
+    ctor public NavAction(@IdRes int, androidx.navigation.NavOptions?, android.os.Bundle?);
+    method public android.os.Bundle? getDefaultArguments();
+    method public int getDestinationId();
+    method public androidx.navigation.NavOptions? getNavOptions();
+    method public void setDefaultArguments(android.os.Bundle?);
+    method public void setNavOptions(androidx.navigation.NavOptions?);
+  }
+
+  public interface NavArgs {
+  }
+
+  public final class NavArgument {
+    method public Object? getDefaultValue();
+    method public androidx.navigation.NavType<?> getType();
+    method public boolean isDefaultValuePresent();
+    method public boolean isNullable();
+  }
+
+  public static final class NavArgument.Builder {
+    ctor public NavArgument.Builder();
+    method public androidx.navigation.NavArgument build();
+    method public androidx.navigation.NavArgument.Builder setDefaultValue(Object?);
+    method public androidx.navigation.NavArgument.Builder setIsNullable(boolean);
+    method public androidx.navigation.NavArgument.Builder setType(androidx.navigation.NavType<?>);
+  }
+
+  public class NavDestination {
+    ctor public NavDestination(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+    ctor public NavDestination(String);
+    method public final void addArgument(String, androidx.navigation.NavArgument);
+    method public final void addDeepLink(String);
+    method public final androidx.navigation.NavAction? getAction(@IdRes int);
+    method public final java.util.Map<java.lang.String!,androidx.navigation.NavArgument!> getArguments();
+    method @IdRes public final int getId();
+    method public final CharSequence? getLabel();
+    method public final String getNavigatorName();
+    method public final androidx.navigation.NavGraph? getParent();
+    method public boolean hasDeepLink(android.net.Uri);
+    method @CallSuper public void onInflate(android.content.Context, android.util.AttributeSet);
+    method protected static <C> Class<? extends C> parseClassFromName(android.content.Context, String, Class<? extends C>);
+    method public final void putAction(@IdRes int, @IdRes int);
+    method public final void putAction(@IdRes int, androidx.navigation.NavAction);
+    method public final void removeAction(@IdRes int);
+    method public final void removeArgument(String);
+    method public final void setId(@IdRes int);
+    method public final void setLabel(CharSequence?);
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface NavDestination.ClassType {
+    method public abstract Class<?> value();
+  }
+
+  public interface NavDirections {
+    method @IdRes public int getActionId();
+    method public android.os.Bundle getArguments();
+  }
+
+  public class NavGraph extends androidx.navigation.NavDestination implements java.lang.Iterable<androidx.navigation.NavDestination> {
+    ctor public NavGraph(androidx.navigation.Navigator<? extends androidx.navigation.NavGraph>);
+    method public final void addAll(androidx.navigation.NavGraph);
+    method public final void addDestination(androidx.navigation.NavDestination);
+    method public final void addDestinations(java.util.Collection<androidx.navigation.NavDestination!>);
+    method public final void addDestinations(androidx.navigation.NavDestination!...);
+    method public final void clear();
+    method public final androidx.navigation.NavDestination? findNode(@IdRes int);
+    method @IdRes public final int getStartDestination();
+    method public final java.util.Iterator<androidx.navigation.NavDestination!> iterator();
+    method public final void remove(androidx.navigation.NavDestination);
+    method public final void setStartDestination(@IdRes int);
+  }
+
+  @androidx.navigation.Navigator.Name("navigation") public class NavGraphNavigator extends androidx.navigation.Navigator<androidx.navigation.NavGraph> {
+    ctor public NavGraphNavigator(androidx.navigation.NavigatorProvider);
+    method public androidx.navigation.NavGraph createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.NavGraph, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  public final class NavOptions {
+    method @AnimRes @AnimatorRes public int getEnterAnim();
+    method @AnimRes @AnimatorRes public int getExitAnim();
+    method @AnimRes @AnimatorRes public int getPopEnterAnim();
+    method @AnimRes @AnimatorRes public int getPopExitAnim();
+    method @IdRes public int getPopUpTo();
+    method public boolean isPopUpToInclusive();
+    method public boolean shouldLaunchSingleTop();
+  }
+
+  public static final class NavOptions.Builder {
+    ctor public NavOptions.Builder();
+    method public androidx.navigation.NavOptions build();
+    method public androidx.navigation.NavOptions.Builder setEnterAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setExitAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setLaunchSingleTop(boolean);
+    method public androidx.navigation.NavOptions.Builder setPopEnterAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setPopExitAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setPopUpTo(@IdRes int, boolean);
+  }
+
+  public abstract class NavType<T> {
+    method public static androidx.navigation.NavType<?> fromArgType(String?, String?);
+    method public abstract T? get(android.os.Bundle, String);
+    method public abstract String getName();
+    method public boolean isNullableAllowed();
+    method public abstract T parseValue(String);
+    method public abstract void put(android.os.Bundle, String, T?);
+    field public static final androidx.navigation.NavType<boolean[]!> BoolArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Boolean!> BoolType;
+    field public static final androidx.navigation.NavType<float[]!> FloatArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Float!> FloatType;
+    field public static final androidx.navigation.NavType<int[]!> IntArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Integer!> IntType;
+    field public static final androidx.navigation.NavType<long[]!> LongArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Long!> LongType;
+    field public static final androidx.navigation.NavType<java.lang.Integer!> ReferenceType;
+    field public static final androidx.navigation.NavType<java.lang.String![]!> StringArrayType;
+    field public static final androidx.navigation.NavType<java.lang.String!> StringType;
+  }
+
+  public static final class NavType.EnumType<D extends java.lang.Enum> extends androidx.navigation.NavType.SerializableType<D> {
+    ctor public NavType.EnumType(Class<D!>);
+  }
+
+  public static final class NavType.ParcelableArrayType<D extends android.os.Parcelable> extends androidx.navigation.NavType<D[]> {
+    ctor public NavType.ParcelableArrayType(Class<D!>);
+    method public D![]? get(android.os.Bundle, String);
+    method public String getName();
+    method public D![] parseValue(String);
+    method public void put(android.os.Bundle, String, D![]?);
+  }
+
+  public static final class NavType.ParcelableType<D> extends androidx.navigation.NavType<D> {
+    ctor public NavType.ParcelableType(Class<D!>);
+    method public D? get(android.os.Bundle, String);
+    method public String getName();
+    method public D parseValue(String);
+    method public void put(android.os.Bundle, String, D?);
+  }
+
+  public static final class NavType.SerializableArrayType<D extends java.io.Serializable> extends androidx.navigation.NavType<D[]> {
+    ctor public NavType.SerializableArrayType(Class<D!>);
+    method public D![]? get(android.os.Bundle, String);
+    method public String getName();
+    method public D![] parseValue(String);
+    method public void put(android.os.Bundle, String, D![]?);
+  }
+
+  public static class NavType.SerializableType<D extends java.io.Serializable> extends androidx.navigation.NavType<D> {
+    ctor public NavType.SerializableType(Class<D!>);
+    method public D? get(android.os.Bundle, String);
+    method public String getName();
+    method public D parseValue(String);
+    method public void put(android.os.Bundle, String, D?);
+  }
+
+  public abstract class Navigator<D extends androidx.navigation.NavDestination> {
+    ctor public Navigator();
+    method public abstract D createDestination();
+    method public abstract androidx.navigation.NavDestination? navigate(D, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public void onRestoreState(android.os.Bundle);
+    method public android.os.Bundle? onSaveState();
+    method public abstract boolean popBackStack();
+  }
+
+  public static interface Navigator.Extras {
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface Navigator.Name {
+    method public abstract String value();
+  }
+
+  public class NavigatorProvider {
+    ctor public NavigatorProvider();
+    method public final androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+    method @CallSuper public androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(String, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+    method public final <T extends androidx.navigation.Navigator<?>> T getNavigator(Class<T!>);
+    method @CallSuper public <T extends androidx.navigation.Navigator<?>> T getNavigator(String);
+  }
+
+}
+
diff --git a/paging/runtime/api/res-2.2.0-alpha01.txt b/navigation/navigation-common/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/res-2.2.0-alpha01.txt
copy to navigation/navigation-common/api/res-2.2.0-alpha01.txt
diff --git a/navigation/navigation-common/api/restricted_2.2.0-alpha01.txt b/navigation/navigation-common/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..736fe0f
--- /dev/null
+++ b/navigation/navigation-common/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,196 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  public final class ActionOnlyNavDirections implements androidx.navigation.NavDirections {
+    ctor public ActionOnlyNavDirections(int);
+    method public int getActionId();
+    method public android.os.Bundle getArguments();
+  }
+
+  public interface FloatingWindow {
+  }
+
+  public final class NavAction {
+    ctor public NavAction(@IdRes int);
+    ctor public NavAction(@IdRes int, androidx.navigation.NavOptions?);
+    ctor public NavAction(@IdRes int, androidx.navigation.NavOptions?, android.os.Bundle?);
+    method public android.os.Bundle? getDefaultArguments();
+    method public int getDestinationId();
+    method public androidx.navigation.NavOptions? getNavOptions();
+    method public void setDefaultArguments(android.os.Bundle?);
+    method public void setNavOptions(androidx.navigation.NavOptions?);
+  }
+
+  public interface NavArgs {
+  }
+
+  public final class NavArgument {
+    method public Object? getDefaultValue();
+    method public androidx.navigation.NavType<?> getType();
+    method public boolean isDefaultValuePresent();
+    method public boolean isNullable();
+  }
+
+  public static final class NavArgument.Builder {
+    ctor public NavArgument.Builder();
+    method public androidx.navigation.NavArgument build();
+    method public androidx.navigation.NavArgument.Builder setDefaultValue(Object?);
+    method public androidx.navigation.NavArgument.Builder setIsNullable(boolean);
+    method public androidx.navigation.NavArgument.Builder setType(androidx.navigation.NavType<?>);
+  }
+
+  public class NavDestination {
+    ctor public NavDestination(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+    ctor public NavDestination(String);
+    method public final void addArgument(String, androidx.navigation.NavArgument);
+    method public final void addDeepLink(String);
+    method public final androidx.navigation.NavAction? getAction(@IdRes int);
+    method public final java.util.Map<java.lang.String!,androidx.navigation.NavArgument!> getArguments();
+    method @IdRes public final int getId();
+    method public final CharSequence? getLabel();
+    method public final String getNavigatorName();
+    method public final androidx.navigation.NavGraph? getParent();
+    method public boolean hasDeepLink(android.net.Uri);
+    method @CallSuper public void onInflate(android.content.Context, android.util.AttributeSet);
+    method protected static <C> Class<? extends C> parseClassFromName(android.content.Context, String, Class<? extends C>);
+    method public final void putAction(@IdRes int, @IdRes int);
+    method public final void putAction(@IdRes int, androidx.navigation.NavAction);
+    method public final void removeAction(@IdRes int);
+    method public final void removeArgument(String);
+    method public final void setId(@IdRes int);
+    method public final void setLabel(CharSequence?);
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface NavDestination.ClassType {
+    method public abstract Class<?> value();
+  }
+
+  public interface NavDirections {
+    method @IdRes public int getActionId();
+    method public android.os.Bundle getArguments();
+  }
+
+  public class NavGraph extends androidx.navigation.NavDestination implements java.lang.Iterable<androidx.navigation.NavDestination> {
+    ctor public NavGraph(androidx.navigation.Navigator<? extends androidx.navigation.NavGraph>);
+    method public final void addAll(androidx.navigation.NavGraph);
+    method public final void addDestination(androidx.navigation.NavDestination);
+    method public final void addDestinations(java.util.Collection<androidx.navigation.NavDestination!>);
+    method public final void addDestinations(androidx.navigation.NavDestination!...);
+    method public final void clear();
+    method public final androidx.navigation.NavDestination? findNode(@IdRes int);
+    method @IdRes public final int getStartDestination();
+    method public final java.util.Iterator<androidx.navigation.NavDestination!> iterator();
+    method public final void remove(androidx.navigation.NavDestination);
+    method public final void setStartDestination(@IdRes int);
+  }
+
+  @androidx.navigation.Navigator.Name("navigation") public class NavGraphNavigator extends androidx.navigation.Navigator<androidx.navigation.NavGraph> {
+    ctor public NavGraphNavigator(androidx.navigation.NavigatorProvider);
+    method public androidx.navigation.NavGraph createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.NavGraph, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  public final class NavOptions {
+    method @AnimRes @AnimatorRes public int getEnterAnim();
+    method @AnimRes @AnimatorRes public int getExitAnim();
+    method @AnimRes @AnimatorRes public int getPopEnterAnim();
+    method @AnimRes @AnimatorRes public int getPopExitAnim();
+    method @IdRes public int getPopUpTo();
+    method public boolean isPopUpToInclusive();
+    method public boolean shouldLaunchSingleTop();
+  }
+
+  public static final class NavOptions.Builder {
+    ctor public NavOptions.Builder();
+    method public androidx.navigation.NavOptions build();
+    method public androidx.navigation.NavOptions.Builder setEnterAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setExitAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setLaunchSingleTop(boolean);
+    method public androidx.navigation.NavOptions.Builder setPopEnterAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setPopExitAnim(@AnimRes @AnimatorRes int);
+    method public androidx.navigation.NavOptions.Builder setPopUpTo(@IdRes int, boolean);
+  }
+
+  public abstract class NavType<T> {
+    method public static androidx.navigation.NavType<?> fromArgType(String?, String?);
+    method public abstract T? get(android.os.Bundle, String);
+    method public abstract String getName();
+    method public boolean isNullableAllowed();
+    method public abstract T parseValue(String);
+    method public abstract void put(android.os.Bundle, String, T?);
+    field public static final androidx.navigation.NavType<boolean[]!> BoolArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Boolean!> BoolType;
+    field public static final androidx.navigation.NavType<float[]!> FloatArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Float!> FloatType;
+    field public static final androidx.navigation.NavType<int[]!> IntArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Integer!> IntType;
+    field public static final androidx.navigation.NavType<long[]!> LongArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Long!> LongType;
+    field public static final androidx.navigation.NavType<java.lang.Integer!> ReferenceType;
+    field public static final androidx.navigation.NavType<java.lang.String![]!> StringArrayType;
+    field public static final androidx.navigation.NavType<java.lang.String!> StringType;
+  }
+
+  public static final class NavType.EnumType<D extends java.lang.Enum> extends androidx.navigation.NavType.SerializableType<D> {
+    ctor public NavType.EnumType(Class<D!>);
+  }
+
+  public static final class NavType.ParcelableArrayType<D extends android.os.Parcelable> extends androidx.navigation.NavType<D[]> {
+    ctor public NavType.ParcelableArrayType(Class<D!>);
+    method public D![]? get(android.os.Bundle, String);
+    method public String getName();
+    method public D![] parseValue(String);
+    method public void put(android.os.Bundle, String, D![]?);
+  }
+
+  public static final class NavType.ParcelableType<D> extends androidx.navigation.NavType<D> {
+    ctor public NavType.ParcelableType(Class<D!>);
+    method public D? get(android.os.Bundle, String);
+    method public String getName();
+    method public D parseValue(String);
+    method public void put(android.os.Bundle, String, D?);
+  }
+
+  public static final class NavType.SerializableArrayType<D extends java.io.Serializable> extends androidx.navigation.NavType<D[]> {
+    ctor public NavType.SerializableArrayType(Class<D!>);
+    method public D![]? get(android.os.Bundle, String);
+    method public String getName();
+    method public D![] parseValue(String);
+    method public void put(android.os.Bundle, String, D![]?);
+  }
+
+  public static class NavType.SerializableType<D extends java.io.Serializable> extends androidx.navigation.NavType<D> {
+    ctor public NavType.SerializableType(Class<D!>);
+    method public D? get(android.os.Bundle, String);
+    method public String getName();
+    method public D parseValue(String);
+    method public void put(android.os.Bundle, String, D?);
+  }
+
+  public abstract class Navigator<D extends androidx.navigation.NavDestination> {
+    ctor public Navigator();
+    method public abstract D createDestination();
+    method public abstract androidx.navigation.NavDestination? navigate(D, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public void onRestoreState(android.os.Bundle);
+    method public android.os.Bundle? onSaveState();
+    method public abstract boolean popBackStack();
+  }
+
+  public static interface Navigator.Extras {
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface Navigator.Name {
+    method public abstract String value();
+  }
+
+  public class NavigatorProvider {
+    ctor public NavigatorProvider();
+    method public final androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+    method @CallSuper public androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(String, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+    method public final <T extends androidx.navigation.Navigator<?>> T getNavigator(Class<T!>);
+    method @CallSuper public <T extends androidx.navigation.Navigator<?>> T getNavigator(String);
+  }
+
+}
+
diff --git a/navigation/navigation-fragment-ktx/api/2.2.0-alpha01.txt b/navigation/navigation-fragment-ktx/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..3b93d62
--- /dev/null
+++ b/navigation/navigation-fragment-ktx/api/2.2.0-alpha01.txt
@@ -0,0 +1,51 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  public final class NavGraphViewModelLazyKt {
+    ctor public NavGraphViewModelLazyKt();
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<VM> navGraphViewModels(androidx.fragment.app.Fragment, @IdRes int navGraphId, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer = null);
+  }
+
+}
+
+package androidx.navigation.fragment {
+
+  public final class DialogFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+    ctor public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+    method public androidx.navigation.fragment.DialogFragmentNavigator.Destination build();
+  }
+
+  public final class DialogFragmentNavigatorDestinationBuilderKt {
+    ctor public DialogFragmentNavigatorDestinationBuilderKt();
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class FragmentKt {
+    ctor public FragmentKt();
+    method public static androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment);
+  }
+
+  public final class FragmentNavArgsLazyKt {
+    ctor public FragmentNavArgsLazyKt();
+    method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args> navArgs(androidx.fragment.app.Fragment);
+  }
+
+  public final class FragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+    method public androidx.navigation.fragment.FragmentNavigator.Destination build();
+  }
+
+  public final class FragmentNavigatorDestinationBuilderKt {
+    ctor public FragmentNavigatorDestinationBuilderKt();
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class FragmentNavigatorExtrasKt {
+    ctor public FragmentNavigatorExtrasKt();
+    method public static androidx.navigation.fragment.FragmentNavigator.Extras FragmentNavigatorExtras(kotlin.Pair<? extends android.view.View,java.lang.String>... sharedElements);
+  }
+
+}
+
diff --git a/paging/runtime/ktx/api/res-2.2.0-alpha01.txt b/navigation/navigation-fragment-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from paging/runtime/ktx/api/res-2.2.0-alpha01.txt
copy to navigation/navigation-fragment-ktx/api/res-2.2.0-alpha01.txt
diff --git a/navigation/navigation-fragment-ktx/api/restricted_2.2.0-alpha01.txt b/navigation/navigation-fragment-ktx/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..3b93d62
--- /dev/null
+++ b/navigation/navigation-fragment-ktx/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,51 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  public final class NavGraphViewModelLazyKt {
+    ctor public NavGraphViewModelLazyKt();
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<VM> navGraphViewModels(androidx.fragment.app.Fragment, @IdRes int navGraphId, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer = null);
+  }
+
+}
+
+package androidx.navigation.fragment {
+
+  public final class DialogFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+    ctor public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+    method public androidx.navigation.fragment.DialogFragmentNavigator.Destination build();
+  }
+
+  public final class DialogFragmentNavigatorDestinationBuilderKt {
+    ctor public DialogFragmentNavigatorDestinationBuilderKt();
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class FragmentKt {
+    ctor public FragmentKt();
+    method public static androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment);
+  }
+
+  public final class FragmentNavArgsLazyKt {
+    ctor public FragmentNavArgsLazyKt();
+    method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args> navArgs(androidx.fragment.app.Fragment);
+  }
+
+  public final class FragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+    method public androidx.navigation.fragment.FragmentNavigator.Destination build();
+  }
+
+  public final class FragmentNavigatorDestinationBuilderKt {
+    ctor public FragmentNavigatorDestinationBuilderKt();
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class FragmentNavigatorExtrasKt {
+    ctor public FragmentNavigatorExtrasKt();
+    method public static androidx.navigation.fragment.FragmentNavigator.Extras FragmentNavigatorExtras(kotlin.Pair<? extends android.view.View,java.lang.String>... sharedElements);
+  }
+
+}
+
diff --git a/navigation/navigation-fragment-ktx/build.gradle b/navigation/navigation-fragment-ktx/build.gradle
index f6c26c3..b588ff0 100644
--- a/navigation/navigation-fragment-ktx/build.gradle
+++ b/navigation/navigation-fragment-ktx/build.gradle
@@ -38,8 +38,8 @@
     api(project(":navigation:navigation-fragment"))
     // Ensure that the -ktx dependency graph mirrors the Java dependency graph
     api(project(":navigation:navigation-runtime-ktx"))
-    api("androidx.fragment:fragment-ktx:1.1.0-rc01")
-    api("androidx.lifecycle:lifecycle-viewmodel-ktx:2.1.0-rc01")
+    api(project(":fragment:fragment-ktx"))
+    api(project(":lifecycle:lifecycle-viewmodel-ktx"))
     api(KOTLIN_STDLIB)
     androidTestImplementation("androidx.fragment:fragment-testing:1.1.0-rc01")
     androidTestImplementation(project(":navigation:navigation-testing"))
diff --git a/navigation/navigation-fragment/api/2.2.0-alpha01.txt b/navigation/navigation-fragment/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..fa67952
--- /dev/null
+++ b/navigation/navigation-fragment/api/2.2.0-alpha01.txt
@@ -0,0 +1,55 @@
+// Signature format: 3.0
+package androidx.navigation.fragment {
+
+  @androidx.navigation.Navigator.Name("dialog") public final class DialogFragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+    ctor public DialogFragmentNavigator(android.content.Context, androidx.fragment.app.FragmentManager);
+    method public androidx.navigation.fragment.DialogFragmentNavigator.Destination createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.DialogFragmentNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(DialogFragment.class) public static class DialogFragmentNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
+    ctor public DialogFragmentNavigator.Destination(androidx.navigation.NavigatorProvider);
+    ctor public DialogFragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.DialogFragmentNavigator.Destination>);
+    method public final String getClassName();
+    method public final androidx.navigation.fragment.DialogFragmentNavigator.Destination setClassName(String);
+  }
+
+  @androidx.navigation.Navigator.Name("fragment") public class FragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor public FragmentNavigator(android.content.Context, androidx.fragment.app.FragmentManager, int);
+    method public androidx.navigation.fragment.FragmentNavigator.Destination createDestination();
+    method @Deprecated public androidx.fragment.app.Fragment instantiateFragment(android.content.Context, androidx.fragment.app.FragmentManager, String, android.os.Bundle?);
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.FragmentNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Fragment.class) public static class FragmentNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public FragmentNavigator.Destination(androidx.navigation.NavigatorProvider);
+    ctor public FragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination>);
+    method public final String getClassName();
+    method public final androidx.navigation.fragment.FragmentNavigator.Destination setClassName(String);
+  }
+
+  public static final class FragmentNavigator.Extras implements androidx.navigation.Navigator.Extras {
+    method public java.util.Map<android.view.View!,java.lang.String!> getSharedElements();
+  }
+
+  public static final class FragmentNavigator.Extras.Builder {
+    ctor public FragmentNavigator.Extras.Builder();
+    method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElement(android.view.View, String);
+    method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElements(java.util.Map<android.view.View!,java.lang.String!>);
+    method public androidx.navigation.fragment.FragmentNavigator.Extras build();
+  }
+
+  public class NavHostFragment extends androidx.fragment.app.Fragment implements androidx.navigation.NavHost {
+    ctor public NavHostFragment();
+    method public static androidx.navigation.fragment.NavHostFragment create(@NavigationRes int);
+    method public static androidx.navigation.fragment.NavHostFragment create(@NavigationRes int, android.os.Bundle?);
+    method @Deprecated protected androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> createFragmentNavigator();
+    method public static androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment);
+    method public final androidx.navigation.NavController getNavController();
+    method @CallSuper protected void onCreateNavController(androidx.navigation.NavController);
+  }
+
+}
+
diff --git a/paging/runtime/api/res-2.2.0-alpha01.txt b/navigation/navigation-fragment/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/res-2.2.0-alpha01.txt
copy to navigation/navigation-fragment/api/res-2.2.0-alpha01.txt
diff --git a/navigation/navigation-fragment/api/restricted_2.2.0-alpha01.txt b/navigation/navigation-fragment/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..fa67952
--- /dev/null
+++ b/navigation/navigation-fragment/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,55 @@
+// Signature format: 3.0
+package androidx.navigation.fragment {
+
+  @androidx.navigation.Navigator.Name("dialog") public final class DialogFragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+    ctor public DialogFragmentNavigator(android.content.Context, androidx.fragment.app.FragmentManager);
+    method public androidx.navigation.fragment.DialogFragmentNavigator.Destination createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.DialogFragmentNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(DialogFragment.class) public static class DialogFragmentNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
+    ctor public DialogFragmentNavigator.Destination(androidx.navigation.NavigatorProvider);
+    ctor public DialogFragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.DialogFragmentNavigator.Destination>);
+    method public final String getClassName();
+    method public final androidx.navigation.fragment.DialogFragmentNavigator.Destination setClassName(String);
+  }
+
+  @androidx.navigation.Navigator.Name("fragment") public class FragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor public FragmentNavigator(android.content.Context, androidx.fragment.app.FragmentManager, int);
+    method public androidx.navigation.fragment.FragmentNavigator.Destination createDestination();
+    method @Deprecated public androidx.fragment.app.Fragment instantiateFragment(android.content.Context, androidx.fragment.app.FragmentManager, String, android.os.Bundle?);
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.FragmentNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Fragment.class) public static class FragmentNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public FragmentNavigator.Destination(androidx.navigation.NavigatorProvider);
+    ctor public FragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination>);
+    method public final String getClassName();
+    method public final androidx.navigation.fragment.FragmentNavigator.Destination setClassName(String);
+  }
+
+  public static final class FragmentNavigator.Extras implements androidx.navigation.Navigator.Extras {
+    method public java.util.Map<android.view.View!,java.lang.String!> getSharedElements();
+  }
+
+  public static final class FragmentNavigator.Extras.Builder {
+    ctor public FragmentNavigator.Extras.Builder();
+    method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElement(android.view.View, String);
+    method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElements(java.util.Map<android.view.View!,java.lang.String!>);
+    method public androidx.navigation.fragment.FragmentNavigator.Extras build();
+  }
+
+  public class NavHostFragment extends androidx.fragment.app.Fragment implements androidx.navigation.NavHost {
+    ctor public NavHostFragment();
+    method public static androidx.navigation.fragment.NavHostFragment create(@NavigationRes int);
+    method public static androidx.navigation.fragment.NavHostFragment create(@NavigationRes int, android.os.Bundle?);
+    method @Deprecated protected androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> createFragmentNavigator();
+    method public static androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment);
+    method public final androidx.navigation.NavController getNavController();
+    method @CallSuper protected void onCreateNavController(androidx.navigation.NavController);
+  }
+
+}
+
diff --git a/navigation/navigation-fragment/build.gradle b/navigation/navigation-fragment/build.gradle
index 83d19df..03f1adb 100644
--- a/navigation/navigation-fragment/build.gradle
+++ b/navigation/navigation-fragment/build.gradle
@@ -27,7 +27,7 @@
 }
 
 dependencies {
-    api("androidx.fragment:fragment:1.1.0-rc01")
+    api(project(":fragment:fragment"))
     api(project(":navigation:navigation-runtime"))
 
     androidTestImplementation(project(":navigation:navigation-testing"))
diff --git a/navigation/navigation-fragment/src/androidTest/res/layout/dynamic_navigation_activity.xml b/navigation/navigation-fragment/src/androidTest/res/layout/dynamic_navigation_activity.xml
index df82bf4..7752d89 100644
--- a/navigation/navigation-fragment/src/androidTest/res/layout/dynamic_navigation_activity.xml
+++ b/navigation/navigation-fragment/src/androidTest/res/layout/dynamic_navigation_activity.xml
@@ -15,7 +15,7 @@
   ~ limitations under the License.
   -->
 
-<FrameLayout
+<androidx.fragment.app.FragmentContainerView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
diff --git a/navigation/navigation-fragment/src/androidTest/res/layout/embedded_xml_activity.xml b/navigation/navigation-fragment/src/androidTest/res/layout/embedded_xml_activity.xml
index 9adbc1f..513ef13 100644
--- a/navigation/navigation-fragment/src/androidTest/res/layout/embedded_xml_activity.xml
+++ b/navigation/navigation-fragment/src/androidTest/res/layout/embedded_xml_activity.xml
@@ -15,7 +15,7 @@
   ~ limitations under the License.
   -->
 
-<FrameLayout
+<androidx.fragment.app.FragmentContainerView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
diff --git a/navigation/navigation-fragment/src/androidTest/res/layout/empty_activity.xml b/navigation/navigation-fragment/src/androidTest/res/layout/empty_activity.xml
index c586e95..dd4d487 100644
--- a/navigation/navigation-fragment/src/androidTest/res/layout/empty_activity.xml
+++ b/navigation/navigation-fragment/src/androidTest/res/layout/empty_activity.xml
@@ -15,7 +15,7 @@
   ~ limitations under the License.
   -->
 
-<FrameLayout
+<androidx.fragment.app.FragmentContainerView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
diff --git a/navigation/navigation-fragment/src/androidTest/res/layout/start_destination_args_activity.xml b/navigation/navigation-fragment/src/androidTest/res/layout/start_destination_args_activity.xml
index 22de0e4..05379af 100644
--- a/navigation/navigation-fragment/src/androidTest/res/layout/start_destination_args_activity.xml
+++ b/navigation/navigation-fragment/src/androidTest/res/layout/start_destination_args_activity.xml
@@ -15,7 +15,7 @@
   ~ limitations under the License.
   -->
 
-<FrameLayout
+<androidx.fragment.app.FragmentContainerView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
diff --git a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java
index 7e07891..a58f68e 100644
--- a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java
+++ b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java
@@ -23,13 +23,13 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.FrameLayout;
 
 import androidx.annotation.CallSuper;
 import androidx.annotation.NavigationRes;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentContainerView;
 import androidx.navigation.NavController;
 import androidx.navigation.NavGraph;
 import androidx.navigation.NavHost;
@@ -297,13 +297,13 @@
     @Override
     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                              @Nullable Bundle savedInstanceState) {
-        FrameLayout frameLayout = new FrameLayout(inflater.getContext());
-        // When added via XML, this has no effect (since this FrameLayout is given the ID
+        FragmentContainerView containerView = new FragmentContainerView(inflater.getContext());
+        // When added via XML, this has no effect (since this FragmentContainerView is given the ID
         // automatically), but this ensures that the View exists as part of this Fragment's View
         // hierarchy in cases where the NavHostFragment is added programmatically as is required
         // for child fragment transactions
-        frameLayout.setId(getId());
-        return frameLayout;
+        containerView.setId(getId());
+        return containerView;
     }
 
     @Override
diff --git a/navigation/navigation-runtime-ktx/api/2.2.0-alpha01.txt b/navigation/navigation-runtime-ktx/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..fa3dc07
--- /dev/null
+++ b/navigation/navigation-runtime-ktx/api/2.2.0-alpha01.txt
@@ -0,0 +1,60 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  public final class ActivityKt {
+    ctor public ActivityKt();
+    method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int viewId);
+  }
+
+  public final class ActivityNavArgsLazyKt {
+    ctor public ActivityNavArgsLazyKt();
+    method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args> navArgs(android.app.Activity);
+  }
+
+  public final class ActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
+    ctor public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, @IdRes int id);
+    method public androidx.navigation.ActivityNavigator.Destination build();
+    method public String? getAction();
+    method public kotlin.reflect.KClass<? extends android.app.Activity>? getActivityClass();
+    method public android.net.Uri? getData();
+    method public String? getDataPattern();
+    method public String? getTargetPackage();
+    method public void setAction(String? p);
+    method public void setActivityClass(kotlin.reflect.KClass<? extends android.app.Activity>? p);
+    method public void setData(android.net.Uri? p);
+    method public void setDataPattern(String? p);
+    method public void setTargetPackage(String? p);
+    property public final String? action;
+    property public final kotlin.reflect.KClass<? extends android.app.Activity>? activityClass;
+    property public final android.net.Uri? data;
+    property public final String? dataPattern;
+    property public final String? targetPackage;
+  }
+
+  public final class ActivityNavigatorDestinationBuilderKt {
+    ctor public ActivityNavigatorDestinationBuilderKt();
+    method public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class ActivityNavigatorExtrasKt {
+    ctor public ActivityNavigatorExtrasKt();
+    method public static androidx.navigation.ActivityNavigator.Extras ActivityNavigatorExtras(androidx.core.app.ActivityOptionsCompat? activityOptions = null, int flags = 0);
+  }
+
+  public final class NavControllerKt {
+    ctor public NavControllerKt();
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavHostKt {
+    ctor public NavHostKt();
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class ViewKt {
+    ctor public ViewKt();
+    method public static androidx.navigation.NavController findNavController(android.view.View);
+  }
+
+}
+
diff --git a/paging/runtime/ktx/api/res-2.2.0-alpha01.txt b/navigation/navigation-runtime-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from paging/runtime/ktx/api/res-2.2.0-alpha01.txt
copy to navigation/navigation-runtime-ktx/api/res-2.2.0-alpha01.txt
diff --git a/navigation/navigation-runtime-ktx/api/restricted_2.2.0-alpha01.txt b/navigation/navigation-runtime-ktx/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..fa3dc07
--- /dev/null
+++ b/navigation/navigation-runtime-ktx/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,60 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  public final class ActivityKt {
+    ctor public ActivityKt();
+    method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int viewId);
+  }
+
+  public final class ActivityNavArgsLazyKt {
+    ctor public ActivityNavArgsLazyKt();
+    method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args> navArgs(android.app.Activity);
+  }
+
+  public final class ActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
+    ctor public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, @IdRes int id);
+    method public androidx.navigation.ActivityNavigator.Destination build();
+    method public String? getAction();
+    method public kotlin.reflect.KClass<? extends android.app.Activity>? getActivityClass();
+    method public android.net.Uri? getData();
+    method public String? getDataPattern();
+    method public String? getTargetPackage();
+    method public void setAction(String? p);
+    method public void setActivityClass(kotlin.reflect.KClass<? extends android.app.Activity>? p);
+    method public void setData(android.net.Uri? p);
+    method public void setDataPattern(String? p);
+    method public void setTargetPackage(String? p);
+    property public final String? action;
+    property public final kotlin.reflect.KClass<? extends android.app.Activity>? activityClass;
+    property public final android.net.Uri? data;
+    property public final String? dataPattern;
+    property public final String? targetPackage;
+  }
+
+  public final class ActivityNavigatorDestinationBuilderKt {
+    ctor public ActivityNavigatorDestinationBuilderKt();
+    method public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class ActivityNavigatorExtrasKt {
+    ctor public ActivityNavigatorExtrasKt();
+    method public static androidx.navigation.ActivityNavigator.Extras ActivityNavigatorExtras(androidx.core.app.ActivityOptionsCompat? activityOptions = null, int flags = 0);
+  }
+
+  public final class NavControllerKt {
+    ctor public NavControllerKt();
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavHostKt {
+    ctor public NavHostKt();
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class ViewKt {
+    ctor public ViewKt();
+    method public static androidx.navigation.NavController findNavController(android.view.View);
+  }
+
+}
+
diff --git a/navigation/navigation-runtime-ktx/build.gradle b/navigation/navigation-runtime-ktx/build.gradle
index 41b34bf..e5535ec 100644
--- a/navigation/navigation-runtime-ktx/build.gradle
+++ b/navigation/navigation-runtime-ktx/build.gradle
@@ -38,6 +38,12 @@
     api(project(":navigation:navigation-runtime"))
     // Ensure that the -ktx dependency graph mirrors the Java dependency graph
     api(project(":navigation:navigation-common-ktx"))
+    api(project(":activity:activity-ktx")) {
+        because 'Mirror navigation-runtime dependency graph for -ktx artifacts'
+    }
+    api(project(":lifecycle:lifecycle-viewmodel-ktx")) {
+        because 'Mirror navigation-runtime dependency graph for -ktx artifacts'
+    }
     api(KOTLIN_STDLIB)
     androidTestImplementation(project(":navigation:navigation-testing"))
     androidTestImplementation(TRUTH)
diff --git a/navigation/navigation-runtime/api/2.2.0-alpha01.txt b/navigation/navigation-runtime/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..f361023
--- /dev/null
+++ b/navigation/navigation-runtime/api/2.2.0-alpha01.txt
@@ -0,0 +1,118 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  @androidx.navigation.Navigator.Name("activity") public class ActivityNavigator extends androidx.navigation.Navigator<androidx.navigation.ActivityNavigator.Destination> {
+    ctor public ActivityNavigator(android.content.Context);
+    method public static void applyPopAnimationsToPendingTransition(android.app.Activity);
+    method public androidx.navigation.ActivityNavigator.Destination createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.ActivityNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Activity.class) public static class ActivityNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public ActivityNavigator.Destination(androidx.navigation.NavigatorProvider);
+    ctor public ActivityNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.ActivityNavigator.Destination>);
+    method public final String? getAction();
+    method public final android.content.ComponentName? getComponent();
+    method public final android.net.Uri? getData();
+    method public final String? getDataPattern();
+    method public final android.content.Intent? getIntent();
+    method public final String? getTargetPackage();
+    method public final androidx.navigation.ActivityNavigator.Destination setAction(String?);
+    method public final androidx.navigation.ActivityNavigator.Destination setComponentName(android.content.ComponentName?);
+    method public final androidx.navigation.ActivityNavigator.Destination setData(android.net.Uri?);
+    method public final androidx.navigation.ActivityNavigator.Destination setDataPattern(String?);
+    method public final androidx.navigation.ActivityNavigator.Destination setIntent(android.content.Intent?);
+    method public final androidx.navigation.ActivityNavigator.Destination setTargetPackage(String?);
+  }
+
+  public static final class ActivityNavigator.Extras implements androidx.navigation.Navigator.Extras {
+    method public androidx.core.app.ActivityOptionsCompat? getActivityOptions();
+    method public int getFlags();
+  }
+
+  public static final class ActivityNavigator.Extras.Builder {
+    ctor public ActivityNavigator.Extras.Builder();
+    method public androidx.navigation.ActivityNavigator.Extras.Builder addFlags(int);
+    method public androidx.navigation.ActivityNavigator.Extras build();
+    method public androidx.navigation.ActivityNavigator.Extras.Builder setActivityOptions(androidx.core.app.ActivityOptionsCompat);
+  }
+
+  public class NavController {
+    ctor public NavController(android.content.Context);
+    method public void addOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener);
+    method public androidx.navigation.NavDeepLinkBuilder createDeepLink();
+    method public androidx.navigation.NavDestination? getCurrentDestination();
+    method public androidx.navigation.NavGraph getGraph();
+    method public androidx.navigation.NavInflater getNavInflater();
+    method public androidx.navigation.NavigatorProvider getNavigatorProvider();
+    method @Deprecated public androidx.lifecycle.ViewModelStore getViewModelStore(@IdRes int);
+    method public androidx.lifecycle.ViewModelStoreOwner getViewModelStoreOwner(@IdRes int);
+    method public boolean handleDeepLink(android.content.Intent?);
+    method public void navigate(@IdRes int);
+    method public void navigate(@IdRes int, android.os.Bundle?);
+    method public void navigate(@IdRes int, android.os.Bundle?, androidx.navigation.NavOptions?);
+    method public void navigate(@IdRes int, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public void navigate(android.net.Uri);
+    method public void navigate(android.net.Uri, androidx.navigation.NavOptions?);
+    method public void navigate(android.net.Uri, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public void navigate(androidx.navigation.NavDirections);
+    method public void navigate(androidx.navigation.NavDirections, androidx.navigation.NavOptions?);
+    method public void navigate(androidx.navigation.NavDirections, androidx.navigation.Navigator.Extras);
+    method public boolean navigateUp();
+    method public boolean popBackStack();
+    method public boolean popBackStack(@IdRes int, boolean);
+    method public void removeOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener);
+    method @CallSuper public void restoreState(android.os.Bundle?);
+    method @CallSuper public android.os.Bundle? saveState();
+    method @CallSuper public void setGraph(@NavigationRes int);
+    method @CallSuper public void setGraph(@NavigationRes int, android.os.Bundle?);
+    method @CallSuper public void setGraph(androidx.navigation.NavGraph);
+    method @CallSuper public void setGraph(androidx.navigation.NavGraph, android.os.Bundle?);
+    field public static final String KEY_DEEP_LINK_INTENT = "android-support-nav:controller:deepLinkIntent";
+  }
+
+  public static interface NavController.OnDestinationChangedListener {
+    method public void onDestinationChanged(androidx.navigation.NavController, androidx.navigation.NavDestination, android.os.Bundle?);
+  }
+
+  public final class NavDeepLinkBuilder {
+    ctor public NavDeepLinkBuilder(android.content.Context);
+    method public android.app.PendingIntent createPendingIntent();
+    method public androidx.core.app.TaskStackBuilder createTaskStackBuilder();
+    method public androidx.navigation.NavDeepLinkBuilder setArguments(android.os.Bundle?);
+    method public androidx.navigation.NavDeepLinkBuilder setComponentName(Class<? extends android.app.Activity>);
+    method public androidx.navigation.NavDeepLinkBuilder setComponentName(android.content.ComponentName);
+    method public androidx.navigation.NavDeepLinkBuilder setDestination(@IdRes int);
+    method public androidx.navigation.NavDeepLinkBuilder setGraph(@NavigationRes int);
+    method public androidx.navigation.NavDeepLinkBuilder setGraph(androidx.navigation.NavGraph);
+  }
+
+  public interface NavHost {
+    method public androidx.navigation.NavController getNavController();
+  }
+
+  public final class NavHostController extends androidx.navigation.NavController {
+    ctor public NavHostController(android.content.Context);
+    method public void enableOnBackPressed(boolean);
+    method public void setLifecycleOwner(androidx.lifecycle.LifecycleOwner);
+    method public void setOnBackPressedDispatcher(androidx.activity.OnBackPressedDispatcher);
+    method public void setViewModelStore(androidx.lifecycle.ViewModelStore);
+  }
+
+  public final class NavInflater {
+    ctor public NavInflater(android.content.Context, androidx.navigation.NavigatorProvider);
+    method public androidx.navigation.NavGraph inflate(@NavigationRes int);
+  }
+
+  public final class Navigation {
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int);
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int, android.os.Bundle?);
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(androidx.navigation.NavDirections);
+    method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int);
+    method public static androidx.navigation.NavController findNavController(android.view.View);
+    method public static void setViewNavController(android.view.View, androidx.navigation.NavController?);
+  }
+
+}
+
diff --git a/paging/runtime/api/res-2.2.0-alpha01.txt b/navigation/navigation-runtime/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/res-2.2.0-alpha01.txt
copy to navigation/navigation-runtime/api/res-2.2.0-alpha01.txt
diff --git a/navigation/navigation-runtime/api/restricted_2.2.0-alpha01.txt b/navigation/navigation-runtime/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..f361023
--- /dev/null
+++ b/navigation/navigation-runtime/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,118 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+  @androidx.navigation.Navigator.Name("activity") public class ActivityNavigator extends androidx.navigation.Navigator<androidx.navigation.ActivityNavigator.Destination> {
+    ctor public ActivityNavigator(android.content.Context);
+    method public static void applyPopAnimationsToPendingTransition(android.app.Activity);
+    method public androidx.navigation.ActivityNavigator.Destination createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.ActivityNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public boolean popBackStack();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Activity.class) public static class ActivityNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public ActivityNavigator.Destination(androidx.navigation.NavigatorProvider);
+    ctor public ActivityNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.ActivityNavigator.Destination>);
+    method public final String? getAction();
+    method public final android.content.ComponentName? getComponent();
+    method public final android.net.Uri? getData();
+    method public final String? getDataPattern();
+    method public final android.content.Intent? getIntent();
+    method public final String? getTargetPackage();
+    method public final androidx.navigation.ActivityNavigator.Destination setAction(String?);
+    method public final androidx.navigation.ActivityNavigator.Destination setComponentName(android.content.ComponentName?);
+    method public final androidx.navigation.ActivityNavigator.Destination setData(android.net.Uri?);
+    method public final androidx.navigation.ActivityNavigator.Destination setDataPattern(String?);
+    method public final androidx.navigation.ActivityNavigator.Destination setIntent(android.content.Intent?);
+    method public final androidx.navigation.ActivityNavigator.Destination setTargetPackage(String?);
+  }
+
+  public static final class ActivityNavigator.Extras implements androidx.navigation.Navigator.Extras {
+    method public androidx.core.app.ActivityOptionsCompat? getActivityOptions();
+    method public int getFlags();
+  }
+
+  public static final class ActivityNavigator.Extras.Builder {
+    ctor public ActivityNavigator.Extras.Builder();
+    method public androidx.navigation.ActivityNavigator.Extras.Builder addFlags(int);
+    method public androidx.navigation.ActivityNavigator.Extras build();
+    method public androidx.navigation.ActivityNavigator.Extras.Builder setActivityOptions(androidx.core.app.ActivityOptionsCompat);
+  }
+
+  public class NavController {
+    ctor public NavController(android.content.Context);
+    method public void addOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener);
+    method public androidx.navigation.NavDeepLinkBuilder createDeepLink();
+    method public androidx.navigation.NavDestination? getCurrentDestination();
+    method public androidx.navigation.NavGraph getGraph();
+    method public androidx.navigation.NavInflater getNavInflater();
+    method public androidx.navigation.NavigatorProvider getNavigatorProvider();
+    method @Deprecated public androidx.lifecycle.ViewModelStore getViewModelStore(@IdRes int);
+    method public androidx.lifecycle.ViewModelStoreOwner getViewModelStoreOwner(@IdRes int);
+    method public boolean handleDeepLink(android.content.Intent?);
+    method public void navigate(@IdRes int);
+    method public void navigate(@IdRes int, android.os.Bundle?);
+    method public void navigate(@IdRes int, android.os.Bundle?, androidx.navigation.NavOptions?);
+    method public void navigate(@IdRes int, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public void navigate(android.net.Uri);
+    method public void navigate(android.net.Uri, androidx.navigation.NavOptions?);
+    method public void navigate(android.net.Uri, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+    method public void navigate(androidx.navigation.NavDirections);
+    method public void navigate(androidx.navigation.NavDirections, androidx.navigation.NavOptions?);
+    method public void navigate(androidx.navigation.NavDirections, androidx.navigation.Navigator.Extras);
+    method public boolean navigateUp();
+    method public boolean popBackStack();
+    method public boolean popBackStack(@IdRes int, boolean);
+    method public void removeOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener);
+    method @CallSuper public void restoreState(android.os.Bundle?);
+    method @CallSuper public android.os.Bundle? saveState();
+    method @CallSuper public void setGraph(@NavigationRes int);
+    method @CallSuper public void setGraph(@NavigationRes int, android.os.Bundle?);
+    method @CallSuper public void setGraph(androidx.navigation.NavGraph);
+    method @CallSuper public void setGraph(androidx.navigation.NavGraph, android.os.Bundle?);
+    field public static final String KEY_DEEP_LINK_INTENT = "android-support-nav:controller:deepLinkIntent";
+  }
+
+  public static interface NavController.OnDestinationChangedListener {
+    method public void onDestinationChanged(androidx.navigation.NavController, androidx.navigation.NavDestination, android.os.Bundle?);
+  }
+
+  public final class NavDeepLinkBuilder {
+    ctor public NavDeepLinkBuilder(android.content.Context);
+    method public android.app.PendingIntent createPendingIntent();
+    method public androidx.core.app.TaskStackBuilder createTaskStackBuilder();
+    method public androidx.navigation.NavDeepLinkBuilder setArguments(android.os.Bundle?);
+    method public androidx.navigation.NavDeepLinkBuilder setComponentName(Class<? extends android.app.Activity>);
+    method public androidx.navigation.NavDeepLinkBuilder setComponentName(android.content.ComponentName);
+    method public androidx.navigation.NavDeepLinkBuilder setDestination(@IdRes int);
+    method public androidx.navigation.NavDeepLinkBuilder setGraph(@NavigationRes int);
+    method public androidx.navigation.NavDeepLinkBuilder setGraph(androidx.navigation.NavGraph);
+  }
+
+  public interface NavHost {
+    method public androidx.navigation.NavController getNavController();
+  }
+
+  public final class NavHostController extends androidx.navigation.NavController {
+    ctor public NavHostController(android.content.Context);
+    method public void enableOnBackPressed(boolean);
+    method public void setLifecycleOwner(androidx.lifecycle.LifecycleOwner);
+    method public void setOnBackPressedDispatcher(androidx.activity.OnBackPressedDispatcher);
+    method public void setViewModelStore(androidx.lifecycle.ViewModelStore);
+  }
+
+  public final class NavInflater {
+    ctor public NavInflater(android.content.Context, androidx.navigation.NavigatorProvider);
+    method public androidx.navigation.NavGraph inflate(@NavigationRes int);
+  }
+
+  public final class Navigation {
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int);
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int, android.os.Bundle?);
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(androidx.navigation.NavDirections);
+    method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int);
+    method public static androidx.navigation.NavController findNavController(android.view.View);
+    method public static void setViewNavController(android.view.View, androidx.navigation.NavController?);
+  }
+
+}
+
diff --git a/navigation/navigation-runtime/build.gradle b/navigation/navigation-runtime/build.gradle
index e222ddd..9afb788 100644
--- a/navigation/navigation-runtime/build.gradle
+++ b/navigation/navigation-runtime/build.gradle
@@ -28,8 +28,8 @@
 
 dependencies {
     api(project(":navigation:navigation-common"))
-    api("androidx.activity:activity:1.0.0-rc01")
-    api("androidx.lifecycle:lifecycle-viewmodel:2.1.0-rc01")
+    api(project(":activity:activity"))
+    api(project(":lifecycle:lifecycle-viewmodel"))
 
     androidTestImplementation(project(":navigation:navigation-testing"))
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java
index 36dee96..f06382e 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java
@@ -255,12 +255,12 @@
             // Nothing to pop if the back stack is empty
             return false;
         }
-        ArrayList<Navigator> popOperations = new ArrayList<>();
+        ArrayList<Navigator<?>> popOperations = new ArrayList<>();
         Iterator<NavBackStackEntry> iterator = mBackStack.descendingIterator();
         boolean foundDestination = false;
         while (iterator.hasNext()) {
             NavDestination destination = iterator.next().getDestination();
-            Navigator navigator = mNavigatorProvider.getNavigator(
+            Navigator<?> navigator = mNavigatorProvider.getNavigator(
                     destination.getNavigatorName());
             if (inclusive || destination.getId() != destinationId) {
                 popOperations.add(navigator);
@@ -279,7 +279,7 @@
             return false;
         }
         boolean popped = false;
-        for (Navigator navigator : popOperations) {
+        for (Navigator<?> navigator : popOperations) {
             if (navigator.popBackStack()) {
                 NavBackStackEntry entry = mBackStack.removeLast();
                 if (mViewModel != null) {
@@ -466,7 +466,7 @@
                     KEY_NAVIGATOR_STATE_NAMES);
             if (navigatorNames != null) {
                 for (String name : navigatorNames) {
-                    Navigator navigator = mNavigatorProvider.getNavigator(name);
+                    Navigator<?> navigator = mNavigatorProvider.getNavigator(name);
                     Bundle bundle = mNavigatorStateToRestore.getBundle(name);
                     if (bundle != null) {
                         navigator.onRestoreState(bundle);
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavInflater.java b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavInflater.java
index f0a63b7..a66a4a4 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavInflater.java
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavInflater.java
@@ -97,7 +97,7 @@
     private NavDestination inflate(@NonNull Resources res, @NonNull XmlResourceParser parser,
             @NonNull AttributeSet attrs, int graphResId)
             throws XmlPullParserException, IOException {
-        Navigator navigator = mNavigatorProvider.getNavigator(parser.getName());
+        Navigator<?> navigator = mNavigatorProvider.getNavigator(parser.getName());
         final NavDestination dest = navigator.createDestination();
 
         dest.onInflate(mContext, attrs);
diff --git a/navigation/navigation-ui-ktx/api/2.2.0-alpha01.txt b/navigation/navigation-ui-ktx/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..d20eb8f
--- /dev/null
+++ b/navigation/navigation-ui-ktx/api/2.2.0-alpha01.txt
@@ -0,0 +1,51 @@
+// Signature format: 3.0
+package androidx.navigation.ui {
+
+  public final class ActivityKt {
+    ctor public ActivityKt();
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+  }
+
+  public final class AppBarConfigurationKt {
+    ctor public AppBarConfigurationKt();
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(androidx.navigation.NavGraph navGraph, androidx.drawerlayout.widget.DrawerLayout? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(android.view.Menu topLevelMenu, androidx.drawerlayout.widget.DrawerLayout? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(java.util.Set<java.lang.Integer> topLevelDestinationIds, androidx.drawerlayout.widget.DrawerLayout? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+  }
+
+  public final class BottomNavigationViewKt {
+    ctor public BottomNavigationViewKt();
+    method public static void setupWithNavController(com.google.android.material.bottomnavigation.BottomNavigationView, androidx.navigation.NavController navController);
+  }
+
+  public final class CollapsingToolbarLayoutKt {
+    ctor public CollapsingToolbarLayoutKt();
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+  }
+
+  public final class MenuItemKt {
+    ctor public MenuItemKt();
+    method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController navController);
+  }
+
+  public final class NavControllerKt {
+    ctor public NavControllerKt();
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration appBarConfiguration);
+  }
+
+  public final class NavigationViewKt {
+    ctor public NavigationViewKt();
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController navController);
+  }
+
+  public final class ToolbarKt {
+    ctor public ToolbarKt();
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+  }
+
+}
+
diff --git a/paging/runtime/ktx/api/res-2.2.0-alpha01.txt b/navigation/navigation-ui-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from paging/runtime/ktx/api/res-2.2.0-alpha01.txt
copy to navigation/navigation-ui-ktx/api/res-2.2.0-alpha01.txt
diff --git a/navigation/navigation-ui-ktx/api/restricted_2.2.0-alpha01.txt b/navigation/navigation-ui-ktx/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..d20eb8f
--- /dev/null
+++ b/navigation/navigation-ui-ktx/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,51 @@
+// Signature format: 3.0
+package androidx.navigation.ui {
+
+  public final class ActivityKt {
+    ctor public ActivityKt();
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+  }
+
+  public final class AppBarConfigurationKt {
+    ctor public AppBarConfigurationKt();
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(androidx.navigation.NavGraph navGraph, androidx.drawerlayout.widget.DrawerLayout? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(android.view.Menu topLevelMenu, androidx.drawerlayout.widget.DrawerLayout? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(java.util.Set<java.lang.Integer> topLevelDestinationIds, androidx.drawerlayout.widget.DrawerLayout? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+  }
+
+  public final class BottomNavigationViewKt {
+    ctor public BottomNavigationViewKt();
+    method public static void setupWithNavController(com.google.android.material.bottomnavigation.BottomNavigationView, androidx.navigation.NavController navController);
+  }
+
+  public final class CollapsingToolbarLayoutKt {
+    ctor public CollapsingToolbarLayoutKt();
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+  }
+
+  public final class MenuItemKt {
+    ctor public MenuItemKt();
+    method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController navController);
+  }
+
+  public final class NavControllerKt {
+    ctor public NavControllerKt();
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration appBarConfiguration);
+  }
+
+  public final class NavigationViewKt {
+    ctor public NavigationViewKt();
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController navController);
+  }
+
+  public final class ToolbarKt {
+    ctor public ToolbarKt();
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+  }
+
+}
+
diff --git a/navigation/navigation-ui/api/2.2.0-alpha01.txt b/navigation/navigation-ui/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..555b85b
--- /dev/null
+++ b/navigation/navigation-ui/api/2.2.0-alpha01.txt
@@ -0,0 +1,42 @@
+// Signature format: 3.0
+package androidx.navigation.ui {
+
+  public final class AppBarConfiguration {
+    method public androidx.drawerlayout.widget.DrawerLayout? getDrawerLayout();
+    method public androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? getFallbackOnNavigateUpListener();
+    method public java.util.Set<java.lang.Integer!> getTopLevelDestinations();
+  }
+
+  public static final class AppBarConfiguration.Builder {
+    ctor public AppBarConfiguration.Builder(androidx.navigation.NavGraph);
+    ctor public AppBarConfiguration.Builder(android.view.Menu);
+    ctor public AppBarConfiguration.Builder(int...);
+    ctor public AppBarConfiguration.Builder(java.util.Set<java.lang.Integer!>);
+    method public androidx.navigation.ui.AppBarConfiguration build();
+    method public androidx.navigation.ui.AppBarConfiguration.Builder setDrawerLayout(androidx.drawerlayout.widget.DrawerLayout?);
+    method public androidx.navigation.ui.AppBarConfiguration.Builder setFallbackOnNavigateUpListener(androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener?);
+  }
+
+  public static interface AppBarConfiguration.OnNavigateUpListener {
+    method public boolean onNavigateUp();
+  }
+
+  public final class NavigationUI {
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController);
+    method public static void setupWithNavController(com.google.android.material.bottomnavigation.BottomNavigationView, androidx.navigation.NavController);
+  }
+
+}
+
diff --git a/paging/runtime/api/res-2.2.0-alpha01.txt b/navigation/navigation-ui/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/res-2.2.0-alpha01.txt
copy to navigation/navigation-ui/api/res-2.2.0-alpha01.txt
diff --git a/navigation/navigation-ui/api/restricted_2.2.0-alpha01.txt b/navigation/navigation-ui/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..555b85b
--- /dev/null
+++ b/navigation/navigation-ui/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,42 @@
+// Signature format: 3.0
+package androidx.navigation.ui {
+
+  public final class AppBarConfiguration {
+    method public androidx.drawerlayout.widget.DrawerLayout? getDrawerLayout();
+    method public androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? getFallbackOnNavigateUpListener();
+    method public java.util.Set<java.lang.Integer!> getTopLevelDestinations();
+  }
+
+  public static final class AppBarConfiguration.Builder {
+    ctor public AppBarConfiguration.Builder(androidx.navigation.NavGraph);
+    ctor public AppBarConfiguration.Builder(android.view.Menu);
+    ctor public AppBarConfiguration.Builder(int...);
+    ctor public AppBarConfiguration.Builder(java.util.Set<java.lang.Integer!>);
+    method public androidx.navigation.ui.AppBarConfiguration build();
+    method public androidx.navigation.ui.AppBarConfiguration.Builder setDrawerLayout(androidx.drawerlayout.widget.DrawerLayout?);
+    method public androidx.navigation.ui.AppBarConfiguration.Builder setFallbackOnNavigateUpListener(androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener?);
+  }
+
+  public static interface AppBarConfiguration.OnNavigateUpListener {
+    method public boolean onNavigateUp();
+  }
+
+  public final class NavigationUI {
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController);
+    method public static void setupWithNavController(com.google.android.material.bottomnavigation.BottomNavigationView, androidx.navigation.NavController);
+  }
+
+}
+
diff --git a/navigation/navigation-ui/build.gradle b/navigation/navigation-ui/build.gradle
index 82837ed..e2149eb 100644
--- a/navigation/navigation-ui/build.gradle
+++ b/navigation/navigation-ui/build.gradle
@@ -44,8 +44,6 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(TRUTH)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
 }
 
 androidx {
diff --git a/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/AppBarConfigurationTest.kt b/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/AppBarConfigurationTest.kt
index 490e0e7..16ca6cd 100644
--- a/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/AppBarConfigurationTest.kt
+++ b/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/AppBarConfigurationTest.kt
@@ -25,18 +25,26 @@
 import androidx.navigation.testing.test
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
+import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
+import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.mockito.Mockito.mock
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class AppBarConfigurationTest {
 
+    private lateinit var context: Context
+
+    @Before
+    fun setup() {
+        context = InstrumentationRegistry.getInstrumentation().targetContext
+    }
+
     @Test
     fun testTopLevelFromGraph() {
-        val navGraph = NavController(mock(Context::class.java)).apply {
+        val navGraph = NavController(context).apply {
             navigatorProvider += TestNavigator()
         }.createGraph(startDestination = 1) {
             test(1)
@@ -64,7 +72,7 @@
     @Test
     fun testSetDrawerLayout() {
         val builder = AppBarConfiguration.Builder()
-        val drawerLayout: DrawerLayout = mock(DrawerLayout::class.java)
+        val drawerLayout = DrawerLayout(context)
         builder.setDrawerLayout(drawerLayout)
         val appBarConfiguration = builder.build()
         assertThat(appBarConfiguration.drawerLayout).isEqualTo(drawerLayout)
@@ -73,7 +81,9 @@
     @Test
     fun testSetFallbackOnNavigateUpListener() {
         val builder = AppBarConfiguration.Builder()
-        val onNavigateUpListener = mock(AppBarConfiguration.OnNavigateUpListener::class.java)
+        val onNavigateUpListener = AppBarConfiguration.OnNavigateUpListener {
+            false
+        }
         builder.setFallbackOnNavigateUpListener(onNavigateUpListener)
         val appBarConfiguration = builder.build()
         assertThat(appBarConfiguration.fallbackOnNavigateUpListener)
diff --git a/paging/common/api/2.2.0-alpha01.ignore b/paging/common/api/2.2.0-alpha01.ignore
deleted file mode 100644
index 614c125..0000000
--- a/paging/common/api/2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,21 +0,0 @@
-// Baseline format: 1.0
-AddedAbstractMethod: androidx.paging.DataSource#load$lintWithKotlin(androidx.paging.DataSource.Params<Key>, kotlin.coroutines.Continuation<? super androidx.paging.DataSource.BaseResult<Value>>):
-    Added method androidx.paging.DataSource.load$lintWithKotlin(androidx.paging.DataSource.Params<Key>,kotlin.coroutines.Continuation<? super androidx.paging.DataSource.BaseResult<Value>>)
-AddedAbstractMethod: androidx.paging.PagedList#isContiguous():
-    Added method androidx.paging.PagedList.isContiguous()
-
-
-ChangedAbstract: androidx.paging.PagedList#detach():
-    Method androidx.paging.PagedList.detach has changed 'abstract' qualifier
-ChangedAbstract: androidx.paging.PagedList#isDetached():
-    Method androidx.paging.PagedList.isDetached has changed 'abstract' qualifier
-
-
-HiddenTypeParameter: androidx.paging.ItemKeyedDataSource#loadAfter$lintWithKotlin(androidx.paging.ItemKeyedDataSource.LoadParams<Key>, kotlin.coroutines.Continuation<? super androidx.paging.ItemKeyedDataSource.Result<Value>>) parameter #1:
-    Parameter p references hidden type class androidx.paging.ItemKeyedDataSource.Result.
-HiddenTypeParameter: androidx.paging.ItemKeyedDataSource#loadBefore$lintWithKotlin(androidx.paging.ItemKeyedDataSource.LoadParams<Key>, kotlin.coroutines.Continuation<? super androidx.paging.ItemKeyedDataSource.Result<Value>>) parameter #1:
-    Parameter p references hidden type class androidx.paging.ItemKeyedDataSource.Result.
-HiddenTypeParameter: androidx.paging.ItemKeyedDataSource#loadInitial$lintWithKotlin(androidx.paging.ItemKeyedDataSource.LoadInitialParams<Key>, kotlin.coroutines.Continuation<? super androidx.paging.ItemKeyedDataSource.InitialResult<Value>>) parameter #1:
-    Parameter p references hidden type class androidx.paging.ItemKeyedDataSource.InitialResult.
-HiddenTypeParameter: androidx.paging.PositionalDataSource#loadInitial$lintWithKotlin(androidx.paging.PositionalDataSource.LoadInitialParams, kotlin.coroutines.Continuation<? super androidx.paging.PositionalDataSource.InitialResult<T>>) parameter #1:
-    Parameter p references hidden type class androidx.paging.PositionalDataSource.InitialResult.
diff --git a/paging/common/api/2.2.0-alpha01.txt b/paging/common/api/3.0.0-alpha01.txt
similarity index 100%
rename from paging/common/api/2.2.0-alpha01.txt
rename to paging/common/api/3.0.0-alpha01.txt
diff --git a/paging/common/api/restricted_2.2.0-alpha01.ignore b/paging/common/api/restricted_2.2.0-alpha01.ignore
deleted file mode 100644
index b3a04a2..0000000
--- a/paging/common/api/restricted_2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,25 +0,0 @@
-// Baseline format: 1.0
-AddedAbstractMethod: androidx.paging.DataSource#load$lintWithKotlin(androidx.paging.DataSource.Params<Key>, kotlin.coroutines.Continuation<? super androidx.paging.DataSource.BaseResult<Value>>):
-    Added method androidx.paging.DataSource.load$lintWithKotlin(androidx.paging.DataSource.Params<Key>,kotlin.coroutines.Continuation<? super androidx.paging.DataSource.BaseResult<Value>>)
-AddedAbstractMethod: androidx.paging.PagedList#isContiguous():
-    Added method androidx.paging.PagedList.isContiguous()
-
-
-ChangedAbstract: androidx.paging.PagedList#detach():
-    Method androidx.paging.PagedList.detach has changed 'abstract' qualifier
-ChangedAbstract: androidx.paging.PagedList#isDetached():
-    Method androidx.paging.PagedList.isDetached has changed 'abstract' qualifier
-
-
-HiddenTypeParameter: androidx.paging.ItemKeyedDataSource#loadAfter$lintWithKotlin(androidx.paging.ItemKeyedDataSource.LoadParams<Key>, kotlin.coroutines.Continuation<? super androidx.paging.ItemKeyedDataSource.Result<Value>>) parameter #1:
-    Parameter p references hidden type class androidx.paging.ItemKeyedDataSource.Result.
-HiddenTypeParameter: androidx.paging.ItemKeyedDataSource#loadBefore$lintWithKotlin(androidx.paging.ItemKeyedDataSource.LoadParams<Key>, kotlin.coroutines.Continuation<? super androidx.paging.ItemKeyedDataSource.Result<Value>>) parameter #1:
-    Parameter p references hidden type class androidx.paging.ItemKeyedDataSource.Result.
-HiddenTypeParameter: androidx.paging.ItemKeyedDataSource#loadInitial$lintWithKotlin(androidx.paging.ItemKeyedDataSource.LoadInitialParams<Key>, kotlin.coroutines.Continuation<? super androidx.paging.ItemKeyedDataSource.InitialResult<Value>>) parameter #1:
-    Parameter p references hidden type class androidx.paging.ItemKeyedDataSource.InitialResult.
-HiddenTypeParameter: androidx.paging.PositionalDataSource#loadInitial$lintWithKotlin(androidx.paging.PositionalDataSource.LoadInitialParams, kotlin.coroutines.Continuation<? super androidx.paging.PositionalDataSource.InitialResult<T>>) parameter #1:
-    Parameter p references hidden type class androidx.paging.PositionalDataSource.InitialResult.
-
-
-RemovedDeprecatedClass: androidx.paging.TiledDataSource:
-    Removed deprecated class androidx.paging.TiledDataSource
diff --git a/paging/common/api/restricted_2.2.0-alpha01.txt b/paging/common/api/restricted_3.0.0-alpha01.txt
similarity index 100%
rename from paging/common/api/restricted_2.2.0-alpha01.txt
rename to paging/common/api/restricted_3.0.0-alpha01.txt
diff --git a/paging/common/ktx/api/2.2.0-alpha01.ignore b/paging/common/ktx/api/2.2.0-alpha01.ignore
deleted file mode 100644
index ffce0e5..0000000
--- a/paging/common/ktx/api/2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedPackage: androidx.paging:
-    Removed package androidx.paging
diff --git a/paging/common/ktx/api/2.2.0-alpha01.txt b/paging/common/ktx/api/3.0.0-alpha01.txt
similarity index 100%
rename from paging/common/ktx/api/2.2.0-alpha01.txt
rename to paging/common/ktx/api/3.0.0-alpha01.txt
diff --git a/paging/common/ktx/api/restricted_2.2.0-alpha01.ignore b/paging/common/ktx/api/restricted_2.2.0-alpha01.ignore
deleted file mode 100644
index ffce0e5..0000000
--- a/paging/common/ktx/api/restricted_2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedPackage: androidx.paging:
-    Removed package androidx.paging
diff --git a/paging/common/ktx/api/restricted_2.2.0-alpha01.txt b/paging/common/ktx/api/restricted_2.2.0-alpha01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/paging/common/ktx/api/restricted_2.2.0-alpha01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/paging/common/ktx/api/2.2.0-alpha01.txt b/paging/common/ktx/api/restricted_3.0.0-alpha01.txt
similarity index 100%
copy from paging/common/ktx/api/2.2.0-alpha01.txt
copy to paging/common/ktx/api/restricted_3.0.0-alpha01.txt
diff --git a/paging/common/src/main/kotlin/androidx/paging/ContiguousPagedList.kt b/paging/common/src/main/kotlin/androidx/paging/ContiguousPagedList.kt
index 149b8bf..6f657c0 100644
--- a/paging/common/src/main/kotlin/androidx/paging/ContiguousPagedList.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/ContiguousPagedList.kt
@@ -26,7 +26,7 @@
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY)
 open class ContiguousPagedList<K : Any, V : Any>(
-    override val dataSource: DataSource<K, V>,
+    final override val dataSource: DataSource<K, V>,
     coroutineScope: CoroutineScope,
     mainThreadExecutor: Executor,
     backgroundThreadExecutor: Executor,
@@ -63,9 +63,19 @@
 
     private var replacePagesWithNulls = false
 
-    private val shouldTrim: Boolean
+    private val shouldTrim =
+        dataSource.supportsPageDropping && config.maxSize != Config.MAX_SIZE_UNBOUNDED
 
-    private val pager: Pager<K, V>
+    private val pager = Pager(
+        coroutineScope,
+        config,
+        PagedSourceWrapper(dataSource),
+        mainThreadExecutor,
+        backgroundThreadExecutor,
+        this,
+        initialResult.toLoadResult(),
+        storage
+    )
 
     override val isDetached
         get() = pager.isDetached
@@ -84,7 +94,7 @@
     /**
      * Given a page result, apply or drop it, and return whether more loading is needed.
      */
-    override fun onPageResult(type: LoadType, pageResult: DataSource.BaseResult<V>): Boolean {
+    override fun onPageResult(type: LoadType, pageResult: PagedSource.LoadResult<*, V>): Boolean {
         var continueLoading = false
         val page = pageResult.data
 
@@ -105,7 +115,7 @@
             } else {
                 storage.appendPage(page, this@ContiguousPagedList)
                 appendItemsRequested -= page.size
-                if (appendItemsRequested > 0 && page.size != 0) {
+                if (appendItemsRequested > 0 && page.isNotEmpty()) {
                     continueLoading = true
                 }
             }
@@ -116,7 +126,7 @@
             } else {
                 storage.prependPage(page, this@ContiguousPagedList)
                 prependItemsRequested -= page.size
-                if (prependItemsRequested > 0 && page.size != 0) {
+                if (prependItemsRequested > 0 && page.isNotEmpty()) {
                     continueLoading = true
                 }
             }
@@ -188,17 +198,6 @@
 
     init {
         this.lastLoad = lastLoad
-        pager = Pager(
-            coroutineScope,
-            config,
-            PagedSourceWrapper(dataSource), // TODO: Fix non-final in constructor.
-            mainThreadExecutor,
-            backgroundThreadExecutor,
-            this,
-            storage,
-            initialResult
-        )
-
         if (config.enablePlaceholders) {
             // Placeholders enabled, pass raw data to storage init
             storage.init(
@@ -220,9 +219,6 @@
             )
         }
 
-        shouldTrim =
-            dataSource.supportsPageDropping && config.maxSize != Config.MAX_SIZE_UNBOUNDED
-
         if (this.lastLoad == LAST_LOAD_UNSPECIFIED) {
             // Because the ContiguousPagedList wasn't initialized with a last load position,
             // initialize it to the middle of the initial load
diff --git a/paging/common/src/main/kotlin/androidx/paging/PagedList.kt b/paging/common/src/main/kotlin/androidx/paging/PagedList.kt
index af77cc1..28e3323 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PagedList.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PagedList.kt
@@ -393,7 +393,7 @@
          * Does not affect initial load, which will be done immediately on whichever thread the
          * [PagedList] is created on.
          *
-         * @param fetchExecutor [Executor] used to fetch from [DataSources], generally a background
+         * @param fetchExecutor [Executor] used to fetch from [DataSource]s, generally a background
          * thread pool for e.g. I/O or network loading.
          * @return this
          */
diff --git a/paging/common/src/main/kotlin/androidx/paging/PagedSource.kt b/paging/common/src/main/kotlin/androidx/paging/PagedSource.kt
index d2c2ac0..a892bcf 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PagedSource.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PagedSource.kt
@@ -154,7 +154,14 @@
          * implementations of [PagedSource].
          */
         val counted: Boolean
-    )
+    ) {
+        internal companion object {
+            @Suppress("MemberVisibilityCanBePrivate") // Prevent synthetic accessor generation.
+            internal val EMPTY = LoadResult(0, 0, null, null, emptyList(), 0, true)
+            @Suppress("UNCHECKED_CAST") // Can safely ignore, since the list is empty.
+            internal fun <Key : Any, Value : Any> empty() = EMPTY as LoadResult<Key, Value>
+        }
+    }
 
     /**
      * Used to define how pages are indexed, one of:
diff --git a/paging/common/src/main/kotlin/androidx/paging/PagedStorage.kt b/paging/common/src/main/kotlin/androidx/paging/PagedStorage.kt
index 92f300f..96708fc 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PagedStorage.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PagedStorage.kt
@@ -17,6 +17,7 @@
 package androidx.paging
 
 import androidx.annotation.RestrictTo
+import androidx.paging.PagedSource.LoadResult
 import java.util.AbstractList
 
 /**
@@ -300,10 +301,7 @@
         )
     }
 
-    override fun onPageResultResolution(
-        type: PagedList.LoadType,
-        result: DataSource.BaseResult<T>
-    ) {
+    override fun onPageResultResolution(type: PagedList.LoadType, result: LoadResult<*, T>) {
         // ignored
     }
 
diff --git a/paging/common/src/main/kotlin/androidx/paging/Pager.kt b/paging/common/src/main/kotlin/androidx/paging/Pager.kt
index 249b0e7..52d7dba 100644
--- a/paging/common/src/main/kotlin/androidx/paging/Pager.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/Pager.kt
@@ -18,6 +18,7 @@
 
 import androidx.paging.PagedList.LoadState
 import androidx.paging.PagedList.LoadType
+import androidx.paging.PagedSource.Companion.COUNT_UNDEFINED
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.asCoroutineDispatcher
 import kotlinx.coroutines.launch
@@ -31,11 +32,10 @@
     val notifyExecutor: Executor,
     private val fetchExecutor: Executor,
     val pageConsumer: PageConsumer<V>,
-    adjacentProvider: AdjacentProvider<V>?,
-    result: DataSource.BaseResult<V>
+    result: PagedSource.LoadResult<K, V>,
+    private val adjacentProvider: AdjacentProvider<V> = SimpleAdjacentProvider()
 ) {
     private val totalCount: Int
-    private val adjacentProvider: AdjacentProvider<V>
     private var prevKey: K? = null
     private var nextKey: K? = null
     private val detached = AtomicBoolean(false)
@@ -49,17 +49,18 @@
         get() = detached.get()
 
     init {
-        this.adjacentProvider = adjacentProvider ?: SimpleAdjacentProvider()
-        @Suppress("UNCHECKED_CAST")
-        prevKey = result.prevKey as K?
-        @Suppress("UNCHECKED_CAST")
-        nextKey = result.nextKey as K?
+        prevKey = result.prevKey
+        nextKey = result.nextKey
         this.adjacentProvider.onPageResultResolution(LoadType.REFRESH, result)
-        totalCount = result.totalCount()
+        totalCount = when (result.counted) {
+            // only one of leadingNulls / offset may be used
+            true -> result.itemsBefore + result.offset + result.data.size + result.itemsAfter
+            else -> COUNT_UNDEFINED
+        }
     }
 
     private fun listenTo(type: LoadType, future: suspend () -> PagedSource.LoadResult<K, V>) {
-        // First listen on the BG thread if the DataSource is invalid, since it can be expensive
+        // Listen on the BG thread if the paged source is invalid, since it can be expensive.
         pagedListScope.launch(fetchExecutor.asCoroutineDispatcher()) {
             try {
                 val value = future()
@@ -71,16 +72,8 @@
                 }
 
                 // Source has been verified to be valid after producing data, so sent data to UI
-                pagedListScope.launch(notifyExecutor.asCoroutineDispatcher()) {
-                    onLoadSuccess(type, object : DataSource.BaseResult<V>(
-                        value.data,
-                        value.prevKey,
-                        value.nextKey,
-                        value.itemsBefore,
-                        value.itemsAfter,
-                        value.offset,
-                        value.counted
-                    ) {})
+                launch(notifyExecutor.asCoroutineDispatcher()) {
+                    onLoadSuccess(type, value)
                 }
             } catch (throwable: Throwable) {
                 onLoadError(type, throwable)
@@ -92,7 +85,7 @@
         /**
          * @return `true` if we need to fetch more
          */
-        fun onPageResult(type: LoadType, pageResult: DataSource.BaseResult<V>): Boolean
+        fun onPageResult(type: LoadType, pageResult: PagedSource.LoadResult<*, V>): Boolean
 
         fun onStateChanged(type: LoadType, state: LoadState, error: Throwable?)
     }
@@ -110,10 +103,10 @@
          * implementation of the AdjacentProvider to handle this (generally by ignoring this call if
          * dropping is supported).
          */
-        fun onPageResultResolution(type: LoadType, result: DataSource.BaseResult<V>)
+        fun onPageResultResolution(type: LoadType, result: PagedSource.LoadResult<*, V>)
     }
 
-    private fun onLoadSuccess(type: LoadType, value: DataSource.BaseResult<V>) {
+    private fun onLoadSuccess(type: LoadType, value: PagedSource.LoadResult<K, V>) {
         if (isDetached) return // abort!
 
         adjacentProvider.onPageResultResolution(type, value)
@@ -121,13 +114,11 @@
         if (pageConsumer.onPageResult(type, value)) {
             when (type) {
                 LoadType.START -> {
-                    @Suppress("UNCHECKED_CAST")
-                    prevKey = value.prevKey as K?
+                    prevKey = value.prevKey
                     schedulePrepend()
                 }
                 LoadType.END -> {
-                    @Suppress("UNCHECKED_CAST")
-                    nextKey = value.nextKey as K?
+                    nextKey = value.nextKey
                     scheduleAppend()
                 }
                 else -> throw IllegalStateException("Can only fetch more during append/prepend")
@@ -159,21 +150,21 @@
 
     private fun canPrepend() = when (totalCount) {
         // don't know count / position from initial load, so be conservative, return true
-        DataSource.BaseResult.TOTAL_COUNT_UNKNOWN -> true
+        COUNT_UNDEFINED -> true
         // position is known, do we have space left?
         else -> adjacentProvider.firstLoadedItemIndex > 0
     }
 
     private fun canAppend() = when (totalCount) {
         // don't know count / position from initial load, so be conservative, return true
-        DataSource.BaseResult.TOTAL_COUNT_UNKNOWN -> true
+        COUNT_UNDEFINED -> true
         // count is known, do we have space left?
         else -> adjacentProvider.lastLoadedItemIndex < totalCount - 1
     }
 
     private fun schedulePrepend() {
         if (!canPrepend()) {
-            onLoadSuccess(LoadType.START, DataSource.BaseResult.empty())
+            onLoadSuccess(LoadType.START, PagedSource.LoadResult.empty())
             return
         }
 
@@ -204,7 +195,7 @@
 
     private fun scheduleAppend() {
         if (!canAppend()) {
-            onLoadSuccess(LoadType.END, DataSource.BaseResult.empty())
+            onLoadSuccess(LoadType.END, PagedSource.LoadResult.empty())
             return
         }
 
@@ -253,7 +244,7 @@
         private var leadingUnloadedCount: Int = 0
         private var trailingUnloadedCount: Int = 0
 
-        override fun onPageResultResolution(type: LoadType, result: DataSource.BaseResult<V>) {
+        override fun onPageResultResolution(type: LoadType, result: PagedSource.LoadResult<*, V>) {
             if (result.data.isEmpty()) return
 
             if (type == LoadType.START) {
@@ -269,15 +260,15 @@
                     trailingUnloadedCount -= result.data.size
                 }
             } else {
-                firstLoadedItemIndex = result.leadingNulls + result.offset
+                firstLoadedItemIndex = result.itemsBefore + result.offset
                 lastLoadedItemIndex = firstLoadedItemIndex + result.data.size - 1
                 firstLoadedItem = result.data[0]
                 lastLoadedItem = result.data.last()
 
                 if (result.counted) {
                     counted = true
-                    leadingUnloadedCount = result.leadingNulls
-                    trailingUnloadedCount = result.trailingNulls
+                    leadingUnloadedCount = result.itemsBefore
+                    trailingUnloadedCount = result.itemsAfter
                 }
             }
         }
diff --git a/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt b/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt
index cbccee3f..67238ac 100644
--- a/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt
@@ -65,11 +65,11 @@
     val data = List(9) { "$it" }
 
     private fun rangeResult(start: Int, end: Int) =
-        PositionalDataSource.RangeResult(data.subList(start, end))
+        PositionalDataSource.RangeResult(data.subList(start, end)).toLoadResult<Int>()
 
     private data class Result(
         val type: PagedList.LoadType,
-        val pageResult: DataSource.BaseResult<String>
+        val pageResult: PagedSource.LoadResult<*, String>
     )
 
     private data class StateChange(
@@ -97,7 +97,7 @@
 
         override fun onPageResult(
             type: PagedList.LoadType,
-            pageResult: DataSource.BaseResult<String>
+            pageResult: PagedSource.LoadResult<*, String>
         ): Boolean {
             results.add(Result(type, pageResult))
             return false
@@ -119,8 +119,11 @@
         DirectExecutor,
         DirectExecutor,
         consumer,
-        null,
-        PositionalDataSource.InitialResult(data.subList(start, end), start, data.size)
+        PositionalDataSource.InitialResult(
+            data.subList(start, end),
+            start,
+            data.size
+        ).toLoadResult()
     )
 
     @Test
@@ -240,7 +243,7 @@
         // Pager triggers an immediate empty response here, so we don't need to flush the executor
         assertEquals(
             listOf(
-                Result(END, DataSource.BaseResult.empty())
+                Result(END, PagedSource.LoadResult.empty<Int, String>())
             ), consumer.takeResults()
         )
         assertEquals(
@@ -260,7 +263,7 @@
         // Pager triggers an immediate empty response here, so we don't need to flush the executor
         assertEquals(
             listOf(
-                Result(START, DataSource.BaseResult.empty())
+                Result(START, PagedSource.LoadResult.empty<Int, String>())
             ), consumer.takeResults()
         )
         assertEquals(
diff --git a/paging/integration-tests/testapp/build.gradle b/paging/integration-tests/testapp/build.gradle
index 8ca84fe..11cf0af 100644
--- a/paging/integration-tests/testapp/build.gradle
+++ b/paging/integration-tests/testapp/build.gradle
@@ -42,7 +42,7 @@
     kapt(ARCH_ROOM_COMPILER)
 
     implementation(MULTIDEX)
-    implementation(SUPPORT_RECYCLERVIEW, libs.support_exclude_config)
+    implementation(SUPPORT_RECYCLERVIEW)
     implementation(project(":fragment:fragment-ktx"))
     implementation(project(":appcompat"))
     implementation(KOTLIN_STDLIB)
diff --git a/paging/runtime/api/2.2.0-alpha01.ignore b/paging/runtime/api/2.2.0-alpha01.ignore
deleted file mode 100644
index 1d7b31a..0000000
--- a/paging/runtime/api/2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedMethod: androidx.paging.AsyncPagedListDiffer#AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T>):
-    Removed constructor androidx.paging.AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter,androidx.recyclerview.widget.DiffUtil.ItemCallback<T>)
diff --git a/paging/runtime/api/2.2.0-alpha01.txt b/paging/runtime/api/3.0.0-alpha01.txt
similarity index 100%
rename from paging/runtime/api/2.2.0-alpha01.txt
rename to paging/runtime/api/3.0.0-alpha01.txt
diff --git a/paging/runtime/api/res-2.2.0-alpha01.txt b/paging/runtime/api/res-3.0.0-alpha01.txt
similarity index 100%
rename from paging/runtime/api/res-2.2.0-alpha01.txt
rename to paging/runtime/api/res-3.0.0-alpha01.txt
diff --git a/paging/runtime/api/restricted_2.2.0-alpha01.ignore b/paging/runtime/api/restricted_2.2.0-alpha01.ignore
deleted file mode 100644
index 1d7b31a..0000000
--- a/paging/runtime/api/restricted_2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedMethod: androidx.paging.AsyncPagedListDiffer#AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T>):
-    Removed constructor androidx.paging.AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter,androidx.recyclerview.widget.DiffUtil.ItemCallback<T>)
diff --git a/paging/runtime/api/restricted_2.2.0-alpha01.txt b/paging/runtime/api/restricted_2.2.0-alpha01.txt
deleted file mode 100644
index b5b45fe..0000000
--- a/paging/runtime/api/restricted_2.2.0-alpha01.txt
+++ /dev/null
@@ -1,67 +0,0 @@
-// Signature format: 3.0
-package androidx.paging {
-
-  public class AsyncPagedListDiffer<T> {
-    ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter<?> adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
-    ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.ListUpdateCallback listUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T> config);
-    method public void addLoadStateListener(kotlin.jvm.functions.Function3<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,? super java.lang.Throwable,kotlin.Unit> listener);
-    method public void addPagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
-    method public final void addPagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
-    method public androidx.paging.PagedList<T>? getCurrentList();
-    method public T? getItem(int index);
-    method public int getItemCount();
-    method public void removeLoadStateListener(kotlin.jvm.functions.Function3<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,? super java.lang.Throwable,kotlin.Unit> listener);
-    method public void removePagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
-    method public final void removePagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
-    method public void submitList(androidx.paging.PagedList<T>? pagedList);
-    method public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
-    property public androidx.paging.PagedList<T>? currentList;
-    property public int itemCount;
-  }
-
-  public static interface AsyncPagedListDiffer.PagedListListener<T> {
-    method public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
-  }
-
-  public final class AsyncPagedListDifferKt {
-    ctor public AsyncPagedListDifferKt();
-  }
-
-  public final class LivePagedListBuilder<Key, Value> {
-    ctor public LivePagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
-    ctor public LivePagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
-    method public androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> build();
-    method public androidx.paging.LivePagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
-    method public androidx.paging.LivePagedListBuilder<Key,Value> setCoroutineScope(kotlinx.coroutines.CoroutineScope coroutineScope);
-    method public androidx.paging.LivePagedListBuilder<Key,Value> setFetchExecutor(java.util.concurrent.Executor fetchExecutor);
-    method public androidx.paging.LivePagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
-  }
-
-  public final class LivePagedListKt {
-    ctor public LivePagedListKt();
-    method 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 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());
-  }
-
-  public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
-    ctor protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
-    ctor protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
-    method public void addLoadStateListener(kotlin.jvm.functions.Function3<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,? super java.lang.Throwable,kotlin.Unit> callback);
-    method public androidx.paging.PagedList<T>? getCurrentList();
-    method protected T? getItem(int position);
-    method public int getItemCount();
-    method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? currentList);
-    method public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
-    method public void onLoadStateChanged(androidx.paging.PagedList.LoadType type, androidx.paging.PagedList.LoadState state, Throwable? error);
-    method public void removeLoadStateListener(kotlin.jvm.functions.Function3<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,? super java.lang.Throwable,kotlin.Unit> callback);
-    method public void submitList(androidx.paging.PagedList<T>? pagedList);
-    method public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
-    property public androidx.paging.PagedList<T>? currentList;
-  }
-
-  public final class PagedStorageDiffHelperKt {
-    ctor public PagedStorageDiffHelperKt();
-  }
-
-}
-
diff --git a/paging/runtime/api/2.2.0-alpha01.txt b/paging/runtime/api/restricted_3.0.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/2.2.0-alpha01.txt
copy to paging/runtime/api/restricted_3.0.0-alpha01.txt
diff --git a/paging/runtime/build.gradle b/paging/runtime/build.gradle
index 31c990a..71033f7 100644
--- a/paging/runtime/build.gradle
+++ b/paging/runtime/build.gradle
@@ -37,7 +37,7 @@
     api(project(":arch:core-runtime"))
     api(ARCH_LIFECYCLE_RUNTIME)
     api(project(":lifecycle:lifecycle-livedata"))
-    api(ANDROIDX_RECYCLERVIEW, libs.support_exclude_config)
+    api(ANDROIDX_RECYCLERVIEW)
     api(KOTLIN_STDLIB)
     api(KOTLIN_COROUTINES)
 
diff --git a/paging/runtime/ktx/api/2.2.0-alpha01.ignore b/paging/runtime/ktx/api/2.2.0-alpha01.ignore
deleted file mode 100644
index ffce0e5..0000000
--- a/paging/runtime/ktx/api/2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedPackage: androidx.paging:
-    Removed package androidx.paging
diff --git a/paging/runtime/ktx/api/2.2.0-alpha01.txt b/paging/runtime/ktx/api/3.0.0-alpha01.txt
similarity index 100%
rename from paging/runtime/ktx/api/2.2.0-alpha01.txt
rename to paging/runtime/ktx/api/3.0.0-alpha01.txt
diff --git a/paging/runtime/ktx/api/res-2.2.0-alpha01.txt b/paging/runtime/ktx/api/res-3.0.0-alpha01.txt
similarity index 100%
rename from paging/runtime/ktx/api/res-2.2.0-alpha01.txt
rename to paging/runtime/ktx/api/res-3.0.0-alpha01.txt
diff --git a/paging/runtime/ktx/api/restricted_2.2.0-alpha01.ignore b/paging/runtime/ktx/api/restricted_2.2.0-alpha01.ignore
deleted file mode 100644
index ffce0e5..0000000
--- a/paging/runtime/ktx/api/restricted_2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedPackage: androidx.paging:
-    Removed package androidx.paging
diff --git a/paging/runtime/ktx/api/restricted_2.2.0-alpha01.txt b/paging/runtime/ktx/api/restricted_2.2.0-alpha01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/paging/runtime/ktx/api/restricted_2.2.0-alpha01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/paging/runtime/ktx/api/2.2.0-alpha01.txt b/paging/runtime/ktx/api/restricted_3.0.0-alpha01.txt
similarity index 100%
copy from paging/runtime/ktx/api/2.2.0-alpha01.txt
copy to paging/runtime/ktx/api/restricted_3.0.0-alpha01.txt
diff --git a/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt b/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
index a487a4f..7056e8f 100644
--- a/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
+++ b/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
@@ -75,8 +75,9 @@
         currentJob?.cancel()
         currentJob = coroutineScope.launch(fetchExecutor.asCoroutineDispatcher()) {
             try {
+                val pagedList = createPagedList()
                 withContext(notifyExecutor.asCoroutineDispatcher()) {
-                    onSuccess(createPagedList())
+                    onSuccess(pagedList)
                 }
             } catch (throwable: Throwable) {
                 withContext(notifyExecutor.asCoroutineDispatcher()) {
diff --git a/paging/rxjava2/api/2.2.0-alpha01.txt b/paging/rxjava2/api/3.0.0-alpha01.txt
similarity index 100%
rename from paging/rxjava2/api/2.2.0-alpha01.txt
rename to paging/rxjava2/api/3.0.0-alpha01.txt
diff --git a/paging/rxjava2/api/res-2.2.0-alpha01.txt b/paging/rxjava2/api/res-3.0.0-alpha01.txt
similarity index 100%
rename from paging/rxjava2/api/res-2.2.0-alpha01.txt
rename to paging/rxjava2/api/res-3.0.0-alpha01.txt
diff --git a/paging/rxjava2/api/restricted_2.2.0-alpha01.txt b/paging/rxjava2/api/restricted_2.2.0-alpha01.txt
deleted file mode 100644
index e5028e2..0000000
--- a/paging/rxjava2/api/restricted_2.2.0-alpha01.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-// Signature format: 3.0
-package androidx.paging {
-
-  public final class RxPagedListBuilder<Key, Value> {
-    ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
-    ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
-    method public io.reactivex.Flowable<androidx.paging.PagedList<Value>> buildFlowable(io.reactivex.BackpressureStrategy backpressureStrategy);
-    method public io.reactivex.Observable<androidx.paging.PagedList<Value>> buildObservable();
-    method public androidx.paging.RxPagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
-    method public androidx.paging.RxPagedListBuilder<Key,Value> setFetchScheduler(io.reactivex.Scheduler scheduler);
-    method public androidx.paging.RxPagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
-    method public androidx.paging.RxPagedListBuilder<Key,Value> setNotifyScheduler(io.reactivex.Scheduler scheduler);
-  }
-
-  public final class RxPagedListKt {
-    ctor public RxPagedListKt();
-    method 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 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 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 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);
-  }
-
-}
-
diff --git a/paging/rxjava2/api/2.2.0-alpha01.txt b/paging/rxjava2/api/restricted_3.0.0-alpha01.txt
similarity index 100%
copy from paging/rxjava2/api/2.2.0-alpha01.txt
copy to paging/rxjava2/api/restricted_3.0.0-alpha01.txt
diff --git a/paging/rxjava2/ktx/api/2.2.0-alpha01.ignore b/paging/rxjava2/ktx/api/2.2.0-alpha01.ignore
deleted file mode 100644
index ffce0e5..0000000
--- a/paging/rxjava2/ktx/api/2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedPackage: androidx.paging:
-    Removed package androidx.paging
diff --git a/paging/rxjava2/ktx/api/2.2.0-alpha01.txt b/paging/rxjava2/ktx/api/3.0.0-alpha01.txt
similarity index 100%
rename from paging/rxjava2/ktx/api/2.2.0-alpha01.txt
rename to paging/rxjava2/ktx/api/3.0.0-alpha01.txt
diff --git a/paging/rxjava2/ktx/api/res-2.2.0-alpha01.txt b/paging/rxjava2/ktx/api/res-3.0.0-alpha01.txt
similarity index 100%
rename from paging/rxjava2/ktx/api/res-2.2.0-alpha01.txt
rename to paging/rxjava2/ktx/api/res-3.0.0-alpha01.txt
diff --git a/paging/rxjava2/ktx/api/restricted_2.2.0-alpha01.ignore b/paging/rxjava2/ktx/api/restricted_2.2.0-alpha01.ignore
deleted file mode 100644
index ffce0e5..0000000
--- a/paging/rxjava2/ktx/api/restricted_2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedPackage: androidx.paging:
-    Removed package androidx.paging
diff --git a/paging/rxjava2/ktx/api/restricted_2.2.0-alpha01.txt b/paging/rxjava2/ktx/api/restricted_2.2.0-alpha01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/paging/rxjava2/ktx/api/restricted_2.2.0-alpha01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/paging/rxjava2/ktx/api/2.2.0-alpha01.txt b/paging/rxjava2/ktx/api/restricted_3.0.0-alpha01.txt
similarity index 100%
copy from paging/rxjava2/ktx/api/2.2.0-alpha01.txt
copy to paging/rxjava2/ktx/api/restricted_3.0.0-alpha01.txt
diff --git a/room/compiler/src/main/kotlin/androidx/room/parser/ParsedQuery.kt b/room/compiler/src/main/kotlin/androidx/room/parser/ParsedQuery.kt
index 15087a7..18709b5 100644
--- a/room/compiler/src/main/kotlin/androidx/room/parser/ParsedQuery.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/parser/ParsedQuery.kt
@@ -16,7 +16,9 @@
 
 package androidx.room.parser
 
+import androidx.room.processor.QueryInterpreter
 import androidx.room.verifier.QueryResultInfo
+import androidx.room.vo.Pojo
 
 sealed class Section {
 
@@ -70,12 +72,13 @@
 )
 
 data class ParsedQuery(
+    // original query as written by user, code writers should use transformed query that has been
+    // processed and optimized.
     val original: String,
     val type: QueryType,
     val inputs: List<SectionInfo>,
     val projections: List<SectionInfo>,
     val explicitColumns: List<String>,
-    // pairs of table name and alias,
     val tables: Set<Table>,
     val syntaxErrors: List<String>,
     val runtimeQueryPlaceholder: Boolean
@@ -102,9 +105,20 @@
     var resultInfo: QueryResultInfo? = null
 
     /**
-     * Rewritten when the query is interpreted and rewritten by QueryInterpreter.
+     * The transformed query when it is interpreted and rewritten by QueryInterpreter.
      */
-    var interpreted = original
+    var transformed: String = original
+        private set
+
+    /**
+     * Transform the parsed query given an interpreter.
+     */
+    fun transform(interpreter: QueryInterpreter, pojo: Pojo?): String {
+        transformed = interpreter.interpret(this, pojo)
+        return transformed
+    }
+
+    fun isTransformed() = transformed != original
 
     val sections by lazy {
         val specialSections: List<SectionInfo> = (inputs + projections).sortedBy { it.start }
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
index cb3b66d..eafa866 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
@@ -75,12 +75,7 @@
         val allMembers = context.processingEnv.elementUtils.getAllMembers(element)
 
         val views = resolveDatabaseViews(viewsMap.values.toList())
-        val queryInterpreter = QueryInterpreter(entities + views)
-        if (context.expandProjection) {
-            views.forEach { view ->
-                view.query.interpreted = queryInterpreter.interpret(view.query, view)
-            }
-        }
+        val queryInterpreter = QueryInterpreter(context, entities + views)
         val dbVerifier = if (element.hasAnnotation(SkipQueryVerification::class)) {
             null
         } else {
@@ -89,7 +84,7 @@
         context.databaseVerifier = dbVerifier
 
         if (dbVerifier != null) {
-            verifyDatabaseViews(viewsMap, dbVerifier, queryInterpreter)
+            verifyDatabaseViews(viewsMap, dbVerifier)
         }
         validateUniqueTableAndViewNames(element, entities, views)
 
@@ -299,37 +294,17 @@
 
     private fun verifyDatabaseViews(
         map: Map<TypeElement, DatabaseView>,
-        dbVerifier: DatabaseVerifier,
-        queryInterpreter: QueryInterpreter
+        dbVerifier: DatabaseVerifier
     ) {
-        fun queryIsValid(viewElement: TypeElement, view: DatabaseView): Boolean {
-            val error = view.query.resultInfo?.error
-            return if (error == null) {
-                true
-            } else {
-                context.logger.e(
-                    viewElement,
-                    DatabaseVerificationErrors.cannotVerifyQuery(error)
-                )
-                false
-            }
-        }
         for ((viewElement, view) in map) {
             if (viewElement.hasAnnotation(SkipQueryVerification::class)) {
                 continue
             }
-            // The query has already been interpreted before creating the DatabaseVerifier.
-            // Verify the original query.
             view.query.resultInfo = dbVerifier.analyze(view.query.original)
-            if (!queryIsValid(viewElement, view)) {
-                continue
-            }
-            if (context.expandProjection) {
-                // Reinterpret with the resultInfo.
-                view.query.interpreted = queryInterpreter.interpret(view.query, view)
-                // Verify the interpreted query.
-                view.query.resultInfo = dbVerifier.analyze(view.query.interpreted)
-                queryIsValid(viewElement, view)
+            if (view.query.resultInfo?.error != null) {
+                context.logger.e(viewElement,
+                    DatabaseVerificationErrors.cannotVerifyQuery(
+                        view.query.resultInfo!!.error!!))
             }
         }
     }
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/QueryInterpreter.kt b/room/compiler/src/main/kotlin/androidx/room/processor/QueryInterpreter.kt
index 8617c92..6180d0f 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/QueryInterpreter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/QueryInterpreter.kt
@@ -31,6 +31,7 @@
  * Interprets and rewrites SQL queries in the context of the provided entities and views.
  */
 class QueryInterpreter(
+    val context: Context,
     val tables: List<EntityOrView>
 ) {
 
@@ -45,7 +46,9 @@
     }
 
     /**
-     * Analyzes and rewrites the specified [query] in the context of the provided [pojo].
+     * Rewrites the specified [query] in the context of the provided [pojo]. Expanding its start
+     * projection ('SELECT *') and converting its named binding templates to positional
+     * templates (i.e. ':VVV' to '?').
      */
     fun interpret(
         query: ParsedQuery,
@@ -57,51 +60,62 @@
                 is Section.Text -> section.text
                 is Section.BindVar -> "?"
                 is Section.Newline -> "\n"
-                is Section.Projection -> if (pojo == null) {
-                    section.text
+                is Section.Projection -> {
+                    if (!context.expandProjection || pojo == null) {
+                        section.text
+                    } else {
+                        interpretProjection(query, section, pojo, queriedTableNames)
+                    }
+                }
+            }
+        }
+    }
+
+    private fun interpretProjection(
+        query: ParsedQuery,
+        section: Section.Projection,
+        pojo: Pojo,
+        queriedTableNames: List<String>
+    ): String {
+        val aliasToName = query.tables
+            .map { (name, alias) -> alias to name }
+            .toMap(IdentifierMap())
+        val nameToAlias = query.tables
+            .groupBy { it.name.toLowerCase(Locale.ENGLISH) }
+            .filter { (_, pairs) -> pairs.size == 1 }
+            .map { (name, pairs) -> name to pairs.first().alias }
+            .toMap(IdentifierMap())
+        return when (section) {
+            is Section.Projection.All -> {
+                expand(
+                    pojo = pojo,
+                    ignoredColumnNames = query.explicitColumns,
+                    // The columns come directly from the specified table.
+                    // We should not prepend the prefix-dot to the columns.
+                    shallow = findEntityOrView(pojo)?.tableName in queriedTableNames,
+                    nameToAlias = nameToAlias,
+                    resultInfo = query.resultInfo
+                )
+            }
+            is Section.Projection.Table -> {
+                val embedded = findEmbeddedField(pojo, section.tableAlias)
+                if (embedded != null) {
+                    expandEmbeddedField(
+                        embedded = embedded,
+                        table = findEntityOrView(embedded.pojo),
+                        shallow = false,
+                        tableToAlias = nameToAlias
+                    ).joinToString(", ")
                 } else {
-                    val aliasToName = query.tables
-                        .map { (name, alias) -> alias to name }
-                        .toMap(IdentifierMap())
-                    val nameToAlias = query.tables
-                        .groupBy { it.name.toLowerCase(Locale.ENGLISH) }
-                        .filter { (_, pairs) -> pairs.size == 1 }
-                        .map { (name, pairs) -> name to pairs.first().alias }
-                        .toMap(IdentifierMap())
-                    when (section) {
-                        is Section.Projection.All -> {
-                            expand(
-                                pojo,
-                                query.explicitColumns,
-                                // The columns come directly from the specified table.
-                                // We should not prepend the prefix-dot to the columns.
-                                findEntityOrView(pojo)?.tableName in queriedTableNames,
-                                nameToAlias,
-                                query.resultInfo
-                            )
-                        }
-                        is Section.Projection.Table -> {
-                            val embedded = findEmbeddedField(pojo, section.tableAlias)
-                            if (embedded != null) {
-                                expandEmbeddedField(
-                                    embedded,
-                                    findEntityOrView(embedded.pojo),
-                                    false,
-                                    nameToAlias
-                                ).joinToString(", ")
-                            } else {
-                                val tableName =
-                                    aliasToName[section.tableAlias] ?: section.tableAlias
-                                val table = tables.find { it.tableName == tableName }
-                                pojo.fields.filter { field ->
-                                    field.parent == null &&
-                                            field.columnName !in query.explicitColumns &&
-                                            table?.columnNames?.contains(field.columnName) == true
-                                }.joinToString(", ") { field ->
-                                    "`${section.tableAlias}`.`${field.columnName}`"
-                                }
-                            }
-                        }
+                    val tableName =
+                        aliasToName[section.tableAlias] ?: section.tableAlias
+                    val table = tables.find { it.tableName == tableName }
+                    pojo.fields.filter { field ->
+                        field.parent == null &&
+                                field.columnName !in query.explicitColumns &&
+                                table?.columnNames?.contains(field.columnName) == true
+                    }.joinToString(", ") { field ->
+                        "`${section.tableAlias}`.`${field.columnName}`"
                     }
                 }
             }
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt
index afb46a34a..aed5b8f 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt
@@ -55,11 +55,12 @@
         context.checker.check(annotation != null, executableElement,
                 ProcessorErrors.MISSING_QUERY_ANNOTATION)
 
+        val skipQueryVerification = executableElement.hasAnnotation(SkipQueryVerification::class)
         val query = if (annotation != null) {
             val query = SqlParser.parse(annotation.value)
             context.checker.check(query.errors.isEmpty(), executableElement,
                     query.errors.joinToString("\n"))
-            if (!executableElement.hasAnnotation(SkipQueryVerification::class)) {
+            if (!skipQueryVerification) {
                 query.resultInfo = dbVerifier?.analyze(query.original)
             }
             if (query.resultInfo?.error != null) {
@@ -86,6 +87,17 @@
             getQueryMethod(delegate, returnType, query)
         }
 
+        if (!skipQueryVerification && query.isTransformed()) {
+            // If the query was transformed we need to re-verify it.
+            query.resultInfo = dbVerifier?.analyze(query.transformed)
+            query.resultInfo?.error?.let { error ->
+                context.logger.e(
+                    executableElement,
+                    DatabaseVerificationErrors.cannotVerifyQuery(error)
+                )
+            }
+        }
+
         val missing = queryMethod.sectionToParamMapping
                 .filter { it.second == null }
                 .map { it.first.text }
@@ -117,6 +129,8 @@
 
         val parameters = delegate.extractQueryParams()
 
+        query.transform(queryInterpreter, null)
+
         return WriteQueryMethod(
             element = executableElement,
             query = query,
@@ -132,6 +146,7 @@
         query: ParsedQuery
     ): QueryMethod {
         val resultBinder = delegate.findResultBinder(returnType, query)
+        val rowAdapter = resultBinder.adapter?.rowAdapter
         context.checker.check(
             resultBinder.adapter != null,
             executableElement,
@@ -140,34 +155,20 @@
         val inTransaction = executableElement.hasAnnotation(Transaction::class)
         if (query.type == QueryType.SELECT && !inTransaction) {
             // put a warning if it is has relations and not annotated w/ transaction
-            resultBinder.adapter?.rowAdapter?.let { rowAdapter ->
-                if (rowAdapter is PojoRowAdapter && rowAdapter.relationCollectors.isNotEmpty()) {
-                    context.logger.w(Warning.RELATION_QUERY_WITHOUT_TRANSACTION,
-                        executableElement, ProcessorErrors.TRANSACTION_MISSING_ON_RELATION)
-                }
+            if (rowAdapter is PojoRowAdapter && rowAdapter.relationCollectors.isNotEmpty()) {
+                context.logger.w(Warning.RELATION_QUERY_WITHOUT_TRANSACTION,
+                    executableElement, ProcessorErrors.TRANSACTION_MISSING_ON_RELATION)
             }
         }
 
         val parameters = delegate.extractQueryParams()
 
-        if (context.expandProjection) {
-            resultBinder.adapter?.rowAdapter?.let { rowAdapter ->
-                if (rowAdapter is PojoRowAdapter) {
-                    query.interpreted = queryInterpreter.interpret(query, rowAdapter.pojo)
-                    if (dbVerifier != null) {
-                        query.resultInfo = dbVerifier.analyze(query.interpreted)
-                        if (query.resultInfo?.error != null) {
-                            context.logger.e(
-                                executableElement,
-                                DatabaseVerificationErrors.cannotVerifyQuery(
-                                    query.resultInfo!!.error!!
-                                )
-                            )
-                        }
-                    }
-                }
-            }
+        val pojo = if (rowAdapter is PojoRowAdapter) {
+            rowAdapter.pojo
+        } else {
+            null
         }
+        query.transform(queryInterpreter, pojo)
 
         return ReadQueryMethod(
             element = executableElement,
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt
index d6703c4..e37ec0b 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt
@@ -78,7 +78,7 @@
                 }
         val viewDescriptions = views
                 .sortedBy { it.viewName }
-                .map { it.viewName + it.query.interpreted }
+                .map { it.viewName + it.query.original }
         val input = (entityDescriptions + indexDescriptions + viewDescriptions)
                 .joinToString("¯\\_(ツ)_/¯")
         DigestUtils.md5Hex(input)
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/DatabaseView.kt b/room/compiler/src/main/kotlin/androidx/room/vo/DatabaseView.kt
index bee2cd6..6177e02 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/DatabaseView.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/DatabaseView.kt
@@ -52,13 +52,13 @@
 
     override fun getIdKey(): String {
         val identityKey = SchemaIdentityKey()
-        identityKey.append(query.interpreted)
+        identityKey.append(query.original)
         return identityKey.hash()
     }
 
     private fun createViewQuery(viewName: String): String {
         // This query should match exactly like it is stored in sqlite_master. The query is
         // trimmed. "IF NOT EXISTS" should not be included.
-        return "CREATE VIEW `$viewName` AS ${query.interpreted.trim()}"
+        return "CREATE VIEW `$viewName` AS ${query.original.trim()}"
     }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt
index 52ebee9..b58683e 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt
@@ -118,7 +118,7 @@
                 }
             } else {
                 addStatement("final $T $L = $S", String::class.typeName(),
-                        outSqlQueryName, query.interpreted)
+                        outSqlQueryName, query.transformed)
                 if (outArgsName != null) {
                     addStatement("final $T $L = $T.acquire($L, $L)",
                             ROOM_SQL_QUERY, outArgsName, ROOM_SQL_QUERY, outSqlQueryName,
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt
index e79eb3a..203de90 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt
@@ -162,7 +162,7 @@
             val dbElm = invocation.context.processingEnv.elementUtils
                 .getTypeElement(RoomTypeNames.ROOM_DB.toString())
             val dbType = MoreTypes.asDeclared(dbElm.asType())
-            val queryInterpreter = QueryInterpreter(emptyList())
+            val queryInterpreter = QueryInterpreter(invocation.context, emptyList())
             val processedDao = DaoProcessor(
                 invocation.context, daoElm, dbType, null, queryInterpreter
             ).process()
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/QueryInterpreterTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/QueryInterpreterTest.kt
index d0c71bf..0d13300 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/QueryInterpreterTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/QueryInterpreterTest.kt
@@ -490,7 +490,10 @@
     @Test
     fun joinAndAbandonEntity() {
         val all = ENTITIES
-        simpleRun(*all) { invocation ->
+        simpleRun(
+            jfos = *all,
+            options = listOf("-Aroom.expandProjection=true")
+        ) { invocation ->
             val entities = invocation.roundEnv
                 .getElementsAnnotatedWith(androidx.room.Entity::class.java)
                 .map { element ->
@@ -511,7 +514,7 @@
             val query = SqlParser.parse("SELECT * FROM User JOIN Team ON User.id = Team.id")
             val verifier = createVerifierFromEntitiesAndViews(invocation)
             query.resultInfo = verifier.analyze(query.original)
-            val interpreter = QueryInterpreter(entities)
+            val interpreter = QueryInterpreter(invocation.context, entities)
             val expanded = interpreter.interpret(query, entity)
             val expected = """
                 SELECT `User`.`id` AS `id`, `User`.`firstName` AS `firstName`,
@@ -580,7 +583,10 @@
         handler: (expanded: String, invocation: TestInvocation) -> Unit
     ): CompileTester {
         val all = ENTITIES + JavaFileObjects.forSourceString(name, DATABASE_PREFIX + input)
-        return simpleRun(*all) { invocation ->
+        return simpleRun(
+            jfos = *all,
+            options = listOf("-Aroom.expandProjection=true")
+        ) { invocation ->
             val entities = invocation.roundEnv
                 .getElementsAnnotatedWith(androidx.room.Entity::class.java)
                 .map { element ->
@@ -601,7 +607,7 @@
             val query = SqlParser.parse(original)
             val verifier = createVerifierFromEntitiesAndViews(invocation)
             query.resultInfo = verifier.analyze(query.original)
-            val interpreter = QueryInterpreter(entities)
+            val interpreter = QueryInterpreter(invocation.context, entities)
             val expanded = interpreter.interpret(query, pojo)
             handler(expanded, invocation)
         }
diff --git a/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt b/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt
index c5a6919..09a37e8 100644
--- a/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt
@@ -279,8 +279,7 @@
     fun singleQueryMethod(
         vararg input: String,
         handler: (QueryWriter) -> Unit
-    ):
-            CompileTester {
+    ): CompileTester {
         return Truth.assertAbout(JavaSourceSubjectFactory.javaSource())
                 .that(JavaFileObjects.forSourceString("foo.bar.MyClass",
                         DAO_PREFIX + input.joinToString("\n") + DAO_SUFFIX
@@ -307,8 +306,6 @@
                                     executableElement = MoreElements.asExecutable(methods.first()),
                                     queryInterpreter = queryInterpreter)
                             val method = parser.process()
-                            method.query.interpreted =
-                                queryInterpreter.interpret(method.query, null)
                             handler(QueryWriter(method))
                             true
                         }
diff --git a/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt b/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt
index 72731f6..1bf74f5 100644
--- a/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt
@@ -183,7 +183,7 @@
     val views = invocation.roundEnv.getElementsAnnotatedWith(DatabaseView::class.java).map {
         DatabaseViewProcessor(invocation.context, MoreElements.asType(it)).process()
     }
-    return QueryInterpreter(entities + views)
+    return QueryInterpreter(invocation.context, entities + views)
 }
 
 fun createVerifierFromEntitiesAndViews(invocation: TestInvocation): DatabaseVerifier {
diff --git a/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt b/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt
index 1acc310..ec24403 100644
--- a/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt
@@ -106,10 +106,6 @@
                                     queryInterpreter = queryInterpreter,
                                     dbVerifier = createVerifierFromEntitiesAndViews(invocation))
                             val parsedDao = parser.process()
-                            parsedDao.queryMethods.forEach { method ->
-                                method.query.interpreted =
-                                    queryInterpreter.interpret(method.query, null)
-                            }
                             DaoWriter(parsedDao, db, invocation.processingEnv)
                                 .write(invocation.processingEnv)
                             true
diff --git a/room/guava/build.gradle b/room/guava/build.gradle
index a28ca6c..3cbd76e 100644
--- a/room/guava/build.gradle
+++ b/room/guava/build.gradle
@@ -32,7 +32,7 @@
     }
     implementation(ARCH_CORE_RUNTIME)
 
-    api(SUPPORT_ANNOTATIONS, libs.support_exclude_config)
+    api(SUPPORT_ANNOTATIONS)
     api(GUAVA_ANDROID)
 }
 
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/dao/BaseDao.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/dao/BaseDao.kt
index 5224667..1653a0e 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/dao/BaseDao.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/dao/BaseDao.kt
@@ -30,6 +30,12 @@
     fun insertAll(t: List<T>)
 
     @Insert
+    fun insertAllSet(t: Set<T>): List<Long>
+
+    @Insert
+    fun insertAllCollection(t: Collection<T>): Array<Long>
+
+    @Insert
     fun insertAllArg(vararg t: T)
 
     @Update
diff --git a/room/integration-tests/testapp/build.gradle b/room/integration-tests/testapp/build.gradle
index 87b3ba4..248311c 100644
--- a/room/integration-tests/testapp/build.gradle
+++ b/room/integration-tests/testapp/build.gradle
@@ -55,8 +55,8 @@
 
     // FINDBUGS dependency resolves an app/testapp version conflict.
     implementation(FINDBUGS)
-    implementation(SUPPORT_RECYCLERVIEW, libs.support_exclude_config)
-    implementation(SUPPORT_APPCOMPAT, libs.support_exclude_config)
+    implementation(SUPPORT_RECYCLERVIEW)
+    implementation(SUPPORT_APPCOMPAT)
     annotationProcessor project(":room:room-compiler")
     androidTestAnnotationProcessor project(":room:room-compiler")
 
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/dao/UserDao.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/dao/UserDao.java
index faf95fb..c489c27 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/dao/UserDao.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/dao/UserDao.java
@@ -315,4 +315,7 @@
 
     @Update
     public abstract ListenableFuture<Void> updateWithVoidFuture(User user);
+
+    @Query("UPDATE user SET mName = :name, mLastName = :name WHERE mId = :userId")
+    public abstract void setSameNames(String name, int userId);
 }
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/DatabaseViewTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/DatabaseViewTest.java
index 69d455e..9c1bb03 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/DatabaseViewTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/DatabaseViewTest.java
@@ -189,9 +189,9 @@
     }
 
     @DatabaseView(
-            "SELECT * FROM Team "
-                    + "INNER JOIN Department AS department_ "
-                    + "ON Team.departmentId = department_.id"
+            "SELECT Team.*, dep.id AS department_id, dep.name as department_name FROM Team "
+                    + "INNER JOIN Department AS dep "
+                    + "ON Team.departmentId = dep.id"
     )
     static class TeamDetail2 {
         @Embedded
@@ -200,8 +200,12 @@
         public Department department;
     }
 
-    @DatabaseView("SELECT * FROM TeamDetail AS first_, TeamDetail AS second_ "
-            + "WHERE first_.id <> second_.id")
+    @DatabaseView("SELECT td1.id AS first_id, td1.name AS first_name, "
+            + "td1.departmentId AS first_departmentId, td1.departmentName AS first_departmentName, "
+            + "td2.id AS second_id, td2.name AS second_name, "
+            + "td2.departmentId AS second_departmentId, "
+            + "td2.departmentName AS second_departmentName "
+            + "FROM TeamDetail AS td1, TeamDetail AS td2 WHERE td1.id <> td2.id")
     static class TeamPair {
         @Embedded(prefix = "first_")
         public TeamDetail first;
@@ -430,7 +434,7 @@
 
     @Test
     @MediumTest
-    public void expandProjection() {
+    public void expandedProjection() {
         final CompanyDatabase db = getDatabase();
         db.department().insert(new Department(3L, "Sales"));
         db.team().insert(new Team(5L, 3L, "Books"));
@@ -444,7 +448,7 @@
 
     @Test
     @MediumTest
-    public void expandProjection_embedView() {
+    public void expandedProjection_embedView() {
         final CompanyDatabase db = getDatabase();
         db.department().insert(new Department(3L, "Sales"));
         db.team().insert(new Team(5L, 3L, "Books"));
@@ -456,4 +460,4 @@
         assertThat(pairs.get(0).second.name, is(equalTo("Toys")));
         assertThat(pairs.get(0).second.departmentName, is(equalTo("Sales")));
     }
-}
+}
\ No newline at end of file
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/MultiInstanceInvalidationTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/MultiInstanceInvalidationTest.java
index be78eb4..7b6dad7 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/MultiInstanceInvalidationTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/MultiInstanceInvalidationTest.java
@@ -44,7 +44,6 @@
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
-import androidx.test.filters.MediumTest;
 import androidx.test.platform.app.InstrumentationRegistry;
 import androidx.test.rule.ServiceTestRule;
 
@@ -63,6 +62,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
+@LargeTest
 @RunWith(AndroidJUnit4.class)
 public class MultiInstanceInvalidationTest {
 
@@ -110,7 +110,6 @@
     }
 
     @Test
-    @MediumTest
     public void invalidateInAnotherInstance() throws Exception {
         final SampleDatabase db1 = openDatabase(true);
         final SampleDatabase db2 = openDatabase(true);
@@ -125,7 +124,6 @@
     }
 
     @Test
-    @LargeTest
     public void invalidationInAnotherInstance_noMultiInstanceInvalidation() throws Exception {
         final SampleDatabase db1 = openDatabase(false);
         final SampleDatabase db2 = openDatabase(false);
@@ -146,7 +144,6 @@
     }
 
     @Test
-    @LargeTest
     public void invalidationInAnotherInstance_mixed() throws Exception {
         final SampleDatabase db1 = openDatabase(false);
         final SampleDatabase db2 = openDatabase(true); // Enabled only on one side
@@ -167,7 +164,6 @@
     }
 
     @Test
-    @LargeTest
     public void invalidationInAnotherInstance_closed() throws Exception {
         final SampleDatabase db1 = openDatabase(true);
         final SampleDatabase db2 = openDatabase(true);
@@ -198,7 +194,6 @@
     }
 
     @Test
-    @LargeTest
     public void invalidationCausesNoLoop() throws Exception {
         final SampleDatabase db1 = openDatabase(true);
         final SampleDatabase db2 = openDatabase(true);
@@ -213,7 +208,6 @@
     }
 
     @Test
-    @MediumTest
     public void reopen() throws Exception {
         final SampleDatabase db1 = openDatabase(true);
         final Product product = new Product();
@@ -230,7 +224,6 @@
     }
 
     @Test
-    @MediumTest
     public void invalidatedByAnotherProcess() throws Exception {
         bindTestService();
         final SampleDatabase db = openDatabase(true);
@@ -246,7 +239,6 @@
     }
 
     @Test
-    @MediumTest
     public void invalidateAnotherProcess() throws Exception {
         bindTestService();
         final SampleDatabase db = openDatabase(true);
@@ -258,7 +250,6 @@
     // TODO: b/72877822 Better performance measurement
     @Ignore
     @Test
-    @LargeTest
     public void performance_oneByOne() {
         final List<Customer> customers = generateCustomers(100);
         final long[] elapsed = measureSeveralTimesEach(false, customers);
@@ -269,7 +260,6 @@
     // TODO: b/72877822 Better performance measurement
     @Ignore
     @Test
-    @LargeTest
     public void performance_bulk() {
         final List<Customer> customers = generateCustomers(10000);
         final long[] elapsed = measureSeveralTimesEach(true, customers);
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/SimpleEntityReadWriteTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/SimpleEntityReadWriteTest.java
index c438d69..fa94e6b 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/SimpleEntityReadWriteTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/SimpleEntityReadWriteTest.java
@@ -693,6 +693,16 @@
         assertThat(loadedUsers, hasItems(users));
     }
 
+    @Test
+    public void updateQuery() {
+        User user1 = TestUtil.createUser(1);
+        mUserDao.insert(user1);
+        mUserDao.setSameNames("same", 1);
+        User result = mUserDao.load(1);
+        assertThat(result.getName(), is("same"));
+        assertThat(result.getLastName(), is("same"));
+    }
+
     private Set<Day> toSet(Day... days) {
         return new HashSet<>(Arrays.asList(days));
     }
diff --git a/room/runtime/api/restricted_2.2.0-alpha02.txt b/room/runtime/api/restricted_2.2.0-alpha02.txt
index f3a1d00..8111b31 100644
--- a/room/runtime/api/restricted_2.2.0-alpha02.txt
+++ b/room/runtime/api/restricted_2.2.0-alpha02.txt
@@ -38,12 +38,12 @@
     method public final void insert(T![]!);
     method public final void insert(Iterable<? extends T>!);
     method public final long insertAndReturnId(T!);
-    method public final long[]! insertAndReturnIdsArray(java.util.Collection<T!>!);
+    method public final long[]! insertAndReturnIdsArray(java.util.Collection<? extends T>!);
     method public final long[]! insertAndReturnIdsArray(T![]!);
-    method public final Long![]! insertAndReturnIdsArrayBox(java.util.Collection<T!>!);
+    method public final Long![]! insertAndReturnIdsArrayBox(java.util.Collection<? extends T>!);
     method public final Long![]! insertAndReturnIdsArrayBox(T![]!);
     method public final java.util.List<java.lang.Long!>! insertAndReturnIdsList(T![]!);
-    method public final java.util.List<java.lang.Long!>! insertAndReturnIdsList(java.util.Collection<T!>!);
+    method public final java.util.List<java.lang.Long!>! insertAndReturnIdsList(java.util.Collection<? extends T>!);
   }
 
   public class InvalidationTracker {
diff --git a/room/runtime/api/restricted_current.txt b/room/runtime/api/restricted_current.txt
index f3a1d00..8111b31 100644
--- a/room/runtime/api/restricted_current.txt
+++ b/room/runtime/api/restricted_current.txt
@@ -38,12 +38,12 @@
     method public final void insert(T![]!);
     method public final void insert(Iterable<? extends T>!);
     method public final long insertAndReturnId(T!);
-    method public final long[]! insertAndReturnIdsArray(java.util.Collection<T!>!);
+    method public final long[]! insertAndReturnIdsArray(java.util.Collection<? extends T>!);
     method public final long[]! insertAndReturnIdsArray(T![]!);
-    method public final Long![]! insertAndReturnIdsArrayBox(java.util.Collection<T!>!);
+    method public final Long![]! insertAndReturnIdsArrayBox(java.util.Collection<? extends T>!);
     method public final Long![]! insertAndReturnIdsArrayBox(T![]!);
     method public final java.util.List<java.lang.Long!>! insertAndReturnIdsList(T![]!);
-    method public final java.util.List<java.lang.Long!>! insertAndReturnIdsList(java.util.Collection<T!>!);
+    method public final java.util.List<java.lang.Long!>! insertAndReturnIdsList(java.util.Collection<? extends T>!);
   }
 
   public class InvalidationTracker {
diff --git a/room/runtime/src/main/java/androidx/room/EntityInsertionAdapter.java b/room/runtime/src/main/java/androidx/room/EntityInsertionAdapter.java
index 8572f9e..3046d6c 100644
--- a/room/runtime/src/main/java/androidx/room/EntityInsertionAdapter.java
+++ b/room/runtime/src/main/java/androidx/room/EntityInsertionAdapter.java
@@ -123,7 +123,7 @@
      * @param entities Entities to insert
      * @return The SQLite row ids, for entities that are not inserted the row id returned will be -1
      */
-    public final long[] insertAndReturnIdsArray(Collection<T> entities) {
+    public final long[] insertAndReturnIdsArray(Collection<? extends T> entities) {
         final SupportSQLiteStatement stmt = acquire();
         try {
             final long[] result = new long[entities.size()];
@@ -167,7 +167,7 @@
      * @param entities Entities to insert
      * @return The SQLite row ids, for entities that are not inserted the row id returned will be -1
      */
-    public final Long[] insertAndReturnIdsArrayBox(Collection<T> entities) {
+    public final Long[] insertAndReturnIdsArrayBox(Collection<? extends T> entities) {
         final SupportSQLiteStatement stmt = acquire();
         try {
             final Long[] result = new Long[entities.size()];
@@ -233,7 +233,7 @@
      * @param entities Entities to insert
      * @return The SQLite row ids, for entities that are not inserted the row id returned will be -1
      */
-    public final List<Long> insertAndReturnIdsList(Collection<T> entities) {
+    public final List<Long> insertAndReturnIdsList(Collection<? extends T> entities) {
         final SupportSQLiteStatement stmt = acquire();
         try {
             final List<Long> result = new ArrayList<>(entities.size());
diff --git a/room/runtime/src/main/java/androidx/room/MultiInstanceInvalidationClient.java b/room/runtime/src/main/java/androidx/room/MultiInstanceInvalidationClient.java
index bf24bf1..3aeddcc 100644
--- a/room/runtime/src/main/java/androidx/room/MultiInstanceInvalidationClient.java
+++ b/room/runtime/src/main/java/androidx/room/MultiInstanceInvalidationClient.java
@@ -38,12 +38,11 @@
 class MultiInstanceInvalidationClient {
 
     /**
-     * If this is {@link null}, this {@link MultiInstanceInvalidationClient} is no longer available.
+     * The application context.
      */
     // synthetic access
     @SuppressWarnings("WeakerAccess")
-    @Nullable
-    Context mContext;
+    final Context mAppContext;
 
     /**
      * The name of the database file.
@@ -109,7 +108,6 @@
         public void onServiceDisconnected(ComponentName name) {
             mExecutor.execute(mRemoveObserverRunnable);
             mService = null;
-            mContext = null;
         }
 
     };
@@ -152,10 +150,7 @@
             } catch (RemoteException e) {
                 Log.w(Room.LOG_TAG, "Cannot unregister multi-instance invalidation callback", e);
             }
-            if (mContext != null) {
-                mContext.unbindService(mServiceConnection);
-                mContext = null;
-            }
+            mAppContext.unbindService(mServiceConnection);
         }
     };
 
@@ -168,7 +163,7 @@
      */
     MultiInstanceInvalidationClient(Context context, String name,
             InvalidationTracker invalidationTracker, Executor executor) {
-        mContext = context.getApplicationContext();
+        mAppContext = context.getApplicationContext();
         mName = name;
         mInvalidationTracker = invalidationTracker;
         mExecutor = executor;
@@ -179,8 +174,10 @@
                     return;
                 }
                 try {
-                    mService.broadcastInvalidation(mClientId,
-                            tables.toArray(new String[0]));
+                    final IMultiInstanceInvalidationService service = mService;
+                    if (service != null) {
+                        service.broadcastInvalidation(mClientId, tables.toArray(new String[0]));
+                    }
                 } catch (RemoteException e) {
                     Log.w(Room.LOG_TAG, "Cannot broadcast invalidation", e);
                 }
@@ -191,8 +188,8 @@
                 return true;
             }
         };
-        Intent intent = new Intent(mContext, MultiInstanceInvalidationService.class);
-        mContext.bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
+        Intent intent = new Intent(mAppContext, MultiInstanceInvalidationService.class);
+        mAppContext.bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
     }
 
     void stop() {
diff --git a/room/rxjava2/build.gradle b/room/rxjava2/build.gradle
index 6d36fc3..81cae70 100644
--- a/room/rxjava2/build.gradle
+++ b/room/rxjava2/build.gradle
@@ -29,8 +29,9 @@
     api(project(":room:room-common"))
     api(project(":room:room-runtime"))
     implementation(ARCH_CORE_RUNTIME)
-    api(SUPPORT_CORE_UTILS, libs.support_exclude_config)
+    api(SUPPORT_CORE_UTILS)
     api(RX_JAVA)
+
     testImplementation(JUNIT)
     testImplementation(MOCKITO_CORE)
     testImplementation(ARCH_CORE_TESTING)
diff --git a/room/testing/build.gradle b/room/testing/build.gradle
index 9c45fdd..ec0d0cd 100644
--- a/room/testing/build.gradle
+++ b/room/testing/build.gradle
@@ -32,7 +32,7 @@
     api(ANDROIDX_SQLITE_FRAMEWORK)
     api(project(":room:room-migration"))
     implementation(ARCH_CORE_RUNTIME)
-    api(SUPPORT_CORE_UTILS, libs.support_exclude_config)
+    api(SUPPORT_CORE_UTILS)
     api(JUNIT)
 }
 
diff --git a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoActivityController.java b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoActivityController.java
index 3e54cc5..97033ec 100644
--- a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoActivityController.java
+++ b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoActivityController.java
@@ -58,6 +58,6 @@
 
     @Override
     void reconnect() {
-        mBiometricPrompt = new BiometricPrompt(mActivity, mAuthenticationCallback, mExecutor);
+        mBiometricPrompt = new BiometricPrompt(mActivity, mExecutor, mAuthenticationCallback);
     }
 }
diff --git a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoFragmentController.java b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoFragmentController.java
index 48b3776..fb520bd 100644
--- a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoFragmentController.java
+++ b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoFragmentController.java
@@ -61,6 +61,6 @@
 
     @Override
     void reconnect() {
-        mBiometricPrompt = new BiometricPrompt(mFragment, mAuthenticationCallback, mExecutor);
+        mBiometricPrompt = new BiometricPrompt(mFragment, mExecutor, mAuthenticationCallback);
     }
 }
diff --git a/savedstate/build.gradle b/savedstate/build.gradle
index 5859743..9fb3daf 100644
--- a/savedstate/build.gradle
+++ b/savedstate/build.gradle
@@ -22,9 +22,10 @@
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
     implementation(ARCH_CORE_COMMON)
-    implementation(ARCH_LIFECYCLE_COMMON, libs.exclude_annotations_transitive)
+    implementation(ARCH_LIFECYCLE_COMMON)
+
     androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(ARCH_LIFECYCLE_RUNTIME, libs.exclude_annotations_transitive)
+    androidTestImplementation(ARCH_LIFECYCLE_RUNTIME)
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
diff --git a/settings.gradle b/settings.gradle
index 41c6beb..663dc05 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -39,7 +39,7 @@
 includeProject(":activity:activity-ktx", "activity/activity-ktx")
 includeProject(":activity:integration-tests:testapp", "activity/integration-tests/testapp")
 includeProject(":ads-identifier", "ads/ads-identifier")
-includeProject(":annotation", "annotations")
+includeProject(":annotation:annotation", "annotation/annotation")
 includeProject(":annotation:annotation-sampled", "annotation/annotation-sampled")
 includeProject(":annotation:annotation-experimental", "annotation/annotation-experimental")
 includeProject(":annotation:annotation-experimental-lint", "annotation/annotation-experimental-lint")
@@ -56,6 +56,7 @@
 includeProject(":asynclayoutinflater", "asynclayoutinflater")
 includeProject(":autofill", "autofill")
 includeProject(":benchmark", "benchmark")
+includeProject(":benchmark:benchmark-benchmark", "benchmark/benchmark")
 includeProject(":benchmark:benchmark-gradle-plugin", "benchmark/gradle-plugin")
 includeProject(":biometric", "biometric")
 includeProject(":browser", "browser")
@@ -257,7 +258,6 @@
 includeProject(":support-vector-drawable-demos", new File(samplesRoot, "SupportVectorDrawableDemos"))
 includeProject(":support-v4-demos", new File(samplesRoot, "Support4Demos"))
 includeProject(":support-v7-demos", new File(samplesRoot, "Support7Demos"))
-includeProject(":support-v13-demos", new File(samplesRoot, "Support13Demos"))
 includeProject(":support-wear-demos", new File(samplesRoot, "SupportWearDemos"))
 
 /////////////////////////////
diff --git a/slices/test/build.gradle b/slices/test/build.gradle
index 5484b1c..1e2f18d 100644
--- a/slices/test/build.gradle
+++ b/slices/test/build.gradle
@@ -28,7 +28,7 @@
     implementation(project(":slice-core"))
     implementation(project(":slice-builders"))
     implementation(project(":recyclerview:recyclerview"))
-    api(ARCH_LIFECYCLE_LIVEDATA_CORE, libs.exclude_annotations_transitive)
+    api(ARCH_LIFECYCLE_LIVEDATA_CORE)
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/slices/view/build.gradle b/slices/view/build.gradle
index 0f4a35d..b182c5c 100644
--- a/slices/view/build.gradle
+++ b/slices/view/build.gradle
@@ -28,7 +28,7 @@
     implementation(project(":slice-core"))
     implementation(project(":recyclerview:recyclerview"))
     implementation("androidx.collection:collection:1.1.0")
-    api(ARCH_LIFECYCLE_LIVEDATA_CORE, libs.exclude_annotations_transitive)
+    api(ARCH_LIFECYCLE_LIVEDATA_CORE)
 
     androidTestImplementation(project(":slice-builders"))
     androidTestImplementation(project(":slice-test"))
diff --git a/sqlite/sqlite-framework/api/2.1.0-alpha01.txt b/sqlite/sqlite-framework/api/2.1.0-alpha01.txt
new file mode 100644
index 0000000..9c05b84
--- /dev/null
+++ b/sqlite/sqlite-framework/api/2.1.0-alpha01.txt
@@ -0,0 +1,10 @@
+// Signature format: 3.0
+package androidx.sqlite.db.framework {
+
+  public final class FrameworkSQLiteOpenHelperFactory implements androidx.sqlite.db.SupportSQLiteOpenHelper.Factory {
+    ctor public FrameworkSQLiteOpenHelperFactory();
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper! create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration!);
+  }
+
+}
+
diff --git a/paging/runtime/api/res-2.2.0-alpha01.txt b/sqlite/sqlite-framework/api/res-2.1.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/res-2.2.0-alpha01.txt
copy to sqlite/sqlite-framework/api/res-2.1.0-alpha01.txt
diff --git a/sqlite/sqlite-framework/api/restricted_2.1.0-alpha01.txt b/sqlite/sqlite-framework/api/restricted_2.1.0-alpha01.txt
new file mode 100644
index 0000000..9c05b84
--- /dev/null
+++ b/sqlite/sqlite-framework/api/restricted_2.1.0-alpha01.txt
@@ -0,0 +1,10 @@
+// Signature format: 3.0
+package androidx.sqlite.db.framework {
+
+  public final class FrameworkSQLiteOpenHelperFactory implements androidx.sqlite.db.SupportSQLiteOpenHelper.Factory {
+    ctor public FrameworkSQLiteOpenHelperFactory();
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper! create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration!);
+  }
+
+}
+
diff --git a/sqlite/sqlite-framework/build.gradle b/sqlite/sqlite-framework/build.gradle
index 9b58633..b8fdc92 100644
--- a/sqlite/sqlite-framework/build.gradle
+++ b/sqlite/sqlite-framework/build.gradle
@@ -33,9 +33,9 @@
 androidx {
     name = "Android Support SQLite - Framework Implementation"
     publish = Publish.SNAPSHOT_AND_RELEASE
-    mavenVersion = LibraryVersions.PERSISTENCE
-    mavenGroup = LibraryGroups.PERSISTENCE
+    mavenVersion = LibraryVersions.SQLITE
+    mavenGroup = LibraryGroups.SQLITE
     inceptionYear = "2017"
     description = "The implementation of Support SQLite library using the framework code."
     url = AndroidXExtension.ARCHITECTURE_URL
-}
\ No newline at end of file
+}
diff --git a/sqlite/sqlite-ktx/api/2.1.0-alpha01.txt b/sqlite/sqlite-ktx/api/2.1.0-alpha01.txt
new file mode 100644
index 0000000..750b634
--- /dev/null
+++ b/sqlite/sqlite-ktx/api/2.1.0-alpha01.txt
@@ -0,0 +1,10 @@
+// Signature format: 3.0
+package androidx.sqlite.db {
+
+  public final class SupportSQLiteDatabaseKt {
+    ctor public SupportSQLiteDatabaseKt();
+    method public static inline <T> T! transaction(androidx.sqlite.db.SupportSQLiteDatabase, boolean exclusive = true, kotlin.jvm.functions.Function1<? super androidx.sqlite.db.SupportSQLiteDatabase,? extends T> body);
+  }
+
+}
+
diff --git a/paging/runtime/ktx/api/res-2.2.0-alpha01.txt b/sqlite/sqlite-ktx/api/res-2.1.0-alpha01.txt
similarity index 100%
copy from paging/runtime/ktx/api/res-2.2.0-alpha01.txt
copy to sqlite/sqlite-ktx/api/res-2.1.0-alpha01.txt
diff --git a/sqlite/sqlite-ktx/api/restricted_2.1.0-alpha01.txt b/sqlite/sqlite-ktx/api/restricted_2.1.0-alpha01.txt
new file mode 100644
index 0000000..750b634
--- /dev/null
+++ b/sqlite/sqlite-ktx/api/restricted_2.1.0-alpha01.txt
@@ -0,0 +1,10 @@
+// Signature format: 3.0
+package androidx.sqlite.db {
+
+  public final class SupportSQLiteDatabaseKt {
+    ctor public SupportSQLiteDatabaseKt();
+    method public static inline <T> T! transaction(androidx.sqlite.db.SupportSQLiteDatabase, boolean exclusive = true, kotlin.jvm.functions.Function1<? super androidx.sqlite.db.SupportSQLiteDatabase,? extends T> body);
+  }
+
+}
+
diff --git a/sqlite/sqlite-ktx/build.gradle b/sqlite/sqlite-ktx/build.gradle
index 95f0496..ec5b96a 100644
--- a/sqlite/sqlite-ktx/build.gradle
+++ b/sqlite/sqlite-ktx/build.gradle
@@ -37,8 +37,8 @@
 androidx {
     name = "Android DB KTX"
     publish = Publish.SNAPSHOT_AND_RELEASE
-    mavenVersion = LibraryVersions.PERSISTENCE
-    mavenGroup = LibraryGroups.PERSISTENCE
+    mavenVersion = LibraryVersions.SQLITE
+    mavenGroup = LibraryGroups.SQLITE
     inceptionYear = "2018"
     description = "Kotlin extensions for DB"
     url = AndroidXExtension.ARCHITECTURE_URL
diff --git a/sqlite/sqlite/api/2.1.0-alpha01.txt b/sqlite/sqlite/api/2.1.0-alpha01.txt
new file mode 100644
index 0000000..99d1651
--- /dev/null
+++ b/sqlite/sqlite/api/2.1.0-alpha01.txt
@@ -0,0 +1,126 @@
+// Signature format: 3.0
+package androidx.sqlite.db {
+
+  public final class SimpleSQLiteQuery implements androidx.sqlite.db.SupportSQLiteQuery {
+    ctor public SimpleSQLiteQuery(String!, Object![]?);
+    ctor public SimpleSQLiteQuery(String!);
+    method public static void bind(androidx.sqlite.db.SupportSQLiteProgram!, Object![]!);
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram!);
+    method public int getArgCount();
+    method public String! getSql();
+  }
+
+  public interface SupportSQLiteDatabase extends java.io.Closeable {
+    method public void beginTransaction();
+    method public void beginTransactionNonExclusive();
+    method public void beginTransactionWithListener(android.database.sqlite.SQLiteTransactionListener!);
+    method public void beginTransactionWithListenerNonExclusive(android.database.sqlite.SQLiteTransactionListener!);
+    method public androidx.sqlite.db.SupportSQLiteStatement! compileStatement(String!);
+    method public int delete(String!, String!, Object![]!);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void disableWriteAheadLogging();
+    method public boolean enableWriteAheadLogging();
+    method public void endTransaction();
+    method public void execSQL(String!) throws android.database.SQLException;
+    method public void execSQL(String!, Object![]!) throws android.database.SQLException;
+    method public java.util.List<android.util.Pair<java.lang.String!,java.lang.String!>!>! getAttachedDbs();
+    method public long getMaximumSize();
+    method public long getPageSize();
+    method public String! getPath();
+    method public int getVersion();
+    method public boolean inTransaction();
+    method public long insert(String!, int, android.content.ContentValues!) throws android.database.SQLException;
+    method public boolean isDatabaseIntegrityOk();
+    method public boolean isDbLockedByCurrentThread();
+    method public boolean isOpen();
+    method public boolean isReadOnly();
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public boolean isWriteAheadLoggingEnabled();
+    method public boolean needUpgrade(int);
+    method public android.database.Cursor! query(String!);
+    method public android.database.Cursor! query(String!, Object![]!);
+    method public android.database.Cursor! query(androidx.sqlite.db.SupportSQLiteQuery!);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public android.database.Cursor! query(androidx.sqlite.db.SupportSQLiteQuery!, android.os.CancellationSignal!);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void setForeignKeyConstraintsEnabled(boolean);
+    method public void setLocale(java.util.Locale!);
+    method public void setMaxSqlCacheSize(int);
+    method public long setMaximumSize(long);
+    method public void setPageSize(long);
+    method public void setTransactionSuccessful();
+    method public void setVersion(int);
+    method public int update(String!, int, android.content.ContentValues!, String!, Object![]!);
+    method public boolean yieldIfContendedSafely();
+    method public boolean yieldIfContendedSafely(long);
+  }
+
+  public interface SupportSQLiteOpenHelper extends java.io.Closeable {
+    method public void close();
+    method public String! getDatabaseName();
+    method public androidx.sqlite.db.SupportSQLiteDatabase! getReadableDatabase();
+    method public androidx.sqlite.db.SupportSQLiteDatabase! getWritableDatabase();
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void setWriteAheadLoggingEnabled(boolean);
+  }
+
+  public abstract static class SupportSQLiteOpenHelper.Callback {
+    ctor public SupportSQLiteOpenHelper.Callback(int);
+    method public void onConfigure(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method public void onCorruption(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method public abstract void onCreate(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method public void onDowngrade(androidx.sqlite.db.SupportSQLiteDatabase!, int, int);
+    method public void onOpen(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method public abstract void onUpgrade(androidx.sqlite.db.SupportSQLiteDatabase!, int, int);
+    field public final int version;
+  }
+
+  public static class SupportSQLiteOpenHelper.Configuration {
+    method public static androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder! builder(android.content.Context!);
+    field public final androidx.sqlite.db.SupportSQLiteOpenHelper.Callback callback;
+    field public final android.content.Context context;
+    field public final String? name;
+  }
+
+  public static class SupportSQLiteOpenHelper.Configuration.Builder {
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration! build();
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder! callback(androidx.sqlite.db.SupportSQLiteOpenHelper.Callback);
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder! name(String?);
+  }
+
+  public static interface SupportSQLiteOpenHelper.Factory {
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper! create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration!);
+  }
+
+  public interface SupportSQLiteProgram extends java.io.Closeable {
+    method public void bindBlob(int, byte[]!);
+    method public void bindDouble(int, double);
+    method public void bindLong(int, long);
+    method public void bindNull(int);
+    method public void bindString(int, String!);
+    method public void clearBindings();
+  }
+
+  public interface SupportSQLiteQuery {
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram!);
+    method public int getArgCount();
+    method public String! getSql();
+  }
+
+  public final class SupportSQLiteQueryBuilder {
+    method public static androidx.sqlite.db.SupportSQLiteQueryBuilder! builder(String!);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder! columns(String![]!);
+    method public androidx.sqlite.db.SupportSQLiteQuery! create();
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder! distinct();
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder! groupBy(String!);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder! having(String!);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder! limit(String!);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder! orderBy(String!);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder! selection(String!, Object![]!);
+  }
+
+  public interface SupportSQLiteStatement extends androidx.sqlite.db.SupportSQLiteProgram {
+    method public void execute();
+    method public long executeInsert();
+    method public int executeUpdateDelete();
+    method public long simpleQueryForLong();
+    method public String! simpleQueryForString();
+  }
+
+}
+
diff --git a/sqlite/sqlite/api/current.txt b/sqlite/sqlite/api/current.txt
index cfd41a7..99d1651 100644
--- a/sqlite/sqlite/api/current.txt
+++ b/sqlite/sqlite/api/current.txt
@@ -51,7 +51,7 @@
     method public boolean yieldIfContendedSafely(long);
   }
 
-  public interface SupportSQLiteOpenHelper {
+  public interface SupportSQLiteOpenHelper extends java.io.Closeable {
     method public void close();
     method public String! getDatabaseName();
     method public androidx.sqlite.db.SupportSQLiteDatabase! getReadableDatabase();
diff --git a/paging/runtime/api/res-2.2.0-alpha01.txt b/sqlite/sqlite/api/res-2.1.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/res-2.2.0-alpha01.txt
copy to sqlite/sqlite/api/res-2.1.0-alpha01.txt
diff --git a/sqlite/sqlite/api/restricted_2.1.0-alpha01.txt b/sqlite/sqlite/api/restricted_2.1.0-alpha01.txt
new file mode 100644
index 0000000..99d1651
--- /dev/null
+++ b/sqlite/sqlite/api/restricted_2.1.0-alpha01.txt
@@ -0,0 +1,126 @@
+// Signature format: 3.0
+package androidx.sqlite.db {
+
+  public final class SimpleSQLiteQuery implements androidx.sqlite.db.SupportSQLiteQuery {
+    ctor public SimpleSQLiteQuery(String!, Object![]?);
+    ctor public SimpleSQLiteQuery(String!);
+    method public static void bind(androidx.sqlite.db.SupportSQLiteProgram!, Object![]!);
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram!);
+    method public int getArgCount();
+    method public String! getSql();
+  }
+
+  public interface SupportSQLiteDatabase extends java.io.Closeable {
+    method public void beginTransaction();
+    method public void beginTransactionNonExclusive();
+    method public void beginTransactionWithListener(android.database.sqlite.SQLiteTransactionListener!);
+    method public void beginTransactionWithListenerNonExclusive(android.database.sqlite.SQLiteTransactionListener!);
+    method public androidx.sqlite.db.SupportSQLiteStatement! compileStatement(String!);
+    method public int delete(String!, String!, Object![]!);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void disableWriteAheadLogging();
+    method public boolean enableWriteAheadLogging();
+    method public void endTransaction();
+    method public void execSQL(String!) throws android.database.SQLException;
+    method public void execSQL(String!, Object![]!) throws android.database.SQLException;
+    method public java.util.List<android.util.Pair<java.lang.String!,java.lang.String!>!>! getAttachedDbs();
+    method public long getMaximumSize();
+    method public long getPageSize();
+    method public String! getPath();
+    method public int getVersion();
+    method public boolean inTransaction();
+    method public long insert(String!, int, android.content.ContentValues!) throws android.database.SQLException;
+    method public boolean isDatabaseIntegrityOk();
+    method public boolean isDbLockedByCurrentThread();
+    method public boolean isOpen();
+    method public boolean isReadOnly();
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public boolean isWriteAheadLoggingEnabled();
+    method public boolean needUpgrade(int);
+    method public android.database.Cursor! query(String!);
+    method public android.database.Cursor! query(String!, Object![]!);
+    method public android.database.Cursor! query(androidx.sqlite.db.SupportSQLiteQuery!);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public android.database.Cursor! query(androidx.sqlite.db.SupportSQLiteQuery!, android.os.CancellationSignal!);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void setForeignKeyConstraintsEnabled(boolean);
+    method public void setLocale(java.util.Locale!);
+    method public void setMaxSqlCacheSize(int);
+    method public long setMaximumSize(long);
+    method public void setPageSize(long);
+    method public void setTransactionSuccessful();
+    method public void setVersion(int);
+    method public int update(String!, int, android.content.ContentValues!, String!, Object![]!);
+    method public boolean yieldIfContendedSafely();
+    method public boolean yieldIfContendedSafely(long);
+  }
+
+  public interface SupportSQLiteOpenHelper extends java.io.Closeable {
+    method public void close();
+    method public String! getDatabaseName();
+    method public androidx.sqlite.db.SupportSQLiteDatabase! getReadableDatabase();
+    method public androidx.sqlite.db.SupportSQLiteDatabase! getWritableDatabase();
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void setWriteAheadLoggingEnabled(boolean);
+  }
+
+  public abstract static class SupportSQLiteOpenHelper.Callback {
+    ctor public SupportSQLiteOpenHelper.Callback(int);
+    method public void onConfigure(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method public void onCorruption(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method public abstract void onCreate(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method public void onDowngrade(androidx.sqlite.db.SupportSQLiteDatabase!, int, int);
+    method public void onOpen(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method public abstract void onUpgrade(androidx.sqlite.db.SupportSQLiteDatabase!, int, int);
+    field public final int version;
+  }
+
+  public static class SupportSQLiteOpenHelper.Configuration {
+    method public static androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder! builder(android.content.Context!);
+    field public final androidx.sqlite.db.SupportSQLiteOpenHelper.Callback callback;
+    field public final android.content.Context context;
+    field public final String? name;
+  }
+
+  public static class SupportSQLiteOpenHelper.Configuration.Builder {
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration! build();
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder! callback(androidx.sqlite.db.SupportSQLiteOpenHelper.Callback);
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder! name(String?);
+  }
+
+  public static interface SupportSQLiteOpenHelper.Factory {
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper! create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration!);
+  }
+
+  public interface SupportSQLiteProgram extends java.io.Closeable {
+    method public void bindBlob(int, byte[]!);
+    method public void bindDouble(int, double);
+    method public void bindLong(int, long);
+    method public void bindNull(int);
+    method public void bindString(int, String!);
+    method public void clearBindings();
+  }
+
+  public interface SupportSQLiteQuery {
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram!);
+    method public int getArgCount();
+    method public String! getSql();
+  }
+
+  public final class SupportSQLiteQueryBuilder {
+    method public static androidx.sqlite.db.SupportSQLiteQueryBuilder! builder(String!);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder! columns(String![]!);
+    method public androidx.sqlite.db.SupportSQLiteQuery! create();
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder! distinct();
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder! groupBy(String!);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder! having(String!);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder! limit(String!);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder! orderBy(String!);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder! selection(String!, Object![]!);
+  }
+
+  public interface SupportSQLiteStatement extends androidx.sqlite.db.SupportSQLiteProgram {
+    method public void execute();
+    method public long executeInsert();
+    method public int executeUpdateDelete();
+    method public long simpleQueryForLong();
+    method public String! simpleQueryForString();
+  }
+
+}
+
diff --git a/sqlite/sqlite/api/restricted_current.txt b/sqlite/sqlite/api/restricted_current.txt
index cfd41a7..99d1651 100644
--- a/sqlite/sqlite/api/restricted_current.txt
+++ b/sqlite/sqlite/api/restricted_current.txt
@@ -51,7 +51,7 @@
     method public boolean yieldIfContendedSafely(long);
   }
 
-  public interface SupportSQLiteOpenHelper {
+  public interface SupportSQLiteOpenHelper extends java.io.Closeable {
     method public void close();
     method public String! getDatabaseName();
     method public androidx.sqlite.db.SupportSQLiteDatabase! getReadableDatabase();
diff --git a/sqlite/sqlite/build.gradle b/sqlite/sqlite/build.gradle
index 23543ad..391f8d6 100644
--- a/sqlite/sqlite/build.gradle
+++ b/sqlite/sqlite/build.gradle
@@ -45,9 +45,9 @@
 androidx {
     name = "Android DB"
     publish = Publish.SNAPSHOT_AND_RELEASE
-    mavenVersion = LibraryVersions.PERSISTENCE
-    mavenGroup = LibraryGroups.PERSISTENCE
+    mavenVersion = LibraryVersions.SQLITE
+    mavenGroup = LibraryGroups.SQLITE
     inceptionYear = "2017"
     description = "Android DB"
     url = AndroidXExtension.ARCHITECTURE_URL
-}
\ No newline at end of file
+}
diff --git a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteOpenHelper.java b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteOpenHelper.java
index 322f9d5..014af07 100644
--- a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteOpenHelper.java
+++ b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteOpenHelper.java
@@ -27,6 +27,7 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 
+import java.io.Closeable;
 import java.io.File;
 import java.io.IOException;
 import java.util.List;
@@ -38,7 +39,7 @@
  * the methods that should be overridden.
  */
 @SuppressWarnings("unused")
-public interface SupportSQLiteOpenHelper {
+public interface SupportSQLiteOpenHelper extends Closeable {
     /**
      * Return the name of the SQLite database being opened, as given to
      * the constructor.
@@ -102,7 +103,7 @@
     /**
      * Close any open database object.
      */
-    void close();
+    @Override void close();
 
     /**
      * Handles various lifecycle events for the SQLite connection, similar to
diff --git a/test/screenshot/build.gradle b/test/screenshot/build.gradle
index 2335202..a740b0b 100644
--- a/test/screenshot/build.gradle
+++ b/test/screenshot/build.gradle
@@ -25,6 +25,8 @@
 }
 
 dependencies {
+    implementation(ANDROIDX_TEST_RUNNER)
+
     androidTestImplementation(JUNIT)
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
diff --git a/test/screenshot/src/androidTest/java/androidx/test/screenshot/ScreenshotTestTest.kt b/test/screenshot/src/androidTest/java/androidx/test/screenshot/ScreenshotTestTest.kt
index 05e0ebd..6eef598 100644
--- a/test/screenshot/src/androidTest/java/androidx/test/screenshot/ScreenshotTestTest.kt
+++ b/test/screenshot/src/androidTest/java/androidx/test/screenshot/ScreenshotTestTest.kt
@@ -19,15 +19,18 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import org.junit.Assert.assertTrue
+import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 
 @RunWith(AndroidJUnit4::class)
 class ScreenshotTestTest {
 
+    @get:Rule
+    val screenshotTestRule = ScreenshotTestRule()
+
     @Test
     @SmallTest
-    @ScreenshotTest
     fun screenshotTestTest_dummy() {
         assertTrue(true)
     }
diff --git a/test/screenshot/src/main/java/androidx/test/screenshot/ScreenshotTest.java b/test/screenshot/src/main/java/androidx/test/screenshot/ScreenshotTest.java
deleted file mode 100644
index ecffe28..0000000
--- a/test/screenshot/src/main/java/androidx/test/screenshot/ScreenshotTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.test.screenshot;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation to assign a screenshot test qualifier to a test. This annotation can be used at a
- * method or class level.
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.METHOD, ElementType.TYPE})
-public @interface ScreenshotTest {
-}
-
diff --git a/test/screenshot/src/main/java/androidx/test/screenshot/ScreenshotTestRule.java b/test/screenshot/src/main/java/androidx/test/screenshot/ScreenshotTestRule.java
new file mode 100644
index 0000000..56c40a5
--- /dev/null
+++ b/test/screenshot/src/main/java/androidx/test/screenshot/ScreenshotTestRule.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.test.screenshot;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import org.junit.Assume;
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+public class ScreenshotTestRule implements TestRule {
+
+    @Override
+    public @NonNull Statement apply(@NonNull Statement base, @Nullable Description description) {
+        return new ScreenshotTestStatement(base);
+    }
+
+    static class ScreenshotTestStatement extends Statement {
+
+        final Statement mBase;
+
+        ScreenshotTestStatement(Statement base) {
+            super();
+            mBase = base;
+        }
+
+        @Override
+        public void evaluate() throws Throwable {
+            Assume.assumeTrue(android.os.Build.MODEL.contains("Cuttlefish"));
+            mBase.evaluate();
+        }
+    }
+}
diff --git a/ui/integration-tests/benchmark/src/main/java/androidx/ui/benchmark/BenchmarksExtensions.kt b/ui/integration-tests/benchmark/src/main/java/androidx/ui/benchmark/BenchmarksExtensions.kt
index 2fd0360..9825448 100644
--- a/ui/integration-tests/benchmark/src/main/java/androidx/ui/benchmark/BenchmarksExtensions.kt
+++ b/ui/integration-tests/benchmark/src/main/java/androidx/ui/benchmark/BenchmarksExtensions.kt
@@ -25,6 +25,7 @@
 import androidx.ui.test.invalidateViews
 import androidx.ui.test.recomposeSyncAssertHadChanges
 import androidx.ui.test.recomposeSyncAssertNoChanges
+import androidx.ui.test.requestLayout
 import androidx.ui.test.runOnUiThreadSync
 
 /**
@@ -39,6 +40,7 @@
         var widthSpec = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY)
         var heightSpec = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY)
 
+        testCase.requestLayout()
         testCase.measureWithSpec(widthSpec, heightSpec)
         testCase.layout()
 
@@ -58,6 +60,7 @@
                     View.MeasureSpec.makeMeasureSpec(lastWidth, View.MeasureSpec.EXACTLY)
                 heightSpec =
                     View.MeasureSpec.makeMeasureSpec(lastHeight, View.MeasureSpec.EXACTLY)
+                testCase.requestLayout()
             }
             testCase.measureWithSpec(widthSpec, heightSpec)
             testCase.layout()
@@ -122,6 +125,7 @@
             runWithTimingDisabled {
                 toggleState()
                 testCase.recomposeSyncAssertHadChanges()
+                testCase.requestLayout()
             }
             testCase.measure()
         }
@@ -144,6 +148,7 @@
             runWithTimingDisabled {
                 toggleState()
                 testCase.recomposeSyncAssertHadChanges()
+                testCase.requestLayout()
                 testCase.measure()
             }
             testCase.layout()
@@ -167,6 +172,7 @@
             runWithTimingDisabled {
                 toggleState()
                 testCase.recomposeSyncAssertHadChanges()
+                testCase.requestLayout()
                 testCase.measure()
                 testCase.layout()
                 testCase.prepareDraw()
diff --git a/ui/integration-tests/test/src/main/java/androidx/ui/test/TestCase.kt b/ui/integration-tests/test/src/main/java/androidx/ui/test/TestCase.kt
index ec9d692..c2a3a33 100644
--- a/ui/integration-tests/test/src/main/java/androidx/ui/test/TestCase.kt
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/test/TestCase.kt
@@ -124,6 +124,13 @@
     invalidateViews(view)
 }
 
+/**
+ * Invalidate the layout so that measure() and layout() do something
+ */
+fun TestCase.requestLayout() {
+    view.requestLayout()
+}
+
 private fun invalidateViews(view: View) {
     view.invalidate()
     if (view is ViewGroup) {
diff --git a/ui/settings.gradle b/ui/settings.gradle
index 3ebd9c2..c46fc60 100644
--- a/ui/settings.gradle
+++ b/ui/settings.gradle
@@ -26,8 +26,8 @@
 includeProject(":compose:compose-compiler-hosted:integration-tests", "../compose/compose-compiler-hosted/integration-tests")
 includeProject(":compose:compose-ide-plugin", "../compose/compose-ide-plugin")
 includeProject(":compose:compose-runtime", "../compose/compose-runtime")
-includeProject(":compose:compose-runtime:benchmark", "../compose/compose-runtime/compose-runtime-benchmark")
-includeProject(":ui:integration-tests:benchmark", "integration-tests/benchmark")
+includeProject(":compose:compose-runtime-benchmark", "../compose/compose-runtime/compose-runtime-benchmark")
+includeProject(":ui:integration-tests-benchmark", "integration-tests/benchmark")
 includeProject(":ui:integration-tests:demos", "integration-tests/demos")
 includeProject(":ui:integration-tests:test", "integration-tests/test")
 includeProject(":ui:ui-android-text", "ui-android-text")
@@ -38,6 +38,7 @@
 includeProject(":ui:ui-animation:integration-tests:ui-animation-demos", "ui-animation/integration-tests/animation-demos")
 includeProject(":ui:ui-core", "ui-core")
 includeProject(":ui:ui-foundation", "ui-foundation")
+includeProject(":ui:ui-foundation:integration-tests:samples", "ui-foundation/integration-tests/samples")
 includeProject(":ui:ui-framework", "ui-framework")
 includeProject(":ui:ui-framework:integration-tests:ui-framework-demos", "ui-framework/integration-tests/framework-demos")
 includeProject(":ui:ui-framework:integration-tests:samples", "ui-framework/integration-tests/samples")
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrolling.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrolling.kt
index 4a0413d..b57e2ee 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrolling.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrolling.kt
@@ -64,7 +64,7 @@
     fun FancyScrollingExample() {
         Column {
             Padding(40.dp) {
-                Text("<== Scroll horizontally ==>", style = TextStyle(fontSize = 80.sp))
+                Text("<== Scroll horizontally ==>", style = TextStyle(fontSize = 20.sp))
             }
             val animScroll = +animatedFloat(0f)
             val itemWidth = +state { 0f }
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrolling.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrolling.kt
index 1281e0f..0cbf697 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrolling.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrolling.kt
@@ -64,7 +64,7 @@
     fun SpringBackExample() {
         Column {
             Padding(40.dp) {
-                Text("<== Scroll horizontally ==>", style = TextStyle(fontSize = 80.sp))
+                Text("<== Scroll horizontally ==>", style = TextStyle(fontSize = 20.sp))
             }
             val animScroll = +animatedFloat(0f)
             val itemWidth = +state { 0f }
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismiss.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismiss.kt
index 941dba4..c00fdad 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismiss.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismiss.kt
@@ -59,7 +59,7 @@
                         SwipeToDismiss()
 
                     Padding(40.dp) {
-                        Text("Swipe up to dismiss", style = TextStyle(fontSize = 80.sp))
+                        Text("Swipe up to dismiss", style = TextStyle(fontSize = 20.sp))
                     }
                 }
             }
diff --git a/ui/ui-core/src/main/java/androidx/ui/core/Constraints.kt b/ui/ui-core/src/main/java/androidx/ui/core/Constraints.kt
index 68eb8839..9c3a3e4 100644
--- a/ui/ui-core/src/main/java/androidx/ui/core/Constraints.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/core/Constraints.kt
@@ -44,6 +44,7 @@
     val maxHeight: IntPx = IntPx.Infinity
 ) {
     init {
+        // TODO(mount/popam): This verification is costly. Can we avoid it sometimes or at least on production?
         require(minWidth.isFinite()) { "Constraints#minWidth should be finite" }
         require(minHeight.isFinite()) { "Constraints#minHeight should be finite" }
         require(minWidth <= maxWidth) {
diff --git a/ui/ui-foundation/integration-tests/samples/build.gradle b/ui/ui-foundation/integration-tests/samples/build.gradle
new file mode 100644
index 0000000..446e4b2
--- /dev/null
+++ b/ui/ui-foundation/integration-tests/samples/build.gradle
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+import static androidx.build.dependencies.DependenciesKt.*
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("AndroidXUiPlugin")
+    id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+    kotlinPlugin project(path: ":compose:compose-compiler", configuration: "embeddablePlugin")
+
+    implementation(KOTLIN_COMPOSE_STDLIB)
+
+    implementation project(":annotation:annotation-sampled")
+
+    implementation project(":compose:compose-runtime")
+    implementation project(":ui:ui-core")
+    implementation project(":ui:ui-foundation")
+    implementation project(":ui:ui-framework")
+    implementation project(":ui:ui-layout")
+    implementation project(":ui:ui-text")
+}
+
+android {
+    tasks.withType(KotlinCompile).configureEach {
+        kotlinOptions {
+            useIR = true
+        }
+    }
+}
diff --git a/ui/ui-foundation/integration-tests/samples/src/main/AndroidManifest.xml b/ui/ui-foundation/integration-tests/samples/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..694223d
--- /dev/null
+++ b/ui/ui-foundation/integration-tests/samples/src/main/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<!--
+  Copyright 2019 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<manifest package="androidx.ui.foundation.samples" />
diff --git a/ui/ui-foundation/integration-tests/samples/src/main/java/androidx/ui/foundation/samples/ClickableSamples.kt b/ui/ui-foundation/integration-tests/samples/src/main/java/androidx/ui/foundation/samples/ClickableSamples.kt
new file mode 100644
index 0000000..8648004
--- /dev/null
+++ b/ui/ui-foundation/integration-tests/samples/src/main/java/androidx/ui/foundation/samples/ClickableSamples.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.foundation.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.Composable
+import androidx.compose.composer
+import androidx.compose.state
+import androidx.compose.unaryPlus
+import androidx.ui.core.Text
+import androidx.ui.foundation.Clickable
+
+@Sampled
+@Composable
+fun ClickableSample() {
+    val count = +state { 0 }
+    Clickable(onClick = { count.value += 1 }) {
+        // content that you want to make clickable
+        Text(text = count.toString())
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-foundation/integration-tests/samples/src/main/java/androidx/ui/foundation/samples/ColoredRectSamples.kt b/ui/ui-foundation/integration-tests/samples/src/main/java/androidx/ui/foundation/samples/ColoredRectSamples.kt
new file mode 100644
index 0000000..d90e8ac3
--- /dev/null
+++ b/ui/ui-foundation/integration-tests/samples/src/main/java/androidx/ui/foundation/samples/ColoredRectSamples.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.foundation.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.Composable
+import androidx.compose.composer
+import androidx.ui.core.dp
+import androidx.ui.core.vectorgraphics.SolidColor
+import androidx.ui.foundation.ColoredRect
+import androidx.ui.graphics.Color
+
+@Sampled
+@Composable
+fun ColoredRectColorSample() {
+    ColoredRect(Color.Cyan, width = 20.dp, height = 20.dp)
+}
+
+@Sampled
+@Composable
+fun ColoredRectBrushSample() {
+    ColoredRect(
+        brush = SolidColor(Color.Fuchsia),
+        width = 20.dp,
+        height = 20.dp
+    )
+}
\ No newline at end of file
diff --git a/ui/ui-foundation/integration-tests/samples/src/main/java/androidx/ui/foundation/samples/DeterminateProgressSamples.kt b/ui/ui-foundation/integration-tests/samples/src/main/java/androidx/ui/foundation/samples/DeterminateProgressSamples.kt
new file mode 100644
index 0000000..35869a4
--- /dev/null
+++ b/ui/ui-foundation/integration-tests/samples/src/main/java/androidx/ui/foundation/samples/DeterminateProgressSamples.kt
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.foundation.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.Composable
+import androidx.compose.composer
+import androidx.ui.core.dp
+import androidx.ui.foundation.ColoredRect
+import androidx.ui.foundation.DeterminateProgressIndicator
+import androidx.ui.graphics.Color
+
+@Sampled
+@Composable
+fun DeterminateProgressSample() {
+    val progress = 0.5f // emulate progress from some state
+    DeterminateProgressIndicator(progress) {
+        ColoredRect(Color.Cyan, height = 4.dp, width = (progress * 100).dp)
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
index dfca6c5..1730ce1 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
@@ -28,6 +28,8 @@
  * Combines [PressReleasedGestureDetector] and [Semantics] for the clickable
  * components like Button.
  *
+ * @sample androidx.ui.foundation.samples.ClickableSample
+ *
  * @param onClick will be called when user clicked on the button. The button will not be
  *  clickable when it is null.
  * @param consumeDownOnStart true means [PressReleasedGestureDetector] should consume
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/ColoredRect.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/ColoredRect.kt
index f892de5..757de7f 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/ColoredRect.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/ColoredRect.kt
@@ -24,6 +24,8 @@
 import androidx.ui.core.toRect
 import androidx.ui.core.vectorgraphics.Brush
 import androidx.ui.core.vectorgraphics.SolidColor
+import androidx.ui.foundation.shape.DrawShape
+import androidx.ui.foundation.shape.RectangleShape
 import androidx.ui.graphics.Color
 import androidx.ui.layout.Container
 import androidx.ui.painting.Paint
@@ -37,6 +39,8 @@
  * Note that even if width and height are specified, these will not be satisfied
  * if the component's incoming layout constraints do not allow that.
  *
+ * @sample androidx.ui.foundation.samples.ColoredRectBrushSample
+ *
  * @param brush brush to paint rect with
  * @param width width of this rect, by default it will match incoming layout constraints
  * @param height height of this rect, by default it will match incoming layout constraints
@@ -53,6 +57,8 @@
 /**
  * Component that represents a rectangle painted with a solid color.
  *
+ * @sample androidx.ui.foundation.samples.ColoredRectColorSample
+ *
  * @param color color to paint rect with
  * @param width width of this rect, by default it will match parent's constraints
  * @param height height of this rect, by default it will match parent's constraints
@@ -64,9 +70,5 @@
 
 @Composable
 private fun DrawFillRect(brush: Brush) {
-    Draw { canvas, parentSize ->
-        val paint = Paint()
-        brush.applyBrush(paint)
-        canvas.drawRect(parentSize.toRect(), paint)
-    }
+    DrawShape(RectangleShape, brush)
 }
\ No newline at end of file
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/DeterminateProgressIndicator.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/DeterminateProgressIndicator.kt
index eeca61c..1182bfe 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/DeterminateProgressIndicator.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/DeterminateProgressIndicator.kt
@@ -26,6 +26,8 @@
  * Contains the [Semantics] required for a determinate progress indicator, that represents progress
  * ranging from 0.0 to 1.0.
  *
+ * @sample androidx.ui.foundation.samples.DeterminateProgressSample
+ *
  * @param progress The progress of this progress indicator, where 0.0 represents no progress and 1.0
  * represents full progress
  * @param children The progress indicator that is drawn on screen, representing [progress]
diff --git a/ui/ui-framework/api/1.0.0-alpha01.txt b/ui/ui-framework/api/1.0.0-alpha01.txt
index 17f828e..cdc7a78 100644
--- a/ui/ui-framework/api/1.0.0-alpha01.txt
+++ b/ui/ui-framework/api/1.0.0-alpha01.txt
@@ -34,7 +34,7 @@
 
   public final class InputFieldKt {
     ctor public InputFieldKt();
-    method public static void InputField(androidx.ui.input.EditorState value, androidx.ui.core.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorState,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> onEditorActionPerformed = {});
+    method public static void InputField(androidx.ui.input.EditorState value, androidx.ui.core.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorState,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {});
   }
 
   public final class IntrinsicMeasurementsReceiver implements androidx.ui.core.DensityReceiver {
diff --git a/ui/ui-framework/api/current.txt b/ui/ui-framework/api/current.txt
index 17f828e..cdc7a78 100644
--- a/ui/ui-framework/api/current.txt
+++ b/ui/ui-framework/api/current.txt
@@ -34,7 +34,7 @@
 
   public final class InputFieldKt {
     ctor public InputFieldKt();
-    method public static void InputField(androidx.ui.input.EditorState value, androidx.ui.core.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorState,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> onEditorActionPerformed = {});
+    method public static void InputField(androidx.ui.input.EditorState value, androidx.ui.core.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorState,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {});
   }
 
   public final class IntrinsicMeasurementsReceiver implements androidx.ui.core.DensityReceiver {
diff --git a/ui/ui-framework/api/restricted_1.0.0-alpha01.txt b/ui/ui-framework/api/restricted_1.0.0-alpha01.txt
index 17f828e..cdc7a78 100644
--- a/ui/ui-framework/api/restricted_1.0.0-alpha01.txt
+++ b/ui/ui-framework/api/restricted_1.0.0-alpha01.txt
@@ -34,7 +34,7 @@
 
   public final class InputFieldKt {
     ctor public InputFieldKt();
-    method public static void InputField(androidx.ui.input.EditorState value, androidx.ui.core.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorState,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> onEditorActionPerformed = {});
+    method public static void InputField(androidx.ui.input.EditorState value, androidx.ui.core.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorState,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {});
   }
 
   public final class IntrinsicMeasurementsReceiver implements androidx.ui.core.DensityReceiver {
diff --git a/ui/ui-framework/api/restricted_current.txt b/ui/ui-framework/api/restricted_current.txt
index 17f828e..cdc7a78 100644
--- a/ui/ui-framework/api/restricted_current.txt
+++ b/ui/ui-framework/api/restricted_current.txt
@@ -34,7 +34,7 @@
 
   public final class InputFieldKt {
     ctor public InputFieldKt();
-    method public static void InputField(androidx.ui.input.EditorState value, androidx.ui.core.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorState,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> onEditorActionPerformed = {});
+    method public static void InputField(androidx.ui.input.EditorState value, androidx.ui.core.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorState,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {});
   }
 
   public final class IntrinsicMeasurementsReceiver implements androidx.ui.core.DensityReceiver {
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/MultipleCollect.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/MultipleCollect.kt
index d48e272..e8f57e0 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/MultipleCollect.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/MultipleCollect.kt
@@ -70,17 +70,17 @@
     Layout(
         childrenArray = arrayOf(header, content, footer),
         layoutBlock = { measurables, constraints ->
-            val headerPlaceable = measurables[header as () -> Unit].first().measure(
+            val headerPlaceable = measurables[header].first().measure(
                 Constraints.tightConstraints(constraints.maxWidth, 100.ipx)
             )
             val footerPadding = 50.ipx
-            val footerPlaceable = measurables[footer as () -> Unit].first().measure(
+            val footerPlaceable = measurables[footer].first().measure(
                 Constraints.tightConstraints(constraints.maxWidth - footerPadding * 2, 100.ipx)
             )
             val itemHeight =
                 (constraints.maxHeight - headerPlaceable.height - footerPlaceable.height) /
-                        measurables[content as () -> Unit].size
-            val contentPlaceables = measurables[content as () -> Unit].map { measurable ->
+                        measurables[content].size
+            val contentPlaceables = measurables[content].map { measurable ->
                 measurable.measure(Constraints.tightConstraints(constraints.maxWidth, itemHeight))
             }
 
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidLayoutDrawTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidLayoutDrawTest.kt
index cb22af9..27ace8d 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidLayoutDrawTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidLayoutDrawTest.kt
@@ -454,11 +454,11 @@
                         measurables.forEachIndexed { index, measurable ->
                             measurable.measure(childConstraints[index])
                         }
-                        assertEquals(headerChildrenCount, measurables[header as () -> Unit].size)
-                        assertSame(measurables[0], measurables[header as () -> Unit][0])
-                        assertEquals(footerChildrenCount, measurables[footer as () -> Unit].size)
-                        assertSame(measurables[1], measurables[footer as () -> Unit][0])
-                        assertSame(measurables[2], measurables[footer as () -> Unit][1])
+                        assertEquals(headerChildrenCount, measurables[header].size)
+                        assertSame(measurables[0], measurables[header][0])
+                        assertEquals(footerChildrenCount, measurables[footer].size)
+                        assertSame(measurables[1], measurables[footer][0])
+                        assertSame(measurables[2], measurables[footer][1])
                     }
                 }
             }
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/InputField.kt b/ui/ui-framework/src/main/java/androidx/ui/core/InputField.kt
index 30ba992..068a21d 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/InputField.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/InputField.kt
@@ -29,6 +29,7 @@
 import androidx.ui.graphics.Color
 import androidx.ui.input.EditProcessor
 import androidx.ui.input.EditorState
+import androidx.ui.input.ImeAction
 import androidx.ui.input.KeyboardType
 import androidx.ui.text.AnnotatedString
 import androidx.ui.text.TextPainter
@@ -86,11 +87,20 @@
      */
     keyboardType: KeyboardType = KeyboardType.Text,
 
+    /**
+     * The IME action
+     *
+     * This IME action is honored by IME and may show specific icons on the keyboard. For example,
+     * search icon may be shown if [ImeAction.Search] is specified. Then, when user tap that key,
+     * the [onImeActionPerformed] callback is called with specified ImeAction.
+     */
+    imeAction: ImeAction = ImeAction.Unspecified,
+
     /** Called when the InputMethodService update the editor state */
     onValueChange: (EditorState) -> Unit = {},
 
-    /** Called when the InputMethod requested an editor action */
-    onEditorActionPerformed: (Any) -> Unit = {} // TODO(nona): Define argument type
+    /** Called when the InputMethod requested an IME action */
+    onImeActionPerformed: (ImeAction) -> Unit = {} // TODO(nona): Define argument type
 ) {
     // Ambients
     val style = +ambient(CurrentTextStyleAmbient)
@@ -124,8 +134,9 @@
                 value,
                 processor,
                 keyboardType,
+                imeAction,
                 onValueChange,
-                onEditorActionPerformed)
+                onImeActionPerformed)
         },
         onBlur = {
             hasFocus.value = false
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/InputFieldDelegate.kt b/ui/ui-framework/src/main/java/androidx/ui/core/InputFieldDelegate.kt
index 115aa36..8657d9b 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/InputFieldDelegate.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/InputFieldDelegate.kt
@@ -22,10 +22,12 @@
 import androidx.ui.input.EditOperation
 import androidx.ui.input.EditProcessor
 import androidx.ui.input.EditorState
+import androidx.ui.input.ImeAction
 import androidx.ui.input.KeyboardType
 import androidx.ui.input.SetSelectionEditOp
 import androidx.ui.input.TextInputService
 import androidx.ui.painting.Canvas
+import androidx.ui.text.AnnotatedString
 import androidx.ui.text.TextPainter
 
 internal class InputFieldDelegate {
@@ -39,8 +41,30 @@
          */
         @JvmStatic
         fun layout(textPainter: TextPainter, constraints: Constraints): Pair<IntPx, IntPx> {
+            val isEmptyText = textPainter.text?.text?.isEmpty() ?: true
+            val activeTextPainter = if (isEmptyText) {
+                // Even with empty text, edit filed must have at least non-zero height widget. Use
+                // "H" height for this empty text height.
+                TextPainter(
+                    text = AnnotatedString(text = "H"),
+                    style = textPainter.style,
+                    density = textPainter.density,
+                    resourceLoader = textPainter.resourceLoader
+                ).apply {
+                    layout(constraints)
+                }
+            } else {
+                textPainter
+            }
+
+            // We anyway need to compute layout for preventing NPE during draw which require layout
+            // result.
+            // TODO(nona): Fix this?
             textPainter.layout(constraints)
-            return Pair(textPainter.width.px.round(), textPainter.height.px.round())
+
+            val height = activeTextPainter.height.px.round()
+            val width = constraints.maxWidth
+            return Pair(width, height)
         }
 
         /**
@@ -102,7 +126,13 @@
                 return
             }
 
-            val bbox = textPainter.getBoundingBox(value.selection.end)
+            val bbox = if (value.selection.end < value.text.length) {
+                textPainter.getBoundingBox(value.selection.end)
+            } else if (value.selection.end != 0) {
+                textPainter.getBoundingBox(value.selection.end - 1)
+            } else {
+                Rect(0f, 0f, 0f, 0f)
+            }
             val globalLT = layoutCoordinates.localToRoot(PxPosition(bbox.left.px, bbox.top.px))
 
             textInputService.notifyFocusedRect(
@@ -187,14 +217,16 @@
             value: EditorState,
             editProcessor: EditProcessor,
             keyboardType: KeyboardType,
+            imeAction: ImeAction,
             onValueChange: (EditorState) -> Unit,
-            onEditorActionPerformed: (Any) -> Unit
+            onImeActionPerformed: (ImeAction) -> Unit
         ) {
             textInputService?.startInput(
                 initState = value,
                 keyboardType = keyboardType,
+                imeAction = imeAction,
                 onEditCommand = { onEditCommand(it, editProcessor, onValueChange) },
-                onEditorActionPerformed = onEditorActionPerformed)
+                onImeActionPerformed = onImeActionPerformed)
         }
 
         /**
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/Layout.kt b/ui/ui-framework/src/main/java/androidx/ui/core/Layout.kt
index a62f5bb..3938fa1 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/Layout.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/Layout.kt
@@ -66,8 +66,9 @@
     internal val layoutNode: LayoutNode
         get() = layoutNodeRef.value!!
 
-    internal val childrenMeasurables: List<Measurable> get() =
-        ComplexLayoutStateMeasurablesList(layoutNode.childrenLayouts().map { it as Measurable })
+    // TODO(mount/popam): This is inefficient
+    internal val childrenMeasurables: List<Measurable>
+        get() = ComplexLayoutStateMeasurablesList(layoutNode)
 
     private var measureIteration = 0L
 
@@ -77,7 +78,8 @@
     }
 
     fun measure(constraints: Constraints): Placeable {
-        val iteration = layoutNode.owner?.measureIteration ?: 0L
+        val owner = layoutNode.owner
+        val iteration = if (owner == null) 0L else owner.measureIteration
         if (measureIteration == iteration) {
             throw IllegalStateException("measure() may not be called multiple times " +
                     "on the same Measurable")
@@ -170,8 +172,32 @@
 }
 
 internal class ComplexLayoutStateMeasurablesList(
-    internal val measurables: List<Measurable>
-) : List<Measurable> by (measurables.filter { it.parentData !is ChildrenEndParentData })
+    layoutNode: LayoutNode
+) : MutableList<Measurable> by mutableListOf() {
+    private val composableRanges = mutableMapOf<@Composable() () -> Unit, IntRange>()
+    fun composables(composable: @Composable() () -> Unit): List<Measurable> {
+        val range = composableRanges[composable] ?: return emptyList()
+        return subList(range.first, range.last)
+    }
+
+    init {
+        // var start = 0 doesn't work because of IR
+        val start = intArrayOf(0)
+        layoutNode.visitLayoutChildren { child ->
+            val layout = child.layout
+            if (layout != null) {
+                layout as Measurable
+                val parentData = layout.parentData
+                if (parentData is ChildrenEndParentData) {
+                    composableRanges[parentData.children] = IntRange(start[0], size)
+                    start[0] = size
+                } else {
+                    this += layout
+                }
+            }
+        }
+    }
+}
 
 /**
  * Receiver scope for the [ComplexLayout] lambda.
@@ -436,17 +462,10 @@
      * Returns all the [Measurable]s emitted for a particular children lambda.
      * TODO(popam): finding measurables for each individual composable is O(n^2), consider improving
      */
-    operator fun List<Measurable>.get(children: () -> Unit): List<Measurable> {
+    operator fun List<Measurable>.get(children: @Composable() () -> Unit): List<Measurable> {
         if (this !is ComplexLayoutStateMeasurablesList) error("Invalid list of measurables")
 
-        val childrenMeasurablesEnd = measurables.indexOfFirst {
-            it.parentData is ChildrenEndParentData &&
-                    (it.parentData as ChildrenEndParentData).children == children
-        }
-        val childrenMeasurablesStart = measurables.take(childrenMeasurablesEnd).indexOfLast {
-            it.parentData is ChildrenEndParentData
-        } + 1
-        return measurables.subList(childrenMeasurablesStart, childrenMeasurablesEnd)
+        return composables(children)
     }
     /**
      * Measure the child [Measurable] with a specific set of [Constraints]. The result
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt b/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt
index 3b6ab5a..c238d48 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt
@@ -115,14 +115,14 @@
             val width = placeable.width
             val height = placeable.height
             val start =
-                measurables[startHandle as () -> Unit].first().measure(
+                measurables[startHandle].first().measure(
                     Constraints.tightConstraints(
                         HANDLE_WIDTH.round(),
                         HANDLE_HEIGHT.round()
                     )
                 )
             val end =
-                measurables[endHandle as () -> Unit].first().measure(
+                measurables[endHandle].first().measure(
                     Constraints.tightConstraints(
                         HANDLE_WIDTH.round(),
                         HANDLE_HEIGHT.round()
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/InputFieldDelegateTest.kt b/ui/ui-framework/src/test/java/androidx/ui/core/InputFieldDelegateTest.kt
index 9e2b312..a246ad4 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/InputFieldDelegateTest.kt
+++ b/ui/ui-framework/src/test/java/androidx/ui/core/InputFieldDelegateTest.kt
@@ -22,12 +22,15 @@
 import androidx.ui.input.EditOperation
 import androidx.ui.input.EditProcessor
 import androidx.ui.input.EditorState
+import androidx.ui.input.ImeAction
 import androidx.ui.input.KeyboardType
 import androidx.ui.input.SetSelectionEditOp
 import androidx.ui.input.TextInputService
 import androidx.ui.painting.Canvas
+import androidx.ui.text.AnnotatedString
 import androidx.ui.text.TextPainter
 import androidx.ui.text.TextRange
+import androidx.ui.text.TextStyle
 import com.nhaarman.mockitokotlin2.any
 import com.nhaarman.mockitokotlin2.argumentCaptor
 import com.nhaarman.mockitokotlin2.eq
@@ -201,10 +204,11 @@
     fun on_focus() {
         val dummyEditorState = EditorState(text = "Hello, World", selection = TextRange(1, 1))
         InputFieldDelegate.onFocus(textInputService, dummyEditorState, processor,
-            KeyboardType.Text, onValueChange, onEditorActionPerformed)
+            KeyboardType.Text, ImeAction.Unspecified, onValueChange, onEditorActionPerformed)
         verify(textInputService).startInput(
             eq(dummyEditorState),
             eq(KeyboardType.Text),
+            eq(ImeAction.Unspecified),
             any(),
             eq(onEditorActionPerformed)
         )
@@ -243,4 +247,59 @@
             false /* hasFocus */)
         verify(textInputService, never()).notifyFocusedRect(any())
     }
+
+    @Test
+    fun notify_rect_tail() {
+        val dummyRect = Rect(0f, 1f, 2f, 3f)
+        whenever(painter.getBoundingBox(any())).thenReturn(dummyRect)
+        val dummyPoint = PxPosition(5.px, 6.px)
+        whenever(layoutCoordinates.localToRoot(any())).thenReturn(dummyPoint)
+        val dummyEditorState = EditorState(text = "Hello, World", selection = TextRange(12, 12))
+        InputFieldDelegate.notifyFocusedRect(
+            dummyEditorState,
+            painter,
+            layoutCoordinates,
+            textInputService,
+            true /* hasFocus */)
+        verify(textInputService).notifyFocusedRect(any())
+    }
+
+    @Test
+    fun notify_rect_empty() {
+        val dummyRect = Rect(0f, 1f, 2f, 3f)
+        whenever(painter.getBoundingBox(any())).thenReturn(dummyRect)
+        val dummyPoint = PxPosition(5.px, 6.px)
+        whenever(layoutCoordinates.localToRoot(any())).thenReturn(dummyPoint)
+        val dummyEditorState = EditorState(text = "", selection = TextRange(0, 0))
+        InputFieldDelegate.notifyFocusedRect(
+            dummyEditorState,
+            painter,
+            layoutCoordinates,
+            textInputService,
+            true /* hasFocus */)
+        verify(textInputService).notifyFocusedRect(any())
+    }
+
+    @Test
+    fun layout() {
+        val constraints = Constraints(
+            minWidth = 0.px.round(),
+            maxWidth = 1024.px.round(),
+            minHeight = 0.px.round(),
+            maxHeight = 2048.px.round()
+        )
+
+        val dummyText = AnnotatedString(text = "Hello, World")
+        whenever(painter.text).thenReturn(dummyText)
+        whenever(painter.style).thenReturn(TextStyle())
+        whenever(painter.density).thenReturn(Density(1.0f))
+        whenever(painter.resourceLoader).thenReturn(mock())
+        whenever(painter.height).thenReturn(512.0f)
+
+        val res = InputFieldDelegate.layout(painter, constraints)
+        assertEquals(1024.px.round(), res.first)
+        assertEquals(512.px.round(), res.second)
+
+        verify(painter, times(1)).layout(constraints)
+    }
 }
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/Flex.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/Flex.kt
index c4175ec0..c0c90f7 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/Flex.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/Flex.kt
@@ -409,16 +409,16 @@
  * Box [Constraints], but which abstract away width and height in favor of main axis and cross axis.
  */
 private data class OrientationIndependentConstraints(
-    var mainAxisMin: IntPx,
-    var mainAxisMax: IntPx,
-    var crossAxisMin: IntPx,
-    var crossAxisMax: IntPx
+    val mainAxisMin: IntPx,
+    val mainAxisMax: IntPx,
+    val crossAxisMin: IntPx,
+    val crossAxisMax: IntPx
 ) {
     constructor(c: Constraints, orientation: FlexOrientation) : this(
-        if (orientation == FlexOrientation.Horizontal) c.minWidth else c.minHeight,
-        if (orientation == FlexOrientation.Horizontal) c.maxWidth else c.maxHeight,
-        if (orientation == FlexOrientation.Horizontal) c.minHeight else c.minWidth,
-        if (orientation == FlexOrientation.Horizontal) c.maxHeight else c.maxWidth
+        if (orientation === FlexOrientation.Horizontal) c.minWidth else c.minHeight,
+        if (orientation === FlexOrientation.Horizontal) c.maxWidth else c.maxHeight,
+        if (orientation === FlexOrientation.Horizontal) c.minHeight else c.minWidth,
+        if (orientation === FlexOrientation.Horizontal) c.maxHeight else c.maxWidth
     )
 
     // Creates a new instance with the same cross axis constraints and unbounded main axis.
@@ -436,7 +436,7 @@
 
     // Given an orientation, resolves the current instance to traditional constraints.
     fun toBoxConstraints(orientation: FlexOrientation) =
-        if (orientation == FlexOrientation.Horizontal) {
+        if (orientation === FlexOrientation.Horizontal) {
             Constraints(mainAxisMin, mainAxisMax, crossAxisMin, crossAxisMax)
         } else {
             Constraints(crossAxisMin, crossAxisMax, mainAxisMin, mainAxisMax)
@@ -444,7 +444,7 @@
 
     // Given an orientation, resolves the max width constraint this instance represents.
     fun maxWidth(orientation: FlexOrientation) =
-        if (orientation == FlexOrientation.Horizontal) {
+        if (orientation === FlexOrientation.Horizontal) {
             mainAxisMax
         } else {
             crossAxisMax
@@ -452,7 +452,7 @@
 
     // Given an orientation, resolves the max height constraint this instance represents.
     fun maxHeight(orientation: FlexOrientation) =
-        if (orientation == FlexOrientation.Horizontal) {
+        if (orientation === FlexOrientation.Horizontal) {
             crossAxisMax
         } else {
             mainAxisMax
diff --git a/ui/ui-material/api/1.0.0-alpha01.txt b/ui/ui-material/api/1.0.0-alpha01.txt
index e385709..17ead5a 100644
--- a/ui/ui-material/api/1.0.0-alpha01.txt
+++ b/ui/ui-material/api/1.0.0-alpha01.txt
@@ -3,16 +3,23 @@
 
   public final class AppBarKt {
     ctor public AppBarKt();
-    method public static void AppBar(androidx.ui.graphics.Color color, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void AppBarLeadingIcon();
-    method public static void TopAppBar(String? title = null, androidx.ui.graphics.Color color = +themeColor({ 
+    method public static void AppBarIcon(androidx.ui.painting.Image icon, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static <T> void BottomAppBar(androidx.ui.graphics.Color color = +themeColor({ 
     primary
-}), java.util.List<androidx.ui.core.Dp> icons = emptyList());
-    method public static void TopAppBar(androidx.ui.graphics.Color color = +themeColor({ 
+}), kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = (kotlin.jvm.functions.Function0<? extends kotlin.Unit>)null, kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton = (kotlin.jvm.functions.Function0<? extends kotlin.Unit>)null, androidx.ui.material.BottomAppBar.FabPosition fabPosition = Center, java.util.List<? extends T>? contextualActions = null, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action = {});
+    method public static <T> void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title = {}, androidx.ui.graphics.Color color = +themeColor({ 
     primary
-}), kotlin.jvm.functions.Function0<kotlin.Unit> leadingIcon, kotlin.jvm.functions.Function0<kotlin.Unit> titleTextLabel, kotlin.jvm.functions.Function0<kotlin.Unit> trailingIcons);
-    method public static void TopAppBarTitleTextLabel(String title);
-    method public static void TopAppBarTrailingIcons(java.util.List<androidx.ui.core.Dp> icons);
+}), kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon = {}, java.util.List<? extends T>? contextualActions = null, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action = {});
+  }
+
+  public final class BottomAppBar {
+    field public static final androidx.ui.material.BottomAppBar! INSTANCE;
+  }
+
+  public enum BottomAppBar.FabPosition {
+    enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition Center;
+    enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition CenterCut;
+    enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition End;
   }
 
   public final class ButtonKt {
diff --git a/ui/ui-material/api/current.txt b/ui/ui-material/api/current.txt
index e385709..17ead5a 100644
--- a/ui/ui-material/api/current.txt
+++ b/ui/ui-material/api/current.txt
@@ -3,16 +3,23 @@
 
   public final class AppBarKt {
     ctor public AppBarKt();
-    method public static void AppBar(androidx.ui.graphics.Color color, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void AppBarLeadingIcon();
-    method public static void TopAppBar(String? title = null, androidx.ui.graphics.Color color = +themeColor({ 
+    method public static void AppBarIcon(androidx.ui.painting.Image icon, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static <T> void BottomAppBar(androidx.ui.graphics.Color color = +themeColor({ 
     primary
-}), java.util.List<androidx.ui.core.Dp> icons = emptyList());
-    method public static void TopAppBar(androidx.ui.graphics.Color color = +themeColor({ 
+}), kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = (kotlin.jvm.functions.Function0<? extends kotlin.Unit>)null, kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton = (kotlin.jvm.functions.Function0<? extends kotlin.Unit>)null, androidx.ui.material.BottomAppBar.FabPosition fabPosition = Center, java.util.List<? extends T>? contextualActions = null, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action = {});
+    method public static <T> void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title = {}, androidx.ui.graphics.Color color = +themeColor({ 
     primary
-}), kotlin.jvm.functions.Function0<kotlin.Unit> leadingIcon, kotlin.jvm.functions.Function0<kotlin.Unit> titleTextLabel, kotlin.jvm.functions.Function0<kotlin.Unit> trailingIcons);
-    method public static void TopAppBarTitleTextLabel(String title);
-    method public static void TopAppBarTrailingIcons(java.util.List<androidx.ui.core.Dp> icons);
+}), kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon = {}, java.util.List<? extends T>? contextualActions = null, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action = {});
+  }
+
+  public final class BottomAppBar {
+    field public static final androidx.ui.material.BottomAppBar! INSTANCE;
+  }
+
+  public enum BottomAppBar.FabPosition {
+    enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition Center;
+    enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition CenterCut;
+    enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition End;
   }
 
   public final class ButtonKt {
diff --git a/ui/ui-material/api/restricted_1.0.0-alpha01.txt b/ui/ui-material/api/restricted_1.0.0-alpha01.txt
index e385709..17ead5a 100644
--- a/ui/ui-material/api/restricted_1.0.0-alpha01.txt
+++ b/ui/ui-material/api/restricted_1.0.0-alpha01.txt
@@ -3,16 +3,23 @@
 
   public final class AppBarKt {
     ctor public AppBarKt();
-    method public static void AppBar(androidx.ui.graphics.Color color, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void AppBarLeadingIcon();
-    method public static void TopAppBar(String? title = null, androidx.ui.graphics.Color color = +themeColor({ 
+    method public static void AppBarIcon(androidx.ui.painting.Image icon, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static <T> void BottomAppBar(androidx.ui.graphics.Color color = +themeColor({ 
     primary
-}), java.util.List<androidx.ui.core.Dp> icons = emptyList());
-    method public static void TopAppBar(androidx.ui.graphics.Color color = +themeColor({ 
+}), kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = (kotlin.jvm.functions.Function0<? extends kotlin.Unit>)null, kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton = (kotlin.jvm.functions.Function0<? extends kotlin.Unit>)null, androidx.ui.material.BottomAppBar.FabPosition fabPosition = Center, java.util.List<? extends T>? contextualActions = null, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action = {});
+    method public static <T> void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title = {}, androidx.ui.graphics.Color color = +themeColor({ 
     primary
-}), kotlin.jvm.functions.Function0<kotlin.Unit> leadingIcon, kotlin.jvm.functions.Function0<kotlin.Unit> titleTextLabel, kotlin.jvm.functions.Function0<kotlin.Unit> trailingIcons);
-    method public static void TopAppBarTitleTextLabel(String title);
-    method public static void TopAppBarTrailingIcons(java.util.List<androidx.ui.core.Dp> icons);
+}), kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon = {}, java.util.List<? extends T>? contextualActions = null, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action = {});
+  }
+
+  public final class BottomAppBar {
+    field public static final androidx.ui.material.BottomAppBar! INSTANCE;
+  }
+
+  public enum BottomAppBar.FabPosition {
+    enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition Center;
+    enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition CenterCut;
+    enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition End;
   }
 
   public final class ButtonKt {
diff --git a/ui/ui-material/api/restricted_current.txt b/ui/ui-material/api/restricted_current.txt
index e385709..17ead5a 100644
--- a/ui/ui-material/api/restricted_current.txt
+++ b/ui/ui-material/api/restricted_current.txt
@@ -3,16 +3,23 @@
 
   public final class AppBarKt {
     ctor public AppBarKt();
-    method public static void AppBar(androidx.ui.graphics.Color color, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static void AppBarLeadingIcon();
-    method public static void TopAppBar(String? title = null, androidx.ui.graphics.Color color = +themeColor({ 
+    method public static void AppBarIcon(androidx.ui.painting.Image icon, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static <T> void BottomAppBar(androidx.ui.graphics.Color color = +themeColor({ 
     primary
-}), java.util.List<androidx.ui.core.Dp> icons = emptyList());
-    method public static void TopAppBar(androidx.ui.graphics.Color color = +themeColor({ 
+}), kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = (kotlin.jvm.functions.Function0<? extends kotlin.Unit>)null, kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton = (kotlin.jvm.functions.Function0<? extends kotlin.Unit>)null, androidx.ui.material.BottomAppBar.FabPosition fabPosition = Center, java.util.List<? extends T>? contextualActions = null, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action = {});
+    method public static <T> void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title = {}, androidx.ui.graphics.Color color = +themeColor({ 
     primary
-}), kotlin.jvm.functions.Function0<kotlin.Unit> leadingIcon, kotlin.jvm.functions.Function0<kotlin.Unit> titleTextLabel, kotlin.jvm.functions.Function0<kotlin.Unit> trailingIcons);
-    method public static void TopAppBarTitleTextLabel(String title);
-    method public static void TopAppBarTrailingIcons(java.util.List<androidx.ui.core.Dp> icons);
+}), kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon = {}, java.util.List<? extends T>? contextualActions = null, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action = {});
+  }
+
+  public final class BottomAppBar {
+    field public static final androidx.ui.material.BottomAppBar! INSTANCE;
+  }
+
+  public enum BottomAppBar.FabPosition {
+    enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition Center;
+    enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition CenterCut;
+    enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition End;
   }
 
   public final class ButtonKt {
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/AppBarActivity.kt b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/AppBarActivity.kt
index 0efb2ba..bc7ec4d 100644
--- a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/AppBarActivity.kt
+++ b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/AppBarActivity.kt
@@ -26,11 +26,15 @@
 import androidx.ui.core.Text
 import androidx.ui.core.dp
 import androidx.ui.layout.Column
+import androidx.ui.layout.FlexColumn
 import androidx.ui.layout.HeightSpacer
 import androidx.ui.material.MaterialTheme
-import androidx.ui.material.TopAppBar
+import androidx.ui.material.samples.SimpleBottomAppBarCenterFab
+import androidx.ui.material.samples.SimpleBottomAppBarEndFab
+import androidx.ui.material.samples.SimpleBottomAppBarNoFab
+import androidx.ui.material.samples.SimpleTopAppBar
 import androidx.ui.material.themeTextStyle
-import androidx.ui.graphics.Color
+import androidx.ui.painting.imageFromResource
 
 class AppBarActivity : Activity() {
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -38,25 +42,39 @@
         setContent {
             CraneWrapper {
                 MaterialTheme {
-                    AppBarDemo()
+                    val favouriteImage = { imageFromResource(resources, R.drawable.ic_favorite) }
+                    val navigationImage = { imageFromResource(resources, R.drawable.ic_menu) }
+                    FlexColumn {
+                        expanded(1f) {
+                            Column {
+                                SpacedText("TopAppBar")
+                                HeightSpacer(height = 28.dp)
+                                SimpleTopAppBar(favouriteImage, navigationImage)
+                            }
+                            Column {
+                                SpacedText("BottomAppBar - No FAB")
+                                HeightSpacer(height = 28.dp)
+                                SimpleBottomAppBarNoFab(favouriteImage, navigationImage)
+                            }
+                            Column {
+                                SpacedText("BottomAppBar - Center FAB")
+                                SimpleBottomAppBarCenterFab(favouriteImage, navigationImage)
+                            }
+                            Column {
+                                SpacedText("BottomAppBar - End FAB")
+                                SimpleBottomAppBarEndFab(favouriteImage)
+                            }
+                        }
+                    }
                 }
             }
         }
     }
-}
 
-@Composable
-fun AppBarDemo() {
-    Column {
-        TopAppBar(title = "Default")
-        HeightSpacer(height = 24.dp)
-        TopAppBar(title = "Custom color", color = Color(0xFFE91E63.toInt()))
-        HeightSpacer(height = 24.dp)
-        TopAppBar(title = "Custom icons", icons = listOf(24.dp, 24.dp))
+    @Composable
+    private fun SpacedText(text: String) {
         HeightSpacer(height = 12.dp)
-        Text(text = "No title", style = +themeTextStyle { h6 })
-        TopAppBar(icons = listOf(24.dp, 24.dp))
-        HeightSpacer(height = 24.dp)
-        TopAppBar(title = "Too many icons", icons = listOf(24.dp, 24.dp, 24.dp, 24.dp))
+        Text(text, style = +themeTextStyle { h6 })
+        HeightSpacer(height = 12.dp)
     }
-}
\ No newline at end of file
+}
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-hdpi/ic_menu.png b/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-hdpi/ic_menu.png
new file mode 100644
index 0000000..ba90d6d
--- /dev/null
+++ b/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-hdpi/ic_menu.png
Binary files differ
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-mdpi/ic_menu.png b/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-mdpi/ic_menu.png
new file mode 100644
index 0000000..05e063c
--- /dev/null
+++ b/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-mdpi/ic_menu.png
Binary files differ
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-xhdpi/ic_menu.png b/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-xhdpi/ic_menu.png
new file mode 100644
index 0000000..ad9bab1
--- /dev/null
+++ b/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-xhdpi/ic_menu.png
Binary files differ
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-xxhdpi/ic_menu.png b/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-xxhdpi/ic_menu.png
new file mode 100644
index 0000000..c43059e
--- /dev/null
+++ b/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-xxhdpi/ic_menu.png
Binary files differ
diff --git a/ui/ui-material/integration-tests/samples/src/main/java/androidx/ui/material/samples/AppBarSamples.kt b/ui/ui-material/integration-tests/samples/src/main/java/androidx/ui/material/samples/AppBarSamples.kt
new file mode 100644
index 0000000..369ca53
--- /dev/null
+++ b/ui/ui-material/integration-tests/samples/src/main/java/androidx/ui/material/samples/AppBarSamples.kt
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.material.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.Composable
+import androidx.compose.composer
+import androidx.ui.core.Text
+import androidx.ui.graphics.Color
+import androidx.ui.material.AppBarIcon
+import androidx.ui.material.BottomAppBar
+import androidx.ui.material.FloatingActionButton
+import androidx.ui.material.TopAppBar
+import androidx.ui.painting.Image
+
+@Suppress("UNUSED_VARIABLE")
+@Sampled
+@Composable
+fun SimpleTopAppBar(getMyActionImage: () -> Image, getMyNavigationImage: () -> Image) {
+    val someActionImage: Image = getMyActionImage()
+    val someNavigationImage: Image = getMyNavigationImage()
+
+    val navigationIcon: @Composable() () -> Unit = {
+        AppBarIcon(someNavigationImage) { /* doSomething()*/ }
+    }
+    val contextualActions = listOf("Action 1" to someActionImage, "action 2" to someActionImage)
+
+    TopAppBar(
+        title = { Text("Simple TopAppBar") },
+        navigationIcon = navigationIcon,
+        contextualActions = contextualActions
+    ) { actionData ->
+        val (actionTitle, actionImage) = actionData
+        AppBarIcon(actionImage) { /* doSomething()*/ }
+    }
+}
+
+@Suppress("UNUSED_VARIABLE")
+@Sampled
+@Composable
+fun SimpleBottomAppBarNoFab(getMyActionImage: () -> Image, getMyNavigationImage: () -> Image) {
+    val someActionImage: Image = getMyActionImage()
+    val someNavigationImage: Image = getMyNavigationImage()
+
+    val navigationIcon: @Composable() () -> Unit = {
+        AppBarIcon(someNavigationImage) { /* doSomething()*/ }
+    }
+    val contextualActions = listOf("Action 1" to someActionImage, "action 2" to someActionImage)
+
+    BottomAppBar(
+        navigationIcon = navigationIcon,
+        contextualActions = contextualActions
+    ) { actionData ->
+        val (actionTitle, actionImage) = actionData
+        AppBarIcon(actionImage) { /* doSomething()*/ }
+    }
+}
+
+@Suppress("UNUSED_VARIABLE")
+@Sampled
+@Composable
+fun SimpleBottomAppBarCenterFab(getMyActionImage: () -> Image, getMyNavigationImage: () -> Image) {
+    val someActionImage: Image = getMyActionImage()
+    val someNavigationImage: Image = getMyNavigationImage()
+
+    val navigationIcon: @Composable() () -> Unit = {
+        AppBarIcon(someNavigationImage) { /* doSomething()*/ }
+    }
+    val contextualActions = listOf("Action 1" to someActionImage, "action 2" to someActionImage)
+
+    BottomAppBar(
+        navigationIcon = navigationIcon,
+        floatingActionButton = {
+            FloatingActionButton(
+                color = Color.Black,
+                icon = someActionImage,
+                onClick = { /** doSomething() */ })
+        },
+        fabPosition = BottomAppBar.FabPosition.Center,
+        contextualActions = contextualActions
+    ) { actionData ->
+        val (actionTitle, actionImage) = actionData
+        AppBarIcon(actionImage) { /* doSomething()*/ }
+    }
+}
+
+@Suppress("UNUSED_VARIABLE")
+@Sampled
+@Composable
+fun SimpleBottomAppBarEndFab(getMyActionImage: () -> Image) {
+    val someActionImage: Image = getMyActionImage()
+    val contextualActions = listOf("Action 1" to someActionImage, "action 2" to someActionImage)
+
+    BottomAppBar(
+        floatingActionButton = {
+            FloatingActionButton(
+                color = Color.Black,
+                icon = someActionImage,
+                onClick = { /** doSomething() */ })
+        },
+        fabPosition = BottomAppBar.FabPosition.End,
+        contextualActions = contextualActions
+    ) { actionData ->
+        val (actionTitle, actionImage) = actionData
+        AppBarIcon(actionImage) { /* doSomething()*/ }
+    }
+}
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/AppBarTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/AppBarTest.kt
new file mode 100644
index 0000000..e33ff72
--- /dev/null
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/AppBarTest.kt
@@ -0,0 +1,397 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.material
+
+import androidx.compose.Composable
+import androidx.compose.composer
+import androidx.test.filters.SmallTest
+import androidx.ui.core.dp
+import androidx.ui.core.withDensity
+import androidx.ui.layout.Container
+import com.google.common.truth.Truth
+import androidx.compose.unaryPlus
+import androidx.ui.core.LayoutCoordinates
+import androidx.ui.core.OnChildPositioned
+import androidx.ui.core.PxPosition
+import androidx.ui.core.Semantics
+import androidx.ui.core.Text
+import androidx.ui.core.currentTextStyle
+import androidx.ui.core.ipx
+import androidx.ui.core.toPx
+import androidx.ui.foundation.ColoredRect
+import androidx.ui.graphics.Color
+import androidx.ui.text.TextStyle
+import androidx.ui.test.assertCountEquals
+import androidx.ui.test.assertIsVisible
+import androidx.ui.test.createComposeRule
+import androidx.ui.test.findAll
+import androidx.ui.test.findByText
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+// TODO: remove when tests are uncommented
+@Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE")
+@SmallTest
+@RunWith(JUnit4::class)
+class AppBarTest {
+
+    @get:Rule
+    val composeTestRule = createComposeRule()
+
+    private val appBarHeight = 56.dp
+
+    @Test
+    fun topAppBar_expandsToScreen() {
+        val dm = composeTestRule.displayMetrics
+        composeTestRule
+            .setMaterialContentAndTestSizes {
+                TopAppBar<Nothing>()
+            }
+            .assertHeightEqualsTo(appBarHeight)
+            .assertWidthEqualsTo { dm.widthPixels.ipx }
+    }
+
+    @Test
+    fun topAppBar_withTitle() {
+        val title = "Title"
+        composeTestRule.setMaterialContent {
+            TopAppBar<Nothing>(title = { Text(title) })
+        }
+        findByText(title).assertIsVisible()
+    }
+
+    @Test
+    fun topAppBar_defaultPositioning() {
+        var appBarCoords: LayoutCoordinates? = null
+        var navigationIconCoords: LayoutCoordinates? = null
+        var titleCoords: LayoutCoordinates? = null
+        var actionCoords: LayoutCoordinates? = null
+        composeTestRule.setMaterialContent {
+            Container {
+                OnChildPositioned(onPositioned = { coords ->
+                    appBarCoords = coords
+                }) {
+                    TopAppBar(
+                        navigationIcon = {
+                            OnChildPositioned(onPositioned = { coords ->
+                                navigationIconCoords = coords
+                            }) {
+                                FakeIcon()
+                            }
+                        },
+                        title = {
+                            OnChildPositioned(onPositioned = { coords ->
+                                titleCoords = coords
+                            }) {
+                                Text("title")
+                            }
+                        },
+                        contextualActions = createImageList(1),
+                        action = {
+                            OnChildPositioned(onPositioned = { coords ->
+                                actionCoords = coords
+                            }) { it() }
+                        }
+                    )
+                }
+            }
+        }
+
+        withDensity(composeTestRule.density) {
+            // Navigation icon should be at the beginning
+            val navigationIconPositionX = navigationIconCoords!!.localToGlobal(PxPosition.Origin).x
+            val navigationIconExpectedPositionX = 16.dp.toIntPx().toPx()
+            Truth.assertThat(navigationIconPositionX).isEqualTo(navigationIconExpectedPositionX)
+
+            // Title should be next
+            val titlePositionX = titleCoords!!.localToGlobal(PxPosition.Origin).x
+            val titleExpectedPositionX =
+                navigationIconPositionX + navigationIconCoords!!.size.width + 32.dp.toIntPx()
+            Truth.assertThat(titlePositionX).isEqualTo(titleExpectedPositionX)
+
+            // Action should be placed at the end
+            val actionPositionX = actionCoords!!.localToGlobal(PxPosition.Origin).x
+            val actionExpectedPositionX =
+                appBarCoords!!.size.width - 16.dp.toIntPx() - 24.dp.toIntPx()
+            Truth.assertThat(actionPositionX).isEqualTo(actionExpectedPositionX)
+        }
+    }
+
+    @Test
+    fun topAppBar_oneAction() {
+        val tag = "action"
+        val numberOfActions = 1
+        composeTestRule.setMaterialContent {
+            Container {
+                TopAppBar(
+                    contextualActions = createImageList(numberOfActions),
+                    action = { action ->
+                        Semantics(testTag = tag) { action() }
+                    }
+                )
+            }
+        }
+
+        findAll { testTag == tag }.assertCountEquals(numberOfActions)
+    }
+
+    @Test
+    fun topAppBar_fiveActions_onlyTwoShouldBeVisible() {
+        val tag = "action"
+        val numberOfActions = 5
+        val maxNumberOfActions = 2
+        composeTestRule.setMaterialContent {
+            Container {
+                TopAppBar(
+                    contextualActions = createImageList(numberOfActions),
+                    action = { action ->
+                        Semantics(testTag = tag) { action() }
+                    }
+                )
+            }
+        }
+
+        findAll { testTag == tag }.assertCountEquals(maxNumberOfActions)
+    }
+
+    @Test
+    fun topAppBar_titleDefaultStyle() {
+        var textStyle: TextStyle? = null
+        var h6Style: TextStyle? = null
+        composeTestRule.setMaterialContent {
+            Container {
+                TopAppBar<Nothing>(
+                    title = {
+                        textStyle = +currentTextStyle()
+                        h6Style = +themeTextStyle { h6 }
+                    }
+                )
+            }
+        }
+        Truth.assertThat(textStyle!!.fontSize).isEqualTo(h6Style!!.fontSize)
+        Truth.assertThat(textStyle!!.fontFamily).isEqualTo(h6Style!!.fontFamily)
+    }
+
+    @Test
+    fun bottomAppBar_expandsToScreen() {
+        val dm = composeTestRule.displayMetrics
+        composeTestRule
+            .setMaterialContentAndTestSizes {
+                BottomAppBar<Nothing>()
+            }
+            .assertHeightEqualsTo(appBarHeight)
+            .assertWidthEqualsTo { dm.widthPixels.ipx }
+    }
+
+    @Test
+    fun bottomAppBar_noFab_positioning() {
+        var appBarCoords: LayoutCoordinates? = null
+        var navigationIconCoords: LayoutCoordinates? = null
+        var actionCoords: LayoutCoordinates? = null
+        composeTestRule.setMaterialContent {
+            Container {
+                OnChildPositioned(onPositioned = { coords ->
+                    appBarCoords = coords
+                }) {
+                    BottomAppBar(
+                        navigationIcon = {
+                            OnChildPositioned(onPositioned = { coords ->
+                                navigationIconCoords = coords
+                            }) {
+                                FakeIcon()
+                            }
+                        },
+                        contextualActions = createImageList(1),
+                        action = {
+                            OnChildPositioned(onPositioned = { coords ->
+                                actionCoords = coords
+                            }) { it() }
+                        }
+                    )
+                }
+            }
+        }
+
+        withDensity(composeTestRule.density) {
+            // Navigation icon should be at the beginning
+            val navigationIconPositionX = navigationIconCoords!!.localToGlobal(PxPosition.Origin).x
+            val navigationIconExpectedPositionX = 16.dp.toIntPx().toPx()
+            Truth.assertThat(navigationIconPositionX).isEqualTo(navigationIconExpectedPositionX)
+
+            // TODO: layout rounding issues here depending on the density of the device
+            /*
+            // Action should be placed at the end
+            val actionPositionX = actionCoords!!.localToGlobal(PxPosition.Origin).x
+            val actionExpectedPositionX = appBarCoords!!.size.width.round().toPx() -
+                    16.dp.toIntPx().toPx() - 24.dp.toIntPx().toPx()
+            Truth.assertThat(actionPositionX).isEqualTo(actionExpectedPositionX)
+            */
+        }
+    }
+
+    @Test
+    fun bottomAppBar_centerFab_positioning() {
+        var appBarCoords: LayoutCoordinates? = null
+        var navigationIconCoords: LayoutCoordinates? = null
+        var fabCoords: LayoutCoordinates? = null
+        var actionCoords: LayoutCoordinates? = null
+        composeTestRule.setMaterialContent {
+            Container {
+                OnChildPositioned(onPositioned = { coords ->
+                    appBarCoords = coords
+                }) {
+                    BottomAppBar(
+                        navigationIcon = {
+                            OnChildPositioned(onPositioned = { coords ->
+                                navigationIconCoords = coords
+                            }) {
+                                FakeIcon()
+                            }
+                        },
+                        floatingActionButton = {
+                            OnChildPositioned(onPositioned = { coords ->
+                                fabCoords = coords
+                            }) {
+                                FakeIcon()
+                            }
+                        },
+                        contextualActions = createImageList(1),
+                        action = {
+                            OnChildPositioned(onPositioned = { coords ->
+                                actionCoords = coords
+                            }) { it() }
+                        }
+                    )
+                }
+            }
+        }
+
+        withDensity(composeTestRule.density) {
+            // Navigation icon should be at the beginning
+            val navigationIconPositionX = navigationIconCoords!!.localToGlobal(PxPosition.Origin).x
+            val navigationIconExpectedPositionX = 16.dp.toIntPx().toPx()
+            Truth.assertThat(navigationIconPositionX).isEqualTo(navigationIconExpectedPositionX)
+
+            // TODO: layout rounding issues here depending on the density of the device
+            /*
+            // FAB should be placed in the center
+            val fabPositionX = fabCoords!!.localToGlobal(PxPosition.Origin).x
+            val fabExpectedPositionX = (appBarCoords!!.size.width / 2) - 12.dp.toIntPx()
+            Truth.assertThat(fabPositionX).isEqualTo(fabExpectedPositionX)
+
+            // Action should be placed at the end
+            val actionPositionX = actionCoords!!.localToGlobal(PxPosition.Origin).x
+            val actionExpectedPositionX = appBarCoords!!.size.width.round().toPx() -
+                    16.dp.toIntPx().toPx() - 24.dp.toIntPx().toPx()
+            Truth.assertThat(actionPositionX).isEqualTo(actionExpectedPositionX)
+            */
+        }
+    }
+
+    @Test
+    fun bottomAppBar_endFab_positioning() {
+        var appBarCoords: LayoutCoordinates? = null
+        var fabCoords: LayoutCoordinates? = null
+        var actionCoords: LayoutCoordinates? = null
+        composeTestRule.setMaterialContent {
+            Container {
+                OnChildPositioned(onPositioned = { coords ->
+                    appBarCoords = coords
+                }) {
+                    BottomAppBar(
+                        floatingActionButton = {
+                            OnChildPositioned(onPositioned = { coords ->
+                                fabCoords = coords
+                            }) {
+                                FakeIcon()
+                            }
+                        },
+                        fabPosition = BottomAppBar.FabPosition.End,
+                        contextualActions = createImageList(1),
+                        action = {
+                            OnChildPositioned(onPositioned = { coords ->
+                                actionCoords = coords
+                            }) { it() }
+                        }
+                    )
+                }
+            }
+        }
+
+        withDensity(composeTestRule.density) {
+            // Action should be placed at the start
+            val actionPositionX = actionCoords!!.localToGlobal(PxPosition.Origin).x
+            val actionExpectedPositionX = 16.dp.toIntPx().toPx()
+            Truth.assertThat(actionPositionX).isEqualTo(actionExpectedPositionX)
+
+            // TODO: layout rounding issues here depending on the density of the device
+            /*
+            // FAB should be placed at the end
+            val fabPositionX = fabCoords!!.localToGlobal(PxPosition.Origin).x
+            val fabExpectedPositionX = appBarCoords!!.size.width.round().toPx() -
+                    16.dp.toIntPx().toPx() - 24.dp.toIntPx().toPx()
+            Truth.assertThat(fabPositionX).isEqualTo(fabExpectedPositionX)
+            */
+        }
+    }
+
+    @Test
+    fun bottomAppBar_oneAction() {
+        val tag = "action"
+        val numberOfActions = 1
+        composeTestRule.setMaterialContent {
+            Container {
+                BottomAppBar(
+                    contextualActions = createImageList(numberOfActions),
+                    action = { action ->
+                        Semantics(testTag = tag) { action() }
+                    }
+                )
+            }
+        }
+
+        findAll { testTag == tag }.assertCountEquals(numberOfActions)
+    }
+
+    @Test
+    fun bottomAppBar_fiveActions_onlyFourShouldBeVisible() {
+        val tag = "action"
+        val numberOfActions = 5
+        val maxNumberOfActions = 4
+        composeTestRule.setMaterialContent {
+            Container {
+                BottomAppBar(
+                    contextualActions = createImageList(numberOfActions),
+                    action = { action ->
+                        Semantics(testTag = tag) { action() }
+                    }
+                )
+            }
+        }
+
+        findAll { testTag == tag }.assertCountEquals(maxNumberOfActions)
+    }
+
+    private fun createImageList(count: Int) =
+        List<@Composable() () -> Unit>(count) { { FakeIcon() } }
+
+    // Render a red rectangle to simulate an icon
+    @Composable
+    private fun FakeIcon() = ColoredRect(Color.Red, 24.dp, 24.dp)
+}
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/TopAppBarUiTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/TopAppBarUiTest.kt
deleted file mode 100644
index 66e3c40..0000000
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/TopAppBarUiTest.kt
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.ui.material
-
-import androidx.test.filters.SmallTest
-import androidx.ui.core.OnChildPositioned
-import androidx.ui.core.dp
-import androidx.ui.core.round
-import androidx.ui.core.withDensity
-import androidx.ui.layout.Container
-import com.google.common.truth.Truth
-import androidx.compose.composer
-import androidx.compose.unaryPlus
-import androidx.ui.core.LayoutCoordinates
-import androidx.ui.core.currentTextStyle
-import androidx.ui.core.ipx
-import androidx.ui.text.TextStyle
-import androidx.ui.test.assertCountEquals
-import androidx.ui.test.assertDoesNotExist
-import androidx.ui.test.assertIsVisible
-import androidx.ui.test.createComposeRule
-import androidx.ui.test.findAll
-import androidx.ui.test.findByTag
-import androidx.ui.test.findByText
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@SmallTest
-@RunWith(JUnit4::class)
-class TopAppBarUiTest {
-
-    @get:Rule
-    val composeTestRule = createComposeRule()
-
-    private val defaultHeight = 56.dp
-
-    @Test
-    fun topAppBarTest_ExpandsToScreen() {
-        val dm = composeTestRule.displayMetrics
-        composeTestRule
-            .setMaterialContentAndTestSizes {
-                TopAppBar()
-            }
-            .assertHeightEqualsTo(defaultHeight)
-            .assertWidthEqualsTo { dm.widthPixels.ipx }
-    }
-
-    @Test
-    fun topAppBarTest_LeadingIconPresent() {
-        composeTestRule.setMaterialContent {
-            TopAppBar()
-        }
-        findByTag("Leading icon").assertIsVisible()
-    }
-
-    @Test
-    fun topAppBarTest_TitleTextLabel_noTitle() {
-        composeTestRule.setMaterialContent {
-            TopAppBar()
-        }
-        assertDoesNotExist { testTag == "Title" }
-    }
-
-    @Test
-    fun topAppBarTest_TitleTextLabel_withTitle() {
-        val title = "Title"
-        composeTestRule.setMaterialContent {
-            TopAppBar(title = title)
-        }
-        findByText(title).assertIsVisible()
-    }
-
-    @Test
-    fun topAppBar_defaultPositioning() {
-        var leadingIconInfo: LayoutCoordinates? = null
-        var titleLabelInfo: LayoutCoordinates? = null
-        var trailingIconInfo: LayoutCoordinates? = null
-        composeTestRule.setMaterialContent {
-            Container {
-                TopAppBar(
-                    leadingIcon = {
-                        OnChildPositioned(onPositioned = { position ->
-                            leadingIconInfo = position
-                        }) {
-                            AppBarLeadingIcon()
-                        }
-                    },
-                    titleTextLabel = {
-                        OnChildPositioned(onPositioned = { position ->
-                            titleLabelInfo = position
-                        }) {
-                            TopAppBarTitleTextLabel("title")
-                        }
-                    },
-                    trailingIcons = {
-                        OnChildPositioned(onPositioned = { position ->
-                            trailingIconInfo = position
-                        }) {
-                            TopAppBarTrailingIcons(listOf(24.dp, 24.dp))
-                        }
-                    }
-                )
-            }
-        }
-
-        withDensity(composeTestRule.density) {
-            val dm = composeTestRule.displayMetrics
-
-            // Leading icon should be in the front
-            val leadingIconPositionX = leadingIconInfo?.position?.x!!.value
-            val leadingIconExpectedPositionX = 0f
-            Truth.assertThat(leadingIconPositionX).isEqualTo(leadingIconExpectedPositionX)
-
-            // Title should be next
-            val titleLabelPositionX = titleLabelInfo?.position?.x!!
-            val titleLabelExpectedPositionX = leadingIconInfo?.size?.width!! + 32.dp.toIntPx()
-            Truth.assertThat(titleLabelPositionX).isEqualTo(titleLabelExpectedPositionX)
-
-            // Trailing icons should be in the second half of the screen
-            val trailingIconPositionX = trailingIconInfo?.position?.x!!
-            val totalSpaceMiddle = dm.widthPixels / 2f
-            Truth.assertThat(trailingIconPositionX.value).isGreaterThan(totalSpaceMiddle)
-        }
-    }
-
-    @Test
-    fun topAppBar_noTitlePositioning() {
-        var leadingIconInfo: LayoutCoordinates? = null
-        var trailingIconInfo: LayoutCoordinates? = null
-        composeTestRule.setMaterialContent {
-            Container {
-                TopAppBar(
-                    leadingIcon = {
-                        OnChildPositioned(onPositioned = { position ->
-                            leadingIconInfo = position
-                        }) {
-                            AppBarLeadingIcon()
-                        }
-                    },
-                    titleTextLabel = {},
-                    trailingIcons = {
-                        OnChildPositioned(onPositioned = { position ->
-                            trailingIconInfo = position
-                        }) {
-                            TopAppBarTrailingIcons(listOf(24.dp, 24.dp))
-                        }
-                    }
-                )
-            }
-        }
-
-        withDensity(composeTestRule.density) {
-            val dm = composeTestRule.displayMetrics
-
-            // Leading icon should be in the front
-            val leadingIconPositionX = leadingIconInfo?.position?.x!!.value
-            val leadingIconExpectedPositionX = 0f
-            Truth.assertThat(leadingIconPositionX).isEqualTo(leadingIconExpectedPositionX)
-
-            // Trailing icons should be in the second half of the screen
-            val trailingIconPositionX = trailingIconInfo?.position?.x!!
-            val totalSpaceMiddle = dm.widthPixels / 2f
-            Truth.assertThat(trailingIconPositionX.value).isGreaterThan(totalSpaceMiddle)
-        }
-    }
-
-    @Test
-    fun topAppBar_titleDefaultStyle() {
-        var textStyle: TextStyle? = null
-        var h6Style: TextStyle? = null
-        composeTestRule.setMaterialContent {
-            Container {
-                TopAppBar(
-                    leadingIcon = {},
-                    titleTextLabel = {
-                        textStyle = +currentTextStyle()
-                        h6Style = +themeTextStyle { h6 }
-                    },
-                    trailingIcons = {}
-                )
-            }
-        }
-        Truth.assertThat(textStyle!!.fontSize).isEqualTo(h6Style!!.fontSize)
-        Truth.assertThat(textStyle!!.fontFamily).isEqualTo(h6Style!!.fontFamily)
-    }
-
-    @Test
-    fun topAppBarTrailingIcons_noIcons() {
-        var trailingIconInfo: LayoutCoordinates? = null
-        composeTestRule.setMaterialContent {
-            Container {
-                OnChildPositioned(onPositioned = { position ->
-                    trailingIconInfo = position
-                }) {
-                    TopAppBarTrailingIcons(emptyList())
-                }
-            }
-        }
-        assertDoesNotExist { testTag == "Trailing icon" }
-
-        withDensity(composeTestRule.density) {
-            val trailingIconWidth = trailingIconInfo?.size?.width?.round()
-            Truth.assertThat(trailingIconWidth).isNull()
-        }
-    }
-
-    @Test
-    fun topAppBarTrailingIcons_oneIcon() {
-        composeTestRule
-            .setMaterialContentAndTestSizes {
-                TopAppBarTrailingIcons(icons = listOf(24.dp))
-            }
-            .assertWidthEqualsTo { 24.dp.toIntPx() + 24.dp.toIntPx() }
-
-        findByTag("Trailing icon").assertIsVisible()
-        assertDoesNotExist { testTag == "Overflow icon" }
-    }
-
-    @Test
-    fun topAppBarTrailingIcons_twoIcons() {
-
-        composeTestRule.setMaterialContentAndTestSizes {
-            TopAppBarTrailingIcons(icons = listOf(24.dp, 24.dp))
-        }.assertWidthEqualsTo { (24.dp.toIntPx() * 2) + (24.dp.toIntPx() * 2) }
-
-        findAll { testTag == "Trailing icon" }.apply {
-            forEach {
-                it.assertIsVisible()
-            }
-        }.assertCountEquals(2)
-        assertDoesNotExist { testTag == "Overflow icon" }
-    }
-
-    @Test
-    fun topAppBarTrailingIcons_threeIcons() {
-        composeTestRule
-            .setMaterialContentAndTestSizes {
-                TopAppBarTrailingIcons(icons = listOf(24.dp, 24.dp, 24.dp))
-            }
-            .assertWidthEqualsTo { 24.dp.toIntPx() * 2 + 24.dp.toIntPx() * 3 + 12.dp.toIntPx() }
-        // icons and spacers + 12.dp overflow
-
-        findAll { testTag == "Trailing icon" }.apply {
-            forEach {
-                it.assertIsVisible()
-            }
-        }.assertCountEquals(2)
-        findByTag("Overflow icon").assertIsVisible()
-    }
-}
\ No newline at end of file
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/AppBar.kt b/ui/ui-material/src/main/java/androidx/ui/material/AppBar.kt
index ecb7dde..3996bd3 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/AppBar.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/AppBar.kt
@@ -16,16 +16,16 @@
 
 package androidx.ui.material
 
-import androidx.compose.Children
 import androidx.compose.Composable
 import androidx.compose.composer
 import androidx.compose.unaryPlus
 import androidx.ui.core.CurrentTextStyleProvider
-import androidx.ui.core.Dp
 import androidx.ui.core.Semantics
 import androidx.ui.core.Text
 import androidx.ui.core.dp
-import androidx.ui.foundation.ColoredRect
+import androidx.ui.core.sp
+import androidx.ui.foundation.Clickable
+import androidx.ui.foundation.SimpleImage
 import androidx.ui.layout.Container
 import androidx.ui.layout.FlexRow
 import androidx.ui.layout.MainAxisAlignment
@@ -33,90 +33,257 @@
 import androidx.ui.layout.WidthSpacer
 import androidx.ui.material.surface.Surface
 import androidx.ui.graphics.Color
+import androidx.ui.layout.Align
+import androidx.ui.layout.Alignment
+import androidx.ui.layout.Center
+import androidx.ui.layout.ConstrainedBox
+import androidx.ui.layout.DpConstraints
 import androidx.ui.layout.EdgeInsets
-import androidx.ui.layout.FlexSize
+import androidx.ui.layout.Stack
+import androidx.ui.material.BottomAppBar.FabPosition
+import androidx.ui.material.BottomAppBar.FabPosition.Center
+import androidx.ui.material.BottomAppBar.FabPosition.End
+import androidx.ui.material.ripple.Ripple
+import androidx.ui.painting.Image
+import androidx.ui.text.TextStyle
 
 /**
- * A Top App Bar displays information and actions relating to the current screen and is placed at
- * the top of the screen.
- * This version of the TopAppBar will produce a default bar with a navigation leading icon, an
- * optional title and a set of menu icons.
+ * A TopAppBar displays information and actions relating to the current screen and is placed at the
+ * top of the screen.
  *
- * Example usage:
- *     TopAppBar(
- *         title = "Title",
- *         color = +themeColor{ secondary }
- *     )
+ * @sample androidx.ui.material.samples.SimpleTopAppBar
  *
- * @param title An optional title to display
- * @param color An optional color for the App Bar. By default [MaterialColors.primary] will be used.
- * @param icons An optional list of icons to display on the App Bar.
+ * @param title The title to be displayed in the center of the TopAppBar
+ * @param color An optional color for the TopAppBar. By default [MaterialColors.primary] will be
+ * used.
+ * @param navigationIcon The navigation icon displayed at the start of the TopAppBar
+ * @param contextualActions A list representing the contextual actions to be displayed at the end of
+ * the TopAppBar. Any remaining actions that do not fit on the TopAppBar should typically be
+ * displayed in an overflow menu at the end.
+ * @param action A specific item action to be displayed at the end of the TopAppBar - this will be
+ * called for items in [contextualActions] up to the maximum number of icons that can be displayed.
+ * @param T the type of item in [contextualActions]
  */
 @Composable
-fun TopAppBar(
-    title: String? = null,
+fun <T> TopAppBar(
+    title: @Composable() () -> Unit = {},
     color: Color = +themeColor { primary },
-    // TODO: work on menus
-    icons: List<Dp> = emptyList()
+    navigationIcon: @Composable() () -> Unit = {},
+    contextualActions: List<T>? = null,
+    action: @Composable() (T) -> Unit = {}
+    // TODO: support overflow menu here with the remainder of the list
 ) {
-    TopAppBar(
+    BaseTopAppBar(
         color = color,
-        leadingIcon = { AppBarLeadingIcon() },
-        titleTextLabel = {
-            if (title != null) {
-                TopAppBarTitleTextLabel(title)
+        startContent = navigationIcon,
+        title = title,
+        endContent = {
+            if (contextualActions != null) {
+                AppBarActions(MaxIconsInTopAppBar, contextualActions, action)
             }
-        },
-        trailingIcons = { TopAppBarTrailingIcons(icons) }
+        }
     )
 }
 
-/**
- * A Top App Bar displays information and actions relating to the current screen and is placed at
- * the top of the screen.
- *
- * Example usage:
- *     TopAppBar(
- *         color = +themeColor{ secondary },
- *         leadingIcon = { MyNavIcon() },
- *         titleTextLabel = { Text(text = "Title") },
- *         trailingIcons = { TopAppBarTrailingIcons(icons) }
- *     )
- *
- * @param color An optional color for the App Bar. By default [MaterialColors.primary] will be used.
- * @param leadingIcon A composable lambda to be inserted in the Leading Icon space. This is usually
- * a navigation icon. A standard implementation is provided by [AppBarLeadingIcon].
- * @param titleTextLabel A composable lambda to be inserted in the title space. This is usually a
- * [Text] element. A standard implementation is provided by [TopAppBarTitleTextLabel]. Default text
- * styling [MaterialTypography.h6] will be used.
- * @param trailingIcons A composable lambda to be inserted at the end of the bar, usually containing
- * a collection of menu icons. A standard implementation is provided by [TopAppBarTrailingIcons].
- */
 @Composable
-fun TopAppBar(
+private fun BaseTopAppBar(
     color: Color = +themeColor { primary },
-    leadingIcon: @Composable() () -> Unit,
-    titleTextLabel: @Composable() () -> Unit,
-    trailingIcons: @Composable() () -> Unit
+    startContent: @Composable() () -> Unit,
+    title: @Composable() () -> Unit,
+    endContent: @Composable() () -> Unit
 ) {
-    AppBar(color) {
+    BaseAppBar(color) {
         FlexRow(mainAxisAlignment = MainAxisAlignment.SpaceBetween) {
             inflexible {
-                leadingIcon()
+                // TODO: what should the spacing be when there is no icon provided here?
+                startContent()
                 WidthSpacer(width = 32.dp)
             }
-            expanded(flex = 1f) {
+            expanded(1f) {
                 CurrentTextStyleProvider(value = +themeTextStyle { h6 }) {
-                    titleTextLabel()
+                    title()
                 }
             }
             inflexible {
-                trailingIcons()
+                endContent()
             }
         }
     }
 }
 
+object BottomAppBar {
+    /**
+     * The possible positions for the [FloatingActionButton] embedded in the [BottomAppBar], if a
+     * [FloatingActionButton] is specified.
+     */
+    enum class FabPosition {
+        /**
+         * Positioned in the center of the [BottomAppBar], overlapping the content of the
+         * BottomAppBar
+         */
+        Center,
+        /**
+         * Positioned at the end of the [BottomAppBar], overlapping the content of the
+         * BottomAppBar
+         */
+        End,
+        /**
+         * Positioned in the center of the [BottomAppBar], with an inset cutting into the content of
+         * the BottomAppBar
+         */
+        CenterCut,
+    }
+}
+
+/**
+ * A BottomAppBar displays actions relating to the current screen and is placed at the bottom of
+ * the screen. It can also optionally display a [FloatingActionButton], which is either overlaid
+ * on top of the BottomAppBar, or inset, carving a notch in the BottomAppBar.
+ *
+ * The location of the actions displayed by the BottomAppBar depends on the [FabPosition] /
+ * existence of the [FloatingActionButton]. When the [FloatingActionButton] is:
+ *
+ * - not set: the [navigationIcon] is displayed at the start, and the [contextualActions] are
+ * displayed at the end
+ *
+ * @sample androidx.ui.material.samples.SimpleBottomAppBarNoFab
+ *
+ * - [Center] or [CenterCut] aligned: the [navigationIcon] is displayed at the start, and the
+ * [contextualActions] are displayed at the end
+ *
+ * @sample androidx.ui.material.samples.SimpleBottomAppBarCenterFab
+ *
+ * - [End] aligned: the [contextualActions] are displayed at the start, and no navigation icon is
+ * supported
+ *
+ * @sample androidx.ui.material.samples.SimpleBottomAppBarEndFab
+ *
+ * @param color An optional color for the BottomAppBar. By default [MaterialColors.primary]
+ * will be used.
+ * @param navigationIcon The navigation icon displayed in the BottomAppBar. Note that if
+ * [fabPosition] is set to [End], this parameter must be null / not set.
+ * @param floatingActionButton The [FloatingActionButton] displayed in the BottomAppBar. The
+ * position of this fab will be [Center] aligned by default. You can set [fabPosition] to change
+ * the position.
+ * @param fabPosition The [FabPosition] of the [floatingActionButton]. This can be [Center],
+ * [CenterCut], or [End].
+ * @param contextualActions A list representing the contextual actions to be displayed in the
+ * BottomAppBar. Any remaining actions that do not fit on the BottomAppBar should typically be
+ * displayed in an overflow menu.
+ * @param action A specific item action to be displayed in the BottomAppBar - this will be called
+ * for items in [contextualActions] up to the maximum number of icons that can be displayed.
+ * @param T the type of item in [contextualActions]
+ */
+// TODO: b/137311217 - type inference for nullable lambdas currently doesn't work
+@Suppress("USELESS_CAST")
+@Composable
+fun <T> BottomAppBar(
+    color: Color = +themeColor { primary },
+    navigationIcon: (@Composable() () -> Unit)? = null as @Composable() (() -> Unit)?,
+    floatingActionButton: (@Composable() () -> Unit)? = null as @Composable() (() -> Unit)?,
+    fabPosition: FabPosition = Center,
+    contextualActions: List<T>? = null,
+    action: @Composable() (T) -> Unit = {}
+    // TODO: support overflow menu here with the remainder of the list
+) {
+    require(navigationIcon == null || fabPosition != End) {
+        "Using a navigation icon with an end-aligned FloatingActionButton is not supported"
+    }
+
+    val actions = { maxIcons: Int ->
+        @Composable {
+            if (contextualActions != null) {
+                AppBarActions(maxIcons, contextualActions, action)
+            }
+        }
+    }
+
+    val navigationIconComposable = @Composable {
+        if (navigationIcon != null) {
+            navigationIcon()
+        }
+    }
+
+    if (floatingActionButton == null) {
+        BaseBottomAppBar(
+            color = color,
+            startContent = navigationIconComposable,
+            endContent = actions(MaxIconsInBottomAppBarNoFab)
+        )
+        return
+    }
+
+    when (fabPosition) {
+        End -> BaseBottomAppBar(
+            color = color,
+            startContent = actions(MaxIconsInBottomAppBarEndFab),
+            fab = { Align(Alignment.CenterRight) { floatingActionButton() } }
+        )
+        // TODO: support CenterCut
+        else -> BaseBottomAppBar(
+            color = color,
+            startContent = navigationIconComposable,
+            fab = { Center { floatingActionButton() } },
+            endContent = actions(MaxIconsInBottomAppBarCenterFab)
+        )
+    }
+}
+
+// TODO: b/137311217 - type inference for nullable lambdas currently doesn't work
+@Suppress("USELESS_CAST")
+@Composable
+private fun BaseBottomAppBar(
+    color: Color = +themeColor { primary },
+    startContent: @Composable() () -> Unit = {},
+    fab: (@Composable() () -> Unit)? = null as @Composable() (() -> Unit)?,
+    endContent: @Composable() () -> Unit = {}
+) {
+    val appBar = @Composable { BaseBottomAppBarWithoutFab(color, startContent, endContent) }
+    if (fab == null) {
+        appBar()
+    } else {
+        ConstrainedBox(
+            constraints = DpConstraints(
+                minHeight = BottomAppBarHeightWithFab,
+                maxHeight = BottomAppBarHeightWithFab
+            )
+        ) {
+            Stack {
+                aligned(Alignment.BottomCenter) {
+                    appBar()
+                }
+                aligned(Alignment.TopCenter) {
+                    Container(
+                        height = AppBarHeight,
+                        padding = EdgeInsets(left = AppBarPadding, right = AppBarPadding)
+                    ) {
+                        fab()
+                    }
+                }
+            }
+        }
+    }
+}
+
+@Composable
+private fun BaseBottomAppBarWithoutFab(
+    color: Color,
+    startContent: @Composable() () -> Unit,
+    endContent: @Composable() () -> Unit
+) {
+    BaseAppBar(color) {
+        FlexRow(mainAxisAlignment = MainAxisAlignment.SpaceBetween) {
+            inflexible {
+                startContent()
+                // TODO: if startContent() doesn't have any layout, then the endContent won't be
+                // placed at the end, so we need to trick it with a spacer
+                WidthSpacer(width = 1.dp)
+            }
+            inflexible { endContent() }
+        }
+    }
+}
+
 /**
  * An empty App Bar that expands to the parent's width.
  *
@@ -124,103 +291,78 @@
  * [TopAppBar].
  */
 @Composable
-fun AppBar(color: Color, @Children children: @Composable() () -> Unit) {
+private fun BaseAppBar(color: Color, children: @Composable() () -> Unit) {
     Semantics(
         container = true
     ) {
         Surface(color = color) {
-            Container(height = RegularHeight, expanded = true, padding = EdgeInsets(Padding)) {
+            Container(height = AppBarHeight, expanded = true, padding = EdgeInsets(AppBarPadding)) {
                 children()
             }
         }
     }
 }
 
-/**
- * A component that displays a leading icon for an App Bar following Material spec guidelines.
- *
- * @see [AppBar]
- * @see [TopAppBar]
- */
 @Composable
-fun AppBarLeadingIcon() {
-    // TODO: Replace with real icon button
-    Semantics(testTag = "Leading icon") {
-        FakeIcon(24.dp)
-    }
-}
-
-/**
- * A component that displays a title as a [Text] element for placement within a Top App Bar
- * following Material spec guidelines.
- *
- * @see [TopAppBar]
- *
- * @param title A title String to display
- */
-@Composable
-fun TopAppBarTitleTextLabel(title: String) {
-    Text(text = title)
-}
-
-/**
- * A component that displays a set of menu icons for placement within a Top App Bar following
- * Material spec guidelines.
- *
- * @see [TopAppBar]
- *
- * @param icons A list of icons to display
- */
-@Composable
-fun TopAppBarTrailingIcons(icons: List<Dp>) {
-    TrailingIcons(
-        numIcons = icons.size,
-        maxIcons = MaxIconsInTopAppBar,
-        icons = { index ->
-            Semantics(testTag = "Trailing icon") {
-                // TODO: Replace with real icon button
-                FakeIcon(icons[index])
-            }
-        },
-        overflowIcon = {
-            Semantics(testTag = "Overflow icon") {
-                FakeIcon(12.dp)
-            }
-        }
-    )
-}
-
-// TODO: make public
-@Composable
-internal fun TrailingIcons(
-    numIcons: Int,
-    maxIcons: Int,
-    icons: @Composable() (index: Int) -> Unit,
-    overflowIcon: @Composable() () -> Unit
+private fun <T> AppBarActions(
+    actionsToDisplay: Int,
+    contextualActions: List<T>,
+    action: @Composable() (T) -> Unit
 ) {
-    if (numIcons > 0) {
-        Row(mainAxisSize = FlexSize.Min) {
-            val needsOverflow = numIcons > maxIcons
-            val iconsToDisplay = if (needsOverflow) maxIcons else numIcons
-            for (index in 0 until iconsToDisplay) {
+    if (contextualActions.isEmpty()) {
+        return
+    }
+
+    // Split the list depending on how many actions we are displaying - if actionsToDisplay is
+    // greater than or equal to the number of actions provided, overflowActions will be empty.
+    val (shownActions, overflowActions) = contextualActions.withIndex().partition {
+        it.index < actionsToDisplay
+    }
+
+    Row {
+        shownActions.forEach { (index, shownAction) ->
+            action(shownAction)
+            if (index != shownActions.lastIndex) {
                 WidthSpacer(width = 24.dp)
-                icons(index)
             }
-            if (needsOverflow) {
-                WidthSpacer(width = 24.dp)
-                overflowIcon()
+        }
+        if (overflowActions.isNotEmpty()) {
+            WidthSpacer(width = 24.dp)
+            // TODO: use overflowActions to build menu here
+            Container(width = 12.dp) {
+                Text(text = "${overflowActions.size}", style = TextStyle(fontSize = 15.sp))
             }
         }
     }
 }
 
-// TODO: remove
+/**
+ * A correctly sized clickable icon that can be used inside [TopAppBar] and [BottomAppBar] for
+ * either the navigation icon or the actions.
+ *
+ * @param icon The icon to be displayed
+ * @param onClick the lambda to be invoked when this icon is pressed
+ */
 @Composable
-internal fun FakeIcon(size: Dp) {
-    ColoredRect(color = Color(0xFFFFFFFF.toInt()), width = size, height = 24.dp)
+fun AppBarIcon(icon: Image, onClick: () -> Unit) {
+    Ripple(bounded = false) {
+        Clickable(onClick = onClick) {
+            Center {
+                Container(width = ActionIconDiameter, height = ActionIconDiameter) {
+                    SimpleImage(icon)
+                }
+            }
+        }
+    }
 }
 
-private val RegularHeight = 56.dp
-private val Padding = 16.dp
-// TODO: IR compiler bug avoids this being const
-private val MaxIconsInTopAppBar = 2
\ No newline at end of file
+private val ActionIconDiameter = 24.dp
+
+private val AppBarHeight = 56.dp
+private val BottomAppBarHeightWithFab = 84.dp
+private val AppBarPadding = 16.dp
+
+private const val MaxIconsInTopAppBar = 2
+private const val MaxIconsInBottomAppBarCenterFab = 2
+private const val MaxIconsInBottomAppBarEndFab = 4
+private const val MaxIconsInBottomAppBarNoFab = 4
\ No newline at end of file
diff --git a/ui/ui-platform/OWNERS b/ui/ui-platform/OWNERS
index 55dc119..af392f8 100644
--- a/ui/ui-platform/OWNERS
+++ b/ui/ui-platform/OWNERS
@@ -2,3 +2,9 @@
 mount@google.com
 ryanmentley@google.com
 shepshapard@google.com
+
+# For text input
+haoyuchang@google.com
+nona@google.com
+qqd@google.com
+siyamed@google.com
diff --git a/ui/ui-platform/src/androidTest/java/androidx/ui/core/input/RecordingInputConnectionTest.kt b/ui/ui-platform/src/androidTest/java/androidx/ui/core/input/RecordingInputConnectionTest.kt
index 5256ef9..2e7d431 100644
--- a/ui/ui-platform/src/androidTest/java/androidx/ui/core/input/RecordingInputConnectionTest.kt
+++ b/ui/ui-platform/src/androidTest/java/androidx/ui/core/input/RecordingInputConnectionTest.kt
@@ -506,4 +506,15 @@
         ic.sendKeyEvent(KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_RIGHT))
         verify(listener, never()).onEditOperations(any())
     }
+
+    @Test
+    fun key_event_printablekey_down() {
+        val captor = argumentCaptor<List<EditOperation>>()
+        ic.sendKeyEvent(KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_1))
+        verify(listener, times(1)).onEditOperations(captor.capture())
+
+        val editOps = captor.lastValue
+        assertEquals(1, editOps.size)
+        assertEquals(CommitTextEditOp("1", 1), editOps[0])
+    }
 }
\ No newline at end of file
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/ComponentNodes.kt b/ui/ui-platform/src/main/java/androidx/ui/core/ComponentNodes.kt
index 5dfa08e..1bdfbc3 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/ComponentNodes.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/ComponentNodes.kt
@@ -167,7 +167,9 @@
      * Execute [block] on all children of this ComponentNode.
      */
     fun visitChildren(block: (ComponentNode) -> Unit) {
-        children.forEach(block)
+        for (i in 0 until children.size) {
+            block(children[i])
+        }
     }
 
     /**
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/input/RecordingInputConnection.kt b/ui/ui-platform/src/main/java/androidx/ui/core/input/RecordingInputConnection.kt
index 793b682..72a00d4 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/input/RecordingInputConnection.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/input/RecordingInputConnection.kt
@@ -24,6 +24,7 @@
 import android.view.View
 import android.view.inputmethod.CompletionInfo
 import android.view.inputmethod.CorrectionInfo
+import android.view.inputmethod.EditorInfo
 import android.view.inputmethod.ExtractedText
 import android.view.inputmethod.ExtractedTextRequest
 import android.view.inputmethod.InputConnection
@@ -36,6 +37,7 @@
 import androidx.ui.input.DeleteSurroundingTextInCodePointsEditOp
 import androidx.ui.input.EditOperation
 import androidx.ui.input.FinishComposingTextEditOp
+import androidx.ui.input.ImeAction
 import androidx.ui.input.InputEventListener
 import androidx.ui.input.MoveCursorEditOp
 import androidx.ui.input.SetComposingRegionEditOp
@@ -205,10 +207,10 @@
             KeyEvent.KEYCODE_DEL -> BackspaceKeyEditOp()
             KeyEvent.KEYCODE_DPAD_LEFT -> MoveCursorEditOp(-1)
             KeyEvent.KEYCODE_DPAD_RIGHT -> MoveCursorEditOp(1)
-            else -> null
+            else -> CommitTextEditOp(String(Character.toChars(event.getUnicodeChar())), 1)
         }
 
-        op?.let { addEditOpWithBatch(it) }
+        addEditOpWithBatch(op)
         return true
     }
 
@@ -256,7 +258,21 @@
 
     override fun performEditorAction(editorAction: Int): Boolean {
         if (DEBUG) { Log.d(TAG, "performEditorAction($editorAction)") }
-        TODO("not implemented")
+        val imeAction = when (editorAction) {
+            EditorInfo.IME_ACTION_UNSPECIFIED -> ImeAction.Unspecified
+            EditorInfo.IME_ACTION_DONE -> ImeAction.Done
+            EditorInfo.IME_ACTION_SEND -> ImeAction.Send
+            EditorInfo.IME_ACTION_SEARCH -> ImeAction.Search
+            EditorInfo.IME_ACTION_PREVIOUS -> ImeAction.Previous
+            EditorInfo.IME_ACTION_NEXT -> ImeAction.Next
+            EditorInfo.IME_ACTION_GO -> ImeAction.Go
+            else -> {
+                Log.w(TAG, "IME sends unsupported Editor Action: $editorAction")
+                ImeAction.Unspecified
+            }
+        }
+        eventListener.onImeAction(imeAction)
+        return true
     }
 
     // /////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/input/TextInputServiceAndroid.kt b/ui/ui-platform/src/main/java/androidx/ui/core/input/TextInputServiceAndroid.kt
index c9ff9be..77a835f 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/input/TextInputServiceAndroid.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/input/TextInputServiceAndroid.kt
@@ -25,6 +25,7 @@
 import androidx.ui.engine.geometry.Rect
 import androidx.ui.input.EditOperation
 import androidx.ui.input.EditorState
+import androidx.ui.input.ImeAction
 import androidx.ui.input.InputEventListener
 import androidx.ui.input.KeyboardType
 import androidx.ui.input.TextInputService
@@ -43,10 +44,11 @@
      *  session
      */
     private var onEditCommand: (List<EditOperation>) -> Unit = {}
-    private var onEditorActionPerformed: (Any) -> Unit = {}
+    private var onImeActionPerformed: (ImeAction) -> Unit = {}
 
     private var state = InputState(text = "", selection = TextRange(0, 0))
     private var keyboardType = KeyboardType.Text
+    private var imeAction = ImeAction.Unspecified
     private var ic: RecordingInputConnection? = null
 
     /**
@@ -62,7 +64,7 @@
         if (!editorHasFocus) {
             return null
         }
-        fillEditorInfo(keyboardType, outAttrs)
+        fillEditorInfo(keyboardType, imeAction, outAttrs)
 
         return RecordingInputConnection(
             initState = state,
@@ -70,6 +72,10 @@
                 override fun onEditOperations(editOps: List<EditOperation>) {
                     onEditCommand(editOps)
                 }
+
+                override fun onImeAction(imeAction: ImeAction) {
+                    onImeActionPerformed(imeAction)
+                }
             }
         ).also { ic = it }
     }
@@ -82,14 +88,16 @@
     override fun startInput(
         initState: EditorState,
         keyboardType: KeyboardType,
+        imeAction: ImeAction,
         onEditCommand: (List<EditOperation>) -> Unit,
-        onEditorActionPerformed: (Any) -> Unit
+        onImeActionPerformed: (ImeAction) -> Unit
     ) {
         editorHasFocus = true
         state = initState.toInputState()
         this.keyboardType = keyboardType
+        this.imeAction = imeAction
         this.onEditCommand = onEditCommand
-        this.onEditorActionPerformed = onEditorActionPerformed
+        this.onImeActionPerformed = onImeActionPerformed
 
         view.requestFocus()
         view.post {
@@ -101,7 +109,7 @@
     override fun stopInput() {
         editorHasFocus = false
         onEditCommand = {}
-        onEditorActionPerformed = {}
+        onImeActionPerformed = {}
 
         imm.restartInput(view)
     }
@@ -126,12 +134,27 @@
     /**
      * Fills necessary info of EditorInfo.
      */
-    private fun fillEditorInfo(keyboardType: KeyboardType, outInfo: EditorInfo) {
+    private fun fillEditorInfo(
+        keyboardType: KeyboardType,
+        imeAction: ImeAction,
+        outInfo: EditorInfo
+    ) {
+        outInfo.imeOptions = when (imeAction) {
+            ImeAction.Unspecified -> EditorInfo.IME_ACTION_UNSPECIFIED
+            ImeAction.NoAction -> EditorInfo.IME_ACTION_NONE
+            ImeAction.Go -> EditorInfo.IME_ACTION_GO
+            ImeAction.Next -> EditorInfo.IME_ACTION_NEXT
+            ImeAction.Previous -> EditorInfo.IME_ACTION_PREVIOUS
+            ImeAction.Search -> EditorInfo.IME_ACTION_SEARCH
+            ImeAction.Send -> EditorInfo.IME_ACTION_SEND
+            ImeAction.Done -> EditorInfo.IME_ACTION_DONE
+            else -> throw IllegalArgumentException("Unknown ImeAction: $imeAction")
+        }
         when (keyboardType) {
             KeyboardType.Text -> outInfo.inputType = InputType.TYPE_CLASS_TEXT
             KeyboardType.Ascii -> {
                 outInfo.inputType = InputType.TYPE_CLASS_TEXT
-                outInfo.imeOptions = EditorInfo.IME_FLAG_FORCE_ASCII
+                outInfo.imeOptions = outInfo.imeOptions or EditorInfo.IME_FLAG_FORCE_ASCII
             }
             KeyboardType.Number -> outInfo.inputType = InputType.TYPE_CLASS_NUMBER
             KeyboardType.Phone -> outInfo.inputType = InputType.TYPE_CLASS_PHONE
@@ -142,7 +165,8 @@
                     InputType.TYPE_CLASS_TEXT or EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
             else -> throw IllegalArgumentException("Unknown KeyboardType: $keyboardType")
         }
-        outInfo.imeOptions = outInfo.imeOptions or EditorInfo.IME_FLAG_NO_FULLSCREEN
+        outInfo.imeOptions =
+            outInfo.imeOptions or outInfo.imeOptions or EditorInfo.IME_FLAG_NO_FULLSCREEN
     }
 }
 
diff --git a/ui/ui-platform/src/test/java/androidx/ui/core/input/TextInputServiceAndroidTest.kt b/ui/ui-platform/src/test/java/androidx/ui/core/input/TextInputServiceAndroidTest.kt
index 3609daa9..81f82ab 100644
--- a/ui/ui-platform/src/test/java/androidx/ui/core/input/TextInputServiceAndroidTest.kt
+++ b/ui/ui-platform/src/test/java/androidx/ui/core/input/TextInputServiceAndroidTest.kt
@@ -23,6 +23,7 @@
 import android.view.inputmethod.InputMethodManager
 import androidx.test.filters.SmallTest
 import androidx.ui.input.EditorState
+import androidx.ui.input.ImeAction
 import androidx.ui.input.KeyboardType
 import com.nhaarman.mockitokotlin2.eq
 import com.nhaarman.mockitokotlin2.mock
@@ -55,12 +56,15 @@
         textInputService.startInput(
             EditorState(""),
             KeyboardType.Text,
+            ImeAction.Unspecified,
             onEditCommand = {},
-            onEditorActionPerformed = {})
+            onImeActionPerformed = {})
 
         EditorInfo().let { info ->
             textInputService.createInputConnection(info)
             assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
+            assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+                    == EditorInfo.IME_ACTION_UNSPECIFIED)
         }
     }
 
@@ -69,13 +73,16 @@
         textInputService.startInput(
             EditorState(""),
             KeyboardType.Ascii,
+            ImeAction.Unspecified,
             onEditCommand = {},
-            onEditorActionPerformed = {})
+            onImeActionPerformed = {})
 
         EditorInfo().let { info ->
             textInputService.createInputConnection(info)
             assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
             assertTrue((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0)
+            assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+                    == EditorInfo.IME_ACTION_UNSPECIFIED)
         }
     }
 
@@ -84,12 +91,15 @@
         textInputService.startInput(
             EditorState(""),
             KeyboardType.Number,
+            ImeAction.Unspecified,
             onEditCommand = {},
-            onEditorActionPerformed = {})
+            onImeActionPerformed = {})
 
         EditorInfo().let { info ->
             textInputService.createInputConnection(info)
             assertTrue((InputType.TYPE_CLASS_NUMBER and info.inputType) != 0)
+            assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+                    == EditorInfo.IME_ACTION_UNSPECIFIED)
         }
     }
 
@@ -98,12 +108,15 @@
         textInputService.startInput(
             EditorState(""),
             KeyboardType.Phone,
+            ImeAction.Unspecified,
             onEditCommand = {},
-            onEditorActionPerformed = {})
+            onImeActionPerformed = {})
 
         EditorInfo().let { info ->
             textInputService.createInputConnection(info)
             assertTrue((InputType.TYPE_CLASS_PHONE and info.inputType) != 0)
+            assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+                    == EditorInfo.IME_ACTION_UNSPECIFIED)
         }
     }
 
@@ -112,13 +125,16 @@
         textInputService.startInput(
             EditorState(""),
             KeyboardType.Uri,
+            ImeAction.Unspecified,
             onEditCommand = {},
-            onEditorActionPerformed = {})
+            onImeActionPerformed = {})
 
         EditorInfo().let { info ->
             textInputService.createInputConnection(info)
             assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
             assertTrue((InputType.TYPE_TEXT_VARIATION_URI and info.inputType) != 0)
+            assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+                    == EditorInfo.IME_ACTION_UNSPECIFIED)
         }
     }
 
@@ -127,13 +143,142 @@
         textInputService.startInput(
             EditorState(""),
             KeyboardType.Email,
+            ImeAction.Unspecified,
             onEditCommand = {},
-            onEditorActionPerformed = {})
+            onImeActionPerformed = {})
 
         EditorInfo().let { info ->
             textInputService.createInputConnection(info)
             assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
             assertTrue((InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS and info.inputType) != 0)
+            assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+                    == EditorInfo.IME_ACTION_UNSPECIFIED)
+        }
+    }
+
+    @Test
+    fun test_fill_editor_info_action_none() {
+        textInputService.startInput(
+            EditorState(""),
+            KeyboardType.Ascii,
+            ImeAction.NoAction,
+            onEditCommand = {},
+            onImeActionPerformed = {})
+
+        EditorInfo().let { info ->
+            textInputService.createInputConnection(info)
+            assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
+            assertTrue((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0)
+            assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+                    == EditorInfo.IME_ACTION_NONE)
+        }
+    }
+
+    @Test
+    fun test_fill_editor_info_action_go() {
+        textInputService.startInput(
+            EditorState(""),
+            KeyboardType.Ascii,
+            ImeAction.Go,
+            onEditCommand = {},
+            onImeActionPerformed = {})
+
+        EditorInfo().let { info ->
+            textInputService.createInputConnection(info)
+            assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
+            assertTrue((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0)
+            assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+                    == EditorInfo.IME_ACTION_GO)
+        }
+    }
+
+    @Test
+    fun test_fill_editor_info_action_next() {
+        textInputService.startInput(
+            EditorState(""),
+            KeyboardType.Ascii,
+            ImeAction.Next,
+            onEditCommand = {},
+            onImeActionPerformed = {})
+
+        EditorInfo().let { info ->
+            textInputService.createInputConnection(info)
+            assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
+            assertTrue((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0)
+            assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+                    == EditorInfo.IME_ACTION_NEXT)
+        }
+    }
+
+    @Test
+    fun test_fill_editor_info_action_previous() {
+        textInputService.startInput(
+            EditorState(""),
+            KeyboardType.Ascii,
+            ImeAction.Previous,
+            onEditCommand = {},
+            onImeActionPerformed = {})
+
+        EditorInfo().let { info ->
+            textInputService.createInputConnection(info)
+            assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
+            assertTrue((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0)
+            assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+                    == EditorInfo.IME_ACTION_PREVIOUS)
+        }
+    }
+
+    @Test
+    fun test_fill_editor_info_action_search() {
+        textInputService.startInput(
+            EditorState(""),
+            KeyboardType.Ascii,
+            ImeAction.Search,
+            onEditCommand = {},
+            onImeActionPerformed = {})
+
+        EditorInfo().let { info ->
+            textInputService.createInputConnection(info)
+            assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
+            assertTrue((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0)
+            assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+                    == EditorInfo.IME_ACTION_SEARCH)
+        }
+    }
+
+    @Test
+    fun test_fill_editor_info_action_send() {
+        textInputService.startInput(
+            EditorState(""),
+            KeyboardType.Ascii,
+            ImeAction.Send,
+            onEditCommand = {},
+            onImeActionPerformed = {})
+
+        EditorInfo().let { info ->
+            textInputService.createInputConnection(info)
+            assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
+            assertTrue((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0)
+            assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+                    == EditorInfo.IME_ACTION_SEND)
+        }
+    }
+
+    @Test
+    fun test_fill_editor_info_action_done() {
+        textInputService.startInput(
+            EditorState(""),
+            KeyboardType.Ascii,
+            ImeAction.Done,
+            onEditCommand = {},
+            onImeActionPerformed = {})
+
+        EditorInfo().let { info ->
+            textInputService.createInputConnection(info)
+            assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
+            assertTrue((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0)
+            assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+                    == EditorInfo.IME_ACTION_DONE)
         }
     }
 }
\ No newline at end of file
diff --git a/ui/ui-text/api/1.0.0-alpha01.txt b/ui/ui-text/api/1.0.0-alpha01.txt
index af495da..0aa0326 100644
--- a/ui/ui-text/api/1.0.0-alpha01.txt
+++ b/ui/ui-text/api/1.0.0-alpha01.txt
@@ -11,6 +11,17 @@
     property public final String text;
   }
 
+  public enum ImeAction {
+    enum_constant public static final androidx.ui.input.ImeAction Done;
+    enum_constant public static final androidx.ui.input.ImeAction Go;
+    enum_constant public static final androidx.ui.input.ImeAction Next;
+    enum_constant public static final androidx.ui.input.ImeAction NoAction;
+    enum_constant public static final androidx.ui.input.ImeAction Previous;
+    enum_constant public static final androidx.ui.input.ImeAction Search;
+    enum_constant public static final androidx.ui.input.ImeAction Send;
+    enum_constant public static final androidx.ui.input.ImeAction Unspecified;
+  }
+
   public enum KeyboardType {
     enum_constant public static final androidx.ui.input.KeyboardType Ascii;
     enum_constant public static final androidx.ui.input.KeyboardType Email;
diff --git a/ui/ui-text/api/current.txt b/ui/ui-text/api/current.txt
index af495da..0aa0326 100644
--- a/ui/ui-text/api/current.txt
+++ b/ui/ui-text/api/current.txt
@@ -11,6 +11,17 @@
     property public final String text;
   }
 
+  public enum ImeAction {
+    enum_constant public static final androidx.ui.input.ImeAction Done;
+    enum_constant public static final androidx.ui.input.ImeAction Go;
+    enum_constant public static final androidx.ui.input.ImeAction Next;
+    enum_constant public static final androidx.ui.input.ImeAction NoAction;
+    enum_constant public static final androidx.ui.input.ImeAction Previous;
+    enum_constant public static final androidx.ui.input.ImeAction Search;
+    enum_constant public static final androidx.ui.input.ImeAction Send;
+    enum_constant public static final androidx.ui.input.ImeAction Unspecified;
+  }
+
   public enum KeyboardType {
     enum_constant public static final androidx.ui.input.KeyboardType Ascii;
     enum_constant public static final androidx.ui.input.KeyboardType Email;
diff --git a/ui/ui-text/api/restricted_1.0.0-alpha01.txt b/ui/ui-text/api/restricted_1.0.0-alpha01.txt
index 94e8ba8..e2f3b68 100644
--- a/ui/ui-text/api/restricted_1.0.0-alpha01.txt
+++ b/ui/ui-text/api/restricted_1.0.0-alpha01.txt
@@ -19,6 +19,17 @@
   }
 
 
+  public enum ImeAction {
+    enum_constant public static final androidx.ui.input.ImeAction Done;
+    enum_constant public static final androidx.ui.input.ImeAction Go;
+    enum_constant public static final androidx.ui.input.ImeAction Next;
+    enum_constant public static final androidx.ui.input.ImeAction NoAction;
+    enum_constant public static final androidx.ui.input.ImeAction Previous;
+    enum_constant public static final androidx.ui.input.ImeAction Search;
+    enum_constant public static final androidx.ui.input.ImeAction Send;
+    enum_constant public static final androidx.ui.input.ImeAction Unspecified;
+  }
+
 
   public enum KeyboardType {
     enum_constant public static final androidx.ui.input.KeyboardType Ascii;
diff --git a/ui/ui-text/api/restricted_current.txt b/ui/ui-text/api/restricted_current.txt
index 94e8ba8..e2f3b68 100644
--- a/ui/ui-text/api/restricted_current.txt
+++ b/ui/ui-text/api/restricted_current.txt
@@ -19,6 +19,17 @@
   }
 
 
+  public enum ImeAction {
+    enum_constant public static final androidx.ui.input.ImeAction Done;
+    enum_constant public static final androidx.ui.input.ImeAction Go;
+    enum_constant public static final androidx.ui.input.ImeAction Next;
+    enum_constant public static final androidx.ui.input.ImeAction NoAction;
+    enum_constant public static final androidx.ui.input.ImeAction Previous;
+    enum_constant public static final androidx.ui.input.ImeAction Search;
+    enum_constant public static final androidx.ui.input.ImeAction Send;
+    enum_constant public static final androidx.ui.input.ImeAction Unspecified;
+  }
+
 
   public enum KeyboardType {
     enum_constant public static final androidx.ui.input.KeyboardType Ascii;
diff --git a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneInputField.kt b/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneInputField.kt
index a7e2235..539c5d8 100644
--- a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneInputField.kt
+++ b/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneInputField.kt
@@ -25,6 +25,7 @@
 import androidx.ui.core.InputField
 import androidx.ui.text.TextRange
 import androidx.ui.input.EditorState
+import androidx.ui.input.ImeAction
 import androidx.ui.input.KeyboardType
 import androidx.ui.layout.Column
 import androidx.ui.layout.CrossAxisAlignment
@@ -39,19 +40,35 @@
     Pair(KeyboardType.Phone, "Phone")
 )
 
+val IME_ACTIONS = listOf(
+    Pair(ImeAction.Unspecified, "Unspecified"),
+    Pair(ImeAction.NoAction, "NoAction"),
+    Pair(ImeAction.Go, "Go"),
+    Pair(ImeAction.Search, "Search"),
+    Pair(ImeAction.Send, "Send"),
+    Pair(ImeAction.Next, "Next"),
+    Pair(ImeAction.Done, "Done"),
+    Pair(ImeAction.Previous, "Previous")
+)
+
 @Composable
 fun InputFieldDemo() {
     CraneWrapper {
         VerticalScroller {
             Column(crossAxisAlignment = CrossAxisAlignment.Start) {
                 TagLine(tag = "simple editing")
-                EditLine("Simple Input Field")
+                EditLine()
                 TagLine(tag = "simple editing2")
-                EditLine("Another Simple Input Field")
+                EditLine()
 
                 for ((type, name) in KEYBOARD_TYPES) {
                     TagLine(tag = "Keyboard Type: $name")
-                    EditLine(initText = "Keyboard Type: $name", keyboardType = type)
+                    EditLine(keyboardType = type)
+                }
+
+                for ((action, name) in IME_ACTIONS) {
+                    TagLine(tag = "Ime Action: $name")
+                    EditLine(imeAction = action)
                 }
             }
         }
@@ -59,11 +76,15 @@
 }
 
 @Composable
-fun EditLine(initText: String, keyboardType: KeyboardType = KeyboardType.Text) {
-    val state = +state { EditorState(text = initText, selection = TextRange(2, 2)) }
+fun EditLine(
+    keyboardType: KeyboardType = KeyboardType.Text,
+    imeAction: ImeAction = ImeAction.Unspecified
+) {
+    val state = +state { EditorState() }
     InputField(
         value = state.value,
         keyboardType = keyboardType,
+        imeAction = imeAction,
         onValueChange = { state.value = it },
         editorStyle = EditorStyle(textStyle = TextStyle(fontSize = fontSize8))
     )
diff --git a/ui/ui-text/src/main/java/androidx/ui/input/ImeAction.kt b/ui/ui-text/src/main/java/androidx/ui/input/ImeAction.kt
new file mode 100644
index 0000000..67f2ee9
--- /dev/null
+++ b/ui/ui-text/src/main/java/androidx/ui/input/ImeAction.kt
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.input
+
+/**
+ * Enums used for indicating IME action.
+ *
+ * @see https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_MASK_ACTION
+ */
+enum class ImeAction {
+    /**
+     * An IME action used to represent that any IME action is associated.
+     *
+     * @see https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_ACTION_UNSPECIFIED
+     */
+    Unspecified,
+
+    /**
+     * An IME action used to represent that no IME action is available in editor.
+     *
+     * @see https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_ACTION_NONE
+     */
+    NoAction,
+
+    /**
+     * An IME action used to represent that the "enter" key works as "go" action.
+     *
+     * @see https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_ACTION_GO
+     */
+    Go,
+
+    /**
+     * An IME action used to represent that the "enter" key works as "search" action.
+     *
+     * @see https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_ACTION_SEARCH
+     */
+    Search,
+
+    /**
+     * An IME action used to represent that the "enter" key works as "send" action.
+     *
+     * @see https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_ACTION_SEND
+     */
+    Send,
+
+    /**
+     * An IME action used to represent that the "enter" key works as "previous" action.
+     *
+     * @see https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_ACTION_PREVIOUS
+     */
+    Previous,
+
+    /**
+     * An IME action used to represent that the "enter" key works as "next" action.
+     *
+     * https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_ACTION_NEXT
+     */
+    Next,
+
+    /**
+     * An IME action used to represent that the "enter" key works as "done" action.
+     *
+     * @see https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_ACTION_DONE
+     */
+    Done
+}
\ No newline at end of file
diff --git a/ui/ui-text/src/main/java/androidx/ui/input/InputEventListener.kt b/ui/ui-text/src/main/java/androidx/ui/input/InputEventListener.kt
index cb6032b..1c8d5db 100644
--- a/ui/ui-text/src/main/java/androidx/ui/input/InputEventListener.kt
+++ b/ui/ui-text/src/main/java/androidx/ui/input/InputEventListener.kt
@@ -32,5 +32,10 @@
      */
     fun onEditOperations(editOps: List<EditOperation>)
 
-    // TODO(nona): add more input event callbacks, editor action etc.
+    /**
+     * Called when IME triggered IME action.
+     *
+     * @param imeAction An IME action.
+     */
+    fun onImeAction(imeAction: ImeAction)
 }
\ No newline at end of file
diff --git a/ui/ui-text/src/main/java/androidx/ui/input/TextInputService.kt b/ui/ui-text/src/main/java/androidx/ui/input/TextInputService.kt
index 8b67df4..382e110 100644
--- a/ui/ui-text/src/main/java/androidx/ui/input/TextInputService.kt
+++ b/ui/ui-text/src/main/java/androidx/ui/input/TextInputService.kt
@@ -31,8 +31,9 @@
     fun startInput(
         initState: EditorState,
         keyboardType: KeyboardType,
+        imeAction: ImeAction,
         onEditCommand: (List<EditOperation>) -> Unit,
-        onEditorActionPerformed: (Any) -> Unit /* TODO(nona): decide type */
+        onImeActionPerformed: (ImeAction) -> Unit
     )
 
     /**
diff --git a/viewpager2/api/1.0.0-beta00.txt b/viewpager2/api/1.0.0-beta01.txt
similarity index 100%
rename from viewpager2/api/1.0.0-beta00.txt
rename to viewpager2/api/1.0.0-beta01.txt
diff --git a/viewpager2/api/1.0.0-beta00.txt b/viewpager2/api/1.0.0-beta02.txt
similarity index 100%
copy from viewpager2/api/1.0.0-beta00.txt
copy to viewpager2/api/1.0.0-beta02.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/viewpager2/api/res-1.0.0-beta01.txt
similarity index 100%
rename from viewpager2/api/res-1.0.0-beta00.txt
rename to viewpager2/api/res-1.0.0-beta01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/viewpager2/api/res-1.0.0-beta02.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to viewpager2/api/res-1.0.0-beta02.txt
diff --git a/viewpager2/api/restricted_1.0.0-beta00.txt b/viewpager2/api/restricted_1.0.0-beta01.txt
similarity index 100%
rename from viewpager2/api/restricted_1.0.0-beta00.txt
rename to viewpager2/api/restricted_1.0.0-beta01.txt
diff --git a/viewpager2/api/restricted_1.0.0-beta00.txt b/viewpager2/api/restricted_1.0.0-beta02.txt
similarity index 100%
copy from viewpager2/api/restricted_1.0.0-beta00.txt
copy to viewpager2/api/restricted_1.0.0-beta02.txt
diff --git a/viewpager2/build.gradle b/viewpager2/build.gradle
index 30c1569..9de6aa7 100644
--- a/viewpager2/build.gradle
+++ b/viewpager2/build.gradle
@@ -32,8 +32,6 @@
     api("androidx.recyclerview:recyclerview:1.1.0-beta01")
     implementation("androidx.collection:collection:1.1.0")
 
-    androidTestImplementation(project(":appcompat"))
-    androidTestImplementation(project(":core:core"))
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
diff --git a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/AccessibilityTest.kt b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/AccessibilityTest.kt
index 7aa57a9..050aab8 100644
--- a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/AccessibilityTest.kt
+++ b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/AccessibilityTest.kt
@@ -19,10 +19,6 @@
 import android.os.Build
 import androidx.core.view.ViewCompat
 import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_DOWN
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_LEFT
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_RIGHT
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_UP
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.testutils.LocaleTestUtils
@@ -142,12 +138,12 @@
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             if (orientation == ViewPager2.ORIENTATION_HORIZONTAL) {
                 if (isRtl) {
-                    return ACTION_PAGE_LEFT.id
+                    return ACTION_ID_PAGE_LEFT
                 } else {
-                    return ACTION_PAGE_RIGHT.id
+                    return ACTION_ID_PAGE_RIGHT
                 }
             }
-            return ACTION_PAGE_DOWN.id
+            return ACTION_ID_PAGE_DOWN
         }
         return AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD
     }
@@ -156,12 +152,12 @@
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             if (orientation == ViewPager2.ORIENTATION_HORIZONTAL) {
                 if (isRtl) {
-                    return ACTION_PAGE_RIGHT.id
+                    return ACTION_ID_PAGE_RIGHT
                 } else {
-                    return ACTION_PAGE_LEFT.id
+                    return ACTION_ID_PAGE_LEFT
                 }
             }
-            return ACTION_PAGE_UP.id
+            return ACTION_ID_PAGE_UP
         }
         return AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD
     }
diff --git a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt
index 3f02ba8..679943f 100644
--- a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt
+++ b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt
@@ -27,10 +27,6 @@
 import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
 import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD
 import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_DOWN
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_LEFT
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_RIGHT
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_UP
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import androidx.test.core.app.ApplicationProvider
@@ -81,6 +77,10 @@
 open class BaseTest {
     companion object {
         const val TAG = "VP2_TESTS"
+        const val ACTION_ID_PAGE_LEFT = android.R.id.accessibilityActionPageLeft
+        const val ACTION_ID_PAGE_RIGHT = android.R.id.accessibilityActionPageRight
+        const val ACTION_ID_PAGE_UP = android.R.id.accessibilityActionPageUp
+        const val ACTION_ID_PAGE_DOWN = android.R.id.accessibilityActionPageDown
     }
 
     lateinit var localeUtil: LocaleTestUtils
@@ -284,20 +284,20 @@
                         currentPage < numPages - 1
 
             assertThat("Left action expected: $expectPageLeftAction",
-                hasPageAction(customActions, ACTION_PAGE_LEFT.id),
+                hasPageAction(customActions, ACTION_ID_PAGE_LEFT),
                 equalTo(expectPageLeftAction)
             )
 
             assertThat("Right action expected: $expectPageRightAction",
-                hasPageAction(customActions, ACTION_PAGE_RIGHT.id),
+                hasPageAction(customActions, ACTION_ID_PAGE_RIGHT),
                 equalTo(expectPageRightAction)
             )
             assertThat("Up action expected: $expectPageUpAction",
-                hasPageAction(customActions, ACTION_PAGE_UP.id),
+                hasPageAction(customActions, ACTION_ID_PAGE_UP),
                 equalTo(expectPageUpAction)
             )
             assertThat("Down action expected: $expectPageDownAction",
-                hasPageAction(customActions, ACTION_PAGE_DOWN.id),
+                hasPageAction(customActions, ACTION_ID_PAGE_DOWN),
                 equalTo(expectPageDownAction)
             )
 
diff --git a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/FakeDragTest.kt b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/FakeDragTest.kt
index 314cad3..7d6e3a3 100644
--- a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/FakeDragTest.kt
+++ b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/FakeDragTest.kt
@@ -24,9 +24,6 @@
 import android.view.animation.LinearInterpolator
 import androidx.core.view.ViewCompat
 import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_DOWN
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_LEFT
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_RIGHT
 import androidx.core.view.animation.PathInterpolatorCompat
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
@@ -336,11 +333,11 @@
         val isHorizontal = test.viewPager.isHorizontal
 
         return if (useEnhancedA11y && isHorizontal && test.viewPager.isRtl) {
-            ACTION_PAGE_LEFT.id
+            ACTION_ID_PAGE_LEFT
         } else if (useEnhancedA11y && isHorizontal) {
-            ACTION_PAGE_RIGHT.id
+            ACTION_ID_PAGE_RIGHT
         } else if (useEnhancedA11y) {
-            ACTION_PAGE_DOWN.id
+            ACTION_ID_PAGE_DOWN
         } else {
             ACTION_SCROLL_FORWARD
         }
diff --git a/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java b/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
index 9130ae1..5f431bd 100644
--- a/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
+++ b/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
@@ -143,6 +143,7 @@
     private RecyclerView mRecyclerView;
     private PagerSnapHelper mPagerSnapHelper;
     private ScrollEventAdapter mScrollEventAdapter;
+    private CompositeOnPageChangeCallback mPageChangeEventDispatcher;
     private FakeDrag mFakeDragger;
     private PageTransformerAdapter mPageTransformerAdapter;
     private boolean mUserInputEnabled = true;
@@ -199,9 +200,8 @@
         // don't want to respond on the events sent out during the attach process
         mRecyclerView.addOnScrollListener(mScrollEventAdapter);
 
-        CompositeOnPageChangeCallback pageChangeEventDispatcher =
-                new CompositeOnPageChangeCallback(3);
-        mScrollEventAdapter.setOnPageChangeCallback(pageChangeEventDispatcher);
+        mPageChangeEventDispatcher = new CompositeOnPageChangeCallback(3);
+        mScrollEventAdapter.setOnPageChangeCallback(mPageChangeEventDispatcher);
 
         // Callback that updates mCurrentItem after swipes. Also triggered in other cases, but in
         // all those cases mCurrentItem will only be overwritten with the same value.
@@ -213,20 +213,27 @@
                     mAccessibilityProvider.onSetNewCurrentItem();
                 }
             }
+
+            @Override
+            public void onPageScrollStateChanged(int newState) {
+                if (newState == SCROLL_STATE_IDLE) {
+                    updateCurrentItem();
+                }
+            }
         };
 
         // Add currentItemUpdater before mExternalPageChangeCallbacks, because we need to update
         // internal state first
-        pageChangeEventDispatcher.addOnPageChangeCallback(currentItemUpdater);
+        mPageChangeEventDispatcher.addOnPageChangeCallback(currentItemUpdater);
         // Allow a11y to register its listeners just after currentItemUpdater (so it has the
         // right data). TODO: replace ordering comments with a test.
-        mAccessibilityProvider.onInitialize(pageChangeEventDispatcher, mRecyclerView);
-        pageChangeEventDispatcher.addOnPageChangeCallback(mExternalPageChangeCallbacks);
+        mAccessibilityProvider.onInitialize(mPageChangeEventDispatcher, mRecyclerView);
+        mPageChangeEventDispatcher.addOnPageChangeCallback(mExternalPageChangeCallbacks);
 
         // Add mPageTransformerAdapter after mExternalPageChangeCallbacks, because page transform
         // events must be fired after scroll events
         mPageTransformerAdapter = new PageTransformerAdapter(mLayoutManager);
-        pageChangeEventDispatcher.addOnPageChangeCallback(mPageTransformerAdapter);
+        mPageChangeEventDispatcher.addOnPageChangeCallback(mPageTransformerAdapter);
 
         attachViewToParent(mRecyclerView, 0, mRecyclerView.getLayoutParams());
     }
@@ -525,20 +532,17 @@
             throw new IllegalStateException("Design assumption violated.");
         }
 
-        int snapPosition = mPagerSnapHelper.findTargetSnapPosition(mLayoutManager, 0, 0);
+        View snapView = mPagerSnapHelper.findSnapView(mLayoutManager);
+        if (snapView == null) {
+            return; // nothing we can do
+        }
+        int snapPosition = mLayoutManager.getPosition(snapView);
 
-        // Extra checks verifying assumptions
-        // TODO: remove after testing
-        View snapView1 = mPagerSnapHelper.findSnapView(mLayoutManager);
-        View snapView2 = mLayoutManager.findViewByPosition(snapPosition);
-        if (snapView1 != snapView2) {
-            throw new IllegalStateException("Design assumption violated.");
+        if (snapPosition != mCurrentItem && getScrollState() == SCROLL_STATE_IDLE) {
+            /** TODO: revisit if push to {@link ScrollEventAdapter} / separate component */
+            mPageChangeEventDispatcher.onPageSelected(snapPosition);
         }
 
-        if (snapPosition != mCurrentItem) {
-            // TODO: handle fakeDrag
-            setCurrentItem(snapPosition, false);
-        }
         mCurrentItemDirty = false;
     }
 
diff --git a/webkit/api/1.1.0-alpha02.txt b/webkit/api/1.1.0-alpha02.txt
index 9190ab6..6ef8368 100644
--- a/webkit/api/1.1.0-alpha02.txt
+++ b/webkit/api/1.1.0-alpha02.txt
@@ -134,10 +134,10 @@
 
   public static final class WebViewAssetLoader.Builder {
     ctor public WebViewAssetLoader.Builder();
-    method public androidx.webkit.WebViewAssetLoader.Builder allowHttp(boolean);
+    method public androidx.webkit.WebViewAssetLoader.Builder addPathHandler(String, androidx.webkit.WebViewAssetLoader.PathHandler);
     method public androidx.webkit.WebViewAssetLoader build();
-    method public androidx.webkit.WebViewAssetLoader.Builder onDomain(String);
-    method public androidx.webkit.WebViewAssetLoader.Builder register(String, androidx.webkit.WebViewAssetLoader.PathHandler);
+    method public androidx.webkit.WebViewAssetLoader.Builder setDomain(String);
+    method public androidx.webkit.WebViewAssetLoader.Builder setHttpAllowed(boolean);
   }
 
   public static interface WebViewAssetLoader.PathHandler {
diff --git a/webkit/api/current.txt b/webkit/api/current.txt
index 9190ab6..6ef8368 100644
--- a/webkit/api/current.txt
+++ b/webkit/api/current.txt
@@ -134,10 +134,10 @@
 
   public static final class WebViewAssetLoader.Builder {
     ctor public WebViewAssetLoader.Builder();
-    method public androidx.webkit.WebViewAssetLoader.Builder allowHttp(boolean);
+    method public androidx.webkit.WebViewAssetLoader.Builder addPathHandler(String, androidx.webkit.WebViewAssetLoader.PathHandler);
     method public androidx.webkit.WebViewAssetLoader build();
-    method public androidx.webkit.WebViewAssetLoader.Builder onDomain(String);
-    method public androidx.webkit.WebViewAssetLoader.Builder register(String, androidx.webkit.WebViewAssetLoader.PathHandler);
+    method public androidx.webkit.WebViewAssetLoader.Builder setDomain(String);
+    method public androidx.webkit.WebViewAssetLoader.Builder setHttpAllowed(boolean);
   }
 
   public static interface WebViewAssetLoader.PathHandler {
diff --git a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AssetLoaderAjaxActivity.java b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AssetLoaderAjaxActivity.java
index 461cae7..7a18003 100644
--- a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AssetLoaderAjaxActivity.java
+++ b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AssetLoaderAjaxActivity.java
@@ -72,11 +72,11 @@
         // The developer should ALWAYS use a domain which they are in control of or use
         // the default androidplatform.net reserved by Google for this purpose.
         mAssetLoader = new WebViewAssetLoader.Builder()
-                .onDomain("example.com") // use "example.com" instead of the default domain
+                .setDomain("example.com") // use "example.com" instead of the default domain
                 // Host app resources ... under https://example.com/androidx_webkit/example/res/...
-                .register("/androidx_webkit/example/res/", new ResourcesPathHandler(this))
+                .addPathHandler("/androidx_webkit/example/res/", new ResourcesPathHandler(this))
                 // Host app assets under https://example.com/androidx_webkit/example/assets/...
-                .register("/androidx_webkit/example/assets/", new AssetsPathHandler(this))
+                .addPathHandler("/androidx_webkit/example/assets/", new AssetsPathHandler(this))
                 .build();
 
         mWebView = findViewById(R.id.webview_asset_loader_webview);
diff --git a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AssetLoaderSimpleActivity.java b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AssetLoaderSimpleActivity.java
index 9c0d16b..b36b986 100644
--- a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AssetLoaderSimpleActivity.java
+++ b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AssetLoaderSimpleActivity.java
@@ -70,7 +70,7 @@
 
         // Host application assets under http://appassets.androidplatform.net/assets/...
         mAssetLoader = new WebViewAssetLoader.Builder()
-                .register("/assets/", new WebViewAssetLoader.AssetsPathHandler(this))
+                .addPathHandler("/assets/", new WebViewAssetLoader.AssetsPathHandler(this))
                 .build();
         Uri path = new Uri.Builder()
                 .scheme("https")
diff --git a/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderIntegrationTest.java b/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderIntegrationTest.java
index 742ffc8..70a2b11 100644
--- a/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderIntegrationTest.java
+++ b/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderIntegrationTest.java
@@ -84,7 +84,7 @@
         final WebViewTestActivity activity = mActivityRule.getActivity();
 
         WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
-                .register("/assets/", new AssetsPathHandler(activity))
+                .addPathHandler("/assets/", new AssetsPathHandler(activity))
                 .build();
 
         mOnUiThread.setWebViewClient(new AssetLoadingWebViewClient(mOnUiThread, assetLoader));
@@ -108,7 +108,7 @@
         final WebViewTestActivity activity = mActivityRule.getActivity();
 
         WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
-                .register("/res/", new ResourcesPathHandler(activity))
+                .addPathHandler("/res/", new ResourcesPathHandler(activity))
                 .build();
 
         mOnUiThread.setWebViewClient(new AssetLoadingWebViewClient(mOnUiThread, assetLoader));
diff --git a/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderTest.java b/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderTest.java
index c16b058..029425a 100644
--- a/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderTest.java
+++ b/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderTest.java
@@ -97,7 +97,7 @@
     public void testCustomPathHandler() throws Throwable {
         PathHandler pathHandler = new TestPathHandler();
         WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
-                                                .register("/test/", pathHandler)
+                                                .addPathHandler("/test/", pathHandler)
                                                 .build();
 
         WebResourceResponse response = assetLoader.shouldInterceptRequest(
@@ -113,15 +113,15 @@
     public void testCustomDomain() throws Throwable {
         PathHandler pathHandler = new TestPathHandler();
         WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
-                                                .onDomain("test.myDomain.net")
-                                                .register("/test/", pathHandler)
+                                                .setDomain("test.myDomain.net")
+                                                .addPathHandler("/test/", pathHandler)
                                                 .build();
 
         WebResourceResponse response = assetLoader.shouldInterceptRequest(
                 Uri.parse("https://test.myDomain.net/test/"));
         assertResponse(response, CONTENTS);
 
-        Assert.assertNull("non-registered URL should return null response",
+        Assert.assertNull("non-addPathHandlered URL should return null response",
                 assetLoader.shouldInterceptRequest(
                         Uri.parse("https://appassets.androidplatform.net/test/")));
     }
@@ -131,8 +131,8 @@
     public void testAllowingHttp() throws Throwable {
         PathHandler pathHandler = new TestPathHandler();
         WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
-                                                .allowHttp(true)
-                                                .register("/test/", pathHandler)
+                                                .setHttpAllowed(true)
+                                                .addPathHandler("/test/", pathHandler)
                                                 .build();
 
         WebResourceResponse response = assetLoader.shouldInterceptRequest(
@@ -149,7 +149,7 @@
     public void testDisallowingHttp() throws Throwable {
         PathHandler pathHandler = new TestPathHandler();
         WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
-                                                .register("/test/", pathHandler)
+                                                .addPathHandler("/test/", pathHandler)
                                                 .build();
 
         WebResourceResponse response = assetLoader.shouldInterceptRequest(
@@ -180,7 +180,7 @@
             }
         });
         WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
-                                                      .register("/assets/", assetsPathHandler)
+                                                      .addPathHandler("/assets/", assetsPathHandler)
                                                       .build();
 
         WebResourceResponse response = assetLoader.shouldInterceptRequest(
@@ -207,7 +207,7 @@
             }
         });
         WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
-                                                      .register("/res/", resourcesPathHandler)
+                                                      .addPathHandler("/res/", resourcesPathHandler)
                                                       .build();
 
         WebResourceResponse response = assetLoader.shouldInterceptRequest(
@@ -221,7 +221,7 @@
         WebViewAssetLoader.Builder builder = new WebViewAssetLoader.Builder();
         for (int i = 1; i <= 5; ++i) {
             final String testContent = CONTENTS + Integer.toString(i);
-            builder.register("/test_path_" + Integer.toString(i) + "/", new PathHandler() {
+            builder.addPathHandler("/test_path_" + Integer.toString(i) + "/", new PathHandler() {
                 @Override
                 public WebResourceResponse handle(@NonNull String path) {
                     try {
@@ -283,8 +283,8 @@
     @SmallTest
     public void testMultiplePathHandlersOnTheSamePath() throws Throwable {
         WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
-                .register("/test_path/", new FakeZipPathHandler())
-                .register("/test_path/", new FakeTextPathHandler())
+                .addPathHandler("/test_path/", new FakeZipPathHandler())
+                .addPathHandler("/test_path/", new FakeTextPathHandler())
                 .build();
 
         WebResourceResponse response = assetLoader.shouldInterceptRequest(
@@ -301,8 +301,8 @@
 
         // Register in reverse order to make sure it works regardless of order.
         assetLoader = new WebViewAssetLoader.Builder()
-                .register("/test_path/", new FakeTextPathHandler())
-                .register("/test_path/", new FakeZipPathHandler())
+                .addPathHandler("/test_path/", new FakeTextPathHandler())
+                .addPathHandler("/test_path/", new FakeZipPathHandler())
                 .build();
 
         response = assetLoader.shouldInterceptRequest(
diff --git a/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java b/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java
index ccfe8da..fa064fc 100644
--- a/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java
+++ b/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java
@@ -56,8 +56,8 @@
  * A typical usage would be like:
  * <pre class="prettyprint">
  *     final WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
- *              .register("/assets/", new AssetsPathHandler(this))
- *              .register("/res/", new ResourcesPathHandler(this))
+ *              .addPathHandler("/assets/", new AssetsPathHandler(this))
+ *              .addPathHandler("/res/", new ResourcesPathHandler(this))
  *              .build();
  *
  *     webView.setWebViewClient(new WebViewClient() {
@@ -304,12 +304,12 @@
      * A builder class for constructing {@link WebViewAssetLoader} objects.
      */
     public static final class Builder {
-        private boolean mAllowHttp;
+        private boolean mHttpAllowed;
         private String mDomain;
         @NonNull private List<PathMatcher> mBuilderMatcherList;
 
         public Builder() {
-            mAllowHttp = false;
+            mHttpAllowed = false;
             mDomain = DEFAULT_DOMAIN;
             mBuilderMatcherList = new ArrayList<>();
         }
@@ -322,7 +322,7 @@
          * @return {@link Builder} object.
          */
         @NonNull
-        public Builder onDomain(@NonNull String domain) {
+        public Builder setDomain(@NonNull String domain) {
             mDomain = domain;
             return this;
         }
@@ -334,8 +334,8 @@
          * @return {@link Builder} object.
          */
         @NonNull
-        public Builder allowHttp(boolean allowHttp) {
-            mAllowHttp = allowHttp;
+        public Builder setHttpAllowed(boolean httpAllowed) {
+            mHttpAllowed = httpAllowed;
             return this;
         }
 
@@ -351,8 +351,8 @@
          * @throws IllegalArgumentException if the path is invalid.
          */
         @NonNull
-        public Builder register(@NonNull String path, @NonNull PathHandler handler) {
-            mBuilderMatcherList.add(new PathMatcher(mDomain, path, mAllowHttp, handler));
+        public Builder addPathHandler(@NonNull String path, @NonNull PathHandler handler) {
+            mBuilderMatcherList.add(new PathMatcher(mDomain, path, mHttpAllowed, handler));
             return this;
         }
 
diff --git a/paging/common/ktx/api/2.2.0-alpha01.txt b/work/workmanager-gcm/api/2.3.0-alpha01.txt
similarity index 100%
copy from paging/common/ktx/api/2.2.0-alpha01.txt
copy to work/workmanager-gcm/api/2.3.0-alpha01.txt
diff --git a/paging/runtime/api/res-2.2.0-alpha01.txt b/work/workmanager-gcm/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/res-2.2.0-alpha01.txt
copy to work/workmanager-gcm/api/res-2.3.0-alpha01.txt
diff --git a/paging/common/ktx/api/2.2.0-alpha01.txt b/work/workmanager-gcm/api/restricted_2.3.0-alpha01.txt
similarity index 100%
copy from paging/common/ktx/api/2.2.0-alpha01.txt
copy to work/workmanager-gcm/api/restricted_2.3.0-alpha01.txt
diff --git a/work/workmanager-gcm/src/androidTest/java/androidx/work/impl/background/gcm/GcmTaskConverterTest.kt b/work/workmanager-gcm/src/androidTest/java/androidx/work/impl/background/gcm/GcmTaskConverterTest.kt
index 827712634..547c3ac 100644
--- a/work/workmanager-gcm/src/androidTest/java/androidx/work/impl/background/gcm/GcmTaskConverterTest.kt
+++ b/work/workmanager-gcm/src/androidTest/java/androidx/work/impl/background/gcm/GcmTaskConverterTest.kt
@@ -27,6 +27,7 @@
 import androidx.work.impl.background.gcm.GcmTaskConverter.EXECUTION_WINDOW_SIZE_IN_SECONDS
 import com.google.android.gms.gcm.Task
 import org.hamcrest.Matchers.greaterThan
+import org.hamcrest.Matchers.lessThanOrEqualTo
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertThat
 import org.junit.Before
@@ -57,6 +58,7 @@
 
         val expected = request.workSpec.calculateNextRunTime()
         val offset = offset(expected, now)
+        val delta = task.windowEnd - (offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
 
         assertEquals(task.serviceName, WorkManagerGcmService::class.java.name)
         assertEquals(task.isPersisted, false)
@@ -64,7 +66,8 @@
         assertEquals(task.requiredNetwork, Task.NETWORK_STATE_ANY)
         assertEquals(task.requiresCharging, false)
         assertEquals(task.windowStart, offset)
-        assertEquals(task.windowEnd, offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
+        // Account for time unit quantization errors
+        assertThat(delta, lessThanOrEqualTo(1L))
     }
 
     @Test
@@ -84,6 +87,7 @@
         val task = mTaskConverter.convert(request.workSpec)
         val expected = request.workSpec.calculateNextRunTime()
         val offset = offset(expected, now)
+        val delta = task.windowEnd - (offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
 
         assertEquals(task.serviceName, WorkManagerGcmService::class.java.name)
         assertEquals(task.isPersisted, false)
@@ -91,7 +95,8 @@
         assertEquals(task.requiredNetwork, Task.NETWORK_STATE_CONNECTED)
         assertEquals(task.requiresCharging, true)
         assertEquals(task.windowStart, offset)
-        assertEquals(task.windowEnd, offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
+        // Account for time unit quantization errors
+        assertThat(delta, lessThanOrEqualTo(1L))
     }
 
     @Test
@@ -110,6 +115,7 @@
         val task = mTaskConverter.convert(request.workSpec)
         val expected = request.workSpec.calculateNextRunTime()
         val offset = offset(expected, now)
+        val delta = task.windowEnd - (offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
 
         assertEquals(task.serviceName, WorkManagerGcmService::class.java.name)
         assertEquals(task.isPersisted, false)
@@ -117,7 +123,8 @@
         assertEquals(task.requiredNetwork, Task.NETWORK_STATE_UNMETERED)
         assertEquals(task.requiresCharging, false)
         assertEquals(task.windowStart, offset)
-        assertEquals(task.windowEnd, offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
+        // Account for time unit quantization errors
+        assertThat(delta, lessThanOrEqualTo(1L))
     }
 
     @Test
@@ -133,6 +140,7 @@
         val task = mTaskConverter.convert(request.workSpec)
         val expected = request.workSpec.calculateNextRunTime()
         val offset = offset(expected, now)
+        val delta = task.windowEnd - (offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
 
         assertEquals(task.serviceName, WorkManagerGcmService::class.java.name)
         assertEquals(task.isPersisted, false)
@@ -140,7 +148,8 @@
         assertEquals(task.requiredNetwork, Task.NETWORK_STATE_ANY)
         assertEquals(task.requiresCharging, false)
         assertEquals(task.windowStart, offset)
-        assertEquals(task.windowEnd, offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
+        // Account for time unit quantization errors
+        assertThat(delta, lessThanOrEqualTo(1L))
     }
 
     @Test
@@ -153,17 +162,19 @@
             .build()
 
         val workSpec = request.workSpec
+        val task = mTaskConverter.convert(request.workSpec)
         val expected = workSpec.calculateNextRunTime()
         val offset = offset(expected, now)
+        val delta = task.windowEnd - (offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
 
-        val task = mTaskConverter.convert(request.workSpec)
         assertEquals(task.serviceName, WorkManagerGcmService::class.java.name)
         assertEquals(task.isPersisted, false)
         assertEquals(task.isUpdateCurrent, true)
         assertEquals(task.requiredNetwork, Task.NETWORK_STATE_ANY)
         assertEquals(task.requiresCharging, false)
         assertEquals(task.windowStart, offset)
-        assertEquals(task.windowEnd, offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
+        // Account for time unit quantization errors
+        assertThat(delta, lessThanOrEqualTo(1L))
     }
 
     @Test
@@ -175,9 +186,10 @@
         val request = PeriodicWorkRequestBuilder<TestWorker>(15L, TimeUnit.MINUTES)
             .build()
 
+        val task = mTaskConverter.convert(request.workSpec)
         val expected = request.workSpec.calculateNextRunTime()
         val offset = offset(expected, now)
-        val task = mTaskConverter.convert(request.workSpec)
+        val delta = task.windowEnd - (offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
 
         assertEquals(task.serviceName, WorkManagerGcmService::class.java.name)
         assertEquals(task.isPersisted, false)
@@ -185,7 +197,8 @@
         assertEquals(task.requiredNetwork, Task.NETWORK_STATE_ANY)
         assertEquals(task.requiresCharging, false)
         assertEquals(task.windowStart, offset)
-        assertEquals(task.windowEnd, offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
+        // Account for time unit quantization errors
+        assertThat(delta, lessThanOrEqualTo(1L))
     }
 
     @Test
diff --git a/work/workmanager-ktx/api/2.3.0-alpha01.txt b/work/workmanager-ktx/api/2.3.0-alpha01.txt
new file mode 100644
index 0000000..4ed72f8
--- /dev/null
+++ b/work/workmanager-ktx/api/2.3.0-alpha01.txt
@@ -0,0 +1,42 @@
+// Signature format: 3.0
+package androidx.work {
+
+  public abstract class CoroutineWorker extends androidx.work.ListenableWorker {
+    ctor public CoroutineWorker(android.content.Context appContext, androidx.work.WorkerParameters params);
+    method public abstract suspend Object doWork(kotlin.coroutines.Continuation<? super androidx.work.ListenableWorker.Result> p);
+    method @Deprecated public kotlinx.coroutines.CoroutineDispatcher getCoroutineContext();
+    method public final void onStopped();
+    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result> startWork();
+    property @Deprecated public kotlinx.coroutines.CoroutineDispatcher coroutineContext;
+  }
+
+  public final class DataKt {
+    ctor public DataKt();
+    method public static inline androidx.work.Data workDataOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ListenableFutureKt {
+    ctor public ListenableFutureKt();
+  }
+
+  public final class OneTimeWorkRequestKt {
+    ctor public OneTimeWorkRequestKt();
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.OneTimeWorkRequest.Builder OneTimeWorkRequestBuilder();
+    method public static inline androidx.work.OneTimeWorkRequest.Builder setInputMerger(androidx.work.OneTimeWorkRequest.Builder, kotlin.reflect.KClass<? extends androidx.work.InputMerger> inputMerger);
+  }
+
+  public final class OperationKt {
+    ctor public OperationKt();
+    method public static suspend inline Object! await(androidx.work.Operation, kotlin.coroutines.Continuation<? super androidx.work.Operation.State.SUCCESS> p);
+  }
+
+  public final class PeriodicWorkRequestKt {
+    ctor public PeriodicWorkRequestKt();
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit);
+    method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval);
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit, long flexTimeInterval, java.util.concurrent.TimeUnit flexTimeIntervalUnit);
+    method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval, java.time.Duration flexTimeInterval);
+  }
+
+}
+
diff --git a/paging/runtime/ktx/api/res-2.2.0-alpha01.txt b/work/workmanager-ktx/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from paging/runtime/ktx/api/res-2.2.0-alpha01.txt
copy to work/workmanager-ktx/api/res-2.3.0-alpha01.txt
diff --git a/work/workmanager-ktx/api/restricted_2.3.0-alpha01.txt b/work/workmanager-ktx/api/restricted_2.3.0-alpha01.txt
new file mode 100644
index 0000000..2a2fd52
--- /dev/null
+++ b/work/workmanager-ktx/api/restricted_2.3.0-alpha01.txt
@@ -0,0 +1,48 @@
+// Signature format: 3.0
+package androidx.work {
+
+  public abstract class CoroutineWorker extends androidx.work.ListenableWorker {
+    ctor public CoroutineWorker(android.content.Context appContext, androidx.work.WorkerParameters params);
+    method public abstract suspend Object doWork(kotlin.coroutines.Continuation<? super androidx.work.ListenableWorker.Result> p);
+    method @Deprecated public kotlinx.coroutines.CoroutineDispatcher getCoroutineContext();
+    method public final void onStopped();
+    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result> startWork();
+    property @Deprecated public kotlinx.coroutines.CoroutineDispatcher coroutineContext;
+  }
+
+  public final class DataKt {
+    ctor public DataKt();
+    method public static inline androidx.work.Data workDataOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public enum DirectExecutor implements java.util.concurrent.Executor {
+    method public void execute(Runnable command);
+    enum_constant public static final androidx.work.DirectExecutor INSTANCE;
+  }
+
+  public final class ListenableFutureKt {
+    ctor public ListenableFutureKt();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static suspend inline <R> Object! await(com.google.common.util.concurrent.ListenableFuture<R>, kotlin.coroutines.Continuation<? super R> p);
+  }
+
+  public final class OneTimeWorkRequestKt {
+    ctor public OneTimeWorkRequestKt();
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.OneTimeWorkRequest.Builder OneTimeWorkRequestBuilder();
+    method public static inline androidx.work.OneTimeWorkRequest.Builder setInputMerger(androidx.work.OneTimeWorkRequest.Builder, kotlin.reflect.KClass<? extends androidx.work.InputMerger> inputMerger);
+  }
+
+  public final class OperationKt {
+    ctor public OperationKt();
+    method public static suspend inline Object! await(androidx.work.Operation, kotlin.coroutines.Continuation<? super androidx.work.Operation.State.SUCCESS> p);
+  }
+
+  public final class PeriodicWorkRequestKt {
+    ctor public PeriodicWorkRequestKt();
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit);
+    method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval);
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit, long flexTimeInterval, java.util.concurrent.TimeUnit flexTimeIntervalUnit);
+    method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval, java.time.Duration flexTimeInterval);
+  }
+
+}
+
diff --git a/work/workmanager-rxjava2/api/2.3.0-alpha01.txt b/work/workmanager-rxjava2/api/2.3.0-alpha01.txt
new file mode 100644
index 0000000..e43f0e5
--- /dev/null
+++ b/work/workmanager-rxjava2/api/2.3.0-alpha01.txt
@@ -0,0 +1,12 @@
+// Signature format: 3.0
+package androidx.work {
+
+  public abstract class RxWorker extends androidx.work.ListenableWorker {
+    ctor public RxWorker(android.content.Context, androidx.work.WorkerParameters);
+    method @MainThread public abstract io.reactivex.Single<androidx.work.ListenableWorker.Result!> createWork();
+    method protected io.reactivex.Scheduler getBackgroundScheduler();
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+}
+
diff --git a/paging/rxjava2/api/res-2.2.0-alpha01.txt b/work/workmanager-rxjava2/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from paging/rxjava2/api/res-2.2.0-alpha01.txt
copy to work/workmanager-rxjava2/api/res-2.3.0-alpha01.txt
diff --git a/work/workmanager-rxjava2/api/restricted_2.3.0-alpha01.txt b/work/workmanager-rxjava2/api/restricted_2.3.0-alpha01.txt
new file mode 100644
index 0000000..e43f0e5
--- /dev/null
+++ b/work/workmanager-rxjava2/api/restricted_2.3.0-alpha01.txt
@@ -0,0 +1,12 @@
+// Signature format: 3.0
+package androidx.work {
+
+  public abstract class RxWorker extends androidx.work.ListenableWorker {
+    ctor public RxWorker(android.content.Context, androidx.work.WorkerParameters);
+    method @MainThread public abstract io.reactivex.Single<androidx.work.ListenableWorker.Result!> createWork();
+    method protected io.reactivex.Scheduler getBackgroundScheduler();
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+}
+
diff --git a/work/workmanager-testing/api/2.3.0-alpha01.txt b/work/workmanager-testing/api/2.3.0-alpha01.txt
new file mode 100644
index 0000000..8827453
--- /dev/null
+++ b/work/workmanager-testing/api/2.3.0-alpha01.txt
@@ -0,0 +1,52 @@
+// Signature format: 3.0
+package androidx.work.testing {
+
+  public class SynchronousExecutor implements java.util.concurrent.Executor {
+    ctor public SynchronousExecutor();
+    method public void execute(Runnable);
+  }
+
+  public interface TestDriver {
+    method public void setAllConstraintsMet(java.util.UUID);
+    method public void setInitialDelayMet(java.util.UUID);
+    method public void setPeriodDelayMet(java.util.UUID);
+  }
+
+  public class TestListenableWorkerBuilder<W extends androidx.work.ListenableWorker> {
+    method public W build();
+    method public static androidx.work.testing.TestListenableWorkerBuilder from(android.content.Context, androidx.work.WorkRequest);
+    method public static <W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W!> from(android.content.Context, Class<W!>);
+    method public androidx.work.testing.TestListenableWorkerBuilder setId(java.util.UUID);
+    method public androidx.work.testing.TestListenableWorkerBuilder setInputData(androidx.work.Data);
+    method @RequiresApi(28) public androidx.work.testing.TestListenableWorkerBuilder setNetwork(android.net.Network);
+    method public androidx.work.testing.TestListenableWorkerBuilder setRunAttemptCount(int);
+    method public androidx.work.testing.TestListenableWorkerBuilder setTags(java.util.List<java.lang.String!>);
+    method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder setTriggeredContentAuthorities(java.util.List<java.lang.String!>);
+    method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder setTriggeredContentUris(java.util.List<android.net.Uri!>);
+    method public androidx.work.testing.TestListenableWorkerBuilder setWorkerFactory(androidx.work.WorkerFactory);
+  }
+
+  public final class TestListenableWorkerBuilderKt {
+    ctor public TestListenableWorkerBuilderKt();
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W> TestListenableWorkerBuilder(android.content.Context context, androidx.work.Data inputData = androidx.work.Data.EMPTY, java.util.List<java.lang.String> tags = emptyList(), int runAttemptCount = 1, java.util.List<? extends android.net.Uri> triggeredContentUris = emptyList(), java.util.List<java.lang.String> triggeredContentAuthorities = emptyList());
+  }
+
+  public class TestWorkerBuilder<W extends androidx.work.Worker> extends androidx.work.testing.TestListenableWorkerBuilder<W> {
+    method public static androidx.work.testing.TestWorkerBuilder<? extends androidx.work.Worker> from(android.content.Context, androidx.work.WorkRequest, java.util.concurrent.Executor);
+    method public static <W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W!> from(android.content.Context, Class<W!>, java.util.concurrent.Executor);
+  }
+
+  public final class TestWorkerBuilderKt {
+    ctor public TestWorkerBuilderKt();
+    method public static inline <reified W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W> TestWorkerBuilder(android.content.Context context, java.util.concurrent.Executor executor, androidx.work.Data inputData = androidx.work.Data.EMPTY, java.util.List<java.lang.String> tags = emptyList(), int runAttemptCount = 1, java.util.List<? extends android.net.Uri> triggeredContentUris = emptyList(), java.util.List<java.lang.String> triggeredContentAuthorities = emptyList());
+  }
+
+  public final class WorkManagerTestInitHelper {
+    method @Deprecated public static androidx.work.testing.TestDriver? getTestDriver();
+    method public static androidx.work.testing.TestDriver? getTestDriver(android.content.Context);
+    method public static void initializeTestWorkManager(android.content.Context);
+    method public static void initializeTestWorkManager(android.content.Context, androidx.work.Configuration);
+  }
+
+}
+
diff --git a/paging/runtime/api/res-2.2.0-alpha01.txt b/work/workmanager-testing/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/res-2.2.0-alpha01.txt
copy to work/workmanager-testing/api/res-2.3.0-alpha01.txt
diff --git a/work/workmanager-testing/api/restricted_2.3.0-alpha01.txt b/work/workmanager-testing/api/restricted_2.3.0-alpha01.txt
new file mode 100644
index 0000000..8827453
--- /dev/null
+++ b/work/workmanager-testing/api/restricted_2.3.0-alpha01.txt
@@ -0,0 +1,52 @@
+// Signature format: 3.0
+package androidx.work.testing {
+
+  public class SynchronousExecutor implements java.util.concurrent.Executor {
+    ctor public SynchronousExecutor();
+    method public void execute(Runnable);
+  }
+
+  public interface TestDriver {
+    method public void setAllConstraintsMet(java.util.UUID);
+    method public void setInitialDelayMet(java.util.UUID);
+    method public void setPeriodDelayMet(java.util.UUID);
+  }
+
+  public class TestListenableWorkerBuilder<W extends androidx.work.ListenableWorker> {
+    method public W build();
+    method public static androidx.work.testing.TestListenableWorkerBuilder from(android.content.Context, androidx.work.WorkRequest);
+    method public static <W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W!> from(android.content.Context, Class<W!>);
+    method public androidx.work.testing.TestListenableWorkerBuilder setId(java.util.UUID);
+    method public androidx.work.testing.TestListenableWorkerBuilder setInputData(androidx.work.Data);
+    method @RequiresApi(28) public androidx.work.testing.TestListenableWorkerBuilder setNetwork(android.net.Network);
+    method public androidx.work.testing.TestListenableWorkerBuilder setRunAttemptCount(int);
+    method public androidx.work.testing.TestListenableWorkerBuilder setTags(java.util.List<java.lang.String!>);
+    method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder setTriggeredContentAuthorities(java.util.List<java.lang.String!>);
+    method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder setTriggeredContentUris(java.util.List<android.net.Uri!>);
+    method public androidx.work.testing.TestListenableWorkerBuilder setWorkerFactory(androidx.work.WorkerFactory);
+  }
+
+  public final class TestListenableWorkerBuilderKt {
+    ctor public TestListenableWorkerBuilderKt();
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W> TestListenableWorkerBuilder(android.content.Context context, androidx.work.Data inputData = androidx.work.Data.EMPTY, java.util.List<java.lang.String> tags = emptyList(), int runAttemptCount = 1, java.util.List<? extends android.net.Uri> triggeredContentUris = emptyList(), java.util.List<java.lang.String> triggeredContentAuthorities = emptyList());
+  }
+
+  public class TestWorkerBuilder<W extends androidx.work.Worker> extends androidx.work.testing.TestListenableWorkerBuilder<W> {
+    method public static androidx.work.testing.TestWorkerBuilder<? extends androidx.work.Worker> from(android.content.Context, androidx.work.WorkRequest, java.util.concurrent.Executor);
+    method public static <W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W!> from(android.content.Context, Class<W!>, java.util.concurrent.Executor);
+  }
+
+  public final class TestWorkerBuilderKt {
+    ctor public TestWorkerBuilderKt();
+    method public static inline <reified W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W> TestWorkerBuilder(android.content.Context context, java.util.concurrent.Executor executor, androidx.work.Data inputData = androidx.work.Data.EMPTY, java.util.List<java.lang.String> tags = emptyList(), int runAttemptCount = 1, java.util.List<? extends android.net.Uri> triggeredContentUris = emptyList(), java.util.List<java.lang.String> triggeredContentAuthorities = emptyList());
+  }
+
+  public final class WorkManagerTestInitHelper {
+    method @Deprecated public static androidx.work.testing.TestDriver? getTestDriver();
+    method public static androidx.work.testing.TestDriver? getTestDriver(android.content.Context);
+    method public static void initializeTestWorkManager(android.content.Context);
+    method public static void initializeTestWorkManager(android.content.Context, androidx.work.Configuration);
+  }
+
+}
+
diff --git a/work/workmanager/api/2.3.0-alpha01.txt b/work/workmanager/api/2.3.0-alpha01.txt
new file mode 100644
index 0000000..8d3b024
--- /dev/null
+++ b/work/workmanager/api/2.3.0-alpha01.txt
@@ -0,0 +1,309 @@
+// Signature format: 3.0
+package androidx.work {
+
+  public final class ArrayCreatingInputMerger extends androidx.work.InputMerger {
+    ctor public ArrayCreatingInputMerger();
+    method public androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+  }
+
+  public enum BackoffPolicy {
+    enum_constant public static final androidx.work.BackoffPolicy EXPONENTIAL;
+    enum_constant public static final androidx.work.BackoffPolicy LINEAR;
+  }
+
+  public final class Configuration {
+    method public java.util.concurrent.Executor getExecutor();
+    method public androidx.work.InputMergerFactory getInputMergerFactory();
+    method public int getMaxJobSchedulerId();
+    method public int getMinJobSchedulerId();
+    method public java.util.concurrent.Executor getTaskExecutor();
+    method public androidx.work.WorkerFactory getWorkerFactory();
+    field public static final int MIN_SCHEDULER_LIMIT = 20; // 0x14
+  }
+
+  public static final class Configuration.Builder {
+    ctor public Configuration.Builder();
+    method public androidx.work.Configuration build();
+    method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor);
+    method public androidx.work.Configuration.Builder setInputMergerFactory(androidx.work.InputMergerFactory);
+    method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int, int);
+    method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int);
+    method public androidx.work.Configuration.Builder setMinimumLoggingLevel(int);
+    method public androidx.work.Configuration.Builder setTaskExecutor(java.util.concurrent.Executor);
+    method public androidx.work.Configuration.Builder setWorkerFactory(androidx.work.WorkerFactory);
+  }
+
+  public static interface Configuration.Provider {
+    method public androidx.work.Configuration getWorkManagerConfiguration();
+  }
+
+  public final class Constraints {
+    ctor public Constraints(androidx.work.Constraints);
+    method public androidx.work.NetworkType getRequiredNetworkType();
+    method public boolean requiresBatteryNotLow();
+    method public boolean requiresCharging();
+    method @RequiresApi(23) public boolean requiresDeviceIdle();
+    method public boolean requiresStorageNotLow();
+    field public static final androidx.work.Constraints! NONE;
+  }
+
+  public static final class Constraints.Builder {
+    ctor public Constraints.Builder();
+    method @RequiresApi(24) public androidx.work.Constraints.Builder addContentUriTrigger(android.net.Uri, boolean);
+    method public androidx.work.Constraints build();
+    method public androidx.work.Constraints.Builder setRequiredNetworkType(androidx.work.NetworkType);
+    method public androidx.work.Constraints.Builder setRequiresBatteryNotLow(boolean);
+    method public androidx.work.Constraints.Builder setRequiresCharging(boolean);
+    method @RequiresApi(23) public androidx.work.Constraints.Builder setRequiresDeviceIdle(boolean);
+    method public androidx.work.Constraints.Builder setRequiresStorageNotLow(boolean);
+    method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(long, java.util.concurrent.TimeUnit);
+    method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(java.time.Duration!);
+    method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(long, java.util.concurrent.TimeUnit);
+    method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(java.time.Duration!);
+  }
+
+  public final class Data {
+    ctor public Data(androidx.work.Data);
+    method public boolean getBoolean(String, boolean);
+    method public boolean[]? getBooleanArray(String);
+    method public byte getByte(String, byte);
+    method public byte[]? getByteArray(String);
+    method public double getDouble(String, double);
+    method public double[]? getDoubleArray(String);
+    method public float getFloat(String, float);
+    method public float[]? getFloatArray(String);
+    method public int getInt(String, int);
+    method public int[]? getIntArray(String);
+    method public java.util.Map<java.lang.String!,java.lang.Object!> getKeyValueMap();
+    method public long getLong(String, long);
+    method public long[]? getLongArray(String);
+    method public String? getString(String);
+    method public String![]? getStringArray(String);
+    field public static final androidx.work.Data! EMPTY;
+    field public static final int MAX_DATA_BYTES = 10240; // 0x2800
+  }
+
+  public static final class Data.Builder {
+    ctor public Data.Builder();
+    method public androidx.work.Data build();
+    method public androidx.work.Data.Builder putAll(androidx.work.Data);
+    method public androidx.work.Data.Builder putAll(java.util.Map<java.lang.String!,java.lang.Object!>);
+    method public androidx.work.Data.Builder putBoolean(String, boolean);
+    method public androidx.work.Data.Builder putBooleanArray(String, boolean[]);
+    method public androidx.work.Data.Builder putByte(String, byte);
+    method public androidx.work.Data.Builder putByteArray(String, byte[]);
+    method public androidx.work.Data.Builder putDouble(String, double);
+    method public androidx.work.Data.Builder putDoubleArray(String, double[]);
+    method public androidx.work.Data.Builder putFloat(String, float);
+    method public androidx.work.Data.Builder putFloatArray(String, float[]);
+    method public androidx.work.Data.Builder putInt(String, int);
+    method public androidx.work.Data.Builder putIntArray(String, int[]);
+    method public androidx.work.Data.Builder putLong(String, long);
+    method public androidx.work.Data.Builder putLongArray(String, long[]);
+    method public androidx.work.Data.Builder putString(String, String?);
+    method public androidx.work.Data.Builder putStringArray(String, String![]);
+  }
+
+  public class DelegatingWorkerFactory extends androidx.work.WorkerFactory {
+    ctor public DelegatingWorkerFactory();
+    method public final void addFactory(androidx.work.WorkerFactory);
+    method public final androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+  }
+
+  public enum ExistingPeriodicWorkPolicy {
+    enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy KEEP;
+    enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy REPLACE;
+  }
+
+  public enum ExistingWorkPolicy {
+    enum_constant public static final androidx.work.ExistingWorkPolicy APPEND;
+    enum_constant public static final androidx.work.ExistingWorkPolicy KEEP;
+    enum_constant public static final androidx.work.ExistingWorkPolicy REPLACE;
+  }
+
+  public abstract class InputMerger {
+    ctor public InputMerger();
+    method public abstract androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+  }
+
+  public abstract class InputMergerFactory {
+    ctor public InputMergerFactory();
+    method public abstract androidx.work.InputMerger? createInputMerger(String);
+  }
+
+  public abstract class ListenableWorker {
+    ctor @Keep public ListenableWorker(android.content.Context, androidx.work.WorkerParameters);
+    method public final android.content.Context getApplicationContext();
+    method public final java.util.UUID getId();
+    method public final androidx.work.Data getInputData();
+    method @RequiresApi(28) public final android.net.Network? getNetwork();
+    method @IntRange(from=0) public final int getRunAttemptCount();
+    method public final java.util.Set<java.lang.String!> getTags();
+    method @RequiresApi(24) public final java.util.List<java.lang.String!> getTriggeredContentAuthorities();
+    method @RequiresApi(24) public final java.util.List<android.net.Uri!> getTriggeredContentUris();
+    method public final boolean isStopped();
+    method public void onStopped();
+    method @MainThread public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+  public abstract static class ListenableWorker.Result {
+    method public static androidx.work.ListenableWorker.Result failure();
+    method public static androidx.work.ListenableWorker.Result failure(androidx.work.Data);
+    method public static androidx.work.ListenableWorker.Result retry();
+    method public static androidx.work.ListenableWorker.Result success();
+    method public static androidx.work.ListenableWorker.Result success(androidx.work.Data);
+  }
+
+  public enum NetworkType {
+    enum_constant public static final androidx.work.NetworkType CONNECTED;
+    enum_constant public static final androidx.work.NetworkType METERED;
+    enum_constant public static final androidx.work.NetworkType NOT_REQUIRED;
+    enum_constant public static final androidx.work.NetworkType NOT_ROAMING;
+    enum_constant public static final androidx.work.NetworkType UNMETERED;
+  }
+
+  public final class OneTimeWorkRequest extends androidx.work.WorkRequest {
+    method public static androidx.work.OneTimeWorkRequest from(Class<? extends androidx.work.ListenableWorker>);
+    method public static java.util.List<androidx.work.OneTimeWorkRequest!> from(java.util.List<java.lang.Class<? extends androidx.work.ListenableWorker>!>);
+  }
+
+  public static final class OneTimeWorkRequest.Builder extends androidx.work.WorkRequest.Builder<androidx.work.OneTimeWorkRequest.Builder,androidx.work.OneTimeWorkRequest> {
+    ctor public OneTimeWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>);
+    method public androidx.work.OneTimeWorkRequest.Builder setInputMerger(Class<? extends androidx.work.InputMerger>);
+  }
+
+  public interface Operation {
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.Operation.State.SUCCESS!> getResult();
+    method public androidx.lifecycle.LiveData<androidx.work.Operation.State!> getState();
+  }
+
+  public abstract static class Operation.State {
+  }
+
+  public static final class Operation.State.FAILURE extends androidx.work.Operation.State {
+    ctor public Operation.State.FAILURE(Throwable);
+    method public Throwable getThrowable();
+  }
+
+  public static final class Operation.State.IN_PROGRESS extends androidx.work.Operation.State {
+  }
+
+  public static final class Operation.State.SUCCESS extends androidx.work.Operation.State {
+  }
+
+  public final class OverwritingInputMerger extends androidx.work.InputMerger {
+    ctor public OverwritingInputMerger();
+    method public androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+  }
+
+  public final class PeriodicWorkRequest extends androidx.work.WorkRequest {
+    field public static final long MIN_PERIODIC_FLEX_MILLIS = 300000L; // 0x493e0L
+    field public static final long MIN_PERIODIC_INTERVAL_MILLIS = 900000L; // 0xdbba0L
+  }
+
+  public static final class PeriodicWorkRequest.Builder extends androidx.work.WorkRequest.Builder<androidx.work.PeriodicWorkRequest.Builder,androidx.work.PeriodicWorkRequest> {
+    ctor public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, long, java.util.concurrent.TimeUnit);
+    ctor @RequiresApi(26) public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, java.time.Duration);
+    ctor public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, long, java.util.concurrent.TimeUnit, long, java.util.concurrent.TimeUnit);
+    ctor @RequiresApi(26) public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, java.time.Duration, java.time.Duration);
+  }
+
+  public abstract class WorkContinuation {
+    ctor public WorkContinuation();
+    method public static androidx.work.WorkContinuation combine(java.util.List<androidx.work.WorkContinuation!>);
+    method public abstract androidx.work.Operation enqueue();
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfos();
+    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosLiveData();
+    method public final androidx.work.WorkContinuation then(androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.WorkContinuation then(java.util.List<androidx.work.OneTimeWorkRequest!>);
+  }
+
+  public final class WorkInfo {
+    method public java.util.UUID getId();
+    method public androidx.work.Data getOutputData();
+    method @IntRange(from=0) public int getRunAttemptCount();
+    method public androidx.work.WorkInfo.State getState();
+    method public java.util.Set<java.lang.String!> getTags();
+  }
+
+  public enum WorkInfo.State {
+    method public boolean isFinished();
+    enum_constant public static final androidx.work.WorkInfo.State BLOCKED;
+    enum_constant public static final androidx.work.WorkInfo.State CANCELLED;
+    enum_constant public static final androidx.work.WorkInfo.State ENQUEUED;
+    enum_constant public static final androidx.work.WorkInfo.State FAILED;
+    enum_constant public static final androidx.work.WorkInfo.State RUNNING;
+    enum_constant public static final androidx.work.WorkInfo.State SUCCEEDED;
+  }
+
+  public abstract class WorkManager {
+    method public final androidx.work.WorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.WorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public final androidx.work.WorkContinuation beginWith(androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.WorkContinuation beginWith(java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public abstract androidx.work.Operation cancelAllWork();
+    method public abstract androidx.work.Operation cancelAllWorkByTag(String);
+    method public abstract androidx.work.Operation cancelUniqueWork(String);
+    method public abstract androidx.work.Operation cancelWorkById(java.util.UUID);
+    method public final androidx.work.Operation enqueue(androidx.work.WorkRequest);
+    method public abstract androidx.work.Operation enqueue(java.util.List<? extends androidx.work.WorkRequest>);
+    method public abstract androidx.work.Operation enqueueUniquePeriodicWork(String, androidx.work.ExistingPeriodicWorkPolicy, androidx.work.PeriodicWorkRequest);
+    method public androidx.work.Operation enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.Operation enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method @Deprecated public static androidx.work.WorkManager getInstance();
+    method public static androidx.work.WorkManager getInstance(android.content.Context);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Long!> getLastCancelAllTimeMillis();
+    method public abstract androidx.lifecycle.LiveData<java.lang.Long!> getLastCancelAllTimeMillisLiveData();
+    method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.WorkInfo!> getWorkInfoById(java.util.UUID);
+    method public abstract androidx.lifecycle.LiveData<androidx.work.WorkInfo!> getWorkInfoByIdLiveData(java.util.UUID);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosByTag(String);
+    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosByTagLiveData(String);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosForUniqueWork(String);
+    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosForUniqueWorkLiveData(String);
+    method public static void initialize(android.content.Context, androidx.work.Configuration);
+    method public abstract androidx.work.Operation pruneWork();
+  }
+
+  public abstract class WorkRequest {
+    method public java.util.UUID getId();
+    field public static final long DEFAULT_BACKOFF_DELAY_MILLIS = 30000L; // 0x7530L
+    field public static final long MAX_BACKOFF_MILLIS = 18000000L; // 0x112a880L
+    field public static final long MIN_BACKOFF_MILLIS = 10000L; // 0x2710L
+  }
+
+  public abstract static class WorkRequest.Builder<B extends androidx.work.WorkRequest.Builder, W extends androidx.work.WorkRequest> {
+    method public final B addTag(String);
+    method public final W build();
+    method public final B keepResultsForAtLeast(long, java.util.concurrent.TimeUnit);
+    method @RequiresApi(26) public final B keepResultsForAtLeast(java.time.Duration);
+    method public final B setBackoffCriteria(androidx.work.BackoffPolicy, long, java.util.concurrent.TimeUnit);
+    method @RequiresApi(26) public final B setBackoffCriteria(androidx.work.BackoffPolicy, java.time.Duration);
+    method public final B setConstraints(androidx.work.Constraints);
+    method public B setInitialDelay(long, java.util.concurrent.TimeUnit);
+    method @RequiresApi(26) public B setInitialDelay(java.time.Duration);
+    method public final B setInputData(androidx.work.Data);
+  }
+
+  public abstract class Worker extends androidx.work.ListenableWorker {
+    ctor @Keep public Worker(android.content.Context, androidx.work.WorkerParameters);
+    method @WorkerThread public abstract androidx.work.ListenableWorker.Result doWork();
+    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+  public abstract class WorkerFactory {
+    ctor public WorkerFactory();
+    method public abstract androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+  }
+
+  public final class WorkerParameters {
+    method public java.util.UUID getId();
+    method public androidx.work.Data getInputData();
+    method @RequiresApi(28) public android.net.Network? getNetwork();
+    method @IntRange(from=0) public int getRunAttemptCount();
+    method public java.util.Set<java.lang.String!> getTags();
+    method @RequiresApi(24) public java.util.List<java.lang.String!> getTriggeredContentAuthorities();
+    method @RequiresApi(24) public java.util.List<android.net.Uri!> getTriggeredContentUris();
+  }
+
+}
+
diff --git a/work/workmanager/api/current.txt b/work/workmanager/api/current.txt
index f0bff1a..8d3b024 100644
--- a/work/workmanager/api/current.txt
+++ b/work/workmanager/api/current.txt
@@ -13,6 +13,7 @@
 
   public final class Configuration {
     method public java.util.concurrent.Executor getExecutor();
+    method public androidx.work.InputMergerFactory getInputMergerFactory();
     method public int getMaxJobSchedulerId();
     method public int getMinJobSchedulerId();
     method public java.util.concurrent.Executor getTaskExecutor();
@@ -24,6 +25,7 @@
     ctor public Configuration.Builder();
     method public androidx.work.Configuration build();
     method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor);
+    method public androidx.work.Configuration.Builder setInputMergerFactory(androidx.work.InputMergerFactory);
     method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int, int);
     method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int);
     method public androidx.work.Configuration.Builder setMinimumLoggingLevel(int);
@@ -124,6 +126,11 @@
     method public abstract androidx.work.Data merge(java.util.List<androidx.work.Data!>);
   }
 
+  public abstract class InputMergerFactory {
+    ctor public InputMergerFactory();
+    method public abstract androidx.work.InputMerger? createInputMerger(String);
+  }
+
   public abstract class ListenableWorker {
     ctor @Keep public ListenableWorker(android.content.Context, androidx.work.WorkerParameters);
     method public final android.content.Context getApplicationContext();
diff --git a/paging/runtime/api/res-2.2.0-alpha01.txt b/work/workmanager/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/res-2.2.0-alpha01.txt
copy to work/workmanager/api/res-2.3.0-alpha01.txt
diff --git a/work/workmanager/src/androidTest/java/androidx/work/InputMergerFactoryTest.kt b/work/workmanager/src/androidTest/java/androidx/work/InputMergerFactoryTest.kt
new file mode 100644
index 0000000..8104d5f
--- /dev/null
+++ b/work/workmanager/src/androidTest/java/androidx/work/InputMergerFactoryTest.kt
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.work
+
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import org.hamcrest.CoreMatchers.notNullValue
+import org.hamcrest.MatcherAssert.assertThat
+import org.hamcrest.Matchers.`is`
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.times
+import org.mockito.Mockito.verify
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class InputMergerFactoryTest {
+    private lateinit var context: Context
+    private lateinit var factory: InputMergerFactory
+    private lateinit var configuration: Configuration
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        factory = mock(InputMergerFactory::class.java)
+        configuration = Configuration.Builder()
+            .setInputMergerFactory(factory)
+            .build()
+    }
+
+    @Test
+    fun testInputMergerFactory() {
+        val name = ArrayCreatingInputMerger::class.java.name
+        val merger = configuration.inputMergerFactory.createInputMergerWithDefaultFallback(name)
+        assertThat(merger, notNullValue())
+        verify(factory, times(1)).createInputMerger(name)
+    }
+
+    @Test
+    fun testInputMergerFactory2() {
+        factory = object : InputMergerFactory() {
+            override fun createInputMerger(className: String): InputMerger? {
+                return OverwritingInputMerger()
+            }
+        }
+        configuration = Configuration.Builder()
+            .setInputMergerFactory(factory)
+            .build()
+
+        val name = ArrayCreatingInputMerger::class.java.name
+        val merger = configuration.inputMergerFactory.createInputMergerWithDefaultFallback(name)
+        val instanceCheck = merger is OverwritingInputMerger
+        assertThat(merger, notNullValue())
+        assertThat(instanceCheck, `is`(true))
+    }
+}
diff --git a/work/workmanager/src/main/java/androidx/work/Configuration.java b/work/workmanager/src/main/java/androidx/work/Configuration.java
index 9246dcce..c24f643 100644
--- a/work/workmanager/src/main/java/androidx/work/Configuration.java
+++ b/work/workmanager/src/main/java/androidx/work/Configuration.java
@@ -51,6 +51,7 @@
     private final @NonNull Executor mExecutor;
     private final @NonNull Executor mTaskExecutor;
     private final @NonNull WorkerFactory mWorkerFactory;
+    private final @NonNull InputMergerFactory mInputMergerFactory;
     private final int mLoggingLevel;
     private final int mMinJobSchedulerId;
     private final int mMaxJobSchedulerId;
@@ -78,6 +79,12 @@
             mWorkerFactory = builder.mWorkerFactory;
         }
 
+        if (builder.mInputMergerFactory == null) {
+            mInputMergerFactory = InputMergerFactory.getDefaultInputMergerFactory();
+        } else {
+            mInputMergerFactory = builder.mInputMergerFactory;
+        }
+
         mLoggingLevel = builder.mLoggingLevel;
         mMinJobSchedulerId = builder.mMinJobSchedulerId;
         mMaxJobSchedulerId = builder.mMaxJobSchedulerId;
@@ -115,6 +122,14 @@
     }
 
     /**
+     * @return The {@link InputMergerFactory} used by {@link WorkManager} to create instances of
+     * {@link InputMerger}s.
+     */
+    public @NonNull InputMergerFactory getInputMergerFactory() {
+        return mInputMergerFactory;
+    }
+
+    /**
      * Gets the minimum logging level for {@link WorkManager}.
      *
      * @return The minimum logging level, corresponding to the constants found in
@@ -186,6 +201,7 @@
 
         Executor mExecutor;
         WorkerFactory mWorkerFactory;
+        InputMergerFactory mInputMergerFactory;
         Executor mTaskExecutor;
 
         int mLoggingLevel = Log.INFO;
@@ -205,6 +221,17 @@
         }
 
         /**
+         * Specifies a custom {@link InputMergerFactory} for WorkManager.
+         * @param inputMergerFactory A {@link InputMergerFactory} for creating {@link InputMerger}s
+         * @return This {@link Builder} instance
+         */
+        @NonNull
+        public Builder setInputMergerFactory(@NonNull InputMergerFactory inputMergerFactory) {
+            mInputMergerFactory = inputMergerFactory;
+            return this;
+        }
+
+        /**
          * Specifies a custom {@link Executor} for WorkManager.
          *
          * @param executor An {@link Executor} for running {@link Worker}s
diff --git a/work/workmanager/src/main/java/androidx/work/InputMergerFactory.java b/work/workmanager/src/main/java/androidx/work/InputMergerFactory.java
new file mode 100644
index 0000000..ac30624
--- /dev/null
+++ b/work/workmanager/src/main/java/androidx/work/InputMergerFactory.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.work;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+
+/**
+ * A factory object that creates {@link InputMerger} instances. The factory is invoked every
+ * time a work runs. You can override the default implementation of this factory by manually
+ * initializing {@link WorkManager} (see {@link WorkManager#initialize(Context, Configuration)}
+ * and specifying a new {@link InputMergerFactory} in
+ * {@link Configuration.Builder#setInputMergerFactory(InputMergerFactory)}.
+ */
+public abstract class InputMergerFactory {
+    /**
+     * Override this method to create an instance of a {@link InputMerger} given its fully
+     * qualified class name.
+     * <p></p>
+     * Throwing an {@link Exception} here will crash the application. If an
+     * {@link InputMergerFactory} is unable to create an instance of a {@link InputMerger}, it
+     * should return {@code null} so it can delegate to the default {@link InputMergerFactory}.
+     *
+     * @param className The fully qualified class name for the {@link InputMerger}
+     * @return an instance of {@link InputMerger}
+     */
+    @Nullable
+    public abstract InputMerger createInputMerger(@NonNull String className);
+
+    /**
+     * Creates an instance of a {@link InputMerger} given its fully
+     * qualified class name with the correct fallback behavior.
+     *
+     * @param className The fully qualified class name for the {@link InputMerger}
+     * @return an instance of {@link InputMerger}
+     *
+     * @hide
+     */
+    @Nullable
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public final InputMerger createInputMergerWithDefaultFallback(@NonNull String className) {
+        InputMerger inputMerger = createInputMerger(className);
+        if (inputMerger == null) {
+            inputMerger = InputMerger.fromClassName(className);
+        }
+        return inputMerger;
+    }
+
+    /**
+     * @return A default {@link InputMergerFactory} with no custom behavior.
+     *
+     * @hide
+     */
+    @NonNull
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public static InputMergerFactory getDefaultInputMergerFactory() {
+        return new InputMergerFactory() {
+            @Nullable
+            @Override
+            public InputMerger createInputMerger(@NonNull String className) {
+                return null;
+            }
+        };
+    }
+}
diff --git a/work/workmanager/src/main/java/androidx/work/impl/WorkerWrapper.java b/work/workmanager/src/main/java/androidx/work/impl/WorkerWrapper.java
index efa3b4c..de5b1c5 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/WorkerWrapper.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/WorkerWrapper.java
@@ -35,6 +35,7 @@
 import androidx.work.Configuration;
 import androidx.work.Data;
 import androidx.work.InputMerger;
+import androidx.work.InputMergerFactory;
 import androidx.work.ListenableWorker;
 import androidx.work.Logger;
 import androidx.work.WorkInfo;
@@ -199,7 +200,10 @@
         if (mWorkSpec.isPeriodic()) {
             input = mWorkSpec.input;
         } else {
-            InputMerger inputMerger = InputMerger.fromClassName(mWorkSpec.inputMergerClassName);
+            InputMergerFactory inputMergerFactory = mConfiguration.getInputMergerFactory();
+            String inputMergerClassName = mWorkSpec.inputMergerClassName;
+            InputMerger inputMerger =
+                    inputMergerFactory.createInputMergerWithDefaultFallback(inputMergerClassName);
             if (inputMerger == null) {
                 Logger.get().error(TAG, String.format("Could not create Input Merger %s",
                         mWorkSpec.inputMergerClassName));