Merge changes Ic5b0df22,Iae979c52 into androidx-master-dev

* changes:
  Moved CameraX bind methods to core-lifecycle
  Added camera-lifecycle module
diff --git a/activity/activity/src/main/java/androidx/activity/ComponentActivity.java b/activity/activity/src/main/java/androidx/activity/ComponentActivity.java
index cee2d27..56a1cc3 100644
--- a/activity/activity/src/main/java/androidx/activity/ComponentActivity.java
+++ b/activity/activity/src/main/java/androidx/activity/ComponentActivity.java
@@ -177,7 +177,9 @@
      */
     @Override
     @Nullable
+    @SuppressWarnings("deprecation")
     public final Object onRetainNonConfigurationInstance() {
+        // Maintain backward compatibility.
         Object custom = onRetainCustomNonConfigurationInstance();
 
         ViewModelStore viewModelStore = mViewModelStore;
diff --git a/appcompat/src/main/java/androidx/appcompat/app/AppCompatActivity.java b/appcompat/src/main/java/androidx/appcompat/app/AppCompatActivity.java
index 8bd4720..2340c83 100644
--- a/appcompat/src/main/java/androidx/appcompat/app/AppCompatActivity.java
+++ b/appcompat/src/main/java/androidx/appcompat/app/AppCompatActivity.java
@@ -258,6 +258,7 @@
         return getDelegate().requestWindowFeature(featureId);
     }
 
+    @SuppressWarnings("deprecation")
     @Override
     public void supportInvalidateOptionsMenu() {
         getDelegate().invalidateOptionsMenu();
@@ -487,6 +488,7 @@
         NavUtils.navigateUpTo(this, upIntent);
     }
 
