Merge "Move Pager to use PagedSource API" into androidx-master-dev
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/androidTest/java/androidx/appcompat/app/NightModeTestCase.java b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.java
deleted file mode 100644
index 0550ec5..0000000
--- a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.java
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.appcompat.app;
-
-import static androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM;
-import static androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_NO;
-import static androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES;
-import static androidx.appcompat.testutils.NightModeUtils.assertConfigurationNightModeEquals;
-import static androidx.appcompat.testutils.NightModeUtils.isSystemNightThemeEnabled;
-import static androidx.appcompat.testutils.NightModeUtils.setNightModeAndWait;
-import static androidx.appcompat.testutils.NightModeUtils.setNightModeAndWaitForDestroy;
-import static androidx.appcompat.testutils.TestUtilsMatchers.isBackground;
-import static androidx.test.espresso.Espresso.onView;
-import static androidx.test.espresso.assertion.ViewAssertions.matches;
-import static androidx.test.espresso.matcher.ViewMatchers.withId;
-import static androidx.test.espresso.matcher.ViewMatchers.withText;
-import static androidx.testutils.LifecycleOwnerUtils.waitForRecreation;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-
-import android.app.Instrumentation;
-import android.content.res.Configuration;
-import android.webkit.WebView;
-
-import androidx.appcompat.test.R;
-import androidx.appcompat.testutils.NightModeUtils.NightSetMode;
-import androidx.core.content.ContextCompat;
-import androidx.test.filters.LargeTest;
-import androidx.test.platform.app.InstrumentationRegistry;
-import androidx.test.rule.ActivityTestRule;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.concurrent.CountDownLatch;
-
-@LargeTest
-@RunWith(Parameterized.class)
-public class NightModeTestCase {
-
-    private static final String STRING_DAY = "DAY";
-    private static final String STRING_NIGHT = "NIGHT";
-
-    @Parameterized.Parameters
-    public static Collection<NightSetMode> data() {
-        return Arrays.asList(NightSetMode.DEFAULT, NightSetMode.LOCAL);
-    }
-
-    private final NightSetMode mSetMode;
-
-    @Rule
-    public final ActivityTestRule<NightModeActivity> mActivityTestRule;
-
-    public NightModeTestCase(NightSetMode setMode) {
-        mSetMode = setMode;
-        mActivityTestRule = new ActivityTestRule<>(NightModeActivity.class, false, false);
-    }
-
-    @Before
-    public void setup() {
-        // By default we'll set the night mode to NO, which allows us to make better
-        // assumptions in the test below
-        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
-        // Now launch the test activity
-        mActivityTestRule.launchActivity(null);
-    }
-
-    @Test
-    public void testLocalDayNightModeRecreatesActivity() throws Throwable {
-        if (mSetMode != NightSetMode.LOCAL) {
-            // This test is only applicable when using setLocalNightMode
-            return;
-        }
-
-        // Verify first that we're in day mode
-        onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)));
-
-        // Now force the local night mode to be yes (aka night mode)
-        setNightModeAndWaitForDestroy(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
-
-        // Assert that the new local night mode is returned
-        assertEquals(MODE_NIGHT_YES,
-                mActivityTestRule.getActivity().getDelegate().getLocalNightMode());
-
-        // Now check the text has changed, signifying that night resources are being used
-        onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)));
-    }
-
-    @Test
-    public void testSwitchingYesToFollowSystem() throws Throwable {
-        // This test is only useful when the dark system theme is not enabled
-        if (!isSystemNightThemeEnabled(mActivityTestRule.getActivity())) {
-            // Ensure that we're currently running in light theme (from setup above)
-            onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)));
-
-            // Force the night mode to be yes (aka night mode)
-            setNightModeAndWaitForDestroy(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
-
-            // Now check the text has changed, signifying that night resources are being used
-            onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)));
-
-            // Now force the local night mode to be FOLLOW_SYSTEM (which we know is light)
-            setNightModeAndWaitForDestroy(mActivityTestRule, MODE_NIGHT_FOLLOW_SYSTEM, mSetMode);
-
-            // Now check the text matches the system
-            onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)));
-        }
-    }
-
-    @Test
-    public void testSwitchingNoToFollowSystem() throws Throwable {
-        // This test is only useful when the dark system theme is enabled
-        if (isSystemNightThemeEnabled(mActivityTestRule.getActivity())) {
-            // Ensure that we're currently running in light theme (from setup above)
-            onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)));
-
-            // Now force the local night mode to be FOLLOW_SYSTEM (which we know is dark)
-            setNightModeAndWaitForDestroy(mActivityTestRule, MODE_NIGHT_FOLLOW_SYSTEM, mSetMode);
-
-            // Now check the text matches the system
-            onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)));
-        }
-    }
-
-    @Test
-    public void testColorConvertedDrawableChangesWithNightMode() throws Throwable {
-        final NightModeActivity activity = mActivityTestRule.getActivity();
-        final int dayColor = ContextCompat.getColor(activity, R.color.color_sky_day);
-        final int nightColor = ContextCompat.getColor(activity, R.color.color_sky_night);
-
-        // Loop through and switching from day to night and vice-versa multiple times. It needs
-        // to be looped since the issue is with drawable caching, therefore we need to prime the
-        // cache for the issue to happen
-        for (int i = 0; i < 5; i++) {
-            // First force it to be night mode and assert the color
-            setNightModeAndWaitForDestroy(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
-            onView(withId(R.id.view_background)).check(matches(isBackground(nightColor)));
-
-            // Now force the local night mode to be no (aka day mode) and assert the color
-            setNightModeAndWaitForDestroy(mActivityTestRule, MODE_NIGHT_NO, mSetMode);
-            onView(withId(R.id.view_background)).check(matches(isBackground(dayColor)));
-        }
-    }
-
-    @Test
-    public void testNightModeAutoTimeRecreatesOnTimeChange() throws Throwable {
-        // Create a fake TwilightManager and set it as the app instance
-        final FakeTwilightManager twilightManager = new FakeTwilightManager();
-        TwilightManager.setInstance(twilightManager);
-
-        // Verify that we're currently in day mode
-        onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)));
-
-        // Set MODE_NIGHT_AUTO so that we will change to night mode automatically
-        setNightModeAndWait(mActivityTestRule, AppCompatDelegate.MODE_NIGHT_AUTO_TIME, mSetMode);
-        final AppCompatDelegateImpl newDelegate =
-                (AppCompatDelegateImpl) mActivityTestRule.getActivity().getDelegate();
-
-        // Update the fake twilight manager to be in night and trigger a fake 'time' change
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                twilightManager.setIsNight(true);
-                newDelegate.getAutoTimeNightModeManager().onChange();
-            }
-        });
-
-        // Now wait until the Activity is destroyed (thus recreated)
-        waitForRecreation(mActivityTestRule);
-
-        // Check that the text has changed, signifying that night resources are being used
-        onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)));
-    }
-
-    @Test
-    public void testNightModeAutoTimeRecreatesOnResume() throws Throwable {
-        // Create a fake TwilightManager and set it as the app instance
-        final FakeTwilightManager twilightManager = new FakeTwilightManager();
-        TwilightManager.setInstance(twilightManager);
-
-        // Set MODE_NIGHT_AUTO_TIME so that we will change to night mode automatically
-        setNightModeAndWait(mActivityTestRule, AppCompatDelegate.MODE_NIGHT_AUTO_TIME, mSetMode);
-
-        // Verify that we're currently in day mode
-        onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)));
-
-        final CountDownLatch resumeCompleteLatch = new CountDownLatch(1);
-
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                final NightModeActivity activity = mActivityTestRule.getActivity();
-                final Instrumentation instrumentation =
-                        InstrumentationRegistry.getInstrumentation();
-                // Now fool the Activity into thinking that it has gone into the background
-                instrumentation.callActivityOnPause(activity);
-                instrumentation.callActivityOnStop(activity);
-
-                // Now update the twilight manager while the Activity is in the 'background'
-                twilightManager.setIsNight(true);
-
-                // Now tell the Activity that it has gone into the foreground again
-                instrumentation.callActivityOnStart(activity);
-                instrumentation.callActivityOnResume(activity);
-
-                resumeCompleteLatch.countDown();
-            }
-        });
-
-        resumeCompleteLatch.await();
-        // finally check that the text has changed, signifying that night resources are being used
-        onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)));
-    }
-
-    @Test
-    public void testOnNightModeChangedCalled() throws Throwable {
-        final NightModeActivity activity = mActivityTestRule.getActivity();
-        // Set local night mode to YES
-        setNightModeAndWait(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
-        // Assert that the Activity received a new value
-        assertEquals(MODE_NIGHT_YES, activity.getLastNightModeAndReset());
-    }
-
-    @Test
-    public void testDialogDoesNotOverrideActivityConfiguration() throws Throwable {
-        // Set Activity local night mode to YES
-        setNightModeAndWaitForDestroy(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
-
-        // Assert that the uiMode is as expected
-        assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES,
-                mActivityTestRule.getActivity());
-
-        // Now show a AppCompatDialog
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                AppCompatDialog dialog = new AppCompatDialog(mActivityTestRule.getActivity());
-                dialog.show();
-            }
-        });
-
-        // Assert that the uiMode is unchanged
-        assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES,
-                mActivityTestRule.getActivity());
-    }
-
-    @Test
-    public void testLoadingWebViewMaintainsConfiguration() throws Throwable {
-        // Set night mode and wait for the new Activity
-        setNightModeAndWaitForDestroy(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
-
-        // Assert that the context still has a night themed configuration
-        assertConfigurationNightModeEquals(
-                Configuration.UI_MODE_NIGHT_YES,
-                mActivityTestRule.getActivity().getResources().getConfiguration());
-
-        // Now load a WebView into the Activity
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                final WebView webView = new WebView(mActivityTestRule.getActivity());
-            }
-        });
-
-        // Now assert that the context still has a night themed configuration
-        assertConfigurationNightModeEquals(
-                Configuration.UI_MODE_NIGHT_YES,
-                mActivityTestRule.getActivity().getResources().getConfiguration());
-    }
-
-    @Test
-    public void testDialogCleansUpAutoMode() throws Throwable {
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                AppCompatDialog dialog = new AppCompatDialog(mActivityTestRule.getActivity());
-                AppCompatDelegateImpl delegate = (AppCompatDelegateImpl) dialog.getDelegate();
-
-                // Set the local night mode of the Dialog to be an AUTO mode
-                delegate.setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_TIME);
-
-                // Now show and dismiss the dialog
-                dialog.show();
-                dialog.dismiss();
-
-                // Assert that the auto manager is destroyed (not listening)
-                assertFalse(delegate.getAutoTimeNightModeManager().isListening());
-            }
-        });
-    }
-
-    @Test
-    public void testOnConfigurationChangeNotCalled() throws Throwable {
-        NightModeActivity activity = mActivityTestRule.getActivity();
-        // Set local night mode to YES
-        setNightModeAndWait(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
-        // Assert that onConfigurationChange was not called on the original activity
-        assertNull(activity.getLastConfigurationChangeAndClear());
-
-        activity = mActivityTestRule.getActivity();
-        // Set local night mode back to NO
-        setNightModeAndWait(mActivityTestRule, MODE_NIGHT_NO, mSetMode);
-        // Assert that onConfigurationChange was not called
-        assertNull(activity.getLastConfigurationChangeAndClear());
-    }
-
-    @After
-    public void cleanup() throws Throwable {
-        // Reset the default night mode
-        setNightModeAndWait(mActivityTestRule, MODE_NIGHT_NO, NightSetMode.DEFAULT);
-    }
-
-    private static class FakeTwilightManager extends TwilightManager {
-        private boolean mIsNight;
-
-        FakeTwilightManager() {
-            super(null, null);
-        }
-
-        @Override
-        boolean isNight() {
-            return mIsNight;
-        }
-
-        void setIsNight(boolean night) {
-            mIsNight = night;
-        }
-    }
-}
diff --git a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.kt b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.kt
new file mode 100644
index 0000000..8bd1b44
--- /dev/null
+++ b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.kt
@@ -0,0 +1,319 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.appcompat.app
+
+import android.content.Context
+import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
+import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_NO
+import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES
+import androidx.appcompat.testutils.NightModeUtils.assertConfigurationNightModeEquals
+import androidx.appcompat.testutils.NightModeUtils.isSystemNightThemeEnabled
+import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWait
+import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWaitForDestroy
+import androidx.appcompat.testutils.TestUtilsMatchers.isBackground
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.matcher.ViewMatchers.withId
+import androidx.test.espresso.matcher.ViewMatchers.withText
+import androidx.testutils.LifecycleOwnerUtils.waitForRecreation
+
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertNull
+
+import android.content.res.Configuration
+import android.location.LocationManager
+import android.webkit.WebView
+
+import androidx.appcompat.test.R
+import androidx.appcompat.testutils.NightModeUtils.NightSetMode
+import androidx.core.content.ContextCompat
+import androidx.test.filters.LargeTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.rule.ActivityTestRule
+
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+import java.util.concurrent.CountDownLatch
+
+@Suppress("DEPRECATION")
+@LargeTest
+@RunWith(Parameterized::class)
+class NightModeTestCase(private val setMode: NightSetMode) {
+    @get:Rule
+    val rule = ActivityTestRule(NightModeActivity::class.java, false, false)
+
+    @Before
+    fun setup() {
+        // By default we'll set the night mode to NO, which allows us to make better
+        // assumptions in the test below
+        AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_NO)
+        // Now launch the test activity
+        rule.launchActivity(null)
+    }
+
+    @Test
+    fun testLocalDayNightModeRecreatesActivity() {
+        if (setMode != NightSetMode.LOCAL) {
+            // This test is only applicable when using setLocalNightMode
+            return
+        }
+
+        // Verify first that we're in day mode
+        onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)))
+
+        // Now force the local night mode to be yes (aka night mode)
+        setNightModeAndWaitForDestroy(rule, MODE_NIGHT_YES, setMode)
+
+        // Assert that the new local night mode is returned
+        assertEquals(MODE_NIGHT_YES, rule.activity.delegate.localNightMode)
+
+        // Now check the text has changed, signifying that night resources are being used
+        onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)))
+    }
+
+    @Test
+    fun testSwitchingYesDoesNotAffectApplication() {
+        // This test is only useful when the dark system theme is not enabled
+        if (!isSystemNightThemeEnabled(rule.activity)) {
+            assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_NO,
+                rule.activity.applicationContext.resources.configuration)
+
+            // Force the night mode to be yes (aka night mode)
+            setNightModeAndWaitForDestroy(rule, MODE_NIGHT_YES, setMode)
+
+            assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_NO,
+                rule.activity.applicationContext.resources.configuration)
+        }
+    }
+
+    @Test
+    fun testSwitchingYesToFollowSystem() {
+        // This test is only useful when the dark system theme is enabled
+        if (!isSystemNightThemeEnabled(rule.activity)) {
+            // Now force the night mode to be YES, so we're in dark theme
+            setNightModeAndWaitForDestroy(rule, MODE_NIGHT_YES, setMode)
+            onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)))
+
+            // Now force the local night mode to be FOLLOW_SYSTEM (which we know is dark)
+            setNightModeAndWaitForDestroy(rule, MODE_NIGHT_FOLLOW_SYSTEM, setMode)
+            onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)))
+        }
+    }
+
+    @Test
+    fun testSwitchingNoToFollowSystem() {
+        // This test is only useful when the dark system theme is enabled
+        if (isSystemNightThemeEnabled(rule.activity)) {
+            // Now force the night mode to be NO, so we're in light theme
+            setNightModeAndWaitForDestroy(rule, MODE_NIGHT_NO, setMode)
+            onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)))
+
+            // Now force the night mode to be FOLLOW_SYSTEM (which we know is dark)
+            setNightModeAndWaitForDestroy(rule, MODE_NIGHT_FOLLOW_SYSTEM, setMode)
+            onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)))
+        }
+    }
+
+    @Test
+    fun testColorConvertedDrawableChangesWithNightMode() {
+        val activity = rule.activity
+        val dayColor = ContextCompat.getColor(activity, R.color.color_sky_day)
+        val nightColor = ContextCompat.getColor(activity, R.color.color_sky_night)
+
+        // Loop through and switching from day to night and vice-versa multiple times. It needs
+        // to be looped since the issue is with drawable caching, therefore we need to prime the
+        // cache for the issue to happen
+        for (i in 0 until 5) {
+            // First force it to be night mode and assert the color
+            setNightModeAndWaitForDestroy(rule, MODE_NIGHT_YES, setMode)
+            onView(withId(R.id.view_background)).check(matches(isBackground(nightColor)))
+
+            // Now force the local night mode to be no (aka day mode) and assert the color
+            setNightModeAndWaitForDestroy(rule, MODE_NIGHT_NO, setMode)
+            onView(withId(R.id.view_background)).check(matches(isBackground(dayColor)))
+        }
+    }
+
+    @Test
+    fun testNightModeAutoTimeRecreatesOnTimeChange() {
+        // Create a fake TwilightManager and set it as the app instance
+        val twilightManager = FakeTwilightManager(rule.activity)
+        TwilightManager.setInstance(twilightManager)
+
+        // Verify that we're currently in day mode
+        onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)))
+
+        // Set MODE_NIGHT_AUTO so that we will change to night mode automatically
+        setNightModeAndWait(rule, AppCompatDelegate.MODE_NIGHT_AUTO_TIME, setMode)
+        val newDelegate = rule.activity.delegate as AppCompatDelegateImpl
+
+        // Update the fake twilight manager to be in night and trigger a fake 'time' change
+        rule.runOnUiThread {
+            twilightManager.isNightForTest = true
+            newDelegate.autoTimeNightModeManager.onChange()
+        }
+
+        // Now wait until the Activity is destroyed (thus recreated)
+        waitForRecreation(rule)
+
+        // Check that the text has changed, signifying that night resources are being used
+        onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)))
+    }
+
+    @Test
+    fun testNightModeAutoTimeRecreatesOnResume() {
+        // Create a fake TwilightManager and set it as the app instance
+        val twilightManager = FakeTwilightManager(rule.activity)
+        TwilightManager.setInstance(twilightManager)
+
+        // Set MODE_NIGHT_AUTO_TIME so that we will change to night mode automatically
+        setNightModeAndWait(rule, AppCompatDelegate.MODE_NIGHT_AUTO_TIME, setMode)
+
+        // Verify that we're currently in day mode
+        onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)))
+
+        val resumeCompleteLatch = CountDownLatch(1)
+
+        rule.runOnUiThread {
+            val activity = rule.activity
+            val instrumentation = InstrumentationRegistry.getInstrumentation()
+            // Now fool the Activity into thinking that it has gone into the background
+            instrumentation.callActivityOnPause(activity)
+            instrumentation.callActivityOnStop(activity)
+
+            // Now update the twilight manager while the Activity is in the 'background'
+            twilightManager.isNightForTest = true
+
+            // Now tell the Activity that it has gone into the foreground again
+            instrumentation.callActivityOnStart(activity)
+            instrumentation.callActivityOnResume(activity)
+
+            resumeCompleteLatch.countDown()
+        }
+
+        resumeCompleteLatch.await()
+        // finally check that the text has changed, signifying that night resources are being used
+        onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)))
+    }
+
+    @Test
+    fun testOnNightModeChangedCalled() {
+        val activity = rule.activity
+        // Set local night mode to YES
+        setNightModeAndWait(rule, MODE_NIGHT_YES, setMode)
+        // Assert that the Activity received a new value
+        assertEquals(MODE_NIGHT_YES, activity.lastNightModeAndReset)
+    }
+
+    @Test
+    fun testDialogDoesNotOverrideActivityConfiguration() {
+        // Set Activity local night mode to YES
+        setNightModeAndWaitForDestroy(rule, MODE_NIGHT_YES, setMode)
+
+        // Assert that the uiMode is as expected
+        assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, rule.activity)
+
+        // Now show a AppCompatDialog
+        rule.runOnUiThread {
+            AppCompatDialog(rule.activity).show()
+        }
+
+        // Assert that the uiMode is unchanged
+        assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, rule.activity)
+    }
+
+    @Test
+    fun testLoadingWebViewMaintainsConfiguration() {
+        // Set night mode and wait for the new Activity
+        setNightModeAndWaitForDestroy(rule, MODE_NIGHT_YES, setMode)
+
+        // Assert that the context still has a night themed configuration
+        assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, rule.activity)
+
+        // Now load a WebView into the Activity
+        rule.runOnUiThread { WebView(rule.activity) }
+
+        // Now assert that the context still has a night themed configuration
+        assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, rule.activity)
+    }
+
+    @Test
+    fun testDialogCleansUpAutoMode() {
+        rule.runOnUiThread {
+            val dialog = AppCompatDialog(rule.activity)
+            val delegate = dialog.delegate as AppCompatDelegateImpl
+
+            // Set the local night mode of the Dialog to be an AUTO mode
+            delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_AUTO_TIME
+
+            // Now show and dismiss the dialog
+            dialog.show()
+            dialog.dismiss()
+
+            // Assert that the auto manager is destroyed (not listening)
+            assertFalse(delegate.autoTimeNightModeManager.isListening)
+        }
+    }
+
+    @Test
+    fun testOnConfigurationChangeNotCalled() {
+        var activity = rule.activity
+        // Set local night mode to YES
+        setNightModeAndWait(rule, MODE_NIGHT_YES, setMode)
+        // Assert that onConfigurationChange was not called on the original activity
+        assertNull(activity.lastConfigurationChangeAndClear)
+
+        activity = rule.activity
+        // Set local night mode back to NO
+        setNightModeAndWait(rule, MODE_NIGHT_NO, setMode)
+        // Assert that onConfigurationChange was not called
+        assertNull(activity.lastConfigurationChangeAndClear)
+    }
+
+    @After
+    fun cleanup() {
+        rule.finishActivity()
+        // Reset the default night mode
+        setNightModeAndWait(rule, MODE_NIGHT_NO, NightSetMode.DEFAULT)
+    }
+
+    private class FakeTwilightManager(context: Context) : TwilightManager(
+        context,
+        ContextCompat.getSystemService(context, LocationManager::class.java)!!
+    ) {
+        var isNightForTest: Boolean = false
+
+        override fun isNight(): Boolean {
+            return isNightForTest
+        }
+    }
+
+    companion object {
+        private const val STRING_DAY = "DAY"
+        private const val STRING_NIGHT = "NIGHT"
+
+        @Parameterized.Parameters
+        @JvmStatic
+        fun data() = listOf(NightSetMode.DEFAULT, NightSetMode.LOCAL)
+    }
+}
diff --git a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
index 90a2c82..1bfe3a3 100644
--- a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
+++ b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
@@ -136,6 +136,16 @@
 
     private static boolean sInstalledExceptionHandler;
 
+    /**
+     * AppCompat selectively uses applyOverrideConfiguration() for DayNight functionality.
+     * Unfortunately the framework has a few bugs around Resources instances on SDKs 21-25,
+     * resulting in the root Resources instance (i.e. Application) being modified when it
+     * shouldn't be. We can work around it by always calling applyOverrideConfiguration()
+     * where available.
+     */
+    private static final boolean sAlwaysOverrideConfiguration = Build.VERSION.SDK_INT >= 21
+            && Build.VERSION.SDK_INT <= 25;
+
     static final String EXCEPTION_HANDLER_MESSAGE_SUFFIX= ". If the resource you are"
             + " trying to use is a vector resource, you may be referencing it in an unsupported"
             + " way. See AppCompatDelegate.setCompatVectorFromResourcesEnabled() for more info.";
@@ -2258,7 +2268,7 @@
 
         final boolean activityHandlingUiMode = isActivityManifestHandlingUiMode();
 
-        if (newNightMode != applicationNightMode
+        if ((sAlwaysOverrideConfiguration || newNightMode != applicationNightMode)
                 && !activityHandlingUiMode
                 && Build.VERSION.SDK_INT >= 17
                 && !mBaseContextAttached
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 1e548a5..6d20e90 100644
--- a/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
+++ b/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
@@ -48,9 +48,18 @@
  * A class that manages a system-provided biometric prompt. On devices running P and above, this
  * will show a system-provided authentication prompt, using a device's supported biometric
  * (fingerprint, iris, face, etc). On devices before P, this will show a dialog prompting for
- * fingerprint authentication. The prompt will persist across orientation changes unless explicitly
- * canceled by the client. For security reasons, the prompt will automatically dismiss when the
- * activity is no longer in the foreground.
+ * fingerprint authentication. The prompt will persist across configuration changes unless
+ * explicitly canceled by the client. For security reasons, the prompt will automatically dismiss
+ * when the application is no longer in the foreground.
+ *
+ * To persist authentication across configuration changes, developers should (re)create the
+ * BiometricPrompt every time the activity/fragment is created. Instantiating the library with a new
+ * callback early in the fragment/activity lifecycle (e.g. onCreate) allows the ongoing authenticate
+ * session's callbacks to be received by the new fragment/activity. Note that
+ * {@link BiometricPrompt#cancelAuthentication()} should not be called, and
+ * {@link BiometricPrompt#authenticate(PromptInfo)} or
+ * {@link BiometricPrompt#authenticate(PromptInfo, CryptoObject)} does not need to be invoked after
+ * the new activity/fragment is created, since we are keeping/continuing the same session.
  */
 @SuppressLint("SyntheticAccessor")
 public class BiometricPrompt implements BiometricConstants {
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-alpha04.txt b/browser/api/1.2.0-alpha04.txt
index 74b3fa0..8269878 100644
--- a/browser/api/1.2.0-alpha04.txt
+++ b/browser/api/1.2.0-alpha04.txt
@@ -170,7 +170,8 @@
     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_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.trusted.category.NavBarColorCustomization";
+    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 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
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 74b3fa0..4e2c30d 100644
--- a/browser/api/current.txt
+++ b/browser/api/current.txt
@@ -165,12 +165,15 @@
     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_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.trusted.category.NavBarColorCustomization";
+    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
@@ -178,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 {
@@ -196,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?);
@@ -228,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-alpha04.txt b/browser/api/restricted_1.2.0-alpha04.txt
index 9a1f88d..2757731 100644
--- a/browser/api/restricted_1.2.0-alpha04.txt
+++ b/browser/api/restricted_1.2.0-alpha04.txt
@@ -183,7 +183,8 @@
     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_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.trusted.category.NavBarColorCustomization";
+    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 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
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 9a1f88d..8a1533f 100644
--- a/browser/api/restricted_current.txt
+++ b/browser/api/restricted_current.txt
@@ -178,12 +178,15 @@
     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_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.trusted.category.NavBarColorCustomization";
+    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
@@ -191,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";
   }
 
 
@@ -210,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?);
@@ -244,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";
+  }
 
 
 
@@ -262,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 852babb..5212a28 100644
--- a/browser/src/main/java/androidx/browser/customtabs/CustomTabsService.java
+++ b/browser/src/main/java/androidx/browser/customtabs/CustomTabsService.java
@@ -56,15 +56,20 @@
      * the color of the navigation bar ({@link CustomTabsIntent.Builder#setNavigationBarColor}).
      */
     public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION =
-            "androidx.browser.trusted.category.NavBarColorCustomization";
+            "androidx.browser.customtabs.category.NavBarColorCustomization";
+
+    /**
+     * An Intent filter category to signify that the Custom Tabs provider supports selecting and
+     * customizing color schemes via {@link CustomTabsIntent.Builder#setColorScheme} and
+     * {@link CustomTabsIntent.Builder#setColorSchemeParams}.
+     */
+    public static final String CATEGORY_COLOR_SCHEME_CUSTOMIZATION =
+            "androidx.browser.customtabs.category.ColorSchemeCustomization";
 
     /**
      * 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";
 
@@ -126,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<>();
 
@@ -407,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/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 e23bf0f..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
@@ -29,6 +29,8 @@
   public String groupId;
   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/AndroidXPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
index 2595865..4572ea8 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
@@ -423,7 +423,7 @@
                 !project.hasProperty("android.injected.invoked.from.ide") &&
                 !project.isBenchmark()
 
-        // Set the officially published version to be the release version with minimum dependency
+        // Set the officially published version to be the debug version with minimum dependency
         // versions.
         defaultPublishConfig(Release.DEFAULT_PUBLISH_CONFIG)
 
diff --git a/buildSrc/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt b/buildSrc/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt
index 0e12bcd..f4b47a4 100644
--- a/buildSrc/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt
@@ -45,6 +45,20 @@
         return "${project.group}_${project.name}_build_info.txt"
     }
 
+    /* Returns the local project directory without the full framework/support root directory path */
+    private fun getProjectSpecificDirectory(): String {
+        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()) {
@@ -71,28 +85,37 @@
         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/DiffAndDocs.kt b/buildSrc/src/main/kotlin/androidx/build/DiffAndDocs.kt
index 8dc4654..ce48d8e 100644
--- a/buildSrc/src/main/kotlin/androidx/build/DiffAndDocs.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/DiffAndDocs.kt
@@ -340,22 +340,19 @@
         library: LibraryExtension,
         extension: AndroidXExtension
     ) {
-
         registerPrebuilts(extension)
-        library.libraryVariants.all { variant ->
-            if (variant.name == Release.DEFAULT_PUBLISH_CONFIG) {
-                // include R.file generated for prebuilts
-                rules.filter { it.resolve(extension)?.strategy is Prebuilts }.forEach { rule ->
-                    docsTasks[rule.name]?.configure {
-                        it.include { fileTreeElement ->
-                            fileTreeElement.path.endsWith(variant.rFile())
-                        }
+        library.defaultPublishVariant { variant ->
+            // include R.file generated for prebuilts
+            rules.filter { it.resolve(extension)?.strategy is Prebuilts }.forEach { rule ->
+                docsTasks[rule.name]?.configure {
+                    it.include { fileTreeElement ->
+                        fileTreeElement.path.endsWith(variant.rFile())
                     }
                 }
+            }
 
-                tipOfTreeTasks(extension) { task ->
-                    registerAndroidProjectForDocsTask(task, variant)
-                }
+            tipOfTreeTasks(extension) { task ->
+                registerAndroidProjectForDocsTask(task, variant)
             }
         }
     }
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 16e02790..6284d20 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -33,7 +33,7 @@
     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 CAR = Version("1.0.0-alpha8")
     val CAR_CLUSTER = Version("1.0.0-alpha6")
@@ -75,13 +75,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 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 +95,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 +106,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-beta01")
     val WEAR = Version("1.1.0-alpha01")
     val WEBKIT = Version("1.1.0-alpha02")
-    val WORK = Version("2.1.0")
+    val WORK = Version("2.3.0-alpha01")
 }
diff --git a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
index d16af59..989d679 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")
diff --git a/buildSrc/src/main/kotlin/androidx/build/Release.kt b/buildSrc/src/main/kotlin/androidx/build/Release.kt
index 9ec8adb..c148ee7 100644
--- a/buildSrc/src/main/kotlin/androidx/build/Release.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/Release.kt
@@ -16,6 +16,8 @@
 package androidx.build
 
 import androidx.build.gmaven.GMavenVersionChecker
+import com.android.build.gradle.LibraryExtension
+import com.android.build.gradle.api.LibraryVariant
 import org.gradle.api.Action
 import org.gradle.api.Project
 import org.gradle.api.tasks.TaskProvider
@@ -301,6 +303,17 @@
 }
 
 /**
+ * Let you configure a library variant associated with [Release.DEFAULT_PUBLISH_CONFIG]
+ */
+fun LibraryExtension.defaultPublishVariant(config: (LibraryVariant) -> Unit) {
+    libraryVariants.all { variant ->
+        if (variant.name == Release.DEFAULT_PUBLISH_CONFIG) {
+            config(variant)
+        }
+    }
+}
+
+/**
  * Converts the maven group into a readable task name.
  */
 private fun groupToTaskNameSuffix(group: String): String {
diff --git a/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt b/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
index a8cabd0..93ee0b7 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
@@ -36,7 +36,7 @@
 const val ESPRESSO_IDLING_RESOURCE = "androidx.test.espresso:espresso-idling-resource:3.1.0"
 const val FINDBUGS = "com.google.code.findbugs:jsr305:3.0.2"
 const val GCM_NETWORK_MANAGER = "com.google.android.gms:play-services-gcm:17.0.0"
-const val GOOGLE_COMPILE_TESTING = "com.google.testing.compile:compile-testing:0.11"
+const val GOOGLE_COMPILE_TESTING = "com.google.testing.compile:compile-testing:0.18"
 const val GSON = "com.google.code.gson:gson:2.8.0"
 const val GUAVA = "com.google.guava:guava:27.0.1-jre"
 const val GUAVA_ANDROID = "com.google.guava:guava:27.0.1-android"
diff --git a/buildSrc/src/main/kotlin/androidx/build/dokka/DokkaSourceDocs.kt b/buildSrc/src/main/kotlin/androidx/build/dokka/DokkaSourceDocs.kt
index beffe9f..09d95e6 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dokka/DokkaSourceDocs.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dokka/DokkaSourceDocs.kt
@@ -20,7 +20,7 @@
 
 import androidx.build.java.JavaCompileInputs
 import androidx.build.AndroidXExtension
-import androidx.build.Release
+import androidx.build.defaultPublishVariant
 import com.android.build.gradle.LibraryExtension
 import org.gradle.api.Project
 import org.gradle.api.plugins.JavaPluginConvention
@@ -74,12 +74,10 @@
             project.logger.info("Project ${project.name} is tooling project; ignoring API tasks.")
             return
         }
-        library.libraryVariants.all { variant ->
-            if (variant.name == Release.DEFAULT_PUBLISH_CONFIG) {
-                project.afterEvaluate({
-                    val inputs = JavaCompileInputs.fromLibraryVariant(library, variant)
-                    registerInputs(inputs, project)
-                })
+        library.defaultPublishVariant { variant ->
+            project.afterEvaluate {
+                val inputs = JavaCompileInputs.fromLibraryVariant(library, variant)
+                registerInputs(inputs, project)
             }
         }
     }
diff --git a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt
index ef0da20..263e2e8 100644
--- a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt
@@ -26,7 +26,7 @@
 import androidx.build.checkapi.hasApiTasks
 import androidx.build.docsDir
 import androidx.build.java.JavaCompileInputs
-import androidx.build.Release
+import androidx.build.defaultPublishVariant
 import com.android.build.gradle.LibraryExtension
 import org.gradle.api.Project
 import org.gradle.api.plugins.JavaPluginConvention
@@ -45,18 +45,16 @@
                 return@afterEvaluate
             }
 
-            library.libraryVariants.all { variant ->
-                if (variant.name == Release.DEFAULT_PUBLISH_CONFIG) {
-                    if (!hasApiFolder()) {
-                        logger.info(
-                            "Project $name doesn't have an api folder, ignoring API tasks."
-                        )
-                        return@all
-                    }
-
-                    val javaInputs = JavaCompileInputs.fromLibraryVariant(library, variant)
-                    setupProject(this, javaInputs, extension)
+            library.defaultPublishVariant { variant ->
+                if (!hasApiFolder()) {
+                    logger.info(
+                        "Project $name doesn't have an api folder, ignoring API tasks."
+                    )
+                    return@defaultPublishVariant
                 }
+
+                val javaInputs = JavaCompileInputs.fromLibraryVariant(library, variant)
+                setupProject(this, javaInputs, extension)
             }
         }
     }
diff --git a/camera/OWNERS b/camera/OWNERS
index 5954344..3555b49 100644
--- a/camera/OWNERS
+++ b/camera/OWNERS
@@ -3,3 +3,4 @@
 trevormcguire@google.com
 vinitmodi@google.com
 ericng@google.com
+xizh@google.com
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/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-view/build.gradle b/camera/camera-view/build.gradle
index 661dabf..e91cc09 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"))
diff --git a/car/core/res/values/styles.xml b/car/core/res/values/styles.xml
index 74844e5..b9d089f 100644
--- a/car/core/res/values/styles.xml
+++ b/car/core/res/values/styles.xml
@@ -392,7 +392,8 @@
     <style name="Widget.Car.Button.DarkText" />
 
     <!-- The style for borderless buttons. -->
-    <style name="Widget.Car.Button.Borderless.Colored" parent="Widget.AppCompat.Button.Borderless.Colored">
+    <style name="Widget.Car.Button.Borderless.Colored" parent="Widget.MaterialComponents.Button.TextButton">
+        <item name="android:background">?android:attr/selectableItemBackgroundBorderless</item>
         <item name="android:fadingEdgeLength">@dimen/car_button_fading_edge_length</item>
         <item name="android:textAppearance">@style/TextAppearance.Car.Body3.Medium</item>
         <item name="android:ellipsize">none</item>
diff --git a/car/core/res/values/themes.xml b/car/core/res/values/themes.xml
index 5319336..f2611bb 100644
--- a/car/core/res/values/themes.xml
+++ b/car/core/res/values/themes.xml
@@ -29,7 +29,9 @@
         <item name="android:borderlessButtonStyle">@style/Widget.Car.Button.Borderless.Colored
         </item>
         <item name="android:buttonStyle">@style/Widget.Car.Button</item>
+        <item name="checkboxStyle">@style/Widget.Car.CheckBox.Light</item>
         <item name="android:checkboxStyle">@style/Widget.Car.CheckBox.Light</item>
+        <item name="radioButtonStyle">@style/Widget.Car.RadioButton.Light</item>
         <item name="android:radioButtonStyle">@style/Widget.Car.RadioButton.Light</item>
         <item name="android:colorButtonNormal">@color/car_accent</item>
         <item name="android:colorControlHighlight">@color/car_card_ripple_background_light</item>
@@ -60,6 +62,7 @@
         <item name="android:textColorPrimary">@color/car_primary_text_light</item>
         <item name="android:textColorHighlight">@color/car_grey_700</item>
         <item name="android:textColorHint">@color/car_secondary_text_light</item>
+        <item name="spinnerStyle">@style/Widget.Spinner.Car</item>
         <item name="android:spinnerStyle">@style/Widget.Spinner.Car</item>
         <item name="android:spinnerItemStyle">@style/CarSpinnerItem</item>
         <item name="android:spinnerDropDownItemStyle">@style/CarSpinnerItem</item>
@@ -114,7 +117,9 @@
     <style name="Theme.Car.Light.NoActionBar" parent="Theme.Car.NoActionBar">
         <item name="android:windowBackground">@color/car_card</item>
         <item name="android:alertDialogTheme">@style/Theme.Car.Dialog.Alert</item>
+        <item name="checkboxStyle">@style/Widget.Car.CheckBox</item>
         <item name="android:checkboxStyle">@style/Widget.Car.CheckBox</item>
+        <item name="radioButtonStyle">@style/Widget.Car.RadioButton</item>
         <item name="android:radioButtonStyle">@style/Widget.Car.RadioButton</item>
         <item name="android:colorAccent">@color/car_accent</item>
         <item name="android:colorButtonNormal">@color/car_accent</item>
@@ -141,6 +146,7 @@
         <item name="android:selectableItemBackgroundBorderless">
             @drawable/car_button_ripple_background
         </item>
+        <item name="spinnerStyle">@style/Widget.Spinner.Car</item>
         <item name="android:spinnerStyle">@style/Widget.Spinner.Car</item>
         <item name="android:spinnerItemStyle">@style/CarSpinnerItem</item>
         <item name="android:spinnerDropDownItemStyle">@style/CarSpinnerItem</item>
diff --git a/car/core/src/main/java/androidx/car/app/CarAlertDialog.java b/car/core/src/main/java/androidx/car/app/CarAlertDialog.java
index e1620fe..9b7d908 100644
--- a/car/core/src/main/java/androidx/car/app/CarAlertDialog.java
+++ b/car/core/src/main/java/androidx/car/app/CarAlertDialog.java
@@ -56,7 +56,7 @@
 
     private final int mTopPadding;
     private final int mButtonPanelTopMargin;
-    private final int mBottomPadding;
+    private final int mButtonPadding;
     private final int mButtonSpacing;
 
     private View mContentView;
@@ -85,7 +85,7 @@
         Resources res = context.getResources();
         mTopPadding = res.getDimensionPixelSize(R.dimen.car_padding_4);
         mButtonPanelTopMargin = res.getDimensionPixelSize(R.dimen.car_padding_2);
-        mBottomPadding = res.getDimensionPixelSize(R.dimen.car_padding_4);
+        mButtonPadding = res.getDimensionPixelSize(R.dimen.car_padding_4);
         mButtonSpacing = res.getDimensionPixelSize(R.dimen.car_padding_2);
     }
 
@@ -111,6 +111,7 @@
         setNegativeButton(mNegativeButtonText);
         setHeaderIcon(mIconDrawable);
         setTitleInternal(mTitle);
+        updateButtonSpacing();
         // setupHeader() should be called last because we want to center title and adjust
         // padding depending on icon/body/button configuration.
         setupHeader();
@@ -192,7 +193,6 @@
         mPositiveButton.setVisibility(showButton ? View.VISIBLE : View.GONE);
 
         updateButtonPanelVisibility();
-        updateButtonSpacing();
     }
 
     private void setNegativeButton(CharSequence text) {
@@ -200,7 +200,6 @@
         mNegativeButton.setVisibility(TextUtils.isEmpty(text) ? View.GONE : View.VISIBLE);
 
         updateButtonPanelVisibility();
-        updateButtonSpacing();
     }
 
     /**
@@ -225,32 +224,30 @@
      * Updates the start and end margins for the positive and negative buttons.
      */
     private void updateButtonSpacing() {
-        // If both buttons are visible, then there needs to be spacing between them.
-
-        Resources res = getContext().getResources();
-
-        int buttonOffset = mBottomPadding - mButtonSpacing;
+        int buttonOffset = mButtonPadding - mButtonSpacing;
 
         ViewGroup.MarginLayoutParams positiveButtonLayoutParams =
                 (ViewGroup.MarginLayoutParams) mPositiveButton.getLayoutParams();
         ViewGroup.MarginLayoutParams negativeButtonLayoutParams =
                 (ViewGroup.MarginLayoutParams) mNegativeButton.getLayoutParams();
 
-
+        // If both buttons are visible, then there needs to be spacing between them.
         if ((mPositiveButton.getVisibility() == View.VISIBLE
                 && mNegativeButton.getVisibility() == View.VISIBLE)) {
-
-            positiveButtonLayoutParams.setMarginStart(buttonOffset);
+            int extraSpacingOffset = CarDialogUtil.calculateExtraButtonSpace(mPositiveButton) / 2;
+            positiveButtonLayoutParams.setMarginStart(buttonOffset - extraSpacingOffset);
             positiveButtonLayoutParams.setMarginEnd(mButtonSpacing);
             mPositiveButton.requestLayout();
 
             negativeButtonLayoutParams.setMarginStart(mButtonSpacing);
             mNegativeButton.requestLayout();
         } else if (mPositiveButton.getVisibility() == View.VISIBLE) {
-            positiveButtonLayoutParams.setMarginStart(buttonOffset);
+            int extraSpacingOffset = CarDialogUtil.calculateExtraButtonSpace(mPositiveButton) / 2;
+            positiveButtonLayoutParams.setMarginStart(buttonOffset - extraSpacingOffset);
             mPositiveButton.requestLayout();
         } else if (mNegativeButton.getVisibility() == View.VISIBLE) {
-            negativeButtonLayoutParams.setMarginStart(buttonOffset);
+            int extraSpacingOffset = CarDialogUtil.calculateExtraButtonSpace(mNegativeButton) / 2;
+            negativeButtonLayoutParams.setMarginStart(buttonOffset - extraSpacingOffset);
             mNegativeButton.requestLayout();
         }
     }
@@ -273,7 +270,7 @@
         mButtonPanel.setVisibility(visibility);
 
         // If there are buttons, then remove the padding at the bottom of the content view.
-        int buttonPadding = hasButtons ? 0 : mBottomPadding;
+        int buttonPadding = hasButtons ? 0 : mButtonPadding;
         mContentView.setPaddingRelative(
                 mContentView.getPaddingStart(),
                 mContentView.getPaddingTop(),
diff --git a/car/core/src/main/java/androidx/car/app/CarDialogUtil.java b/car/core/src/main/java/androidx/car/app/CarDialogUtil.java
index a951558..f47e7f1 100644
--- a/car/core/src/main/java/androidx/car/app/CarDialogUtil.java
+++ b/car/core/src/main/java/androidx/car/app/CarDialogUtil.java
@@ -21,6 +21,7 @@
 import android.util.TypedValue;
 import android.view.View;
 import android.view.ViewTreeObserver;
+import android.widget.Button;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.StyleRes;
@@ -141,4 +142,18 @@
 
         scrollBarView.invalidate();
     }
+
+    /**
+     * Returns the additional empty space in a button, beyond padding, that is present to meet
+     * minWidth requirements. This method performs a measure pass on the button argument and
+     * should be used sparingly to avoid a performance impact.
+     */
+    static int calculateExtraButtonSpace(@NonNull Button button) {
+        int buttonMinWidth = button.getContext().getResources().getDimensionPixelSize(
+                R.dimen.car_dialog_button_min_width);
+        int textWidth = (int) button.getPaint().measureText(button.getText().toString());
+        return Math.max(
+                buttonMinWidth - textWidth - button.getPaddingLeft() - button.getPaddingRight(), 0);
+
+    }
 }
diff --git a/car/core/src/main/java/androidx/car/app/CarMultipleChoiceDialog.java b/car/core/src/main/java/androidx/car/app/CarMultipleChoiceDialog.java
index 67a5fb8..f7534c5 100644
--- a/car/core/src/main/java/androidx/car/app/CarMultipleChoiceDialog.java
+++ b/car/core/src/main/java/androidx/car/app/CarMultipleChoiceDialog.java
@@ -160,17 +160,17 @@
                     (ViewGroup.MarginLayoutParams) negativeButtonView.getLayoutParams();
 
             int buttonSpacing = res.getDimensionPixelSize(R.dimen.car_padding_2);
-
             positiveButtonLayoutParams.setMarginStart(buttonSpacing);
             positiveButtonView.requestLayout();
 
-            negativeButtonLayoutParams.setMarginStart(buttonOffset);
+            int buttonExtraSpace = CarDialogUtil.calculateExtraButtonSpace(negativeButtonView);
+            negativeButtonLayoutParams.setMarginStart(buttonOffset - buttonExtraSpace / 2);
             negativeButtonLayoutParams.setMarginEnd(buttonSpacing);
             negativeButtonView.requestLayout();
         } else {
             negativeButtonView.setVisibility(View.GONE);
-
-            positiveButtonLayoutParams.setMarginStart(buttonOffset);
+            int buttonExtraSpace = CarDialogUtil.calculateExtraButtonSpace(positiveButtonView);
+            positiveButtonLayoutParams.setMarginStart(buttonOffset - buttonExtraSpace / 2);
             positiveButtonView.requestLayout();
         }
     }
diff --git a/car/core/src/main/java/androidx/car/app/CarSingleChoiceDialog.java b/car/core/src/main/java/androidx/car/app/CarSingleChoiceDialog.java
index f4d1f58..d3f6066 100644
--- a/car/core/src/main/java/androidx/car/app/CarSingleChoiceDialog.java
+++ b/car/core/src/main/java/androidx/car/app/CarSingleChoiceDialog.java
@@ -165,13 +165,14 @@
             positiveButtonLayoutParams.setMarginStart(buttonSpacing);
             positiveButtonView.requestLayout();
 
-            negativeButtonLayoutParams.setMarginStart(buttonOffset);
+            int buttonExtraSpace = CarDialogUtil.calculateExtraButtonSpace(negativeButtonView);
+            negativeButtonLayoutParams.setMarginStart(buttonOffset - buttonExtraSpace);
             negativeButtonLayoutParams.setMarginEnd(buttonSpacing);
             negativeButtonView.requestLayout();
         } else {
             negativeButtonView.setVisibility(View.GONE);
-
-            positiveButtonLayoutParams.setMarginStart(buttonOffset);
+            int buttonExtraSpace = CarDialogUtil.calculateExtraButtonSpace(positiveButtonView);
+            positiveButtonLayoutParams.setMarginStart(buttonOffset - buttonExtraSpace / 2);
             positiveButtonView.requestLayout();
         }
     }
diff --git a/compose/compose-runtime/compose-runtime-benchmark/build.gradle b/compose/compose-runtime/compose-runtime-benchmark/build.gradle
new file mode 100644
index 0000000..c82e12e
--- /dev/null
+++ b/compose/compose-runtime/compose-runtime-benchmark/build.gradle
@@ -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.
+ */
+
+
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+import static androidx.build.dependencies.DependenciesKt.*
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("AndroidXUiPlugin")
+    id("kotlin-android")
+}
+
+android {
+    defaultConfig {
+        minSdkVersion 21
+    }
+    lintOptions {
+        disable("SyntheticAccessor")
+    }
+    buildTypes {
+        debug {
+            testCoverageEnabled = false
+        }
+        release {
+            testCoverageEnabled = false
+        }
+    }
+}
+
+dependencies {
+    kotlinPlugin project(path: ":compose:compose-compiler", configuration: "embeddablePlugin")
+
+    androidTestImplementation(project(":compose:compose-runtime"))
+    androidTestImplementation(project(":ui:ui-core"))
+    androidTestImplementation(project(":ui:ui-framework"))
+    androidTestImplementation(project(":ui:ui-layout"))
+    androidTestImplementation(project(":ui:ui-material"))
+    androidTestImplementation(project(":ui:ui-platform"))
+    androidTestImplementation(project(":ui:ui-foundation"))
+
+    androidTestImplementation(JUNIT)
+    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
+    androidTestImplementation(ANDROIDX_TEST_CORE)
+    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(ANDROIDX_TEST_RULES)
+    androidTestImplementation(KOTLIN_COMPOSE_STDLIB)
+    androidTestImplementation(KOTLIN_COMPOSE_REFLECT)
+    androidTestImplementation(project(":benchmark"))
+}
+
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        useIR = true
+    }
+}
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/AndroidManifest.xml b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..4bba238
--- /dev/null
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,28 @@
+<?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.
+  -->
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    package="androidx.compose.benchmark">
+    <!-- Important: disable debuggable for accurate performance results -->
+    <application
+        android:debuggable="false"
+        tools:replace="android:debuggable">
+        <activity
+            android:name=".ComposeActivity"/>
+    </application>
+</manifest>
\ No newline at end of file
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeActivity.kt b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeActivity.kt
new file mode 100644
index 0000000..e8e83b05
--- /dev/null
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeActivity.kt
@@ -0,0 +1,26 @@
+/*
+ * 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
+
+import android.app.Activity
+import android.os.Bundle
+
+class ComposeActivity : Activity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..efd3778
--- /dev/null
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeBenchmark.kt
@@ -0,0 +1,272 @@
+/*
+ * 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
+
+import android.widget.FrameLayout
+import androidx.benchmark.BenchmarkRule
+import androidx.benchmark.measureRepeated
+import androidx.compose.Composable
+import androidx.compose.Compose
+import androidx.compose.Composer
+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
+import androidx.test.annotation.UiThreadTest
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.test.rule.ActivityTestRule
+import androidx.ui.core.CraneWrapper
+import androidx.ui.core.dp
+import androidx.ui.foundation.ColoredRect
+import androidx.ui.graphics.Color
+import org.junit.Assert.assertTrue
+import org.junit.FixMethodOrder
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+class ComposeBenchmark {
+    @get:Rule
+    val benchmarkRule = BenchmarkRule()
+
+    @get:Rule
+    val activityRule = ActivityTestRule(ComposeActivity::class.java)
+
+    @UiThreadTest
+    @Test
+    fun benchmark_01_Compose_OneRect() {
+        val model = ColorModel()
+        measureCompose {
+            OneRect(model)
+        }
+    }
+
+    @UiThreadTest
+    @Test
+    fun benchmark_02_Compose_TenRects() {
+        val model = ColorModel()
+        measureCompose {
+            TenRects(model)
+        }
+    }
+
+    @UiThreadTest
+    @Test
+    fun benchmark_03_Compose_100Rects() {
+        val model = ColorModel()
+        measureCompose {
+            HunderedRects(model)
+        }
+    }
+
+    @UiThreadTest
+    @Test
+    fun benchmark_04_Recompose_OneRect() {
+        val model = ColorModel()
+        measureRecompose {
+            compose {
+                OneRect(model)
+            }
+            update {
+                model.toggle()
+            }
+        }
+    }
+
+    @UiThreadTest
+    @Test
+    fun benchmark_05_Recompose_TenRect_Wide() {
+        val model = ColorModel()
+        measureRecompose {
+            compose {
+                TenRects(model, narrow = false)
+            }
+            update {
+                model.toggle()
+            }
+        }
+    }
+
+    @UiThreadTest
+    @Test
+    fun benchmark_06_Recompose_TenRect_Narrow() {
+        val model = ColorModel()
+        measureRecompose {
+            compose {
+                TenRects(model, narrow = true)
+            }
+            update {
+                model.toggle()
+            }
+        }
+    }
+
+    @UiThreadTest
+    @Test
+    fun benchmark_07_Recompose_100Rect_Wide() {
+        val model = ColorModel()
+        measureRecompose {
+            compose {
+                HunderedRects(model, narrow = false)
+            }
+            update {
+                model.toggle()
+            }
+        }
+    }
+
+    @UiThreadTest
+    @Test
+    fun benchmark_08_Recompose_100Rect_Narrow() {
+        val model = ColorModel()
+        measureRecompose {
+            compose {
+                HunderedRects(model, narrow = true)
+            }
+            update {
+                model.toggle()
+            }
+        }
+    }
+
+    @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 {
+                val root = FrameLayout(activityRule.activity)
+                activityRule.activity.setContentView(root)
+
+                root
+            }
+
+            root.compose {
+                CraneWrapper(block)
+            }
+
+            runWithTimingDisabled {
+                Compose.disposeComposition(root)
+            }
+        }
+    }
+
+    private fun measureRecompose(block: RecomposeReceiver.() -> Unit) {
+        val receiver = RecomposeReceiver()
+        receiver.block()
+        var activeComposer: Composer<*>? = null
+
+        val root = FrameLayout(activityRule.activity)
+        activityRule.activity.setContentView(root)
+        root.compose {
+            activeComposer = composer.composer
+            CraneWrapper(receiver.composeCb)
+        }
+
+        benchmarkRule.measureRepeated {
+            runWithTimingDisabled {
+                receiver.updateModelCb()
+                FrameManager.nextFrame()
+            }
+
+            val didSomething = activeComposer?.let { composer ->
+                composer.runWithCurrent {
+                    composer.recompose().also { composer.applyChanges() }
+                }
+            } ?: false
+            assertTrue(didSomething)
+        }
+
+        Compose.disposeComposition(root)
+    }
+}
+
+private val color = Color.Yellow
+
+@Model
+class ColorModel(var color: Color = Color.Black) {
+    fun toggle() {
+        color = if (color == Color.Black) Color.Red else Color.Black
+    }
+}
+
+@Composable
+fun OneRect(model: ColorModel) {
+    ColoredRect(color = model.color, width = 10.dp, height = 10.dp)
+}
+
+@Composable
+fun TenRects(model: ColorModel, narrow: Boolean = false) {
+    if (narrow) {
+        Observe {
+            ColoredRect(color = model.color, width = 10.dp, height = 10.dp)
+        }
+    } else {
+        ColoredRect(color = model.color, width = 10.dp, height = 10.dp)
+    }
+    repeat(9) {
+        ColoredRect(color = color, width = 10.dp, height = 10.dp)
+    }
+}
+
+@Composable
+fun HunderedRects(model: ColorModel, narrow: Boolean = false) {
+    repeat(100) {
+        if (it % 10 == 0)
+            if (narrow) {
+                Observe {
+                    ColoredRect(color = model.color, width = 10.dp, height = 10.dp)
+                }
+            } else {
+                ColoredRect(color = model.color, width = 10.dp, height = 10.dp)
+            }
+        else
+            ColoredRect(color = color, width = 10.dp, height = 10.dp)
+    }
+}
+
+private class RecomposeReceiver {
+    var composeCb: @Composable() () -> Unit = @Composable { }
+    var updateModelCb: () -> Unit = { }
+
+    fun compose(block: @Composable() () -> Unit) {
+        composeCb = block
+    }
+
+    fun update(block: () -> Unit) {
+        updateModelCb = block
+    }
+}
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/fragment/fragment/src/main/res/interpolator/linear.xml b/compose/compose-runtime/compose-runtime-benchmark/src/main/AndroidManifest.xml
similarity index 75%
rename from fragment/fragment/src/main/res/interpolator/linear.xml
rename to compose/compose-runtime/compose-runtime-benchmark/src/main/AndroidManifest.xml
index 9fa4361..93790c2 100644
--- a/fragment/fragment/src/main/res/interpolator/linear.xml
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/main/AndroidManifest.xml
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!--
   Copyright 2019 The Android Open Source Project
 
@@ -14,5 +13,5 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-<!--Taken from https://googleplex-android.googlesource.com/platform/frameworks/base/+/HEAD/core/res/res/interpolator/linear.xml-->
-<linearInterpolator />
\ No newline at end of file
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.compose.benchmark"/>
\ No newline at end of file
diff --git a/compose/compose-runtime/src/main/java/androidx/compose/Composer.kt b/compose/compose-runtime/src/main/java/androidx/compose/Composer.kt
index ab28855..b5b4175 100644
--- a/compose/compose-runtime/src/main/java/androidx/compose/Composer.kt
+++ b/compose/compose-runtime/src/main/java/androidx/compose/Composer.kt
@@ -321,10 +321,10 @@
     // Deprecated
     override fun <T : N> emitNode(factory: () -> T) {
         if (inserting) {
-            // The previous pending is the pending information for where the node is being inserted.
-            // They must exist as we are in insert mode and entering inserting mode created them.
             val insertIndex = nodeIndexStack.peek()
-            pending!!.nodeCount++
+            // The pending is the pending information for where the node is being inserted.
+            // pending will be null here when the parent was inserted too.
+            pending?.let { it.nodeCount++ }
             groupNodeCount++
             recordOperation { applier, slots, _ ->
                 val node = factory()
@@ -340,10 +340,9 @@
     }
 
     override fun <T : N> createNode(factory: () -> T) {
-        // The previous pending is the pending information for where the node is being inserted.
-        // They must exist as we are in insert mode and entering inserting mode created them.
         val insertIndex = nodeIndexStack.peek()
-        pending!!.nodeCount++
+        // see emitNode
+        pending?.let { it.nodeCount++ }
         groupNodeCount++
         recordOperation { applier, slots, _ ->
             val node = factory()
@@ -357,7 +356,8 @@
     override fun emitNode(node: N) {
         assert(inserting) { "emitNode() called when not inserting" }
         val insertIndex = nodeIndexStack.peek()
-        pending!!.nodeCount++
+        // see emitNode
+        pending?.let { it.nodeCount++ }
         groupNodeCount++
         recordOperation { applier, slots, _ ->
             slots.update(node)
@@ -598,6 +598,24 @@
 
     private fun start(key: Any, action: SlotAction) {
         assert(childrenAllowed) { "A call to createNode(), emitNode() or useNode() expected" }
+
+        // Check for the insert fast path. If we are already inserting (creating nodes) then
+        // there is no need to track insert, deletes and moves with a pending changes object.
+        if (inserting) {
+            slots.beginEmpty()
+            recordOperation { _, slots, _ ->
+                slots.update(key)
+                slots.start(action)
+            }
+            pending?.let { pending ->
+                val insertKeyInfo = KeyInfo(key, -1, 0, -1)
+                pending.registerInsert(insertKeyInfo, nodeIndex - pending.startIndex)
+                pending.recordUsed(insertKeyInfo)
+            }
+            enterGroup(action, null, null)
+            return
+        }
+
         if (pending == null) {
             val slotKey = slots.next()
             if (slotKey == key) {
@@ -948,8 +966,11 @@
     }
 
     private fun invalidate(scope: RecomposeScope, sync: Boolean) {
-        val location = scope.anchor?.location(slotTable) ?: return
-        assert(location >= 0) { "Invalid anchor" }
+        val location = scope.anchor?.location(slotTable)
+            ?: return // The scope never entered the composition
+        if (location < 0)
+            return // The scope was removed from the composition
+
         invalidations.insertIfMissing(location, scope)
         if (isComposing && location > slots.current) {
             // if we are invalidating a scope that is going to be traversed during this
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/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java b/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
index 712ae1e..48bee26 100644
--- a/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
+++ b/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
@@ -16,6 +16,8 @@
 
 package androidx.core.view.accessibility;
 
+import static android.view.View.NO_ID;
+
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
 
 import android.graphics.Rect;
@@ -923,6 +925,7 @@
          * @return If the item is a heading.
          * @deprecated Use {@link AccessibilityNodeInfoCompat#isHeading()}
          */
+        @Deprecated
         public boolean isHeading() {
             if (Build.VERSION.SDK_INT >= 19) {
                 return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).isHeading();
@@ -1173,7 +1176,9 @@
      *  @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public int mParentVirtualDescendantId = -1;
+    public int mParentVirtualDescendantId = NO_ID;
+
+    private int mVirtualDescendantId = NO_ID;
 
     // Actions introduced in IceCreamSandwich
 
@@ -1691,6 +1696,8 @@
      * @param source The info source.
      */
     public void setSource(View source) {
+        mVirtualDescendantId = NO_ID;
+
         mInfo.setSource(source);
     }
 
@@ -1703,17 +1710,21 @@
      * hierarchy for accessibility purposes. This enables custom views that draw complex
      * content to report themselves as a tree of virtual views, thus conveying their
      * logical structure.
-     * </p>
      * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}.