+    @SuppressWarnings("deprecation")
     @Override
     public void onContentChanged() {
         // Call onSupportContentChanged() for legacy reasons
diff --git a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegate.java b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegate.java
index 1353953..61a1936 100644
--- a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegate.java
+++ b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegate.java
@@ -118,6 +118,7 @@
     /**
      * @deprecated Use {@link AppCompatDelegate#MODE_NIGHT_AUTO_TIME} instead
      */
+    @SuppressWarnings("deprecation")
     @Deprecated
     public static final int MODE_NIGHT_AUTO = MODE_NIGHT_AUTO_TIME;
 
@@ -167,6 +168,7 @@
     private static final Object sActiveDelegatesLock = new Object();
 
     /** @hide */
+    @SuppressWarnings("deprecation")
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @IntDef({MODE_NIGHT_NO, MODE_NIGHT_YES, MODE_NIGHT_AUTO_TIME, MODE_NIGHT_FOLLOW_SYSTEM,
             MODE_NIGHT_UNSPECIFIED, MODE_NIGHT_AUTO_BATTERY})
@@ -543,6 +545,7 @@
      * @see #setLocalNightMode(int)
      * @see #getDefaultNightMode()
      */
+    @SuppressWarnings("deprecation")
     public static void setDefaultNightMode(@NightMode int mode) {
         switch (mode) {
             case MODE_NIGHT_NO:
diff --git a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
index 95b2cf3..bfa0f2b 100644
--- a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
+++ b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
@@ -2182,6 +2182,7 @@
         return applyDayNight(true, null);
     }
 
+    @SuppressWarnings("deprecation")
     private boolean applyDayNight(final boolean allowRecreation,
             @Nullable Configuration configOverlay) {
         if (mIsDestroyed) {
@@ -2222,6 +2223,7 @@
         return mLocalNightMode;
     }
 
+    @SuppressWarnings("deprecation")
     @ApplyableNightMode
     int mapNightMode(@NightMode final int mode) {
         switch (mode) {
diff --git a/biometric/src/main/AndroidManifest.xml b/biometric/src/main/AndroidManifest.xml
index d61555c..c567445 100644
--- a/biometric/src/main/AndroidManifest.xml
+++ b/biometric/src/main/AndroidManifest.xml
@@ -18,6 +18,7 @@
 
     <uses-permission android:name="android.permission.USE_BIOMETRIC" />
 
+    <!--suppress DeprecatedClassUsageInspection -->
     <uses-permission android:name="android.permission.USE_FINGERPRINT" />
 
     <application>
diff --git a/browser/src/main/java/androidx/browser/browseractions/BrowserActionItem.java b/browser/src/main/java/androidx/browser/browseractions/BrowserActionItem.java
index 451aeb8..8b04a7e 100644
--- a/browser/src/main/java/androidx/browser/browseractions/BrowserActionItem.java
+++ b/browser/src/main/java/androidx/browser/browseractions/BrowserActionItem.java
@@ -33,6 +33,7 @@
  *
  * @deprecated Browser Actions are deprecated as of release 1.2.0.
  */
+@SuppressWarnings("deprecation")
 @Deprecated
 public class BrowserActionItem {
     private final String mTitle;
diff --git a/browser/src/main/java/androidx/browser/browseractions/BrowserActionsIntent.java b/browser/src/main/java/androidx/browser/browseractions/BrowserActionsIntent.java
index 9ddd684..94e55c9 100644
--- a/browser/src/main/java/androidx/browser/browseractions/BrowserActionsIntent.java
+++ b/browser/src/main/java/androidx/browser/browseractions/BrowserActionsIntent.java
@@ -53,6 +53,7 @@
  *
  * @deprecated Browser Actions are deprecated as of release 1.2.0.
  */
+@SuppressWarnings("deprecation")
 @Deprecated
 public class BrowserActionsIntent {
     private static final String TAG = "BrowserActions";
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
index 8a04e7d..155e76c 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -116,5 +116,5 @@
     val VIEWPAGER2 = Version("1.1.0-alpha01")
     val WEAR = Version("1.1.0-alpha01")
     val WEBKIT = Version("1.2.0-alpha01")
-    val WORK = Version("2.3.0-alpha04")
+    val WORK = Version("2.3.0-beta01")
 }
diff --git a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
index 298f17d..3990dda 100644
--- a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
@@ -76,7 +76,7 @@
     ignore(LibraryGroups.FRAGMENT.group, "fragment-lint")
     ignore(LibraryGroups.FRAGMENT.group, "fragment-testing-lint")
     ignore(LibraryGroups.FRAGMENT.group, "fragment-truth")
-    prebuilts(LibraryGroups.FRAGMENT, "1.2.0-rc01")
+    prebuilts(LibraryGroups.FRAGMENT, "1.2.0-rc02")
     prebuilts(LibraryGroups.GRIDLAYOUT, "1.0.0")
     prebuilts(LibraryGroups.HEIFWRITER, "1.0.0")
     prebuilts(LibraryGroups.INTERPOLATOR, "1.0.0")
diff --git a/busytown/androidx_test_dependent_apks.sh b/busytown/androidx_test_dependent_apks.sh
index ba3c49e..c9d2f1f 100755
--- a/busytown/androidx_test_dependent_apks.sh
+++ b/busytown/androidx_test_dependent_apks.sh
@@ -10,4 +10,4 @@
 cd "$SCRIPT_DIR/../../.."
 
 OUT_DIR=out DIST_DIR="$DIST_DIR" ANDROID_HOME=`pwd`/prebuilts/fullsdk-linux frameworks/support/gradlew -p frameworks/support --no-daemon buildTestApks -Pandroidx.enableAffectedModuleDetection -Pandroidx.dependentProjects
-OUT_DIR=out/ui DIST_DIR="$DIST_DIR/ui" ANDROID_HOME=`pwd`/prebuilts/fullsdk-linux frameworks/support/ui/gradlew -p frameworks/support/ui --no-daemon buildTestApks -Pandroidx.enableAffectedModuleDetection -Pandroidx.dependentProjects'
+OUT_DIR=out/ui DIST_DIR="$DIST_DIR/ui" ANDROID_HOME=`pwd`/prebuilts/fullsdk-linux frameworks/support/ui/gradlew -p frameworks/support/ui --no-daemon buildTestApks -Pandroidx.enableAffectedModuleDetection -Pandroidx.dependentProjects
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java
index e9c00f0..f18b2e8 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java
@@ -264,6 +264,7 @@
      *
      * @return false if no camera
      */
+    @SuppressWarnings("deprecation")
     public static boolean deviceHasCamera() {
         // TODO Think about external camera case,
         //  especially no built in camera but there might be some external camera
diff --git a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CaptureViewOnTouchListener.java b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CaptureViewOnTouchListener.java
index 57223a2..f770e0b 100644
--- a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CaptureViewOnTouchListener.java
+++ b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CaptureViewOnTouchListener.java
@@ -222,6 +222,7 @@
 
     private void broadcastPicture(File file) {
         if (Build.VERSION.SDK_INT < 24) {
+            @SuppressWarnings("deprecation")
             Intent intent = new Intent(Camera.ACTION_NEW_PICTURE);
             intent.setData(Uri.fromFile(file));
             mCameraView.getContext().sendBroadcast(intent);
@@ -234,6 +235,7 @@
 
     private void broadcastVideo(File file) {
         if (Build.VERSION.SDK_INT < 24) {
+            @SuppressWarnings("deprecation")
             Intent intent = new Intent(Camera.ACTION_NEW_VIDEO);
             intent.setData(Uri.fromFile(file));
             mCameraView.getContext().sendBroadcast(intent);
diff --git a/core/core/src/main/java/androidx/core/accessibilityservice/AccessibilityServiceInfoCompat.java b/core/core/src/main/java/androidx/core/accessibilityservice/AccessibilityServiceInfoCompat.java
index a8214fd..31d258c 100644
--- a/core/core/src/main/java/androidx/core/accessibilityservice/AccessibilityServiceInfoCompat.java
+++ b/core/core/src/main/java/androidx/core/accessibilityservice/AccessibilityServiceInfoCompat.java
@@ -191,13 +191,13 @@
      * @param packageManager The current package manager
      * @return The localized description.
      */
+    @SuppressWarnings("deprecation")
     @Nullable
     public static String loadDescription(
             @NonNull AccessibilityServiceInfo info, @NonNull PackageManager packageManager) {
         if (Build.VERSION.SDK_INT >= 16) {
             return info.loadDescription(packageManager);
         } else {
-            //noinspection deprecation
             return info.getDescription();
         }
     }
@@ -282,11 +282,11 @@
      * @see #CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY
      * @see #CAPABILITY_CAN_FILTER_KEY_EVENTS
      */
+    @SuppressWarnings("deprecation")
     public static int getCapabilities(@NonNull AccessibilityServiceInfo info) {
         if (Build.VERSION.SDK_INT >= 18) {
             return info.getCapabilities();
         } else {
-            //noinspection deprecation
             if (info.getCanRetrieveWindowContent()) {
                 return CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT;
             }
diff --git a/core/core/src/main/java/androidx/core/content/ContextCompat.java b/core/core/src/main/java/androidx/core/content/ContextCompat.java
index 597f879..6b0af66 100644
--- a/core/core/src/main/java/androidx/core/content/ContextCompat.java
+++ b/core/core/src/main/java/androidx/core/content/ContextCompat.java
@@ -448,6 +448,7 @@
      *           The value 0 is an invalid identifier.
      * @return Drawable An object that can be used to draw this resource.
      */
+    @SuppressWarnings("deprecation")
     @Nullable
     public static Drawable getDrawable(@NonNull Context context, @DrawableRes int id) {
         if (Build.VERSION.SDK_INT >= 21) {
@@ -485,6 +486,7 @@
      * @throws android.content.res.Resources.NotFoundException if the given ID
      *         does not exist.
      */
+    @SuppressWarnings("deprecation")
     @Nullable
     public static ColorStateList getColorStateList(@NonNull Context context,
             @ColorRes int id) {
@@ -508,6 +510,7 @@
      * @throws android.content.res.Resources.NotFoundException if the given ID
      *         does not exist.
      */
+    @SuppressWarnings("deprecation")
     @ColorInt
     public static int getColor(@NonNull Context context, @ColorRes int id) {
         if (Build.VERSION.SDK_INT >= 23) {
diff --git a/core/core/src/main/java/androidx/core/content/pm/PackageInfoCompat.java b/core/core/src/main/java/androidx/core/content/pm/PackageInfoCompat.java
index bcd55b3..b7e7452 100644
--- a/core/core/src/main/java/androidx/core/content/pm/PackageInfoCompat.java
+++ b/core/core/src/main/java/androidx/core/content/pm/PackageInfoCompat.java
@@ -30,11 +30,11 @@
      *
      * @see PackageInfo#getLongVersionCode()
      */
+    @SuppressWarnings("deprecation")
     public static long getLongVersionCode(@NonNull PackageInfo info) {
         if (Build.VERSION.SDK_INT >= 28) {
             return info.getLongVersionCode();
         }
-        //noinspection deprecation
         return info.versionCode;
     }
 
diff --git a/core/core/src/main/java/androidx/core/content/pm/PermissionInfoCompat.java b/core/core/src/main/java/androidx/core/content/pm/PermissionInfoCompat.java
index 5c3401f..642d767 100644
--- a/core/core/src/main/java/androidx/core/content/pm/PermissionInfoCompat.java
+++ b/core/core/src/main/java/androidx/core/content/pm/PermissionInfoCompat.java
@@ -67,13 +67,13 @@
     /**
      * Return the base permission type of a {@link PermissionInfo}.
      */
+    @SuppressWarnings("deprecation")
     @SuppressLint("WrongConstant") // for "PermissionInfo.PROTECTION_MASK_BASE"
     @Protection
     public static int getProtection(@NonNull PermissionInfo permissionInfo) {
         if (Build.VERSION.SDK_INT >= 28) {
             return permissionInfo.getProtection();
         } else {
-            //noinspection deprecation
             return permissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE;
         }
     }
@@ -81,13 +81,13 @@
     /**
      * Return the additional protection flags of a {@link PermissionInfo}.
      */
+    @SuppressWarnings("deprecation")
     @SuppressLint("WrongConstant") // for "~PermissionInfo.PROTECTION_MASK_BASE"
     @ProtectionFlags
     public static int getProtectionFlags(@NonNull PermissionInfo permissionInfo) {
         if (Build.VERSION.SDK_INT >= 28) {
             return permissionInfo.getProtectionFlags();
         } else {
-            //noinspection deprecation
             return permissionInfo.protectionLevel & ~PermissionInfo.PROTECTION_MASK_BASE;
         }
     }
diff --git a/core/core/src/main/java/androidx/core/database/CursorWindowCompat.java b/core/core/src/main/java/androidx/core/database/CursorWindowCompat.java
index 855c25c..01a48df 100644
--- a/core/core/src/main/java/androidx/core/database/CursorWindowCompat.java
+++ b/core/core/src/main/java/androidx/core/database/CursorWindowCompat.java
@@ -36,6 +36,7 @@
      * <p>
      * Prior to Android P, this method will return a CursorWindow of size defined by the platform.
      */
+    @SuppressWarnings("deprecation")
     @NonNull
     public static CursorWindow create(@Nullable String name, long windowSizeBytes) {
         if (Build.VERSION.SDK_INT >= 28) {
@@ -43,7 +44,6 @@
         } else if (Build.VERSION.SDK_INT >= 15) {
             return new CursorWindow(name);
         } else {
-            //noinspection deprecation
             return new CursorWindow(false);
         }
     }
diff --git a/core/core/src/main/java/androidx/core/os/ConfigurationCompat.java b/core/core/src/main/java/androidx/core/os/ConfigurationCompat.java
index 423c1fd..e6b4617 100644
--- a/core/core/src/main/java/androidx/core/os/ConfigurationCompat.java
+++ b/core/core/src/main/java/androidx/core/os/ConfigurationCompat.java
@@ -35,6 +35,7 @@
      *
      * @return The locale list.
      */
+    @SuppressWarnings("deprecation")
     @NonNull
     public static LocaleListCompat getLocales(@NonNull Configuration configuration) {
         if (SDK_INT >= 24) {
diff --git a/core/core/src/main/java/androidx/core/text/HtmlCompat.java b/core/core/src/main/java/androidx/core/text/HtmlCompat.java
index 8d9b932..b132c00 100644
--- a/core/core/src/main/java/androidx/core/text/HtmlCompat.java
+++ b/core/core/src/main/java/androidx/core/text/HtmlCompat.java
@@ -141,12 +141,12 @@
      * Invokes {@link Html#fromHtml(String, int)} on API 24 and newer, otherwise {@code flags} are
      * ignored and {@link Html#fromHtml(String)} is used.
      */
+    @SuppressWarnings("deprecation")
     @NonNull
     public static Spanned fromHtml(@NonNull String source, @FromHtmlFlags int flags) {
         if (Build.VERSION.SDK_INT >= 24) {
             return Html.fromHtml(source, flags);
         }
-        //noinspection deprecation
         return Html.fromHtml(source);
     }
 
@@ -155,13 +155,13 @@
      * otherwise {@code flags} are ignored and
      * {@link Html#fromHtml(String, ImageGetter, TagHandler)} is used.
      */
+    @SuppressWarnings("deprecation")
     @NonNull
     public static Spanned fromHtml(@NonNull String source, @FromHtmlFlags int flags,
             @Nullable ImageGetter imageGetter, @Nullable TagHandler tagHandler) {
         if (Build.VERSION.SDK_INT >= 24) {
             return Html.fromHtml(source, flags, imageGetter, tagHandler);
         }
-        //noinspection deprecation
         return Html.fromHtml(source, imageGetter, tagHandler);
     }
 
@@ -169,12 +169,12 @@
      * Invokes {@link Html#toHtml(Spanned, int)} on API 24 or newer, otherwise {@code options} are
      * ignored and {@link Html#toHtml(Spanned)} is used.
      */
+    @SuppressWarnings("deprecation")
     @NonNull
     public static String toHtml(@NonNull Spanned text, @ToHtmlOptions int options) {
         if (Build.VERSION.SDK_INT >= 24) {
             return Html.toHtml(text, options);
         }
-        //noinspection deprecation
         return Html.toHtml(text);
     }
 
diff --git a/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java b/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java
index 9e7c758..93e5a90 100644
--- a/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java
+++ b/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java
@@ -238,6 +238,7 @@
      *
      * @deprecated Use {@link AccessibilityEvent#appendRecord(AccessibilityRecord)} directly.
      */
+    @SuppressWarnings("deprecation")
     @Deprecated
     public static void appendRecord(AccessibilityEvent event, AccessibilityRecordCompat record) {
         event.appendRecord((AccessibilityRecord) record.getImpl());
@@ -251,6 +252,7 @@
      *
      * @deprecated Use {@link AccessibilityEvent#getRecord(int)} directly.
      */
+    @SuppressWarnings("deprecation")
     @Deprecated
     public static AccessibilityRecordCompat getRecord(AccessibilityEvent event, int index) {
         return new AccessibilityRecordCompat(event.getRecord(index));
@@ -271,6 +273,7 @@
      *
      * @deprecated Use the {@link AccessibilityEvent} directly as {@link AccessibilityRecord}.
      */
+    @SuppressWarnings("deprecation")
     @Deprecated
     public static AccessibilityRecordCompat asRecord(AccessibilityEvent event) {
         return new AccessibilityRecordCompat(event);
diff --git a/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java b/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java
index 432e67c..acdf35e 100644
--- a/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java
+++ b/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java
@@ -40,6 +40,7 @@
      * @deprecated Use {@link AccessibilityManager#addAccessibilityStateChangeListener(
      *             AccessibilityManager.AccessibilityStateChangeListener)} directly.
      */
+    @SuppressWarnings("deprecation")
     @Deprecated
     public static boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
             AccessibilityStateChangeListener listener) {
@@ -60,6 +61,7 @@
      * @deprecated Use {@link AccessibilityManager#removeAccessibilityStateChangeListener(
      *             AccessibilityManager.AccessibilityStateChangeListener)} directly.
      */
+    @SuppressWarnings("deprecation")
     @Deprecated
     public static boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
             AccessibilityStateChangeListener listener) {
@@ -70,6 +72,7 @@
                 new AccessibilityStateChangeListenerWrapper(listener));
     }
 
+    @SuppressWarnings("deprecation")
     private static class AccessibilityStateChangeListenerWrapper
             implements AccessibilityManager.AccessibilityStateChangeListener {
         AccessibilityStateChangeListener mListener;
@@ -232,6 +235,7 @@
      * @deprecated Use {@link AccessibilityManager.AccessibilityStateChangeListener} directly
      * instead of this listener.
      */
+    @SuppressWarnings("deprecation")
     @Deprecated
     public static abstract class AccessibilityStateChangeListenerCompat
             implements AccessibilityStateChangeListener {
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 1d3090f..48a81ec 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
@@ -948,6 +948,7 @@
          * @return If the item is a heading.
          * @deprecated Use {@link AccessibilityNodeInfoCompat#isHeading()}
          */
+        @SuppressWarnings("deprecation")
         @Deprecated
         public boolean isHeading() {
             if (Build.VERSION.SDK_INT >= 19) {
@@ -1612,6 +1613,7 @@
      * @param object The info to wrap.
      * @return A wrapper for if the object is not null, null otherwise.
      */
+    @SuppressWarnings("deprecation")
     static AccessibilityNodeInfoCompat wrapNonNullInstance(Object object) {
         if (object != null) {
             return new AccessibilityNodeInfoCompat(object);
@@ -3817,6 +3819,7 @@
      *
      * @return {@code true} if the node is a heading, {@code false} otherwise.
      */
+    @SuppressWarnings("deprecation")
     public boolean isHeading() {
         if (Build.VERSION.SDK_INT >= 28) {
             return mInfo.isHeading();
@@ -4017,6 +4020,7 @@
         return true;
     }
 
+    @SuppressWarnings("deprecation")
     @NonNull
     @Override
     public String toString() {
diff --git a/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java b/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java
index 2e8ced2..e3fe75c 100644
--- a/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java
+++ b/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java
@@ -64,6 +64,7 @@
      *
      * @deprecated Use {@link AccessibilityRecord#obtain(AccessibilityRecord)} directly.
      */
+    @SuppressWarnings("deprecation")
     @Deprecated
     public static AccessibilityRecordCompat obtain(AccessibilityRecordCompat record) {
         return new AccessibilityRecordCompat(AccessibilityRecord.obtain(record.mRecord));
@@ -77,6 +78,7 @@
      *
      * @deprecated Use {@link AccessibilityRecord#obtain()} directly.
      */
+    @SuppressWarnings("deprecation")
     @Deprecated
     public static AccessibilityRecordCompat obtain() {
         return new AccessibilityRecordCompat(AccessibilityRecord.obtain());
diff --git a/cursoradapter/src/main/java/androidx/cursoradapter/widget/CursorAdapter.java b/cursoradapter/src/main/java/androidx/cursoradapter/widget/CursorAdapter.java
index 5984051..f0fc461 100644
--- a/cursoradapter/src/main/java/androidx/cursoradapter/widget/CursorAdapter.java
+++ b/cursoradapter/src/main/java/androidx/cursoradapter/widget/CursorAdapter.java
@@ -179,6 +179,7 @@
 
     @SuppressWarnings("deprecation")
     void init(Context context, Cursor c, int flags) {
+        // Maintained for compatibility.
         if ((flags & FLAG_AUTO_REQUERY) == FLAG_AUTO_REQUERY) {
             flags |= FLAG_REGISTER_CONTENT_OBSERVER;
             mAutoRequery = true;
diff --git a/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterface.java b/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterface.java
index 4b67eba..19e58ae 100644
--- a/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterface.java
+++ b/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterface.java
@@ -4018,11 +4018,13 @@
      *
      * @param tag the name of the tag.
      */
+    @SuppressWarnings("deprecation")
     @Nullable
     private ExifAttribute getExifAttribute(@NonNull String tag) {
         if (tag == null) {
             throw new NullPointerException("tag shouldn't be null");
         }
+        // Maintain compatibility.
         if (TAG_ISO_SPEED_RATINGS.equals(tag)) {
             if (DEBUG) {
                 Log.d(TAG, "getExifAttribute: Replacing TAG_ISO_SPEED_RATINGS with "
@@ -4137,10 +4139,12 @@
      * @param tag the name of the tag.
      * @param value the value of the tag.
      */
+    @SuppressWarnings("deprecation")
     public void setAttribute(@NonNull String tag, @Nullable String value) {
         if (tag == null) {
             throw new NullPointerException("tag shouldn't be null");
         }
+        // Maintain compatibility.
         if (TAG_ISO_SPEED_RATINGS.equals(tag)) {
             if (DEBUG) {
                 Log.d(TAG, "setAttribute: Replacing TAG_ISO_SPEED_RATINGS with "
diff --git a/leanback/src/androidTest/java/androidx/leanback/app/DetailsSupportFragmentTest.java b/leanback/src/androidTest/java/androidx/leanback/app/DetailsSupportFragmentTest.java
index b7dfc34..2d8f4df 100644
--- a/leanback/src/androidTest/java/androidx/leanback/app/DetailsSupportFragmentTest.java
+++ b/leanback/src/androidTest/java/androidx/leanback/app/DetailsSupportFragmentTest.java
@@ -47,6 +47,7 @@
 import androidx.leanback.widget.ParallaxTarget;
 import androidx.leanback.widget.RecyclerViewParallax;
 import androidx.leanback.widget.VerticalGridView;
+import androidx.test.filters.FlakyTest;
 import androidx.test.filters.LargeTest;
 import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
@@ -472,6 +473,7 @@
         fragmentOnStartWithVideoInternal(DetailsSupportFragmentWithVideo2.class);
     }
 
+    @FlakyTest
     @Test
     public void navigateBetweenRowsAndTitle() throws Throwable {
         SingleSupportFragmentTestActivity activity =
diff --git a/leanback/src/androidTest/java/androidx/leanback/widget/GridWidgetTest.java b/leanback/src/androidTest/java/androidx/leanback/widget/GridWidgetTest.java
index 23b0ef3..574cd15 100644
--- a/leanback/src/androidTest/java/androidx/leanback/widget/GridWidgetTest.java
+++ b/leanback/src/androidTest/java/androidx/leanback/widget/GridWidgetTest.java
@@ -54,6 +54,7 @@
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.FlakyTest;
 import androidx.test.filters.LargeTest;
 import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
@@ -4342,6 +4343,7 @@
         assertEquals(0, mGridView.getSelectedPosition());
     }
 
+    @FlakyTest
     @Test
     public void testExtraLayoutSpace() throws Throwable {
         Intent intent = new Intent();
@@ -5389,6 +5391,7 @@
                 mGridView.findViewHolderForAdapterPosition(29).itemView, lastChild);
     }
 
+    @FlakyTest
     @Test
     public void testAnimateOutBlockLayout() throws Throwable {
         Intent intent = new Intent();
diff --git a/leanback/src/main/java/androidx/leanback/app/BackgroundFragment.java b/leanback/src/main/java/androidx/leanback/app/BackgroundFragment.java
index d02edee..e9e4615 100644
--- a/leanback/src/main/java/androidx/leanback/app/BackgroundFragment.java
+++ b/leanback/src/main/java/androidx/leanback/app/BackgroundFragment.java
@@ -21,6 +21,7 @@
 
 /**
  * Fragment used by the background manager.
+ *
  * @hide
  */
 @RestrictTo(LIBRARY_GROUP_PREFIX)
diff --git a/leanback/src/main/java/androidx/leanback/widget/AbstractDetailsDescriptionPresenter.java b/leanback/src/main/java/androidx/leanback/widget/AbstractDetailsDescriptionPresenter.java
index 74105c5..ce3ef92 100644
--- a/leanback/src/main/java/androidx/leanback/widget/AbstractDetailsDescriptionPresenter.java
+++ b/leanback/src/main/java/androidx/leanback/widget/AbstractDetailsDescriptionPresenter.java
@@ -26,7 +26,7 @@
 
 /**
  * An abstract {@link Presenter} for rendering a detailed description of an
- * item. Typically this Presenter will be used in a {@link DetailsOverviewRowPresenter}
+ * item. Typically this Presenter will be used in a {@link FullWidthDetailsOverviewRowPresenter}
  * or {@link PlaybackControlsRowPresenter}.
  *
  * <p>Subclasses must override {@link #onBindDescription} to implement the data
diff --git a/leanback/src/main/java/androidx/leanback/widget/picker/Picker.java b/leanback/src/main/java/androidx/leanback/widget/picker/Picker.java
index c367f35..cd2a421 100644
--- a/leanback/src/main/java/androidx/leanback/widget/picker/Picker.java
+++ b/leanback/src/main/java/androidx/leanback/widget/picker/Picker.java
@@ -99,6 +99,7 @@
      * @return The separator that will be populated between all the Picker columns.
      * @deprecated Use {@link #getSeparators()}
      */
+    @Deprecated
     public final CharSequence getSeparator() {
         return mSeparators.get(0);
     }
diff --git a/media/src/main/java/android/support/v4/media/session/PlaybackStateCompat.java b/media/src/main/java/android/support/v4/media/session/PlaybackStateCompat.java
index c0fa895..40d565a 100644
--- a/media/src/main/java/android/support/v4/media/session/PlaybackStateCompat.java
+++ b/media/src/main/java/android/support/v4/media/session/PlaybackStateCompat.java
@@ -1327,6 +1327,7 @@
          * @return this
          * @deprecated Use {@link #setErrorMessage(int, CharSequence)} instead.
          */
+        @Deprecated
         public Builder setErrorMessage(CharSequence errorMessage) {
             mErrorMessage = errorMessage;
             return this;
diff --git a/media/src/main/java/androidx/media/AudioManagerCompat.java b/media/src/main/java/androidx/media/AudioManagerCompat.java
index 4186245..948aa82 100644
--- a/media/src/main/java/androidx/media/AudioManagerCompat.java
+++ b/media/src/main/java/androidx/media/AudioManagerCompat.java
@@ -75,6 +75,7 @@
      *     AudioManager#AUDIOFOCUS_REQUEST_GRANTED}.
      * @throws NullPointerException if passed a null argument
      */
+    @SuppressWarnings("deprecation")
     public static int requestAudioFocus(
             @NonNull AudioManager audioManager, @NonNull AudioFocusRequestCompat focusRequest) {
         if (audioManager == null) {
@@ -103,6 +104,7 @@
      *     AudioManager#AUDIOFOCUS_REQUEST_GRANTED}
      * @throws IllegalArgumentException if passed a null argument
      */
+    @SuppressWarnings("deprecation")
     public static int abandonAudioFocusRequest(
             @NonNull AudioManager audioManager, @NonNull AudioFocusRequestCompat focusRequest) {
         if (audioManager == null) {
diff --git a/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/room/CustomerViewModel.java b/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/room/CustomerViewModel.java
index a4d9778..535d317 100644
--- a/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/room/CustomerViewModel.java
+++ b/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/room/CustomerViewModel.java
@@ -85,12 +85,14 @@
                 () -> mDatabase.getCustomerDao().removeAll());
     }
 
+    @SuppressWarnings("deprecation")
     private static <K> LiveData<PagedList<Customer>> getLivePagedList(
             K initialLoadKey, DataSource.Factory<K, Customer> dataSourceFactory) {
         PagedList.Config config = new PagedList.Config.Builder()
                 .setPageSize(10)
                 .setEnablePlaceholders(false)
                 .build();
+        // Maintained for compatibility.
         return new LivePagedListBuilder<>(dataSourceFactory, config)
                 .setInitialLoadKey(initialLoadKey)
                 .build();
diff --git a/preference/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragment.java b/preference/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragment.java
index 016e361..82dfd99 100644
--- a/preference/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragment.java
+++ b/preference/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragment.java
@@ -28,6 +28,7 @@
 /**
  * @deprecated Use {@link EditTextPreferenceDialogFragmentCompat} instead
  */
+@SuppressWarnings("deprecation")
 @Deprecated
 public class EditTextPreferenceDialogFragment extends PreferenceDialogFragment {
 
diff --git a/samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java
index 0566df9..5dc4e53 100644
--- a/samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java
+++ b/samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java
@@ -143,12 +143,12 @@
      */
     private class FirstLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener {
         @Override
+        @SuppressWarnings("deprecation")
         public void onGlobalLayout() {
             mActionBar.onFirstLayout();
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                 mSlidingLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
             } else {
-                //noinspection deprecation
                 mSlidingLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
             }
         }
diff --git a/tv-provider/src/main/java/androidx/tvprovider/media/tv/BaseProgram.java b/tv-provider/src/main/java/androidx/tvprovider/media/tv/BaseProgram.java
index ff1a99c..fc74e69 100644
--- a/tv-provider/src/main/java/androidx/tvprovider/media/tv/BaseProgram.java
+++ b/tv-provider/src/main/java/androidx/tvprovider/media/tv/BaseProgram.java
@@ -116,6 +116,7 @@
      * @return The season display number for the program.
      * @see androidx.tvprovider.media.tv.TvContractCompat.Programs#COLUMN_SEASON_DISPLAY_NUMBER
      */
+    @SuppressWarnings("deprecation")
     public String getSeasonNumber() {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             return mValues.getAsString(Programs.COLUMN_SEASON_DISPLAY_NUMBER);
@@ -128,6 +129,7 @@
      * @return The episode display number for the program.
      * @see androidx.tvprovider.media.tv.TvContractCompat.Programs#COLUMN_EPISODE_DISPLAY_NUMBER
      */
+    @SuppressWarnings("deprecation")
     public String getEpisodeNumber() {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             return mValues.getAsString(Programs.COLUMN_EPISODE_DISPLAY_NUMBER);
@@ -335,6 +337,7 @@
      * @param cursor A row from the TV Input Framework database.
      * @param builder A Builder to set the fields.
      */
+    @SuppressWarnings("deprecation")
     static void setFieldsFromCursor(Cursor cursor, Builder builder) {
         // TODO: Add additional API which does not use costly getColumnIndex().
         int index;
@@ -465,6 +468,7 @@
         }
     }
 
+    @SuppressWarnings("deprecation")
     private static String[] getProjection() {
         String[] baseColumns = new String[] {
                 BaseTvColumns._ID,
@@ -612,6 +616,7 @@
          * @see androidx.tvprovider.media.tv.TvContractCompat.Programs#COLUMN_SEASON_DISPLAY_NUMBER
          * @see androidx.tvprovider.media.tv.TvContractCompat.Programs#COLUMN_SEASON_NUMBER
          */
+        @SuppressWarnings("deprecation")
         public T setSeasonNumber(String seasonNumber, int numericalSeasonNumber) {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                 mValues.put(Programs.COLUMN_SEASON_DISPLAY_NUMBER, seasonNumber);
@@ -644,6 +649,7 @@
          * @see androidx.tvprovider.media.tv.TvContractCompat.Programs#COLUMN_EPISODE_DISPLAY_NUMBER
          * @see androidx.tvprovider.media.tv.TvContractCompat.Programs#COLUMN_EPISODE_NUMBER
          */
+        @SuppressWarnings("deprecation")
         public T setEpisodeNumber(String episodeNumber, int numericalEpisodeNumber) {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                 mValues.put(Programs.COLUMN_EPISODE_DISPLAY_NUMBER, episodeNumber);
diff --git a/ui/ui-android-text/src/main/java/androidx/text/StaticLayoutCompat.java b/ui/ui-android-text/src/main/java/androidx/text/StaticLayoutCompat.java
index 0059db8..b1cbae1 100644
--- a/ui/ui-android-text/src/main/java/androidx/text/StaticLayoutCompat.java
+++ b/ui/ui-android-text/src/main/java/androidx/text/StaticLayoutCompat.java
@@ -530,12 +530,6 @@
             if (Build.VERSION.SDK_INT >= 26) {
                 builder.setJustificationMode(mJustificationMode);
             }
-//            if (Build.VERSION.SDK_INT >= 28) {
-//                    TODO(siyamed): last line spacing is required for editable text,
-//                    otherwise we will need tricks
-//                    builder.setAddLastLineLineSpacing(builder.mAddLastLineLineSpacing);
-//                    builder.setUseLineSpacingFromFallbacks(mFallbackLineSpacing);
-//            }
             return builder.build();
         }
 
diff --git a/ui/ui-core/api/0.1.0-dev03.txt b/ui/ui-core/api/0.1.0-dev03.txt
index 4843d75..46d1e29 100644
--- a/ui/ui-core/api/0.1.0-dev03.txt
+++ b/ui/ui-core/api/0.1.0-dev03.txt
@@ -1894,7 +1894,7 @@
     method public androidx.ui.graphics.vector.PathBuilder close();
     method public androidx.ui.graphics.vector.PathBuilder curveTo(float x1, float y1, float x2, float y2, float x3, float y3);
     method public androidx.ui.graphics.vector.PathBuilder curveToRelative(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
-    method public androidx.ui.graphics.vector.PathNode![] getNodes();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getNodes();
     method public androidx.ui.graphics.vector.PathBuilder horizontalLineTo(float x);
     method public androidx.ui.graphics.vector.PathBuilder horizontalLineToRelative(float x);
     method public androidx.ui.graphics.vector.PathBuilder lineTo(float x, float y);
@@ -1956,10 +1956,10 @@
 
   public final class PathParser {
     ctor public PathParser();
-    method public androidx.ui.graphics.vector.PathParser addPathNodes(androidx.ui.graphics.vector.PathNode![] nodes);
+    method public androidx.ui.graphics.vector.PathParser addPathNodes(java.util.List<androidx.ui.graphics.vector.PathNode> nodes);
     method public void clear();
     method public androidx.ui.graphics.vector.PathParser parsePathString(String pathData);
-    method public androidx.ui.graphics.vector.PathNode![] toNodes();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> toNodes();
     method public androidx.ui.graphics.Path toPath(androidx.ui.graphics.Path target = androidx.ui.graphics.Path());
   }
 
diff --git a/ui/ui-core/api/api_lint.ignore b/ui/ui-core/api/api_lint.ignore
index 12a0bbe..6185d0e 100644
--- a/ui/ui-core/api/api_lint.ignore
+++ b/ui/ui-core/api/api_lint.ignore
@@ -57,12 +57,6 @@
     Method parameter should be Collection<Pair> (or subclass) instead of raw array; was `kotlin.Pair<java.lang.Float,androidx.ui.graphics.Color>[]`
 ArrayReturn: androidx.ui.graphics.BrushKt#VerticalGradient(kotlin.Pair<java.lang.Float,androidx.ui.graphics.Color>[], androidx.ui.core.Px, androidx.ui.core.Px, androidx.ui.graphics.TileMode) parameter #0:
     Method parameter should be Collection<Pair> (or subclass) instead of raw array; was `kotlin.Pair<java.lang.Float,androidx.ui.graphics.Color>[]`
-ArrayReturn: androidx.ui.graphics.vector.PathBuilder#getNodes():
-    Method should return Collection<PathNode> (or subclass) instead of raw array; was `androidx.ui.graphics.vector.PathNode[]`
-ArrayReturn: androidx.ui.graphics.vector.PathParser#addPathNodes(androidx.ui.graphics.vector.PathNode[]) parameter #0:
-    Method parameter should be Collection<PathNode> (or subclass) instead of raw array; was `androidx.ui.graphics.vector.PathNode[]`
-ArrayReturn: androidx.ui.graphics.vector.PathParser#toNodes():
-    Method should return Collection<PathNode> (or subclass) instead of raw array; was `androidx.ui.graphics.vector.PathNode[]`
 ArrayReturn: androidx.ui.testutils.PointerInputTestUtilKt#invokeOverAllPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.ui.core.IntPxSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange[], androidx.ui.core.IntPxSize) parameter #1:
     Method parameter should be Collection<PointerInputChange> (or subclass) instead of raw array; was `androidx.ui.core.PointerInputChange[]`
 ArrayReturn: androidx.ui.testutils.PointerInputTestUtilKt#invokeOverPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.ui.core.IntPxSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, java.util.List<androidx.ui.core.PointerInputChange>, androidx.ui.core.PointerEventPass[], androidx.ui.core.IntPxSize) parameter #2:
diff --git a/ui/ui-core/api/current.txt b/ui/ui-core/api/current.txt
index 4843d75..46d1e29 100644
--- a/ui/ui-core/api/current.txt
+++ b/ui/ui-core/api/current.txt
@@ -1894,7 +1894,7 @@
     method public androidx.ui.graphics.vector.PathBuilder close();
     method public androidx.ui.graphics.vector.PathBuilder curveTo(float x1, float y1, float x2, float y2, float x3, float y3);
     method public androidx.ui.graphics.vector.PathBuilder curveToRelative(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
-    method public androidx.ui.graphics.vector.PathNode![] getNodes();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getNodes();
     method public androidx.ui.graphics.vector.PathBuilder horizontalLineTo(float x);
     method public androidx.ui.graphics.vector.PathBuilder horizontalLineToRelative(float x);
     method public androidx.ui.graphics.vector.PathBuilder lineTo(float x, float y);
@@ -1956,10 +1956,10 @@
 
   public final class PathParser {
     ctor public PathParser();
-    method public androidx.ui.graphics.vector.PathParser addPathNodes(androidx.ui.graphics.vector.PathNode![] nodes);
+    method public androidx.ui.graphics.vector.PathParser addPathNodes(java.util.List<androidx.ui.graphics.vector.PathNode> nodes);
     method public void clear();
     method public androidx.ui.graphics.vector.PathParser parsePathString(String pathData);
-    method public androidx.ui.graphics.vector.PathNode![] toNodes();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> toNodes();
     method public androidx.ui.graphics.Path toPath(androidx.ui.graphics.Path target = androidx.ui.graphics.Path());
   }
 
diff --git a/ui/ui-core/api/public_plus_experimental_0.1.0-dev03.txt b/ui/ui-core/api/public_plus_experimental_0.1.0-dev03.txt
index 4843d75..46d1e29 100644
--- a/ui/ui-core/api/public_plus_experimental_0.1.0-dev03.txt
+++ b/ui/ui-core/api/public_plus_experimental_0.1.0-dev03.txt
@@ -1894,7 +1894,7 @@
     method public androidx.ui.graphics.vector.PathBuilder close();
     method public androidx.ui.graphics.vector.PathBuilder curveTo(float x1, float y1, float x2, float y2, float x3, float y3);
     method public androidx.ui.graphics.vector.PathBuilder curveToRelative(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
-    method public androidx.ui.graphics.vector.PathNode![] getNodes();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getNodes();
     method public androidx.ui.graphics.vector.PathBuilder horizontalLineTo(float x);
     method public androidx.ui.graphics.vector.PathBuilder horizontalLineToRelative(float x);
     method public androidx.ui.graphics.vector.PathBuilder lineTo(float x, float y);
@@ -1956,10 +1956,10 @@
 
   public final class PathParser {
     ctor public PathParser();
-    method public androidx.ui.graphics.vector.PathParser addPathNodes(androidx.ui.graphics.vector.PathNode![] nodes);
+    method public androidx.ui.graphics.vector.PathParser addPathNodes(java.util.List<androidx.ui.graphics.vector.PathNode> nodes);
     method public void clear();
     method public androidx.ui.graphics.vector.PathParser parsePathString(String pathData);
-    method public androidx.ui.graphics.vector.PathNode![] toNodes();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> toNodes();
     method public androidx.ui.graphics.Path toPath(androidx.ui.graphics.Path target = androidx.ui.graphics.Path());
   }
 
diff --git a/ui/ui-core/api/public_plus_experimental_current.txt b/ui/ui-core/api/public_plus_experimental_current.txt
index 4843d75..46d1e29 100644
--- a/ui/ui-core/api/public_plus_experimental_current.txt
+++ b/ui/ui-core/api/public_plus_experimental_current.txt
@@ -1894,7 +1894,7 @@
     method public androidx.ui.graphics.vector.PathBuilder close();
     method public androidx.ui.graphics.vector.PathBuilder curveTo(float x1, float y1, float x2, float y2, float x3, float y3);
     method public androidx.ui.graphics.vector.PathBuilder curveToRelative(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
-    method public androidx.ui.graphics.vector.PathNode![] getNodes();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getNodes();
     method public androidx.ui.graphics.vector.PathBuilder horizontalLineTo(float x);
     method public androidx.ui.graphics.vector.PathBuilder horizontalLineToRelative(float x);
     method public androidx.ui.graphics.vector.PathBuilder lineTo(float x, float y);
@@ -1956,10 +1956,10 @@
 
   public final class PathParser {
     ctor public PathParser();
-    method public androidx.ui.graphics.vector.PathParser addPathNodes(androidx.ui.graphics.vector.PathNode![] nodes);
+    method public androidx.ui.graphics.vector.PathParser addPathNodes(java.util.List<androidx.ui.graphics.vector.PathNode> nodes);
     method public void clear();
     method public androidx.ui.graphics.vector.PathParser parsePathString(String pathData);
-    method public androidx.ui.graphics.vector.PathNode![] toNodes();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> toNodes();
     method public androidx.ui.graphics.Path toPath(androidx.ui.graphics.Path target = androidx.ui.graphics.Path());
   }
 
diff --git a/ui/ui-core/api/restricted_0.1.0-dev03.txt b/ui/ui-core/api/restricted_0.1.0-dev03.txt
index 4843d75..46d1e29 100644
--- a/ui/ui-core/api/restricted_0.1.0-dev03.txt
+++ b/ui/ui-core/api/restricted_0.1.0-dev03.txt
@@ -1894,7 +1894,7 @@
     method public androidx.ui.graphics.vector.PathBuilder close();
     method public androidx.ui.graphics.vector.PathBuilder curveTo(float x1, float y1, float x2, float y2, float x3, float y3);
     method public androidx.ui.graphics.vector.PathBuilder curveToRelative(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
-    method public androidx.ui.graphics.vector.PathNode![] getNodes();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getNodes();
     method public androidx.ui.graphics.vector.PathBuilder horizontalLineTo(float x);
     method public androidx.ui.graphics.vector.PathBuilder horizontalLineToRelative(float x);
     method public androidx.ui.graphics.vector.PathBuilder lineTo(float x, float y);
@@ -1956,10 +1956,10 @@
 
   public final class PathParser {
     ctor public PathParser();
-    method public androidx.ui.graphics.vector.PathParser addPathNodes(androidx.ui.graphics.vector.PathNode![] nodes);
+    method public androidx.ui.graphics.vector.PathParser addPathNodes(java.util.List<androidx.ui.graphics.vector.PathNode> nodes);
     method public void clear();
     method public androidx.ui.graphics.vector.PathParser parsePathString(String pathData);
-    method public androidx.ui.graphics.vector.PathNode![] toNodes();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> toNodes();
     method public androidx.ui.graphics.Path toPath(androidx.ui.graphics.Path target = androidx.ui.graphics.Path());
   }
 
diff --git a/ui/ui-core/api/restricted_current.txt b/ui/ui-core/api/restricted_current.txt
index 4843d75..46d1e29 100644
--- a/ui/ui-core/api/restricted_current.txt
+++ b/ui/ui-core/api/restricted_current.txt
@@ -1894,7 +1894,7 @@
     method public androidx.ui.graphics.vector.PathBuilder close();
     method public androidx.ui.graphics.vector.PathBuilder curveTo(float x1, float y1, float x2, float y2, float x3, float y3);
     method public androidx.ui.graphics.vector.PathBuilder curveToRelative(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
-    method public androidx.ui.graphics.vector.PathNode![] getNodes();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getNodes();
     method public androidx.ui.graphics.vector.PathBuilder horizontalLineTo(float x);
     method public androidx.ui.graphics.vector.PathBuilder horizontalLineToRelative(float x);
     method public androidx.ui.graphics.vector.PathBuilder lineTo(float x, float y);
@@ -1956,10 +1956,10 @@
 
   public final class PathParser {
     ctor public PathParser();
-    method public androidx.ui.graphics.vector.PathParser addPathNodes(androidx.ui.graphics.vector.PathNode![] nodes);
+    method public androidx.ui.graphics.vector.PathParser addPathNodes(java.util.List<androidx.ui.graphics.vector.PathNode> nodes);
     method public void clear();
     method public androidx.ui.graphics.vector.PathParser parsePathString(String pathData);
-    method public androidx.ui.graphics.vector.PathNode![] toNodes();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> toNodes();
     method public androidx.ui.graphics.Path toPath(androidx.ui.graphics.Path target = androidx.ui.graphics.Path());
   }
 
diff --git a/ui/ui-core/src/main/java/androidx/ui/graphics/vector/PathBuilder.kt b/ui/ui-core/src/main/java/androidx/ui/graphics/vector/PathBuilder.kt
index b1cabb1..81d2ee9 100644
--- a/ui/ui-core/src/main/java/androidx/ui/graphics/vector/PathBuilder.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/graphics/vector/PathBuilder.kt
@@ -20,7 +20,7 @@
 
     private val nodes = mutableListOf<PathNode>()
 
-    fun getNodes(): Array<PathNode> = nodes.toTypedArray()
+    fun getNodes(): List<PathNode> = nodes
 
     fun close(): PathBuilder =
         addNode(PathCommand.Close)
diff --git a/ui/ui-core/src/main/java/androidx/ui/graphics/vector/PathParser.kt b/ui/ui-core/src/main/java/androidx/ui/graphics/vector/PathParser.kt
index 5ab3e99..50d0b8f 100644
--- a/ui/ui-core/src/main/java/androidx/ui/graphics/vector/PathParser.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/graphics/vector/PathParser.kt
@@ -79,12 +79,12 @@
         return this
     }
 
-    fun addPathNodes(nodes: Array<PathNode>): PathParser {
+    fun addPathNodes(nodes: List<PathNode>): PathParser {
         this.nodes.addAll(nodes)
         return this
     }
 
-    fun toNodes(): Array<PathNode> = nodes.toTypedArray()
+    fun toNodes(): List<PathNode> = nodes
 
     fun toPath(target: Path = Path()): Path {
         target.reset()
diff --git a/ui/ui-framework/api/0.1.0-dev03.txt b/ui/ui-framework/api/0.1.0-dev03.txt
index 7b4517b..deb9978 100644
--- a/ui/ui-framework/api/0.1.0-dev03.txt
+++ b/ui/ui-framework/api/0.1.0-dev03.txt
@@ -331,7 +331,7 @@
 
   public final class VectorAssetBuilder {
     ctor public VectorAssetBuilder(String name, androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth, float viewportHeight);
-    method public androidx.ui.graphics.vector.VectorAssetBuilder addPath(androidx.ui.graphics.vector.PathNode![] pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
+    method public androidx.ui.graphics.vector.VectorAssetBuilder addPath(java.util.List<androidx.ui.graphics.vector.PathNode> pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
     method public androidx.ui.graphics.vector.VectorAsset build();
     method public void ensureNotConsumed();
     method public androidx.ui.core.Px getDefaultHeight();
@@ -340,7 +340,7 @@
     method public float getViewportHeight();
     method public float getViewportWidth();
     method public androidx.ui.graphics.vector.VectorAssetBuilder popGroup();
-    method public androidx.ui.graphics.vector.VectorAssetBuilder pushGroup(String name = "", float rotate = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, androidx.ui.graphics.vector.PathNode![] clipPathData = EmptyPath);
+    method public androidx.ui.graphics.vector.VectorAssetBuilder pushGroup(String name = "", float rotate = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData = EmptyPath);
   }
 
   public final class VectorAssetKt {
@@ -350,17 +350,17 @@
 
   public final class VectorComposeKt {
     ctor public VectorComposeKt();
-    method public static void DrawVector(androidx.ui.core.Dp defaultWidth, androidx.ui.core.Dp defaultHeight, float viewportWidth = -1.0f, float viewportHeight = -1.0f, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
-    method public static void DrawVector(androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth = defaultWidth.value, float viewportHeight = defaultHeight.value, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
-    method public static void Group(androidx.ui.graphics.vector.VectorScope, String name = "", float rotation = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, androidx.ui.graphics.vector.PathNode![] clipPathData = EmptyPath, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.VectorScope,kotlin.Unit> children);
-    method public static void Path(androidx.ui.graphics.vector.VectorScope, androidx.ui.graphics.vector.PathNode![] pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
+    method public static void DrawVector(androidx.ui.core.Dp defaultWidth, androidx.ui.core.Dp defaultHeight, float viewportWidth = -1.0f, float viewportHeight = -1.0f, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, androidx.ui.core.Alignment alignment = androidx.ui.graphics.vector.VectorComposeKt.DefaultAlignment, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
+    method public static void DrawVector(androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth = defaultWidth.value, float viewportHeight = defaultHeight.value, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, androidx.ui.core.Alignment alignment = androidx.ui.graphics.vector.VectorComposeKt.DefaultAlignment, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
+    method public static void Group(androidx.ui.graphics.vector.VectorScope, String name = "", float rotation = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData = EmptyPath, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.VectorScope,kotlin.Unit> children);
+    method public static void Path(androidx.ui.graphics.vector.VectorScope, java.util.List<androidx.ui.graphics.vector.PathNode> pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
   }
 
   public final class VectorGroup extends androidx.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
-    ctor public VectorGroup(String name, float rotation, float pivotX, float pivotY, float scaleX, float scaleY, float translationX, float translationY, androidx.ui.graphics.vector.PathNode![] clipPathData);
+    ctor public VectorGroup(String name, float rotation, float pivotX, float pivotY, float scaleX, float scaleY, float translationX, float translationY, java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData);
     ctor public VectorGroup();
     method public operator androidx.ui.graphics.vector.VectorNode get(int index);
-    method public androidx.ui.graphics.vector.PathNode![] getClipPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getClipPathData();
     method public String getName();
     method public float getPivotX();
     method public float getPivotY();
@@ -378,11 +378,11 @@
   }
 
   public final class VectorPath extends androidx.ui.graphics.vector.VectorNode {
-    ctor public VectorPath(String name, androidx.ui.graphics.vector.PathNode![] pathData, androidx.ui.graphics.Brush? fill, float fillAlpha, androidx.ui.graphics.Brush? stroke, float strokeAlpha, float strokeLineWidth, androidx.ui.graphics.StrokeCap strokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin, float strokeLineMiter);
+    ctor public VectorPath(String name, java.util.List<androidx.ui.graphics.vector.PathNode> pathData, androidx.ui.graphics.Brush? fill, float fillAlpha, androidx.ui.graphics.Brush? stroke, float strokeAlpha, float strokeLineWidth, androidx.ui.graphics.StrokeCap strokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin, float strokeLineMiter);
     method public androidx.ui.graphics.Brush? getFill();
     method public float getFillAlpha();
     method public String getName();
-    method public androidx.ui.graphics.vector.PathNode![] getPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getPathData();
     method public androidx.ui.graphics.Brush? getStroke();
     method public float getStrokeAlpha();
     method public androidx.ui.graphics.StrokeCap getStrokeLineCap();
diff --git a/ui/ui-framework/api/api_lint.ignore b/ui/ui-framework/api/api_lint.ignore
index 802d86c..c782b81 100644
--- a/ui/ui-framework/api/api_lint.ignore
+++ b/ui/ui-framework/api/api_lint.ignore
@@ -1,22 +1,6 @@
 // Baseline format: 1.0
 ArrayReturn: androidx.ui.core.LayoutKt#Layout(kotlin.jvm.functions.Function0<kotlin.Unit>[], androidx.ui.core.Modifier, kotlin.jvm.functions.Function3<? super androidx.ui.core.MeasureScope,? super androidx.ui.core.MultiComposableMeasurables,? super androidx.ui.core.Constraints,? extends androidx.ui.core.MeasureScope.LayoutResult>) parameter #0:
     Method parameter should be Collection<Function0> (or subclass) instead of raw array; was `kotlin.jvm.functions.Function0<kotlin.Unit>[]`
-ArrayReturn: androidx.ui.graphics.vector.VectorAssetBuilder#addPath(androidx.ui.graphics.vector.PathNode[], String, androidx.ui.graphics.Brush, float, androidx.ui.graphics.Brush, float, float, androidx.ui.graphics.StrokeCap, androidx.ui.graphics.StrokeJoin, float) parameter #0:
-    Method parameter should be Collection<PathNode> (or subclass) instead of raw array; was `androidx.ui.graphics.vector.PathNode[]`
-ArrayReturn: androidx.ui.graphics.vector.VectorAssetBuilder#pushGroup(String, float, float, float, float, float, float, float, androidx.ui.graphics.vector.PathNode[]) parameter #8:
-    Method parameter should be Collection<PathNode> (or subclass) instead of raw array; was `androidx.ui.graphics.vector.PathNode[]`
-ArrayReturn: androidx.ui.graphics.vector.VectorComposeKt#Group(androidx.ui.graphics.vector.VectorScope, String, float, float, float, float, float, float, float, androidx.ui.graphics.vector.PathNode[], kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.VectorScope,kotlin.Unit>) parameter #9:
-    Method parameter should be Collection<PathNode> (or subclass) instead of raw array; was `androidx.ui.graphics.vector.PathNode[]`
-ArrayReturn: androidx.ui.graphics.vector.VectorComposeKt#Path(androidx.ui.graphics.vector.VectorScope, androidx.ui.graphics.vector.PathNode[], String, androidx.ui.graphics.Brush, float, androidx.ui.graphics.Brush, float, float, androidx.ui.graphics.StrokeCap, androidx.ui.graphics.StrokeJoin, float) parameter #1:
-    Method parameter should be Collection<PathNode> (or subclass) instead of raw array; was `androidx.ui.graphics.vector.PathNode[]`
-ArrayReturn: androidx.ui.graphics.vector.VectorGroup#VectorGroup(String, float, float, float, float, float, float, float, androidx.ui.graphics.vector.PathNode[]) parameter #8:
-    Method parameter should be Collection<PathNode> (or subclass) instead of raw array; was `androidx.ui.graphics.vector.PathNode[]`
-ArrayReturn: androidx.ui.graphics.vector.VectorGroup#getClipPathData():
-    Method should return Collection<PathNode> (or subclass) instead of raw array; was `androidx.ui.graphics.vector.PathNode[]`
-ArrayReturn: androidx.ui.graphics.vector.VectorPath#VectorPath(String, androidx.ui.graphics.vector.PathNode[], androidx.ui.graphics.Brush, float, androidx.ui.graphics.Brush, float, float, androidx.ui.graphics.StrokeCap, androidx.ui.graphics.StrokeJoin, float) parameter #1:
-    Method parameter should be Collection<PathNode> (or subclass) instead of raw array; was `androidx.ui.graphics.vector.PathNode[]`
-ArrayReturn: androidx.ui.graphics.vector.VectorPath#getPathData():
-    Method should return Collection<PathNode> (or subclass) instead of raw array; was `androidx.ui.graphics.vector.PathNode[]`
 
 
 AutoBoxing: androidx.ui.core.TextKt#Text(String, androidx.ui.core.Modifier, androidx.ui.text.TextStyle, androidx.ui.text.ParagraphStyle, boolean, androidx.ui.text.style.TextOverflow, Integer) parameter #6:
diff --git a/ui/ui-framework/api/current.txt b/ui/ui-framework/api/current.txt
index 7b4517b..deb9978 100644
--- a/ui/ui-framework/api/current.txt
+++ b/ui/ui-framework/api/current.txt
@@ -331,7 +331,7 @@
 
   public final class VectorAssetBuilder {
     ctor public VectorAssetBuilder(String name, androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth, float viewportHeight);
-    method public androidx.ui.graphics.vector.VectorAssetBuilder addPath(androidx.ui.graphics.vector.PathNode![] pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
+    method public androidx.ui.graphics.vector.VectorAssetBuilder addPath(java.util.List<androidx.ui.graphics.vector.PathNode> pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
     method public androidx.ui.graphics.vector.VectorAsset build();
     method public void ensureNotConsumed();
     method public androidx.ui.core.Px getDefaultHeight();
@@ -340,7 +340,7 @@
     method public float getViewportHeight();
     method public float getViewportWidth();
     method public androidx.ui.graphics.vector.VectorAssetBuilder popGroup();
-    method public androidx.ui.graphics.vector.VectorAssetBuilder pushGroup(String name = "", float rotate = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, androidx.ui.graphics.vector.PathNode![] clipPathData = EmptyPath);
+    method public androidx.ui.graphics.vector.VectorAssetBuilder pushGroup(String name = "", float rotate = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData = EmptyPath);
   }
 
   public final class VectorAssetKt {
@@ -350,17 +350,17 @@
 
   public final class VectorComposeKt {
     ctor public VectorComposeKt();
-    method public static void DrawVector(androidx.ui.core.Dp defaultWidth, androidx.ui.core.Dp defaultHeight, float viewportWidth = -1.0f, float viewportHeight = -1.0f, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
-    method public static void DrawVector(androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth = defaultWidth.value, float viewportHeight = defaultHeight.value, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
-    method public static void Group(androidx.ui.graphics.vector.VectorScope, String name = "", float rotation = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, androidx.ui.graphics.vector.PathNode![] clipPathData = EmptyPath, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.VectorScope,kotlin.Unit> children);
-    method public static void Path(androidx.ui.graphics.vector.VectorScope, androidx.ui.graphics.vector.PathNode![] pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
+    method public static void DrawVector(androidx.ui.core.Dp defaultWidth, androidx.ui.core.Dp defaultHeight, float viewportWidth = -1.0f, float viewportHeight = -1.0f, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, androidx.ui.core.Alignment alignment = androidx.ui.graphics.vector.VectorComposeKt.DefaultAlignment, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
+    method public static void DrawVector(androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth = defaultWidth.value, float viewportHeight = defaultHeight.value, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, androidx.ui.core.Alignment alignment = androidx.ui.graphics.vector.VectorComposeKt.DefaultAlignment, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
+    method public static void Group(androidx.ui.graphics.vector.VectorScope, String name = "", float rotation = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData = EmptyPath, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.VectorScope,kotlin.Unit> children);
+    method public static void Path(androidx.ui.graphics.vector.VectorScope, java.util.List<androidx.ui.graphics.vector.PathNode> pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
   }
 
   public final class VectorGroup extends androidx.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
-    ctor public VectorGroup(String name, float rotation, float pivotX, float pivotY, float scaleX, float scaleY, float translationX, float translationY, androidx.ui.graphics.vector.PathNode![] clipPathData);
+    ctor public VectorGroup(String name, float rotation, float pivotX, float pivotY, float scaleX, float scaleY, float translationX, float translationY, java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData);
     ctor public VectorGroup();
     method public operator androidx.ui.graphics.vector.VectorNode get(int index);
-    method public androidx.ui.graphics.vector.PathNode![] getClipPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getClipPathData();
     method public String getName();
     method public float getPivotX();
     method public float getPivotY();
@@ -378,11 +378,11 @@
   }
 
   public final class VectorPath extends androidx.ui.graphics.vector.VectorNode {
-    ctor public VectorPath(String name, androidx.ui.graphics.vector.PathNode![] pathData, androidx.ui.graphics.Brush? fill, float fillAlpha, androidx.ui.graphics.Brush? stroke, float strokeAlpha, float strokeLineWidth, androidx.ui.graphics.StrokeCap strokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin, float strokeLineMiter);
+    ctor public VectorPath(String name, java.util.List<androidx.ui.graphics.vector.PathNode> pathData, androidx.ui.graphics.Brush? fill, float fillAlpha, androidx.ui.graphics.Brush? stroke, float strokeAlpha, float strokeLineWidth, androidx.ui.graphics.StrokeCap strokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin, float strokeLineMiter);
     method public androidx.ui.graphics.Brush? getFill();
     method public float getFillAlpha();
     method public String getName();
-    method public androidx.ui.graphics.vector.PathNode![] getPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getPathData();
     method public androidx.ui.graphics.Brush? getStroke();
     method public float getStrokeAlpha();
     method public androidx.ui.graphics.StrokeCap getStrokeLineCap();
diff --git a/ui/ui-framework/api/public_plus_experimental_0.1.0-dev03.txt b/ui/ui-framework/api/public_plus_experimental_0.1.0-dev03.txt
index 7b4517b..deb9978 100644
--- a/ui/ui-framework/api/public_plus_experimental_0.1.0-dev03.txt
+++ b/ui/ui-framework/api/public_plus_experimental_0.1.0-dev03.txt
@@ -331,7 +331,7 @@
 
   public final class VectorAssetBuilder {
     ctor public VectorAssetBuilder(String name, androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth, float viewportHeight);
-    method public androidx.ui.graphics.vector.VectorAssetBuilder addPath(androidx.ui.graphics.vector.PathNode![] pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
+    method public androidx.ui.graphics.vector.VectorAssetBuilder addPath(java.util.List<androidx.ui.graphics.vector.PathNode> pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
     method public androidx.ui.graphics.vector.VectorAsset build();
     method public void ensureNotConsumed();
     method public androidx.ui.core.Px getDefaultHeight();
@@ -340,7 +340,7 @@
     method public float getViewportHeight();
     method public float getViewportWidth();
     method public androidx.ui.graphics.vector.VectorAssetBuilder popGroup();
-    method public androidx.ui.graphics.vector.VectorAssetBuilder pushGroup(String name = "", float rotate = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, androidx.ui.graphics.vector.PathNode![] clipPathData = EmptyPath);
+    method public androidx.ui.graphics.vector.VectorAssetBuilder pushGroup(String name = "", float rotate = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData = EmptyPath);
   }
 
   public final class VectorAssetKt {
@@ -350,17 +350,17 @@
 
   public final class VectorComposeKt {
     ctor public VectorComposeKt();
-    method public static void DrawVector(androidx.ui.core.Dp defaultWidth, androidx.ui.core.Dp defaultHeight, float viewportWidth = -1.0f, float viewportHeight = -1.0f, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
-    method public static void DrawVector(androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth = defaultWidth.value, float viewportHeight = defaultHeight.value, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
-    method public static void Group(androidx.ui.graphics.vector.VectorScope, String name = "", float rotation = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, androidx.ui.graphics.vector.PathNode![] clipPathData = EmptyPath, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.VectorScope,kotlin.Unit> children);
-    method public static void Path(androidx.ui.graphics.vector.VectorScope, androidx.ui.graphics.vector.PathNode![] pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
+    method public static void DrawVector(androidx.ui.core.Dp defaultWidth, androidx.ui.core.Dp defaultHeight, float viewportWidth = -1.0f, float viewportHeight = -1.0f, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, androidx.ui.core.Alignment alignment = androidx.ui.graphics.vector.VectorComposeKt.DefaultAlignment, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
+    method public static void DrawVector(androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth = defaultWidth.value, float viewportHeight = defaultHeight.value, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, androidx.ui.core.Alignment alignment = androidx.ui.graphics.vector.VectorComposeKt.DefaultAlignment, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
+    method public static void Group(androidx.ui.graphics.vector.VectorScope, String name = "", float rotation = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData = EmptyPath, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.VectorScope,kotlin.Unit> children);
+    method public static void Path(androidx.ui.graphics.vector.VectorScope, java.util.List<androidx.ui.graphics.vector.PathNode> pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
   }
 
   public final class VectorGroup extends androidx.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
-    ctor public VectorGroup(String name, float rotation, float pivotX, float pivotY, float scaleX, float scaleY, float translationX, float translationY, androidx.ui.graphics.vector.PathNode![] clipPathData);
+    ctor public VectorGroup(String name, float rotation, float pivotX, float pivotY, float scaleX, float scaleY, float translationX, float translationY, java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData);
     ctor public VectorGroup();
     method public operator androidx.ui.graphics.vector.VectorNode get(int index);
-    method public androidx.ui.graphics.vector.PathNode![] getClipPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getClipPathData();
     method public String getName();
     method public float getPivotX();
     method public float getPivotY();
@@ -378,11 +378,11 @@
   }
 
   public final class VectorPath extends androidx.ui.graphics.vector.VectorNode {
-    ctor public VectorPath(String name, androidx.ui.graphics.vector.PathNode![] pathData, androidx.ui.graphics.Brush? fill, float fillAlpha, androidx.ui.graphics.Brush? stroke, float strokeAlpha, float strokeLineWidth, androidx.ui.graphics.StrokeCap strokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin, float strokeLineMiter);
+    ctor public VectorPath(String name, java.util.List<androidx.ui.graphics.vector.PathNode> pathData, androidx.ui.graphics.Brush? fill, float fillAlpha, androidx.ui.graphics.Brush? stroke, float strokeAlpha, float strokeLineWidth, androidx.ui.graphics.StrokeCap strokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin, float strokeLineMiter);
     method public androidx.ui.graphics.Brush? getFill();
     method public float getFillAlpha();
     method public String getName();
-    method public androidx.ui.graphics.vector.PathNode![] getPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getPathData();
     method public androidx.ui.graphics.Brush? getStroke();
     method public float getStrokeAlpha();
     method public androidx.ui.graphics.StrokeCap getStrokeLineCap();
diff --git a/ui/ui-framework/api/public_plus_experimental_current.txt b/ui/ui-framework/api/public_plus_experimental_current.txt
index 7b4517b..deb9978 100644
--- a/ui/ui-framework/api/public_plus_experimental_current.txt
+++ b/ui/ui-framework/api/public_plus_experimental_current.txt
@@ -331,7 +331,7 @@
 
   public final class VectorAssetBuilder {
     ctor public VectorAssetBuilder(String name, androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth, float viewportHeight);
-    method public androidx.ui.graphics.vector.VectorAssetBuilder addPath(androidx.ui.graphics.vector.PathNode![] pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
+    method public androidx.ui.graphics.vector.VectorAssetBuilder addPath(java.util.List<androidx.ui.graphics.vector.PathNode> pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
     method public androidx.ui.graphics.vector.VectorAsset build();
     method public void ensureNotConsumed();
     method public androidx.ui.core.Px getDefaultHeight();
@@ -340,7 +340,7 @@
     method public float getViewportHeight();
     method public float getViewportWidth();
     method public androidx.ui.graphics.vector.VectorAssetBuilder popGroup();
-    method public androidx.ui.graphics.vector.VectorAssetBuilder pushGroup(String name = "", float rotate = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, androidx.ui.graphics.vector.PathNode![] clipPathData = EmptyPath);
+    method public androidx.ui.graphics.vector.VectorAssetBuilder pushGroup(String name = "", float rotate = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData = EmptyPath);
   }
 
   public final class VectorAssetKt {
@@ -350,17 +350,17 @@
 
   public final class VectorComposeKt {
     ctor public VectorComposeKt();
-    method public static void DrawVector(androidx.ui.core.Dp defaultWidth, androidx.ui.core.Dp defaultHeight, float viewportWidth = -1.0f, float viewportHeight = -1.0f, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
-    method public static void DrawVector(androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth = defaultWidth.value, float viewportHeight = defaultHeight.value, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
-    method public static void Group(androidx.ui.graphics.vector.VectorScope, String name = "", float rotation = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, androidx.ui.graphics.vector.PathNode![] clipPathData = EmptyPath, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.VectorScope,kotlin.Unit> children);
-    method public static void Path(androidx.ui.graphics.vector.VectorScope, androidx.ui.graphics.vector.PathNode![] pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
+    method public static void DrawVector(androidx.ui.core.Dp defaultWidth, androidx.ui.core.Dp defaultHeight, float viewportWidth = -1.0f, float viewportHeight = -1.0f, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, androidx.ui.core.Alignment alignment = androidx.ui.graphics.vector.VectorComposeKt.DefaultAlignment, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
+    method public static void DrawVector(androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth = defaultWidth.value, float viewportHeight = defaultHeight.value, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, androidx.ui.core.Alignment alignment = androidx.ui.graphics.vector.VectorComposeKt.DefaultAlignment, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
+    method public static void Group(androidx.ui.graphics.vector.VectorScope, String name = "", float rotation = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData = EmptyPath, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.VectorScope,kotlin.Unit> children);
+    method public static void Path(androidx.ui.graphics.vector.VectorScope, java.util.List<androidx.ui.graphics.vector.PathNode> pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
   }
 
   public final class VectorGroup extends androidx.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
-    ctor public VectorGroup(String name, float rotation, float pivotX, float pivotY, float scaleX, float scaleY, float translationX, float translationY, androidx.ui.graphics.vector.PathNode![] clipPathData);
+    ctor public VectorGroup(String name, float rotation, float pivotX, float pivotY, float scaleX, float scaleY, float translationX, float translationY, java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData);
     ctor public VectorGroup();
     method public operator androidx.ui.graphics.vector.VectorNode get(int index);
-    method public androidx.ui.graphics.vector.PathNode![] getClipPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getClipPathData();
     method public String getName();
     method public float getPivotX();
     method public float getPivotY();
@@ -378,11 +378,11 @@
   }
 
   public final class VectorPath extends androidx.ui.graphics.vector.VectorNode {
-    ctor public VectorPath(String name, androidx.ui.graphics.vector.PathNode![] pathData, androidx.ui.graphics.Brush? fill, float fillAlpha, androidx.ui.graphics.Brush? stroke, float strokeAlpha, float strokeLineWidth, androidx.ui.graphics.StrokeCap strokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin, float strokeLineMiter);
+    ctor public VectorPath(String name, java.util.List<androidx.ui.graphics.vector.PathNode> pathData, androidx.ui.graphics.Brush? fill, float fillAlpha, androidx.ui.graphics.Brush? stroke, float strokeAlpha, float strokeLineWidth, androidx.ui.graphics.StrokeCap strokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin, float strokeLineMiter);
     method public androidx.ui.graphics.Brush? getFill();
     method public float getFillAlpha();
     method public String getName();
-    method public androidx.ui.graphics.vector.PathNode![] getPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getPathData();
     method public androidx.ui.graphics.Brush? getStroke();
     method public float getStrokeAlpha();
     method public androidx.ui.graphics.StrokeCap getStrokeLineCap();
diff --git a/ui/ui-framework/api/restricted_0.1.0-dev03.txt b/ui/ui-framework/api/restricted_0.1.0-dev03.txt
index 7b4517b..deb9978 100644
--- a/ui/ui-framework/api/restricted_0.1.0-dev03.txt
+++ b/ui/ui-framework/api/restricted_0.1.0-dev03.txt
@@ -331,7 +331,7 @@
 
   public final class VectorAssetBuilder {
     ctor public VectorAssetBuilder(String name, androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth, float viewportHeight);
-    method public androidx.ui.graphics.vector.VectorAssetBuilder addPath(androidx.ui.graphics.vector.PathNode![] pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
+    method public androidx.ui.graphics.vector.VectorAssetBuilder addPath(java.util.List<androidx.ui.graphics.vector.PathNode> pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
     method public androidx.ui.graphics.vector.VectorAsset build();
     method public void ensureNotConsumed();
     method public androidx.ui.core.Px getDefaultHeight();
@@ -340,7 +340,7 @@
     method public float getViewportHeight();
     method public float getViewportWidth();
     method public androidx.ui.graphics.vector.VectorAssetBuilder popGroup();
-    method public androidx.ui.graphics.vector.VectorAssetBuilder pushGroup(String name = "", float rotate = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, androidx.ui.graphics.vector.PathNode![] clipPathData = EmptyPath);
+    method public androidx.ui.graphics.vector.VectorAssetBuilder pushGroup(String name = "", float rotate = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData = EmptyPath);
   }
 
   public final class VectorAssetKt {
@@ -350,17 +350,17 @@
 
   public final class VectorComposeKt {
     ctor public VectorComposeKt();
-    method public static void DrawVector(androidx.ui.core.Dp defaultWidth, androidx.ui.core.Dp defaultHeight, float viewportWidth = -1.0f, float viewportHeight = -1.0f, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
-    method public static void DrawVector(androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth = defaultWidth.value, float viewportHeight = defaultHeight.value, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
-    method public static void Group(androidx.ui.graphics.vector.VectorScope, String name = "", float rotation = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, androidx.ui.graphics.vector.PathNode![] clipPathData = EmptyPath, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.VectorScope,kotlin.Unit> children);
-    method public static void Path(androidx.ui.graphics.vector.VectorScope, androidx.ui.graphics.vector.PathNode![] pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
+    method public static void DrawVector(androidx.ui.core.Dp defaultWidth, androidx.ui.core.Dp defaultHeight, float viewportWidth = -1.0f, float viewportHeight = -1.0f, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, androidx.ui.core.Alignment alignment = androidx.ui.graphics.vector.VectorComposeKt.DefaultAlignment, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
+    method public static void DrawVector(androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth = defaultWidth.value, float viewportHeight = defaultHeight.value, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, androidx.ui.core.Alignment alignment = androidx.ui.graphics.vector.VectorComposeKt.DefaultAlignment, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
+    method public static void Group(androidx.ui.graphics.vector.VectorScope, String name = "", float rotation = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData = EmptyPath, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.VectorScope,kotlin.Unit> children);
+    method public static void Path(androidx.ui.graphics.vector.VectorScope, java.util.List<androidx.ui.graphics.vector.PathNode> pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
   }
 
   public final class VectorGroup extends androidx.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
-    ctor public VectorGroup(String name, float rotation, float pivotX, float pivotY, float scaleX, float scaleY, float translationX, float translationY, androidx.ui.graphics.vector.PathNode![] clipPathData);
+    ctor public VectorGroup(String name, float rotation, float pivotX, float pivotY, float scaleX, float scaleY, float translationX, float translationY, java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData);
     ctor public VectorGroup();
     method public operator androidx.ui.graphics.vector.VectorNode get(int index);
-    method public androidx.ui.graphics.vector.PathNode![] getClipPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getClipPathData();
     method public String getName();
     method public float getPivotX();
     method public float getPivotY();
@@ -378,11 +378,11 @@
   }
 
   public final class VectorPath extends androidx.ui.graphics.vector.VectorNode {
-    ctor public VectorPath(String name, androidx.ui.graphics.vector.PathNode![] pathData, androidx.ui.graphics.Brush? fill, float fillAlpha, androidx.ui.graphics.Brush? stroke, float strokeAlpha, float strokeLineWidth, androidx.ui.graphics.StrokeCap strokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin, float strokeLineMiter);
+    ctor public VectorPath(String name, java.util.List<androidx.ui.graphics.vector.PathNode> pathData, androidx.ui.graphics.Brush? fill, float fillAlpha, androidx.ui.graphics.Brush? stroke, float strokeAlpha, float strokeLineWidth, androidx.ui.graphics.StrokeCap strokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin, float strokeLineMiter);
     method public androidx.ui.graphics.Brush? getFill();
     method public float getFillAlpha();
     method public String getName();
-    method public androidx.ui.graphics.vector.PathNode![] getPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getPathData();
     method public androidx.ui.graphics.Brush? getStroke();
     method public float getStrokeAlpha();
     method public androidx.ui.graphics.StrokeCap getStrokeLineCap();
diff --git a/ui/ui-framework/api/restricted_current.txt b/ui/ui-framework/api/restricted_current.txt
index 7b4517b..deb9978 100644
--- a/ui/ui-framework/api/restricted_current.txt
+++ b/ui/ui-framework/api/restricted_current.txt
@@ -331,7 +331,7 @@
 
   public final class VectorAssetBuilder {
     ctor public VectorAssetBuilder(String name, androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth, float viewportHeight);
-    method public androidx.ui.graphics.vector.VectorAssetBuilder addPath(androidx.ui.graphics.vector.PathNode![] pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
+    method public androidx.ui.graphics.vector.VectorAssetBuilder addPath(java.util.List<androidx.ui.graphics.vector.PathNode> pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
     method public androidx.ui.graphics.vector.VectorAsset build();
     method public void ensureNotConsumed();
     method public androidx.ui.core.Px getDefaultHeight();
@@ -340,7 +340,7 @@
     method public float getViewportHeight();
     method public float getViewportWidth();
     method public androidx.ui.graphics.vector.VectorAssetBuilder popGroup();
-    method public androidx.ui.graphics.vector.VectorAssetBuilder pushGroup(String name = "", float rotate = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, androidx.ui.graphics.vector.PathNode![] clipPathData = EmptyPath);
+    method public androidx.ui.graphics.vector.VectorAssetBuilder pushGroup(String name = "", float rotate = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData = EmptyPath);
   }
 
   public final class VectorAssetKt {
@@ -350,17 +350,17 @@
 
   public final class VectorComposeKt {
     ctor public VectorComposeKt();
-    method public static void DrawVector(androidx.ui.core.Dp defaultWidth, androidx.ui.core.Dp defaultHeight, float viewportWidth = -1.0f, float viewportHeight = -1.0f, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
-    method public static void DrawVector(androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth = defaultWidth.value, float viewportHeight = defaultHeight.value, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
-    method public static void Group(androidx.ui.graphics.vector.VectorScope, String name = "", float rotation = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, androidx.ui.graphics.vector.PathNode![] clipPathData = EmptyPath, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.VectorScope,kotlin.Unit> children);
-    method public static void Path(androidx.ui.graphics.vector.VectorScope, androidx.ui.graphics.vector.PathNode![] pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
+    method public static void DrawVector(androidx.ui.core.Dp defaultWidth, androidx.ui.core.Dp defaultHeight, float viewportWidth = -1.0f, float viewportHeight = -1.0f, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, androidx.ui.core.Alignment alignment = androidx.ui.graphics.vector.VectorComposeKt.DefaultAlignment, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
+    method public static void DrawVector(androidx.ui.core.Px defaultWidth, androidx.ui.core.Px defaultHeight, float viewportWidth = defaultWidth.value, float viewportHeight = defaultHeight.value, androidx.ui.graphics.Color tintColor = DefaultTintColor, androidx.ui.graphics.BlendMode tintBlendMode = DefaultTintBlendMode, androidx.ui.core.Alignment alignment = androidx.ui.graphics.vector.VectorComposeKt.DefaultAlignment, String name = "", kotlin.jvm.functions.Function3<? super androidx.ui.graphics.vector.VectorScope,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
+    method public static void Group(androidx.ui.graphics.vector.VectorScope, String name = "", float rotation = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData = EmptyPath, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.VectorScope,kotlin.Unit> children);
+    method public static void Path(androidx.ui.graphics.vector.VectorScope, java.util.List<androidx.ui.graphics.vector.PathNode> pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
   }
 
   public final class VectorGroup extends androidx.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
-    ctor public VectorGroup(String name, float rotation, float pivotX, float pivotY, float scaleX, float scaleY, float translationX, float translationY, androidx.ui.graphics.vector.PathNode![] clipPathData);
+    ctor public VectorGroup(String name, float rotation, float pivotX, float pivotY, float scaleX, float scaleY, float translationX, float translationY, java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData);
     ctor public VectorGroup();
     method public operator androidx.ui.graphics.vector.VectorNode get(int index);
-    method public androidx.ui.graphics.vector.PathNode![] getClipPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getClipPathData();
     method public String getName();
     method public float getPivotX();
     method public float getPivotY();
@@ -378,11 +378,11 @@
   }
 
   public final class VectorPath extends androidx.ui.graphics.vector.VectorNode {
-    ctor public VectorPath(String name, androidx.ui.graphics.vector.PathNode![] pathData, androidx.ui.graphics.Brush? fill, float fillAlpha, androidx.ui.graphics.Brush? stroke, float strokeAlpha, float strokeLineWidth, androidx.ui.graphics.StrokeCap strokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin, float strokeLineMiter);
+    ctor public VectorPath(String name, java.util.List<androidx.ui.graphics.vector.PathNode> pathData, androidx.ui.graphics.Brush? fill, float fillAlpha, androidx.ui.graphics.Brush? stroke, float strokeAlpha, float strokeLineWidth, androidx.ui.graphics.StrokeCap strokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin, float strokeLineMiter);
     method public androidx.ui.graphics.Brush? getFill();
     method public float getFillAlpha();
     method public String getName();
-    method public androidx.ui.graphics.vector.PathNode![] getPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getPathData();
     method public androidx.ui.graphics.Brush? getStroke();
     method public float getStrokeAlpha();
     method public androidx.ui.graphics.StrokeCap getStrokeLineCap();
diff --git a/ui/ui-framework/integration-tests/framework-demos/build.gradle b/ui/ui-framework/integration-tests/framework-demos/build.gradle
index 4e0efbd9..6e950b9 100644
--- a/ui/ui-framework/integration-tests/framework-demos/build.gradle
+++ b/ui/ui-framework/integration-tests/framework-demos/build.gradle
@@ -24,6 +24,7 @@
     implementation project(":ui:ui-layout")
     implementation project(":ui:ui-text")
     implementation project(':ui:ui-animation')
+    implementation project(":ui:ui-foundation")
     implementation project(':ui:ui-framework')
     implementation project(':ui:ui-material')
     implementation project(path: ':ui:ui-vector')
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/AndroidManifest.xml b/ui/ui-framework/integration-tests/framework-demos/src/main/AndroidManifest.xml
index 5e9ffa8..58d00cb 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/AndroidManifest.xml
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/AndroidManifest.xml
@@ -127,6 +127,14 @@
                 <category android:name="androidx.ui.demos.SAMPLE_CODE" />
             </intent-filter>
         </activity>
+        <activity android:name="androidx.ui.framework.demos.gestures.PopupDragActivity"
+            android:configChanges="orientation|screenSize"
+            android:label="Gestures/Complex/Popup Drag">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="androidx.ui.demos.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
 
         <activity android:name=".MultipleCollectActivity"
                   android:configChanges="orientation|screenSize"
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/PopupDragActivity.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/PopupDragActivity.kt
new file mode 100644
index 0000000..af1685c
--- /dev/null
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/gestures/PopupDragActivity.kt
@@ -0,0 +1,83 @@
+/*
+ * 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.framework.demos.gestures
+
+import android.app.Activity
+import android.os.Bundle
+import androidx.compose.memo
+import androidx.compose.state
+import androidx.compose.unaryPlus
+import androidx.ui.core.Alignment
+import androidx.ui.core.PxPosition
+import androidx.ui.core.Text
+import androidx.ui.core.dp
+import androidx.ui.core.gesture.DragObserver
+import androidx.ui.core.gesture.RawDragGestureDetector
+import androidx.ui.core.round
+import androidx.ui.core.setContent
+import androidx.ui.foundation.Popup
+import androidx.ui.foundation.disposeActivityComposition
+import androidx.ui.foundation.shape.DrawShape
+import androidx.ui.foundation.shape.corner.CircleShape
+import androidx.ui.graphics.Color
+import androidx.ui.layout.Container
+import androidx.ui.layout.Wrap
+import androidx.ui.text.ParagraphStyle
+import androidx.ui.text.style.TextAlign
+
+class PopupDragActivity : Activity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        setContent {
+
+            val offset = +state {
+                PxPosition.Origin
+            }
+
+            val observer = +memo {
+                object : DragObserver {
+                    override fun onDrag(dragDistance: PxPosition): PxPosition {
+                        offset.value += dragDistance
+                        return dragDistance
+                    }
+                }
+            }
+
+            Popup(alignment = Alignment.TopLeft, offset = offset.value.round()) {
+                Wrap {
+                    DrawShape(CircleShape, Color.Green)
+                    RawDragGestureDetector(observer) {
+                        Container(width = 70.dp, height = 70.dp) {
+                            Text(
+                                text = "This is a popup!",
+                                paragraphStyle = ParagraphStyle(textAlign = TextAlign.Center)
+                            )
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    // TODO(b/140396932): Replace with Activity.disposeComposition() when it will be working
+    //  properly
+    override fun onDestroy() {
+        disposeActivityComposition(this)
+        super.onDestroy()
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/graphics/vector/VectorTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/graphics/vector/VectorTest.kt
index adc5fd1..3a64021 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/graphics/vector/VectorTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/graphics/vector/VectorTest.kt
@@ -23,6 +23,8 @@
 import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import androidx.test.rule.ActivityTestRule
+import androidx.ui.core.Alignment
+import androidx.ui.core.IntPx
 import androidx.ui.core.Px
 import androidx.ui.core.dp
 import androidx.ui.core.ipx
@@ -77,15 +79,34 @@
         }
     }
 
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    @Test
+    fun testVectorAlignment() {
+        rule.runOnUiThreadIR {
+            activity.setContent {
+                VectorTint(minimumSize = 500.ipx, alignment = Alignment.BottomRight)
+            }
+        }
+
+        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+        takeScreenShot(500).apply {
+            assertEquals(getPixel(480, 480), Color.Cyan.toArgb())
+        }
+    }
+
     @Composable
-    private fun VectorTint() {
-        val size = 200.ipx
+    private fun VectorTint(
+        size: IntPx = 200.ipx,
+        minimumSize: IntPx = size,
+        alignment: Alignment = Alignment.Center
+    ) {
         val sizePx = size.toPx()
-        AtLeastSize(size = size) {
+        AtLeastSize(size = minimumSize) {
             DrawVector(
                 defaultWidth = sizePx,
                 defaultHeight = sizePx,
-                tintColor = Color.Cyan) { _, _ ->
+                tintColor = Color.Cyan,
+                alignment = alignment) { _, _ ->
                 Path(
                     pathData = PathData {
                         lineTo(sizePx.value, 0.0f)
diff --git a/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/VectorAsset.kt b/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/VectorAsset.kt
index 768224d..9fad49a 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/VectorAsset.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/VectorAsset.kt
@@ -90,7 +90,7 @@
         scaleY: Float = DefaultScaleY,
         translationX: Float = DefaultTranslationX,
         translationY: Float = DefaultTranslationY,
-        clipPathData: Array<PathNode> = EmptyPath
+        clipPathData: List<PathNode> = EmptyPath
     ): VectorAssetBuilder {
         ensureNotConsumed()
         val group = VectorGroup(
@@ -126,7 +126,7 @@
      * @return This VectorAssetBuilder instance as a convenience for chaining calls
      */
     fun addPath(
-        pathData: Array<PathNode>,
+        pathData: List<PathNode>,
         name: String = DefaultPathName,
         fill: Brush? = null,
         fillAlpha: Float = DefaultAlpha,
@@ -282,7 +282,7 @@
     /**
      * Path information used to clip the content within the group
      */
-    val clipPathData: Array<PathNode> = EmptyPath
+    val clipPathData: List<PathNode> = EmptyPath
 
 ) : VectorNode(), Iterable<VectorNode> {
 
@@ -324,7 +324,7 @@
     /**
      * Path information to render the shape of the path
      */
-    val pathData: Array<PathNode>,
+    val pathData: List<PathNode>,
 
     /**
      *  Specifies the color or gradient used to fill the path
diff --git a/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/VectorCompose.kt b/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/VectorCompose.kt
index 2e5a111..088fdc5 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/VectorCompose.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/VectorCompose.kt
@@ -21,8 +21,11 @@
 import androidx.compose.memo
 import androidx.compose.onPreCommit
 import androidx.compose.unaryPlus
+import androidx.ui.core.Alignment
 import androidx.ui.core.Dp
 import androidx.ui.core.Draw
+import androidx.ui.core.IntPx
+import androidx.ui.core.IntPxSize
 import androidx.ui.core.Px
 import androidx.ui.core.ambientDensity
 import androidx.ui.core.withDensity
@@ -31,12 +34,15 @@
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.StrokeCap
 import androidx.ui.graphics.StrokeJoin
+import kotlin.math.ceil
 
 /**
  * Sentinel value used to indicate that a dimension is not provided
  */
 private const val unset: Float = -1.0f
 
+private val DefaultAlignment = Alignment.Center
+
 /**
  * Draw a vector graphic with the provided width, height and viewport dimensions
  * @param[defaultWidth] Intrinsic width of the Vector in [Dp]
@@ -49,6 +55,7 @@
  *  This parameter is optional. Not providing it will use the [defaultHeight] converted to [Px]
  * @param[tintColor] Optional color used to tint this vector graphic
  * @param[tintBlendMode] Optional blend mode used with [tintColor], default is [BlendMode.srcIn]
+ * @param[alignment] Specifies the placement of the vector within the drawing bounds
  */
 @Composable
 fun DrawVector(
@@ -58,6 +65,7 @@
     viewportHeight: Float = unset,
     tintColor: Color = DefaultTintColor,
     tintBlendMode: BlendMode = DefaultTintBlendMode,
+    alignment: Alignment = DefaultAlignment,
     name: String = "",
     children: @Composable() VectorScope.(viewportWidth: Float, viewportHeight: Float) -> Unit
 ) {
@@ -66,7 +74,17 @@
 
     val vpWidth = if (viewportWidth == unset) widthPx.value else viewportWidth
     val vpHeight = if (viewportHeight == unset) heightPx.value else viewportHeight
-    DrawVector(widthPx, heightPx, vpWidth, vpHeight, tintColor, tintBlendMode, name, children)
+    DrawVector(
+        widthPx,
+        heightPx,
+        vpWidth,
+        vpHeight,
+        tintColor,
+        tintBlendMode,
+        alignment,
+        name,
+        children
+    )
 }
 
 /**
@@ -81,6 +99,7 @@
  *  [defaultHeight]
  * @param[tintColor] Optional color used to tint this vector graphic
  * @param[tintBlendMode] Optional blend mode used with [tintColor], default is [BlendMode.srcIn]
+ * @param[alignment] Specifies the placement of the vector within the drawing bounds
  */
 @Composable
 fun DrawVector(
@@ -90,6 +109,7 @@
     viewportHeight: Float = defaultHeight.value,
     tintColor: Color = DefaultTintColor,
     tintBlendMode: BlendMode = DefaultTintBlendMode,
+    alignment: Alignment = DefaultAlignment,
     name: String = "",
     children: @Composable() VectorScope.(viewportWidth: Float, viewportHeight: Float) -> Unit
 ) {
@@ -112,8 +132,19 @@
         }
     }
 
-    Draw { canvas, _ ->
+    Draw { canvas, parentSize ->
+        val alignedPosition = alignment.align(
+            IntPxSize(
+                IntPx(ceil(parentSize.width.value - defaultWidth.value).toInt()),
+                IntPx(ceil(parentSize.height.value - defaultHeight.value).toInt())
+            )
+        )
+
+        val dx = alignedPosition.x.value.toFloat()
+        val dy = alignedPosition.y.value.toFloat()
+        canvas.translate(dx, dy)
         vector.draw(canvas, tintColor, tintBlendMode)
+        canvas.translate(-dx, -dy)
     }
 }
 
@@ -127,7 +158,7 @@
     scaleY: Float = DefaultScaleY,
     translationX: Float = DefaultTranslationX,
     translationY: Float = DefaultTranslationY,
-    clipPathData: Array<PathNode> = EmptyPath,
+    clipPathData: List<PathNode> = EmptyPath,
     children: @Composable() VectorScope.() -> Unit
 ) {
     GroupComponent(
@@ -147,7 +178,7 @@
 
 @Composable
 fun VectorScope.Path(
-    pathData: Array<PathNode>,
+    pathData: List<PathNode>,
     name: String = DefaultPathName,
     fill: Brush? = null,
     fillAlpha: Float = DefaultAlpha,
diff --git a/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/compat/XmlVectorParser.kt b/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/compat/XmlVectorParser.kt
index 101ea40..c7b248e 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/compat/XmlVectorParser.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/compat/XmlVectorParser.kt
@@ -209,7 +209,7 @@
 
     val pathStr = a.getString(AndroidVectorResources.STYLEABLE_VECTOR_DRAWABLE_PATH_PATH_DATA)
 
-    val pathData: Array<PathNode> = addPathNodes(pathStr)
+    val pathData: List<PathNode> = addPathNodes(pathStr)
 
     val fillColor = TypedArrayUtils.getNamedComplexColor(
         a,
diff --git a/ui/ui-layout/api/api_lint.ignore b/ui/ui-layout/api/api_lint.ignore
index 01bab4c..4d1f8a8 100644
--- a/ui/ui-layout/api/api_lint.ignore
+++ b/ui/ui-layout/api/api_lint.ignore
@@ -9,11 +9,11 @@
     Missing nullability on field `Companion` in class `class androidx.ui.layout.CrossAxisAlignment`
 MissingNullability: androidx.ui.layout.DpConstraints#Companion:
     Missing nullability on field `Companion` in class `class androidx.ui.layout.DpConstraints`
+MissingNullability: androidx.ui.layout.Gravity#INSTANCE:
+    Missing nullability on field `INSTANCE` in class `class androidx.ui.layout.Gravity`
 MissingNullability: androidx.ui.layout.TableColumnWidth.MaxIntrinsic#INSTANCE:
     Missing nullability on field `INSTANCE` in class `class androidx.ui.layout.TableColumnWidth.MaxIntrinsic`
 MissingNullability: androidx.ui.layout.TableColumnWidth.MinIntrinsic#INSTANCE:
     Missing nullability on field `INSTANCE` in class `class androidx.ui.layout.TableColumnWidth.MinIntrinsic`
 MissingNullability: androidx.ui.layout.TableColumnWidth.Wrap#INSTANCE:
     Missing nullability on field `INSTANCE` in class `class androidx.ui.layout.TableColumnWidth.Wrap`
-MissingNullability: androidx.ui.layout.Gravity#INSTANCE:
-    Missing nullability on field `INSTANCE` in class `class androidx.ui.layout.Gravity`
\ No newline at end of file
diff --git a/ui/ui-platform/src/androidTest/java/androidx/ui/core/pointerinput/MotionEventAdapterTest.kt b/ui/ui-platform/src/androidTest/java/androidx/ui/core/pointerinput/MotionEventAdapterTest.kt
index c8be37f..d9ea7d6 100644
--- a/ui/ui-platform/src/androidTest/java/androidx/ui/core/pointerinput/MotionEventAdapterTest.kt
+++ b/ui/ui-platform/src/androidTest/java/androidx/ui/core/pointerinput/MotionEventAdapterTest.kt
@@ -396,6 +396,26 @@
         assertPointerInputEventData(pointers[2], 9285, false, 6206f, 1098f)
     }
 
+    @Test
+    fun toPointerInputEvent_motionEventOffset_usesRawCoordinatesInsteadOfOffset() {
+        val motionEvent = MotionEvent(
+            0,
+            MotionEvent.ACTION_DOWN,
+            1,
+            0,
+            arrayOf(PointerProperties(0)),
+            arrayOf(PointerCoords(1f, 2f))
+        )
+
+        motionEvent.offsetLocation(10f, 20f)
+
+        val (timestamp, pointers) = motionEvent.toPointerInputEvent()
+
+        assertThat(timestamp.nanoseconds, `is`(0L))
+        assertThat(pointers.size, `is`(1))
+        assertPointerInputEventData(pointers[0], 0, true, 1f, 2f)
+    }
+
     // Private help functions.
 
     private fun PointerProperties(id: Int) =
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/AndroidOwner.kt b/ui/ui-platform/src/main/java/androidx/ui/core/AndroidOwner.kt
index 45e6c53..e6690db 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/AndroidOwner.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/AndroidOwner.kt
@@ -138,6 +138,7 @@
             Stage.Layout -> requestRelayout(affectedNode as LayoutNode)
         }
     }
+
     internal fun isObservingModels() = modelObserver.isObserving
 
     init {
@@ -449,8 +450,10 @@
                         val doTranslate = contentPos.x != 0.ipx || contentPos.y != 0.ipx
                         if (doTranslate) {
                             canvas.save()
-                            canvas.translate(contentPos.x.value.toFloat(),
-                                contentPos.y.value.toFloat())
+                            canvas.translate(
+                                contentPos.x.value.toFloat(),
+                                contentPos.y.value.toFloat()
+                            )
                         }
                         val contentSize = node.contentSize.toPxSize()
                         node.visitChildren { child ->
@@ -548,10 +551,10 @@
             if (event.actionMasked == MotionEvent.ACTION_CANCEL) {
                 pointerInputEventProcessor.processCancel()
             } else {
-                pointerInputEventProcessor.process(event.toPointerInputEvent())
+                pointerInputEventProcessor.process(event.toPointerInputEvent(), calculatePosition())
             }
-            // TODO(shepshapard): Only return if some aspect of the change was consumed.
         }
+        // TODO(shepshapard): Only return if some aspect of the change was consumed.
         return true
     }
 
@@ -587,7 +590,7 @@
 
     override fun calculatePosition(): IntPxPosition {
         val positionArray = intArrayOf(0, 0)
-        getLocationInWindow(positionArray)
+        getLocationOnScreen(positionArray)
         return IntPxPosition(positionArray[0].ipx, positionArray[1].ipx)
     }
 
@@ -746,6 +749,7 @@
         setWillNotDraw(false) // we WILL draw
         id = View.generateViewId()
     }
+
     private val density = Density(context)
     private val outlineResolver = OutlineResolver(density)
     private val outlineProviderImpl = object : ViewOutlineProvider() {
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/ComponentNodes.kt b/ui/ui-platform/src/main/java/androidx/ui/core/ComponentNodes.kt
index f4f309b..61470f2 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/ComponentNodes.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/ComponentNodes.kt
@@ -90,7 +90,8 @@
     fun onEndLayout(layoutNode: LayoutNode)
 
     /**
-     * Returns a position of the owner in its window.
+     * Returns the most global position of the owner that Compose can access (such as the device
+     * screen).
      */
     fun calculatePosition(): IntPxPosition
 
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/pointerinput/HitPathTracker.kt b/ui/ui-platform/src/main/java/androidx/ui/core/pointerinput/HitPathTracker.kt
index 5809a34..945fb38 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/pointerinput/HitPathTracker.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/pointerinput/HitPathTracker.kt
@@ -130,8 +130,8 @@
     }
 
     // TODO(shepshapard): Bind removeDetachedPointerInputNodes,
-    // removePointerInputNodesWithNoLayoutNodeDescendants, and refreshOffsets together given the
-    // constraint that right now, one must be called before the other.
+    //  removePointerInputNodesWithNoLayoutNodeDescendants, and refreshOffsets together given the
+    //  constraint that right now, one must be called before the other.
     /**
      * Updates this [HitPathTracker]'s cached knowledge of the bounds of the [PointerInputNode]s
      * it is tracking.  This is is necessary to call before calls to [dispatchChanges] so that
@@ -140,19 +140,25 @@
      *
      * Must only be called after guaranteeing that each Node has a PointerInputNode that has at
      * least one descendant LayoutNode.
+     *
+     * @param additionalPointerOffset The additional offset that will be added to all
+     * [PointerInputChange]s when [dispatchChanges] is called.
      */
-    fun refreshOffsets() {
-        root.refreshPositionInformation()
+    fun refreshOffsets(additionalPointerOffset: IntPxPosition) {
+        root.refreshPositionInformation(additionalPointerOffset)
     }
 
     /**
      * Convenience method that removes PointerInputNodes that are no longer valid and refreshes the
      * offset information for those that are.
+     *
+     * @param additionalPointerOffset The additional offset that will be added to all
+     * [PointerInputChange]s when [dispatchChanges] is called.
      */
-    fun refreshPathInformation() {
+    fun refreshPathInformation(additionalPointerOffset: IntPxPosition) {
         removeDetachedPointerInputNodes()
         removePointerInputNodesWithNoLayoutNodeDescendants()
-        refreshOffsets()
+        refreshOffsets(additionalPointerOffset)
     }
 }
 
@@ -281,8 +287,16 @@
         }
     }
 
-    // TODO(b/124960509): Make this much more efficient.
-    fun refreshPositionInformation() {
+    // TODO(b/124960509): Make this much more efficient.  Right now, even though the data structure
+    //  is a tree, each LayoutNode requests it's position relative to the root, even though it's
+    //  parent would already have it's position relative to root.
+    /**
+     * Updates all position and size information for all nodes.
+     *
+     * @param additionalPointerOffset The additional offset that will be added to all
+     * [PointerInputChange]s when [dispatchChanges] is called.
+     */
+    fun refreshPositionInformation(additionalPointerOffset: IntPxPosition) {
         children.forEach { child ->
             var minX = Int.MAX_VALUE
             var minY = Int.MAX_VALUE
@@ -290,14 +304,16 @@
             var maxY = Int.MIN_VALUE
             child.pointerInputNode?.visitLayoutChildren { layoutChild ->
                 val globalPosition = layoutChild.positionRelativeToRoot()
-                minX = min(minX, globalPosition.x.value)
-                minY = min(minY, globalPosition.y.value)
-                maxX = max(maxX, globalPosition.x.value + layoutChild.width.value)
-                maxY = max(maxY, globalPosition.y.value + layoutChild.height.value)
+                val x = globalPosition.x.value + additionalPointerOffset.x.value
+                val y = globalPosition.y.value + additionalPointerOffset.y.value
+                minX = min(minX, x)
+                minY = min(minY, y)
+                maxX = max(maxX, x + layoutChild.width.value)
+                maxY = max(maxY, y + layoutChild.height.value)
             }
             child.offset = IntPxPosition(minX.ipx, minY.ipx)
             child.size = IntPxSize((maxX - minX).ipx, (maxY - minY).ipx)
-            child.refreshPositionInformation()
+            child.refreshPositionInformation(additionalPointerOffset)
         }
     }
 
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/pointerinput/MotionEventAdapter.kt b/ui/ui-platform/src/main/java/androidx/ui/core/pointerinput/MotionEventAdapter.kt
index 35867b2..565dc99 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/pointerinput/MotionEventAdapter.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/pointerinput/MotionEventAdapter.kt
@@ -26,10 +26,13 @@
 import androidx.ui.core.px
 
 /**
- * Converts Android framework [MotionEvent]s into [PointerInputEvent]s.
+ * Converts an Android framework [MotionEvent] into a [PointerInputEvent].
+ *
+ * The resulting [PointerInputEvent] has coordinates that are relative to the screen (the
+ * [MotionEvent]s raw coordinates are used as provided by [MotionEvent.getRawX] and
+ * [MotionEvent.getRawY].
  */
 internal fun MotionEvent.toPointerInputEvent(): PointerInputEvent {
-
     val upIndex = when (this.actionMasked) {
         ACTION_POINTER_UP -> this.actionIndex
         ACTION_UP -> 0
@@ -37,6 +40,7 @@
     }
 
     val pointers: MutableList<PointerInputEventData> = mutableListOf()
+    offsetLocation(getRawX() - getX(), getRawY() - getY())
     for (i in 0 until this.pointerCount) {
         pointers.add(
             PointerInputEventData(this, i, upIndex)
@@ -47,7 +51,7 @@
 }
 
 /**
- * Creates a new Pointer.
+ * Creates a new [PointerInputEventData] with coordinates relative to the screen.
  */
 private fun PointerInputEventData(
     motionEvent: MotionEvent,
@@ -66,7 +70,7 @@
 }
 
 /**
- * Creates a new PointerData.
+ * Creates a new [PointerInputData] with coordinates that are relative to the screen.
  */
 private fun PointerInputData(
     timestamp: Timestamp,
@@ -74,9 +78,7 @@
     index: Int,
     upIndex: Int?
 ): PointerInputData {
-    val pointerCoords = MotionEvent.PointerCoords()
-    motionEvent.getPointerCoords(index, pointerCoords)
-    val offset = PxPosition(pointerCoords.x.px, pointerCoords.y.px)
+    val offset = PxPosition(motionEvent.getX(index).px, motionEvent.getY(index).px)
 
     return PointerInputData(
         timestamp,
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/pointerinput/PointerInputEventProcessor.kt b/ui/ui-platform/src/main/java/androidx/ui/core/pointerinput/PointerInputEventProcessor.kt
index a00e700..1e261d1 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/pointerinput/PointerInputEventProcessor.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/pointerinput/PointerInputEventProcessor.kt
@@ -42,8 +42,12 @@
 
     /**
      * Receives [PointerInputEvent]s and process them through the tree rooted on [root].
+     *
+     * @param pointerEvent The [PointerInputEvent] to process.
+     * @param additionalPointerOffset The additional offset that has been added to all coordinate
+     * data in [PointerInputEvent].
      */
-    fun process(pointerEvent: PointerInputEvent) {
+    fun process(pointerEvent: PointerInputEvent, additionalPointerOffset: IntPxPosition) {
 
         // Gets a new PointerInputChangeEvent with the PointerInputEvent.
         val pointerInputChangeEvent = pointerInputChangeEventProducer.produce(pointerEvent)
@@ -52,7 +56,7 @@
         pointerInputChangeEvent.changes.filter { it.changedToDownIgnoreConsumed() }.forEach {
             val hitResult: MutableList<PointerInputNode> = mutableListOf()
             root.hitTest(
-                it.current.position!!,
+                it.current.position!! - additionalPointerOffset,
                 Rect.largest,
                 hitResult
             )
@@ -61,7 +65,7 @@
 
         // Remove PointerInputNodes that are no longer valid and refresh the offset information for
         // those that are.
-        hitPathTracker.refreshPathInformation()
+        hitPathTracker.refreshPathInformation(additionalPointerOffset)
 
         // Dispatch the PointerInputChanges to the hit PointerInputNodes.
         var changes = pointerInputChangeEvent.changes
@@ -167,9 +171,9 @@
                 // If we have hit a leaf PointerInputNode, we will quickly back track and also hit
                 // all ancestor PointerInputNodes.
                 if (this !is LayoutNode && !hitDescendantPointerInputNode) {
+                    // The resulting boundingBox is in the child's coordinate system.
+                    // Translate back to our coordinate system.
                     overarchingBoundingBox =
-                        // The resulting boundingBox is in the child's coordinate system.
-                        // Translate back to our coordinate system.
                         overarchingBoundingBox.expandToInclude(
                             result.boundingBox?.translate(contentOffset)
                         )
diff --git a/ui/ui-platform/src/test/java/androidx/ui/core/pointerinput/HitPathTrackerTest.kt b/ui/ui-platform/src/test/java/androidx/ui/core/pointerinput/HitPathTrackerTest.kt
index 4fb9d34..6735c0a 100644
--- a/ui/ui-platform/src/test/java/androidx/ui/core/pointerinput/HitPathTrackerTest.kt
+++ b/ui/ui-platform/src/test/java/androidx/ui/core/pointerinput/HitPathTrackerTest.kt
@@ -2351,11 +2351,12 @@
     }
 
     @Test
-    fun refreshOffsets_layoutNodesNotOffset_changeTranslatedAndSizesReportedCorrectly() {
+    fun refreshOffsets_nothingOffset_changeTranslatedAndSizesReportedCorrectly() {
         refreshOffsets_changeTranslatedAndSizesReportedCorrectly(
             0, 0, 100, 100,
             0, 0, 100, 100,
             0, 0, 100, 100,
+            0, 0,
             50, 50
         )
     }
@@ -2366,6 +2367,7 @@
             0, 0, 100, 100,
             2, 11, 100, 100,
             23, 31, 100, 100,
+            0, 0,
             99, 99
         )
     }
@@ -2376,6 +2378,40 @@
             0, 0, 100, 100,
             -2, -11, 100, 100,
             -23, -31, 100, 100,
+            0, 0,
+            1, 1
+        )
+    }
+
+    @Test
+    fun refreshOffsets_additionalOffset_changeTranslatedAndSizesReportedCorrectly() {
+        refreshOffsets_changeTranslatedAndSizesReportedCorrectly(
+            0, 0, 100, 100,
+            0, 0, 100, 100,
+            0, 0, 100, 100,
+            41, 51,
+            50, 50
+        )
+    }
+
+    @Test
+    fun refreshOffsets_allIncreasinglyInset_changeTranslatedAndSizesReportedCorrectly() {
+        refreshOffsets_changeTranslatedAndSizesReportedCorrectly(
+            0, 0, 100, 100,
+            2, 11, 100, 100,
+            23, 31, 100, 100,
+            41, 51,
+            99, 99
+        )
+    }
+
+    @Test
+    fun refreshOffsets_allIncreasinglyOutset_changeTranslatedAndSizesReportedCorrectly() {
+        refreshOffsets_changeTranslatedAndSizesReportedCorrectly(
+            0, 0, 100, 100,
+            -2, -11, 100, 100,
+            -23, -31, 100, 100,
+            -41, -51,
             1, 1
         )
     }
@@ -2395,6 +2431,8 @@
         cY1: Int,
         cX2: Int,
         cY2: Int,
+        additionalOffsetX: Int,
+        additionalOffsetY: Int,
         pointerX: Int,
         pointerY: Int
     ) {
@@ -2429,10 +2467,11 @@
         )
 
         val offset = PxPosition(pointerX.px, pointerY.px)
+        val additionalOffset = IntPxPosition(additionalOffsetX.ipx, additionalOffsetY.ipx)
 
         // Act
 
-        hitResult.refreshOffsets()
+        hitResult.refreshOffsets(additionalOffset)
 
         // Assert
 
@@ -2450,15 +2489,9 @@
         val expectedPointerInputChanges = arrayOf(
             PointerInputChange(
                 id = 3,
-                current = PointerInputData(7L.millisecondsToTimestamp(), offset, true),
-                previous = PointerInputData(null, null, false),
-                consumed = ConsumedData()
-            ),
-            PointerInputChange(
-                id = 3,
                 current = PointerInputData(
                     7L.millisecondsToTimestamp(),
-                    offset - middleOffset,
+                    offset - additionalOffset,
                     true
                 ),
                 previous = PointerInputData(null, null, false),
@@ -2468,7 +2501,17 @@
                 id = 3,
                 current = PointerInputData(
                     7L.millisecondsToTimestamp(),
-                    offset - middleOffset - childOffset,
+                    offset - middleOffset - additionalOffset,
+                    true
+                ),
+                previous = PointerInputData(null, null, false),
+                consumed = ConsumedData()
+            ),
+            PointerInputChange(
+                id = 3,
+                current = PointerInputData(
+                    7L.millisecondsToTimestamp(),
+                    offset - middleOffset - childOffset - additionalOffset,
                     true
                 ),
                 previous = PointerInputData(null, null, false),
@@ -2497,34 +2540,92 @@
     }
 
     @Test
-    fun refreshOffsets_justTranslate_changeTranslatedAndSizesReportedCorrectly() {
+    fun refreshOffsets_translateLayoutNodes_changeTranslatedAndSizesReportedCorrectly() {
         refreshOffsets_changeTranslatedAndSizesReportedCorrectly(
             Box(0, 0, 500, 500),
             Box(100, 100, 400, 400),
+            Point(0, 0),
             Box(50, -50, 550, 450), // Translate by 50, -50
             Box(105, 95, 405, 395), // Translate by 5, -5
+            Point(0, 0),
             250, 250
         )
     }
 
     @Test
-    fun refreshOffsets_justResize_changeTranslatedAndSizesReportedCorrectly() {
+    fun refreshOffsets_resizeLayoutNodes_changeTranslatedAndSizesReportedCorrectly() {
         refreshOffsets_changeTranslatedAndSizesReportedCorrectly(
             Box(0, 0, 500, 500),
             Box(100, 100, 400, 400),
+            Point(0, 0),
             Box(0, 0, 450, 550), // Add to size by -50, 50
             Box(100, 100, 395, 405), // Add to size by -5, 5
+            Point(0, 0),
             250, 250
         )
     }
 
     @Test
-    fun refreshOffsets_translateAndResize_changeTranslatedAndSizesReportedCorrectly() {
+    fun refreshOffsets_translateAndResizeLayoutNodes_changeTranslatedAndSizesReportedCorrectly() {
         refreshOffsets_changeTranslatedAndSizesReportedCorrectly(
             Box(0, 0, 500, 500),
             Box(100, 100, 400, 400),
+            Point(0, 0),
             Box(-50, 50, 550, 450), // Centered, scale by 100, -100
             Box(105, 95, 395, 405), // Centered, scale by -10, 10
+            Point(0, 0),
+            250, 250
+        )
+    }
+
+    @Test
+    fun refreshOffsets_updateOffsets_changeTranslatedAndSizesReportedCorrectly() {
+        refreshOffsets_changeTranslatedAndSizesReportedCorrectly(
+            Box(0, 0, 500, 500),
+            Box(100, 100, 400, 400),
+            Point(0, 0),
+            Box(0, 0, 500, 500),
+            Box(100, 100, 400, 400),
+            Point(5, 15),
+            250, 250
+        )
+    }
+
+    @Test
+    fun refreshOffsets_translateAll_changeTranslatedAndSizesReportedCorrectly() {
+        refreshOffsets_changeTranslatedAndSizesReportedCorrectly(
+            Box(0, 0, 500, 500),
+            Box(100, 100, 400, 400),
+            Point(0, 0),
+            Box(50, -50, 550, 450), // Translate by 50, -50
+            Box(105, 95, 405, 395), // Translate by 5, -5
+            Point(100, -100), // updated by 100, -100
+            250, 250
+        )
+    }
+
+    @Test
+    fun refreshOffsets_resizeLayoutNodesUpdateOffsets_changeTranslatedAndSizesReportedCorrectly() {
+        refreshOffsets_changeTranslatedAndSizesReportedCorrectly(
+            Box(0, 0, 500, 500),
+            Box(100, 100, 400, 400),
+            Point(0, 0),
+            Box(0, 0, 450, 550), // Add to size by -50, 50
+            Box(100, 100, 395, 405), // Add to size by -5, 5
+            Point(100, -100),
+            250, 250
+        )
+    }
+
+    @Test
+    fun refreshOffsets_translateAllResizeLayoutNodes_changeTranslatedAndSizesReportedCorrectly() {
+        refreshOffsets_changeTranslatedAndSizesReportedCorrectly(
+            Box(0, 0, 500, 500),
+            Box(100, 100, 400, 400),
+            Point(0, 0),
+            Box(-50, 50, 550, 450), // Centered, scale by 100, -100
+            Box(105, 95, 395, 405), // Centered, scale by -10, 10
+            Point(100, -100),
             250, 250
         )
     }
@@ -2534,8 +2635,10 @@
     private fun refreshOffsets_changeTranslatedAndSizesReportedCorrectly(
         p1: Box,
         c1: Box,
+        aO1: Point,
         p2: Box,
         c2: Box,
+        aO2: Point,
         pointerX: Int,
         pointerY: Int
     ) {
@@ -2545,6 +2648,7 @@
         val pointerPosition = PxPosition(pointerX.px, pointerY.px)
         val parentOffset2 = PxPosition(p2.left.px, p2.top.px)
         val childOffset2 = PxPosition(c2.left.px, c2.top.px)
+        val additionalOffset2 = IntPxPosition(aO2.x.ipx, aO2.y.ipx)
         val parentSize2 = IntPxSize(p2.right.ipx - p2.left.ipx, p2.bottom.ipx - p2.top.ipx)
         val childSize2 = IntPxSize(c2.right.ipx - c2.left.ipx, c2.bottom.ipx - c2.top.ipx)
 
@@ -2563,7 +2667,7 @@
 
         hitResult.addHitPath(3, listOf(parentPointerInputNode, childPointerInputNode))
 
-        hitResult.refreshOffsets()
+        hitResult.refreshOffsets(IntPxPosition(aO1.x.ipx, aO1.y.ipx))
 
         childLayoutNode.place(c2.left.ipx, c2.top.ipx)
         childLayoutNode
@@ -2574,7 +2678,7 @@
 
         // Act
 
-        hitResult.refreshOffsets()
+        hitResult.refreshOffsets(additionalOffset2)
 
         // Assert
 
@@ -2585,7 +2689,7 @@
                 id = 3,
                 current = PointerInputData(
                     7L.millisecondsToTimestamp(),
-                    pointerPosition - parentOffset2,
+                    pointerPosition - parentOffset2 - additionalOffset2,
                     true
                 ),
                 previous = PointerInputData(null, null, false),
@@ -2595,7 +2699,7 @@
                 id = 3,
                 current = PointerInputData(
                     7L.millisecondsToTimestamp(),
-                    pointerPosition - parentOffset2 - childOffset2,
+                    pointerPosition - parentOffset2 - childOffset2 - additionalOffset2,
                     true
                 ),
                 previous = PointerInputData(null, null, false),
@@ -2681,9 +2785,11 @@
         hitResult.addHitPath(3, listOf(parentPointerInputNode1, childPointerInputNode1))
         hitResult.addHitPath(5, listOf(parentPointerInputNode2, childPointerInputNode2))
 
+        val additionalOffset = IntPxPosition(29.ipx, 31.ipx)
+
         // Act
 
-        hitResult.refreshOffsets()
+        hitResult.refreshOffsets(additionalOffset)
 
         // Assert
 
@@ -2694,7 +2800,7 @@
                 id = 3,
                 current = PointerInputData(
                     7L.millisecondsToTimestamp(),
-                    pointer1Offset - parent1Offset,
+                    pointer1Offset - parent1Offset - additionalOffset,
                     true
                 ),
                 previous = PointerInputData(null, null, false),
@@ -2704,7 +2810,7 @@
                 id = 3,
                 current = PointerInputData(
                     7L.millisecondsToTimestamp(),
-                    pointer1Offset - parent1Offset - child1Offset,
+                    pointer1Offset - parent1Offset - child1Offset - additionalOffset,
                     true
                 ),
                 previous = PointerInputData(null, null, false),
@@ -2724,7 +2830,7 @@
                 id = 5,
                 current = PointerInputData(
                     7L.millisecondsToTimestamp(),
-                    pointer2Offset - parent2Offset,
+                    pointer2Offset - parent2Offset - additionalOffset,
                     true
                 ),
                 previous = PointerInputData(null, null, false),
@@ -2734,7 +2840,7 @@
                 id = 5,
                 current = PointerInputData(
                     7L.millisecondsToTimestamp(),
-                    pointer2Offset - parent2Offset - child2Offset,
+                    pointer2Offset - parent2Offset - child2Offset - additionalOffset,
                     true
                 ),
                 previous = PointerInputData(null, null, false),
@@ -2830,9 +2936,11 @@
         hitResult.addHitPath(3, listOf(parentPointerInputNode, childPointerInputNode1))
         hitResult.addHitPath(5, listOf(parentPointerInputNode, childPointerInputNode2))
 
+        val additionalOffset = IntPxPosition(29.ipx, 31.ipx)
+
         // Act
 
-        hitResult.refreshOffsets()
+        hitResult.refreshOffsets(additionalOffset)
 
         // Assert
 
@@ -2841,7 +2949,7 @@
                 id = 3,
                 current = PointerInputData(
                     7L.millisecondsToTimestamp(),
-                    pointer1Offset - parentOffset,
+                    pointer1Offset - parentOffset - additionalOffset,
                     true
                 ),
                 previous = PointerInputData(null, null, false),
@@ -2851,7 +2959,7 @@
                 id = 5,
                 current = PointerInputData(
                     7L.millisecondsToTimestamp(),
-                    pointer2Offset - parentOffset,
+                    pointer2Offset - parentOffset - additionalOffset,
                     true
                 ),
                 previous = PointerInputData(null, null, false),
@@ -2864,7 +2972,7 @@
                 id = 3,
                 current = PointerInputData(
                     7L.millisecondsToTimestamp(),
-                    pointer1Offset - parentOffset - child1Offset,
+                    pointer1Offset - parentOffset - child1Offset - additionalOffset,
                     true
                 ),
                 previous = PointerInputData(null, null, false),
@@ -2877,7 +2985,7 @@
                 id = 5,
                 current = PointerInputData(
                     7L.millisecondsToTimestamp(),
-                    pointer2Offset - parentOffset - child2Offset,
+                    pointer2Offset - parentOffset - child2Offset - additionalOffset,
                     true
                 ),
                 previous = PointerInputData(null, null, false),
@@ -2957,9 +3065,11 @@
 
         hitResult.addHitPath(3, listOf(pointerInputNode))
 
+        val additionalOffset = IntPxPosition(29.ipx, 31.ipx)
+
         // Act
 
-        hitResult.refreshOffsets()
+        hitResult.refreshOffsets(additionalOffset)
 
         // Assert
 
@@ -2968,7 +3078,7 @@
                 id = 3,
                 current = PointerInputData(
                     7L.millisecondsToTimestamp(),
-                    pointerOffset - parentOffset1 - parentOffset2 - childOffset,
+                    pointerOffset - parentOffset1 - parentOffset2 - childOffset - additionalOffset,
                     true
                 ),
                 previous = PointerInputData(null, null, false),
@@ -3040,9 +3150,11 @@
 
         hitResult.addHitPath(3, listOf(parentPointerInputNode, childPointerInputNode))
 
+        val additionalOffset = IntPxPosition(29.ipx, 31.ipx)
+
         // Act
 
-        hitResult.refreshOffsets()
+        hitResult.refreshOffsets(additionalOffset)
 
         // Assert
 
@@ -3053,7 +3165,8 @@
                 id = 3,
                 current = PointerInputData(
                     7L.millisecondsToTimestamp(),
-                    pointerOffset - parentOffset1 - parentOffset2 - parentOffset3,
+                    pointerOffset - parentOffset1 - parentOffset2 - parentOffset3 -
+                            additionalOffset,
                     true
                 ),
                 previous = PointerInputData(null, null, false),
@@ -3064,7 +3177,7 @@
                 current = PointerInputData(
                     7L.millisecondsToTimestamp(),
                     pointerOffset - parentOffset1 - parentOffset2 - parentOffset3 -
-                            childOffset1 - childOffset2,
+                            childOffset1 - childOffset2 - additionalOffset,
                     true
                 ),
                 previous = PointerInputData(null, null, false),
@@ -3160,7 +3273,7 @@
 
         // Act
 
-        hitResult.refreshOffsets()
+        hitResult.refreshOffsets(IntPxPosition.Origin)
 
         // Assert
 
@@ -3213,7 +3326,7 @@
 
         // Act
 
-        hitResult.refreshOffsets()
+        hitResult.refreshOffsets(IntPxPosition.Origin)
 
         // Assert
 
@@ -3449,4 +3562,6 @@
     }
 }
 
-private data class Box(val left: Int, val top: Int, val right: Int, val bottom: Int)
\ No newline at end of file
+private data class Box(val left: Int, val top: Int, val right: Int, val bottom: Int)
+
+private data class Point(val x: Int, val y: Int)
\ No newline at end of file
diff --git a/ui/ui-platform/src/test/java/androidx/ui/core/pointerinput/PointerInputEventProcessorTest.kt b/ui/ui-platform/src/test/java/androidx/ui/core/pointerinput/PointerInputEventProcessorTest.kt
index 5facb61..fb9da34 100644
--- a/ui/ui-platform/src/test/java/androidx/ui/core/pointerinput/PointerInputEventProcessorTest.kt
+++ b/ui/ui-platform/src/test/java/androidx/ui/core/pointerinput/PointerInputEventProcessorTest.kt
@@ -19,6 +19,7 @@
 import androidx.test.filters.SmallTest
 import androidx.ui.core.ConsumedData
 import androidx.ui.core.DrawNode
+import androidx.ui.core.IntPxPosition
 import androidx.ui.core.IntPxSize
 import androidx.ui.core.LayoutNode
 import androidx.ui.core.Owner
@@ -132,7 +133,7 @@
 
         // Act
 
-        events.forEach { pointerInputEventProcessor.process(it) }
+        events.forEach { pointerInputEventProcessor.process(it, IntPxPosition.Origin) }
 
         // Assert
 
@@ -188,7 +189,7 @@
         // Act
 
         events.forEach {
-            pointerInputEventProcessor.process(it)
+            pointerInputEventProcessor.process(it, IntPxPosition.Origin)
         }
 
         // Assert
@@ -236,7 +237,7 @@
         // Act
 
         events.forEach {
-            pointerInputEventProcessor.process(it)
+            pointerInputEventProcessor.process(it, IntPxPosition.Origin)
         }
 
         // Assert
@@ -294,7 +295,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(event)
+        pointerInputEventProcessor.process(event, IntPxPosition.Origin)
 
         // Assert
 
@@ -413,8 +414,8 @@
 
         // Act
 
-        pointerInputEventProcessor.process(down)
-        pointerInputEventProcessor.process(move)
+        pointerInputEventProcessor.process(down, IntPxPosition.Origin)
+        pointerInputEventProcessor.process(move, IntPxPosition.Origin)
 
         // Assert
 
@@ -425,31 +426,34 @@
     }
 
     @Test
-    fun process_layoutNodesIncreasinglyInset_dispatchInfoIsCorrect() {
+    fun process_nodesAndAdditionalOffsetIncreasinglyInset_dispatchInfoIsCorrect() {
         process_dispatchInfoIsCorrect(
             0, 0, 100, 100,
             2, 11, 100, 100,
             23, 31, 100, 100,
+            43, 51,
             99, 99
         )
     }
 
     @Test
-    fun process_layoutNodesIncreasinglyOutset_dispatchInfoIsCorrect() {
+    fun process_nodesAndAdditionalOffsetIncreasinglyOutset_dispatchInfoIsCorrect() {
         process_dispatchInfoIsCorrect(
             0, 0, 100, 100,
             -2, -11, 100, 100,
             -23, -31, 100, 100,
+            -43, -51,
             1, 1
         )
     }
 
     @Test
-    fun process_layoutNodesNotOffset_dispatchInfoIsCorrect() {
+    fun process_nodesAndAdditionalOffsetNotOffset_dispatchInfoIsCorrect() {
         process_dispatchInfoIsCorrect(
             0, 0, 100, 100,
             0, 0, 100, 100,
             0, 0, 100, 100,
+            0, 0,
             50, 50
         )
     }
@@ -468,6 +472,8 @@
         cY1: Int,
         cX2: Int,
         cY2: Int,
+        aOX: Int,
+        aOY: Int,
         pointerX: Int,
         pointerY: Int
     ) {
@@ -497,6 +503,8 @@
         }
         root.emitInsertAt(0, parentPointerInputNode)
 
+        val additionalOffset = IntPxPosition(aOX.ipx, aOY.ipx)
+
         val offset = PxPosition(pointerX.px, pointerY.px)
 
         val down = PointerInputEvent(0, 7L.millisecondsToTimestamp(), offset, true)
@@ -510,15 +518,9 @@
         val expectedPointerInputChanges = arrayOf(
             PointerInputChange(
                 id = 0,
-                current = PointerInputData(7L.millisecondsToTimestamp(), offset, true),
-                previous = PointerInputData(null, null, false),
-                consumed = ConsumedData()
-            ),
-            PointerInputChange(
-                id = 0,
                 current = PointerInputData(
                     7L.millisecondsToTimestamp(),
-                    offset - middleOffset,
+                    offset - additionalOffset,
                     true
                 ),
                 previous = PointerInputData(null, null, false),
@@ -528,7 +530,17 @@
                 id = 0,
                 current = PointerInputData(
                     7L.millisecondsToTimestamp(),
-                    offset - middleOffset - childOffset,
+                    offset - middleOffset - additionalOffset,
+                    true
+                ),
+                previous = PointerInputData(null, null, false),
+                consumed = ConsumedData()
+            ),
+            PointerInputChange(
+                id = 0,
+                current = PointerInputData(
+                    7L.millisecondsToTimestamp(),
+                    offset - middleOffset - childOffset - additionalOffset,
                     true
                 ),
                 previous = PointerInputData(null, null, false),
@@ -544,7 +556,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(down)
+        pointerInputEventProcessor.process(down, additionalOffset)
 
         // Assert
 
@@ -625,7 +637,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(down)
+        pointerInputEventProcessor.process(down, IntPxPosition.Origin)
 
         // Assert
 
@@ -733,7 +745,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(down)
+        pointerInputEventProcessor.process(down, IntPxPosition.Origin)
 
         // Assert
 
@@ -826,7 +838,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(down)
+        pointerInputEventProcessor.process(down, IntPxPosition.Origin)
 
         // Assert
 
@@ -920,7 +932,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(down)
+        pointerInputEventProcessor.process(down, IntPxPosition.Origin)
 
         // Assert
 
@@ -1012,7 +1024,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(pointerInputEvent)
+        pointerInputEventProcessor.process(pointerInputEvent, IntPxPosition.Origin)
 
         // Assert
 
@@ -1109,7 +1121,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(pointerInputEvent)
+        pointerInputEventProcessor.process(pointerInputEvent, IntPxPosition.Origin)
 
         // Assert
 
@@ -1220,7 +1232,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(pointerInputEvent)
+        pointerInputEventProcessor.process(pointerInputEvent, IntPxPosition.Origin)
 
         // Assert
 
@@ -1323,7 +1335,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(pointerInputEvent)
+        pointerInputEventProcessor.process(pointerInputEvent, IntPxPosition.Origin)
 
         // Assert
 
@@ -1420,7 +1432,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(pointerInputEvent)
+        pointerInputEventProcessor.process(pointerInputEvent, IntPxPosition.Origin)
 
         // Assert
 
@@ -1449,6 +1461,90 @@
         )
     }
 
+    /**
+     * This test creates a layout of this shape:
+     *
+     *   |---|
+     *   |tt |
+     *   |t  |
+     *   |---|t
+     *       tt
+     *
+     *   But where the additional offset suggest something more like this shape.
+     *
+     *   tt
+     *   t|---|
+     *    |  t|
+     *    | tt|
+     *    |---|
+     *
+     *   Without the additional offset, it would be expected that only the top left 3 pointers would
+     *   hit, but with the additional offset, only the bottom right 3 hit.
+     */
+    @Test
+    fun process_additionalOffsetExists_onlyCorrectPointersHit() {
+
+        // Arrange
+
+        val pointerInputNode: PointerInputNode = PointerInputNode().apply {
+            emitInsertAt(0, LayoutNode(0, 0, 2, 2))
+            pointerInputHandler = spy(MyPointerInputHandler())
+        }
+        root.apply {
+            emitInsertAt(0, pointerInputNode)
+        }
+        val offsetsThatHit =
+            listOf(
+                PxPosition(2.px, 2.px),
+                PxPosition(2.px, 1.px),
+                PxPosition(1.px, 2.px)
+            )
+        val offsetsThatMiss =
+            listOf(
+                PxPosition(0.px, 0.px),
+                PxPosition(0.px, 1.px),
+                PxPosition(1.px, 0.px)
+            )
+        val allOffsets = offsetsThatHit + offsetsThatMiss
+        val pointerInputEvent =
+            PointerInputEvent(
+                11L.millisecondsToTimestamp(),
+                (allOffsets.indices).map {
+                    PointerInputEventData(it, 11L.millisecondsToTimestamp(), allOffsets[it], true)
+                }
+            )
+
+        // Act
+
+        pointerInputEventProcessor.process(pointerInputEvent, IntPxPosition(1.ipx, 1.ipx))
+
+        // Assert
+
+        val expectedChanges =
+            (offsetsThatHit.indices).map {
+                PointerInputChange(
+                    id = it,
+                    current = PointerInputData(
+                        11L.millisecondsToTimestamp(),
+                        offsetsThatHit[it] - PxPosition(1.px, 1.px),
+                        true
+                    ),
+                    previous = PointerInputData(null, null, false),
+                    consumed = ConsumedData()
+                )
+            }
+        PointerEventPass.values().forEach { pointerEventPass ->
+            verify(pointerInputNode.pointerInputHandler).invoke(
+                eq(expectedChanges),
+                eq(pointerEventPass),
+                any()
+            )
+        }
+        verifyNoMoreInteractions(
+            pointerInputNode.pointerInputHandler
+        )
+    }
+
     @Test
     fun process_downOn3NestedPointerInputNodes_hitAndDispatchInfoAreCorrect() {
         val childPointerInputNode1: PointerInputNode = PointerInputNode().apply {
@@ -1489,7 +1585,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(down)
+        pointerInputEventProcessor.process(down, IntPxPosition.Origin)
 
         // Assert
 
@@ -1560,7 +1656,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(downEvent)
+        pointerInputEventProcessor.process(downEvent, IntPxPosition.Origin)
 
         // Assert
 
@@ -1646,7 +1742,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(downEvent)
+        pointerInputEventProcessor.process(downEvent, IntPxPosition.Origin)
 
         // Assert
 
@@ -1703,7 +1799,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(down)
+        pointerInputEventProcessor.process(down, IntPxPosition.Origin)
 
         // Assert
         verify(childPointerInputNode2.pointerInputHandler, times(5)).invoke(any(), any(), any())
@@ -1733,7 +1829,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(down)
+        pointerInputEventProcessor.process(down, IntPxPosition.Origin)
 
         // Assert
         verify(pointerInputNode.pointerInputHandler, times(5)).invoke(any(), any(), any())
@@ -1755,7 +1851,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(down)
+        pointerInputEventProcessor.process(down, IntPxPosition.Origin)
 
         // Assert
         verify(pointerInputNode.pointerInputHandler, never()).invoke(any(), any(), any())
@@ -1782,7 +1878,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(down)
+        pointerInputEventProcessor.process(down, IntPxPosition.Origin)
 
         // Assert
         verify(pointerInputNode.pointerInputHandler, never()).invoke(any(), any(), any())
@@ -1804,7 +1900,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(down)
+        pointerInputEventProcessor.process(down, IntPxPosition.Origin)
 
         // Assert
         verify(pointerInputNode.pointerInputHandler, never()).invoke(any(), any(), any())
@@ -1850,9 +1946,9 @@
 
         // Act
 
-        pointerInputEventProcessor.process(down)
+        pointerInputEventProcessor.process(down, IntPxPosition.Origin)
         parentLayoutNode.emitRemoveAt(0, 1)
-        pointerInputEventProcessor.process(up)
+        pointerInputEventProcessor.process(up, IntPxPosition.Origin)
 
         // Assert
 
@@ -1907,7 +2003,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(pointerInputEvent)
+        pointerInputEventProcessor.process(pointerInputEvent, IntPxPosition.Origin)
         pointerInputEventProcessor.processCancel()
 
         // Assert
@@ -2011,8 +2107,8 @@
 
         // Act
 
-        pointerInputEventProcessor.process(pointerInputEvent1)
-        pointerInputEventProcessor.process(pointerInputEvent2)
+        pointerInputEventProcessor.process(pointerInputEvent1, IntPxPosition.Origin)
+        pointerInputEventProcessor.process(pointerInputEvent2, IntPxPosition.Origin)
         pointerInputEventProcessor.processCancel()
 
         // Assert
@@ -2105,7 +2201,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(pointerInputEvent)
+        pointerInputEventProcessor.process(pointerInputEvent, IntPxPosition.Origin)
         pointerInputEventProcessor.processCancel()
 
         // Assert
@@ -2196,8 +2292,8 @@
 
         // Act
 
-        pointerInputEventProcessor.process(down)
-        pointerInputEventProcessor.process(move)
+        pointerInputEventProcessor.process(down, IntPxPosition.Origin)
+        pointerInputEventProcessor.process(move, IntPxPosition.Origin)
         pointerInputEventProcessor.processCancel()
 
         // Assert
@@ -2259,7 +2355,7 @@
 
         // Act
 
-        pointerInputEventProcessor.process(down)
+        pointerInputEventProcessor.process(down, IntPxPosition.Origin)
         pointerInputEventProcessor.processCancel()
 
         // Assert
@@ -2334,9 +2430,9 @@
 
         // Act
 
-        pointerInputEventProcessor.process(down1)
+        pointerInputEventProcessor.process(down1, IntPxPosition.Origin)
         pointerInputEventProcessor.processCancel()
-        pointerInputEventProcessor.process(down2)
+        pointerInputEventProcessor.process(down2, IntPxPosition.Origin)
 
         // Assert
 
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/platform/TypefaceAdapterTest.kt b/ui/ui-text/src/androidTest/java/androidx/ui/text/platform/TypefaceAdapterTest.kt
index 1dff233..0923444 100644
--- a/ui/ui-text/src/androidTest/java/androidx/ui/text/platform/TypefaceAdapterTest.kt
+++ b/ui/ui-text/src/androidTest/java/androidx/ui/text/platform/TypefaceAdapterTest.kt
@@ -480,7 +480,6 @@
         )
         assertThat(typeface.isItalic).isFalse()
 
-        // TODO(siyamed) ask this to Nona.
         if (Build.VERSION.SDK_INT < 23) {
             assertThat(typeface.isBold).isFalse()
         } else if (Build.VERSION.SDK_INT < 28) {
diff --git a/ui/ui-vector/api/0.1.0-dev03.txt b/ui/ui-vector/api/0.1.0-dev03.txt
index 0f7c4dc..3a900627 100644
--- a/ui/ui-vector/api/0.1.0-dev03.txt
+++ b/ui/ui-vector/api/0.1.0-dev03.txt
@@ -5,7 +5,7 @@
     ctor public GroupComponent(String name);
     ctor public GroupComponent();
     method public void draw(androidx.ui.graphics.Canvas canvas);
-    method public androidx.ui.graphics.vector.PathNode![] getClipPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getClipPathData();
     method public String getName();
     method public float getPivotX();
     method public float getPivotY();
@@ -18,7 +18,7 @@
     method public void insertAt(int index, androidx.ui.graphics.vector.VNode instance);
     method public void move(int from, int to, int count);
     method public void remove(int index, int count);
-    method public void setClipPathData(androidx.ui.graphics.vector.PathNode![] value);
+    method public void setClipPathData(java.util.List<androidx.ui.graphics.vector.PathNode> value);
     method public void setPivotX(float value);
     method public void setPivotY(float value);
     method public void setRotation(float value);
@@ -26,7 +26,7 @@
     method public void setScaleY(float value);
     method public void setTranslationX(float value);
     method public void setTranslationY(float value);
-    property public final androidx.ui.graphics.vector.PathNode![] clipPathData;
+    property public final java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData;
     property public final float pivotX;
     property public final float pivotY;
     property public final float rotation;
@@ -43,7 +43,7 @@
     method public androidx.ui.graphics.Brush? getFill();
     method public float getFillAlpha();
     method public String getName();
-    method public androidx.ui.graphics.vector.PathNode![] getPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getPathData();
     method public androidx.ui.graphics.Brush? getStroke();
     method public float getStrokeAlpha();
     method public androidx.ui.graphics.StrokeCap getStrokeLineCap();
@@ -52,7 +52,7 @@
     method public float getStrokeLineWidth();
     method public void setFill(androidx.ui.graphics.Brush? value);
     method public void setFillAlpha(float value);
-    method public void setPathData(androidx.ui.graphics.vector.PathNode![] value);
+    method public void setPathData(java.util.List<androidx.ui.graphics.vector.PathNode> value);
     method public void setStroke(androidx.ui.graphics.Brush? value);
     method public void setStrokeAlpha(float value);
     method public void setStrokeLineCap(androidx.ui.graphics.StrokeCap value);
@@ -61,7 +61,7 @@
     method public void setStrokeLineWidth(float value);
     property public final androidx.ui.graphics.Brush? fill;
     property public final float fillAlpha;
-    property public final androidx.ui.graphics.vector.PathNode![] pathData;
+    property public final java.util.List<androidx.ui.graphics.vector.PathNode> pathData;
     property public final androidx.ui.graphics.Brush? stroke;
     property public final float strokeAlpha;
     property public final androidx.ui.graphics.StrokeCap strokeLineCap;
@@ -117,13 +117,13 @@
 
   public final class VectorKt {
     ctor public VectorKt();
-    method public static inline androidx.ui.graphics.vector.PathNode![] PathData(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
-    method public static androidx.ui.graphics.vector.PathNode![] addPathNodes(String? pathStr);
+    method public static inline java.util.List<androidx.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
+    method public static java.util.List<androidx.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
     method public static androidx.ui.graphics.StrokeCap getDefaultStrokeLineCap();
     method public static androidx.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
     method public static androidx.ui.graphics.BlendMode getDefaultTintBlendMode();
     method public static androidx.ui.graphics.Color getDefaultTintColor();
-    method public static androidx.ui.graphics.vector.PathNode![] getEmptyPath();
+    method public static java.util.List<androidx.ui.graphics.vector.PathNode> getEmptyPath();
     field public static final float DefaultAlpha = 1.0f;
     field public static final String DefaultGroupName = "";
     field public static final String DefaultPathName = "";
diff --git a/ui/ui-vector/api/api_lint.ignore b/ui/ui-vector/api/api_lint.ignore
index 9f3bd8f..d206a00 100644
--- a/ui/ui-vector/api/api_lint.ignore
+++ b/ui/ui-vector/api/api_lint.ignore
@@ -1,19 +1,3 @@
 // Baseline format: 1.0
 AcronymName: androidx.ui.graphics.vector.VectorComposeNonIRKt:
     Acronyms should not be capitalized in class names: was `VectorComposeNonIRKt`, should this be `VectorComposeNonIrKt`?
-
-
-ArrayReturn: androidx.ui.graphics.vector.GroupComponent#getClipPathData():
-    Method should return Collection<PathNode> (or subclass) instead of raw array; was `androidx.ui.graphics.vector.PathNode[]`
-ArrayReturn: androidx.ui.graphics.vector.GroupComponent#setClipPathData(androidx.ui.graphics.vector.PathNode[]) parameter #0:
-    Method parameter should be Collection<PathNode> (or subclass) instead of raw array; was `androidx.ui.graphics.vector.PathNode[]`
-ArrayReturn: androidx.ui.graphics.vector.PathComponent#getPathData():
-    Method should return Collection<PathNode> (or subclass) instead of raw array; was `androidx.ui.graphics.vector.PathNode[]`
-ArrayReturn: androidx.ui.graphics.vector.PathComponent#setPathData(androidx.ui.graphics.vector.PathNode[]) parameter #0:
-    Method parameter should be Collection<PathNode> (or subclass) instead of raw array; was `androidx.ui.graphics.vector.PathNode[]`
-ArrayReturn: androidx.ui.graphics.vector.VectorKt#PathData(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.PathBuilder,kotlin.Unit>):
-    Method should return Collection<PathNode> (or subclass) instead of raw array; was `androidx.ui.graphics.vector.PathNode[]`
-ArrayReturn: androidx.ui.graphics.vector.VectorKt#addPathNodes(String):
-    Method should return Collection<PathNode> (or subclass) instead of raw array; was `androidx.ui.graphics.vector.PathNode[]`
-ArrayReturn: androidx.ui.graphics.vector.VectorKt#getEmptyPath():
-    Method should return Collection<PathNode> (or subclass) instead of raw array; was `androidx.ui.graphics.vector.PathNode[]`
diff --git a/ui/ui-vector/api/current.txt b/ui/ui-vector/api/current.txt
index 0f7c4dc..3a900627 100644
--- a/ui/ui-vector/api/current.txt
+++ b/ui/ui-vector/api/current.txt
@@ -5,7 +5,7 @@
     ctor public GroupComponent(String name);
     ctor public GroupComponent();
     method public void draw(androidx.ui.graphics.Canvas canvas);
-    method public androidx.ui.graphics.vector.PathNode![] getClipPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getClipPathData();
     method public String getName();
     method public float getPivotX();
     method public float getPivotY();
@@ -18,7 +18,7 @@
     method public void insertAt(int index, androidx.ui.graphics.vector.VNode instance);
     method public void move(int from, int to, int count);
     method public void remove(int index, int count);
-    method public void setClipPathData(androidx.ui.graphics.vector.PathNode![] value);
+    method public void setClipPathData(java.util.List<androidx.ui.graphics.vector.PathNode> value);
     method public void setPivotX(float value);
     method public void setPivotY(float value);
     method public void setRotation(float value);
@@ -26,7 +26,7 @@
     method public void setScaleY(float value);
     method public void setTranslationX(float value);
     method public void setTranslationY(float value);
-    property public final androidx.ui.graphics.vector.PathNode![] clipPathData;
+    property public final java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData;
     property public final float pivotX;
     property public final float pivotY;
     property public final float rotation;
@@ -43,7 +43,7 @@
     method public androidx.ui.graphics.Brush? getFill();
     method public float getFillAlpha();
     method public String getName();
-    method public androidx.ui.graphics.vector.PathNode![] getPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getPathData();
     method public androidx.ui.graphics.Brush? getStroke();
     method public float getStrokeAlpha();
     method public androidx.ui.graphics.StrokeCap getStrokeLineCap();
@@ -52,7 +52,7 @@
     method public float getStrokeLineWidth();
     method public void setFill(androidx.ui.graphics.Brush? value);
     method public void setFillAlpha(float value);
-    method public void setPathData(androidx.ui.graphics.vector.PathNode![] value);
+    method public void setPathData(java.util.List<androidx.ui.graphics.vector.PathNode> value);
     method public void setStroke(androidx.ui.graphics.Brush? value);
     method public void setStrokeAlpha(float value);
     method public void setStrokeLineCap(androidx.ui.graphics.StrokeCap value);
@@ -61,7 +61,7 @@
     method public void setStrokeLineWidth(float value);
     property public final androidx.ui.graphics.Brush? fill;
     property public final float fillAlpha;
-    property public final androidx.ui.graphics.vector.PathNode![] pathData;
+    property public final java.util.List<androidx.ui.graphics.vector.PathNode> pathData;
     property public final androidx.ui.graphics.Brush? stroke;
     property public final float strokeAlpha;
     property public final androidx.ui.graphics.StrokeCap strokeLineCap;
@@ -117,13 +117,13 @@
 
   public final class VectorKt {
     ctor public VectorKt();
-    method public static inline androidx.ui.graphics.vector.PathNode![] PathData(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
-    method public static androidx.ui.graphics.vector.PathNode![] addPathNodes(String? pathStr);
+    method public static inline java.util.List<androidx.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
+    method public static java.util.List<androidx.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
     method public static androidx.ui.graphics.StrokeCap getDefaultStrokeLineCap();
     method public static androidx.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
     method public static androidx.ui.graphics.BlendMode getDefaultTintBlendMode();
     method public static androidx.ui.graphics.Color getDefaultTintColor();
-    method public static androidx.ui.graphics.vector.PathNode![] getEmptyPath();
+    method public static java.util.List<androidx.ui.graphics.vector.PathNode> getEmptyPath();
     field public static final float DefaultAlpha = 1.0f;
     field public static final String DefaultGroupName = "";
     field public static final String DefaultPathName = "";
diff --git a/ui/ui-vector/api/public_plus_experimental_0.1.0-dev03.txt b/ui/ui-vector/api/public_plus_experimental_0.1.0-dev03.txt
index 0f7c4dc..3a900627 100644
--- a/ui/ui-vector/api/public_plus_experimental_0.1.0-dev03.txt
+++ b/ui/ui-vector/api/public_plus_experimental_0.1.0-dev03.txt
@@ -5,7 +5,7 @@
     ctor public GroupComponent(String name);
     ctor public GroupComponent();
     method public void draw(androidx.ui.graphics.Canvas canvas);
-    method public androidx.ui.graphics.vector.PathNode![] getClipPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getClipPathData();
     method public String getName();
     method public float getPivotX();
     method public float getPivotY();
@@ -18,7 +18,7 @@
     method public void insertAt(int index, androidx.ui.graphics.vector.VNode instance);
     method public void move(int from, int to, int count);
     method public void remove(int index, int count);
-    method public void setClipPathData(androidx.ui.graphics.vector.PathNode![] value);
+    method public void setClipPathData(java.util.List<androidx.ui.graphics.vector.PathNode> value);
     method public void setPivotX(float value);
     method public void setPivotY(float value);
     method public void setRotation(float value);
@@ -26,7 +26,7 @@
     method public void setScaleY(float value);
     method public void setTranslationX(float value);
     method public void setTranslationY(float value);
-    property public final androidx.ui.graphics.vector.PathNode![] clipPathData;
+    property public final java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData;
     property public final float pivotX;
     property public final float pivotY;
     property public final float rotation;
@@ -43,7 +43,7 @@
     method public androidx.ui.graphics.Brush? getFill();
     method public float getFillAlpha();
     method public String getName();
-    method public androidx.ui.graphics.vector.PathNode![] getPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getPathData();
     method public androidx.ui.graphics.Brush? getStroke();
     method public float getStrokeAlpha();
     method public androidx.ui.graphics.StrokeCap getStrokeLineCap();
@@ -52,7 +52,7 @@
     method public float getStrokeLineWidth();
     method public void setFill(androidx.ui.graphics.Brush? value);
     method public void setFillAlpha(float value);
-    method public void setPathData(androidx.ui.graphics.vector.PathNode![] value);
+    method public void setPathData(java.util.List<androidx.ui.graphics.vector.PathNode> value);
     method public void setStroke(androidx.ui.graphics.Brush? value);
     method public void setStrokeAlpha(float value);
     method public void setStrokeLineCap(androidx.ui.graphics.StrokeCap value);
@@ -61,7 +61,7 @@
     method public void setStrokeLineWidth(float value);
     property public final androidx.ui.graphics.Brush? fill;
     property public final float fillAlpha;
-    property public final androidx.ui.graphics.vector.PathNode![] pathData;
+    property public final java.util.List<androidx.ui.graphics.vector.PathNode> pathData;
     property public final androidx.ui.graphics.Brush? stroke;
     property public final float strokeAlpha;
     property public final androidx.ui.graphics.StrokeCap strokeLineCap;
@@ -117,13 +117,13 @@
 
   public final class VectorKt {
     ctor public VectorKt();
-    method public static inline androidx.ui.graphics.vector.PathNode![] PathData(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
-    method public static androidx.ui.graphics.vector.PathNode![] addPathNodes(String? pathStr);
+    method public static inline java.util.List<androidx.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
+    method public static java.util.List<androidx.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
     method public static androidx.ui.graphics.StrokeCap getDefaultStrokeLineCap();
     method public static androidx.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
     method public static androidx.ui.graphics.BlendMode getDefaultTintBlendMode();
     method public static androidx.ui.graphics.Color getDefaultTintColor();
-    method public static androidx.ui.graphics.vector.PathNode![] getEmptyPath();
+    method public static java.util.List<androidx.ui.graphics.vector.PathNode> getEmptyPath();
     field public static final float DefaultAlpha = 1.0f;
     field public static final String DefaultGroupName = "";
     field public static final String DefaultPathName = "";
diff --git a/ui/ui-vector/api/public_plus_experimental_current.txt b/ui/ui-vector/api/public_plus_experimental_current.txt
index 0f7c4dc..3a900627 100644
--- a/ui/ui-vector/api/public_plus_experimental_current.txt
+++ b/ui/ui-vector/api/public_plus_experimental_current.txt
@@ -5,7 +5,7 @@
     ctor public GroupComponent(String name);
     ctor public GroupComponent();
     method public void draw(androidx.ui.graphics.Canvas canvas);
-    method public androidx.ui.graphics.vector.PathNode![] getClipPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getClipPathData();
     method public String getName();
     method public float getPivotX();
     method public float getPivotY();
@@ -18,7 +18,7 @@
     method public void insertAt(int index, androidx.ui.graphics.vector.VNode instance);
     method public void move(int from, int to, int count);
     method public void remove(int index, int count);
-    method public void setClipPathData(androidx.ui.graphics.vector.PathNode![] value);
+    method public void setClipPathData(java.util.List<androidx.ui.graphics.vector.PathNode> value);
     method public void setPivotX(float value);
     method public void setPivotY(float value);
     method public void setRotation(float value);
@@ -26,7 +26,7 @@
     method public void setScaleY(float value);
     method public void setTranslationX(float value);
     method public void setTranslationY(float value);
-    property public final androidx.ui.graphics.vector.PathNode![] clipPathData;
+    property public final java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData;
     property public final float pivotX;
     property public final float pivotY;
     property public final float rotation;
@@ -43,7 +43,7 @@
     method public androidx.ui.graphics.Brush? getFill();
     method public float getFillAlpha();
     method public String getName();
-    method public androidx.ui.graphics.vector.PathNode![] getPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getPathData();
     method public androidx.ui.graphics.Brush? getStroke();
     method public float getStrokeAlpha();
     method public androidx.ui.graphics.StrokeCap getStrokeLineCap();
@@ -52,7 +52,7 @@
     method public float getStrokeLineWidth();
     method public void setFill(androidx.ui.graphics.Brush? value);
     method public void setFillAlpha(float value);
-    method public void setPathData(androidx.ui.graphics.vector.PathNode![] value);
+    method public void setPathData(java.util.List<androidx.ui.graphics.vector.PathNode> value);
     method public void setStroke(androidx.ui.graphics.Brush? value);
     method public void setStrokeAlpha(float value);
     method public void setStrokeLineCap(androidx.ui.graphics.StrokeCap value);
@@ -61,7 +61,7 @@
     method public void setStrokeLineWidth(float value);
     property public final androidx.ui.graphics.Brush? fill;
     property public final float fillAlpha;
-    property public final androidx.ui.graphics.vector.PathNode![] pathData;
+    property public final java.util.List<androidx.ui.graphics.vector.PathNode> pathData;
     property public final androidx.ui.graphics.Brush? stroke;
     property public final float strokeAlpha;
     property public final androidx.ui.graphics.StrokeCap strokeLineCap;
@@ -117,13 +117,13 @@
 
   public final class VectorKt {
     ctor public VectorKt();
-    method public static inline androidx.ui.graphics.vector.PathNode![] PathData(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
-    method public static androidx.ui.graphics.vector.PathNode![] addPathNodes(String? pathStr);
+    method public static inline java.util.List<androidx.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
+    method public static java.util.List<androidx.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
     method public static androidx.ui.graphics.StrokeCap getDefaultStrokeLineCap();
     method public static androidx.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
     method public static androidx.ui.graphics.BlendMode getDefaultTintBlendMode();
     method public static androidx.ui.graphics.Color getDefaultTintColor();
-    method public static androidx.ui.graphics.vector.PathNode![] getEmptyPath();
+    method public static java.util.List<androidx.ui.graphics.vector.PathNode> getEmptyPath();
     field public static final float DefaultAlpha = 1.0f;
     field public static final String DefaultGroupName = "";
     field public static final String DefaultPathName = "";
diff --git a/ui/ui-vector/api/restricted_0.1.0-dev03.txt b/ui/ui-vector/api/restricted_0.1.0-dev03.txt
index 0f7c4dc..3a900627 100644
--- a/ui/ui-vector/api/restricted_0.1.0-dev03.txt
+++ b/ui/ui-vector/api/restricted_0.1.0-dev03.txt
@@ -5,7 +5,7 @@
     ctor public GroupComponent(String name);
     ctor public GroupComponent();
     method public void draw(androidx.ui.graphics.Canvas canvas);
-    method public androidx.ui.graphics.vector.PathNode![] getClipPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getClipPathData();
     method public String getName();
     method public float getPivotX();
     method public float getPivotY();
@@ -18,7 +18,7 @@
     method public void insertAt(int index, androidx.ui.graphics.vector.VNode instance);
     method public void move(int from, int to, int count);
     method public void remove(int index, int count);
-    method public void setClipPathData(androidx.ui.graphics.vector.PathNode![] value);
+    method public void setClipPathData(java.util.List<androidx.ui.graphics.vector.PathNode> value);
     method public void setPivotX(float value);
     method public void setPivotY(float value);
     method public void setRotation(float value);
@@ -26,7 +26,7 @@
     method public void setScaleY(float value);
     method public void setTranslationX(float value);
     method public void setTranslationY(float value);
-    property public final androidx.ui.graphics.vector.PathNode![] clipPathData;
+    property public final java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData;
     property public final float pivotX;
     property public final float pivotY;
     property public final float rotation;
@@ -43,7 +43,7 @@
     method public androidx.ui.graphics.Brush? getFill();
     method public float getFillAlpha();
     method public String getName();
-    method public androidx.ui.graphics.vector.PathNode![] getPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getPathData();
     method public androidx.ui.graphics.Brush? getStroke();
     method public float getStrokeAlpha();
     method public androidx.ui.graphics.StrokeCap getStrokeLineCap();
@@ -52,7 +52,7 @@
     method public float getStrokeLineWidth();
     method public void setFill(androidx.ui.graphics.Brush? value);
     method public void setFillAlpha(float value);
-    method public void setPathData(androidx.ui.graphics.vector.PathNode![] value);
+    method public void setPathData(java.util.List<androidx.ui.graphics.vector.PathNode> value);
     method public void setStroke(androidx.ui.graphics.Brush? value);
     method public void setStrokeAlpha(float value);
     method public void setStrokeLineCap(androidx.ui.graphics.StrokeCap value);
@@ -61,7 +61,7 @@
     method public void setStrokeLineWidth(float value);
     property public final androidx.ui.graphics.Brush? fill;
     property public final float fillAlpha;
-    property public final androidx.ui.graphics.vector.PathNode![] pathData;
+    property public final java.util.List<androidx.ui.graphics.vector.PathNode> pathData;
     property public final androidx.ui.graphics.Brush? stroke;
     property public final float strokeAlpha;
     property public final androidx.ui.graphics.StrokeCap strokeLineCap;
@@ -117,13 +117,13 @@
 
   public final class VectorKt {
     ctor public VectorKt();
-    method public static inline androidx.ui.graphics.vector.PathNode![] PathData(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
-    method public static androidx.ui.graphics.vector.PathNode![] addPathNodes(String? pathStr);
+    method public static inline java.util.List<androidx.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
+    method public static java.util.List<androidx.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
     method public static androidx.ui.graphics.StrokeCap getDefaultStrokeLineCap();
     method public static androidx.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
     method public static androidx.ui.graphics.BlendMode getDefaultTintBlendMode();
     method public static androidx.ui.graphics.Color getDefaultTintColor();
-    method public static androidx.ui.graphics.vector.PathNode![] getEmptyPath();
+    method public static java.util.List<androidx.ui.graphics.vector.PathNode> getEmptyPath();
     field public static final float DefaultAlpha = 1.0f;
     field public static final String DefaultGroupName = "";
     field public static final String DefaultPathName = "";
diff --git a/ui/ui-vector/api/restricted_current.txt b/ui/ui-vector/api/restricted_current.txt
index 0f7c4dc..3a900627 100644
--- a/ui/ui-vector/api/restricted_current.txt
+++ b/ui/ui-vector/api/restricted_current.txt
@@ -5,7 +5,7 @@
     ctor public GroupComponent(String name);
     ctor public GroupComponent();
     method public void draw(androidx.ui.graphics.Canvas canvas);
-    method public androidx.ui.graphics.vector.PathNode![] getClipPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getClipPathData();
     method public String getName();
     method public float getPivotX();
     method public float getPivotY();
@@ -18,7 +18,7 @@
     method public void insertAt(int index, androidx.ui.graphics.vector.VNode instance);
     method public void move(int from, int to, int count);
     method public void remove(int index, int count);
-    method public void setClipPathData(androidx.ui.graphics.vector.PathNode![] value);
+    method public void setClipPathData(java.util.List<androidx.ui.graphics.vector.PathNode> value);
     method public void setPivotX(float value);
     method public void setPivotY(float value);
     method public void setRotation(float value);
@@ -26,7 +26,7 @@
     method public void setScaleY(float value);
     method public void setTranslationX(float value);
     method public void setTranslationY(float value);
-    property public final androidx.ui.graphics.vector.PathNode![] clipPathData;
+    property public final java.util.List<androidx.ui.graphics.vector.PathNode> clipPathData;
     property public final float pivotX;
     property public final float pivotY;
     property public final float rotation;
@@ -43,7 +43,7 @@
     method public androidx.ui.graphics.Brush? getFill();
     method public float getFillAlpha();
     method public String getName();
-    method public androidx.ui.graphics.vector.PathNode![] getPathData();
+    method public java.util.List<androidx.ui.graphics.vector.PathNode> getPathData();
     method public androidx.ui.graphics.Brush? getStroke();
     method public float getStrokeAlpha();
     method public androidx.ui.graphics.StrokeCap getStrokeLineCap();
@@ -52,7 +52,7 @@
     method public float getStrokeLineWidth();
     method public void setFill(androidx.ui.graphics.Brush? value);
     method public void setFillAlpha(float value);
-    method public void setPathData(androidx.ui.graphics.vector.PathNode![] value);
+    method public void setPathData(java.util.List<androidx.ui.graphics.vector.PathNode> value);
     method public void setStroke(androidx.ui.graphics.Brush? value);
     method public void setStrokeAlpha(float value);
     method public void setStrokeLineCap(androidx.ui.graphics.StrokeCap value);
@@ -61,7 +61,7 @@
     method public void setStrokeLineWidth(float value);
     property public final androidx.ui.graphics.Brush? fill;
     property public final float fillAlpha;
-    property public final androidx.ui.graphics.vector.PathNode![] pathData;
+    property public final java.util.List<androidx.ui.graphics.vector.PathNode> pathData;
     property public final androidx.ui.graphics.Brush? stroke;
     property public final float strokeAlpha;
     property public final androidx.ui.graphics.StrokeCap strokeLineCap;
@@ -117,13 +117,13 @@
 
   public final class VectorKt {
     ctor public VectorKt();
-    method public static inline androidx.ui.graphics.vector.PathNode![] PathData(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
-    method public static androidx.ui.graphics.vector.PathNode![] addPathNodes(String? pathStr);
+    method public static inline java.util.List<androidx.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
+    method public static java.util.List<androidx.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
     method public static androidx.ui.graphics.StrokeCap getDefaultStrokeLineCap();
     method public static androidx.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
     method public static androidx.ui.graphics.BlendMode getDefaultTintBlendMode();
     method public static androidx.ui.graphics.Color getDefaultTintColor();
-    method public static androidx.ui.graphics.vector.PathNode![] getEmptyPath();
+    method public static java.util.List<androidx.ui.graphics.vector.PathNode> getEmptyPath();
     field public static final float DefaultAlpha = 1.0f;
     field public static final String DefaultGroupName = "";
     field public static final String DefaultPathName = "";
diff --git a/ui/ui-vector/src/main/java/androidx/ui/graphics/vector/Vector.kt b/ui/ui-vector/src/main/java/androidx/ui/graphics/vector/Vector.kt
index dad7d2a..a75bd8e 100644
--- a/ui/ui-vector/src/main/java/androidx/ui/graphics/vector/Vector.kt
+++ b/ui/ui-vector/src/main/java/androidx/ui/graphics/vector/Vector.kt
@@ -42,7 +42,7 @@
 const val DefaultTranslationX = 0.0f
 const val DefaultTranslationY = 0.0f
 
-val EmptyPath = emptyArray<PathNode>()
+val EmptyPath = emptyList<PathNode>()
 
 /**
  * paint used to draw the cached vector graphic to the provided canvas
@@ -50,7 +50,7 @@
 // TODO (njawad) Can we update the Compose Canvas API to make this paint optional?
 internal val EmptyPaint = Paint()
 
-inline fun PathData(block: PathBuilder.() -> Unit): Array<PathNode> =
+inline fun PathData(block: PathBuilder.() -> Unit): List<PathNode> =
     with(PathBuilder()) {
         block()
         getNodes()
@@ -66,7 +66,7 @@
 val DefaultTintBlendMode = BlendMode.srcIn
 val DefaultTintColor = Color.Transparent
 
-fun addPathNodes(pathStr: String?): Array<PathNode> =
+fun addPathNodes(pathStr: String?): List<PathNode> =
     if (pathStr == null) {
         EmptyPath
     } else {
@@ -171,7 +171,7 @@
             }
         }
 
-    var pathData: Array<PathNode> = emptyArray()
+    var pathData: List<PathNode> = EmptyPath
         set(value) {
             field = value
             isPathDirty = true
@@ -312,7 +312,7 @@
 
     private val children = mutableListOf<VNode>()
 
-    var clipPathData: Array<PathNode> = EmptyPath
+    var clipPathData: List<PathNode> = EmptyPath
         set(value) {
             field = value
             isClipPathDirty = true
diff --git a/work/workmanager-gcm/api/2.3.0-beta01.txt b/work/workmanager-gcm/api/2.3.0-beta01.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/work/workmanager-gcm/api/2.3.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/work/workmanager-gcm/api/public_plus_experimental_2.3.0-beta01.txt b/work/workmanager-gcm/api/public_plus_experimental_2.3.0-beta01.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/work/workmanager-gcm/api/public_plus_experimental_2.3.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/work/workmanager-gcm/api/res-2.3.0-beta01.txt b/work/workmanager-gcm/api/res-2.3.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/work/workmanager-gcm/api/res-2.3.0-beta01.txt
diff --git a/work/workmanager-gcm/api/restricted_2.3.0-beta01.txt b/work/workmanager-gcm/api/restricted_2.3.0-beta01.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/work/workmanager-gcm/api/restricted_2.3.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/work/workmanager-ktx/api/2.3.0-beta01.txt b/work/workmanager-ktx/api/2.3.0-beta01.txt
new file mode 100644
index 0000000..5873b39
--- /dev/null
+++ b/work/workmanager-ktx/api/2.3.0-beta01.txt
@@ -0,0 +1,45 @@
+// 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 suspend Object! setForeground(androidx.work.ForegroundInfo foregroundInfo, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public final suspend Object! setProgress(androidx.work.Data data, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    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 <reified T> boolean hasKeyWithValueOfType(androidx.work.Data, String key);
+    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/public_plus_experimental_2.3.0-beta01.txt b/work/workmanager-ktx/api/public_plus_experimental_2.3.0-beta01.txt
new file mode 100644
index 0000000..5873b39
--- /dev/null
+++ b/work/workmanager-ktx/api/public_plus_experimental_2.3.0-beta01.txt
@@ -0,0 +1,45 @@
+// 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 suspend Object! setForeground(androidx.work.ForegroundInfo foregroundInfo, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public final suspend Object! setProgress(androidx.work.Data data, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    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 <reified T> boolean hasKeyWithValueOfType(androidx.work.Data, String key);
+    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/res-2.3.0-beta01.txt b/work/workmanager-ktx/api/res-2.3.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/work/workmanager-ktx/api/res-2.3.0-beta01.txt
diff --git a/work/workmanager-ktx/api/restricted_2.3.0-beta01.txt b/work/workmanager-ktx/api/restricted_2.3.0-beta01.txt
new file mode 100644
index 0000000..075851a
--- /dev/null
+++ b/work/workmanager-ktx/api/restricted_2.3.0-beta01.txt
@@ -0,0 +1,51 @@
+// 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 suspend Object! setForeground(androidx.work.ForegroundInfo foregroundInfo, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public final suspend Object! setProgress(androidx.work.Data data, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    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 <reified T> boolean hasKeyWithValueOfType(androidx.work.Data, String key);
+    method public static inline androidx.work.Data workDataOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public enum DirectExecutor implements java.util.concurrent.Executor {
+    method public void execute(Runnable command);
+    enum_constant public static final androidx.work.DirectExecutor INSTANCE;
+  }
+
+  public final class ListenableFutureKt {
+    ctor public ListenableFutureKt();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static suspend inline <R> Object! await(com.google.common.util.concurrent.ListenableFuture<R>, kotlin.coroutines.Continuation<? super R> p);
+  }
+
+  public final class OneTimeWorkRequestKt {
+    ctor public OneTimeWorkRequestKt();
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.OneTimeWorkRequest.Builder OneTimeWorkRequestBuilder();
+    method public static inline androidx.work.OneTimeWorkRequest.Builder setInputMerger(androidx.work.OneTimeWorkRequest.Builder, kotlin.reflect.KClass<? extends androidx.work.InputMerger> inputMerger);
+  }
+
+  public final class OperationKt {
+    ctor public OperationKt();
+    method public static suspend inline Object! await(androidx.work.Operation, kotlin.coroutines.Continuation<? super androidx.work.Operation.State.SUCCESS> p);
+  }
+
+  public final class PeriodicWorkRequestKt {
+    ctor public PeriodicWorkRequestKt();
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit);
+    method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval);
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit, long flexTimeInterval, java.util.concurrent.TimeUnit flexTimeIntervalUnit);
+    method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval, java.time.Duration flexTimeInterval);
+  }
+
+}
+
diff --git a/work/workmanager-rxjava2/api/2.3.0-beta01.txt b/work/workmanager-rxjava2/api/2.3.0-beta01.txt
new file mode 100644
index 0000000..757ca4c
--- /dev/null
+++ b/work/workmanager-rxjava2/api/2.3.0-beta01.txt
@@ -0,0 +1,13 @@
+// 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 final io.reactivex.Single<java.lang.Void!> setProgress(androidx.work.Data);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+}
+
diff --git a/work/workmanager-rxjava2/api/public_plus_experimental_2.3.0-beta01.txt b/work/workmanager-rxjava2/api/public_plus_experimental_2.3.0-beta01.txt
new file mode 100644
index 0000000..757ca4c
--- /dev/null
+++ b/work/workmanager-rxjava2/api/public_plus_experimental_2.3.0-beta01.txt
@@ -0,0 +1,13 @@
+// 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 final io.reactivex.Single<java.lang.Void!> setProgress(androidx.work.Data);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+}
+
diff --git a/work/workmanager-rxjava2/api/res-2.3.0-beta01.txt b/work/workmanager-rxjava2/api/res-2.3.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/work/workmanager-rxjava2/api/res-2.3.0-beta01.txt
diff --git a/work/workmanager-rxjava2/api/restricted_2.3.0-beta01.txt b/work/workmanager-rxjava2/api/restricted_2.3.0-beta01.txt
new file mode 100644
index 0000000..757ca4c
--- /dev/null
+++ b/work/workmanager-rxjava2/api/restricted_2.3.0-beta01.txt
@@ -0,0 +1,13 @@
+// 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 final io.reactivex.Single<java.lang.Void!> setProgress(androidx.work.Data);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+}
+
diff --git a/work/workmanager-testing/api/2.3.0-beta01.txt b/work/workmanager-testing/api/2.3.0-beta01.txt
new file mode 100644
index 0000000..2f8dc82
--- /dev/null
+++ b/work/workmanager-testing/api/2.3.0-beta01.txt
@@ -0,0 +1,54 @@
+// 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 setForegroundUpdater(androidx.work.ForegroundUpdater);
+    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 setProgressUpdater(androidx.work.ProgressUpdater);
+    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/public_plus_experimental_2.3.0-beta01.txt b/work/workmanager-testing/api/public_plus_experimental_2.3.0-beta01.txt
new file mode 100644
index 0000000..2f8dc82
--- /dev/null
+++ b/work/workmanager-testing/api/public_plus_experimental_2.3.0-beta01.txt
@@ -0,0 +1,54 @@
+// 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 setForegroundUpdater(androidx.work.ForegroundUpdater);
+    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 setProgressUpdater(androidx.work.ProgressUpdater);
+    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/res-2.3.0-beta01.txt b/work/workmanager-testing/api/res-2.3.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/work/workmanager-testing/api/res-2.3.0-beta01.txt
diff --git a/work/workmanager-testing/api/restricted_2.3.0-beta01.txt b/work/workmanager-testing/api/restricted_2.3.0-beta01.txt
new file mode 100644
index 0000000..c866b6a
--- /dev/null
+++ b/work/workmanager-testing/api/restricted_2.3.0-beta01.txt
@@ -0,0 +1,64 @@
+// 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);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class TestForegroundUpdater implements androidx.work.ForegroundUpdater {
+    ctor public TestForegroundUpdater();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setForegroundAsync(android.content.Context, java.util.UUID, androidx.work.ForegroundInfo);
+  }
+
+  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 setForegroundUpdater(androidx.work.ForegroundUpdater);
+    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 setProgressUpdater(androidx.work.ProgressUpdater);
+    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());
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class TestProgressUpdater implements androidx.work.ProgressUpdater {
+    ctor public TestProgressUpdater();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> updateProgress(android.content.Context, java.util.UUID, androidx.work.Data);
+  }
+
+  public class TestWorkerBuilder<W extends androidx.work.Worker> extends androidx.work.testing.TestListenableWorkerBuilder<W> {
+    method public static androidx.work.testing.TestWorkerBuilder<? extends androidx.work.Worker> from(android.content.Context, androidx.work.WorkRequest, java.util.concurrent.Executor);
+    method public static <W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W!> from(android.content.Context, Class<W!>, java.util.concurrent.Executor);
+  }
+
+  public final class TestWorkerBuilderKt {
+    ctor public TestWorkerBuilderKt();
+    method public static inline <reified W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W> TestWorkerBuilder(android.content.Context context, java.util.concurrent.Executor executor, androidx.work.Data inputData = androidx.work.Data.EMPTY, java.util.List<java.lang.String> tags = emptyList(), int runAttemptCount = 1, java.util.List<? extends android.net.Uri> triggeredContentUris = emptyList(), java.util.List<java.lang.String> triggeredContentAuthorities = emptyList());
+  }
+
+  public final class WorkManagerTestInitHelper {
+    method @Deprecated public static androidx.work.testing.TestDriver? getTestDriver();
+    method public static androidx.work.testing.TestDriver? getTestDriver(android.content.Context);
+    method public static void initializeTestWorkManager(android.content.Context);
+    method public static void initializeTestWorkManager(android.content.Context, androidx.work.Configuration);
+  }
+
+}
+
diff --git a/work/workmanager/api/2.3.0-beta01.ignore b/work/workmanager/api/2.3.0-beta01.ignore
new file mode 100644
index 0000000..59678f1
--- /dev/null
+++ b/work/workmanager/api/2.3.0-beta01.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+AddedAbstractMethod: androidx.work.WorkManager#createCancelPendingIntent(java.util.UUID):
+    Added method androidx.work.WorkManager.createCancelPendingIntent(java.util.UUID)
diff --git a/work/workmanager/api/2.3.0-beta01.txt b/work/workmanager/api/2.3.0-beta01.txt
new file mode 100644
index 0000000..46dc320
--- /dev/null
+++ b/work/workmanager/api/2.3.0-beta01.txt
@@ -0,0 +1,331 @@
+// Signature format: 3.0
+package androidx.work {
+
+  public final class ArrayCreatingInputMerger extends androidx.work.InputMerger {
+    ctor public ArrayCreatingInputMerger();
+    method public androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+  }
+
+  public enum BackoffPolicy {
+    enum_constant public static final androidx.work.BackoffPolicy EXPONENTIAL;
+    enum_constant public static final androidx.work.BackoffPolicy LINEAR;
+  }
+
+  public final class Configuration {
+    method public java.util.concurrent.Executor getExecutor();
+    method public androidx.work.InputMergerFactory getInputMergerFactory();
+    method public int getMaxJobSchedulerId();
+    method public int getMinJobSchedulerId();
+    method public java.util.concurrent.Executor getTaskExecutor();
+    method public androidx.work.WorkerFactory getWorkerFactory();
+    field public static final int MIN_SCHEDULER_LIMIT = 20; // 0x14
+  }
+
+  public static final class Configuration.Builder {
+    ctor public Configuration.Builder();
+    method public androidx.work.Configuration build();
+    method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor);
+    method public androidx.work.Configuration.Builder setInputMergerFactory(androidx.work.InputMergerFactory);
+    method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int, int);
+    method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int);
+    method public androidx.work.Configuration.Builder setMinimumLoggingLevel(int);
+    method public androidx.work.Configuration.Builder setTaskExecutor(java.util.concurrent.Executor);
+    method public androidx.work.Configuration.Builder setWorkerFactory(androidx.work.WorkerFactory);
+  }
+
+  public static interface Configuration.Provider {
+    method public androidx.work.Configuration getWorkManagerConfiguration();
+  }
+
+  public final class Constraints {
+    ctor public Constraints(androidx.work.Constraints);
+    method public androidx.work.NetworkType getRequiredNetworkType();
+    method public boolean requiresBatteryNotLow();
+    method public boolean requiresCharging();
+    method @RequiresApi(23) public boolean requiresDeviceIdle();
+    method public boolean requiresStorageNotLow();
+    field public static final androidx.work.Constraints! NONE;
+  }
+
+  public static final class Constraints.Builder {
+    ctor public Constraints.Builder();
+    method @RequiresApi(24) public androidx.work.Constraints.Builder addContentUriTrigger(android.net.Uri, boolean);
+    method public androidx.work.Constraints build();
+    method public androidx.work.Constraints.Builder setRequiredNetworkType(androidx.work.NetworkType);
+    method public androidx.work.Constraints.Builder setRequiresBatteryNotLow(boolean);
+    method public androidx.work.Constraints.Builder setRequiresCharging(boolean);
+    method @RequiresApi(23) public androidx.work.Constraints.Builder setRequiresDeviceIdle(boolean);
+    method public androidx.work.Constraints.Builder setRequiresStorageNotLow(boolean);
+    method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(long, java.util.concurrent.TimeUnit);
+    method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(java.time.Duration!);
+    method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(long, java.util.concurrent.TimeUnit);
+    method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(java.time.Duration!);
+  }
+
+  public final class Data {
+    ctor public Data(androidx.work.Data);
+    method public static androidx.work.Data fromByteArray(byte[]);
+    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);
+    method public <T> boolean hasKeyWithValueOfType(String, Class<T!>);
+    method public byte[] toByteArray();
+    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 final class ForegroundInfo {
+    ctor public ForegroundInfo(android.app.Notification);
+    ctor public ForegroundInfo(android.app.Notification, int);
+    method public int getForegroundServiceType();
+    method public android.app.Notification getNotification();
+  }
+
+  public interface ForegroundUpdater {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setForegroundAsync(android.content.Context, java.util.UUID, androidx.work.ForegroundInfo);
+  }
+
+  public abstract class InputMerger {
+    ctor public InputMerger();
+    method public abstract androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+  }
+
+  public abstract class InputMergerFactory {
+    ctor public InputMergerFactory();
+    method public abstract androidx.work.InputMerger? createInputMerger(String);
+  }
+
+  public abstract class ListenableWorker {
+    ctor @Keep public ListenableWorker(android.content.Context, androidx.work.WorkerParameters);
+    method public final android.content.Context getApplicationContext();
+    method public final java.util.UUID getId();
+    method public final androidx.work.Data getInputData();
+    method @RequiresApi(28) public final android.net.Network? getNetwork();
+    method @IntRange(from=0) public final int getRunAttemptCount();
+    method public final java.util.Set<java.lang.String!> getTags();
+    method @RequiresApi(24) public final java.util.List<java.lang.String!> getTriggeredContentAuthorities();
+    method @RequiresApi(24) public final java.util.List<android.net.Uri!> getTriggeredContentUris();
+    method public final boolean isStopped();
+    method public void onStopped();
+    method public final com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setForegroundAsync(androidx.work.ForegroundInfo);
+    method public final com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setProgressAsync(androidx.work.Data);
+    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 interface ProgressUpdater {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> updateProgress(android.content.Context, java.util.UUID, androidx.work.Data);
+  }
+
+  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 public androidx.work.Data getProgress();
+    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 abstract android.app.PendingIntent createCancelPendingIntent(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/public_plus_experimental_2.3.0-beta01.txt b/work/workmanager/api/public_plus_experimental_2.3.0-beta01.txt
new file mode 100644
index 0000000..46dc320
--- /dev/null
+++ b/work/workmanager/api/public_plus_experimental_2.3.0-beta01.txt
@@ -0,0 +1,331 @@
+// Signature format: 3.0
+package androidx.work {
+
+  public final class ArrayCreatingInputMerger extends androidx.work.InputMerger {
+    ctor public ArrayCreatingInputMerger();
+    method public androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+  }
+
+  public enum BackoffPolicy {
+    enum_constant public static final androidx.work.BackoffPolicy EXPONENTIAL;
+    enum_constant public static final androidx.work.BackoffPolicy LINEAR;
+  }
+
+  public final class Configuration {
+    method public java.util.concurrent.Executor getExecutor();
+    method public androidx.work.InputMergerFactory getInputMergerFactory();
+    method public int getMaxJobSchedulerId();
+    method public int getMinJobSchedulerId();
+    method public java.util.concurrent.Executor getTaskExecutor();
+    method public androidx.work.WorkerFactory getWorkerFactory();
+    field public static final int MIN_SCHEDULER_LIMIT = 20; // 0x14
+  }
+
+  public static final class Configuration.Builder {
+    ctor public Configuration.Builder();
+    method public androidx.work.Configuration build();
+    method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor);
+    method public androidx.work.Configuration.Builder setInputMergerFactory(androidx.work.InputMergerFactory);
+    method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int, int);
+    method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int);
+    method public androidx.work.Configuration.Builder setMinimumLoggingLevel(int);
+    method public androidx.work.Configuration.Builder setTaskExecutor(java.util.concurrent.Executor);
+    method public androidx.work.Configuration.Builder setWorkerFactory(androidx.work.WorkerFactory);
+  }
+
+  public static interface Configuration.Provider {
+    method public androidx.work.Configuration getWorkManagerConfiguration();
+  }
+
+  public final class Constraints {
+    ctor public Constraints(androidx.work.Constraints);
+    method public androidx.work.NetworkType getRequiredNetworkType();
+    method public boolean requiresBatteryNotLow();
+    method public boolean requiresCharging();
+    method @RequiresApi(23) public boolean requiresDeviceIdle();
+    method public boolean requiresStorageNotLow();
+    field public static final androidx.work.Constraints! NONE;
+  }
+
+  public static final class Constraints.Builder {
+    ctor public Constraints.Builder();
+    method @RequiresApi(24) public androidx.work.Constraints.Builder addContentUriTrigger(android.net.Uri, boolean);
+    method public androidx.work.Constraints build();
+    method public androidx.work.Constraints.Builder setRequiredNetworkType(androidx.work.NetworkType);
+    method public androidx.work.Constraints.Builder setRequiresBatteryNotLow(boolean);
+    method public androidx.work.Constraints.Builder setRequiresCharging(boolean);
+    method @RequiresApi(23) public androidx.work.Constraints.Builder setRequiresDeviceIdle(boolean);
+    method public androidx.work.Constraints.Builder setRequiresStorageNotLow(boolean);
+    method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(long, java.util.concurrent.TimeUnit);
+    method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(java.time.Duration!);
+    method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(long, java.util.concurrent.TimeUnit);
+    method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(java.time.Duration!);
+  }
+
+  public final class Data {
+    ctor public Data(androidx.work.Data);
+    method public static androidx.work.Data fromByteArray(byte[]);
+    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);
+    method public <T> boolean hasKeyWithValueOfType(String, Class<T!>);
+    method public byte[] toByteArray();
+    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 final class ForegroundInfo {
+    ctor public ForegroundInfo(android.app.Notification);
+    ctor public ForegroundInfo(android.app.Notification, int);
+    method public int getForegroundServiceType();
+    method public android.app.Notification getNotification();
+  }
+
+  public interface ForegroundUpdater {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setForegroundAsync(android.content.Context, java.util.UUID, androidx.work.ForegroundInfo);
+  }
+
+  public abstract class InputMerger {
+    ctor public InputMerger();
+    method public abstract androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+  }
+
+  public abstract class InputMergerFactory {
+    ctor public InputMergerFactory();
+    method public abstract androidx.work.InputMerger? createInputMerger(String);
+  }
+
+  public abstract class ListenableWorker {
+    ctor @Keep public ListenableWorker(android.content.Context, androidx.work.WorkerParameters);
+    method public final android.content.Context getApplicationContext();
+    method public final java.util.UUID getId();
+    method public final androidx.work.Data getInputData();
+    method @RequiresApi(28) public final android.net.Network? getNetwork();
+    method @IntRange(from=0) public final int getRunAttemptCount();
+    method public final java.util.Set<java.lang.String!> getTags();
+    method @RequiresApi(24) public final java.util.List<java.lang.String!> getTriggeredContentAuthorities();
+    method @RequiresApi(24) public final java.util.List<android.net.Uri!> getTriggeredContentUris();
+    method public final boolean isStopped();
+    method public void onStopped();
+    method public final com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setForegroundAsync(androidx.work.ForegroundInfo);
+    method public final com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setProgressAsync(androidx.work.Data);
+    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 interface ProgressUpdater {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> updateProgress(android.content.Context, java.util.UUID, androidx.work.Data);
+  }
+
+  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 public androidx.work.Data getProgress();
+    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 abstract android.app.PendingIntent createCancelPendingIntent(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/res-2.3.0-beta01.txt b/work/workmanager/api/res-2.3.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/work/workmanager/api/res-2.3.0-beta01.txt
diff --git a/work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/Alarms.java b/work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/Alarms.java
index 9ddd4b9..3c730f5 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/Alarms.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/Alarms.java
@@ -122,7 +122,7 @@
         AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
         Intent delayMet = CommandHandler.createDelayMetIntent(context, workSpecId);
         PendingIntent pendingIntent = PendingIntent.getService(
-                context, alarmId, delayMet, PendingIntent.FLAG_ONE_SHOT);
+                context, alarmId, delayMet, PendingIntent.FLAG_UPDATE_CURRENT);
         if (alarmManager != null) {
             if (Build.VERSION.SDK_INT >= 19) {
                 alarmManager.setExact(RTC_WAKEUP, triggerAtMillis, pendingIntent);