+     * This class is made immutable before being delivered to an AccessibilityService.
+     * <p>
+     * This method is not supported on devices running API level < 16 since the platform did
+     * not support virtual descendants of real views.
      *
      * @param root The root of the virtual subtree.
      * @param virtualDescendantId The id of the virtual descendant.
      */
     public void setSource(View root, int virtualDescendantId) {
+        // Store the ID anyway, since we may need it for equality checks.
+        mVirtualDescendantId = virtualDescendantId;
+
         if (Build.VERSION.SDK_INT >= 16) {
             mInfo.setSource(root, virtualDescendantId);
         }
@@ -2091,6 +2102,8 @@
      * @throws IllegalStateException If called from an AccessibilityService.
      */
     public void setParent(View parent) {
+        mParentVirtualDescendantId = NO_ID;
+
         mInfo.setParent(parent);
     }
 
@@ -2103,18 +2116,21 @@
      * hierarchy for accessibility purposes. This enables custom views that draw complex
      * content to report them selves as a tree of virtual views, thus conveying their
      * logical structure.
-     * </p>
      * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}.
+     * This class is made immutable before being delivered to an AccessibilityService.
+     * <p>
+     * This method is not supported on devices running API level < 16 since the platform did
+     * not support virtual descendants of real views.
      *
      * @param root The root of the virtual subtree.
      * @param virtualDescendantId The id of the virtual descendant.
      */
     public void setParent(View root, int virtualDescendantId) {
+        // Store the ID anyway, since we may need it for equality checks.
         mParentVirtualDescendantId = virtualDescendantId;
+
         if (Build.VERSION.SDK_INT >= 16) {
             mInfo.setParent(root, virtualDescendantId);
         }
@@ -3969,6 +3985,12 @@
         } else if (!mInfo.equals(other.mInfo)) {
             return false;
         }
+        if (mVirtualDescendantId != other.mVirtualDescendantId) {
+            return false;
+        }
+        if (mParentVirtualDescendantId != other.mParentVirtualDescendantId) {
+            return false;
+        }
         return true;
     }
 
diff --git a/customview/build.gradle b/customview/build.gradle
index 1525c29..886ebde 100644
--- a/customview/build.gradle
+++ b/customview/build.gradle
@@ -17,7 +17,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    api("androidx.core:core:1.1.0-rc01")
+    api(project(":core:core"))
     implementation("androidx.collection:collection:1.1.0")
 
     androidTestImplementation(JUNIT)
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/drawerlayout/build.gradle b/drawerlayout/build.gradle
index 96e9323..7caf70d 100644
--- a/drawerlayout/build.gradle
+++ b/drawerlayout/build.gradle
@@ -28,5 +28,4 @@
     mavenGroup = LibraryGroups.DRAWERLAYOUT
     inceptionYear = "2018"
     description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later."
-    failOnDeprecationWarnings = false
 }
diff --git a/drawerlayout/src/main/java/androidx/drawerlayout/widget/DrawerLayout.java b/drawerlayout/src/main/java/androidx/drawerlayout/widget/DrawerLayout.java
index 6954d5c..a621870 100644
--- a/drawerlayout/src/main/java/androidx/drawerlayout/widget/DrawerLayout.java
+++ b/drawerlayout/src/main/java/androidx/drawerlayout/widget/DrawerLayout.java
@@ -2464,9 +2464,6 @@
                 AccessibilityNodeInfoCompat src) {
             final Rect rect = mTmpRect;
 
-            src.getBoundsInParent(rect);
-            dest.setBoundsInParent(rect);
-
             src.getBoundsInScreen(rect);
             dest.setBoundsInScreen(rect);
 
diff --git a/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentViewModelLazy.kt b/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentViewModelLazy.kt
index 3566fc2..f67b19a 100644
--- a/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentViewModelLazy.kt
+++ b/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentViewModelLazy.kt
@@ -30,7 +30,7 @@
  * Returns a property delegate to access [ViewModel] by **default** scoped to this [Fragment]:
  * ```
  * class MyFragment : Fragment() {
- *     val viewmodel: NYViewModel by viewmodels()
+ *     val viewmodel: MYViewModel by viewmodels()
  * }
  * ```
  *
@@ -94,4 +94,4 @@
         AndroidViewModelFactory.getInstance(application)
     }
     return ViewModelLazy(viewModelClass, storeProducer, factoryPromise)
-}
\ No newline at end of file
+}
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..435f3c9 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,16 @@
                     }
 
                     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 (!onDestroyViewCalled) {
+                            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/main/java/androidx/fragment/app/FragmentManager.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
index 3eab37a..d4bb8f7 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
@@ -1341,13 +1341,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 +1360,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 +1478,7 @@
                         public void run() {
                             if (fragment.getAnimatingAway() != null) {
                                 fragment.setAnimatingAway(null);
+                                destroyFragmentView(fragment);
                                 moveToState(fragment, fragment.getStateAfterAnimating(), 0, false);
                             }
                         }
@@ -1508,6 +1502,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 +1512,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);
     }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentPagerAdapter.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentPagerAdapter.java
index 221326a..4dcba0f 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentPagerAdapter.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentPagerAdapter.java
@@ -186,12 +186,17 @@
 
     @Override
     public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
+        Fragment fragment = (Fragment) object;
+
         if (mCurTransaction == null) {
             mCurTransaction = mFragmentManager.beginTransaction();
         }
         if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
-                + " v=" + ((Fragment)object).getView());
-        mCurTransaction.detach((Fragment)object);
+                + " v=" + (fragment.getView()));
+        mCurTransaction.detach(fragment);
+        if (fragment == mCurrentPrimaryItem) {
+            mCurrentPrimaryItem = null;
+        }
     }
 
     @SuppressWarnings({"ReferenceEquality", "deprecation"})
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java
index 4086802..475f011 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java
@@ -218,6 +218,9 @@
         mFragments.set(position, null);
 
         mCurTransaction.remove(fragment);
+        if (fragment == mCurrentPrimaryItem) {
+            mCurrentPrimaryItem = null;
+        }
     }
 
     @Override
diff --git a/fragment/fragment/src/main/res/interpolator/fast_out_extra_slow_in.xml b/fragment/fragment/src/main/res/anim-v21/fast_out_extra_slow_in.xml
similarity index 100%
rename from fragment/fragment/src/main/res/interpolator/fast_out_extra_slow_in.xml
rename to fragment/fragment/src/main/res/anim-v21/fast_out_extra_slow_in.xml
diff --git a/fragment/fragment/src/main/res/interpolator/decelerate_quad.xml b/fragment/fragment/src/main/res/anim/fast_out_extra_slow_in.xml
similarity index 96%
rename from fragment/fragment/src/main/res/interpolator/decelerate_quad.xml
rename to fragment/fragment/src/main/res/anim/fast_out_extra_slow_in.xml
index 4ff4053..c3baa5d 100644
--- a/fragment/fragment/src/main/res/interpolator/decelerate_quad.xml
+++ b/fragment/fragment/src/main/res/anim/fast_out_extra_slow_in.xml
@@ -15,4 +15,4 @@
   limitations under the License.
   -->
 <!--Taken from https://googleplex-android.googlesource.com/platform/frameworks/base/+/HEAD/core/res/res/interpolator/decelerate_quad.xml-->
-<decelerateInterpolator />
\ No newline at end of file
+<decelerateInterpolator/>
diff --git a/fragment/fragment/src/main/res/anim/fragment_close_enter.xml b/fragment/fragment/src/main/res/anim/fragment_close_enter.xml
index 8c7cbb8..0a2d2b9 100644
--- a/fragment/fragment/src/main/res/anim/fragment_close_enter.xml
+++ b/fragment/fragment/src/main/res/anim/fragment_close_enter.xml
@@ -28,6 +28,6 @@
         android:fillEnabled="true"
         android:fillBefore="true"
         android:fillAfter="true"
-        android:interpolator="@interpolator/fast_out_extra_slow_in"
+        android:interpolator="@anim/fast_out_extra_slow_in"
         android:duration="400"/>
 </set>
\ No newline at end of file
diff --git a/fragment/fragment/src/main/res/anim/fragment_close_exit.xml b/fragment/fragment/src/main/res/anim/fragment_close_exit.xml
index d36c1d1..012c886 100644
--- a/fragment/fragment/src/main/res/anim/fragment_close_exit.xml
+++ b/fragment/fragment/src/main/res/anim/fragment_close_exit.xml
@@ -25,7 +25,7 @@
         android:fillEnabled="true"
         android:fillBefore="true"
         android:fillAfter="true"
-        android:interpolator="@interpolator/linear"
+        android:interpolator="@android:anim/linear_interpolator"
         android:startOffset="33"
         android:duration="50"/>
     <scale
@@ -38,6 +38,6 @@
         android:fillEnabled="true"
         android:fillBefore="true"
         android:fillAfter="true"
-        android:interpolator="@interpolator/fast_out_extra_slow_in"
+        android:interpolator="@anim/fast_out_extra_slow_in"
         android:duration="400"/>
 </set>
\ No newline at end of file
diff --git a/fragment/fragment/src/main/res/anim/fragment_fade_enter.xml b/fragment/fragment/src/main/res/anim/fragment_fade_enter.xml
index 2fe3947..8838794 100644
--- a/fragment/fragment/src/main/res/anim/fragment_fade_enter.xml
+++ b/fragment/fragment/src/main/res/anim/fragment_fade_enter.xml
@@ -17,6 +17,6 @@
 
 <!--Taken from https://googleplex-android.googlesource.com/platform/frameworks/base/+/HEAD/core/res/res/anim/fade_in.xml-->
 <alpha xmlns:android="http://schemas.android.com/apk/res/android"
-    android:interpolator="@interpolator/decelerate_quad"
+    android:interpolator="@android:anim/decelerate_interpolator"
     android:fromAlpha="0.0" android:toAlpha="1.0"
     android:duration="@android:integer/config_longAnimTime" />
\ No newline at end of file
diff --git a/fragment/fragment/src/main/res/anim/fragment_fade_exit.xml b/fragment/fragment/src/main/res/anim/fragment_fade_exit.xml
index 462115d..d6c6f2b 100644
--- a/fragment/fragment/src/main/res/anim/fragment_fade_exit.xml
+++ b/fragment/fragment/src/main/res/anim/fragment_fade_exit.xml
@@ -17,7 +17,7 @@
 
 <!--Taken from https://googleplex-android.googlesource.com/platform/frameworks/base/+/HEAD/core/res/res/anim/fade_out.xml-->
 <alpha xmlns:android="http://schemas.android.com/apk/res/android"
-    android:interpolator="@interpolator/accelerate_quad"
+    android:interpolator="@android:anim/accelerate_interpolator"
     android:fromAlpha="1.0"
     android:toAlpha="0.0"
     android:duration="@android:integer/config_mediumAnimTime"
diff --git a/fragment/fragment/src/main/res/anim/fragment_open_enter.xml b/fragment/fragment/src/main/res/anim/fragment_open_enter.xml
index 44065f6..e667dc7 100644
--- a/fragment/fragment/src/main/res/anim/fragment_open_enter.xml
+++ b/fragment/fragment/src/main/res/anim/fragment_open_enter.xml
@@ -25,7 +25,7 @@
         android:fillEnabled="true"
         android:fillBefore="true"
         android:fillAfter="true"
-        android:interpolator="@interpolator/linear"
+        android:interpolator="@android:anim/linear_interpolator"
         android:startOffset="50"
         android:duration="50"/>
     <scale
@@ -38,7 +38,7 @@
         android:fillEnabled="true"
         android:fillBefore="true"
         android:fillAfter="true"
-        android:pathData="@interpolator/fast_out_extra_slow_in"
+        android:pathData="@anim/fast_out_extra_slow_in"
         android:duration="400"
         tools:targetApi="lollipop" />
 </set>
\ No newline at end of file
diff --git a/fragment/fragment/src/main/res/anim/fragment_open_exit.xml b/fragment/fragment/src/main/res/anim/fragment_open_exit.xml
index b8f3116..4ea1ea7 100644
--- a/fragment/fragment/src/main/res/anim/fragment_open_exit.xml
+++ b/fragment/fragment/src/main/res/anim/fragment_open_exit.xml
@@ -25,7 +25,7 @@
         android:fillEnabled="true"
         android:fillBefore="true"
         android:fillAfter="true"
-        android:interpolator="@interpolator/linear"
+        android:interpolator="@android:anim/linear_interpolator"
         android:startOffset="83"
         android:duration="167"/>
     <scale
@@ -38,6 +38,6 @@
         android:fillEnabled="true"
         android:fillBefore="true"
         android:fillAfter="true"
-        android:interpolator="@interpolator/fast_out_extra_slow_in"
+        android:interpolator="@anim/fast_out_extra_slow_in"
         android:duration="400"/>
 </set>
\ No newline at end of file
diff --git a/fragment/fragment/src/main/res/interpolator/accelerate_quad.xml b/fragment/fragment/src/main/res/interpolator/accelerate_quad.xml
deleted file mode 100644
index 082db84..0000000
--- a/fragment/fragment/src/main/res/interpolator/accelerate_quad.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?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.
-  -->
-
-<!--Taken from https://googleplex-android.googlesource.com/platform/frameworks/base/+/HEAD/core/res/res/interpolator/accelerate_quad.xml-->
-<accelerateInterpolator />
\ No newline at end of file
diff --git a/fragment/fragment/src/main/res/interpolator/linear_out_slow_in.xml b/fragment/fragment/src/main/res/interpolator/linear_out_slow_in.xml
deleted file mode 100644
index 02e8c45..0000000
--- a/fragment/fragment/src/main/res/interpolator/linear_out_slow_in.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?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.
-  -->
-<!--Taken from https://googleplex-android.googlesource.com/platform/frameworks/base/+/HEAD/core/res/res/interpolator/linear_out_slow_in.xml-->
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
-    android:controlX1="0"
-    android:controlY1="0"
-    android:controlX2="0.2"
-    android:controlY2="1"/>
\ No newline at end of file
diff --git a/fragment/fragment/src/main/res/values/attrs.xml b/fragment/fragment/src/main/res/values/attrs.xml
index 590cbf8..79e797d 100644
--- a/fragment/fragment/src/main/res/values/attrs.xml
+++ b/fragment/fragment/src/main/res/values/attrs.xml
@@ -20,28 +20,4 @@
         <attr name="android:id" />
         <attr name="android:tag" />
     </declare-styleable>
-
-<!--    Taken from https://googleplex-android.googlesource.com/platform/frameworks/base/+/HEAD/core/res/res/values/attrs.xml-->
-    <declare-styleable name="AccelerateInterpolator">
-        <!-- This is the amount of deceleration to add when easing in. -->
-        <attr name="factor" format="float" />
-    </declare-styleable>
-    <declare-styleable name="DecelerateInterpolator">
-        <!-- This is the amount of acceleration to add when easing out. -->
-        <attr name="factor" />
-    </declare-styleable>
-    <declare-styleable name="PathInterpolator">
-        <!-- The x coordinate of the first control point of the cubic Bezier. -->
-        <attr name="controlX1" format="float" />
-        <!-- The y coordinate of the first control point of the cubic Bezier. -->
-        <attr name="controlY1" format="float" />
-        <!-- The x coordinate of the second control point of the cubic Bezier. -->
-        <attr name="controlX2" format="float" />
-        <!-- The y coordinate of the second control point of the cubic Bezier. -->
-        <attr name="controlY2" format="float" />
-        <!-- The control points defined as a path.
-             When pathData is defined, then both of the control points of the
-             cubic Bezier will be ignored. -->
-        <attr name="pathData"/>
-    </declare-styleable>
 </resources>
\ No newline at end of file
diff --git a/jetifier/jetifier/migration.config b/jetifier/jetifier/migration.config
index 98984f7..6b276ed7 100644
--- a/jetifier/jetifier/migration.config
+++ b/jetifier/jetifier/migration.config
@@ -614,6 +614,10 @@
       "to": "ignore"
     },
     {
+      "from": "androidx/swiperefreshlayout/R(.*)",
+      "to": "ignore"
+    },
+    {
       "from": "androidx/swiperefreshlayout/widget/CircleImageView(.*)",
       "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-compiler/src/tests/kotlin/androidx/lifecycle/ValidCasesTest.kt b/lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/ValidCasesTest.kt
index 109b693..a217af4 100644
--- a/lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/ValidCasesTest.kt
+++ b/lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/ValidCasesTest.kt
@@ -24,8 +24,6 @@
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 import java.io.File
-import java.lang.Exception
-import java.net.URLClassLoader
 import javax.tools.StandardLocation
 
 @RunWith(JUnit4::class)
@@ -120,7 +118,7 @@
     @Test
     fun testJar() {
         JavaSourcesSubject.assertThat(load("foo.DerivedFromJar", ""))
-                .withClasspathFrom(libraryClassLoader())
+                .withClasspath(libraryClasspathFiles())
                 .processedWith(LifecycleProcessor())
                 .compilesWithoutError().and()
                 .generatesSources(load("foo.DerivedFromJar_LifecycleAdapter", "expected"))
@@ -129,7 +127,7 @@
     @Test
     fun testExtendFromJarFailToGenerateAdapter() {
         val compileTester = JavaSourcesSubject.assertThat(load("foo.DerivedFromJar1", ""))
-                .withClasspathFrom(libraryClassLoader())
+                .withClasspath(libraryClasspathFiles())
                 .processedWith(LifecycleProcessor())
                 .compilesWithoutError()
         compileTester.withWarningContaining("Failed to generate an Adapter for")
@@ -151,8 +149,11 @@
         }
     }
 
-    private fun libraryClassLoader(): URLClassLoader {
-        val jarUrl = File("src/tests/test-data/lib/test-library.jar").toURI().toURL()
-        return URLClassLoader(arrayOf(jarUrl), this.javaClass.classLoader)
+    private fun libraryClasspathFiles() =
+        getSystemClasspathFiles() + File("src/tests/test-data/lib/test-library.jar")
+
+    private fun getSystemClasspathFiles(): Set<File> {
+        val pathSeparator = System.getProperty("path.separator")
+        return System.getProperty("java.class.path").split(pathSeparator).map { File(it) }.toSet()
     }
 }
diff --git a/lifecycle/lifecycle-extensions/build.gradle b/lifecycle/lifecycle-extensions/build.gradle
index 754870d..b3fdbed 100644
--- a/lifecycle/lifecycle-extensions/build.gradle
+++ b/lifecycle/lifecycle-extensions/build.gradle
@@ -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-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/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/main/java/androidx/media2/widget/MediaControlView.java b/media2/widget/src/main/java/androidx/media2/widget/MediaControlView.java
index 52ed66e..94373aa 100644
--- a/media2/widget/src/main/java/androidx/media2/widget/MediaControlView.java
+++ b/media2/widget/src/main/java/androidx/media2/widget/MediaControlView.java
@@ -25,6 +25,7 @@
 import android.content.DialogInterface;
 import android.content.res.Resources;
 import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -147,6 +148,10 @@
     private static final int SIZE_TYPE_FULL = 1;
     private static final int SIZE_TYPE_MINIMAL = 2;
 
+    private static final int PLAY_BUTTON_PAUSE = 0;
+    private static final int PLAY_BUTTON_PLAY = 1;
+    private static final int PLAY_BUTTON_REPLAY = 2;
+
     // Int for defining the UX state where all the views (TitleBar, ProgressBar, BottomBar) are
     // all visible.
     private static final int UX_STATE_ALL_VISIBLE = 0;
@@ -883,7 +888,7 @@
             public void onAnimationEnd(Animator animation) {
                 mBasicControls.setVisibility(View.INVISIBLE);
 
-                findControlButton(SIZE_TYPE_FULL, R.id.ffwd).setVisibility(
+                findFullSizedControlButton(R.id.ffwd).setVisibility(
                         mPlayer != null && mPlayer.canSeekForward() ? View.INVISIBLE : View.GONE);
             }
         });
@@ -901,7 +906,7 @@
             public void onAnimationStart(Animator animation) {
                 mBasicControls.setVisibility(View.VISIBLE);
 
-                findControlButton(SIZE_TYPE_FULL, R.id.ffwd).setVisibility(
+                findFullSizedControlButton(R.id.ffwd).setVisibility(
                         mPlayer != null && mPlayer.canSeekForward() ? View.VISIBLE : View.GONE);
             }
 
@@ -983,8 +988,8 @@
                 } else {
                     if (mAdSkipView.getVisibility() == View.VISIBLE) {
                         mAdSkipView.setVisibility(View.GONE);
-                        findControlButton(SIZE_TYPE_FULL, R.id.next).setEnabled(true);
-                        findControlButton(SIZE_TYPE_FULL, R.id.next).clearColorFilter();
+                        findFullSizedControlButton(R.id.next).setEnabled(true);
+                        findFullSizedControlButton(R.id.next).clearColorFilter();
                     }
                 }
             }
@@ -1004,22 +1009,15 @@
     void togglePausePlayState() {
         ensurePlayerIsNotNull();
 
-        ImageButton playPauseButton = findControlButton(mSizeType, R.id.pause);
         if (mPlayer.isPlaying()) {
             mPlayer.pause();
-            playPauseButton.setImageDrawable(
-                    mResources.getDrawable(R.drawable.ic_play_circle_filled));
-            playPauseButton.setContentDescription(
-                    mResources.getString(R.string.mcv2_play_button_desc));
+            updatePlayButton(PLAY_BUTTON_PLAY);
         } else {
             if (mIsShowingReplayButton) {
                 mPlayer.seekTo(0);
             }
             mPlayer.play();
-            playPauseButton.setImageDrawable(
-                    mResources.getDrawable(R.drawable.ic_pause_circle_filled));
-            playPauseButton.setContentDescription(
-                    mResources.getString(R.string.mcv2_pause_button_desc));
+            updatePlayButton(PLAY_BUTTON_PAUSE);
         }
     }
 
@@ -1417,13 +1415,13 @@
         ensurePlayerIsNotNull();
 
         if (mIsAdvertisement) {
-            findControlButton(SIZE_TYPE_FULL, R.id.rew).setVisibility(View.GONE);
-            findControlButton(SIZE_TYPE_FULL, R.id.ffwd).setVisibility(View.GONE);
-            findControlButton(SIZE_TYPE_FULL, R.id.prev).setVisibility(View.GONE);
+            findFullSizedControlButton(R.id.rew).setVisibility(View.GONE);
+            findFullSizedControlButton(R.id.ffwd).setVisibility(View.GONE);
+            findFullSizedControlButton(R.id.prev).setVisibility(View.GONE);
 
-            findControlButton(SIZE_TYPE_FULL, R.id.next).setVisibility(View.VISIBLE);
-            findControlButton(SIZE_TYPE_FULL, R.id.next).setEnabled(false);
-            findControlButton(SIZE_TYPE_FULL, R.id.next).setColorFilter(R.color.gray);
+            findFullSizedControlButton(R.id.next).setVisibility(View.VISIBLE);
+            findFullSizedControlButton(R.id.next).setEnabled(false);
+            findFullSizedControlButton(R.id.next).setColorFilter(R.color.gray);
 
             mTimeView.setVisibility(View.GONE);
             mAdSkipView.setVisibility(View.VISIBLE);
@@ -1432,17 +1430,17 @@
 
             mProgress.setEnabled(false);
         } else {
-            findControlButton(SIZE_TYPE_FULL, R.id.rew).setVisibility(
+            findFullSizedControlButton(R.id.rew).setVisibility(
                     mPlayer.canSeekBackward() ? View.VISIBLE : View.GONE);
-            findControlButton(SIZE_TYPE_FULL, R.id.ffwd).setVisibility(
+            findFullSizedControlButton(R.id.ffwd).setVisibility(
                     mPlayer.canSeekForward() ? View.VISIBLE : View.GONE);
-            findControlButton(SIZE_TYPE_FULL, R.id.prev).setVisibility(
+            findFullSizedControlButton(R.id.prev).setVisibility(
                     mPlayer.canSkipToPrevious() ? View.VISIBLE : View.GONE);
 
-            findControlButton(SIZE_TYPE_FULL, R.id.next).setVisibility(
+            findFullSizedControlButton(R.id.next).setVisibility(
                     mPlayer.canSkipToNext() ? View.VISIBLE : View.GONE);
-            findControlButton(SIZE_TYPE_FULL, R.id.next).setEnabled(true);
-            findControlButton(SIZE_TYPE_FULL, R.id.next).clearColorFilter();
+            findFullSizedControlButton(R.id.next).setEnabled(true);
+            findFullSizedControlButton(R.id.next).clearColorFilter();
 
             mTimeView.setVisibility(View.VISIBLE);
             mAdSkipView.setVisibility(View.GONE);
@@ -1532,8 +1530,22 @@
         mCustomPlaybackSpeedIndex = -1;
     }
 
+    @Nullable
     ImageButton findControlButton(int sizeType, @IdRes int id) {
-        return mTransportControlsMap.get(sizeType).findViewById(id);
+        View transportControl = mTransportControlsMap.get(sizeType);
+        if (transportControl == null) {
+            return null;
+        }
+        return transportControl.findViewById(id);
+    }
+
+    @NonNull
+    ImageButton findFullSizedControlButton(@IdRes int id) {
+        ImageButton button = findControlButton(SIZE_TYPE_FULL, id);
+        if (button == null) {
+            throw new IllegalArgumentException("Couldn't find a view that has the given id");
+        }
+        return button;
     }
 
     /**
@@ -1591,10 +1603,10 @@
         mTimeView.setAlpha(1 - animatedValue);
         mBasicControls.setAlpha(1 - animatedValue);
 
-        int transportControlLeftWidth = findControlButton(SIZE_TYPE_FULL, R.id.pause).getLeft();
+        int transportControlLeftWidth = findFullSizedControlButton(R.id.pause).getLeft();
         int transportControlTranslationX = (-1) * (int) (transportControlLeftWidth * animatedValue);
         mFullTransportControls.setTranslationX(transportControlTranslationX);
-        findControlButton(SIZE_TYPE_FULL, R.id.ffwd).setAlpha(1 - animatedValue);
+        findFullSizedControlButton(R.id.ffwd).setAlpha(1 - animatedValue);
     }
 
     void resetHideCallbacks() {
@@ -1701,34 +1713,20 @@
     }
 
     void updateReplayButton(boolean toBeShown) {
-        ImageButton playPauseButton = findControlButton(mSizeType, R.id.pause);
         ImageButton ffwdButton = findControlButton(mSizeType, R.id.ffwd);
         if (toBeShown) {
             mIsShowingReplayButton = true;
-            if (playPauseButton != null) {
-                playPauseButton.setImageDrawable(
-                        mResources.getDrawable(R.drawable.ic_replay_circle_filled));
-                playPauseButton.setContentDescription(
-                        mResources.getString(R.string.mcv2_replay_button_desc));
-            }
+            updatePlayButton(PLAY_BUTTON_REPLAY);
             if (ffwdButton != null) {
                 ffwdButton.setAlpha(0.5f);
                 ffwdButton.setEnabled(false);
             }
         } else {
             mIsShowingReplayButton = false;
-            if (playPauseButton != null) {
-                if (mPlayer != null && mPlayer.isPlaying()) {
-                    playPauseButton.setImageDrawable(
-                            mResources.getDrawable(R.drawable.ic_pause_circle_filled));
-                    playPauseButton.setContentDescription(
-                            mResources.getString(R.string.mcv2_pause_button_desc));
-                } else {
-                    playPauseButton.setImageDrawable(
-                            mResources.getDrawable(R.drawable.ic_play_circle_filled));
-                    playPauseButton.setContentDescription(
-                            mResources.getString(R.string.mcv2_play_button_desc));
-                }
+            if (mPlayer != null && mPlayer.isPlaying()) {
+                updatePlayButton(PLAY_BUTTON_PAUSE);
+            } else {
+                updatePlayButton(PLAY_BUTTON_PLAY);
             }
             if (ffwdButton != null) {
                 ffwdButton.setAlpha(1.0f);
@@ -1737,6 +1735,29 @@
         }
     }
 
+    void updatePlayButton(int type) {
+        ImageButton playButton = findControlButton(mSizeType, R.id.pause);
+        if (playButton == null) {
+            return;
+        }
+        Drawable drawable;
+        String description;
+        if (type == PLAY_BUTTON_PAUSE) {
+            drawable = mResources.getDrawable(R.drawable.ic_pause_circle_filled);
+            description = mResources.getString(R.string.mcv2_pause_button_desc);
+        } else if (type == PLAY_BUTTON_PLAY) {
+            drawable = mResources.getDrawable(R.drawable.ic_play_circle_filled);
+            description = mResources.getString(R.string.mcv2_play_button_desc);
+        } else if (type == PLAY_BUTTON_REPLAY) {
+            drawable = mResources.getDrawable(R.drawable.ic_replay_circle_filled);
+            description = mResources.getString(R.string.mcv2_replay_button_desc);
+        } else {
+            throw new IllegalArgumentException("unknown type " + type);
+        }
+        playButton.setImageDrawable(drawable);
+        playButton.setContentDescription(description);
+    }
+
     void postDelayedRunnable(Runnable runnable, long interval) {
         if (interval != DISABLE_DELAYED_ANIMATION) {
             postDelayed(runnable, interval);
@@ -1979,7 +2000,6 @@
             //   1) Need to handle case where app customizes playback state behavior when app
             //      activity is resumed.
             //   2) Need to handle case where the media file reaches end of duration.
-            ImageButton playPauseButton = findControlButton(mSizeType, R.id.pause);
             switch (state) {
                 case SessionPlayer.PLAYER_STATE_PLAYING:
                     removeCallbacks(mUpdateProgress);
@@ -1988,20 +2008,14 @@
                     updateReplayButton(false);
                     break;
                 case SessionPlayer.PLAYER_STATE_PAUSED:
-                    playPauseButton.setImageDrawable(
-                            mResources.getDrawable(R.drawable.ic_play_circle_filled));
-                    playPauseButton.setContentDescription(
-                            mResources.getString(R.string.mcv2_play_button_desc));
+                    updatePlayButton(PLAY_BUTTON_PLAY);
                     removeCallbacks(mUpdateProgress);
                     removeCallbacks(mHideMainBars);
                     removeCallbacks(mHideProgressBar);
                     post(mShowAllBars);
                     break;
                 case SessionPlayer.PLAYER_STATE_ERROR:
-                    playPauseButton.setImageDrawable(
-                            mResources.getDrawable(R.drawable.ic_play_circle_filled));
-                    playPauseButton.setContentDescription(
-                            mResources.getString(R.string.mcv2_play_button_desc));
+                    updatePlayButton(PLAY_BUTTON_PLAY);
                     removeCallbacks(mUpdateProgress);
                     if (getWindowToken() != null) {
                         new AlertDialog.Builder(getContext())
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/viewpager2/api/res-1.0.0-beta00.txt b/navigation/navigation-common-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.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/viewpager2/api/res-1.0.0-beta00.txt b/navigation/navigation-common/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.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/viewpager2/api/res-1.0.0-beta00.txt b/navigation/navigation-fragment-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.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/viewpager2/api/res-1.0.0-beta00.txt b/navigation/navigation-fragment/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.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-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/viewpager2/api/res-1.0.0-beta00.txt b/navigation/navigation-runtime-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.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/viewpager2/api/res-1.0.0-beta00.txt b/navigation/navigation-runtime/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.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-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/viewpager2/api/res-1.0.0-beta00.txt b/navigation/navigation-ui-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.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/viewpager2/api/res-1.0.0-beta00.txt b/navigation/navigation-ui/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.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 490e0e7e..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/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/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/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
index 72ba528..4dc8c31 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
@@ -2320,7 +2320,7 @@
      * @param dy Pixels to scroll vertically
      */
     public void smoothScrollBy(@Px int dx, @Px int dy) {
-        smoothScrollBy(dx, dy, null, UNDEFINED_DURATION, false);
+        smoothScrollBy(dx, dy, null);
     }
 
     /**
@@ -2332,7 +2332,7 @@
      *                     {@code null}, RecyclerView will use an internal default interpolator.
      */
     public void smoothScrollBy(@Px int dx, @Px int dy, @Nullable Interpolator interpolator) {
-        smoothScrollBy(dx, dy, interpolator, UNDEFINED_DURATION, false);
+        smoothScrollBy(dx, dy, interpolator, UNDEFINED_DURATION);
     }
 
     /**
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/BaseEntityParserTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt
index 031ddfb..93a6611 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt
@@ -26,6 +26,7 @@
 import com.google.testing.compile.CompileTester
 import com.google.testing.compile.JavaFileObjects
 import com.google.testing.compile.JavaSourcesSubjectFactory
+import java.io.File
 import javax.tools.JavaFileObject
 
 abstract class BaseEntityParserTest {
@@ -46,7 +47,7 @@
         attributes: Map<String, String> = mapOf(),
         baseClass: String = "",
         jfos: List<JavaFileObject> = emptyList(),
-        classLoader: ClassLoader = javaClass.classLoader,
+        classpathFiles: Set<File> = emptySet(),
         handler: (Entity, TestInvocation) -> Unit
     ): CompileTester {
         val attributesReplacement: String
@@ -68,7 +69,11 @@
                         ENTITY_PREFIX.format(attributesReplacement, baseClassReplacement) +
                                 input + ENTITY_SUFFIX
                 ))
-                .withClasspathFrom(classLoader)
+                .apply {
+                    if (classpathFiles.isNotEmpty()) {
+                        withClasspath(classpathFiles)
+                    }
+                }
                 .processedWith(TestProcessor.builder()
                         .forAnnotations(androidx.room.Entity::class,
                                 androidx.room.PrimaryKey::class,
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt
index 24e7a13..f9b9478 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt
@@ -28,6 +28,7 @@
 import com.google.testing.compile.CompileTester
 import com.google.testing.compile.JavaFileObjects
 import com.google.testing.compile.JavaSourcesSubjectFactory
+import java.io.File
 import javax.tools.JavaFileObject
 
 abstract class BaseFtsEntityParserTest {
@@ -50,7 +51,7 @@
         ftsAttributes: Map<String, String> = mapOf(),
         baseClass: String = "",
         jfos: List<JavaFileObject> = emptyList(),
-        classLoader: ClassLoader = javaClass.classLoader,
+        classpathFiles: Set<File> = emptySet(),
         handler: (FtsEntity, TestInvocation) -> Unit
     ): CompileTester {
         val ftsVersion = getFtsVersion().toString()
@@ -74,7 +75,11 @@
                         ENTITY_PREFIX.format(entityAttributesReplacement, ftsVersion,
                                 ftsAttributesReplacement, baseClassReplacement) + input +
                                 ENTITY_SUFFIX))
-                .withClasspathFrom(classLoader)
+                .apply {
+                    if (classpathFiles.isNotEmpty()) {
+                        withClasspath(classpathFiles)
+                    }
+                }
                 .processedWith(TestProcessor.builder()
                         .forAnnotations(androidx.room.Entity::class,
                                 Fts3::class,
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt
index 82e9ca2..b9333aa 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt
@@ -37,6 +37,7 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
+import java.io.File
 
 @RunWith(Parameterized::class)
 class DaoProcessorTest(val enableVerification: Boolean) {
@@ -70,7 +71,7 @@
 
     @Test
     fun testAbstractMethodWithoutQueryInLibraryClass() {
-        val libraryClassLoader = compileLibrarySource(
+        val libraryClasspath = compileLibrarySource(
                 "test.library.MissingAnnotationsBaseDao",
                 """
                 public interface MissingAnnotationsBaseDao {
@@ -79,7 +80,7 @@
                 """)
         singleDao(
                 "@Dao public interface MyDao extends test.library.MissingAnnotationsBaseDao {}",
-                classLoader = libraryClassLoader) { _, _ -> }
+                classpathFiles = libraryClasspath) { _, _ -> }
                 .failsToCompile()
                 .withErrorContaining(ProcessorErrors.INVALID_ANNOTATION_COUNT_IN_DAO_METHOD +
                         " - getFoo() in test.library.MissingAnnotationsBaseDao")
@@ -299,15 +300,18 @@
 
     fun singleDao(
         vararg inputs: String,
-        classLoader: ClassLoader = javaClass.classLoader,
+        classpathFiles: Set<File> = emptySet(),
         handler: (Dao, TestInvocation) -> Unit
-    ):
-            CompileTester {
+    ): CompileTester {
         return Truth.assertAbout(JavaSourcesSubjectFactory.javaSources())
                 .that(listOf(JavaFileObjects.forSourceString("foo.bar.MyDao",
                         DAO_PREFIX + inputs.joinToString("\n")
                 ), COMMON.USER))
-                .withClasspathFrom(classLoader)
+                .apply {
+                    if (classpathFiles.isNotEmpty()) {
+                        withClasspath(classpathFiles)
+                    }
+                }
                 .processedWith(TestProcessor.builder()
                         .forAnnotations(androidx.room.Dao::class,
                                 androidx.room.Entity::class,
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
index 76184a3..3cf518b 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
@@ -48,6 +48,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 import org.mockito.Mockito.mock
+import java.io.File
 import javax.lang.model.element.TypeElement
 import javax.lang.model.type.DeclaredType
 import javax.tools.JavaFileObject
@@ -243,7 +244,7 @@
 
     @Test
     fun detectMissingEntityAnnotationInLibraryClass() {
-        val libraryClassLoader = compileLibrarySource(
+        val libraryClasspath = compileLibrarySource(
                 "test.library.MissingEntityAnnotationPojo",
                 """
                 public class MissingEntityAnnotationPojo {
@@ -258,7 +259,7 @@
                 @Database(entities = {test.library.MissingEntityAnnotationPojo.class}, version = 1)
                 public abstract class MyDb extends RoomDatabase {}
                 """,
-                classLoader = libraryClassLoader) { _, _ ->
+                classpathFiles = libraryClasspath) { _, _ ->
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.ENTITY_MUST_BE_ANNOTATED_WITH_ENTITY +
                         " - test.library.MissingEntityAnnotationPojo")
@@ -266,7 +267,7 @@
 
     @Test
     fun detectMissingDaoAnnotationInLibraryClass() {
-        val libraryClassLoader = compileLibrarySource(
+        val libraryClasspath = compileLibrarySource(
                 "test.library.MissingAnnotationsBaseDao",
                 """
                 public interface MissingAnnotationsBaseDao {
@@ -279,7 +280,7 @@
                 public abstract class MyDb extends RoomDatabase {
                     abstract test.library.MissingAnnotationsBaseDao getBadDao();
                 }
-                """, USER, classLoader = libraryClassLoader) { _, _ ->
+                """, USER, classpathFiles = libraryClasspath) { _, _ ->
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.DAO_MUST_BE_ANNOTATED_WITH_DAO +
                         " - test.library.MissingAnnotationsBaseDao")
@@ -897,7 +898,6 @@
     ): CompileTester {
         return Truth.assertAbout(JavaSourcesSubjectFactory.javaSources())
                 .that(listOf(DB3, BOOK))
-                .withClasspathFrom(javaClass.classLoader)
                 .processedWith(TestProcessor.builder()
                         .forAnnotations(androidx.room.Database::class)
                         .nextRunHandler { invocation ->
@@ -948,7 +948,7 @@
     fun singleDb(
         input: String,
         vararg otherFiles: JavaFileObject,
-        classLoader: ClassLoader = javaClass.classLoader,
+        classpathFiles: Set<File> = emptySet(),
         handler: (Database, TestInvocation) -> Unit
     ): CompileTester {
         return Truth.assertAbout(JavaSourcesSubjectFactory.javaSources())
@@ -956,7 +956,11 @@
                         JavaFileObjects.forSourceString("foo.bar.MyDb",
                         DATABASE_PREFIX + input
                 ))
-                .withClasspathFrom(classLoader)
+                .apply {
+                    if (classpathFiles.isNotEmpty()) {
+                        withClasspath(classpathFiles)
+                    }
+                }
                 .processedWith(TestProcessor.builder()
                         .forAnnotations(androidx.room.Database::class)
                         .nextRunHandler { invocation ->
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt
index e41534d..3aa24e1 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt
@@ -85,7 +85,7 @@
             assertThat(view.query.resultInfo).isNotNull()
             val resultInfo = view.query.resultInfo!!
             assertThat(resultInfo.columns).hasSize(2)
-            assertThat(resultInfo.columns).containsAllOf(
+            assertThat(resultInfo.columns).containsAtLeast(
                     ColumnInfo("id", SQLTypeAffinity.INTEGER),
                     ColumnInfo("name", SQLTypeAffinity.TEXT))
             assertThat(view.viewName).isEqualTo("MyView")
@@ -180,12 +180,10 @@
         input: String,
         jfos: List<JavaFileObject> = ENTITIES,
         verify: Boolean = true,
-        classLoader: ClassLoader = javaClass.classLoader,
         handler: (view: DatabaseView, invocation: TestInvocation) -> Unit
     ): CompileTester {
         return Truth.assertAbout(JavaSourcesSubjectFactory.javaSources())
                 .that(jfos + JavaFileObjects.forSourceString(name, DATABASE_PREFIX + input))
-                .withClasspathFrom(classLoader)
                 .processedWith(TestProcessor.builder()
                         .forAnnotations(
                                 androidx.room.DatabaseView::class,
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt
index c4773e8..4dd648a 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt
@@ -51,6 +51,7 @@
 import org.mockito.Mockito.mock
 import simpleRun
 import toJFO
+import java.io.File
 import javax.lang.model.element.Element
 import javax.tools.JavaFileObject
 
@@ -1494,7 +1495,7 @@
     private fun singleRun(
         code: String,
         vararg jfos: JavaFileObject,
-        classLoader: ClassLoader = javaClass.classLoader,
+        classpathFiles: Set<File> = emptySet(),
         handler: (Pojo, TestInvocation) -> Unit
     ): CompileTester {
         val pojoCode = """
@@ -1505,7 +1506,7 @@
         return singleRunFullClass(
             code = pojoCode,
             jfos = *jfos,
-            classLoader = classLoader,
+            classpathFiles = classpathFiles,
             handler = handler
         )
     }
@@ -1513,12 +1514,12 @@
     private fun singleRunFullClass(
         code: String,
         vararg jfos: JavaFileObject,
-        classLoader: ClassLoader = javaClass.classLoader,
+        classpathFiles: Set<File> = emptySet(),
         handler: (Pojo, TestInvocation) -> Unit
     ): CompileTester {
         val pojoJFO = code.toJFO(MY_POJO.toString())
         val all = (jfos.toList() + pojoJFO).toTypedArray()
-        return simpleRun(*all, classLoader = classLoader) { invocation ->
+        return simpleRun(*all, classpathFiles = classpathFiles) { invocation ->
             handler.invoke(
                 PojoProcessor.createFor(context = invocation.context,
                         element = invocation.typeElement(MY_POJO.toString()),
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 fa2e18e..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, classLoader = javaClass.classLoader) { 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`,
@@ -577,11 +580,13 @@
         name: String,
         input: String,
         original: String,
-        classLoader: ClassLoader = javaClass.classLoader,
         handler: (expanded: String, invocation: TestInvocation) -> Unit
     ): CompileTester {
         val all = ENTITIES + JavaFileObjects.forSourceString(name, DATABASE_PREFIX + input)
-        return simpleRun(*all, classLoader = classLoader) { invocation ->
+        return simpleRun(
+            jfos = *all,
+            options = listOf("-Aroom.expandProjection=true")
+        ) { invocation ->
             val entities = invocation.roundEnv
                 .getElementsAnnotatedWith(androidx.room.Entity::class.java)
                 .map { element ->
@@ -602,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/processor/TableEntityProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt
index c04c795..b9ec119 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt
@@ -76,7 +76,7 @@
 
     @Test
     fun noGetterInLibraryClass() {
-        val libraryClassLoader = compileLibrarySource(
+        val libraryClasspath = compileLibrarySource(
                 "test.library.MissingGetterEntity",
                 """
                 @Entity
@@ -88,7 +88,7 @@
                 """)
         singleEntity("",
                 baseClass = "test.library.MissingGetterEntity",
-                classLoader = libraryClassLoader) { _, _ -> }
+                classpathFiles = libraryClasspath) { _, _ -> }
                 .failsToCompile()
                 .withErrorContaining(ProcessorErrors.CANNOT_FIND_GETTER_FOR_FIELD +
                         " - id in test.library.MissingGetterEntity")
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegateTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegateTest.kt
index ab5ae20..d8446c5 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegateTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegateTest.kt
@@ -32,6 +32,7 @@
 import org.junit.runners.JUnit4
 import simpleRun
 import toJFO
+import java.io.File
 import javax.lang.model.element.ElementKind
 import javax.tools.JavaFileObject
 
@@ -88,7 +89,7 @@
 
     @Test
     fun goodLibraryPojo() {
-        val libraryClassLoader = compileLibrarySources(
+        val libraryClasspath = compileLibrarySources(
             JavaFileObjects.forSourceString(MY_POJO.toString(),
                 """
                     $HEADER
@@ -97,19 +98,9 @@
                     abstract long getArg0();
                     static MyPojo create(long arg0) { return new AutoValue_MyPojo(arg0); }
                     $FOOTER
-                    """),
-            JavaFileObjects.forSourceString(AUTOVALUE_MY_POJO.toString(),
-                """
-                    $AUTO_VALUE_HEADER
-                    @PrimaryKey
-                    private final long arg0;
-                    AutoValue_MyPojo(long arg0) { this.arg0 = arg0; }
-                    @PrimaryKey
-                    long getArg0() { return this.arg0; }
-                    $FOOTER
                     """)
         )
-        simpleRun(classLoader = libraryClassLoader) { invocation ->
+        simpleRun(classpathFiles = libraryClasspath) { invocation ->
                 PojoProcessor.createFor(context = invocation.context,
                     element = invocation.typeElement(MY_POJO.toString()),
                     bindingScope = FieldProcessor.BindingScope.READ_FROM_CURSOR,
@@ -241,7 +232,7 @@
         pojoCode: String,
         autoValuePojoCode: String,
         vararg jfos: JavaFileObject,
-        classLoader: ClassLoader = javaClass.classLoader,
+        classpathFiles: Set<File> = emptySet(),
         handler: (Pojo, TestInvocation) -> Unit
     ): CompileTester {
         return singleRunFullClass(
@@ -256,7 +247,7 @@
                     $FOOTER
                     """,
                 jfos = *jfos,
-                classLoader = classLoader,
+                classpathFiles = classpathFiles,
                 handler = handler
         )
     }
@@ -265,13 +256,13 @@
         pojoCode: String,
         autoValuePojoCode: String,
         vararg jfos: JavaFileObject,
-        classLoader: ClassLoader = javaClass.classLoader,
+        classpathFiles: Set<File> = emptySet(),
         handler: (Pojo, TestInvocation) -> Unit
     ): CompileTester {
         val pojoJFO = pojoCode.toJFO(MY_POJO.toString())
         val autoValuePojoJFO = autoValuePojoCode.toJFO(AUTOVALUE_MY_POJO.toString())
         val all = (jfos.toList() + pojoJFO + autoValuePojoJFO).toTypedArray()
-        return simpleRun(*all, classLoader = classLoader) { invocation ->
+        return simpleRun(*all, classpathFiles = classpathFiles) { invocation ->
             handler.invoke(
                     PojoProcessor.createFor(context = invocation.context,
                             element = invocation.typeElement(MY_POJO.toString()),
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 bcdc08e..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
@@ -23,20 +23,19 @@
 import androidx.room.ext.RoomGuavaTypeNames
 import androidx.room.ext.RoomRxJava2TypeNames
 import androidx.room.ext.RxJava2TypeNames
-import androidx.room.processor.TableEntityProcessor
 import androidx.room.processor.DatabaseViewProcessor
 import androidx.room.processor.QueryInterpreter
+import androidx.room.processor.TableEntityProcessor
 import androidx.room.solver.CodeGenScope
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
 import androidx.room.verifier.DatabaseVerifier
 import androidx.room.writer.ClassWriter
 import com.google.auto.common.MoreElements
-import com.google.common.io.ByteStreams
 import com.google.common.io.Files
 import com.google.common.truth.Truth
+import com.google.common.truth.Truth.assertThat
 import com.google.testing.compile.CompileTester
-import com.google.testing.compile.Compiler.javac
 import com.google.testing.compile.JavaFileObjects
 import com.google.testing.compile.JavaSourcesSubjectFactory
 import com.squareup.javapoet.ClassName
@@ -44,14 +43,14 @@
 import org.mockito.Mockito.doReturn
 import org.mockito.Mockito.mock
 import java.io.File
-import java.io.FileOutputStream
-import java.net.URLClassLoader
-import java.nio.file.Paths
+import java.nio.charset.StandardCharsets.UTF_8
+import java.util.Locale
 import javax.lang.model.element.Element
 import javax.lang.model.type.TypeKind
 import javax.lang.model.type.TypeMirror
 import javax.tools.JavaFileObject
 import javax.tools.StandardLocation
+import javax.tools.ToolProvider.getSystemJavaCompiler
 
 object COMMON {
     val USER by lazy {
@@ -151,12 +150,18 @@
 
 fun simpleRun(
     vararg jfos: JavaFileObject,
-    classLoader: ClassLoader = ClassLoader.getSystemClassLoader(),
+    classpathFiles: Set<File> = emptySet(),
+    options: List<String> = emptyList(),
     f: (TestInvocation) -> Unit
 ): CompileTester {
     return Truth.assertAbout(JavaSourcesSubjectFactory.javaSources())
             .that(jfos.toList() + JavaFileObjects.forSourceLines("Dummy", "final class Dummy {}"))
-            .withClasspathFrom(classLoader)
+            .apply {
+                if (classpathFiles.isNotEmpty()) {
+                    withClasspath(classpathFiles)
+                }
+            }
+            .withCompilerOptions(options)
             .processedWith(TestProcessor.builder()
                     .nextRunHandler {
                         f(it)
@@ -178,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 {
@@ -204,7 +209,7 @@
     return element to type
 }
 
-fun compileLibrarySource(sourceName: String, code: String): ClassLoader {
+fun compileLibrarySource(sourceName: String, code: String): Set<File> {
     val sourceCode = """
         package test.library;
         import androidx.room.*;
@@ -214,25 +219,23 @@
 }
 
 /**
- * Compiles an array of sources and returns a class loader that is able to use the .class files
- * generated by the compilation. This method is useful for creating an environment where the
- * annotation processor has to process compiled classes from a library.
+ * Compiles an array of sources and returns a set of files to be used as classpath pointing
+ * to the .class files generated by the compilation. This method is useful for creating an
+ * environment where the annotation processor has to process compiled classes from a library.
  */
-fun compileLibrarySources(vararg sources: JavaFileObject): ClassLoader {
-    val tempDir = Files.createTempDir()
-    javac().compile(*sources)
-            .generatedFiles().forEach { classFile ->
-                val tempFile = File(tempDir, classFile.toUri().path)
-                Files.createParentDirs(tempFile)
+fun compileLibrarySources(vararg sources: JavaFileObject): Set<File> {
+    val lib = Files.createTempDir()
+    val compiler = getSystemJavaCompiler()
+    val fileManager = compiler.getStandardFileManager(null, Locale.getDefault(), UTF_8)
+    fileManager.setLocation(StandardLocation.CLASS_OUTPUT, listOf(lib))
+    val task = compiler.getTask(null, fileManager, null, emptyList(), null, listOf(*sources))
+    assertThat(task.call()).isTrue()
+    return getSystemClasspathFiles() + lib
+}
 
-                FileOutputStream(tempFile).use { output ->
-                    classFile.openInputStream().use { input ->
-                        ByteStreams.copy(input, output)
-                    }
-                }
-            }
-    val classesPath = Paths.get(tempDir.path, StandardLocation.CLASS_OUTPUT.name).toUri().toURL()
-    return URLClassLoader(arrayOf(classesPath), ClassLoader.getSystemClassLoader())
+private fun getSystemClasspathFiles(): Set<File> {
+    val pathSeparator = System.getProperty("path.separator")
+    return System.getProperty("java.class.path").split(pathSeparator).map { File(it) }.toSet()
 }
 
 fun String.toJFO(qName: String): JavaFileObject = JavaFileObjects.forSourceLines(qName, this)
\ No newline at end of file
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/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/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/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 3d17668..3e54cc5 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
@@ -20,6 +20,7 @@
 import android.widget.Button;
 import android.widget.CheckBox;
 import android.widget.RadioGroup;
+import android.widget.TextView;
 
 import androidx.annotation.NonNull;
 import androidx.biometric.BiometricPrompt;
@@ -41,15 +42,13 @@
             @NonNull CheckBox useCryptoCheckbox,
             @NonNull CheckBox confirmationRequiredCheckbox,
             @NonNull CheckBox deviceCredentialAllowedCheckbox,
-            @NonNull RadioGroup radioGroup) {
+            @NonNull RadioGroup radioGroup,
+            @NonNull Button clearLogButton,
+            @NonNull TextView logView) {
+        super(createKeysButton, authenticateButton, canAuthenticateButton, useCryptoCheckbox,
+                confirmationRequiredCheckbox, deviceCredentialAllowedCheckbox, radioGroup,
+                clearLogButton, logView);
         mActivity = activity;
-        mCreateKeysButton = createKeysButton;
-        mAuthenticateButton = authenticateButton;
-        mCanAuthenticateButton = canAuthenticateButton;
-        mUseCryptoCheckbox = useCryptoCheckbox;
-        mConfirmationRequiredCheckbox = confirmationRequiredCheckbox;
-        mDeviceCredentialAllowedCheckbox = deviceCredentialAllowedCheckbox;
-        mRadioGroup = radioGroup;
     }
 
     @Override
@@ -58,11 +57,7 @@
     }
 
     @Override
-    void onResume() {
-        // Developers should (re)create the BiometricPrompt every time the application is resumed.
-        // This is necessary because it is possible for the executor and callback to be GC'd.
-        // Instantiating the prompt here allows the library to handle things such as configuration
-        // changes.
+    void reconnect() {
         mBiometricPrompt = new BiometricPrompt(mActivity, mAuthenticationCallback, mExecutor);
     }
 }
diff --git a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoActivityHost.java b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoActivityHost.java
index 4e010a7..d0f1d5b 100644
--- a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoActivityHost.java
+++ b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoActivityHost.java
@@ -51,6 +51,8 @@
         final CheckBox deviceCredentialAllowedCheckbox = findViewById(
                 R.id.checkbox_enable_fallback);
         final RadioGroup radioGroup = findViewById(R.id.radio_group);
+        final Button clearLogButton = findViewById(R.id.log_clear);
+        final TextView logView = findViewById(R.id.log_text);
 
         mController = new BiometricPromptDemoActivityController(
                 this,
@@ -60,14 +62,11 @@
                 useCryptoCheckbox,
                 confirmationRequiredCheckbox,
                 deviceCredentialAllowedCheckbox,
-                radioGroup);
+                radioGroup,
+                clearLogButton,
+                logView);
         mController.init(savedInstanceState);
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-        mController.onResume();
+        mController.reconnect();
     }
 
     @Override
diff --git a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoController.java b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoController.java
index df7dca2..438e4eb 100644
--- a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoController.java
+++ b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoController.java
@@ -29,7 +29,7 @@
 import android.widget.Button;
 import android.widget.CheckBox;
 import android.widget.RadioGroup;
-import android.widget.Toast;
+import android.widget.TextView;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -66,6 +66,7 @@
     private static final String TAG = "bio_prompt_demo_control";
 
     private static final String KEY_COUNTER = "saved_counter";
+    private static final String KEY_LOG = "saved_log";
 
     private static final String DEFAULT_KEY_NAME = "default_key";
 
@@ -88,13 +89,14 @@
     private int mCounter;
     private int mNumberFailedAttempts;
 
-    Button mCreateKeysButton;
-    Button mAuthenticateButton;
-    Button mCanAuthenticateButton;
-    CheckBox mUseCryptoCheckbox;
-    CheckBox mConfirmationRequiredCheckbox;
-    CheckBox mDeviceCredentialAllowedCheckbox;
-    RadioGroup mRadioGroup;
+    private Button mCreateKeysButton;
+    private Button mAuthenticateButton;
+    private Button mCanAuthenticateButton;
+    private CheckBox mUseCryptoCheckbox;
+    private CheckBox mConfirmationRequiredCheckbox;
+    private CheckBox mDeviceCredentialAllowedCheckbox;
+    private RadioGroup mRadioGroup;
+    private TextView mLogView;
 
     BiometricPrompt mBiometricPrompt;
 
@@ -103,15 +105,13 @@
             new BiometricPrompt.AuthenticationCallback() {
                 @Override
                 public void onAuthenticationError(int err, @NonNull CharSequence message) {
-                    Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
-                    Log.v(TAG, "Error " + err + ": " + message);
+                    log("onAuthenticationError " + err + ": " + message);
                     mNumberFailedAttempts = 0;
                 }
 
                 @Override
                 public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
-                    Toast.makeText(getApplicationContext(), "Yay, Crypto: "
-                            + result.getCryptoObject(), Toast.LENGTH_SHORT).show();
+                    log("onAuthenticationSucceeded, crypto: " + result.getCryptoObject());
                     mNumberFailedAttempts = 0;
 
                     if (result.getCryptoObject() != null) {
@@ -121,19 +121,16 @@
                                     "hello".getBytes(Charset.defaultCharset()));
                             String message = Arrays.toString(
                                     Base64.encode(encrypted, 0 /* flags */));
-                            Toast.makeText(getApplicationContext(), "Message: " + message,
-                                    Toast.LENGTH_SHORT).show();
+                            log("Message: " + message);
                         } catch (BadPaddingException | IllegalBlockSizeException e) {
-                            Toast.makeText(getApplicationContext(), "Error encrypting",
-                                    Toast.LENGTH_SHORT).show();
+                            log("Error encrypting");
                         }
                     }
                 }
 
                 @Override
                 public void onAuthenticationFailed() {
-                    Toast.makeText(getApplicationContext(), "failed", Toast.LENGTH_SHORT).show();
-                    Log.v(TAG, "onAuthenticationFailed");
+                    log("onAuthenticationFailed");
                     mNumberFailedAttempts++;
 
                     // Cancel authentication after 3 failed attempts to test the cancel() method.
@@ -146,12 +143,44 @@
 
     abstract Context getApplicationContext();
 
-    abstract void onResume();
+    /**
+     * (Re)establish a connection between the host fragment/activity and the BiometricPrompt
+     * library.
+     *
+     * Developers should (re)create the BiometricPrompt every time the activity/fragment is
+     * created. This allows authentication to work across configuration changes. The internal
+     * implementation of the library uses fragments, which can be saved/restored. Instantiating
+     * the library with a new callback and executor early in the fragment/activity lifecycle (e.g.
+     * onCreate or onCreateView) allows the new instance to receive callbacks properly.
+     */
+    abstract void reconnect();
+
+    BiometricPromptDemoController(@NonNull Button createKeysButton,
+            @NonNull Button authenticateButton,
+            @NonNull Button canAuthenticateButton,
+            @NonNull CheckBox useCryptoCheckbox,
+            @NonNull CheckBox confirmationRequiredCheckbox,
+            @NonNull CheckBox deviceCredentialAllowedCheckbox,
+            @NonNull RadioGroup radioGroup,
+            @NonNull Button clearLogButton,
+            @NonNull TextView logView) {
+        mCreateKeysButton = createKeysButton;
+        mAuthenticateButton = authenticateButton;
+        mCanAuthenticateButton = canAuthenticateButton;
+        mUseCryptoCheckbox = useCryptoCheckbox;
+        mConfirmationRequiredCheckbox = confirmationRequiredCheckbox;
+        mDeviceCredentialAllowedCheckbox = deviceCredentialAllowedCheckbox;
+        mRadioGroup = radioGroup;
+        mLogView = logView;
+
+        clearLogButton.setOnClickListener((view1) -> logView.setText(""));
+    }
 
     /** Sets up button callbacks and other state for the biometric prompt demo controller. */
     void init(@Nullable Bundle savedInstanceState) {
         if (savedInstanceState != null) {
             mCounter = savedInstanceState.getInt(KEY_COUNTER);
+            mLogView.setText(savedInstanceState.getCharSequence(KEY_LOG));
         }
 
         try {
@@ -191,8 +220,7 @@
                 default:
                     message = BIOMETRIC_ERROR_UNKNOWN;
             }
-            Toast.makeText(getApplicationContext(), "canAuthenticate : " + message,
-                    Toast.LENGTH_SHORT).show();
+            log("canAuthenticate: " + message);
         });
 
 
@@ -210,6 +238,7 @@
 
     void onSaveInstanceState(@NonNull Bundle outState) {
         outState.putInt(KEY_COUNTER, mCounter);
+        outState.putCharSequence(KEY_LOG, mLogView.getText());
     }
 
     @RequiresApi(Build.VERSION_CODES.M)
@@ -220,14 +249,13 @@
         try {
             createKey(DEFAULT_KEY_NAME, true);
         } catch (RuntimeException e) {
-            Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
+            log(e.getMessage());
         }
     }
 
     private void startAuthentication() {
         if (getMode() == MODE_NONE) {
-            Toast.makeText(getApplicationContext(), "Select a test first", Toast.LENGTH_SHORT)
-                    .show();
+            log("Select a test first");
             return;
         }
 
@@ -269,7 +297,7 @@
                     mBiometricPrompt.authenticate(info, crypto);
                 }
             } catch (RuntimeException e) {
-                Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
+                log(e.getMessage());
                 return;
             } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
                 throw new RuntimeException("Failed to get an instance of Cipher", e);
@@ -371,4 +399,9 @@
                 return MODE_NONE;
         }
     }
+
+    private void log(String s) {
+        Log.d(TAG, s);
+        mLogView.append(s + '\n');
+    }
 }
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 e13ac10..48b3776 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
@@ -20,6 +20,7 @@
 import android.widget.Button;
 import android.widget.CheckBox;
 import android.widget.RadioGroup;
+import android.widget.TextView;
 
 import androidx.annotation.NonNull;
 import androidx.biometric.BiometricPrompt;
@@ -43,16 +44,14 @@
             @NonNull CheckBox useCryptoCheckbox,
             @NonNull CheckBox confirmationRequiredCheckbox,
             @NonNull CheckBox deviceCredentialAllowedCheckbox,
-            @NonNull RadioGroup radioGroup) {
+            @NonNull RadioGroup radioGroup,
+            @NonNull Button clearLogButton,
+            @NonNull TextView logView) {
+        super(createKeysButton, authenticateButton, canAuthenticateButton, useCryptoCheckbox,
+                confirmationRequiredCheckbox, deviceCredentialAllowedCheckbox, radioGroup,
+                clearLogButton, logView);
         mContext = context;
         mFragment = fragment;
-        mCreateKeysButton = createKeysButton;
-        mAuthenticateButton = authenticateButton;
-        mCanAuthenticateButton = canAuthenticateButton;
-        mUseCryptoCheckbox = useCryptoCheckbox;
-        mConfirmationRequiredCheckbox = confirmationRequiredCheckbox;
-        mDeviceCredentialAllowedCheckbox = deviceCredentialAllowedCheckbox;
-        mRadioGroup = radioGroup;
     }
 
     @Override
@@ -61,11 +60,7 @@
     }
 
     @Override
-    void onResume() {
-        // Developers should (re)create the BiometricPrompt every time the fragment is resumed.
-        // This is necessary because it is possible for the executor and callback to be GC'd.
-        // Instantiating the prompt here allows the library to handle things such as configuration
-        // changes.
+    void reconnect() {
         mBiometricPrompt = new BiometricPrompt(mFragment, mAuthenticationCallback, mExecutor);
     }
 }
diff --git a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoFragmentHost.java b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoFragmentHost.java
index 8b9c8a0..939f73c 100644
--- a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoFragmentHost.java
+++ b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoFragmentHost.java
@@ -63,6 +63,8 @@
         final CheckBox deviceCredentialAllowedCheckbox = view.findViewById(
                 R.id.checkbox_enable_fallback);
         final RadioGroup radioGroup = view.findViewById(R.id.radio_group);
+        final Button clearLogButton = view.findViewById(R.id.log_clear);
+        final TextView logView = view.findViewById(R.id.log_text);
 
         mController = new BiometricPromptDemoFragmentController(
                 mContext,
@@ -73,19 +75,15 @@
                 useCryptoCheckbox,
                 confirmationRequiredCheckbox,
                 deviceCredentialAllowedCheckbox,
-                radioGroup);
+                radioGroup,
+                clearLogButton,
+                logView);
         mController.init(savedInstanceState);
-
+        mController.reconnect();
         return view;
     }
 
     @Override
-    public void onResume() {
-        super.onResume();
-        mController.onResume();
-    }
-
-    @Override
     public void onPause() {
         mController.onPause();
         super.onPause();
diff --git a/samples/BiometricDemos/src/main/res/layout/biometric_prompt_demo.xml b/samples/BiometricDemos/src/main/res/layout/biometric_prompt_demo.xml
index 1b42272..008413f 100644
--- a/samples/BiometricDemos/src/main/res/layout/biometric_prompt_demo.xml
+++ b/samples/BiometricDemos/src/main/res/layout/biometric_prompt_demo.xml
@@ -23,18 +23,18 @@
     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="@string/label_choose_host_type" />
+        android:text="@string/label_choose_host_type"/>
 
     <Button
         android:id="@+id/host_in_activity_button"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:text="@string/button_host_in_activity" />
+        android:text="@string/button_host_in_activity"/>
 
     <Button
         android:id="@+id/host_in_fragment_button"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:text="@string/button_host_in_fragment" />
+        android:text="@string/button_host_in_fragment"/>
 
 </LinearLayout>
\ No newline at end of file
diff --git a/samples/BiometricDemos/src/main/res/layout/biometric_prompt_demo_content.xml b/samples/BiometricDemos/src/main/res/layout/biometric_prompt_demo_content.xml
index f201662..a288a29 100644
--- a/samples/BiometricDemos/src/main/res/layout/biometric_prompt_demo_content.xml
+++ b/samples/BiometricDemos/src/main/res/layout/biometric_prompt_demo_content.xml
@@ -24,74 +24,96 @@
     <TextView
         android:id="@+id/host_type_text_view"
         android:layout_width="wrap_content"
-        android:layout_height="wrap_content" />
+        android:layout_height="wrap_content"/>
 
-    <Button
-        android:id="@+id/button_enable_biometric_with_crypto"
+    <ScrollView
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/button_enable_biometric_with_crypto"/>
+        android:layout_height="match_parent">
 
-    <Button
-        android:id="@+id/can_authenticate"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/button_can_authenticate"/>
-
-    <Button
-        android:id="@+id/button_authenticate"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/button_authenticate"/>
-
-    <LinearLayout android:layout_width="match_parent"
-                  android:layout_height="wrap_content"
-                  android:orientation="vertical">
-        <CheckBox
-                android:id="@+id/checkbox_use_crypto"
-                android:layout_weight="1"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/checkbox_text_use_crypto" />
-        <CheckBox
-                android:id="@+id/checkbox_require_confirmation"
-                android:layout_weight="1"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/checkbox_text_require_confirmation"
-                android:checked="true"/>
-        <CheckBox
-                android:id="@+id/checkbox_enable_fallback"
-                android:layout_weight="1"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/checkbox_text_allow_device_credential"/>
-    </LinearLayout>
-
-
-    <RadioGroup
-        android:id="@+id/radio_group"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-
-        <RadioButton
-            android:id="@+id/radio_persist_across_configuration_changes"
-            android:layout_width="wrap_content"
+        <LinearLayout
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:text="@string/radio_text_persist_across_configuration_changes" />
+            android:orientation="vertical">
 
-        <RadioButton
-            android:id="@+id/radio_cancel_on_configuration_change"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="@string/radio_text_cancel_on_configuration_change" />
+            <Button
+                android:id="@+id/button_enable_biometric_with_crypto"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/button_enable_biometric_with_crypto"/>
 
-        <RadioButton
-            android:id="@+id/radio_cancel_after_three_failures"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="@string/radio_text_cancel_after_three_failures" />
+            <Button
+                android:id="@+id/can_authenticate"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/button_can_authenticate"/>
 
-    </RadioGroup>
+            <Button
+                android:id="@+id/button_authenticate"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/button_authenticate"/>
+
+            <LinearLayout android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
+                <CheckBox
+                    android:id="@+id/checkbox_use_crypto"
+                    android:layout_weight="1"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/checkbox_text_use_crypto"/>
+                <CheckBox
+                    android:id="@+id/checkbox_require_confirmation"
+                    android:layout_weight="1"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/checkbox_text_require_confirmation"
+                    android:checked="true"/>
+                <CheckBox
+                    android:id="@+id/checkbox_enable_fallback"
+                    android:layout_weight="1"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/checkbox_text_allow_device_credential"/>
+            </LinearLayout>
+
+            <RadioGroup
+                android:id="@+id/radio_group"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content">
+
+                <RadioButton
+                    android:id="@+id/radio_persist_across_configuration_changes"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/radio_text_persist_across_configuration_changes"/>
+
+                <RadioButton
+                    android:id="@+id/radio_cancel_on_configuration_change"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/radio_text_cancel_on_configuration_change"/>
+
+                <RadioButton
+                    android:id="@+id/radio_cancel_after_three_failures"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/radio_text_cancel_after_three_failures"/>
+            </RadioGroup>
+
+            <Button
+                android:id="@+id/log_clear"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/button_clear_log"/>
+
+            <TextView
+                android:id="@+id/log_text"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"/>
+
+        </LinearLayout>
+
+    </ScrollView>
 
 </LinearLayout>
diff --git a/samples/BiometricDemos/src/main/res/values/strings.xml b/samples/BiometricDemos/src/main/res/values/strings.xml
index 5a76abf..7ef3964 100644
--- a/samples/BiometricDemos/src/main/res/values/strings.xml
+++ b/samples/BiometricDemos/src/main/res/values/strings.xml
@@ -23,6 +23,7 @@
     <string name="button_can_authenticate">Can Authenticate</string>
     <string name="button_host_in_activity">Host in a FragmentActivity</string>
     <string name="button_host_in_fragment">Host in a Fragment</string>
+    <string name="button_clear_log">Clear logs</string>
 
     <string name="checkbox_text_use_crypto">Use crypto</string>
     <string name="checkbox_text_require_confirmation">Require confirmation</string>
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..c0bb12f 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")
@@ -257,7 +257,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/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java b/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java
index 9972315..4aa012b 100644
--- a/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java
+++ b/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java
@@ -1578,9 +1578,6 @@
                 AccessibilityNodeInfoCompat src) {
             final Rect rect = mTmpRect;
 
-            src.getBoundsInParent(rect);
-            dest.setBoundsInParent(rect);
-
             src.getBoundsInScreen(rect);
             dest.setBoundsInScreen(rect);
 
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/viewpager2/api/res-1.0.0-beta00.txt b/sqlite/sqlite-framework/api/res-2.1.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.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/viewpager2/api/res-1.0.0-beta00.txt b/sqlite/sqlite-ktx/api/res-2.1.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.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/viewpager2/api/res-1.0.0-beta00.txt b/sqlite/sqlite/api/res-2.1.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.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/swiperefreshlayout/src/androidTest/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayoutTest.java b/swiperefreshlayout/src/androidTest/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayoutTest.java
index de81eb0..caf7544 100644
--- a/swiperefreshlayout/src/androidTest/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayoutTest.java
+++ b/swiperefreshlayout/src/androidTest/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayoutTest.java
@@ -29,6 +29,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.view.ContextThemeWrapper;
 import android.view.View;
 
 import androidx.swiperefreshlayout.test.R;
@@ -100,6 +101,28 @@
     }
 
     @Test
+    @SmallTest
+    public void testStyles_setBackgroundColor() {
+        mSwipeRefresh.setProgressBackgroundColorSchemeColor(0xFFFBFBFB);
+        assertEquals(mSwipeRefresh.mCircleView.getBackgroundColor(), 0xFFFBFBFB);
+    }
+
+    @Test
+    @SmallTest
+    public void testStyles_defaultBackgroundColor() {
+        assertEquals(mSwipeRefresh.mCircleView.getBackgroundColor(), 0xFFFAFAFA);
+    }
+
+    @Test
+    @SmallTest
+    public void testStyles_backgroundColor() {
+        ContextThemeWrapper newContext = new ContextThemeWrapper(
+                mSwipeRefresh.getContext(), R.style.TestActivityThemeWithBackground);
+        SwipeRefreshLayout swipeRefreshLayout = new SwipeRefreshLayout(newContext);
+        assertEquals(swipeRefreshLayout.mCircleView.getBackgroundColor(), 0xFF808080);
+    }
+
+    @Test
     @LargeTest
     public void testSwipeDownToRefresh() throws Throwable {
         assertFalse(mSwipeRefresh.isRefreshing());
@@ -114,13 +137,16 @@
         float density = mSwipeRefresh.getResources().getDisplayMetrics().density;
         assertEquals((int) (SwipeRefreshLayout.CIRCLE_DIAMETER * density),
                 mSwipeRefresh.getProgressCircleDiameter());
-        onView(withId(R.id.swipe_refresh)).perform(SwipeRefreshLayoutActions.setSize(SwipeRefreshLayout.LARGE));
+        onView(withId(R.id.swipe_refresh)).perform(
+                SwipeRefreshLayoutActions.setSize(SwipeRefreshLayout.LARGE));
         assertEquals((int) (SwipeRefreshLayout.CIRCLE_DIAMETER_LARGE * density),
                 mSwipeRefresh.getProgressCircleDiameter());
-        onView(withId(R.id.swipe_refresh)).perform(SwipeRefreshLayoutActions.setSize(SwipeRefreshLayout.DEFAULT));
+        onView(withId(R.id.swipe_refresh)).perform(
+                SwipeRefreshLayoutActions.setSize(SwipeRefreshLayout.DEFAULT));
         assertEquals((int) (SwipeRefreshLayout.CIRCLE_DIAMETER * density),
                 mSwipeRefresh.getProgressCircleDiameter());
-        onView(withId(R.id.swipe_refresh)).perform(SwipeRefreshLayoutActions.setSize(SwipeRefreshLayout.DEFAULT));
+        onView(withId(R.id.swipe_refresh)).perform(
+                SwipeRefreshLayoutActions.setSize(SwipeRefreshLayout.DEFAULT));
         onView(withId(R.id.swipe_refresh)).perform(SwipeRefreshLayoutActions.setSize(INVALID_SIZE));
         assertEquals((int) (SwipeRefreshLayout.CIRCLE_DIAMETER * density),
                 mSwipeRefresh.getProgressCircleDiameter());
diff --git a/swiperefreshlayout/src/androidTest/res/values/styles.xml b/swiperefreshlayout/src/androidTest/res/values/styles.xml
index 0e0cb3d..da27ddf 100644
--- a/swiperefreshlayout/src/androidTest/res/values/styles.xml
+++ b/swiperefreshlayout/src/androidTest/res/values/styles.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -17,4 +17,8 @@
     <style name="TestActivityTheme" parent="Theme.AppCompat.Light">
         <item name="android:windowAnimationStyle">@null</item>
     </style>
+
+    <style name="TestActivityThemeWithBackground" parent="TestActivityTheme">
+        <item name="swipeRefreshLayoutProgressSpinnerBackgroundColor">#FF808080</item>
+    </style>
 </resources>
\ No newline at end of file
diff --git a/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/CircleImageView.java b/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/CircleImageView.java
index 9addccd..de9f404 100644
--- a/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/CircleImageView.java
+++ b/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/CircleImageView.java
@@ -16,7 +16,9 @@
 
 package androidx.swiperefreshlayout.widget;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
+import android.content.res.TypedArray;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Paint;
@@ -28,8 +30,8 @@
 import android.view.animation.Animation;
 import android.widget.ImageView;
 
-import androidx.core.content.ContextCompat;
 import androidx.core.view.ViewCompat;
+import androidx.swiperefreshlayout.R;
 
 /**
  * Private class created to work around issues with AnimationListeners being
@@ -38,8 +40,10 @@
  */
 class CircleImageView extends ImageView {
 
-    private static final int KEY_SHADOW_COLOR = 0x1E000000;
+    private static final int DEFAULT_BACKGROUND_COLOR = 0xFFFAFAFA;
     private static final int FILL_SHADOW_COLOR = 0x3D000000;
+    private static final int KEY_SHADOW_COLOR = 0x1E000000;
+
     // PX
     private static final float X_OFFSET = 0f;
     private static final float Y_OFFSET = 1.75f;
@@ -47,23 +51,33 @@
     private static final int SHADOW_ELEVATION = 4;
 
     private Animation.AnimationListener mListener;
-    int mShadowRadius;
+    private int mShadowRadius;
+    private int mBackgroundColor;
 
-    CircleImageView(Context context, int color) {
+    CircleImageView(Context context) {
         super(context);
+
         final float density = getContext().getResources().getDisplayMetrics().density;
         final int shadowYOffset = (int) (density * Y_OFFSET);
         final int shadowXOffset = (int) (density * X_OFFSET);
 
         mShadowRadius = (int) (density * SHADOW_RADIUS);
 
+        // The style attribute is named SwipeRefreshLayout instead of CircleImageView because
+        // CircleImageView is not part of the public api.
+        @SuppressLint("CustomViewStyleable")
+        TypedArray colorArray = getContext().obtainStyledAttributes(R.styleable.SwipeRefreshLayout);
+        mBackgroundColor = colorArray.getColor(
+                R.styleable.SwipeRefreshLayout_swipeRefreshLayoutProgressSpinnerBackgroundColor,
+                DEFAULT_BACKGROUND_COLOR);
+        colorArray.recycle();
+
         ShapeDrawable circle;
         if (elevationSupported()) {
             circle = new ShapeDrawable(new OvalShape());
             ViewCompat.setElevation(this, SHADOW_ELEVATION * density);
         } else {
-            OvalShape oval = new OvalShadow(mShadowRadius);
-            circle = new ShapeDrawable(oval);
+            circle = new ShapeDrawable(new OvalShadow(this, mShadowRadius));
             setLayerType(View.LAYER_TYPE_SOFTWARE, circle.getPaint());
             circle.getPaint().setShadowLayer(mShadowRadius, shadowXOffset, shadowYOffset,
                     KEY_SHADOW_COLOR);
@@ -71,7 +85,7 @@
             // set padding so the inner image sits correctly within the shadow.
             setPadding(padding, padding, padding, padding);
         }
-        circle.getPaint().setColor(color);
+        circle.getPaint().setColor(mBackgroundColor);
         ViewCompat.setBackground(this, circle);
     }
 
@@ -108,28 +122,26 @@
         }
     }
 
-    /**
-     * Update the background color of the circle image view.
-     *
-     * @param colorRes Id of a color resource.
-     */
-    public void setBackgroundColorRes(int colorRes) {
-        setBackgroundColor(ContextCompat.getColor(getContext(), colorRes));
-    }
-
     @Override
     public void setBackgroundColor(int color) {
         if (getBackground() instanceof ShapeDrawable) {
             ((ShapeDrawable) getBackground()).getPaint().setColor(color);
+            mBackgroundColor = color;
         }
     }
 
-    private class OvalShadow extends OvalShape {
-        private RadialGradient mRadialGradient;
-        private Paint mShadowPaint;
+    public int getBackgroundColor() {
+        return mBackgroundColor;
+    }
 
-        OvalShadow(int shadowRadius) {
+    private static class OvalShadow extends OvalShape {
+        private Paint mShadowPaint;
+        private int mShadowRadius;
+        private CircleImageView mCircleImageView;
+
+        OvalShadow(CircleImageView circleImageView, int shadowRadius) {
             super();
+            mCircleImageView = circleImageView;
             mShadowPaint = new Paint();
             mShadowRadius = shadowRadius;
             updateRadialGradient((int) rect().width());
@@ -143,17 +155,20 @@
 
         @Override
         public void draw(Canvas canvas, Paint paint) {
-            final int viewWidth = CircleImageView.this.getWidth();
-            final int viewHeight = CircleImageView.this.getHeight();
-            canvas.drawCircle(viewWidth / 2, viewHeight / 2, viewWidth / 2, mShadowPaint);
-            canvas.drawCircle(viewWidth / 2, viewHeight / 2, viewWidth / 2 - mShadowRadius, paint);
+            final int x = mCircleImageView.getWidth() / 2;
+            final int y = mCircleImageView.getHeight() / 2;
+            canvas.drawCircle(x, y, x, mShadowPaint);
+            canvas.drawCircle(x, y, x - mShadowRadius, paint);
         }
 
         private void updateRadialGradient(int diameter) {
-            mRadialGradient = new RadialGradient(diameter / 2, diameter / 2,
-                    mShadowRadius, new int[] { FILL_SHADOW_COLOR, Color.TRANSPARENT },
-                    null, Shader.TileMode.CLAMP);
-            mShadowPaint.setShader(mRadialGradient);
+            mShadowPaint.setShader(new RadialGradient(
+                    diameter / 2,
+                    diameter / 2,
+                    mShadowRadius,
+                    new int[]{FILL_SHADOW_COLOR, Color.TRANSPARENT},
+                    null,
+                    Shader.TileMode.CLAMP));
         }
     }
 }
diff --git a/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayout.java b/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayout.java
index b104d3f..2d04256 100644
--- a/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayout.java
+++ b/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayout.java
@@ -109,8 +109,6 @@
 
     private static final int ANIMATE_TO_START_DURATION = 200;
 
-    // Default background for the progress spinner
-    private static final int CIRCLE_BG_LIGHT = 0xFFFAFAFA;
     // Default offset in dips from the top of the view to where the progress spinner should stop
     private static final int DEFAULT_CIRCLE_TARGET = 64;
 
@@ -456,7 +454,7 @@
     }
 
     private void createProgressView() {
-        mCircleView = new CircleImageView(getContext(), CIRCLE_BG_LIGHT);
+        mCircleView = new CircleImageView(getContext());
         mProgress = new CircularProgressDrawable(getContext());
         mProgress.setStyle(CircularProgressDrawable.DEFAULT);
         mCircleView.setImageDrawable(mProgress);
diff --git a/swiperefreshlayout/src/main/res-public/values/attrs.xml b/swiperefreshlayout/src/main/res-public/values/attrs.xml
new file mode 100644
index 0000000..1824c9b
--- /dev/null
+++ b/swiperefreshlayout/src/main/res-public/values/attrs.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<!-- Definitions of attributes to be exposed as public -->
+<resources>
+    <public type="attr" name="swipeRefreshLayoutProgressSpinnerBackgroundColor" format="color"/>
+</resources>
\ No newline at end of file
diff --git a/fragment/fragment/src/main/res/interpolator/linear.xml b/swiperefreshlayout/src/main/res/values/attrs.xml
similarity index 70%
copy from fragment/fragment/src/main/res/interpolator/linear.xml
copy to swiperefreshlayout/src/main/res/values/attrs.xml
index 9fa4361..d628dd3 100644
--- a/fragment/fragment/src/main/res/interpolator/linear.xml
+++ b/swiperefreshlayout/src/main/res/values/attrs.xml
@@ -14,5 +14,12 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-<!--Taken from https://googleplex-android.googlesource.com/platform/frameworks/base/+/HEAD/core/res/res/interpolator/linear.xml-->
-<linearInterpolator />
\ No newline at end of file
+
+<resources>
+
+    <declare-styleable name="SwipeRefreshLayout">
+        <!-- Background color for SwipeRefreshLayout progress spinner. -->
+        <attr name="swipeRefreshLayoutProgressSpinnerBackgroundColor" format="color" />
+    </declare-styleable>
+
+</resources>
\ No newline at end of file
diff --git a/ui/integration-tests/benchmark/build.gradle b/ui/integration-tests/benchmark/build.gradle
index 3d0f974..4d8845b 100644
--- a/ui/integration-tests/benchmark/build.gradle
+++ b/ui/integration-tests/benchmark/build.gradle
@@ -28,8 +28,10 @@
 
 dependencies {
     kotlinPlugin project(path: ":compose:compose-compiler", configuration: "embeddablePlugin")
-    androidTestImplementation(project(":ui:integration-tests:test"))
-    androidTestImplementation(project(":benchmark"))
+    implementation(project(":ui:integration-tests:test"))
+    implementation(project(":benchmark"))
+    implementation(KOTLIN_COMPOSE_STDLIB)
+    implementation(JUNIT)
     androidTestImplementation(project(":ui:ui-core"))
     androidTestImplementation(project(":ui:ui-test"))
     androidTestImplementation(project(":ui:ui-material"))
@@ -37,9 +39,7 @@
     androidTestImplementation(project(":ui:ui-framework"))
     androidTestImplementation(project(":compose:compose-runtime"))
     androidTestImplementation 'androidx.test.ext:junit:1.1.0'
-    androidTestImplementation(KOTLIN_COMPOSE_STDLIB)
     androidTestImplementation(TRUTH)
-    androidTestImplementation(JUNIT)
     androidTestImplementation(ANDROIDX_TEST_RULES)
 }
 
@@ -52,6 +52,8 @@
     description = "UI Benchmarks"
 }
 
+android.defaultConfig.minSdkVersion 29 // RenderNode requires 29+
+
 tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
     kotlinOptions {
         useIR = true
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/CheckboxesInRowsBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/CheckboxesInRowsBenchmark.kt
new file mode 100644
index 0000000..dba8ad2
--- /dev/null
+++ b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/CheckboxesInRowsBenchmark.kt
@@ -0,0 +1,103 @@
+/*
+ * 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.benchmark.test
+
+import android.app.Activity
+import androidx.benchmark.BenchmarkRule
+import androidx.test.filters.LargeTest
+import androidx.test.rule.ActivityTestRule
+import androidx.ui.benchmark.measureDrawPerf
+import androidx.ui.benchmark.measureLayoutPerf
+import androidx.ui.benchmark.toggleStateMeasureDraw
+import androidx.ui.benchmark.toggleStateMeasureLayout
+import androidx.ui.benchmark.toggleStateMeasureMeasure
+import androidx.ui.benchmark.toggleStateMeasureRecompose
+import androidx.ui.test.cases.CheckboxesInRowsTestCase
+import androidx.ui.test.DisableTransitions
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Benchmark that runs [CheckboxesInRowsTestCase].
+ */
+@LargeTest
+@RunWith(Parameterized::class)
+class CheckboxesInRowsBenchmark(private val numberOfCheckboxes: Int) {
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters
+        fun initParameters(): Array<Any> = arrayOf(1, 10)
+    }
+
+    @get:Rule
+    val benchmarkRule = BenchmarkRule()
+
+    @get:Rule
+    val activityRule = ActivityTestRule(Activity::class.java)
+
+    @get:Rule
+    val disableAnimationRule = DisableTransitions()
+
+    private val activity: Activity get() = activityRule.activity
+
+    @Test
+    fun toggleCheckbox_recompose() {
+        val testCase = CheckboxesInRowsTestCase(activity, numberOfCheckboxes)
+        benchmarkRule.toggleStateMeasureRecompose(activity, testCase) {
+            testCase.toggleState()
+        }
+    }
+
+    @Test
+    fun toggleCheckbox_measure() {
+        val testCase = CheckboxesInRowsTestCase(activity, numberOfCheckboxes)
+        benchmarkRule.toggleStateMeasureMeasure(activity, testCase) {
+            testCase.toggleState()
+        }
+    }
+
+    @Test
+    fun toggleCheckbox_layout() {
+        val testCase = CheckboxesInRowsTestCase(activity, numberOfCheckboxes)
+        benchmarkRule.toggleStateMeasureLayout(activity, testCase) {
+            testCase.toggleState()
+        }
+    }
+
+    @Test
+    fun toggleCheckbox_draw() {
+        val testCase = CheckboxesInRowsTestCase(activity, numberOfCheckboxes)
+        benchmarkRule.toggleStateMeasureDraw(activity, testCase) {
+            testCase.toggleState()
+        }
+    }
+
+    @Test
+    fun layout() {
+        val testCase = CheckboxesInRowsTestCase(activity, numberOfCheckboxes)
+        benchmarkRule.measureLayoutPerf(activity, testCase)
+    }
+
+    @Test
+    fun draw() {
+        val testCase = CheckboxesInRowsTestCase(activity, numberOfCheckboxes)
+        benchmarkRule.measureDrawPerf(activity, testCase)
+    }
+}
\ No newline at end of file
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/ColoredRectBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/ColoredRectBenchmark.kt
deleted file mode 100644
index ff19b8a..0000000
--- a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/ColoredRectBenchmark.kt
+++ /dev/null
@@ -1,72 +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.benchmark.test
-
-import android.app.Activity
-import androidx.benchmark.BenchmarkRule
-import androidx.benchmark.measureRepeated
-import androidx.test.filters.LargeTest
-import androidx.test.rule.ActivityTestRule
-import androidx.ui.test.DisableTransitions
-import androidx.ui.test.RectanglesInColumnTestCase
-import androidx.ui.test.recomposeSyncAssertHadChanges
-import androidx.ui.test.recomposeSyncAssertNoChanges
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
-
-/**
- * Benchmark that runs [RectanglesInColumnTestCase]. Currently we test re-composition time.
- */
-@LargeTest
-@RunWith(Parameterized::class)
-class ColoredRectBenchmark(private val numberOfRectangles: Int) {
-
-    companion object {
-        @JvmStatic
-        @Parameterized.Parameters
-        fun initParameters(): Array<Any> = arrayOf(1, 10)
-    }
-
-    @get:Rule
-    val benchmarkRule = BenchmarkRule()
-
-    @get:Rule
-    val activityRule = ActivityTestRule(Activity::class.java)
-
-    @get:Rule
-    val disableAnimationRule = DisableTransitions()
-
-    @Test
-    fun toggleRectangleColor_recompose() {
-        activityRule.runOnUiThread(object : Runnable {
-            override fun run() {
-                val testCase = RectanglesInColumnTestCase(activityRule.activity, numberOfRectangles)
-                    .apply { runSetup() }
-                testCase.compositionContext.recomposeSyncAssertNoChanges()
-
-                benchmarkRule.measureRepeated {
-                    runWithTimingDisabled {
-                        testCase.toggleState()
-                    }
-                    testCase.compositionContext.recomposeSyncAssertHadChanges()
-                }
-            }
-        })
-    }
-}
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/RectsInColumnBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/RectsInColumnBenchmark.kt
new file mode 100644
index 0000000..b91315b
--- /dev/null
+++ b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/RectsInColumnBenchmark.kt
@@ -0,0 +1,103 @@
+/*
+ * 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.benchmark.test
+
+import android.app.Activity
+import androidx.benchmark.BenchmarkRule
+import androidx.test.filters.LargeTest
+import androidx.test.rule.ActivityTestRule
+import androidx.ui.benchmark.measureDrawPerf
+import androidx.ui.benchmark.measureLayoutPerf
+import androidx.ui.benchmark.toggleStateMeasureDraw
+import androidx.ui.benchmark.toggleStateMeasureLayout
+import androidx.ui.benchmark.toggleStateMeasureMeasure
+import androidx.ui.benchmark.toggleStateMeasureRecompose
+import androidx.ui.test.DisableTransitions
+import androidx.ui.test.cases.RectsInColumnTestCase
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Benchmark that runs [RectsInColumnTestCase].
+ */
+@LargeTest
+@RunWith(Parameterized::class)
+class RectsInColumnBenchmark(private val numberOfRectangles: Int) {
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters
+        fun initParameters(): Array<Any> = arrayOf(1, 10)
+    }
+
+    @get:Rule
+    val benchmarkRule = BenchmarkRule()
+
+    @get:Rule
+    val activityRule = ActivityTestRule(Activity::class.java)
+
+    @get:Rule
+    val disableAnimationRule = DisableTransitions()
+
+    private val activity: Activity get() = activityRule.activity
+
+    @Test
+    fun toggleRectangleColor_recompose() {
+        val testCase = RectsInColumnTestCase(activity, numberOfRectangles)
+        benchmarkRule.toggleStateMeasureRecompose(activity, testCase) {
+            testCase.toggleState()
+        }
+    }
+
+    @Test
+    fun toggleRectangleColor_measure() {
+        val testCase = RectsInColumnTestCase(activity, numberOfRectangles)
+        benchmarkRule.toggleStateMeasureMeasure(activity, testCase) {
+            testCase.toggleState()
+        }
+    }
+
+    @Test
+    fun toggleRectangleColor_layout() {
+        val testCase = RectsInColumnTestCase(activity, numberOfRectangles)
+        benchmarkRule.toggleStateMeasureLayout(activity, testCase) {
+            testCase.toggleState()
+        }
+    }
+
+    @Test
+    fun toggleRectangleColor_draw() {
+        val testCase = RectsInColumnTestCase(activity, numberOfRectangles)
+        benchmarkRule.toggleStateMeasureDraw(activity, testCase) {
+            testCase.toggleState()
+        }
+    }
+
+    @Test
+    fun layout() {
+        val testCase = RectsInColumnTestCase(activity, numberOfRectangles)
+        benchmarkRule.measureLayoutPerf(activity, testCase)
+    }
+
+    @Test
+    fun draw() {
+        val testCase = RectsInColumnTestCase(activity, numberOfRectangles)
+        benchmarkRule.measureDrawPerf(activity, testCase)
+    }
+}
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/RectsInColumnSharedModelBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/RectsInColumnSharedModelBenchmark.kt
new file mode 100644
index 0000000..28fc60a
--- /dev/null
+++ b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/RectsInColumnSharedModelBenchmark.kt
@@ -0,0 +1,103 @@
+/*
+ * 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.benchmark.test
+
+import android.app.Activity
+import androidx.benchmark.BenchmarkRule
+import androidx.test.filters.LargeTest
+import androidx.test.rule.ActivityTestRule
+import androidx.ui.benchmark.measureDrawPerf
+import androidx.ui.benchmark.measureLayoutPerf
+import androidx.ui.benchmark.toggleStateMeasureDraw
+import androidx.ui.benchmark.toggleStateMeasureLayout
+import androidx.ui.benchmark.toggleStateMeasureMeasure
+import androidx.ui.benchmark.toggleStateMeasureRecompose
+import androidx.ui.test.DisableTransitions
+import androidx.ui.test.cases.RectsInColumnSharedModelTestCase
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Benchmark that runs [RectsInColumnSharedModelTestCase].
+ */
+@LargeTest
+@RunWith(Parameterized::class)
+class RectsInColumnSharedModelBenchmark(private val numberOfRectangles: Int) {
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters
+        fun initParameters(): Array<Any> = arrayOf(1, 10)
+    }
+
+    @get:Rule
+    val benchmarkRule = BenchmarkRule()
+
+    @get:Rule
+    val activityRule = ActivityTestRule(Activity::class.java)
+
+    @get:Rule
+    val disableAnimationRule = DisableTransitions()
+
+    private val activity: Activity get() = activityRule.activity
+
+    @Test
+    fun toggleRectangleColor_recompose() {
+        val testCase = RectsInColumnSharedModelTestCase(activity, numberOfRectangles)
+        benchmarkRule.toggleStateMeasureRecompose(activity, testCase) {
+            testCase.toggleState()
+        }
+    }
+
+    @Test
+    fun toggleRectangleColor_measure() {
+        val testCase = RectsInColumnSharedModelTestCase(activity, numberOfRectangles)
+        benchmarkRule.toggleStateMeasureMeasure(activity, testCase) {
+            testCase.toggleState()
+        }
+    }
+
+    @Test
+    fun toggleRectangleColor_layout() {
+        val testCase = RectsInColumnSharedModelTestCase(activity, numberOfRectangles)
+        benchmarkRule.toggleStateMeasureLayout(activity, testCase) {
+            testCase.toggleState()
+        }
+    }
+
+    @Test
+    fun toggleRectangleColor_draw() {
+        val testCase = RectsInColumnSharedModelTestCase(activity, numberOfRectangles)
+        benchmarkRule.toggleStateMeasureDraw(activity, testCase) {
+            testCase.toggleState()
+        }
+    }
+
+    @Test
+    fun layout() {
+        val testCase = RectsInColumnSharedModelTestCase(activity, numberOfRectangles)
+        benchmarkRule.measureLayoutPerf(activity, testCase)
+    }
+
+    @Test
+    fun draw() {
+        val testCase = RectsInColumnSharedModelTestCase(activity, numberOfRectangles)
+        benchmarkRule.measureDrawPerf(activity, testCase)
+    }
+}
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/view/AndroidCheckboxesInLinearLayoutBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/view/AndroidCheckboxesInLinearLayoutBenchmark.kt
new file mode 100644
index 0000000..4c5674e
--- /dev/null
+++ b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/view/AndroidCheckboxesInLinearLayoutBenchmark.kt
@@ -0,0 +1,67 @@
+/*
+ * 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.benchmark.test.view
+
+import android.app.Activity
+import androidx.benchmark.BenchmarkRule
+import androidx.test.filters.LargeTest
+import androidx.test.rule.ActivityTestRule
+import androidx.ui.benchmark.measureDrawPerf
+import androidx.ui.benchmark.measureLayoutPerf
+import androidx.ui.test.DisableTransitions
+import androidx.ui.test.cases.view.AndroidCheckboxesInLinearLayoutTestCase
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Benchmark that runs [AndroidCheckboxesInLinearLayoutTestCase].
+ */
+@LargeTest
+@RunWith(Parameterized::class)
+class AndroidCheckboxesInLinearLayoutBenchmark(private val numberOfCheckboxes: Int) {
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters
+        fun initParameters(): Array<Any> = arrayOf(1, 10)
+    }
+
+    @get:Rule
+    val benchmarkRule = BenchmarkRule()
+
+    @get:Rule
+    val activityRule = ActivityTestRule(Activity::class.java)
+
+    @get:Rule
+    val disableAnimationRule = DisableTransitions()
+
+    @Test
+    fun layout() {
+        val testCase = AndroidCheckboxesInLinearLayoutTestCase(activityRule.activity,
+            numberOfCheckboxes)
+        benchmarkRule.measureLayoutPerf(activityRule.activity, testCase)
+    }
+
+    @Test
+    fun draw() {
+        val testCase = AndroidCheckboxesInLinearLayoutTestCase(activityRule.activity,
+            numberOfCheckboxes)
+        benchmarkRule.measureDrawPerf(activityRule.activity, testCase)
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..9825448
--- /dev/null
+++ b/ui/integration-tests/benchmark/src/main/java/androidx/ui/benchmark/BenchmarksExtensions.kt
@@ -0,0 +1,186 @@
+/*
+ * 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.benchmark
+
+import android.app.Activity
+import android.view.View
+import androidx.benchmark.BenchmarkRule
+import androidx.benchmark.measureRepeated
+import androidx.ui.test.ComposeTestCase
+import androidx.ui.test.TestCase
+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
+
+/**
+ * Measures measure and layout performance of the given testCase by toggling measure constraints.
+ */
+fun BenchmarkRule.measureLayoutPerf(activity: Activity, testCase: TestCase) {
+    activity.runOnUiThreadSync {
+        testCase.runSetup()
+
+        val width = testCase.view.measuredWidth
+        val height = testCase.view.measuredHeight
+        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()
+
+        var lastWidth = testCase.view.measuredWidth
+        var lastHeight: Int
+        measureRepeated {
+            runWithTimingDisabled {
+                if (lastWidth == width) {
+                    lastWidth = width - 10
+                    lastHeight = height - 10
+                } else {
+
+                    lastWidth = width
+                    lastHeight = height
+                }
+                widthSpec =
+                    View.MeasureSpec.makeMeasureSpec(lastWidth, View.MeasureSpec.EXACTLY)
+                heightSpec =
+                    View.MeasureSpec.makeMeasureSpec(lastHeight, View.MeasureSpec.EXACTLY)
+                testCase.requestLayout()
+            }
+            testCase.measureWithSpec(widthSpec, heightSpec)
+            testCase.layout()
+        }
+    }
+}
+
+/**
+ * Measures draw performance of the given testCase by invalidating the view hierarchy.
+ */
+fun BenchmarkRule.measureDrawPerf(activity: Activity, testCase: TestCase) {
+    activity.runOnUiThreadSync {
+        testCase.runSetup()
+
+        measureRepeated {
+            runWithTimingDisabled {
+                testCase.invalidateViews()
+                testCase.prepareDraw()
+            }
+            testCase.draw()
+            runWithTimingDisabled {
+                testCase.finishDraw()
+            }
+        }
+    }
+}
+
+/**
+ *  Measures recomposition time of the hierarchy after changing a state.
+ */
+fun BenchmarkRule.toggleStateMeasureRecompose(
+    activity: Activity,
+    testCase: ComposeTestCase,
+    toggleState: () -> Unit
+) {
+    activity.runOnUiThreadSync {
+        testCase.runSetup()
+        testCase.recomposeSyncAssertNoChanges()
+
+        measureRepeated {
+            runWithTimingDisabled {
+                toggleState()
+            }
+            testCase.recomposeSyncAssertHadChanges()
+        }
+    }
+}
+
+/**
+ *  Measures measure time of the hierarchy after changing a state.
+ */
+fun BenchmarkRule.toggleStateMeasureMeasure(
+    activity: Activity,
+    testCase: ComposeTestCase,
+    toggleState: () -> Unit
+) {
+    activity.runOnUiThreadSync {
+        testCase.runSetup()
+        testCase.recomposeSyncAssertNoChanges()
+
+        measureRepeated {
+            runWithTimingDisabled {
+                toggleState()
+                testCase.recomposeSyncAssertHadChanges()
+                testCase.requestLayout()
+            }
+            testCase.measure()
+        }
+    }
+}
+
+/**
+ *  Measures layout time of the hierarchy after changing a state.
+ */
+fun BenchmarkRule.toggleStateMeasureLayout(
+    activity: Activity,
+    testCase: ComposeTestCase,
+    toggleState: () -> Unit
+) {
+    activity.runOnUiThreadSync {
+        testCase.runSetup()
+        testCase.recomposeSyncAssertNoChanges()
+
+        measureRepeated {
+            runWithTimingDisabled {
+                toggleState()
+                testCase.recomposeSyncAssertHadChanges()
+                testCase.requestLayout()
+                testCase.measure()
+            }
+            testCase.layout()
+        }
+    }
+}
+
+/**
+ *  Measures draw time of the hierarchy after changing a state.
+ */
+fun BenchmarkRule.toggleStateMeasureDraw(
+    activity: Activity,
+    testCase: ComposeTestCase,
+    toggleState: () -> Unit
+) {
+    activity.runOnUiThreadSync {
+        testCase.runSetup()
+        testCase.recomposeSyncAssertNoChanges()
+
+        measureRepeated {
+            runWithTimingDisabled {
+                toggleState()
+                testCase.recomposeSyncAssertHadChanges()
+                testCase.requestLayout()
+                testCase.measure()
+                testCase.layout()
+                testCase.prepareDraw()
+            }
+            testCase.draw()
+            runWithTimingDisabled {
+                testCase.finishDraw()
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/ui/integration-tests/test/build.gradle b/ui/integration-tests/test/build.gradle
index cff4d04..2853179 100644
--- a/ui/integration-tests/test/build.gradle
+++ b/ui/integration-tests/test/build.gradle
@@ -36,6 +36,7 @@
 
     implementation(JUNIT)
     implementation(TRUTH)
+    implementation(ANDROIDX_TEST_RULES)
 
     implementation project(":compose:compose-runtime")
     implementation project(":ui:ui-core")
@@ -43,9 +44,8 @@
     implementation project(":ui:ui-framework")
     implementation project(":ui:ui-layout")
     implementation project(":ui:ui-material")
+    implementation project(":ui:ui-platform")
     implementation project(":ui:ui-test")
-
-    androidTestImplementation(ANDROIDX_TEST_RULES)
 }
 
 androidx {
@@ -57,9 +57,10 @@
     description = "UI Integration Tests"
 }
 
+android.defaultConfig.minSdkVersion 29 // RenderNode requires 29+
+
 tasks.withType(KotlinCompile).all {
     kotlinOptions {
         useIR = true
     }
 }
-
diff --git a/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/ColoredRectTest.kt b/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/CheckboxesInRowsTest.kt
similarity index 63%
copy from ui/integration-tests/test/src/androidTest/java/androidx/ui/test/ColoredRectTest.kt
copy to ui/integration-tests/test/src/androidTest/java/androidx/ui/test/CheckboxesInRowsTest.kt
index f45d6ad..9d7f8a8 100644
--- a/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/ColoredRectTest.kt
+++ b/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/CheckboxesInRowsTest.kt
@@ -17,20 +17,22 @@
 package androidx.ui.test
 
 import android.app.Activity
-import androidx.compose.composer
 import androidx.test.filters.MediumTest
 import androidx.test.rule.ActivityTestRule
+import androidx.ui.test.cases.CheckboxesInRowsTestCase
+import androidx.ui.test.cases.RectsInColumnSharedModelTestCase
+import androidx.ui.test.cases.RectsInColumnTestCase
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
 /**
- * Ensure correctness of [RectanglesInColumnTestCase].
+ * Ensure correctness of [CheckboxesInRowsTestCase].
  */
 @MediumTest
 @RunWith(Parameterized::class)
-class ColoredRectTest(private val numberOfRectangles: Int) {
+class CheckboxesInRowsTest(private val numberOfCheckboxes: Int) {
 
     companion object {
         @JvmStatic
@@ -46,23 +48,12 @@
 
     @Test
     fun toggleRectangleColor_compose() {
-        activityRule.runOnUiThread(object : Runnable {
-            override fun run() {
-                val testCase = RectanglesInColumnTestCase(activityRule.activity, numberOfRectangles)
-                    .apply { runSetup() }
-
-                testCase.compositionContext.recomposeSyncAssertNoChanges()
-
-                // Change state
+        activityRule.runOnUiThreadSync {
+            val testCase = CheckboxesInRowsTestCase(activityRule.activity,
+                numberOfCheckboxes)
+            runComposeTestWithStateToggleAndAssertRecompositions(testCase) {
                 testCase.toggleState()
-
-                // Recompose our changes
-                testCase.compositionContext.recomposeSyncAssertHadChanges()
-
-                // No other compositions should be pending
-                testCase.compositionContext.recomposeSyncAssertNoChanges()
             }
-        })
+        }
     }
-
-}
+}
\ No newline at end of file
diff --git a/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/ColoredRectTest.kt b/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/RectsInColumnSharedModelTest.kt
similarity index 63%
copy from ui/integration-tests/test/src/androidTest/java/androidx/ui/test/ColoredRectTest.kt
copy to ui/integration-tests/test/src/androidTest/java/androidx/ui/test/RectsInColumnSharedModelTest.kt
index f45d6ad..cf724d8 100644
--- a/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/ColoredRectTest.kt
+++ b/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/RectsInColumnSharedModelTest.kt
@@ -17,20 +17,20 @@
 package androidx.ui.test
 
 import android.app.Activity
-import androidx.compose.composer
 import androidx.test.filters.MediumTest
 import androidx.test.rule.ActivityTestRule
+import androidx.ui.test.cases.RectsInColumnSharedModelTestCase
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
 /**
- * Ensure correctness of [RectanglesInColumnTestCase].
+ * Ensure correctness of [RectsInColumnSharedModelTestCase].
  */
 @MediumTest
 @RunWith(Parameterized::class)
-class ColoredRectTest(private val numberOfRectangles: Int) {
+class RectsInColumnSharedModelTest(private val numberOfRectangles: Int) {
 
     companion object {
         @JvmStatic
@@ -46,23 +46,12 @@
 
     @Test
     fun toggleRectangleColor_compose() {
-        activityRule.runOnUiThread(object : Runnable {
-            override fun run() {
-                val testCase = RectanglesInColumnTestCase(activityRule.activity, numberOfRectangles)
-                    .apply { runSetup() }
-
-                testCase.compositionContext.recomposeSyncAssertNoChanges()
-
-                // Change state
+        activityRule.runOnUiThreadSync {
+            val testCase = RectsInColumnSharedModelTestCase(activityRule.activity,
+                numberOfRectangles)
+            runComposeTestWithStateToggleAndAssertRecompositions(testCase) {
                 testCase.toggleState()
-
-                // Recompose our changes
-                testCase.compositionContext.recomposeSyncAssertHadChanges()
-
-                // No other compositions should be pending
-                testCase.compositionContext.recomposeSyncAssertNoChanges()
             }
-        })
+        }
     }
-
-}
+}
\ No newline at end of file
diff --git a/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/ColoredRectTest.kt b/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/RectsInColumnTest.kt
similarity index 63%
rename from ui/integration-tests/test/src/androidTest/java/androidx/ui/test/ColoredRectTest.kt
rename to ui/integration-tests/test/src/androidTest/java/androidx/ui/test/RectsInColumnTest.kt
index f45d6ad..ba8c6e6 100644
--- a/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/ColoredRectTest.kt
+++ b/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/RectsInColumnTest.kt
@@ -17,20 +17,20 @@
 package androidx.ui.test
 
 import android.app.Activity
-import androidx.compose.composer
 import androidx.test.filters.MediumTest
 import androidx.test.rule.ActivityTestRule
+import androidx.ui.test.cases.RectsInColumnTestCase
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
 /**
- * Ensure correctness of [RectanglesInColumnTestCase].
+ * Ensure correctness of [RectsInColumnTestCase].
  */
 @MediumTest
 @RunWith(Parameterized::class)
-class ColoredRectTest(private val numberOfRectangles: Int) {
+class RectsInColumnTest(private val numberOfRectangles: Int) {
 
     companion object {
         @JvmStatic
@@ -46,23 +46,11 @@
 
     @Test
     fun toggleRectangleColor_compose() {
-        activityRule.runOnUiThread(object : Runnable {
-            override fun run() {
-                val testCase = RectanglesInColumnTestCase(activityRule.activity, numberOfRectangles)
-                    .apply { runSetup() }
-
-                testCase.compositionContext.recomposeSyncAssertNoChanges()
-
-                // Change state
+        activityRule.runOnUiThreadSync {
+            val testCase = RectsInColumnTestCase(activityRule.activity, numberOfRectangles)
+            runComposeTestWithStateToggleAndAssertRecompositions(testCase) {
                 testCase.toggleState()
-
-                // Recompose our changes
-                testCase.compositionContext.recomposeSyncAssertHadChanges()
-
-                // No other compositions should be pending
-                testCase.compositionContext.recomposeSyncAssertNoChanges()
             }
-        })
+        }
     }
-
-}
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..c2a3a33
--- /dev/null
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/test/TestCase.kt
@@ -0,0 +1,193 @@
+/*
+ * 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.test
+
+import android.app.Activity
+import android.graphics.Bitmap
+import android.graphics.Canvas
+import android.graphics.Picture
+import android.graphics.RenderNode
+import android.util.DisplayMetrics
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import androidx.compose.CompositionContext
+import androidx.ui.core.AndroidCraneView
+import androidx.ui.core.ComponentNode
+import androidx.ui.core.DrawNode
+import com.google.common.truth.Truth
+import org.junit.Assert
+
+abstract class TestCase(
+    val activity: Activity
+) {
+
+    private val screenWithSpec: Int
+    private val screenHeightSpec: Int
+    private val renderNode = RenderNode("test")
+    private var canvas: Canvas? = null
+
+    init {
+        val displayMetrics = DisplayMetrics()
+        activity.windowManager.defaultDisplay.getMetrics(displayMetrics)
+        val height = displayMetrics.heightPixels
+        val width = displayMetrics.widthPixels
+
+        screenWithSpec = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.AT_MOST)
+        screenHeightSpec = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.AT_MOST)
+    }
+
+    lateinit var view: ViewGroup
+
+    abstract fun runSetup()
+
+    /**
+     * To be run in benchmark.
+     */
+    fun measure() {
+        view.measure(screenWithSpec, screenHeightSpec)
+    }
+
+    /**
+     * To be run in benchmark.
+     */
+    fun measureWithSpec(widthSpec: Int, heightSpec: Int) {
+        view.measure(widthSpec, heightSpec)
+    }
+
+    /**
+     * Do not measure this in benchmark.
+     */
+    fun prepareDraw() {
+        renderNode.setPosition(0, 0, view.width, view.height)
+        canvas = renderNode.beginRecording()
+    }
+
+    /**
+     * To be run in benchmark. Call [prepareDraw] before and [finishDraw] after.
+     */
+    fun draw() {
+        view.draw(canvas)
+    }
+
+    /**
+     * Do not measure this in benchmark.
+     */
+    fun finishDraw() {
+        renderNode.endRecording()
+    }
+
+    /**
+     * Do not measure this in benchmark.
+     */
+    fun drawSlow() {
+        prepareDraw()
+        draw()
+        finishDraw()
+    }
+
+    /**
+     * To be run in benchmark.
+     */
+    fun layout() {
+        view.layout(view.left, view.top, view.right, view.bottom)
+    }
+}
+
+abstract class ComposeTestCase(
+    activity: Activity
+) : TestCase(activity) {
+
+    lateinit var compositionContext: CompositionContext
+}
+
+fun TestCase.assertMeasureSizeIsPositive() {
+    Truth.assertThat(view.measuredWidth).isAtLeast(1)
+    Truth.assertThat(view.measuredHeight).isAtLeast(1)
+}
+
+fun TestCase.invalidateViews() {
+    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) {
+        for (i in 0 until view.childCount) {
+            val child = view.getChildAt(i)
+            invalidateViews(child)
+        }
+    }
+    if (view is AndroidCraneView) {
+        invalidateComponentNodes(view.root)
+    }
+}
+
+private fun invalidateComponentNodes(node: ComponentNode) {
+    if (node is DrawNode) {
+        node.invalidate()
+    }
+    node.visitChildren { child ->
+        invalidateComponentNodes(child)
+    }
+}
+
+/**
+ * Performs recomposition and asserts that there were some pending changes.
+ */
+fun ComposeTestCase.recomposeSyncAssertHadChanges() {
+    val hadChanges = compositionContext.recomposeSync()
+    Assert.assertTrue(
+        "Expected pending changes on recomposition but there were none. Did " +
+                "you forget to call FrameManager.next()?", hadChanges
+    )
+}
+
+/**
+ * Performs recomposition and asserts that there were no pending changes.
+ */
+fun ComposeTestCase.recomposeSyncAssertNoChanges() {
+    val hadChanges = compositionContext.recomposeSync()
+    Assert.assertFalse(
+        "Expected no pending changes on recomposition but there were some.",
+        hadChanges
+    )
+}
+
+/**
+ * This is only for tests debugging purposes.
+ *
+ * Draws the given view into [Picture] and presents it in [ImageView] in the given Activity. This is
+ * useful for one time verification that your benchmark is producing excepted results and doing
+ * useful work.
+ */
+fun TestCase.capturePreviewPictureToActivity() {
+    val picture = Picture()
+    val canvas = picture.beginRecording(view.width, view.height)
+    view.draw(canvas)
+    picture.endRecording()
+    val imageView = ImageView(activity)
+    imageView.setImageBitmap(Bitmap.createBitmap(picture))
+    activity.setContentView(imageView)
+}
\ No newline at end of file
diff --git a/ui/integration-tests/test/src/main/java/androidx/ui/test/TestExecutors.kt b/ui/integration-tests/test/src/main/java/androidx/ui/test/TestExecutors.kt
new file mode 100644
index 0000000..55cb4d1
--- /dev/null
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/test/TestExecutors.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.test
+
+/**
+ * Runs the given test case and toggle its state using the given lambda. Asserts that recomposition
+ * happens and has changes and also asserts that the no more compositions is needed.
+ */
+fun runComposeTestWithStateToggleAndAssertRecompositions(
+    testCase: ComposeTestCase,
+    toggleState: () -> Unit
+) {
+    testCase.runSetup()
+
+    testCase.assertMeasureSizeIsPositive()
+
+    testCase.recomposeSyncAssertNoChanges()
+
+    // Change state
+    toggleState.invoke()
+
+    // Recompose our changes
+    testCase.recomposeSyncAssertHadChanges()
+
+    // No other compositions should be pending
+    testCase.recomposeSyncAssertNoChanges()
+}
\ No newline at end of file
diff --git a/ui/integration-tests/test/src/main/java/androidx/ui/test/TestUtils.kt b/ui/integration-tests/test/src/main/java/androidx/ui/test/TestUtils.kt
index 1ead593..9bfae0d7 100644
--- a/ui/integration-tests/test/src/main/java/androidx/ui/test/TestUtils.kt
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/test/TestUtils.kt
@@ -16,15 +16,14 @@
 
 package androidx.ui.test
 
-import androidx.compose.composer
 import android.app.Activity
+import androidx.compose.composer
 import androidx.compose.Composable
 import androidx.compose.CompositionContext
 import androidx.ui.core.composeIntoActivity
+import androidx.test.rule.ActivityTestRule
 import androidx.ui.material.MaterialTheme
 import androidx.ui.material.surface.Surface
-import org.junit.Assert.assertFalse
-import org.junit.Assert.assertTrue
 
 fun ComposeMaterialIntoActivity(
     activity: Activity,
@@ -39,20 +38,20 @@
     }
 }
 
-/**
- * Performs recomposition and asserts that there were some pending changes.
- */
-fun CompositionContext.recomposeSyncAssertHadChanges() {
-    val hadChanges = recomposeSync()
-    assertTrue("Expected pending changes on recomposition but there were none. Did " +
-            "you forget to call FrameManager.next()?", hadChanges)
+fun <T : Activity> ActivityTestRule<T>.runOnUiThreadSync(action: () -> Unit) {
+    // Workaround for lambda bug in IR
+    runOnUiThread(object : Runnable {
+        override fun run() {
+            action.invoke()
+        }
+    })
 }
 
-/**
- * Performs recomposition and asserts that there were no pending changes.
- */
-fun CompositionContext.recomposeSyncAssertNoChanges() {
-    val hadChanges = recomposeSync()
-    assertFalse("Expected no pending changes on recomposition but there were some.",
-        hadChanges)
+fun Activity.runOnUiThreadSync(action: () -> Unit) {
+    // Workaround for lambda bug in IR
+    runOnUiThread(object : Runnable {
+        override fun run() {
+            action.invoke()
+        }
+    })
 }
\ No newline at end of file
diff --git a/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/CheckboxesInRowsTestCase.kt b/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/CheckboxesInRowsTestCase.kt
new file mode 100644
index 0000000..368b2a8
--- /dev/null
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/CheckboxesInRowsTestCase.kt
@@ -0,0 +1,87 @@
+/*
+ * 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.test.cases
+
+import android.app.Activity
+import androidx.compose.composer
+import androidx.compose.Composable
+import androidx.compose.FrameManager
+import androidx.compose.State
+import androidx.compose.state
+import androidx.compose.unaryPlus
+import androidx.ui.core.Text
+import androidx.ui.layout.Align
+import androidx.ui.layout.Alignment
+import androidx.ui.layout.Column
+import androidx.ui.layout.FlexRow
+import androidx.ui.material.Checkbox
+import androidx.ui.test.ComposeMaterialIntoActivity
+import androidx.ui.test.ComposeTestCase
+
+/**
+ * Test case that puts the given amount of checkboxes into a column of rows and makes changes by
+ * toggling the first checkbox.
+ */
+class CheckboxesInRowsTestCase(
+    activity: Activity,
+    private val amountOfCheckboxes: Int
+) : ComposeTestCase(activity) {
+
+    private val states = mutableListOf<State<Boolean>>()
+
+    override fun runSetup() {
+        compositionContext = ComposeMaterialIntoActivity(activity) {
+            Column {
+                repeat(amountOfCheckboxes) {
+                    FlexRow {
+                        inflexible {
+                            Text(text = "Check Me!")
+                        }
+                        expanded(1f) {
+                            Align(alignment = Alignment.CenterRight) {
+                                CheckboxWithState()
+                            }
+                        }
+                    }
+                }
+            }
+        }!!
+        FrameManager.nextFrame()
+
+        view = activity.findViewById(android.R.id.content)
+
+        measure()
+        layout()
+        drawSlow()
+    }
+
+    fun toggleState() {
+        val state = states.first()
+        state.value = !state.value
+        FrameManager.nextFrame()
+    }
+
+    @Composable
+    fun CheckboxWithState() {
+        val state = +state { false }
+        states.add(state)
+        Checkbox(
+            checked = state.value,
+            onCheckedChange = { state.value = !state.value }
+        )
+    }
+}
diff --git a/ui/integration-tests/test/src/main/java/androidx/ui/test/RectanglesInColumnTestCase.kt b/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/RectsInColumnSharedModelTestCase.kt
similarity index 75%
rename from ui/integration-tests/test/src/main/java/androidx/ui/test/RectanglesInColumnTestCase.kt
rename to ui/integration-tests/test/src/main/java/androidx/ui/test/cases/RectsInColumnSharedModelTestCase.kt
index 9b9047e..434fa7e 100644
--- a/ui/integration-tests/test/src/main/java/androidx/ui/test/RectanglesInColumnTestCase.kt
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/RectsInColumnSharedModelTestCase.kt
@@ -14,34 +14,37 @@
  * limitations under the License.
  */
 
-package androidx.ui.test
+package androidx.ui.test.cases
 
-import androidx.compose.composer
 import android.app.Activity
-import androidx.compose.CompositionContext
+import androidx.compose.composer
 import androidx.compose.FrameManager
 import androidx.compose.Model
 import androidx.ui.core.dp
 import androidx.ui.foundation.ColoredRect
 import androidx.ui.graphics.Color
 import androidx.ui.layout.Column
+import androidx.ui.test.ComposeMaterialIntoActivity
+import androidx.ui.test.ComposeTestCase
 
 @Model
-class RectanglesInColumnTestCaseColorModel(var color: Color)
+private class RectanglesInColumnTestCaseColorModel(var color: Color)
 
 /**
  * Test case that puts the given amount of rectangles into a column layout and makes changes by
  * modifying the color used in the model.
+ *
+ * Note: Rectangle are created in for loop that reference a single model. Currently it will happen
+ * that the whole loop has to be re-run when model changes.
  */
-class RectanglesInColumnTestCase(
-    private val activity: Activity,
+class RectsInColumnSharedModelTestCase(
+    activity: Activity,
     private val amountOfRectangles: Int
-) {
+) : ComposeTestCase(activity) {
 
     private val model = RectanglesInColumnTestCaseColorModel(Color.Black)
-    lateinit var compositionContext: CompositionContext
 
-    fun runSetup() {
+    override fun runSetup() {
         compositionContext = ComposeMaterialIntoActivity(activity) {
             Column {
                 repeat(amountOfRectangles) { i ->
@@ -54,6 +57,12 @@
             }
         }!!
         FrameManager.nextFrame()
+
+        view = activity.findViewById(android.R.id.content)
+
+        measure()
+        layout()
+        drawSlow()
     }
 
     fun toggleState() {
diff --git a/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/RectsInColumnTestCase.kt b/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/RectsInColumnTestCase.kt
new file mode 100644
index 0000000..2686f8b
--- /dev/null
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/RectsInColumnTestCase.kt
@@ -0,0 +1,79 @@
+/*
+ * 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.test.cases
+
+import android.app.Activity
+import androidx.compose.composer
+import androidx.compose.Composable
+import androidx.compose.FrameManager
+import androidx.compose.State
+import androidx.compose.state
+import androidx.compose.unaryPlus
+import androidx.ui.foundation.ColoredRect
+import androidx.ui.core.dp
+import androidx.ui.graphics.Color
+import androidx.ui.layout.Column
+import androidx.ui.test.ComposeMaterialIntoActivity
+import androidx.ui.test.ComposeTestCase
+
+/**
+ * Test case that puts the given amount of rectangles into a column layout and makes changes by
+ * modifying the color used in the model.
+ *
+ * Note: Each rectangle has its own model so changes should always affect only the first one.
+ */
+class RectsInColumnTestCase(
+    activity: Activity,
+    private val amountOfRectangles: Int
+) : ComposeTestCase(activity) {
+
+    private val states = mutableListOf<State<Color>>()
+
+    override fun runSetup() {
+        compositionContext = ComposeMaterialIntoActivity(activity) {
+            Column {
+                repeat(amountOfRectangles) {
+                    ColoredRectWithModel()
+                }
+            }
+        }!!
+        FrameManager.nextFrame()
+
+        view = activity.findViewById(android.R.id.content)
+
+        measure()
+        layout()
+        drawSlow()
+    }
+
+    fun toggleState() {
+        val state = states.first()
+        if (state.value == Color.Purple) {
+            state.value = Color.Blue
+        } else {
+            state.value = Color.Purple
+        }
+        FrameManager.nextFrame()
+    }
+
+    @Composable
+    fun ColoredRectWithModel() {
+        val state = +state { Color.Black }
+        states.add(state)
+        ColoredRect(color = state.value, width = 100.dp, height = 50.dp)
+    }
+}
\ No newline at end of file
diff --git a/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/view/AndroidCheckboxesInLinearLayoutTestCase.kt b/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/view/AndroidCheckboxesInLinearLayoutTestCase.kt
new file mode 100644
index 0000000..e12d6fc
--- /dev/null
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/view/AndroidCheckboxesInLinearLayoutTestCase.kt
@@ -0,0 +1,88 @@
+/*
+ * 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.test.cases.view
+
+import android.app.Activity
+import android.view.View
+import android.view.ViewGroup
+import android.widget.CheckBox
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.ui.test.R
+import androidx.ui.test.TestCase
+
+/**
+ * Version of [CheckboxesInRowsTestCase] using Android views.
+ */
+class AndroidCheckboxesInLinearLayoutTestCase(
+    activity: Activity,
+    private val amountOfCheckboxes: Int
+) : TestCase(activity) {
+
+    private val checkboxes = mutableListOf<CheckBox>()
+
+    override fun runSetup() {
+        val column = LinearLayout(activity)
+        column.orientation = LinearLayout.VERTICAL
+        column.layoutParams = ViewGroup.LayoutParams(
+            ViewGroup.LayoutParams.MATCH_PARENT,
+            ViewGroup.LayoutParams.WRAP_CONTENT
+        )
+        column.id = R.id.normal
+        repeat(amountOfCheckboxes) {
+            val row = LinearLayout(activity)
+            row.orientation = LinearLayout.HORIZONTAL
+            row.layoutParams = LinearLayout.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT
+            )
+            val text = TextView(activity)
+            text.text = "Check Me!"
+            text.layoutParams = LinearLayout.LayoutParams(
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT
+            )
+            val checkbox = CheckBox(activity)
+            checkbox.isChecked = false
+            checkbox.layoutParams = LinearLayout.LayoutParams(
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT
+            )
+
+            val space = View(activity)
+            val layoutParams = LinearLayout.LayoutParams(0, 1)
+            layoutParams.weight = 1f
+            space.layoutParams = layoutParams
+            row.addView(text)
+            row.addView(space)
+            row.addView(checkbox)
+            column.addView(row)
+        }
+
+        view = column
+        activity.setContentView(column)
+
+        measure()
+        layout()
+        drawSlow()
+    }
+
+    fun toggleState() {
+        val checkbox = checkboxes.first()
+        checkbox.isChecked = !checkbox.isChecked
+    }
+}
diff --git a/ui/settings.gradle b/ui/settings.gradle
index 3a1973c..c4f0c38 100644
--- a/ui/settings.gradle
+++ b/ui/settings.gradle
@@ -26,7 +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(":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")
diff --git a/ui/ui-foundation/api/1.0.0-alpha01.txt b/ui/ui-foundation/api/1.0.0-alpha01.txt
index f55a2d6..26ee3a8 100644
--- a/ui/ui-foundation/api/1.0.0-alpha01.txt
+++ b/ui/ui-foundation/api/1.0.0-alpha01.txt
@@ -24,6 +24,61 @@
 
 }
 
+package androidx.ui.foundation.gestures {
+
+  public final class AnchorsFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+    ctor public AnchorsFlingConfig(java.util.List<java.lang.Float> animationAnchors, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onAnimationFinished, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder, androidx.animation.DecayAnimation decayAnimation);
+    method public java.util.List<java.lang.Float> component1();
+    method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? component2();
+    method public androidx.animation.AnimationBuilder<java.lang.Float> component3();
+    method public androidx.animation.DecayAnimation component4();
+    method public androidx.ui.foundation.gestures.AnchorsFlingConfig copy(java.util.List<java.lang.Float> animationAnchors, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onAnimationFinished, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder, androidx.animation.DecayAnimation decayAnimation);
+    method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+    method public java.util.List<java.lang.Float> getAnimationAnchors();
+    method public androidx.animation.AnimationBuilder<java.lang.Float> getAnimationBuilder();
+    method public androidx.animation.DecayAnimation getDecayAnimation();
+    method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? getOnAnimationFinished();
+  }
+
+  public final class AnimatedDraggableKt {
+    ctor public AnimatedDraggableKt();
+    method public static void AnimatedDraggable(androidx.ui.foundation.gestures.DragDirection dragDirection, float startValue, float minValue = Float.MIN_VALUE, float maxValue = Float.MAX_VALUE, androidx.ui.foundation.gestures.FlingConfig? flingConfig = null, kotlin.jvm.functions.Function1<? super androidx.animation.BaseAnimatedValue<java.lang.Float>,kotlin.Unit> children);
+  }
+
+  public final class DecayFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+    ctor public DecayFlingConfig(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onFlingFinished, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
+    method public androidx.animation.DecayAnimation component1();
+    method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? component2();
+    method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> component3();
+    method public androidx.ui.foundation.gestures.DecayFlingConfig copy(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onFlingFinished, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
+    method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+    method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> getAdjustTarget();
+    method public androidx.animation.DecayAnimation getDecayAnimation();
+    method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? getOnFlingFinished();
+  }
+
+  public final class DefaultFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+    method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+    field public static final androidx.ui.foundation.gestures.DefaultFlingConfig! INSTANCE;
+  }
+
+  public abstract sealed class DragDirection {
+  }
+
+  public static final class DragDirection.Horizontal extends androidx.ui.foundation.gestures.DragDirection {
+    field public static final androidx.ui.foundation.gestures.DragDirection.Horizontal! INSTANCE;
+  }
+
+  public static final class DragDirection.Vertical extends androidx.ui.foundation.gestures.DragDirection {
+    field public static final androidx.ui.foundation.gestures.DragDirection.Vertical! INSTANCE;
+  }
+
+  public interface FlingConfig {
+    method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+  }
+
+}
+
 package androidx.ui.foundation.selection {
 
   public final class MutuallyExclusiveSetItemKt {
diff --git a/ui/ui-foundation/api/current.txt b/ui/ui-foundation/api/current.txt
index f55a2d6..26ee3a8 100644
--- a/ui/ui-foundation/api/current.txt
+++ b/ui/ui-foundation/api/current.txt
@@ -24,6 +24,61 @@
 
 }
 
+package androidx.ui.foundation.gestures {
+
+  public final class AnchorsFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+    ctor public AnchorsFlingConfig(java.util.List<java.lang.Float> animationAnchors, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onAnimationFinished, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder, androidx.animation.DecayAnimation decayAnimation);
+    method public java.util.List<java.lang.Float> component1();
+    method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? component2();
+    method public androidx.animation.AnimationBuilder<java.lang.Float> component3();
+    method public androidx.animation.DecayAnimation component4();
+    method public androidx.ui.foundation.gestures.AnchorsFlingConfig copy(java.util.List<java.lang.Float> animationAnchors, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onAnimationFinished, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder, androidx.animation.DecayAnimation decayAnimation);
+    method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+    method public java.util.List<java.lang.Float> getAnimationAnchors();
+    method public androidx.animation.AnimationBuilder<java.lang.Float> getAnimationBuilder();
+    method public androidx.animation.DecayAnimation getDecayAnimation();
+    method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? getOnAnimationFinished();
+  }
+
+  public final class AnimatedDraggableKt {
+    ctor public AnimatedDraggableKt();
+    method public static void AnimatedDraggable(androidx.ui.foundation.gestures.DragDirection dragDirection, float startValue, float minValue = Float.MIN_VALUE, float maxValue = Float.MAX_VALUE, androidx.ui.foundation.gestures.FlingConfig? flingConfig = null, kotlin.jvm.functions.Function1<? super androidx.animation.BaseAnimatedValue<java.lang.Float>,kotlin.Unit> children);
+  }
+
+  public final class DecayFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+    ctor public DecayFlingConfig(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onFlingFinished, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
+    method public androidx.animation.DecayAnimation component1();
+    method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? component2();
+    method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> component3();
+    method public androidx.ui.foundation.gestures.DecayFlingConfig copy(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onFlingFinished, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
+    method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+    method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> getAdjustTarget();
+    method public androidx.animation.DecayAnimation getDecayAnimation();
+    method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? getOnFlingFinished();
+  }
+
+  public final class DefaultFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+    method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+    field public static final androidx.ui.foundation.gestures.DefaultFlingConfig! INSTANCE;
+  }
+
+  public abstract sealed class DragDirection {
+  }
+
+  public static final class DragDirection.Horizontal extends androidx.ui.foundation.gestures.DragDirection {
+    field public static final androidx.ui.foundation.gestures.DragDirection.Horizontal! INSTANCE;
+  }
+
+  public static final class DragDirection.Vertical extends androidx.ui.foundation.gestures.DragDirection {
+    field public static final androidx.ui.foundation.gestures.DragDirection.Vertical! INSTANCE;
+  }
+
+  public interface FlingConfig {
+    method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+  }
+
+}
+
 package androidx.ui.foundation.selection {
 
   public final class MutuallyExclusiveSetItemKt {
diff --git a/ui/ui-foundation/api/restricted_1.0.0-alpha01.txt b/ui/ui-foundation/api/restricted_1.0.0-alpha01.txt
index f55a2d6..26ee3a8 100644
--- a/ui/ui-foundation/api/restricted_1.0.0-alpha01.txt
+++ b/ui/ui-foundation/api/restricted_1.0.0-alpha01.txt
@@ -24,6 +24,61 @@
 
 }
 
+package androidx.ui.foundation.gestures {
+
+  public final class AnchorsFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+    ctor public AnchorsFlingConfig(java.util.List<java.lang.Float> animationAnchors, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onAnimationFinished, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder, androidx.animation.DecayAnimation decayAnimation);
+    method public java.util.List<java.lang.Float> component1();
+    method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? component2();
+    method public androidx.animation.AnimationBuilder<java.lang.Float> component3();
+    method public androidx.animation.DecayAnimation component4();
+    method public androidx.ui.foundation.gestures.AnchorsFlingConfig copy(java.util.List<java.lang.Float> animationAnchors, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onAnimationFinished, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder, androidx.animation.DecayAnimation decayAnimation);
+    method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+    method public java.util.List<java.lang.Float> getAnimationAnchors();
+    method public androidx.animation.AnimationBuilder<java.lang.Float> getAnimationBuilder();
+    method public androidx.animation.DecayAnimation getDecayAnimation();
+    method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? getOnAnimationFinished();
+  }
+
+  public final class AnimatedDraggableKt {
+    ctor public AnimatedDraggableKt();
+    method public static void AnimatedDraggable(androidx.ui.foundation.gestures.DragDirection dragDirection, float startValue, float minValue = Float.MIN_VALUE, float maxValue = Float.MAX_VALUE, androidx.ui.foundation.gestures.FlingConfig? flingConfig = null, kotlin.jvm.functions.Function1<? super androidx.animation.BaseAnimatedValue<java.lang.Float>,kotlin.Unit> children);
+  }
+
+  public final class DecayFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+    ctor public DecayFlingConfig(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onFlingFinished, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
+    method public androidx.animation.DecayAnimation component1();
+    method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? component2();
+    method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> component3();
+    method public androidx.ui.foundation.gestures.DecayFlingConfig copy(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onFlingFinished, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
+    method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+    method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> getAdjustTarget();
+    method public androidx.animation.DecayAnimation getDecayAnimation();
+    method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? getOnFlingFinished();
+  }
+
+  public final class DefaultFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+    method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+    field public static final androidx.ui.foundation.gestures.DefaultFlingConfig! INSTANCE;
+  }
+
+  public abstract sealed class DragDirection {
+  }
+
+  public static final class DragDirection.Horizontal extends androidx.ui.foundation.gestures.DragDirection {
+    field public static final androidx.ui.foundation.gestures.DragDirection.Horizontal! INSTANCE;
+  }
+
+  public static final class DragDirection.Vertical extends androidx.ui.foundation.gestures.DragDirection {
+    field public static final androidx.ui.foundation.gestures.DragDirection.Vertical! INSTANCE;
+  }
+
+  public interface FlingConfig {
+    method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+  }
+
+}
+
 package androidx.ui.foundation.selection {
 
   public final class MutuallyExclusiveSetItemKt {
diff --git a/ui/ui-foundation/api/restricted_current.txt b/ui/ui-foundation/api/restricted_current.txt
index f55a2d6..26ee3a8 100644
--- a/ui/ui-foundation/api/restricted_current.txt
+++ b/ui/ui-foundation/api/restricted_current.txt
@@ -24,6 +24,61 @@
 
 }
 
+package androidx.ui.foundation.gestures {
+
+  public final class AnchorsFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+    ctor public AnchorsFlingConfig(java.util.List<java.lang.Float> animationAnchors, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onAnimationFinished, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder, androidx.animation.DecayAnimation decayAnimation);
+    method public java.util.List<java.lang.Float> component1();
+    method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? component2();
+    method public androidx.animation.AnimationBuilder<java.lang.Float> component3();
+    method public androidx.animation.DecayAnimation component4();
+    method public androidx.ui.foundation.gestures.AnchorsFlingConfig copy(java.util.List<java.lang.Float> animationAnchors, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onAnimationFinished, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder, androidx.animation.DecayAnimation decayAnimation);
+    method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+    method public java.util.List<java.lang.Float> getAnimationAnchors();
+    method public androidx.animation.AnimationBuilder<java.lang.Float> getAnimationBuilder();
+    method public androidx.animation.DecayAnimation getDecayAnimation();
+    method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? getOnAnimationFinished();
+  }
+
+  public final class AnimatedDraggableKt {
+    ctor public AnimatedDraggableKt();
+    method public static void AnimatedDraggable(androidx.ui.foundation.gestures.DragDirection dragDirection, float startValue, float minValue = Float.MIN_VALUE, float maxValue = Float.MAX_VALUE, androidx.ui.foundation.gestures.FlingConfig? flingConfig = null, kotlin.jvm.functions.Function1<? super androidx.animation.BaseAnimatedValue<java.lang.Float>,kotlin.Unit> children);
+  }
+
+  public final class DecayFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+    ctor public DecayFlingConfig(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onFlingFinished, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
+    method public androidx.animation.DecayAnimation component1();
+    method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? component2();
+    method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> component3();
+    method public androidx.ui.foundation.gestures.DecayFlingConfig copy(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onFlingFinished, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
+    method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+    method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> getAdjustTarget();
+    method public androidx.animation.DecayAnimation getDecayAnimation();
+    method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? getOnFlingFinished();
+  }
+
+  public final class DefaultFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+    method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+    field public static final androidx.ui.foundation.gestures.DefaultFlingConfig! INSTANCE;
+  }
+
+  public abstract sealed class DragDirection {
+  }
+
+  public static final class DragDirection.Horizontal extends androidx.ui.foundation.gestures.DragDirection {
+    field public static final androidx.ui.foundation.gestures.DragDirection.Horizontal! INSTANCE;
+  }
+
+  public static final class DragDirection.Vertical extends androidx.ui.foundation.gestures.DragDirection {
+    field public static final androidx.ui.foundation.gestures.DragDirection.Vertical! INSTANCE;
+  }
+
+  public interface FlingConfig {
+    method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+  }
+
+}
+
 package androidx.ui.foundation.selection {
 
   public final class MutuallyExclusiveSetItemKt {
diff --git a/ui/ui-foundation/build.gradle b/ui/ui-foundation/build.gradle
index 330c8d8..e2568bd 100644
--- a/ui/ui-foundation/build.gradle
+++ b/ui/ui-foundation/build.gradle
@@ -37,6 +37,7 @@
 
     implementation project(":compose:compose-runtime")
     implementation project(":ui:ui-core")
+    implementation project(":ui:ui-animation")
     implementation project(':ui:ui-framework')
     implementation project(':ui:ui-layout')
     implementation project(':ui:ui-text')
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/AnimatedDraggable.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/AnimatedDraggable.kt
new file mode 100644
index 0000000..a429d5b
--- /dev/null
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/AnimatedDraggable.kt
@@ -0,0 +1,98 @@
+/*
+ * 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.gestures
+
+import androidx.animation.AnimatedFloat
+import androidx.animation.BaseAnimatedValue
+import androidx.compose.Composable
+import androidx.compose.composer
+import androidx.compose.unaryPlus
+import androidx.ui.animation.animatedFloat
+import androidx.ui.core.PxPosition
+import androidx.ui.core.gesture.DragGestureDetector
+import androidx.ui.core.gesture.DragObserver
+import androidx.ui.core.px
+
+/**
+ * Component that provides drag, fling and animation logic for one [Float] value.
+ *
+ * The common usecase for this component is when you need to be able to drag/scroll something
+ * on the screen and also one or more of the following:
+ * 1. Fling support when scrolling/dragging ends with velocity.
+ * 2. Stable anchors points support for dragging value,
+ * e.g. be able to drag between only predefined set of values.
+ * 3. Automatic animation of draggable value, e.g emulate drag by click.
+ *
+ * @see [FlingConfig] to control anchors or fling intensity.
+ *
+ * This component provides high-level API and ownership for [AnimatedFloat]
+ * and returns it as a parameter for its children.
+ *
+ * If you need only drag support without animations, consider using [DragGestureDetector] instead.
+ *
+ * If you need only animations without gesture support, consider using [animatedFloat] instead.
+ *
+ * //TODO: Add sample
+ *
+ * @param dragDirection direction in which drag should be happening
+ * @param startValue value to set as initial for draggable/animating value in this component
+ * @param minValue lower bound for draggable/animating value in this component
+ * @param maxValue upper bound for draggable/animating value in this component
+ * Either [DragDirection.Vertical] or [DragDirection.Horizontal]
+ * @param flingConfig sets behavior of the fling after drag has ended.
+ * Default is null, which means no drag will occur no matter the velocity
+ */
+@Composable
+fun AnimatedDraggable(
+    dragDirection: DragDirection,
+    startValue: Float,
+    minValue: Float = Float.MIN_VALUE,
+    maxValue: Float = Float.MAX_VALUE,
+    flingConfig: FlingConfig? = null,
+    children: @Composable() (BaseAnimatedValue<Float>) -> Unit
+) {
+    val animFloat = (+animatedFloat(startValue)).apply {
+        setBounds(minValue, maxValue)
+    }
+    DragGestureDetector(
+        canDrag = { direction ->
+            dragDirection.isDraggableInDirection(direction, minValue, animFloat.value, maxValue)
+        },
+        dragObserver = object : DragObserver {
+
+            override fun onDrag(dragDistance: PxPosition): PxPosition {
+                val projected = dragDirection.project(dragDistance)
+                val newValue = (animFloat.value + projected).coerceIn(minValue, maxValue)
+                val consumed = newValue - animFloat.value
+                animFloat.snapTo(newValue)
+                val fractionConsumed = if (projected == 0f) 0f else consumed / projected
+                return PxPosition(
+                    dragDirection.xProjection(dragDistance.x).px * fractionConsumed,
+                    dragDirection.yProjection(dragDistance.y).px * fractionConsumed
+                )
+            }
+
+            override fun onStop(velocity: PxPosition) {
+                val projected = dragDirection.project(velocity)
+                flingConfig?.fling(animFloat, projected)
+            }
+        }
+    ) {
+        children(animFloat)
+    }
+}
+
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/DragDirection.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/DragDirection.kt
new file mode 100644
index 0000000..abd6b48
--- /dev/null
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/DragDirection.kt
@@ -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.ui.foundation.gestures
+
+import androidx.ui.core.Direction
+import androidx.ui.core.Px
+import androidx.ui.core.PxPosition
+
+/**
+ * Draggable Direction specifies the direction in which you can drag an [AnimatedDraggable].
+ * It can be either [Horizontal] or [Vertical].
+ */
+sealed class DragDirection {
+
+    // TODO: remove internals for children when b/137357249 is ready
+    internal abstract val xProjection: (Px) -> Float
+    internal abstract val yProjection: (Px) -> Float
+    internal abstract val isDraggableInDirection: (
+        direction: Direction,
+        minValue: Float,
+        currentValue: Float,
+        maxValue: Float
+    ) -> Boolean
+
+    internal open fun project(pos: PxPosition) = xProjection(pos.x) + yProjection(pos.y)
+
+    /**
+     * Horizontal direction of dragging in [AnimatedDraggable].
+     */
+    object Horizontal : DragDirection() {
+        internal override val xProjection: (Px) -> Float = { it.value }
+        internal override val yProjection: (Px) -> Float = { 0f }
+        internal override val isDraggableInDirection: (
+            direction: Direction,
+            minValue: Float,
+            currentValue: Float,
+            maxValue: Float
+        ) -> Boolean =
+            { direction, minValue, currentValue, maxValue ->
+                when (direction) {
+                    Direction.RIGHT -> currentValue <= maxValue
+                    Direction.LEFT -> currentValue >= minValue
+                    else -> false
+                }
+            }
+    }
+
+    /**
+     * Vertical direction of dragging in [AnimatedDraggable].
+     */
+    object Vertical : DragDirection() {
+        internal override val xProjection: (Px) -> Float = { 0f }
+        internal override val yProjection: (Px) -> Float = { it.value }
+        internal override val isDraggableInDirection: (
+            direction: Direction,
+            minValue: Float,
+            currentValue: Float,
+            maxValue: Float
+        ) -> Boolean =
+            { direction, minValue, currentValue, maxValue ->
+                when (direction) {
+                    Direction.UP -> currentValue <= maxValue
+                    Direction.DOWN -> currentValue >= minValue
+                    else -> false
+                }
+            }
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/FlingConfig.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/FlingConfig.kt
new file mode 100644
index 0000000..f2b41be
--- /dev/null
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/FlingConfig.kt
@@ -0,0 +1,129 @@
+/*
+ * 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.gestures
+
+import androidx.animation.AnimatedFloat
+import androidx.animation.AnimationBuilder
+import androidx.animation.DecayAnimation
+import androidx.animation.ExponentialDecay
+import androidx.animation.PhysicsBuilder
+import androidx.animation.TargetAnimation
+import androidx.animation.fling
+import kotlin.math.abs
+
+/**
+ * Interface to specify fling behavior in [AnimatedDraggable].
+ *
+ * When drag has ended, this class specifies what to do given the velocity
+ * with which drag ended and AnimatedFloat instance to perform fling on and read current value.
+ *
+ * If you need natural fling support, use [DefaultFlingConfig] or
+ * [DecayFlingConfig] to control how much friction is applied to the fling
+ *
+ * If you want to only be able to drag/animate between predefined set of values,
+ * consider using [AnchorsFlingConfig].
+ *
+ */
+interface FlingConfig {
+    fun fling(value: AnimatedFloat, startVelocity: Float)
+}
+
+/**
+ * Fling config with anchors will make sure that after drag has ended,
+ * the value will be animated to one of the points from the predefined list.
+ *
+ * It takes velocity into account, though value will be animated to the closest
+ * point in provided list considering velocity.
+ *
+ * @see ExponentialDecay to understand when to pass your own decayAnimation.
+ *
+ * @param animationAnchors set of anchors to animate to
+ * @param onAnimationFinished callback to be invoked when animation value reaches desired anchor
+ * or fling being interrupted by gesture input.
+ * Consider the second boolean param "cancelled" to know what happened.
+ * @param animationBuilder animation which will be used for animations
+ * @param decayAnimation decay animation to be used to calculate closest point in the anchors set
+ * considering velocity.
+ */
+data class AnchorsFlingConfig(
+    val animationAnchors: List<Float>,
+    val onAnimationFinished: ((finishValue: Float, cancelled: Boolean) -> Unit)? = null,
+    val animationBuilder: AnimationBuilder<Float> = PhysicsBuilder(),
+    val decayAnimation: DecayAnimation = ExponentialDecay()
+) : FlingConfig {
+
+    private val adjust: (Float) -> TargetAnimation? = { target ->
+        val point = animationAnchors.minBy { abs(it - target) }
+        val adjusted = point ?: target
+        TargetAnimation(adjusted, animationBuilder)
+    }
+
+    override fun fling(
+        value: AnimatedFloat,
+        startVelocity: Float
+    ) {
+        value.fling(
+            startVelocity,
+            decayAnimation,
+            adjust,
+            onAnimationFinished?.let {
+                { cancelled: Boolean -> it.invoke(value.value, cancelled) }
+            }
+        )
+    }
+}
+
+/**
+ * Config that provides natural fling with customizable decay behavior
+ * e.g fling friction or velocity threshold. Natural fling config doesn't
+ * specify where this fling will end.
+ *
+ * The most common Decay animation is [ExponentialDecay].
+ *
+ * @param decayAnimation the animation to control fling behaviour
+ * @param onFlingFinished callback to be invoked when fling finishes by decay
+ * or being interrupted by gesture input.
+ * Consider second boolean param "cancelled" to know what happened.
+ * @param adjustTarget callback to be called at the start of fling
+ * so the final value for fling can be adjusted
+ */
+data class DecayFlingConfig(
+    val decayAnimation: DecayAnimation,
+    val onFlingFinished: ((finishValue: Float, cancelled: Boolean) -> Unit)? = null,
+    val adjustTarget: (Float) -> TargetAnimation? = { null }
+) : FlingConfig {
+    override fun fling(value: AnimatedFloat, startVelocity: Float) {
+        value.fling(
+            startVelocity,
+            decayAnimation,
+            adjustTarget = adjustTarget,
+            onFinished = onFlingFinished?.let {
+                { cancelled: Boolean -> it.invoke(value.value, cancelled) }
+            }
+        )
+    }
+}
+
+/**
+ * Default fling config sets decay animation to [ExponentialDecay] to provide natural fling
+ * and no calls no callback when fling finishes.
+ */
+object DefaultFlingConfig : FlingConfig {
+    override fun fling(value: AnimatedFloat, startVelocity: Float) {
+        value.fling(startVelocity, ExponentialDecay())
+    }
+}
\ No newline at end of file
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/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..69c0452 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,6 +22,7 @@
 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
@@ -102,7 +103,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 +194,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/Wrapper.kt b/ui/ui-framework/src/main/java/androidx/ui/core/Wrapper.kt
index 27c6d0f9..111d316 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/Wrapper.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/Wrapper.kt
@@ -32,6 +32,8 @@
 import androidx.compose.compositionReference
 import androidx.compose.effectOf
 import androidx.compose.memo
+import androidx.compose.onDispose
+import androidx.compose.onPreCommit
 import androidx.compose.unaryPlus
 import androidx.ui.core.text.AndroidFontResourceLoader
 import androidx.ui.text.font.Font
@@ -63,6 +65,15 @@
         Observe {
             reference = +compositionReference()
             cc?.recomposeSync()
+            +onPreCommit(true) {
+                onDispose {
+                    rootRef.value?.let {
+                        val layoutRootNode = it.root
+                        val context = it.context
+                        Compose.disposeComposition(layoutRootNode, context)
+                    }
+                }
+            }
         }
         val rootLayoutNode = rootRef.value?.root ?: error("Failed to create root platform view")
         val context = rootRef.value?.context ?: composer.composer.context
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..8cb0b39 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,6 +22,7 @@
 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
@@ -201,10 +202,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 +245,36 @@
             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())
+    }
 }
diff --git a/ui/ui-layout/api/1.0.0-alpha01.txt b/ui/ui-layout/api/1.0.0-alpha01.txt
index 89fa1ed..122ce88 100644
--- a/ui/ui-layout/api/1.0.0-alpha01.txt
+++ b/ui/ui-layout/api/1.0.0-alpha01.txt
@@ -175,6 +175,15 @@
     method public static void Stack(kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackChildren,kotlin.Unit> block);
   }
 
+  public final class TableChildren {
+    method public void tableRow(kotlin.jvm.functions.Function0<kotlin.Unit> children);
+  }
+
+  public final class TableKt {
+    ctor public TableKt();
+    method public static void Table(androidx.ui.layout.Alignment childAlignment = Alignment.TopLeft, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableChildren,kotlin.Unit> block);
+  }
+
   public final class WrapKt {
     ctor public WrapKt();
     method public static void Wrap(androidx.ui.layout.Alignment alignment = Alignment.TopLeft, kotlin.jvm.functions.Function0<kotlin.Unit> children);
diff --git a/ui/ui-layout/api/current.txt b/ui/ui-layout/api/current.txt
index 89fa1ed..122ce88 100644
--- a/ui/ui-layout/api/current.txt
+++ b/ui/ui-layout/api/current.txt
@@ -175,6 +175,15 @@
     method public static void Stack(kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackChildren,kotlin.Unit> block);
   }
 
+  public final class TableChildren {
+    method public void tableRow(kotlin.jvm.functions.Function0<kotlin.Unit> children);
+  }
+
+  public final class TableKt {
+    ctor public TableKt();
+    method public static void Table(androidx.ui.layout.Alignment childAlignment = Alignment.TopLeft, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableChildren,kotlin.Unit> block);
+  }
+
   public final class WrapKt {
     ctor public WrapKt();
     method public static void Wrap(androidx.ui.layout.Alignment alignment = Alignment.TopLeft, kotlin.jvm.functions.Function0<kotlin.Unit> children);
diff --git a/ui/ui-layout/api/restricted_1.0.0-alpha01.txt b/ui/ui-layout/api/restricted_1.0.0-alpha01.txt
index 89fa1ed..122ce88 100644
--- a/ui/ui-layout/api/restricted_1.0.0-alpha01.txt
+++ b/ui/ui-layout/api/restricted_1.0.0-alpha01.txt
@@ -175,6 +175,15 @@
     method public static void Stack(kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackChildren,kotlin.Unit> block);
   }
 
+  public final class TableChildren {
+    method public void tableRow(kotlin.jvm.functions.Function0<kotlin.Unit> children);
+  }
+
+  public final class TableKt {
+    ctor public TableKt();
+    method public static void Table(androidx.ui.layout.Alignment childAlignment = Alignment.TopLeft, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableChildren,kotlin.Unit> block);
+  }
+
   public final class WrapKt {
     ctor public WrapKt();
     method public static void Wrap(androidx.ui.layout.Alignment alignment = Alignment.TopLeft, kotlin.jvm.functions.Function0<kotlin.Unit> children);
diff --git a/ui/ui-layout/api/restricted_current.txt b/ui/ui-layout/api/restricted_current.txt
index 89fa1ed..122ce88 100644
--- a/ui/ui-layout/api/restricted_current.txt
+++ b/ui/ui-layout/api/restricted_current.txt
@@ -175,6 +175,15 @@
     method public static void Stack(kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackChildren,kotlin.Unit> block);
   }
 
+  public final class TableChildren {
+    method public void tableRow(kotlin.jvm.functions.Function0<kotlin.Unit> children);
+  }
+
+  public final class TableKt {
+    ctor public TableKt();
+    method public static void Table(androidx.ui.layout.Alignment childAlignment = Alignment.TopLeft, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableChildren,kotlin.Unit> block);
+  }
+
   public final class WrapKt {
     ctor public WrapKt();
     method public static void Wrap(androidx.ui.layout.Alignment alignment = Alignment.TopLeft, kotlin.jvm.functions.Function0<kotlin.Unit> children);
diff --git a/ui/ui-layout/integration-tests/layout-demos/src/main/AndroidManifest.xml b/ui/ui-layout/integration-tests/layout-demos/src/main/AndroidManifest.xml
index d94c4f0..59cf792 100644
--- a/ui/ui-layout/integration-tests/layout-demos/src/main/AndroidManifest.xml
+++ b/ui/ui-layout/integration-tests/layout-demos/src/main/AndroidManifest.xml
@@ -45,5 +45,14 @@
                 <category android:name="androidx.ui.demos.SAMPLE_CODE" />
             </intent-filter>
         </activity>
+
+        <activity android:name=".TableActivity"
+            android:configChanges="orientation|screenSize"
+            android:label="Layout/Table">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="androidx.ui.demos.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
     </application>
 </manifest>
diff --git a/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/TableActivity.kt b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/TableActivity.kt
new file mode 100644
index 0000000..a3ca044
--- /dev/null
+++ b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/TableActivity.kt
@@ -0,0 +1,45 @@
+/*
+ * 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.layout.demos
+
+import android.app.Activity
+import android.os.Bundle
+import androidx.compose.composer
+import androidx.compose.setContent
+import androidx.ui.core.CraneWrapper
+import androidx.ui.core.Text
+import androidx.ui.layout.Table
+
+class TableActivity : Activity() {
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContent {
+            CraneWrapper {
+                Table {
+                    for (i in 0 until 5) {
+                        tableRow {
+                            for (j in 0 until 7) {
+                                Text("$i, $j")
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/Table.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/Table.kt
new file mode 100644
index 0000000..7246f77
--- /dev/null
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/Table.kt
@@ -0,0 +1,116 @@
+/*
+ * 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.layout
+
+import androidx.compose.Children
+import androidx.compose.Composable
+import androidx.compose.composer
+import androidx.ui.core.Constraints
+import androidx.ui.core.IntPx
+import androidx.ui.core.IntPxSize
+import androidx.ui.core.Layout
+import androidx.ui.core.Measurable
+import androidx.ui.core.ParentData
+import androidx.ui.core.coerceIn
+import androidx.ui.core.isFinite
+import androidx.ui.core.max
+
+/**
+ * Collects information about the children of a [Table] when
+ * its body is executed with a [TableChildren] as argument.
+ */
+class TableChildren internal constructor() {
+
+    internal val tableChildren = mutableListOf<@Composable() () -> Unit>()
+    private var rowGroup = 0
+
+    fun tableRow(children: @Composable() () -> Unit) {
+        tableChildren += {
+            ParentData(data = TableChildData(rowGroup++), children = children)
+        }
+    }
+}
+
+/**
+ * Parent data associated with children to assign a row group.
+ */
+private data class TableChildData(val rowGroup: Int)
+
+private val Measurable.rowGroup get() = (parentData as TableChildData).rowGroup
+
+/**
+* Layout model that arranges its children into rows and columns.
+*/
+@Composable
+fun Table(
+    childAlignment: Alignment = Alignment.TopLeft,
+    @Children(composable = false) block: TableChildren.() -> Unit
+) {
+    val children: @Composable() () -> Unit = with(TableChildren()) {
+        apply(block)
+        val composable = @Composable {
+            tableChildren.forEach { it() }
+        }
+        composable
+    }
+
+    Layout(children) { measurables, constraints ->
+        // Group the measurables into rows using rowGroup.
+        val measurablesByRow = measurables.groupBy { it.rowGroup }.values
+
+        val rows = measurablesByRow.size
+        val columns = measurablesByRow.map { it.size }.max() ?: 0
+
+        require(rows > 0 && columns > 0)
+
+        // Get the preferred size of each measurable (with loose constraints).
+        val placeables = measurablesByRow.map { row -> row.map { it.measure(Constraints()) } }
+
+        // Calculate the height of each row and width of each column.
+        // TODO(calintat): Allow for different sizing strategies for rows/columns.
+        val rowHeights = placeables.map { row -> row.map { it.height }.max() }
+        val columnWidths = if (constraints.maxWidth.isFinite()) {
+            List(size = columns) { constraints.maxWidth / columns }
+        } else {
+            List(size = columns) { j -> placeables.map { row -> row[j].height }.max() }
+        }
+
+        // TODO(calintat): Figure out what to do when rowHeights.sum() exceeds max height constraint
+        val tableWidth = max(columnWidths.sum(), constraints.minWidth)
+        val tableHeight = rowHeights.sum().coerceIn(constraints.minHeight, constraints.maxHeight)
+
+        layout(tableWidth, tableHeight) {
+            placeables.forEachIndexed { i, row ->
+                row.forEachIndexed { j, placeable ->
+                    val position = childAlignment.align(
+                        IntPxSize(
+                            width = columnWidths[j] - placeable.width,
+                            height = rowHeights[i] - placeable.height
+                        )
+                    )
+                    placeable.place(
+                        x = columnWidths.take(j).sum() + position.x,
+                        y = rowHeights.take(i).sum() + position.y
+                    )
+                }
+            }
+        }
+    }
+}
+
+private fun Collection<IntPx>.sum() = this.fold(IntPx.Zero) { a, b -> a + b }
+private fun Collection<IntPx>.max() = this.fold(IntPx.Zero) { a, b -> max(a, b) }
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-material/src/main/java/androidx/ui/material/Drawer.kt b/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt
index bb4deb3..557ee14 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt
@@ -16,35 +16,27 @@
 
 package androidx.ui.material
 
-import androidx.animation.AnimatedFloat
-import androidx.animation.ExponentialDecay
 import androidx.animation.PhysicsBuilder
-import androidx.animation.TargetAnimation
-import androidx.animation.fling
 import androidx.compose.Composable
 import androidx.compose.composer
-import androidx.compose.memo
 import androidx.compose.onCommit
 import androidx.compose.unaryPlus
-import androidx.ui.animation.animatedFloat
-import androidx.ui.core.Direction
 import androidx.ui.core.Dp
 import androidx.ui.core.IntPx
 import androidx.ui.core.Layout
 import androidx.ui.core.Px
-import androidx.ui.core.PxPosition
 import androidx.ui.core.RepaintBoundary
 import androidx.ui.core.WithConstraints
 import androidx.ui.core.dp
-import androidx.ui.core.gesture.DragGestureDetector
-import androidx.ui.core.gesture.DragObserver
 import androidx.ui.core.hasBoundedHeight
 import androidx.ui.core.hasBoundedWidth
 import androidx.ui.core.min
-import androidx.ui.core.px
 import androidx.ui.core.withDensity
 import androidx.ui.foundation.Clickable
 import androidx.ui.foundation.ColoredRect
+import androidx.ui.foundation.gestures.AnchorsFlingConfig
+import androidx.ui.foundation.gestures.AnimatedDraggable
+import androidx.ui.foundation.gestures.DragDirection
 import androidx.ui.layout.Alignment
 import androidx.ui.layout.Container
 import androidx.ui.layout.DpConstraints
@@ -124,21 +116,33 @@
             val constraints = +withDensity {
                 DpConstraints(pxConstraints)
             }
-            val info = +memo(pxConstraints.maxWidth) {
-                ModalDragInfo(pxConstraints.maxWidth.value.toFloat())
-            }
-            val fling = +memo(pxConstraints.maxWidth) {
-                ModalDrawerFlinger(pxConstraints.maxWidth.value.toFloat(), onStateChange)
-            }
-            fling.onStateChange = onStateChange
+            val minValue = -pxConstraints.maxWidth.value.toFloat()
+            val maxValue = 0f
+            val valueByState = if (drawerState == DrawerState.Opened) maxValue else minValue
 
-            val valueByState =
-                if (drawerState == DrawerState.Opened) info.maxBound else info.minBound
-            AnimatedDraggable(info, valueByState, fling) { animatedValue ->
+            val flingConfig = AnchorsFlingConfig(
+                listOf(minValue, maxValue),
+                onAnimationFinished = { finalValue, cancelled ->
+                    if (!cancelled) {
+                        onStateChange(
+                            if (finalValue <= minValue) DrawerState.Closed else DrawerState.Opened
+                        )
+                    }
+                },
+                animationBuilder = AnimationBuilder
+            )
+
+            AnimatedDraggable(
+                dragDirection = DragDirection.Horizontal,
+                startValue = valueByState,
+                minValue = minValue,
+                maxValue = maxValue,
+                flingConfig = flingConfig
+            ) { animatedValue ->
                 +onCommit(valueByState) {
                     animatedValue.animateTo(valueByState, AnimationBuilder)
                 }
-                val fraction = calculateFraction(info.minBound, info.maxBound, animatedValue.value)
+                val fraction = calculateFraction(minValue, maxValue, animatedValue.value)
                 val scrimAlpha = fraction * ScrimDefaultOpacity
                 val dpOffset = +withDensity {
                     animatedValue.value.toDp()
@@ -192,30 +196,40 @@
             val constraints = +withDensity {
                 DpConstraints(pxConstraints)
             }
-            val info = +memo(pxConstraints.maxHeight) {
-                BottomDragInfo(pxConstraints.maxHeight.value.toFloat())
-            }
-            val fling = +memo(pxConstraints.maxHeight) {
-                BottomDrawerFlinger(pxConstraints.maxHeight.value.toFloat(), onStateChange)
-            }
-            fling.onStateChange = onStateChange
+            val minValue = 0f
+            val maxValue = pxConstraints.maxHeight.value.toFloat()
 
             // TODO: add proper landscape support
             val isLandscape = constraints.maxWidth > constraints.maxHeight
-            val openedValue = if (isLandscape) info.maxBound else lerp(
-                info.minBound,
-                info.maxBound,
+            val openedValue = if (isLandscape) maxValue else lerp(
+                minValue,
+                maxValue,
                 BottomDrawerOpenFraction
             )
-            val valueByState = if (drawerState == DrawerState.Opened) openedValue else info.maxBound
+            val valueByState = if (drawerState == DrawerState.Opened) openedValue else maxValue
+            val anchors = listOf(minValue, maxValue, openedValue)
 
-            AnimatedDraggable(info, valueByState, fling) { animatedValue ->
+            val onAnimationFinished = { finalValue: Float, cancelled: Boolean ->
+                if (!cancelled) {
+                    onStateChange(
+                        if (finalValue >= maxValue) DrawerState.Closed else DrawerState.Opened
+                    )
+                }
+            }
+
+            AnimatedDraggable(
+                dragDirection = DragDirection.Vertical,
+                startValue = valueByState,
+                minValue = minValue,
+                maxValue = maxValue,
+                flingConfig = AnchorsFlingConfig(anchors, onAnimationFinished, AnimationBuilder)
+            ) { animatedValue ->
                 +onCommit(valueByState) {
                     animatedValue.animateTo(valueByState, AnimationBuilder)
                 }
                 // as we scroll "from height to 0" backwards, (1 - fraction) will reverse it
                 val fractionToOpened =
-                    1 - max(0f, calculateFraction(openedValue, info.maxBound, animatedValue.value))
+                    1 - max(0f, calculateFraction(openedValue, maxValue, animatedValue.value))
                 val scrimAlpha = fractionToOpened * ScrimDefaultOpacity
                 val dpOffset = +withDensity {
                     animatedValue.value.toDp()
@@ -264,155 +278,6 @@
 
 private fun calculateFraction(a: Float, b: Float, pos: Float) = (pos - a) / (b - a)
 
-private interface Flinger {
-    fun fling(animation: AnimatedFloat, velocity: Float)
-}
-
-private data class DragInfo(
-    val minBound: Float,
-    val maxBound: Float,
-    val positionToAxis: (PxPosition) -> Px,
-    val axisToPosition: (Float) -> PxPosition,
-    val isDraggableInDirection: (direction: Direction, currentValue: Float) -> Boolean
-)
-
-@Composable
-private fun AnimatedDraggable(
-    dragInfo: DragInfo,
-    startValue: Float,
-    fling: Flinger,
-    children: @Composable() (AnimatedFloat) -> Unit
-) {
-    val offset = (+animatedFloat(startValue)).apply {
-        setBounds(dragInfo.minBound, dragInfo.maxBound)
-    }
-    DragGestureDetector(
-        canDrag = { direction ->
-            dragInfo.isDraggableInDirection(direction, offset.value)
-        },
-        dragObserver = object : DragObserver {
-
-            override fun onDrag(dragDistance: PxPosition): PxPosition {
-                val draggedFraction = dragInfo.positionToAxis(dragDistance).value
-                val newValue =
-                    (offset.value + draggedFraction)
-                        .coerceIn(dragInfo.minBound, dragInfo.maxBound)
-                val consumed = newValue - offset.value
-                offset.snapTo(newValue)
-                return dragInfo.axisToPosition(consumed)
-            }
-
-            override fun onStop(velocity: PxPosition) {
-                fling.fling(offset, dragInfo.positionToAxis(velocity).value)
-            }
-        }
-    ) {
-        children(offset)
-    }
-}
-
-private fun ModalDragInfo(width: Float): DragInfo {
-    val min = -width
-    val max = 0f
-    return DragInfo(
-        minBound = min,
-        maxBound = max,
-        positionToAxis = { it.x },
-        axisToPosition = { PxPosition(it.px, 0.px) },
-        isDraggableInDirection = { direction, currentValue ->
-            when (direction) {
-                Direction.RIGHT -> currentValue <= max
-                Direction.LEFT -> currentValue >= min
-                else -> false
-            }
-        }
-    )
-}
-
-private fun BottomDragInfo(height: Float): DragInfo {
-    val min = 0f
-    val max = height
-    return DragInfo(
-        minBound = min,
-        maxBound = max,
-        positionToAxis = { it.y },
-        axisToPosition = { PxPosition(0.px, it.px) },
-        isDraggableInDirection = { direction, currentValue ->
-            when (direction) {
-                Direction.UP -> currentValue <= max
-                Direction.DOWN -> currentValue >= min
-                else -> false
-            }
-        }
-
-    )
-}
-
-private class BottomDrawerFlinger(
-    height: Float,
-    var onStateChange: (DrawerState) -> Unit
-) : Flinger {
-    val openValue = lerp(0f, height, BottomDrawerOpenFraction)
-    val expandedValue = 0f
-    val closedValue = height
-
-    override fun fling(animation: AnimatedFloat, velocity: Float) {
-        animation.fling(
-            startVelocity = velocity,
-            decay = DefaultDecay,
-            adjustTarget = adjustTarget(animation),
-            onFinished = onFinished(animation)
-        )
-    }
-
-    fun onFinished(animation: AnimatedFloat) = { _: Boolean ->
-        if (animation.value >= closedValue) onStateChange(DrawerState.Closed)
-        else if (animation.value <= openValue) onStateChange(DrawerState.Opened)
-    }
-
-    fun adjustTarget(animation: AnimatedFloat) = { targetToAdjust: Float ->
-        val target =
-            if (targetToAdjust > openValue / 2) {
-                closedValue
-            } else if (animation.value <= openValue && targetToAdjust < openValue) {
-                expandedValue
-            } else {
-                openValue
-            }
-        TargetAnimation(target, AnimationBuilder)
-    }
-}
-
-private class ModalDrawerFlinger(
-    width: Float,
-    var onStateChange: (DrawerState) -> Unit
-) : Flinger {
-    val openValue = 0f
-    val closedValue = -width
-
-    override fun fling(animation: AnimatedFloat, velocity: Float) {
-        animation.fling(
-            startVelocity = velocity,
-            decay = DefaultDecay,
-            adjustTarget = adjustTarget,
-            onFinished = onFinished(animation)
-        )
-    }
-
-    fun onFinished(animation: AnimatedFloat) = { _: Boolean ->
-        if (animation.value <= closedValue) {
-            onStateChange(DrawerState.Closed)
-        } else if (animation.value >= openValue) {
-            onStateChange(DrawerState.Opened)
-        }
-    }
-
-    val adjustTarget = { targetToAdjust: Float ->
-        val target = if (targetToAdjust < openValue / 2) closedValue else openValue
-        TargetAnimation(target, AnimationBuilder)
-    }
-}
-
 @Composable
 private fun Scrim(state: DrawerState, onStateChange: (DrawerState) -> Unit, opacity: Float) {
     // TODO: use enabled = false here when it will be available
@@ -464,8 +329,6 @@
 private val StaticDrawerWidth = 256.dp
 private val DrawerStiffness = 1000f
 
-// TODO: figure out default decay
-private val DefaultDecay = ExponentialDecay(0.7f)
 private val AnimationBuilder =
     PhysicsBuilder<Float>().apply {
         stiffness = DrawerStiffness
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..e6d71a4 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
@@ -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/build.gradle b/ui/ui-text/build.gradle
index 75aad7d..feccef84 100644
--- a/ui/ui-text/build.gradle
+++ b/ui/ui-text/build.gradle
@@ -30,7 +30,6 @@
 
 dependencies {
     kotlinPlugin project(path: ":compose:compose-compiler", configuration: "embeddablePlugin")
-
     implementation(KOTLIN_COMPOSE_STDLIB)
 
     // TODO: Non-Kotlin dependency, move to Android-specific code
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..6d74cfa 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,6 +40,17 @@
     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 {
@@ -53,17 +65,27 @@
                     TagLine(tag = "Keyboard Type: $name")
                     EditLine(initText = "Keyboard Type: $name", keyboardType = type)
                 }
+
+                for ((action, name) in IME_ACTIONS) {
+                    TagLine(tag = "Ime Action: $name")
+                    EditLine(initText = "ImeAction: $name", imeAction = action)
+                }
             }
         }
     }
 }
 
 @Composable
-fun EditLine(initText: String, keyboardType: KeyboardType = KeyboardType.Text) {
+fun EditLine(
+    initText: String,
+    keyboardType: KeyboardType = KeyboardType.Text,
+    imeAction: ImeAction = ImeAction.Unspecified
+) {
     val state = +state { EditorState(text = initText, selection = TextRange(2, 2)) }
     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/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/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/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 99bfc8e..679943f 100644
--- a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt
+++ b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt
@@ -21,15 +21,12 @@
 import android.util.Log
 import android.view.View
 import android.view.View.OVER_SCROLL_NEVER
+import android.view.ViewConfiguration
 import android.view.accessibility.AccessibilityNodeInfo
 import androidx.core.view.ViewCompat
 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
@@ -80,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
@@ -150,11 +151,11 @@
         val viewPager: ViewPager2 get() = activity.findViewById(R.id.view_pager)
 
         fun peekForward() {
-            peek(adjustForRtl(-50f))
+            peek(adjustForRtl(adjustForTouchSlop(-50f)))
         }
 
         fun peekBackward() {
-            peek(adjustForRtl(50f))
+            peek(adjustForRtl(adjustForTouchSlop(50f)))
         }
 
         enum class SwipeMethod {
@@ -213,6 +214,15 @@
             }
         }
 
+        private fun adjustForTouchSlop(offset: Float): Float {
+            val touchSlop = ViewConfiguration.get(viewPager.context).scaledPagingTouchSlop
+            return when {
+                offset < 0 -> offset - touchSlop
+                offset > 0 -> offset + touchSlop
+                else -> 0f
+            }
+        }
+
         private fun adjustForRtl(offset: Float): Float {
             return if (viewPager.isHorizontal && viewPager.isRtl) -offset else offset
         }
@@ -274,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/BasicTest.java b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BasicTest.java
index d23c3d38..f8b2ec4 100644
--- a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BasicTest.java
+++ b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BasicTest.java
@@ -24,11 +24,13 @@
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.view.LayoutInflater;
 import android.view.View;
 
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
+import androidx.viewpager2.test.R;
 
 import org.junit.Rule;
 import org.junit.Test;
@@ -89,6 +91,14 @@
         assertThat((int) ((Bundle) recreatedAdapterState[2]).get("key"), equalTo(3));
     }
 
+    @Test
+    public void test_inflateWithScrollbars() {
+        // when
+        LayoutInflater.from(ApplicationProvider.getApplicationContext()).inflate(
+                R.layout.vertical_scrollbars, null);
+        // then it shouldn't crash
+    }
+
     private Bundle createIntBundle(int value) {
         Bundle bundle = new Bundle(1);
         bundle.putInt("key", value);
diff --git a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/FakeDragTest.kt b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/FakeDragTest.kt
index f208cf3..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
@@ -291,7 +288,7 @@
     @Test
     fun test_startManualPeekAfterFakeDrag1Page() {
         val vc = ViewConfiguration.get(test.viewPager.context)
-        val touchSlop = vc.scaledTouchSlop
+        val touchSlop = vc.scaledPagingTouchSlop
         val swipeDistance = touchSlop * 5f
         val pageSize = test.viewPager.pageSize
         val dragDistance = 1 + (pageSize / 2f - swipeDistance) / pageSize // ~1.4f
@@ -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/androidTest/java/androidx/viewpager2/widget/PageChangeCallbackTest.kt b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/PageChangeCallbackTest.kt
index f517deb..f257a8e2 100644
--- a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/PageChangeCallbackTest.kt
+++ b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/PageChangeCallbackTest.kt
@@ -701,7 +701,7 @@
         var recorder = test.viewPager.addNewRecordingCallback()
 
         val vc = ViewConfiguration.get(test.viewPager.context)
-        val touchSlop = vc.scaledTouchSlop
+        val touchSlop = vc.scaledPagingTouchSlop
 
         // when
         tryNTimes(3, resetBlock = {
diff --git a/viewpager2/src/androidTest/res/layout/vertical_scrollbars.xml b/viewpager2/src/androidTest/res/layout/vertical_scrollbars.xml
new file mode 100644
index 0000000..3bd55cd
--- /dev/null
+++ b/viewpager2/src/androidTest/res/layout/vertical_scrollbars.xml
@@ -0,0 +1,21 @@
+<?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.
+-->
+
+<androidx.viewpager2.widget.ViewPager2
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scrollbars="vertical"/>
\ No newline at end of file
diff --git a/viewpager2/src/main/java/androidx/viewpager2/widget/MarginPageTransformer.java b/viewpager2/src/main/java/androidx/viewpager2/widget/MarginPageTransformer.java
index 8999a7c..0524f4b 100644
--- a/viewpager2/src/main/java/androidx/viewpager2/widget/MarginPageTransformer.java
+++ b/viewpager2/src/main/java/androidx/viewpager2/widget/MarginPageTransformer.java
@@ -56,7 +56,7 @@
         float offset = mMarginPx * position;
 
         if (viewPager.getOrientation() == ViewPager2.ORIENTATION_HORIZONTAL) {
-            page.setTranslationX(viewPager.isLayoutRtl() ? -offset : offset);
+            page.setTranslationX(viewPager.isRtl() ? -offset : offset);
         } else {
             page.setTranslationY(offset);
         }
diff --git a/viewpager2/src/main/java/androidx/viewpager2/widget/ScrollEventAdapter.java b/viewpager2/src/main/java/androidx/viewpager2/widget/ScrollEventAdapter.java
index ee28e7e..620ed4a 100644
--- a/viewpager2/src/main/java/androidx/viewpager2/widget/ScrollEventAdapter.java
+++ b/viewpager2/src/main/java/androidx/viewpager2/widget/ScrollEventAdapter.java
@@ -170,7 +170,7 @@
         if (mDispatchSelected) {
             // Drag started settling, need to calculate target page and dispatch onPageSelected now
             mDispatchSelected = false;
-            boolean scrollingForward = dy > 0 || (dy == 0 && dx < 0 == mViewPager.isLayoutRtl());
+            boolean scrollingForward = dy > 0 || (dy == 0 && dx < 0 == mViewPager.isRtl());
 
             // "&& values.mOffsetPx != 0": filters special case where we're scrolling forward and
             // the first scroll event after settling already got us at the target
@@ -234,7 +234,7 @@
         int start, sizePx;
         if (isHorizontal) {
             sizePx = firstVisibleView.getWidth() + margin.leftMargin + margin.rightMargin;
-            if (!mViewPager.isLayoutRtl()) {
+            if (!mViewPager.isRtl()) {
                 start = firstVisibleView.getLeft() - margin.leftMargin;
             } else {
                 start = sizePx - firstVisibleView.getRight() - margin.rightMargin;
diff --git a/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java b/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
index 732b198..9130ae1 100644
--- a/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
+++ b/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
@@ -181,6 +181,7 @@
 
         mLayoutManager = new LinearLayoutManagerImpl(context);
         mRecyclerView.setLayoutManager(mLayoutManager);
+        mRecyclerView.setScrollingTouchSlop(RecyclerView.TOUCH_SLOP_PAGING);
         setOrientation(context, attrs);
 
         mRecyclerView.setLayoutParams(
@@ -561,9 +562,8 @@
         return mLayoutManager.getOrientation();
     }
 
-    boolean isLayoutRtl() {
-        return mLayoutManager.getLayoutDirection()
-                == androidx.core.view.ViewCompat.LAYOUT_DIRECTION_RTL;
+    boolean isRtl() {
+        return mLayoutManager.getLayoutDirection() == ViewCompat.LAYOUT_DIRECTION_RTL;
     }
 
     /**
@@ -1457,7 +1457,7 @@
             }
 
             if (getOrientation() == ORIENTATION_HORIZONTAL) {
-                boolean isLayoutRtl = isLayoutRtl();
+                boolean isLayoutRtl = isRtl();
                 int actionIdPageForward = isLayoutRtl ? actionIdPageLeft : actionIdPageRight;
                 int actionIdPageBackward = isLayoutRtl ? actionIdPageRight : actionIdPageLeft;
 
diff --git a/work/workmanager-gcm/api/2.2.0-beta01.txt b/work/workmanager-gcm/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/work/workmanager-gcm/api/2.2.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/work/workmanager-gcm/api/2.3.0-alpha01.txt b/work/workmanager-gcm/api/2.3.0-alpha01.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/work/workmanager-gcm/api/2.3.0-alpha01.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/work/workmanager-gcm/api/current.txt b/work/workmanager-gcm/api/current.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/work/workmanager-gcm/api/current.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-gcm/api/res-2.2.0-beta01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-gcm/api/res-2.2.0-beta01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-gcm/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-gcm/api/res-2.3.0-alpha01.txt
diff --git a/work/workmanager-gcm/api/restricted_2.2.0-beta01.txt b/work/workmanager-gcm/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/work/workmanager-gcm/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/work/workmanager-gcm/api/restricted_2.3.0-alpha01.txt b/work/workmanager-gcm/api/restricted_2.3.0-alpha01.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/work/workmanager-gcm/api/restricted_2.3.0-alpha01.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/work/workmanager-gcm/api/restricted_current.txt b/work/workmanager-gcm/api/restricted_current.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/work/workmanager-gcm/api/restricted_current.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/work/workmanager-gcm/build.gradle b/work/workmanager-gcm/build.gradle
index 8f763e1..6320ba1 100644
--- a/work/workmanager-gcm/build.gradle
+++ b/work/workmanager-gcm/build.gradle
@@ -68,7 +68,7 @@
 
 androidx {
     name = "Android WorkManager GCMNetworkManager Support"
-    publish = Publish.NONE
+    publish = Publish.SNAPSHOT_AND_RELEASE
     mavenVersion = LibraryVersions.WORK
     mavenGroup = LibraryGroups.WORK
     inceptionYear = "2019"
diff --git a/work/workmanager-ktx/api/2.2.0-alpha01.txt b/work/workmanager-ktx/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..4ed72f8
--- /dev/null
+++ b/work/workmanager-ktx/api/2.2.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/work/workmanager-ktx/api/2.2.0-beta01.txt b/work/workmanager-ktx/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..4ed72f8
--- /dev/null
+++ b/work/workmanager-ktx/api/2.2.0-beta01.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/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/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-ktx/api/res-2.2.0-alpha01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-ktx/api/res-2.2.0-beta01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-ktx/api/res-2.2.0-beta01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-ktx/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-ktx/api/res-2.3.0-alpha01.txt
diff --git a/work/workmanager-ktx/api/restricted_2.2.0-alpha01.txt b/work/workmanager-ktx/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..2a2fd52
--- /dev/null
+++ b/work/workmanager-ktx/api/restricted_2.2.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-ktx/api/restricted_2.2.0-beta01.txt b/work/workmanager-ktx/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..2a2fd52
--- /dev/null
+++ b/work/workmanager-ktx/api/restricted_2.2.0-beta01.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-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.2.0-alpha01.txt b/work/workmanager-rxjava2/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..e43f0e5
--- /dev/null
+++ b/work/workmanager-rxjava2/api/2.2.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-rxjava2/api/2.2.0-beta01.txt b/work/workmanager-rxjava2/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..e43f0e5
--- /dev/null
+++ b/work/workmanager-rxjava2/api/2.2.0-beta01.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-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/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-rxjava2/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-rxjava2/api/res-2.2.0-alpha01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-rxjava2/api/res-2.2.0-beta01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-rxjava2/api/res-2.2.0-beta01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-rxjava2/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-rxjava2/api/res-2.3.0-alpha01.txt
diff --git a/work/workmanager-rxjava2/api/restricted_2.2.0-alpha01.txt b/work/workmanager-rxjava2/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..e43f0e5
--- /dev/null
+++ b/work/workmanager-rxjava2/api/restricted_2.2.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-rxjava2/api/restricted_2.2.0-beta01.txt b/work/workmanager-rxjava2/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..e43f0e5
--- /dev/null
+++ b/work/workmanager-rxjava2/api/restricted_2.2.0-beta01.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-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.2.0-alpha01.txt b/work/workmanager-testing/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..8827453
--- /dev/null
+++ b/work/workmanager-testing/api/2.2.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-testing/api/2.2.0-beta01.txt b/work/workmanager-testing/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..8827453
--- /dev/null
+++ b/work/workmanager-testing/api/2.2.0-beta01.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-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/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-testing/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-testing/api/res-2.2.0-alpha01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-testing/api/res-2.2.0-beta01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-testing/api/res-2.2.0-beta01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-testing/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-testing/api/res-2.3.0-alpha01.txt
diff --git a/work/workmanager-testing/api/restricted_2.2.0-alpha01.txt b/work/workmanager-testing/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..8827453
--- /dev/null
+++ b/work/workmanager-testing/api/restricted_2.2.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-testing/api/restricted_2.2.0-beta01.txt b/work/workmanager-testing/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..8827453
--- /dev/null
+++ b/work/workmanager-testing/api/restricted_2.2.0-beta01.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-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.2.0-alpha01.txt b/work/workmanager/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..f0bff1a
--- /dev/null
+++ b/work/workmanager/api/2.2.0-alpha01.txt
@@ -0,0 +1,302 @@
+// 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 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 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 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/2.2.0-beta01.txt b/work/workmanager/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..f0bff1a
--- /dev/null
+++ b/work/workmanager/api/2.2.0-beta01.txt
@@ -0,0 +1,302 @@
+// 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 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 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 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/2.3.0-alpha01.txt b/work/workmanager/api/2.3.0-alpha01.txt
new file mode 100644
index 0000000..f0bff1a
--- /dev/null
+++ b/work/workmanager/api/2.3.0-alpha01.txt
@@ -0,0 +1,302 @@
+// 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 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 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 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/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager/api/res-2.2.0-alpha01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager/api/res-2.2.0-beta01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager/api/res-2.2.0-beta01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager/api/res-2.3.0-alpha01.txt