Merge "Unhide APIs in WindowInsetsCompat and ViewDragHelper" into androidx-master-dev
diff --git a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeActivity.java b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeActivity.java
index b9faf73..e5230bd1 100644
--- a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeActivity.java
+++ b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeActivity.java
@@ -16,11 +16,15 @@
 
 package androidx.appcompat.app;
 
+import android.content.res.Configuration;
+
+import androidx.annotation.NonNull;
 import androidx.appcompat.test.R;
 import androidx.appcompat.testutils.BaseTestActivity;
 
 public class NightModeActivity extends BaseTestActivity {
     private int mLastNightModeChange = Integer.MIN_VALUE;
+    private Configuration mLastConfigurationChange;
 
     @Override
     protected int getContentViewLayoutResId() {
@@ -32,6 +36,18 @@
         mLastNightModeChange = mode;
     }
 
+    @Override
+    public void onConfigurationChanged(@NonNull Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        mLastConfigurationChange = newConfig;
+    }
+
+    Configuration getLastConfigurationChangeAndClear() {
+        final Configuration config = mLastConfigurationChange;
+        mLastConfigurationChange = null;
+        return config;
+    }
+
     int getLastNightModeAndReset() {
         final int mode = mLastNightModeChange;
         mLastNightModeChange = Integer.MIN_VALUE;
diff --git a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.java b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.java
index ac5cd5c..0550ec5 100644
--- a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.java
+++ b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.java
@@ -32,6 +32,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
 
 import android.app.Instrumentation;
 import android.content.res.Configuration;
@@ -310,6 +311,21 @@
         });
     }
 
+    @Test
+    public void testOnConfigurationChangeNotCalled() throws Throwable {
+        NightModeActivity activity = mActivityTestRule.getActivity();
+        // Set local night mode to YES
+        setNightModeAndWait(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
+        // Assert that onConfigurationChange was not called on the original activity
+        assertNull(activity.getLastConfigurationChangeAndClear());
+
+        activity = mActivityTestRule.getActivity();
+        // Set local night mode back to NO
+        setNightModeAndWait(mActivityTestRule, MODE_NIGHT_NO, mSetMode);
+        // Assert that onConfigurationChange was not called
+        assertNull(activity.getLastConfigurationChangeAndClear());
+    }
+
     @After
     public void cleanup() throws Throwable {
         // Reset the default night mode
diff --git a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeUiModeConfigChangesTestCase.java b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeUiModeConfigChangesTestCase.java
index 246f842..0badb08 100644
--- a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeUiModeConfigChangesTestCase.java
+++ b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeUiModeConfigChangesTestCase.java
@@ -22,6 +22,7 @@
 import static androidx.appcompat.testutils.NightModeUtils.setNightModeAndWait;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 
 import android.content.res.Configuration;
 
@@ -68,23 +69,39 @@
     }
 
     @Test
-    public void testResourcesNotUpdated() throws Throwable {
-        final int defaultNightMode = mActivityTestRule.getActivity()
-                .getResources().getConfiguration().uiMode
-                & Configuration.UI_MODE_NIGHT_MASK;
-
+    public void testOnConfigurationChangeCalled() throws Throwable {
         // Set local night mode to YES
         setNightModeAndWait(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
 
-        // Assert that the Activity did not get updated
-        assertConfigurationNightModeEquals(defaultNightMode,
+        // Assert that the onConfigurationChange was called with a new correct config
+        Configuration lastConfig = mActivityTestRule.getActivity()
+                .getLastConfigurationChangeAndClear();
+        assertNotNull(lastConfig);
+        assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, lastConfig);
+
+        // Set local night mode back to NO
+        setNightModeAndWait(mActivityTestRule, MODE_NIGHT_NO, mSetMode);
+
+        // Assert that the onConfigurationChange was again called with a new correct config
+        lastConfig = mActivityTestRule.getActivity().getLastConfigurationChangeAndClear();
+        assertNotNull(lastConfig);
+        assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_NO, lastConfig);
+    }
+
+    @Test
+    public void testResourcesUpdated() throws Throwable {
+        // Set local night mode to YES
+        setNightModeAndWait(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
+
+        // Assert that the Activity resources configuration was updated
+        assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES,
                 mActivityTestRule.getActivity().getResources().getConfiguration());
 
         // Set local night mode back to NO
         setNightModeAndWait(mActivityTestRule, MODE_NIGHT_NO, mSetMode);
 
-        // Assert that the Activity did not get updated
-        assertConfigurationNightModeEquals(defaultNightMode,
+        // Assert that the Activity resources configuration was updated
+        assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_NO,
                 mActivityTestRule.getActivity().getResources().getConfiguration());
     }
 
diff --git a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
index 86ae4f33..ec681f1 100644
--- a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
+++ b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
@@ -2247,8 +2247,10 @@
 
         final boolean activityHandlingUiMode = isActivityManifestHandlingUiMode();
 
-        if (newNightMode != applicationNightMode && !activityHandlingUiMode
-                && Build.VERSION.SDK_INT >= 17 && !mBaseContextAttached
+        if (newNightMode != applicationNightMode
+                && !activityHandlingUiMode
+                && Build.VERSION.SDK_INT >= 17
+                && !mBaseContextAttached
                 && mHost instanceof android.view.ContextThemeWrapper) {
             // If we're here then we can try and apply an override configuration on the Context.
             final Configuration conf = new Configuration();
@@ -2271,48 +2273,51 @@
             }
         }
 
-        if (!handled && !activityHandlingUiMode) {
-            final int currentNightMode = mContext.getResources().getConfiguration().uiMode
-                    & Configuration.UI_MODE_NIGHT_MASK;
-            if (currentNightMode != newNightMode) {
-                if (allowRecreation && mBaseContextAttached
-                        && (Build.VERSION.SDK_INT >= 17 || mCreated)
-                        && mHost instanceof Activity) {
-                    // If we're an attached Activity, we can recreate to apply
-                    // The SDK_INT check above is because applyOverrideConfiguration only exists on
-                    // API 17+, so we don't want to get into an loop of infinite recreations.
-                    // On < API 17 we need to use updateConfiguration before we're 'created'
-                    if (DEBUG) {
-                        Log.d(TAG, "updateForNightMode. Recreating Activity");
-                    }
-                    ActivityCompat.recreate((Activity) mHost);
-                    handled = true;
-                }
-                if (!handled) {
-                    // Else we need to use the updateConfiguration path
-                    if (DEBUG) {
-                        Log.d(TAG, "updateForNightMode. Updating resources config");
-                    }
-                    updateResourcesConfigurationForNightMode(newNightMode);
-                    handled = true;
-                }
-            } else {
-                if (DEBUG) {
-                    Log.d(TAG, "updateForNightMode. Skipping. Night mode: " + mode);
-                }
+        final int currentNightMode = mContext.getResources().getConfiguration().uiMode
+                & Configuration.UI_MODE_NIGHT_MASK;
+
+        if (!handled
+                && currentNightMode != newNightMode
+                && allowRecreation
+                && !activityHandlingUiMode
+                && mBaseContextAttached
+                && (Build.VERSION.SDK_INT >= 17 || mCreated)
+                && mHost instanceof Activity) {
+            // If we're an attached Activity, we can recreate to apply
+            // The SDK_INT check above is because applyOverrideConfiguration only exists on
+            // API 17+, so we don't want to get into an loop of infinite recreations.
+            // On < API 17 we need to use updateConfiguration before we're 'created'
+            if (DEBUG) {
+                Log.d(TAG, "updateForNightMode. Recreating Activity");
             }
+            ActivityCompat.recreate((Activity) mHost);
+            handled = true;
+        }
+
+        if (!handled && currentNightMode != newNightMode) {
+            // Else we need to use the updateConfiguration path
+            if (DEBUG) {
+                Log.d(TAG, "updateForNightMode. Updating resources config");
+            }
+            updateResourcesConfigurationForNightMode(newNightMode, activityHandlingUiMode);
+            handled = true;
+        }
+
+        if (DEBUG && !handled) {
+            Log.d(TAG, "updateForNightMode. Skipping. Night mode: " + mode);
         }
 
         // Notify the activity of the night mode. We only notify if we handled the change,
         // or the Activity is set to handle uiMode changes
-        if ((handled || activityHandlingUiMode) && mHost instanceof AppCompatActivity) {
+        if (handled && mHost instanceof AppCompatActivity) {
             ((AppCompatActivity) mHost).onNightModeChanged(mode);
         }
 
         return handled;
     }
 
-    private void updateResourcesConfigurationForNightMode(final int uiModeNightModeValue) {
+    private void updateResourcesConfigurationForNightMode(
+            final int uiModeNightModeValue, final boolean callOnConfigChange) {
         // If the Activity is not set to handle uiMode config changes we will
         // update the Resources with a new Configuration with an updated UI Mode
         final Resources res = mContext.getResources();
@@ -2340,6 +2345,10 @@
                 mContext.getTheme().applyStyle(mThemeResId, true);
             }
         }
+
+        if (callOnConfigChange && mHost instanceof Activity) {
+            ((Activity) mHost).onConfigurationChanged(conf);
+        }
     }
 
     /**
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
index eb1b6c4..b3b4f4b 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -62,7 +62,7 @@
     val HEIFWRITER = Version("1.1.0-alpha01")
     val INSPECTION = Version("1.0.0-alpha01")
     val INTERPOLATOR = Version("1.1.0-alpha01")
-    val JETIFIER = Version("1.0.0-beta04")
+    val JETIFIER = Version("1.0.0-beta05")
     val LEANBACK = Version("1.1.0-alpha03")
     val LEANBACK_PREFERENCE = Version("1.1.0-alpha03")
     val LEGACY = Version("1.1.0-alpha01")
diff --git a/camera/camera2/src/androidTest/java/androidx/camera/camera2/Camera2ConfigTest.java b/camera/camera2/src/androidTest/java/androidx/camera/camera2/Camera2ConfigTest.java
index 66ddfe8..d9a2f18 100644
--- a/camera/camera2/src/androidTest/java/androidx/camera/camera2/Camera2ConfigTest.java
+++ b/camera/camera2/src/androidTest/java/androidx/camera/camera2/Camera2ConfigTest.java
@@ -25,6 +25,7 @@
 import android.util.Range;
 
 import androidx.camera.camera2.impl.Camera2CaptureCallbacks;
+import androidx.camera.camera2.impl.CameraEventCallbacks;
 import androidx.camera.core.CameraCaptureSessionStateCallbacks;
 import androidx.camera.core.CameraDeviceStateCallbacks;
 import androidx.camera.core.Config;
@@ -46,6 +47,8 @@
             CameraCaptureSessionStateCallbacks.createNoOpCallback();
     private static final CameraDevice.StateCallback DEVICE_STATE_CALLBACK =
             CameraDeviceStateCallbacks.createNoOpCallback();
+    private static final CameraEventCallbacks CAMERA_EVENT_CALLBACKS =
+            CameraEventCallbacks.createEmptyCallback();
 
     @Test
     public void emptyConfigurationDoesNotContainTemplateType() {
@@ -106,6 +109,18 @@
     }
 
     @Test
+    public void canExtendWithCameraEventCallback() {
+        FakeConfig.Builder builder = new FakeConfig.Builder();
+
+        new Camera2Config.Extender(builder).setCameraEventCallback(CAMERA_EVENT_CALLBACKS);
+
+        Camera2Config config = new Camera2Config(builder.build());
+
+        assertThat(config.getCameraEventCallback(/*valueIfMissing=*/ null))
+                .isSameAs(CAMERA_EVENT_CALLBACKS);
+    }
+
+    @Test
     public void canSetAndRetrieveCaptureRequestKeys() {
         FakeConfig.Builder builder = new FakeConfig.Builder();
 
diff --git a/camera/camera2/src/androidTest/java/androidx/camera/camera2/impl/CaptureSessionTest.java b/camera/camera2/src/androidTest/java/androidx/camera/camera2/impl/CaptureSessionTest.java
index 439cf69..acdbfc3 100644
--- a/camera/camera2/src/androidTest/java/androidx/camera/camera2/impl/CaptureSessionTest.java
+++ b/camera/camera2/src/androidTest/java/androidx/camera/camera2/impl/CaptureSessionTest.java
@@ -20,15 +20,21 @@
 
 import static org.junit.Assume.assumeTrue;
 import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.timeout;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
 
 import android.Manifest;
 import android.graphics.ImageFormat;
 import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCaptureSession;
 import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
 import android.media.Image;
 import android.media.ImageReader;
 import android.media.ImageReader.OnImageAvailableListener;
@@ -36,6 +42,7 @@
 import android.os.HandlerThread;
 
 import androidx.annotation.NonNull;
+import androidx.camera.camera2.Camera2Config;
 import androidx.camera.camera2.impl.CaptureSession.State;
 import androidx.camera.core.CameraCaptureCallback;
 import androidx.camera.core.CameraCaptureCallbacks;
@@ -43,6 +50,7 @@
 import androidx.camera.core.CaptureConfig;
 import androidx.camera.core.DeferrableSurface;
 import androidx.camera.core.ImmediateSurface;
+import androidx.camera.core.MutableOptionsBundle;
 import androidx.camera.core.SessionConfig;
 import androidx.camera.testing.CameraUtil;
 import androidx.concurrent.ListenableFuture;
@@ -56,6 +64,8 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InOrder;
 import org.mockito.Mockito;
 
 import java.util.Collections;
@@ -309,6 +319,118 @@
         Mockito.verify(listener, times(1)).onSurfaceDetached();
     }
 
+    @Test
+    public void cameraEventCallbackInvokedInOrder() throws CameraAccessException {
+        CaptureSession captureSession = new CaptureSession(mTestParameters0.mHandler);
+        captureSession.setSessionConfig(mTestParameters0.mSessionConfig);
+
+        captureSession.open(mTestParameters0.mSessionConfig, mCameraDevice);
+
+        InOrder inOrder = inOrder(mTestParameters0.mMockCameraEventCallback);
+
+        inOrder.verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onPresetSession();
+        inOrder.verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onEnableSession();
+        inOrder.verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onRepeating();
+        verify(mTestParameters0.mMockCameraEventCallback, never()).onDisableSession();
+
+        verifyNoMoreInteractions(mTestParameters0.mMockCameraEventCallback);
+
+        captureSession.close();
+        verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onDisableSession();
+
+        verifyNoMoreInteractions(mTestParameters0.mMockCameraEventCallback);
+    }
+
+    @Test
+    public void cameraEventCallback_requestKeysIssuedSuccessfully() throws CameraAccessException {
+        ArgumentCaptor<CameraCaptureResult> captureResultCaptor = ArgumentCaptor.forClass(
+                CameraCaptureResult.class);
+
+        CaptureSession captureSession = new CaptureSession(mTestParameters0.mHandler);
+        captureSession.setSessionConfig(mTestParameters0.mSessionConfig);
+
+        // Open the capture session and verify the onEnableSession callback would be invoked
+        // but onDisableSession callback not.
+        captureSession.open(mTestParameters0.mSessionConfig, mCameraDevice);
+
+        // Verify the request options in onEnableSession.
+        verify(mTestParameters0.mTestCameraEventCallback.mEnableCallback,
+                timeout(3000)).onCaptureCompleted(captureResultCaptor.capture());
+        CameraCaptureResult result1 = captureResultCaptor.getValue();
+        assertThat(result1).isInstanceOf(Camera2CameraCaptureResult.class);
+        CaptureResult captureResult1 = ((Camera2CameraCaptureResult) result1).getCaptureResult();
+        assertThat(captureResult1.getRequest().get(CaptureRequest.CONTROL_EFFECT_MODE)).isEqualTo(
+                CaptureRequest.CONTROL_EFFECT_MODE_NEGATIVE);
+        // The onDisableSession should not been invoked.
+        verify(mTestParameters0.mTestCameraEventCallback.mDisableCallback,
+                never()).onCaptureCompleted(any(CameraCaptureResult.class));
+
+        reset(mTestParameters0.mTestCameraEventCallback.mEnableCallback);
+        reset(mTestParameters0.mTestCameraEventCallback.mDisableCallback);
+
+        // Close the capture session and verify the onDisableSession callback would be invoked
+        // but onEnableSession callback not.
+        captureSession.close();
+
+        // Verify the request options in onDisableSession.
+        verify(mTestParameters0.mTestCameraEventCallback.mDisableCallback,
+                timeout(3000)).onCaptureCompleted(captureResultCaptor.capture());
+        CameraCaptureResult result2 = captureResultCaptor.getValue();
+        assertThat(result2).isInstanceOf(Camera2CameraCaptureResult.class);
+        CaptureResult captureResult2 = ((Camera2CameraCaptureResult) result2).getCaptureResult();
+        assertThat(captureResult2.getRequest().get(CaptureRequest.CONTROL_EFFECT_MODE)).isEqualTo(
+                CaptureRequest.CONTROL_EFFECT_MODE_SEPIA);
+        // The onEnableSession should not been invoked in close().
+        verify(mTestParameters0.mTestCameraEventCallback.mEnableCallback,
+                never()).onCaptureCompleted(any(CameraCaptureResult.class));
+    }
+
+    /**
+     * A implementation to test {@link CameraEventCallback} on CaptureSession.
+     */
+    private static class TestCameraEventCallback extends CameraEventCallback {
+
+        private final CameraCaptureCallback mEnableCallback = Mockito.mock(
+                CameraCaptureCallback.class);
+        private final CameraCaptureCallback mDisableCallback = Mockito.mock(
+                CameraCaptureCallback.class);
+
+        @Override
+        public CaptureConfig onPresetSession() {
+            return getCaptureConfig(CaptureRequest.CONTROL_EFFECT_MODE,
+                    CaptureRequest.CONTROL_EFFECT_MODE_MONO, null);
+        }
+
+        @Override
+        public CaptureConfig onEnableSession() {
+            return getCaptureConfig(CaptureRequest.CONTROL_EFFECT_MODE,
+                    CaptureRequest.CONTROL_EFFECT_MODE_NEGATIVE, mEnableCallback);
+        }
+
+        @Override
+        public CaptureConfig onRepeating() {
+            return getCaptureConfig(CaptureRequest.CONTROL_EFFECT_MODE,
+                    CaptureRequest.CONTROL_EFFECT_MODE_SOLARIZE, null);
+        }
+
+        @Override
+        public CaptureConfig onDisableSession() {
+            return getCaptureConfig(CaptureRequest.CONTROL_EFFECT_MODE,
+                    CaptureRequest.CONTROL_EFFECT_MODE_SEPIA, mDisableCallback);
+        }
+    }
+
+    private static CaptureConfig getCaptureConfig(CaptureRequest.Key key, int effectValue,
+            CameraCaptureCallback callback) {
+        CaptureConfig.Builder captureConfigBuilder = new CaptureConfig.Builder();
+        Camera2Config.Builder camera2ConfigurationBuilder =
+                new Camera2Config.Builder();
+        camera2ConfigurationBuilder.setCaptureRequestOption(key, effectValue);
+        captureConfigBuilder.addImplementationOptions(camera2ConfigurationBuilder.build());
+        captureConfigBuilder.addCameraCaptureCallback(callback);
+        return captureConfigBuilder.build();
+    }
+
     /**
      * Collection of parameters required for setting a {@link CaptureSession} and wait for it to
      * produce data.
@@ -342,6 +464,11 @@
         private final SessionConfig mSessionConfig;
         private final CaptureConfig mCaptureConfig;
 
+        private final TestCameraEventCallback mTestCameraEventCallback =
+                new TestCameraEventCallback();
+        private final CameraEventCallback mMockCameraEventCallback = Mockito.mock(
+                CameraEventCallback.class);
+
         private final CameraCaptureSession.StateCallback mSessionStateCallback =
                 Mockito.mock(CameraCaptureSession.StateCallback.class);
         private final CameraCaptureCallback mSessionCameraCaptureCallback =
@@ -381,6 +508,16 @@
             builder.addSessionStateCallback(mSessionStateCallback);
             builder.addRepeatingCameraCaptureCallback(mSessionCameraCaptureCallback);
 
+            MutableOptionsBundle testCallbackConfig = MutableOptionsBundle.create();
+            testCallbackConfig.insertOption(Camera2Config.CAMERA_EVENT_CALLBACK_OPTION,
+                    new CameraEventCallbacks(mTestCameraEventCallback));
+            builder.addImplementationOptions(testCallbackConfig);
+
+            MutableOptionsBundle mockCameraEventCallbackConfig = MutableOptionsBundle.create();
+            mockCameraEventCallbackConfig.insertOption(Camera2Config.CAMERA_EVENT_CALLBACK_OPTION,
+                    new CameraEventCallbacks(mMockCameraEventCallback));
+            builder.addImplementationOptions(mockCameraEventCallbackConfig);
+
             mSessionConfig = builder.build();
 
             CaptureConfig.Builder captureConfigBuilder = new CaptureConfig.Builder();
diff --git a/camera/camera2/src/test/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpackerTest.java b/camera/camera2/src/test/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpackerTest.java
index 222ce50..27e0949 100644
--- a/camera/camera2/src/test/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpackerTest.java
+++ b/camera/camera2/src/test/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpackerTest.java
@@ -19,6 +19,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import android.hardware.camera2.CameraCaptureSession;
 import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
@@ -58,11 +59,14 @@
         CameraDevice.StateCallback deviceCallback = mock(CameraDevice.StateCallback.class);
         CameraCaptureSession.StateCallback sessionStateCallback =
                 mock(CameraCaptureSession.StateCallback.class);
+        CameraEventCallbacks cameraEventCallbacks = mock(CameraEventCallbacks.class);
+        when(cameraEventCallbacks.clone()).thenReturn(cameraEventCallbacks);
 
         new Camera2Config.Extender(imageCaptureConfigBuilder)
                 .setSessionCaptureCallback(captureCallback)
                 .setDeviceStateCallback(deviceCallback)
-                .setSessionStateCallback(sessionStateCallback);
+                .setSessionStateCallback(sessionStateCallback)
+                .setCameraEventCallback(cameraEventCallbacks);
 
         SessionConfig.Builder sessionBuilder = new SessionConfig.Builder();
         mUnpacker.unpack(imageCaptureConfigBuilder.build(), sessionBuilder);
@@ -79,5 +83,8 @@
         assertThat(sessionConfig.getDeviceStateCallbacks()).containsExactly(deviceCallback);
         assertThat(sessionConfig.getSessionStateCallbacks())
                 .containsExactly(sessionStateCallback);
+        assertThat(
+                new Camera2Config(sessionConfig.getImplementationOptions()).getCameraEventCallback(
+                        null)).isEqualTo(cameraEventCallbacks);
     }
 }
diff --git a/camera/core/src/androidTest/java/androidx/camera/core/CameraXTest.java b/camera/core/src/androidTest/java/androidx/camera/core/CameraXTest.java
index 52ea4ff..65c1cf1 100644
--- a/camera/core/src/androidTest/java/androidx/camera/core/CameraXTest.java
+++ b/camera/core/src/androidTest/java/androidx/camera/core/CameraXTest.java
@@ -244,6 +244,21 @@
     }
 
     @Test
+    public void eventListenerCalled_bindAndUnbind() {
+        UseCase.EventListener eventListener = Mockito.mock(UseCase.EventListener.class);
+
+        FakeUseCaseConfig.Builder fakeConfigBuilder = new FakeUseCaseConfig.Builder();
+        fakeConfigBuilder.setUseCaseEventListener(eventListener);
+        AttachCameraFakeCase fakeUseCase = new AttachCameraFakeCase(fakeConfigBuilder.build());
+
+        CameraX.bindToLifecycle(mLifecycle, fakeUseCase);
+        Mockito.verify(eventListener).onBind(mCameraId);
+
+        CameraX.unbind(fakeUseCase);
+        Mockito.verify(eventListener).onUnbind();
+    }
+
+    @Test
     public void canRetrieveCameraInfo() throws CameraInfoUnavailableException {
         String cameraId = CameraX.getCameraWithLensFacing(LensFacing.BACK);
         CameraInfo cameraInfo = CameraX.getCameraInfo(cameraId);
diff --git a/camera/core/src/androidTest/java/androidx/camera/core/CaptureConfigTest.java b/camera/core/src/androidTest/java/androidx/camera/core/CaptureConfigTest.java
index a9d818f..2f25ce6 100644
--- a/camera/core/src/androidTest/java/androidx/camera/core/CaptureConfigTest.java
+++ b/camera/core/src/androidTest/java/androidx/camera/core/CaptureConfigTest.java
@@ -35,6 +35,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.Arrays;
 import java.util.List;
 
 @LargeTest
@@ -44,6 +45,8 @@
             "camerax.test.option_0", Integer.class);
 
     private DeferrableSurface mMockSurface0;
+    private static final Config.Option<FakeMultiValueSet> FAKE_MULTI_VALUE_SET_OPTION =
+            Config.Option.create("option.fakeMultiValueSet.1", FakeMultiValueSet.class);
 
     @Before
     public void setup() {
@@ -161,6 +164,34 @@
                 .containsExactly(callback0, callback1);
     }
 
+    @Test
+    public void builderAddImplementationMultiValue() {
+        CaptureConfig.Builder builder = new CaptureConfig.Builder();
+
+        Object obj1 = new Object();
+        FakeMultiValueSet fakeMultiValueSet1 = new FakeMultiValueSet();
+        fakeMultiValueSet1.addAll(Arrays.asList(obj1));
+        MutableOptionsBundle fakeConfig1 = MutableOptionsBundle.create();
+        fakeConfig1.insertOption(FAKE_MULTI_VALUE_SET_OPTION, fakeMultiValueSet1);
+        builder.addImplementationOptions(fakeConfig1);
+
+        Object obj2 = new Object();
+        FakeMultiValueSet fakeMultiValueSet2 = new FakeMultiValueSet();
+        fakeMultiValueSet2.addAll(Arrays.asList(obj2));
+        MutableOptionsBundle fakeConfig2 = MutableOptionsBundle.create();
+        fakeConfig2.insertOption(FAKE_MULTI_VALUE_SET_OPTION, fakeMultiValueSet2);
+        builder.addImplementationOptions(fakeConfig2);
+
+        CaptureConfig captureConfig = builder.build();
+
+        FakeMultiValueSet fakeMultiValueSet =
+                captureConfig.getImplementationOptions().retrieveOption(
+                        FAKE_MULTI_VALUE_SET_OPTION);
+
+        assertThat(fakeMultiValueSet).isNotNull();
+        assertThat(fakeMultiValueSet.getAllItems()).containsExactly(obj1, obj2);
+    }
+
     @Test(expected = IllegalArgumentException.class)
     public void builderAddDuplicateCameraCaptureCallback_throwsException() {
         CaptureConfig.Builder builder = new CaptureConfig.Builder();
@@ -195,4 +226,15 @@
         configuration.getCameraCaptureCallbacks().add(mock(CameraCaptureCallback.class));
     }
 
+    /**
+     * A fake {@link MultiValueSet}.
+     */
+    static class FakeMultiValueSet extends MultiValueSet<Object> {
+        @Override
+        public MultiValueSet clone() {
+            FakeMultiValueSet multiValueSet = new FakeMultiValueSet();
+            multiValueSet.addAll(getAllItems());
+            return multiValueSet;
+        }
+    }
 }
diff --git a/camera/core/src/test/java/androidx/camera/core/ProcessingImageReaderTest.java b/camera/core/src/test/java/androidx/camera/core/ProcessingImageReaderTest.java
index 3529b84..02bfcbf 100644
--- a/camera/core/src/test/java/androidx/camera/core/ProcessingImageReaderTest.java
+++ b/camera/core/src/test/java/androidx/camera/core/ProcessingImageReaderTest.java
@@ -36,6 +36,8 @@
 import org.robolectric.annotation.internal.DoNotInstrument;
 import org.robolectric.shadows.ShadowLooper;
 
+import java.util.HashMap;
+import java.util.Map;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -47,8 +49,12 @@
 public final class ProcessingImageReaderTest {
     private static final int CAPTURE_ID_0 = 0;
     private static final int CAPTURE_ID_1 = 1;
+    private static final int CAPTURE_ID_2 = 2;
+    private static final int CAPTURE_ID_3 = 3;
     private static final long TIMESTAMP_0 = 0L;
     private static final long TIMESTAMP_1 = 1000L;
+    private static final long TIMESTAMP_2 = 2000L;
+    private static final long TIMESTAMP_3 = 4000L;
     private static final CaptureProcessor NOOP_PROCESSOR = new CaptureProcessor() {
         @Override
         public void onOutputSurface(Surface surface, int imageFormat) {
@@ -68,6 +74,8 @@
 
     private final CaptureStage mCaptureStage0 = new FakeCaptureStage(CAPTURE_ID_0, null);
     private final CaptureStage mCaptureStage1 = new FakeCaptureStage(CAPTURE_ID_1, null);
+    private final CaptureStage mCaptureStage2 = new FakeCaptureStage(CAPTURE_ID_2, null);
+    private final CaptureStage mCaptureStage3 = new FakeCaptureStage(CAPTURE_ID_3, null);
     private final FakeImageReaderProxy mImageReaderProxy = new FakeImageReaderProxy();
     private CaptureBundle mCaptureBundle;
     private Handler mMainHandler;
@@ -99,12 +107,28 @@
 
             }
         };
-        new ProcessingImageReader(
+        ProcessingImageReader processingImageReader = new ProcessingImageReader(
                 mImageReaderProxy, mMainHandler, mCaptureBundle, captureProcessor);
+        Map<Integer, Long> resultMap = new HashMap<>();
+        resultMap.put(CAPTURE_ID_0, TIMESTAMP_0);
+        resultMap.put(CAPTURE_ID_1, TIMESTAMP_1);
+        triggerAndVerify(bundleRef, resultMap);
 
+        processingImageReader.setCaptureBundle(CaptureBundles.createCaptureBundle(mCaptureStage2,
+                mCaptureStage3));
+        Map<Integer, Long> resultMap1 = new HashMap<>();
+        resultMap1.put(CAPTURE_ID_2, TIMESTAMP_2);
+        resultMap1.put(CAPTURE_ID_3, TIMESTAMP_3);
+        triggerAndVerify(bundleRef, resultMap1);
+    }
+
+    private void triggerAndVerify(AtomicReference<ImageProxyBundle> bundleRef,
+            Map<Integer, Long> captureIdToTime)
+            throws InterruptedException, ExecutionException, TimeoutException {
         // Feeds ImageProxy with all capture id on the initial list.
-        triggerImageAvailable(CAPTURE_ID_0, TIMESTAMP_0);
-        triggerImageAvailable(CAPTURE_ID_1, TIMESTAMP_1);
+        for (Integer id : captureIdToTime.keySet()) {
+            triggerImageAvailable(id, captureIdToTime.get(id));
+        }
 
         // Ensure all posted tasks finish running
         ShadowLooper.runUiThreadTasks();
@@ -114,10 +138,10 @@
 
         // CaptureProcessor.process should be called once all ImageProxies on the
         // initial lists are ready. Then checks if the output has matched timestamp.
-        assertThat(bundle.getImageProxy(CAPTURE_ID_0).get(0,
-                TimeUnit.SECONDS).getTimestamp()).isEqualTo(TIMESTAMP_0);
-        assertThat(bundle.getImageProxy(CAPTURE_ID_1).get(0,
-                TimeUnit.SECONDS).getTimestamp()).isEqualTo(TIMESTAMP_1);
+        for (Integer id : captureIdToTime.keySet()) {
+            assertThat(bundle.getImageProxy(id).get(0,
+                    TimeUnit.SECONDS).getTimestamp()).isEqualTo(captureIdToTime.get(id));
+        }
     }
 
     @Test(expected = IllegalArgumentException.class)
diff --git a/camera/extensions/build.gradle b/camera/extensions/build.gradle
index 61508e9e..ac23da8 100644
--- a/camera/extensions/build.gradle
+++ b/camera/extensions/build.gradle
@@ -30,13 +30,33 @@
     implementation(project(":camera:camera-camera2"))
     implementation("androidx.core:core:1.0.0")
     implementation(project(":concurrent-listenablefuture"))
+    implementation(AUTO_VALUE_ANNOTATIONS)
+    annotationProcessor(AUTO_VALUE)
 
     compileOnly(project(":camera:camera-extensions-stub"))
+
+
+    testImplementation(JUNIT)
+    testImplementation(MOCKITO_CORE)
+    testImplementation(ROBOLECTRIC)
+
+    testCompileOnly(project(":camera:camera-extensions-stub"))
 }
 
 android {
     defaultConfig {
         minSdkVersion 21
+
+        // TODO: To use the separate version for extensions after new library item is created.
+        buildConfigField "String", "CAMERA_VERSION", "\"${LibraryVersions.CAMERA}\""
+    }
+}
+
+// Enable generating BuildConfig.java since support library default disable it.
+// Need to track on https://issuetracker.google.com/issues/72050365
+android.libraryVariants.all { variant ->
+    variant.generateBuildConfigProvider.configure {
+        it.enabled = true
     }
 }
 
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java
index 8c0905e..82b2b27 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java
@@ -34,12 +34,15 @@
      * {@link androidx.camera.core.ImageCapture}.
      */
     public static AutoImageCaptureExtender create(ImageCaptureConfig.Builder builder) {
-        try {
-            return new VendorAutoImageCaptureExtender(builder);
-        } catch (NoClassDefFoundError e) {
-            Log.d(TAG, "No auto image capture extender found. Falling back to default.");
-            return new DefaultAutoImageCaptureExtender();
+        if (ExtensionVersion.isExtensionVersionSupported()) {
+            try {
+                return new VendorAutoImageCaptureExtender(builder);
+            } catch (NoClassDefFoundError e) {
+                Log.d(TAG, "No auto image capture extender found. Falling back to default.");
+            }
         }
+
+        return new DefaultAutoImageCaptureExtender();
     }
 
     /** Empty implementation of auto extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/AutoPreviewExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/AutoPreviewExtender.java
index 44b0ee6..f49850c 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/AutoPreviewExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/AutoPreviewExtender.java
@@ -34,12 +34,15 @@
      * {@link androidx.camera.core.Preview}.
      */
     public static AutoPreviewExtender create(PreviewConfig.Builder builder) {
-        try {
-            return new VendorAutoPreviewExtender(builder);
-        } catch (NoClassDefFoundError e) {
-            Log.d(TAG, "No auto preview extender found. Falling back to default.");
-            return new DefaultAutoPreviewExtender();
+        if (ExtensionVersion.isExtensionVersionSupported()) {
+            try {
+                return new VendorAutoPreviewExtender(builder);
+            } catch (NoClassDefFoundError e) {
+                Log.d(TAG, "No auto preview extender found. Falling back to default.");
+            }
         }
+
+        return new DefaultAutoPreviewExtender();
     }
 
     /** Empty implementation of auto extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java
index e7dd18e..9837b45 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java
@@ -34,12 +34,15 @@
      * {@link androidx.camera.core.ImageCapture}.
      */
     public static BeautyImageCaptureExtender create(ImageCaptureConfig.Builder builder) {
-        try {
-            return new VendorBeautyImageCaptureExtender(builder);
-        } catch (NoClassDefFoundError e) {
-            Log.d(TAG, "No beauty image capture extender found. Falling back to default.");
-            return new DefaultBeautyImageCaptureExtender();
+        if (ExtensionVersion.isExtensionVersionSupported()) {
+            try {
+                return new VendorBeautyImageCaptureExtender(builder);
+            } catch (NoClassDefFoundError e) {
+                Log.d(TAG, "No beauty image capture extender found. Falling back to default.");
+            }
         }
+
+        return new DefaultBeautyImageCaptureExtender();
     }
 
     /** Empty implementation of beauty extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/BeautyPreviewExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/BeautyPreviewExtender.java
index d24b3ce..fb13d5d 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/BeautyPreviewExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/BeautyPreviewExtender.java
@@ -34,12 +34,15 @@
      * {@link androidx.camera.core.Preview}.
      */
     public static BeautyPreviewExtender create(PreviewConfig.Builder builder) {
-        try {
-            return new VendorBeautyPreviewExtender(builder);
-        } catch (NoClassDefFoundError e) {
-            Log.d(TAG, "No beauty preview extender found. Falling back to default.");
-            return new DefaultBeautyPreviewExtender();
+        if (ExtensionVersion.isExtensionVersionSupported()) {
+            try {
+                return new VendorBeautyPreviewExtender(builder);
+            } catch (NoClassDefFoundError e) {
+                Log.d(TAG, "No beauty preview extender found. Falling back to default.");
+            }
         }
+
+        return new DefaultBeautyPreviewExtender();
     }
 
     /** Empty implementation of beauty extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java
index abdbbfb..9fcbdbee 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java
@@ -34,12 +34,15 @@
      * {@link androidx.camera.core.ImageCapture}.
      */
     public static BokehImageCaptureExtender create(ImageCaptureConfig.Builder builder) {
-        try {
-            return new VendorBokehImageCaptureExtender(builder);
-        } catch (NoClassDefFoundError e) {
-            Log.d(TAG, "No bokeh image capture extender found. Falling back to default.");
-            return new DefaultBokehImageCaptureExtender();
+        if (ExtensionVersion.isExtensionVersionSupported()) {
+            try {
+                return new VendorBokehImageCaptureExtender(builder);
+            } catch (NoClassDefFoundError e) {
+                Log.d(TAG, "No bokeh image capture extender found. Falling back to default.");
+            }
         }
+
+        return new DefaultBokehImageCaptureExtender();
     }
 
     /** Empty implementation of bokeh extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/BokehPreviewExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/BokehPreviewExtender.java
index 5a23970..c15df1da 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/BokehPreviewExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/BokehPreviewExtender.java
@@ -34,12 +34,15 @@
      * {@link androidx.camera.core.Preview}.
      */
     public static BokehPreviewExtender create(PreviewConfig.Builder builder) {
-        try {
-            return new VendorBokehPreviewExtender(builder);
-        } catch (NoClassDefFoundError e) {
-            Log.d(TAG, "No bokeh preview extender found. Falling back to default.");
-            return new DefaultBokehPreviewExtender();
+        if (ExtensionVersion.isExtensionVersionSupported()) {
+            try {
+                return new VendorBokehPreviewExtender(builder);
+            } catch (NoClassDefFoundError e) {
+                Log.d(TAG, "No bokeh preview extender found. Falling back to default.");
+            }
         }
+
+        return new DefaultBokehPreviewExtender();
     }
 
     /** Empty implementation of bokeh extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/ExtensionVersion.java b/camera/extensions/src/main/java/androidx/camera/extensions/ExtensionVersion.java
new file mode 100644
index 0000000..574a3f0
--- /dev/null
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/ExtensionVersion.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.extensions;
+
+import android.util.Log;
+
+import androidx.camera.extensions.impl.ExtensionVersionImpl;
+
+/**
+ * Provides interfaces to check the extension version.
+ */
+abstract class ExtensionVersion {
+    private static final String TAG = "ExtenderVersion";
+
+    private static volatile ExtensionVersion sExtensionVersion;
+
+    private static ExtensionVersion getInstance() {
+        if (sExtensionVersion != null) {
+            return sExtensionVersion;
+        }
+        synchronized (ExtensionVersion.class) {
+            if (sExtensionVersion == null) {
+                try {
+                    sExtensionVersion = new VendorExtenderVersioning();
+                } catch (NoClassDefFoundError e) {
+                    Log.d(TAG, "No versioning extender found. Falling back to default.");
+                    sExtensionVersion = new DefaultExtenderVersioning();
+                }
+            }
+        }
+
+        return sExtensionVersion;
+    }
+
+    /**
+     * Indicate the compatibility of CameraX and OEM library.
+     *
+     * @return true if OEM returned a major version is matched with the current version, false
+     * otherwise.
+     */
+    static boolean isExtensionVersionSupported() {
+        return getInstance().getVersionObject() != null;
+    }
+
+    /**
+     * Return the Version object of the OEM library if the version is compatible with CameraX.
+     *
+     * @return a Version object which composed of the version number string that's returned from
+     * {@link ExtensionVersionImpl#checkApiVersion(String)}.
+     * <tt>null</tt> if the OEM library didn't implement the version checking method or the
+     * version is not compatible with CameraX.
+     */
+    static Version getRuntimeVersion() {
+        return getInstance().getVersionObject();
+    }
+
+    /**
+     * @return a Version object returned from the extension implementation.
+     */
+    abstract Version getVersionObject();
+
+    /** An implementation that calls into the vendor provided implementation. */
+    private static class VendorExtenderVersioning extends ExtensionVersion {
+        private ExtensionVersionImpl mImpl;
+        private Version mRuntimeVersion;
+
+        VendorExtenderVersioning() {
+            mImpl = new ExtensionVersionImpl();
+            String vendorVersion = mImpl.checkApiVersion(VersionName.CURRENT.toVersionString());
+            Version vendorVersionObj = Version.parse(vendorVersion);
+            if (vendorVersionObj != null && VersionName.CURRENT.getVersion().compareTo(
+                    vendorVersionObj.getMajor()) == 0) {
+                mRuntimeVersion = vendorVersionObj;
+            }
+
+            Log.d(TAG, "Selected vendor runtime: " + mRuntimeVersion);
+        }
+
+        @Override
+        Version getVersionObject() {
+            return mRuntimeVersion;
+        }
+    }
+
+    /** Empty implementation of ExtensionVersion which does nothing. */
+    private static class DefaultExtenderVersioning extends ExtensionVersion {
+        DefaultExtenderVersioning() {
+        }
+
+        @Override
+        Version getVersionObject() {
+            return null;
+        }
+    }
+}
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java
index 071276f..5e90691 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java
@@ -33,12 +33,15 @@
      * {@link androidx.camera.core.ImageCapture}.
      */
     public static HdrImageCaptureExtender create(ImageCaptureConfig.Builder builder) {
-        try {
-            return new VendorHdrImageCaptureExtender(builder);
-        } catch (NoClassDefFoundError e) {
-            Log.d(TAG, "No HDR image capture extender found. Falling back to default.");
-            return new DefaultHdrImageCaptureExtender();
+        if (ExtensionVersion.isExtensionVersionSupported()) {
+            try {
+                return new VendorHdrImageCaptureExtender(builder);
+            } catch (NoClassDefFoundError e) {
+                Log.d(TAG, "No HDR image capture extender found. Falling back to default.");
+            }
         }
+
+        return new DefaultHdrImageCaptureExtender();
     }
 
     /** Empty implementation of HDR extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/HdrPreviewExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/HdrPreviewExtender.java
index 239cef1..b931eaf 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/HdrPreviewExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/HdrPreviewExtender.java
@@ -34,12 +34,15 @@
      * {@link androidx.camera.core.Preview}.
      */
     public static HdrPreviewExtender create(PreviewConfig.Builder builder) {
-        try {
-            return new VendorHdrPreviewExtender(builder);
-        } catch (NoClassDefFoundError e) {
-            Log.d(TAG, "No HDR preview extender found. Falling back to default.");
-            return new DefaultHdrPreviewExtender();
+        if (ExtensionVersion.isExtensionVersionSupported()) {
+            try {
+                return new VendorHdrPreviewExtender(builder);
+            } catch (NoClassDefFoundError e) {
+                Log.d(TAG, "No HDR preview extender found. Falling back to default.");
+            }
         }
+
+        return new DefaultHdrPreviewExtender();
     }
 
     /** Empty implementation of HDR extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java
index 96ce123..adbab14 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java
@@ -34,12 +34,15 @@
      * {@link androidx.camera.core.ImageCapture}.
      */
     public static NightImageCaptureExtender create(ImageCaptureConfig.Builder builder) {
-        try {
-            return new VendorNightImageCaptureExtender(builder);
-        } catch (NoClassDefFoundError e) {
-            Log.d(TAG, "No night image capture extender found. Falling back to default.");
-            return new DefaultNightImageCaptureExtender();
+        if (ExtensionVersion.isExtensionVersionSupported()) {
+            try {
+                return new VendorNightImageCaptureExtender(builder);
+            } catch (NoClassDefFoundError e) {
+                Log.d(TAG, "No night image capture extender found. Falling back to default.");
+            }
         }
+
+        return new DefaultNightImageCaptureExtender();
     }
 
     /** Empty implementation of night extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/NightPreviewExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/NightPreviewExtender.java
index 71f0ad2..da3e83d 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/NightPreviewExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/NightPreviewExtender.java
@@ -34,12 +34,15 @@
      * {@link androidx.camera.core.Preview}.
      */
     public static NightPreviewExtender create(PreviewConfig.Builder builder) {
-        try {
-            return new VendorNightPreviewExtender(builder);
-        } catch (NoClassDefFoundError e) {
-            Log.d(TAG, "No night preview extender found. Falling back to default.");
-            return new DefaultNightPreviewExtender();
+        if (ExtensionVersion.isExtensionVersionSupported()) {
+            try {
+                return new VendorNightPreviewExtender(builder);
+            } catch (NoClassDefFoundError e) {
+                Log.d(TAG, "No night preview extender found. Falling back to default.");
+            }
         }
+
+        return new DefaultNightPreviewExtender();
     }
 
     /** Empty implementation of night extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/Version.java b/camera/extensions/src/main/java/androidx/camera/extensions/Version.java
new file mode 100644
index 0000000..e70e683
--- /dev/null
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/Version.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.extensions;
+
+import android.text.TextUtils;
+
+import com.google.auto.value.AutoValue;
+
+import java.math.BigInteger;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Class encapsulating a version with major, minor, patch and description values.
+ */
+@AutoValue
+abstract class Version implements Comparable<Version> {
+    private static final Pattern VERSION_STRING_PATTERN =
+            Pattern.compile("(\\d+)(?:\\.(\\d+))(?:\\.(\\d+))(?:\\-(.+))?");
+
+    /**
+     * Parses a string to a version object.
+     *
+     * @param versionString string in the format "1.2.3" or "1.2.3-Description"
+     *                      (major.minor.patch[-description])
+     * @return the parsed Version object or <tt>null</tt> if the versionString format is invalid.
+     */
+    public static Version parse(String versionString) {
+        if (TextUtils.isEmpty(versionString)) {
+            return null;
+        }
+
+        Matcher matcher = VERSION_STRING_PATTERN.matcher(versionString);
+        if (!matcher.matches()) {
+            return null;
+        }
+
+        int major = Integer.parseInt(matcher.group(1));
+        int minor = Integer.parseInt(matcher.group(2));
+        int patch = Integer.parseInt(matcher.group(3));
+        String description = matcher.group(4) != null ? matcher.group(4) : "";
+        return create(major, minor, patch, description);
+    }
+
+    /**
+     * Creates a new instance of the Version object with the given parameters.
+     */
+    public static Version create(int major, int minor, int patch, String description) {
+        return new AutoValue_Version(major, minor, patch, description);
+    }
+
+    /** Prevent subclassing. */
+    Version() {
+    }
+
+    abstract int getMajor();
+
+    abstract int getMinor();
+
+    abstract int getPatch();
+
+    abstract String getDescription();
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder(getMajor() + "." + getMinor() + "." + getPatch());
+        if (!TextUtils.isEmpty(getDescription())) {
+            sb.append("-" + getDescription());
+        }
+        return sb.toString();
+    }
+
+    /**
+     * To compare the major, minor and patch version with another.
+     *
+     * @param other The preference to compare to this one.
+     * @return 0 if it have the same major minor and patch version; less than 0 if this
+     * preference sorts ahead of <var>other</var>; greater than 0 if this preference sorts after
+     * <var>other</var>.
+     */
+    @Override
+    public int compareTo(Version other) {
+        return createBigInteger(this).compareTo(createBigInteger(other));
+    }
+
+    public int compareTo(int majorVersion) {
+        return compareTo(majorVersion, 0);
+    }
+
+    public int compareTo(int majorVersion, int minorVersion) {
+        if (getMajor() == majorVersion) {
+            return Integer.compare(getMinor(), minorVersion);
+        }
+        return Integer.compare(getMajor(), majorVersion);
+    }
+
+    private static BigInteger createBigInteger(Version version) {
+        return BigInteger.valueOf(version.getMajor())
+                .shiftLeft(32)
+                .or(BigInteger.valueOf(version.getMinor()))
+                .shiftLeft(32)
+                .or(BigInteger.valueOf(version.getPatch()));
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof Version)) {
+            return false;
+        }
+
+        Version otherVersionObj = (Version) obj;
+
+        // The equals checking ignores the description.
+        return Objects.equals(getMajor(), otherVersionObj.getMajor())
+                && Objects.equals(getMinor(), otherVersionObj.getMinor())
+                && Objects.equals(getPatch(), otherVersionObj.getPatch());
+    }
+
+    @Override
+    public int hashCode() {
+        // The hash code ignores the description.
+        return Objects.hash(getMajor(), getMinor(), getPatch());
+    }
+}
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/VersionName.java b/camera/extensions/src/main/java/androidx/camera/extensions/VersionName.java
new file mode 100644
index 0000000..6afd91c
--- /dev/null
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/VersionName.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.extensions;
+
+import androidx.annotation.RestrictTo;
+
+/**
+ * The version of CameraX extension releases.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public enum VersionName {
+
+    /* The current version of the CameraX extension. */
+    CURRENT(BuildConfig.CAMERA_VERSION);
+
+    private final Version mVersion;
+
+    public Version getVersion() {
+        return mVersion;
+    }
+
+    VersionName(String versionString) {
+        mVersion = Version.parse(versionString);
+    }
+
+    VersionName(int major, int minor, int patch, String description) {
+        mVersion = Version.create(major, minor, patch, description);
+    }
+
+    /**
+     * Gets this version number as string.
+     *
+     * @return the string of the version in a form of MAJOR.MINOR.PATCH-description.
+     */
+    public String toVersionString() {
+        return mVersion.toString();
+    }
+}
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/LifecycleObserver.java b/camera/extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
similarity index 60%
copy from lifecycle/common/src/main/java/androidx/lifecycle/LifecycleObserver.java
copy to camera/extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
index f02aad8..9641d6d5 100644
--- a/lifecycle/common/src/main/java/androidx/lifecycle/LifecycleObserver.java
+++ b/camera/extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright 2019 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,15 @@
  * limitations under the License.
  */
 
-package androidx.lifecycle;
+package androidx.camera.extensions;
 
-/**
- * Marks a class as a LifecycleObserver. It does not have any methods, instead, relies on
- * {@link OnLifecycleEvent} annotated methods.
- * <p>
- * @see Lifecycle Lifecycle - for samples and usage patterns.
- */
-@SuppressWarnings("WeakerAccess")
-public interface LifecycleObserver {
+import static org.junit.Assert.assertNotNull;
 
+import org.junit.Test;
+
+public class VersionNameTest {
+    @Test
+    public void testCurrentVersion_shouldNotEmpty() {
+        assertNotNull(VersionName.CURRENT.getVersion());
+    }
 }
diff --git a/camera/extensions/src/test/java/androidx/camera/extensions/VersionTest.java b/camera/extensions/src/test/java/androidx/camera/extensions/VersionTest.java
new file mode 100644
index 0000000..fb6859e
--- /dev/null
+++ b/camera/extensions/src/test/java/androidx/camera/extensions/VersionTest.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.extensions;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.lessThan;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class VersionTest {
+
+    @Test
+    public void testVersionEqual() {
+        Version version1 = Version.create(1, 0, 0, "test");
+        Version version1_patch = Version.create(1, 0, 1, "test");
+        Version version1_minor = Version.create(1, 1, 0, "test");
+        Version version1_description = Version.create(1, 0, 0, "description");
+
+        Version version2 = Version.create(2, 0, 0, "test");
+
+        assertTrue(version1.equals(version1_description));
+        assertFalse(version1.equals(version1_patch));
+        assertFalse(version1.equals(version1_minor));
+        assertFalse(version1.equals(version2));
+
+        assertThat(version1.compareTo(version1_patch), lessThan(0));
+        assertThat(version1.compareTo(version1_description), equalTo(0));
+        assertThat(version1.compareTo(version1_minor), lessThan(0));
+        assertThat(version1.compareTo(version2), lessThan(0));
+
+        assertThat(version1.compareTo(1), equalTo(0));
+        assertThat(version1.compareTo(2), lessThan(0));
+        assertThat(version1.compareTo(0), greaterThan(0));
+
+        assertThat(version1.compareTo(1, 0), equalTo(0));
+        assertThat(version1.compareTo(1, 1), lessThan(0));
+        assertThat(version1_minor.compareTo(1, 0), greaterThan(0));
+
+        assertThat(version1.compareTo(2, 0), lessThan(0));
+    }
+
+    @Test
+    public void testParseStringVersion() {
+
+        Version version1 = Version.parse("1.2.3-description");
+        assertNotNull(version1);
+        assertEquals(version1.getMajor(), 1);
+        assertEquals(version1.getMinor(), 2);
+        assertEquals(version1.getPatch(), 3);
+        assertEquals(version1.getDescription(), "description");
+
+        Version version2 = Version.parse("4.5.6");
+        assertNotNull(version2);
+        assertEquals(version2.getDescription(), "");
+
+        Version version3 = Version.parse("01.002.0003");
+        assertNotNull(version3);
+        assertEquals(version3.getMajor(), 1);
+        assertEquals(version3.getMinor(), 2);
+        assertEquals(version3.getPatch(), 3);
+
+
+        // Test invalid input version string.
+        assertNull(Version.parse("1.0"));
+        assertNull(Version.parse("1. 0.0"));
+        assertNull(Version.parse("1..0"));
+        assertNull(Version.parse("1.0.a"));
+        assertNull(Version.parse("1.0.0."));
+        assertNull(Version.parse("1.0.0.description"));
+
+        assertNull(Version.parse("1.0.0.0"));
+        assertNull(Version.parse("1.0.-0"));
+        assertNull(Version.parse("1.0.-0"));
+        assertNull(Version.parse("(1.0.0)"));
+        assertNull(Version.parse(" 1.0.0 "));
+    }
+}
diff --git a/camera/gradle.properties b/camera/gradle.properties
deleted file mode 100644
index c0384c8..0000000
--- a/camera/gradle.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-# Improve build performance
-org.gradle.jvmargs=-Xmx6g -XX:ReservedCodeCacheSize=2g -Dfile.encoding=UTF-8
-org.gradle.parallel=true
-org.gradle.configureondemand=true
-org.gradle.caching=true
-# For offline storage of dependencies. This string should be considered a child
-# directory of the main directory defined by ${rootProject.projectDir}.
-offlineRepositoryRoot=offline-repository
diff --git a/core/core/api/1.2.0-alpha02.txt b/core/core/api/1.2.0-alpha02.txt
index 09d5cc1..a17492e 100644
--- a/core/core/api/1.2.0-alpha02.txt
+++ b/core/core/api/1.2.0-alpha02.txt
@@ -1258,6 +1258,10 @@
     method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
   }
 
+  public final class UriCompat {
+    method public static String toSafeString(android.net.Uri);
+  }
+
 }
 
 package androidx.core.os {
diff --git a/core/core/api/current.txt b/core/core/api/current.txt
index 09d5cc1..a17492e 100644
--- a/core/core/api/current.txt
+++ b/core/core/api/current.txt
@@ -1258,6 +1258,10 @@
     method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
   }
 
+  public final class UriCompat {
+    method public static String toSafeString(android.net.Uri);
+  }
+
 }
 
 package androidx.core.os {
diff --git a/core/core/src/androidTest/java/androidx/core/net/UriCompatTest.java b/core/core/src/androidTest/java/androidx/core/net/UriCompatTest.java
new file mode 100644
index 0000000..dfad407
--- /dev/null
+++ b/core/core/src/androidTest/java/androidx/core/net/UriCompatTest.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.core.net;
+
+import static org.junit.Assert.assertEquals;
+
+import android.net.Uri;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Tests for {@link UriCompat}.
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class UriCompatTest {
+
+    @Test
+    public void testToSafeString_tel() {
+        checkToSafeString("tel:xxxxxx", "tel:Google");
+        checkToSafeString("tel:xxxxxxxxxx", "tel:1234567890");
+        checkToSafeString("tEl:xxx.xxx-xxxx", "tEl:123.456-7890");
+    }
+
+    @Test
+    public void testToSafeString_sip() {
+        checkToSafeString("sip:[email protected]", "sip:[email protected]:1234");
+        checkToSafeString("sIp:[email protected]", "sIp:[email protected]");
+    }
+
+    @Test
+    public void testToSafeString_sms() {
+        checkToSafeString("sms:xxxxxx", "sms:123abc");
+        checkToSafeString("smS:xxx.xxx-xxxx", "smS:123.456-7890");
+    }
+
+    @Test
+    public void testToSafeString_smsto() {
+        checkToSafeString("smsto:xxxxxx", "smsto:123abc");
+        checkToSafeString("SMSTo:xxx.xxx-xxxx", "SMSTo:123.456-7890");
+    }
+
+    @Test
+    public void testToSafeString_mailto() {
+        checkToSafeString("mailto:[email protected]", "mailto:[email protected]");
+        checkToSafeString("Mailto:[email protected]",
+                "Mailto:[email protected]/secret");
+    }
+
+    @Test
+    public void testToSafeString_nfc() {
+        checkToSafeString("nfc:xxxxxx", "nfc:123abc");
+        checkToSafeString("nfc:xxx.xxx-xxxx", "nfc:123.456-7890");
+        checkToSafeString("nfc:[email protected]", "nfc:[email protected]");
+    }
+
+    @Test
+    public void testToSafeString_http() {
+        checkToSafeString("http://www.android.com/...", "http://www.android.com");
+        checkToSafeString("HTTP://www.android.com/...", "HTTP://www.android.com");
+        checkToSafeString("http://www.android.com/...", "http://www.android.com/");
+        checkToSafeString("http://www.android.com/...", "http://www.android.com/secretUrl?param");
+        checkToSafeString("http://www.android.com/...",
+                "http://user:[email protected]/secretUrl?param");
+        checkToSafeString("http://www.android.com/...",
+                "http://[email protected]/secretUrl?param");
+        checkToSafeString("http://www.android.com/...", "http://www.android.com/secretUrl?param");
+        checkToSafeString("http:///...", "http:///path?param");
+        checkToSafeString("http:///...", "http://");
+        checkToSafeString("http://:12345/...", "http://:12345/");
+    }
+
+    @Test
+    public void testToSafeString_https() {
+        checkToSafeString("https://www.android.com/...", "https://www.android.com/secretUrl?param");
+        checkToSafeString("https://www.android.com:8443/...",
+                "https://user:[email protected]:8443/secretUrl?param");
+        checkToSafeString("https://www.android.com/...", "https://user:[email protected]");
+        checkToSafeString("Https://www.android.com/...", "Https://user:[email protected]");
+    }
+
+    @Test
+    public void testToSafeString_ftp() {
+        checkToSafeString("ftp://ftp.android.com/...", "ftp://ftp.android.com/");
+        checkToSafeString("ftP://ftp.android.com/...", "ftP://[email protected]/");
+        checkToSafeString("ftp://ftp.android.com:2121/...",
+                "ftp://root:[email protected]:2121/");
+    }
+
+    @Test
+    public void testToSafeString_rtsp() {
+        checkToSafeString("rtsp://rtsp.android.com/...", "rtsp://rtsp.android.com/");
+        checkToSafeString("rtsp://rtsp.android.com/...", "rtsp://rtsp.android.com/video.mov");
+        checkToSafeString("rtsp://rtsp.android.com/...", "rtsp://rtsp.android.com/video.mov?param");
+        checkToSafeString("RtsP://rtsp.android.com/...", "RtsP://[email protected]/");
+        checkToSafeString("rtsp://rtsp.android.com:2121/...",
+                "rtsp://username:[email protected]:2121/");
+    }
+
+    @Test
+    public void testToSafeString_notSupport() {
+        checkToSafeString("unsupported://ajkakjah/askdha/secret?secret",
+                "unsupported://ajkakjah/askdha/secret?secret");
+        checkToSafeString("unsupported:ajkakjah/askdha/secret?secret",
+                "unsupported:ajkakjah/askdha/secret?secret");
+    }
+
+    private void checkToSafeString(String expectedSafeString, String original) {
+        assertEquals(expectedSafeString, UriCompat.toSafeString(Uri.parse(original)));
+    }
+}
diff --git a/core/core/src/main/java/androidx/core/net/UriCompat.java b/core/core/src/main/java/androidx/core/net/UriCompat.java
new file mode 100644
index 0000000..77834b7
--- /dev/null
+++ b/core/core/src/main/java/androidx/core/net/UriCompat.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.core.net;
+
+import android.net.Uri;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Helper for accessing function in {@link Uri} in a backwards compatible fashion.
+ */
+public final class UriCompat {
+
+    private UriCompat() {}
+
+    /**
+     * Return a string representation of this URI that has common forms of PII redacted,
+     * making it safer to use for logging purposes.  For example, {@code tel:800-466-4411} is
+     * returned as {@code tel:xxx-xxx-xxxx} and {@code http://example.com/path/to/item/} is
+     * returned as {@code http://example.com/...}.
+     *
+     * @param uri The uri for converted to string.
+     * @return Return a string representation of this URI that has common forms of PII redacted.
+     */
+    public static @NonNull String toSafeString(@NonNull Uri uri) {
+        String scheme = uri.getScheme();
+        String ssp = uri.getSchemeSpecificPart();
+        if (scheme != null) {
+            if (scheme.equalsIgnoreCase("tel") || scheme.equalsIgnoreCase("sip")
+                    || scheme.equalsIgnoreCase("sms") || scheme.equalsIgnoreCase("smsto")
+                    || scheme.equalsIgnoreCase("mailto") || scheme.equalsIgnoreCase("nfc")) {
+                StringBuilder builder = new StringBuilder(64);
+                builder.append(scheme);
+                builder.append(':');
+                if (ssp != null) {
+                    for (int i = 0; i < ssp.length(); i++) {
+                        char c = ssp.charAt(i);
+                        if (c == '-' || c == '@' || c == '.') {
+                            builder.append(c);
+                        } else {
+                            builder.append('x');
+                        }
+                    }
+                }
+                return builder.toString();
+            } else if (scheme.equalsIgnoreCase("http") || scheme.equalsIgnoreCase("https")
+                    || scheme.equalsIgnoreCase("ftp") || scheme.equalsIgnoreCase("rtsp")) {
+                ssp = "//" + ((uri.getHost() != null) ? uri.getHost() : "")
+                        + ((uri.getPort() != -1) ? (":" + uri.getPort()) : "")
+                        + "/...";
+            }
+        }
+        // Not a sensitive scheme, but let's still be conservative about
+        // the data we include -- only the ssp, not the query params or
+        // fragment, because those can often have sensitive info.
+        StringBuilder builder = new StringBuilder(64);
+        if (scheme != null) {
+            builder.append(scheme);
+            builder.append(':');
+        }
+        if (ssp != null) {
+            builder.append(ssp);
+        }
+        return builder.toString();
+    }
+}
diff --git a/development/validateRefactor.sh b/development/validateRefactor.sh
index c139c73..a4724e9 100755
--- a/development/validateRefactor.sh
+++ b/development/validateRefactor.sh
@@ -55,7 +55,6 @@
 rm -rf "$oldOutPath" "$newOutPath" "$tempOutPath"
 
 echo building new commit
-echoAndDo git checkout "$newCommit"
 doBuild
 mv "$tempOutPath" "$newOutPath"
 
@@ -66,10 +65,10 @@
   echo previous build succeeded
 else
   echo previous build failed
-  git checkout "$newCommit"
+  git checkout -
   exit 1
 fi
-git checkout "$newCommit"
+git checkout -
 mv "$tempOutPath" "$oldOutPath"
 
 echo
diff --git a/lifecycle/common-java8/api/2.2.0-alpha02.txt b/lifecycle/common-java8/api/2.2.0-alpha02.txt
deleted file mode 100644
index 498d3a9..0000000
--- a/lifecycle/common-java8/api/2.2.0-alpha02.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-// Signature format: 3.0
-package androidx.lifecycle {
-
-  public interface DefaultLifecycleObserver extends androidx.lifecycle.LifecycleObserver androidx.lifecycle.LifecycleObserver {
-    method public default void onCreate(androidx.lifecycle.LifecycleOwner);
-    method public default void onDestroy(androidx.lifecycle.LifecycleOwner);
-    method public default void onPause(androidx.lifecycle.LifecycleOwner);
-    method public default void onResume(androidx.lifecycle.LifecycleOwner);
-    method public default void onStart(androidx.lifecycle.LifecycleOwner);
-    method public default void onStop(androidx.lifecycle.LifecycleOwner);
-  }
-
-}
-
diff --git a/lifecycle/common-java8/api/current.txt b/lifecycle/common-java8/api/current.txt
deleted file mode 100644
index 498d3a9..0000000
--- a/lifecycle/common-java8/api/current.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-// Signature format: 3.0
-package androidx.lifecycle {
-
-  public interface DefaultLifecycleObserver extends androidx.lifecycle.LifecycleObserver androidx.lifecycle.LifecycleObserver {
-    method public default void onCreate(androidx.lifecycle.LifecycleOwner);
-    method public default void onDestroy(androidx.lifecycle.LifecycleOwner);
-    method public default void onPause(androidx.lifecycle.LifecycleOwner);
-    method public default void onResume(androidx.lifecycle.LifecycleOwner);
-    method public default void onStart(androidx.lifecycle.LifecycleOwner);
-    method public default void onStop(androidx.lifecycle.LifecycleOwner);
-  }
-
-}
-
diff --git a/lifecycle/common/api/current.txt b/lifecycle/common/api/current.txt
deleted file mode 100644
index 3f2e1d7..0000000
--- a/lifecycle/common/api/current.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-// Signature format: 3.0
-package androidx.lifecycle {
-
-  public abstract class Lifecycle {
-    ctor public Lifecycle();
-    method @MainThread public abstract void addObserver(androidx.lifecycle.LifecycleObserver);
-    method @MainThread public abstract androidx.lifecycle.Lifecycle.State getCurrentState();
-    method @MainThread public abstract void removeObserver(androidx.lifecycle.LifecycleObserver);
-  }
-
-  public enum Lifecycle.Event {
-    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_ANY;
-    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_CREATE;
-    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_DESTROY;
-    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_PAUSE;
-    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_RESUME;
-    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_START;
-    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_STOP;
-  }
-
-  public enum Lifecycle.State {
-    method public boolean isAtLeast(androidx.lifecycle.Lifecycle.State);
-    enum_constant public static final androidx.lifecycle.Lifecycle.State CREATED;
-    enum_constant public static final androidx.lifecycle.Lifecycle.State DESTROYED;
-    enum_constant public static final androidx.lifecycle.Lifecycle.State INITIALIZED;
-    enum_constant public static final androidx.lifecycle.Lifecycle.State RESUMED;
-    enum_constant public static final androidx.lifecycle.Lifecycle.State STARTED;
-  }
-
-  public interface LifecycleEventObserver extends androidx.lifecycle.LifecycleObserver {
-    method public void onStateChanged(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.Event);
-  }
-
-  public interface LifecycleObserver {
-  }
-
-  public interface LifecycleOwner {
-    method public androidx.lifecycle.Lifecycle getLifecycle();
-  }
-
-  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface OnLifecycleEvent {
-    method public abstract androidx.lifecycle.Lifecycle.Event! value();
-  }
-
-}
-
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/FullLifecycleObserver.java b/lifecycle/common/src/main/java/androidx/lifecycle/FullLifecycleObserver.java
deleted file mode 100644
index c959d03..0000000
--- a/lifecycle/common/src/main/java/androidx/lifecycle/FullLifecycleObserver.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.lifecycle;
-
-interface FullLifecycleObserver extends LifecycleObserver {
-
-    void onCreate(LifecycleOwner owner);
-
-    void onStart(LifecycleOwner owner);
-
-    void onResume(LifecycleOwner owner);
-
-    void onPause(LifecycleOwner owner);
-
-    void onStop(LifecycleOwner owner);
-
-    void onDestroy(LifecycleOwner owner);
-}
diff --git a/lifecycle/gradle.properties b/lifecycle/gradle.properties
deleted file mode 100644
index 88d2a75..0000000
--- a/lifecycle/gradle.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Copyright (C) 2016 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-org.gradle.jvmargs=-Xmx3000M
\ No newline at end of file
diff --git a/lifecycle/common-java8/api/2.0.0.txt b/lifecycle/lifecycle-common-java8/api/2.0.0.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.0.0.txt
rename to lifecycle/lifecycle-common-java8/api/2.0.0.txt
diff --git a/lifecycle/common-java8/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-common-java8/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-common-java8/api/2.1.0-alpha01.txt
diff --git a/lifecycle/common-java8/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-common-java8/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-common-java8/api/2.1.0-alpha02.txt
diff --git a/lifecycle/common-java8/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-common-java8/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-common-java8/api/2.1.0-alpha03.txt
diff --git a/lifecycle/common-java8/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-common-java8/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-common-java8/api/2.1.0-alpha04.txt
diff --git a/lifecycle/common-java8/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-common-java8/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-common-java8/api/2.1.0-alpha05.txt
diff --git a/lifecycle/common-java8/api/2.1.0-beta00.txt b/lifecycle/lifecycle-common-java8/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-common-java8/api/2.1.0-beta00.txt
diff --git a/lifecycle/common-java8/api/2.1.0-beta01.txt b/lifecycle/lifecycle-common-java8/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-common-java8/api/2.1.0-beta01.txt
diff --git a/lifecycle/common-java8/api/2.1.0-beta02.txt b/lifecycle/lifecycle-common-java8/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-common-java8/api/2.1.0-beta02.txt
diff --git a/lifecycle/common-java8/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-common-java8/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-common-java8/api/2.2.0-alpha01.txt
diff --git a/lifecycle/lifecycle-common-java8/api/2.2.0-alpha02.ignore b/lifecycle/lifecycle-common-java8/api/2.2.0-alpha02.ignore
new file mode 100644
index 0000000..b1543dd0
--- /dev/null
+++ b/lifecycle/lifecycle-common-java8/api/2.2.0-alpha02.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedPackage: androidx.lifecycle:
+    Removed package androidx.lifecycle [RemovedPackage]
\ No newline at end of file
diff --git a/lifecycle/common-java8/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-common-java8/api/2.2.0-alpha02.txt
similarity index 100%
copy from lifecycle/common-java8/api/restricted_2.2.0-alpha02.txt
copy to lifecycle/lifecycle-common-java8/api/2.2.0-alpha02.txt
diff --git a/lifecycle/common-java8/api/restricted_current.txt b/lifecycle/lifecycle-common-java8/api/current.txt
similarity index 100%
copy from lifecycle/common-java8/api/restricted_current.txt
copy to lifecycle/lifecycle-common-java8/api/current.txt
diff --git a/lifecycle/common-java8/api/restricted_2.0.0.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_2.0.0.txt
diff --git a/lifecycle/common-java8/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/common-java8/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/common-java8/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/common-java8/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/common-java8/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/common-java8/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/common-java8/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/common-java8/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/common-java8/api/restricted_current.txt b/lifecycle/lifecycle-common-java8/api/restricted_current.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_current.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_current.txt
diff --git a/lifecycle/common-java8/api_legacy/1.0.0.txt b/lifecycle/lifecycle-common-java8/api_legacy/1.0.0.txt
similarity index 100%
rename from lifecycle/common-java8/api_legacy/1.0.0.txt
rename to lifecycle/lifecycle-common-java8/api_legacy/1.0.0.txt
diff --git a/lifecycle/common-java8/build.gradle b/lifecycle/lifecycle-common-java8/build.gradle
similarity index 100%
rename from lifecycle/common-java8/build.gradle
rename to lifecycle/lifecycle-common-java8/build.gradle
diff --git a/lifecycle/common/api/2.0.0.txt b/lifecycle/lifecycle-common/api/2.0.0.txt
similarity index 100%
rename from lifecycle/common/api/2.0.0.txt
rename to lifecycle/lifecycle-common/api/2.0.0.txt
diff --git a/lifecycle/common/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-common/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/common/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-common/api/2.1.0-alpha01.txt
diff --git a/lifecycle/common/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-common/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/common/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-common/api/2.1.0-alpha02.txt
diff --git a/lifecycle/common/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-common/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/common/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-common/api/2.1.0-alpha03.txt
diff --git a/lifecycle/common/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-common/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/common/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-common/api/2.1.0-alpha04.txt
diff --git a/lifecycle/common/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-common/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/common/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-common/api/2.1.0-alpha05.txt
diff --git a/lifecycle/common/api/2.1.0-beta00.txt b/lifecycle/lifecycle-common/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/common/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-common/api/2.1.0-beta00.txt
diff --git a/lifecycle/common/api/2.1.0-beta01.txt b/lifecycle/lifecycle-common/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/common/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-common/api/2.1.0-beta01.txt
diff --git a/lifecycle/common/api/2.1.0-beta02.txt b/lifecycle/lifecycle-common/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/common/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-common/api/2.1.0-beta02.txt
diff --git a/lifecycle/common/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-common/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/common/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-common/api/2.2.0-alpha01.txt
diff --git a/lifecycle/common/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-common/api/2.2.0-alpha02.txt
similarity index 69%
rename from lifecycle/common/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-common/api/2.2.0-alpha02.txt
index 3f2e1d7..1d2105f 100644
--- a/lifecycle/common/api/2.2.0-alpha02.txt
+++ b/lifecycle/lifecycle-common/api/2.2.0-alpha02.txt
@@ -1,6 +1,15 @@
 // Signature format: 3.0
 package androidx.lifecycle {
 
+  public interface DefaultLifecycleObserver extends androidx.lifecycle.LifecycleObserver {
+    method public default void onCreate(androidx.lifecycle.LifecycleOwner);
+    method public default void onDestroy(androidx.lifecycle.LifecycleOwner);
+    method public default void onPause(androidx.lifecycle.LifecycleOwner);
+    method public default void onResume(androidx.lifecycle.LifecycleOwner);
+    method public default void onStart(androidx.lifecycle.LifecycleOwner);
+    method public default void onStop(androidx.lifecycle.LifecycleOwner);
+  }
+
   public abstract class Lifecycle {
     ctor public Lifecycle();
     method @MainThread public abstract void addObserver(androidx.lifecycle.LifecycleObserver);
@@ -38,8 +47,8 @@
     method public androidx.lifecycle.Lifecycle getLifecycle();
   }
 
-  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface OnLifecycleEvent {
-    method public abstract androidx.lifecycle.Lifecycle.Event! value();
+  @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface OnLifecycleEvent {
+    method @Deprecated public abstract androidx.lifecycle.Lifecycle.Event! value();
   }
 
 }
diff --git a/lifecycle/common/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-common/api/current.txt
similarity index 69%
copy from lifecycle/common/api/2.2.0-alpha02.txt
copy to lifecycle/lifecycle-common/api/current.txt
index 3f2e1d7..1d2105f 100644
--- a/lifecycle/common/api/2.2.0-alpha02.txt
+++ b/lifecycle/lifecycle-common/api/current.txt
@@ -1,6 +1,15 @@
 // Signature format: 3.0
 package androidx.lifecycle {
 
+  public interface DefaultLifecycleObserver extends androidx.lifecycle.LifecycleObserver {
+    method public default void onCreate(androidx.lifecycle.LifecycleOwner);
+    method public default void onDestroy(androidx.lifecycle.LifecycleOwner);
+    method public default void onPause(androidx.lifecycle.LifecycleOwner);
+    method public default void onResume(androidx.lifecycle.LifecycleOwner);
+    method public default void onStart(androidx.lifecycle.LifecycleOwner);
+    method public default void onStop(androidx.lifecycle.LifecycleOwner);
+  }
+
   public abstract class Lifecycle {
     ctor public Lifecycle();
     method @MainThread public abstract void addObserver(androidx.lifecycle.LifecycleObserver);
@@ -38,8 +47,8 @@
     method public androidx.lifecycle.Lifecycle getLifecycle();
   }
 
-  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface OnLifecycleEvent {
-    method public abstract androidx.lifecycle.Lifecycle.Event! value();
+  @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface OnLifecycleEvent {
+    method @Deprecated public abstract androidx.lifecycle.Lifecycle.Event! value();
   }
 
 }
diff --git a/lifecycle/common/api/restricted_2.0.0.txt b/lifecycle/lifecycle-common/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/common/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-common/api/restricted_2.0.0.txt
diff --git a/lifecycle/common/api/restricted_2.1.0-alpha03.ignore b/lifecycle/lifecycle-common/api/restricted_2.1.0-alpha03.ignore
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-alpha03.ignore
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-alpha03.ignore
diff --git a/lifecycle/common/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-common/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/common/api/restricted_2.1.0-alpha04.ignore b/lifecycle/lifecycle-common/api/restricted_2.1.0-alpha04.ignore
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-alpha04.ignore
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-alpha04.ignore
diff --git a/lifecycle/common/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-common/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/common/api/restricted_2.1.0-alpha05.ignore b/lifecycle/lifecycle-common/api/restricted_2.1.0-alpha05.ignore
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-alpha05.ignore
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-alpha05.ignore
diff --git a/lifecycle/common/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-common/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/common/api/restricted_2.1.0-beta00.ignore b/lifecycle/lifecycle-common/api/restricted_2.1.0-beta00.ignore
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-beta00.ignore
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-beta00.ignore
diff --git a/lifecycle/common/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-common/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/common/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-common/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/common/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-common/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/common/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-common/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/common/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-common/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/common/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-common/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/common/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-common/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/common/api/restricted_current.txt b/lifecycle/lifecycle-common/api/restricted_current.txt
similarity index 100%
rename from lifecycle/common/api/restricted_current.txt
rename to lifecycle/lifecycle-common/api/restricted_current.txt
diff --git a/lifecycle/common/api_legacy/0.0.0.txt b/lifecycle/lifecycle-common/api_legacy/0.0.0.txt
similarity index 100%
rename from lifecycle/common/api_legacy/0.0.0.txt
rename to lifecycle/lifecycle-common/api_legacy/0.0.0.txt
diff --git a/lifecycle/common/api_legacy/1.0.0.txt b/lifecycle/lifecycle-common/api_legacy/1.0.0.txt
similarity index 100%
rename from lifecycle/common/api_legacy/1.0.0.txt
rename to lifecycle/lifecycle-common/api_legacy/1.0.0.txt
diff --git a/lifecycle/common/api_legacy/current.txt b/lifecycle/lifecycle-common/api_legacy/current.txt
similarity index 100%
rename from lifecycle/common/api_legacy/current.txt
rename to lifecycle/lifecycle-common/api_legacy/current.txt
diff --git a/lifecycle/common/build.gradle b/lifecycle/lifecycle-common/build.gradle
similarity index 100%
rename from lifecycle/common/build.gradle
rename to lifecycle/lifecycle-common/build.gradle
diff --git a/lifecycle/common/lint-baseline.xml b/lifecycle/lifecycle-common/lint-baseline.xml
similarity index 100%
rename from lifecycle/common/lint-baseline.xml
rename to lifecycle/lifecycle-common/lint-baseline.xml
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/ClassesInfoCache.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/ClassesInfoCache.java
similarity index 100%
rename from lifecycle/common/src/main/java/androidx/lifecycle/ClassesInfoCache.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/ClassesInfoCache.java
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/CompositeGeneratedAdaptersObserver.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/CompositeGeneratedAdaptersObserver.java
similarity index 100%
rename from lifecycle/common/src/main/java/androidx/lifecycle/CompositeGeneratedAdaptersObserver.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/CompositeGeneratedAdaptersObserver.java
diff --git a/lifecycle/common-java8/src/main/java/androidx/lifecycle/DefaultLifecycleObserver.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/DefaultLifecycleObserver.java
similarity index 92%
rename from lifecycle/common-java8/src/main/java/androidx/lifecycle/DefaultLifecycleObserver.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/DefaultLifecycleObserver.java
index be9a4a4..4ccb307 100644
--- a/lifecycle/common-java8/src/main/java/androidx/lifecycle/DefaultLifecycleObserver.java
+++ b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/DefaultLifecycleObserver.java
@@ -21,8 +21,6 @@
 /**
  * Callback interface for listening to {@link LifecycleOwner} state changes.
  * <p>
- * If you use Java 8 language, <b>always</b> prefer it over annotations.
- * <p>
  * If a class implements both this interface and {@link LifecycleEventObserver}, then
  * methods of {@code DefaultLifecycleObserver} will be called first, and then followed by the call
  * of {@link LifecycleEventObserver#onStateChanged(LifecycleOwner, Lifecycle.Event)}
@@ -31,7 +29,7 @@
  * annotations will be ignored.
  */
 @SuppressWarnings("unused")
-public interface DefaultLifecycleObserver extends FullLifecycleObserver {
+public interface DefaultLifecycleObserver extends LifecycleObserver {
 
     /**
      * Notifies that {@code ON_CREATE} event occurred.
@@ -41,7 +39,6 @@
      *
      * @param owner the component, whose state was changed
      */
-    @Override
     default void onCreate(@NonNull LifecycleOwner owner) {
     }
 
@@ -52,7 +49,6 @@
      *
      * @param owner the component, whose state was changed
      */
-    @Override
     default void onStart(@NonNull LifecycleOwner owner) {
     }
 
@@ -64,7 +60,6 @@
      *
      * @param owner the component, whose state was changed
      */
-    @Override
     default void onResume(@NonNull LifecycleOwner owner) {
     }
 
@@ -76,7 +71,6 @@
      *
      * @param owner the component, whose state was changed
      */
-    @Override
     default void onPause(@NonNull LifecycleOwner owner) {
     }
 
@@ -88,7 +82,6 @@
      *
      * @param owner the component, whose state was changed
      */
-    @Override
     default void onStop(@NonNull LifecycleOwner owner) {
     }
 
@@ -100,7 +93,6 @@
      *
      * @param owner the component, whose state was changed
      */
-    @Override
     default void onDestroy(@NonNull LifecycleOwner owner) {
     }
 }
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/FullLifecycleObserverAdapter.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/DefaultLifecycleObserverAdapter.java
similarity index 89%
rename from lifecycle/common/src/main/java/androidx/lifecycle/FullLifecycleObserverAdapter.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/DefaultLifecycleObserverAdapter.java
index 10223d4..ede3c4c 100644
--- a/lifecycle/common/src/main/java/androidx/lifecycle/FullLifecycleObserverAdapter.java
+++ b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/DefaultLifecycleObserverAdapter.java
@@ -18,12 +18,12 @@
 
 import androidx.annotation.NonNull;
 
-class FullLifecycleObserverAdapter implements LifecycleEventObserver {
+class DefaultLifecycleObserverAdapter implements LifecycleEventObserver {
 
-    private final FullLifecycleObserver mFullLifecycleObserver;
+    private final DefaultLifecycleObserver mFullLifecycleObserver;
     private final LifecycleEventObserver mLifecycleEventObserver;
 
-    FullLifecycleObserverAdapter(FullLifecycleObserver fullLifecycleObserver,
+    DefaultLifecycleObserverAdapter(DefaultLifecycleObserver fullLifecycleObserver,
             LifecycleEventObserver lifecycleEventObserver) {
         mFullLifecycleObserver = fullLifecycleObserver;
         mLifecycleEventObserver = lifecycleEventObserver;
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/GeneratedAdapter.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/GeneratedAdapter.java
similarity index 100%
rename from lifecycle/common/src/main/java/androidx/lifecycle/GeneratedAdapter.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/GeneratedAdapter.java
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/GenericLifecycleObserver.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/GenericLifecycleObserver.java
similarity index 100%
rename from lifecycle/common/src/main/java/androidx/lifecycle/GenericLifecycleObserver.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/GenericLifecycleObserver.java
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/Lifecycle.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/Lifecycle.java
similarity index 83%
rename from lifecycle/common/src/main/java/androidx/lifecycle/Lifecycle.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/Lifecycle.java
index 6fd66bd8..097a46d 100644
--- a/lifecycle/common/src/main/java/androidx/lifecycle/Lifecycle.java
+++ b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/Lifecycle.java
@@ -38,9 +38,9 @@
  * before {@link android.app.Activity#onStop onStop} is called.
  * This gives you certain guarantees on which state the owner is in.
  * <p>
- * If you use <b>Java 8 Language</b>, then observe events with {@link DefaultLifecycleObserver}.
- * To include it you should add {@code "androidx.lifecycle:common-java8:<version>"} to your
- * build.gradle file.
+ * Your observer should implement either {@link DefaultLifecycleObserver}
+ * or {@link LifecycleEventObserver} interfaces, for example, with {@link DefaultLifecycleObserver}
+ * it would look like:
  * <pre>
  * class TestObserver implements DefaultLifecycleObserver {
  *     {@literal @}Override
@@ -49,31 +49,6 @@
  *     }
  * }
  * </pre>
- * If you use <b>Java 7 Language</b>, Lifecycle events are observed using annotations.
- * Once Java 8 Language becomes mainstream on Android, annotations will be deprecated, so between
- * {@link DefaultLifecycleObserver} and annotations,
- * you must always prefer {@code DefaultLifecycleObserver}.
- * <pre>
- * class TestObserver implements LifecycleObserver {
- *   {@literal @}OnLifecycleEvent(ON_STOP)
- *   void onStopped() {}
- * }
- * </pre>
- * <p>
- * Observer methods can receive zero or one argument.
- * If used, the first argument must be of type {@link LifecycleOwner}.
- * Methods annotated with {@link Event#ON_ANY} can receive the second argument, which must be
- * of type {@link Event}.
- * <pre>
- * class TestObserver implements LifecycleObserver {
- *   {@literal @}OnLifecycleEvent(ON_CREATE)
- *   void onCreated(LifecycleOwner source) {}
- *   {@literal @}OnLifecycleEvent(ON_ANY)
- *   void onAny(LifecycleOwner source, Event event) {}
- * }
- * </pre>
- * These additional parameters are provided to allow you to conveniently observe multiple providers
- * and events without tracking them manually.
  */
 public abstract class Lifecycle {
 
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/LifecycleEventObserver.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleEventObserver.java
similarity index 100%
rename from lifecycle/common/src/main/java/androidx/lifecycle/LifecycleEventObserver.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleEventObserver.java
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/LifecycleObserver.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleObserver.java
similarity index 74%
rename from lifecycle/common/src/main/java/androidx/lifecycle/LifecycleObserver.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleObserver.java
index f02aad8..6a95e39 100644
--- a/lifecycle/common/src/main/java/androidx/lifecycle/LifecycleObserver.java
+++ b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleObserver.java
@@ -17,9 +17,14 @@
 package androidx.lifecycle;
 
 /**
- * Marks a class as a LifecycleObserver. It does not have any methods, instead, relies on
- * {@link OnLifecycleEvent} annotated methods.
+ * Marks a class as a LifecycleObserver. It does not have any methods, instead, use either:
+ * <ul>
+ * <li>{@link DefaultLifecycleObserver} if you are interested only in certain events,
+ * for example only in {@code ON_CREATE} and {@code ON_DESTROY};
+ * <li>{@link LifecycleEventObserver} if you need to process all events in a stream-like manner.
+ * </ul>
  * <p>
+ *
  * @see Lifecycle Lifecycle - for samples and usage patterns.
  */
 @SuppressWarnings("WeakerAccess")
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/LifecycleOwner.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleOwner.java
similarity index 100%
rename from lifecycle/common/src/main/java/androidx/lifecycle/LifecycleOwner.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleOwner.java
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/Lifecycling.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/Lifecycling.java
similarity index 94%
rename from lifecycle/common/src/main/java/androidx/lifecycle/Lifecycling.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/Lifecycling.java
index 2abb6ec..9ccdd96 100644
--- a/lifecycle/common/src/main/java/androidx/lifecycle/Lifecycling.java
+++ b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/Lifecycling.java
@@ -66,13 +66,13 @@
     @NonNull
     static LifecycleEventObserver lifecycleEventObserver(Object object) {
         boolean isLifecycleEventObserver = object instanceof LifecycleEventObserver;
-        boolean isFullLifecycleObserver = object instanceof FullLifecycleObserver;
-        if (isLifecycleEventObserver && isFullLifecycleObserver) {
-            return new FullLifecycleObserverAdapter((FullLifecycleObserver) object,
+        boolean isDefaultLifecycleObserver = object instanceof DefaultLifecycleObserver;
+        if (isLifecycleEventObserver && isDefaultLifecycleObserver) {
+            return new DefaultLifecycleObserverAdapter((DefaultLifecycleObserver) object,
                     (LifecycleEventObserver) object);
         }
-        if (isFullLifecycleObserver) {
-            return new FullLifecycleObserverAdapter((FullLifecycleObserver) object, null);
+        if (isDefaultLifecycleObserver) {
+            return new DefaultLifecycleObserverAdapter((DefaultLifecycleObserver) object, null);
         }
 
         if (isLifecycleEventObserver) {
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/MethodCallsLogger.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/MethodCallsLogger.java
similarity index 100%
rename from lifecycle/common/src/main/java/androidx/lifecycle/MethodCallsLogger.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/MethodCallsLogger.java
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/OnLifecycleEvent.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/OnLifecycleEvent.java
similarity index 89%
rename from lifecycle/common/src/main/java/androidx/lifecycle/OnLifecycleEvent.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/OnLifecycleEvent.java
index cfb72a0..460f787 100644
--- a/lifecycle/common/src/main/java/androidx/lifecycle/OnLifecycleEvent.java
+++ b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/OnLifecycleEvent.java
@@ -21,9 +21,13 @@
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+/**
+ * @deprecated Use {@link DefaultLifecycleObserver} or {@link LifecycleEventObserver} instead.
+ */
 @SuppressWarnings("unused")
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD)
+@Deprecated
 public @interface OnLifecycleEvent {
     Lifecycle.Event value();
 }
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/ReflectiveGenericLifecycleObserver.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/ReflectiveGenericLifecycleObserver.java
similarity index 100%
rename from lifecycle/common/src/main/java/androidx/lifecycle/ReflectiveGenericLifecycleObserver.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/ReflectiveGenericLifecycleObserver.java
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/SingleGeneratedAdapterObserver.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/SingleGeneratedAdapterObserver.java
similarity index 100%
rename from lifecycle/common/src/main/java/androidx/lifecycle/SingleGeneratedAdapterObserver.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/SingleGeneratedAdapterObserver.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/FullLifecycleObserverTest.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/DefaultLifecycleObserverTest.java
similarity index 92%
rename from lifecycle/common/src/test/java/androidx/lifecycle/FullLifecycleObserverTest.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/DefaultLifecycleObserverTest.java
index 8a6500b..e336ef0 100644
--- a/lifecycle/common/src/test/java/androidx/lifecycle/FullLifecycleObserverTest.java
+++ b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/DefaultLifecycleObserverTest.java
@@ -42,7 +42,7 @@
 import org.mockito.Mockito;
 
 @RunWith(JUnit4.class)
-public class FullLifecycleObserverTest {
+public class DefaultLifecycleObserverTest {
     private LifecycleOwner mOwner;
     private Lifecycle mLifecycle;
 
@@ -55,8 +55,8 @@
 
     @Test
     public void eachEvent() {
-        FullLifecycleObserver obj = mock(FullLifecycleObserver.class);
-        FullLifecycleObserverAdapter observer = new FullLifecycleObserverAdapter(obj, null);
+        DefaultLifecycleObserver obj = mock(DefaultLifecycleObserver.class);
+        DefaultLifecycleObserverAdapter observer = new DefaultLifecycleObserverAdapter(obj, null);
         when(mLifecycle.getCurrentState()).thenReturn(CREATED);
 
         observer.onStateChanged(mOwner, ON_CREATE);
@@ -92,7 +92,7 @@
 
     @Test
     public void fullLifecycleObserverAndLifecycleEventObserver() {
-        class AllObservers implements FullLifecycleObserver, LifecycleEventObserver {
+        class AllObservers implements DefaultLifecycleObserver, LifecycleEventObserver {
 
             @Override
             public void onCreate(LifecycleOwner owner) {
@@ -132,7 +132,7 @@
         }
 
         AllObservers obj = mock(AllObservers.class);
-        FullLifecycleObserverAdapter observer = new FullLifecycleObserverAdapter(obj, obj);
+        DefaultLifecycleObserverAdapter observer = new DefaultLifecycleObserverAdapter(obj, obj);
         when(mLifecycle.getCurrentState()).thenReturn(CREATED);
 
         observer.onStateChanged(mOwner, ON_CREATE);
@@ -173,7 +173,7 @@
     }
 
     public void fullLifecycleObserverAndAnnotations() {
-        class AnnotatedFullLifecycleObserver implements FullLifecycleObserver {
+        class AnnotatedFullLifecycleObserver implements DefaultLifecycleObserver {
             @OnLifecycleEvent(ON_ANY)
             public void onAny() {
                 throw new IllegalStateException("Annotations in FullLifecycleObserver "
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/LifecyclingTest.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/LifecyclingTest.java
similarity index 98%
rename from lifecycle/common/src/test/java/androidx/lifecycle/LifecyclingTest.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/LifecyclingTest.java
index 5854dce..2c6cfe0 100644
--- a/lifecycle/common/src/test/java/androidx/lifecycle/LifecyclingTest.java
+++ b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/LifecyclingTest.java
@@ -116,7 +116,7 @@
 
     @Test
     public void fullLifecycleObserverAndAnnotations() {
-        class AnnotatedFullLifecycleObserver implements FullLifecycleObserver {
+        class AnnotatedFullLifecycleObserver implements DefaultLifecycleObserver {
             @OnLifecycleEvent(ON_ANY)
             public void onAny() {
                 throw new IllegalStateException("Annotations in FullLifecycleObserver "
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/ReflectiveGenericLifecycleObserverTest.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/ReflectiveGenericLifecycleObserverTest.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/ReflectiveGenericLifecycleObserverTest.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/ReflectiveGenericLifecycleObserverTest.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/Base.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Base.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/Base.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Base.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/Base_LifecycleAdapter.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Base_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/Base_LifecycleAdapter.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Base_LifecycleAdapter.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedSequence1.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedSequence1.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedSequence1.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedSequence1.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedSequence2.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedSequence2.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedSequence2.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedSequence2.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedWithNewMethods.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedWithNewMethods.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedWithNewMethods.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedWithNewMethods.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedWithNoNewMethods.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedWithNoNewMethods.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedWithNoNewMethods.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedWithNoNewMethods.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedWithOverridenMethodsWithLfAnnotation.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedWithOverridenMethodsWithLfAnnotation.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedWithOverridenMethodsWithLfAnnotation.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedWithOverridenMethodsWithLfAnnotation.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/Interface1.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Interface1.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/Interface1.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Interface1.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/Interface1_LifecycleAdapter.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Interface1_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/Interface1_LifecycleAdapter.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Interface1_LifecycleAdapter.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/Interface2.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Interface2.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/Interface2.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Interface2.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/Interface2_LifecycleAdapter.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Interface2_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/Interface2_LifecycleAdapter.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Interface2_LifecycleAdapter.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/InterfaceImpl1.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/InterfaceImpl1.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/InterfaceImpl1.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/InterfaceImpl1.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/InterfaceImpl2.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/InterfaceImpl2.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/InterfaceImpl2.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/InterfaceImpl2.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/InterfaceImpl3.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/InterfaceImpl3.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/InterfaceImpl3.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/InterfaceImpl3.java
diff --git a/lifecycle/compiler/build.gradle b/lifecycle/lifecycle-compiler/build.gradle
similarity index 100%
rename from lifecycle/compiler/build.gradle
rename to lifecycle/lifecycle-compiler/build.gradle
diff --git a/lifecycle/compiler/reset_results.py b/lifecycle/lifecycle-compiler/reset_results.py
similarity index 100%
rename from lifecycle/compiler/reset_results.py
rename to lifecycle/lifecycle-compiler/reset_results.py
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/ErrorMessages.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/ErrorMessages.kt
similarity index 100%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/ErrorMessages.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/ErrorMessages.kt
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/LifecycleProcessor.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/LifecycleProcessor.kt
similarity index 100%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/LifecycleProcessor.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/LifecycleProcessor.kt
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/elements_ext.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/elements_ext.kt
similarity index 100%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/elements_ext.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/elements_ext.kt
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/input_collector.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/input_collector.kt
similarity index 99%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/input_collector.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/input_collector.kt
index d6bcaf9..20ea1a9 100644
--- a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/input_collector.kt
+++ b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/input_collector.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("DEPRECATION")
+
 package androidx.lifecycle
 
 import androidx.lifecycle.model.EventMethod
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/model/AdapterClass.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/model/AdapterClass.kt
similarity index 100%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/model/AdapterClass.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/model/AdapterClass.kt
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/model/EventMethod.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/model/EventMethod.kt
similarity index 85%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/model/EventMethod.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/model/EventMethod.kt
index 1056e71..0cc5fbc7 100644
--- a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/model/EventMethod.kt
+++ b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/model/EventMethod.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("DEPRECATION")
+
 package androidx.lifecycle.model
 
 import androidx.lifecycle.OnLifecycleEvent
@@ -21,9 +23,11 @@
 import javax.lang.model.element.ExecutableElement
 import javax.lang.model.element.TypeElement
 
-data class EventMethod(val method: ExecutableElement,
-                       val onLifecycleEvent: OnLifecycleEvent,
-                       val type: TypeElement) {
+data class EventMethod(
+    val method: ExecutableElement,
+    val onLifecycleEvent: OnLifecycleEvent,
+    val type: TypeElement
+) {
 
     fun packageName() = type.getPackageQName()
 }
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/model/InputModel.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/model/InputModel.kt
similarity index 100%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/model/InputModel.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/model/InputModel.kt
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/model/LifecycleObserverInfo.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/model/LifecycleObserverInfo.kt
similarity index 100%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/model/LifecycleObserverInfo.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/model/LifecycleObserverInfo.kt
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/transformation.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/transformation.kt
similarity index 100%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/transformation.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/transformation.kt
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/writer.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/writer.kt
similarity index 100%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/writer.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/writer.kt
diff --git a/lifecycle/compiler/src/main/resources/META-INF/gradle/incremental.annotation.processors b/lifecycle/lifecycle-compiler/src/main/resources/META-INF/gradle/incremental.annotation.processors
similarity index 100%
rename from lifecycle/compiler/src/main/resources/META-INF/gradle/incremental.annotation.processors
rename to lifecycle/lifecycle-compiler/src/main/resources/META-INF/gradle/incremental.annotation.processors
diff --git a/lifecycle/compiler/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/lifecycle/lifecycle-compiler/src/main/resources/META-INF/services/javax.annotation.processing.Processor
similarity index 100%
rename from lifecycle/compiler/src/main/resources/META-INF/services/javax.annotation.processing.Processor
rename to lifecycle/lifecycle-compiler/src/main/resources/META-INF/services/javax.annotation.processing.Processor
diff --git a/lifecycle/compiler/src/main/resources/NOTICE.txt b/lifecycle/lifecycle-compiler/src/main/resources/NOTICE.txt
similarity index 100%
rename from lifecycle/compiler/src/main/resources/NOTICE.txt
rename to lifecycle/lifecycle-compiler/src/main/resources/NOTICE.txt
diff --git a/lifecycle/compiler/src/tests/kotlin/androidx/lifecycle/InvalidCasesTest.kt b/lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/InvalidCasesTest.kt
similarity index 100%
rename from lifecycle/compiler/src/tests/kotlin/androidx/lifecycle/InvalidCasesTest.kt
rename to lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/InvalidCasesTest.kt
diff --git a/lifecycle/compiler/src/tests/kotlin/androidx/lifecycle/ValidCasesTest.kt b/lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/ValidCasesTest.kt
similarity index 100%
rename from lifecycle/compiler/src/tests/kotlin/androidx/lifecycle/ValidCasesTest.kt
rename to lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/ValidCasesTest.kt
diff --git a/lifecycle/compiler/src/tests/kotlin/androidx/lifecycle/utils/TestUtils.kt b/lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/utils/TestUtils.kt
similarity index 100%
rename from lifecycle/compiler/src/tests/kotlin/androidx/lifecycle/utils/TestUtils.kt
rename to lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/utils/TestUtils.kt
diff --git a/lifecycle/compiler/src/tests/test-data/Bar.java b/lifecycle/lifecycle-compiler/src/tests/test-data/Bar.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/Bar.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/Bar.java
diff --git a/lifecycle/compiler/src/tests/test-data/DerivedFromJar.java b/lifecycle/lifecycle-compiler/src/tests/test-data/DerivedFromJar.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/DerivedFromJar.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/DerivedFromJar.java
diff --git a/lifecycle/compiler/src/tests/test-data/DerivedFromJar1.java b/lifecycle/lifecycle-compiler/src/tests/test-data/DerivedFromJar1.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/DerivedFromJar1.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/DerivedFromJar1.java
diff --git a/lifecycle/compiler/src/tests/test-data/DifferentPackagesBase1.java b/lifecycle/lifecycle-compiler/src/tests/test-data/DifferentPackagesBase1.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/DifferentPackagesBase1.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/DifferentPackagesBase1.java
diff --git a/lifecycle/compiler/src/tests/test-data/DifferentPackagesBase2.java b/lifecycle/lifecycle-compiler/src/tests/test-data/DifferentPackagesBase2.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/DifferentPackagesBase2.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/DifferentPackagesBase2.java
diff --git a/lifecycle/compiler/src/tests/test-data/DifferentPackagesDerived1.java b/lifecycle/lifecycle-compiler/src/tests/test-data/DifferentPackagesDerived1.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/DifferentPackagesDerived1.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/DifferentPackagesDerived1.java
diff --git a/lifecycle/compiler/src/tests/test-data/DifferentPackagesDerived2.java b/lifecycle/lifecycle-compiler/src/tests/test-data/DifferentPackagesDerived2.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/DifferentPackagesDerived2.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/DifferentPackagesDerived2.java
diff --git a/lifecycle/compiler/src/tests/test-data/IGNORE_CHECKSTYLE b/lifecycle/lifecycle-compiler/src/tests/test-data/IGNORE_CHECKSTYLE
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/IGNORE_CHECKSTYLE
rename to lifecycle/lifecycle-compiler/src/tests/test-data/IGNORE_CHECKSTYLE
diff --git a/lifecycle/compiler/src/tests/test-data/InheritanceOk1.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InheritanceOk1.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InheritanceOk1.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InheritanceOk1.java
diff --git a/lifecycle/compiler/src/tests/test-data/InheritanceOk2.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InheritanceOk2.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InheritanceOk2.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InheritanceOk2.java
diff --git a/lifecycle/compiler/src/tests/test-data/InheritanceOk3.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InheritanceOk3.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InheritanceOk3.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InheritanceOk3.java
diff --git a/lifecycle/compiler/src/tests/test-data/InterfaceOk1.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InterfaceOk1.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InterfaceOk1.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InterfaceOk1.java
diff --git a/lifecycle/compiler/src/tests/test-data/InterfaceOk2.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InterfaceOk2.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InterfaceOk2.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InterfaceOk2.java
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidClassModifier.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InvalidClassModifier.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InvalidClassModifier.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InvalidClassModifier.java
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidFirstArg1.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InvalidFirstArg1.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InvalidFirstArg1.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InvalidFirstArg1.java
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidFirstArg2.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InvalidFirstArg2.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InvalidFirstArg2.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InvalidFirstArg2.java
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidInheritance1.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InvalidInheritance1.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InvalidInheritance1.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InvalidInheritance1.java
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidInheritance2.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InvalidInheritance2.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InvalidInheritance2.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InvalidInheritance2.java
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidMethodModifier.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InvalidMethodModifier.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InvalidMethodModifier.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InvalidMethodModifier.java
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidSecondArg.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InvalidSecondArg.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InvalidSecondArg.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InvalidSecondArg.java
diff --git a/lifecycle/compiler/src/tests/test-data/NoPackageOk.java b/lifecycle/lifecycle-compiler/src/tests/test-data/NoPackageOk.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/NoPackageOk.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/NoPackageOk.java
diff --git a/lifecycle/compiler/src/tests/test-data/OnAnyMethod.java b/lifecycle/lifecycle-compiler/src/tests/test-data/OnAnyMethod.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/OnAnyMethod.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/OnAnyMethod.java
diff --git a/lifecycle/compiler/src/tests/test-data/TooManyArgs1.java b/lifecycle/lifecycle-compiler/src/tests/test-data/TooManyArgs1.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/TooManyArgs1.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/TooManyArgs1.java
diff --git a/lifecycle/compiler/src/tests/test-data/TooManyArgs2.java b/lifecycle/lifecycle-compiler/src/tests/test-data/TooManyArgs2.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/TooManyArgs2.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/TooManyArgs2.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/DerivedFromJar1_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/DerivedFromJar1_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/DerivedFromJar1_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/DerivedFromJar1_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/DerivedFromJar_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/DerivedFromJar_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/DerivedFromJar_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/DerivedFromJar_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesBase1_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/DifferentPackagesBase1_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesBase1_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/DifferentPackagesBase1_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesBase2_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/DifferentPackagesBase2_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesBase2_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/DifferentPackagesBase2_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesDerived1_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/DifferentPackagesDerived1_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesDerived1_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/DifferentPackagesDerived1_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesDerived2_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/DifferentPackagesDerived2_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesDerived2_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/DifferentPackagesDerived2_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk2Base_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/InheritanceOk2Base_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/InheritanceOk2Base_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/InheritanceOk2Base_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk2Derived_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/InheritanceOk2Derived_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/InheritanceOk2Derived_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/InheritanceOk2Derived_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk3Base_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/InheritanceOk3Base_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/InheritanceOk3Base_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/InheritanceOk3Base_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk3Derived_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/InheritanceOk3Derived_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/InheritanceOk3Derived_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/InheritanceOk3Derived_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Base_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/InterfaceOk2Base_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Base_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/InterfaceOk2Base_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Derived_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/InterfaceOk2Derived_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Derived_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/InterfaceOk2Derived_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Interface_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/InterfaceOk2Interface_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Interface_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/InterfaceOk2Interface_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/ObserverNoAdapter_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/ObserverNoAdapter_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/ObserverNoAdapter_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/ObserverNoAdapter_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/OnAnyMethod_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/OnAnyMethod_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/OnAnyMethod_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/OnAnyMethod_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/license.txt b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/license.txt
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/license.txt
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/license.txt
diff --git a/lifecycle/compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver.java b/lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver.java
diff --git a/lifecycle/compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/lib/src/test/library/ObserverNoAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/ObserverNoAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/lib/src/test/library/ObserverNoAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/ObserverNoAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/lib/src/test/library/PPObserverNoAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/PPObserverNoAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/lib/src/test/library/PPObserverNoAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/PPObserverNoAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/lib/src/test/library/PPObserverWithAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/PPObserverWithAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/lib/src/test/library/PPObserverWithAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/PPObserverWithAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/lib/test-library.jar b/lifecycle/lifecycle-compiler/src/tests/test-data/lib/test-library.jar
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/lib/test-library.jar
rename to lifecycle/lifecycle-compiler/src/tests/test-data/lib/test-library.jar
Binary files differ
diff --git a/lifecycle/extensions/.gitignore b/lifecycle/lifecycle-extensions/.gitignore
similarity index 100%
rename from lifecycle/extensions/.gitignore
rename to lifecycle/lifecycle-extensions/.gitignore
diff --git a/lifecycle/extensions/api/2.0.0.txt b/lifecycle/lifecycle-extensions/api/2.0.0.txt
similarity index 100%
rename from lifecycle/extensions/api/2.0.0.txt
rename to lifecycle/lifecycle-extensions/api/2.0.0.txt
diff --git a/lifecycle/extensions/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-extensions/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/extensions/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-extensions/api/2.1.0-alpha01.txt
diff --git a/lifecycle/extensions/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-extensions/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/extensions/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-extensions/api/2.1.0-alpha02.txt
diff --git a/lifecycle/extensions/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-extensions/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/extensions/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-extensions/api/2.1.0-alpha03.txt
diff --git a/lifecycle/extensions/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-extensions/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/extensions/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-extensions/api/2.1.0-alpha04.txt
diff --git a/lifecycle/extensions/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-extensions/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/extensions/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-extensions/api/2.1.0-alpha05.txt
diff --git a/lifecycle/extensions/api/2.1.0-beta00.txt b/lifecycle/lifecycle-extensions/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/extensions/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-extensions/api/2.1.0-beta00.txt
diff --git a/lifecycle/extensions/api/2.1.0-beta01.txt b/lifecycle/lifecycle-extensions/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/extensions/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-extensions/api/2.1.0-beta01.txt
diff --git a/lifecycle/extensions/api/2.1.0-beta02.txt b/lifecycle/lifecycle-extensions/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/extensions/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-extensions/api/2.1.0-beta02.txt
diff --git a/lifecycle/extensions/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-extensions/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/extensions/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-extensions/api/2.2.0-alpha01.txt
diff --git a/lifecycle/extensions/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-extensions/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/extensions/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-extensions/api/2.2.0-alpha02.txt
diff --git a/lifecycle/extensions/api/current.txt b/lifecycle/lifecycle-extensions/api/current.txt
similarity index 100%
rename from lifecycle/extensions/api/current.txt
rename to lifecycle/lifecycle-extensions/api/current.txt
diff --git a/lifecycle/extensions/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-extensions/api/res-2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.1.0-alpha01.txt
rename to lifecycle/lifecycle-extensions/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/extensions/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-extensions/api/res-2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.1.0-alpha02.txt
rename to lifecycle/lifecycle-extensions/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/extensions/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-extensions/api/res-2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.1.0-alpha03.txt
rename to lifecycle/lifecycle-extensions/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/extensions/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-extensions/api/res-2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.1.0-alpha04.txt
rename to lifecycle/lifecycle-extensions/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/extensions/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-extensions/api/res-2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.1.0-alpha05.txt
rename to lifecycle/lifecycle-extensions/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/extensions/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-extensions/api/res-2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.1.0-beta00.txt
rename to lifecycle/lifecycle-extensions/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/extensions/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-extensions/api/res-2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.1.0-beta01.txt
rename to lifecycle/lifecycle-extensions/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/extensions/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-extensions/api/res-2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.1.0-beta02.txt
rename to lifecycle/lifecycle-extensions/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/extensions/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-extensions/api/res-2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.2.0-alpha01.txt
rename to lifecycle/lifecycle-extensions/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/extensions/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-extensions/api/res-2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.2.0-alpha02.txt
rename to lifecycle/lifecycle-extensions/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/extensions/api/restricted_2.0.0.txt b/lifecycle/lifecycle-extensions/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-extensions/api/restricted_2.0.0.txt
diff --git a/lifecycle/extensions/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-extensions/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-extensions/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/extensions/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-extensions/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-extensions/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/extensions/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-extensions/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-extensions/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/extensions/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-extensions/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-extensions/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/extensions/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-extensions/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-extensions/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/extensions/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-extensions/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-extensions/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/extensions/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-extensions/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-extensions/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/extensions/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-extensions/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-extensions/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/extensions/api/restricted_current.txt b/lifecycle/lifecycle-extensions/api/restricted_current.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_current.txt
rename to lifecycle/lifecycle-extensions/api/restricted_current.txt
diff --git a/lifecycle/extensions/api_legacy/1.0.0.ignore b/lifecycle/lifecycle-extensions/api_legacy/1.0.0.ignore
similarity index 100%
rename from lifecycle/extensions/api_legacy/1.0.0.ignore
rename to lifecycle/lifecycle-extensions/api_legacy/1.0.0.ignore
diff --git a/lifecycle/extensions/api_legacy/1.0.0.txt b/lifecycle/lifecycle-extensions/api_legacy/1.0.0.txt
similarity index 100%
rename from lifecycle/extensions/api_legacy/1.0.0.txt
rename to lifecycle/lifecycle-extensions/api_legacy/1.0.0.txt
diff --git a/lifecycle/extensions/api_legacy/1.1.0.txt b/lifecycle/lifecycle-extensions/api_legacy/1.1.0.txt
similarity index 100%
rename from lifecycle/extensions/api_legacy/1.1.0.txt
rename to lifecycle/lifecycle-extensions/api_legacy/1.1.0.txt
diff --git a/lifecycle/extensions/api_legacy/current.txt b/lifecycle/lifecycle-extensions/api_legacy/current.txt
similarity index 100%
rename from lifecycle/extensions/api_legacy/current.txt
rename to lifecycle/lifecycle-extensions/api_legacy/current.txt
diff --git a/lifecycle/extensions/build.gradle b/lifecycle/lifecycle-extensions/build.gradle
similarity index 100%
rename from lifecycle/extensions/build.gradle
rename to lifecycle/lifecycle-extensions/build.gradle
diff --git a/lifecycle/extensions/src/androidTest/AndroidManifest.xml b/lifecycle/lifecycle-extensions/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from lifecycle/extensions/src/androidTest/AndroidManifest.xml
rename to lifecycle/lifecycle-extensions/src/androidTest/AndroidManifest.xml
diff --git a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/EmptyActivity.java b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/EmptyActivity.java
similarity index 100%
rename from lifecycle/extensions/src/androidTest/java/androidx/lifecycle/EmptyActivity.java
rename to lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/EmptyActivity.java
diff --git a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/FragmentLifecycleInActivityTest.java b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/FragmentLifecycleInActivityTest.java
similarity index 100%
rename from lifecycle/extensions/src/androidTest/java/androidx/lifecycle/FragmentLifecycleInActivityTest.java
rename to lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/FragmentLifecycleInActivityTest.java
diff --git a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/FragmentOperationsLifecycleTest.java b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/FragmentOperationsLifecycleTest.java
similarity index 96%
rename from lifecycle/extensions/src/androidTest/java/androidx/lifecycle/FragmentOperationsLifecycleTest.java
rename to lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/FragmentOperationsLifecycleTest.java
index 55ae129..ca3a860 100644
--- a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/FragmentOperationsLifecycleTest.java
+++ b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/FragmentOperationsLifecycleTest.java
@@ -28,6 +28,7 @@
 
 import static java.util.Arrays.asList;
 
+import androidx.annotation.NonNull;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 import androidx.lifecycle.activity.EmptyActivity;
@@ -102,11 +103,11 @@
         return observer;
     }
 
-    private static class CollectingObserver implements LifecycleObserver {
+    private static class CollectingObserver implements LifecycleEventObserver {
         final List<Lifecycle.Event> mCollectedEvents = new ArrayList<>();
 
-        @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
-        public void anyEvent(LifecycleOwner owner, Lifecycle.Event event) {
+        @Override
+        public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
             mCollectedEvents.add(event);
         }
 
diff --git a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/ViewModelTest.java b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/ViewModelTest.java
similarity index 65%
rename from lifecycle/extensions/src/androidTest/java/androidx/lifecycle/ViewModelTest.java
rename to lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/ViewModelTest.java
index a263822..4e38fe6 100644
--- a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/ViewModelTest.java
+++ b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/ViewModelTest.java
@@ -16,8 +16,6 @@
 
 package androidx.lifecycle;
 
-import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
-
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.CoreMatchers.notNullValue;
@@ -25,6 +23,7 @@
 
 import android.app.Instrumentation;
 
+import androidx.annotation.NonNull;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentActivity;
 import androidx.fragment.app.FragmentManager;
@@ -62,46 +61,40 @@
         final TestViewModel[] fragment2Model = new TestViewModel[1];
         final ViewModelActivity[] viewModelActivity = new ViewModelActivity[1];
         viewModelActivity[0] = mActivityRule.getActivity();
-        mActivityRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                ViewModelFragment fragment1 = getFragment(viewModelActivity[0],
-                        ViewModelActivity.FRAGMENT_TAG_1);
-                ViewModelFragment fragment2 = getFragment(viewModelActivity[0],
-                        ViewModelActivity.FRAGMENT_TAG_2);
-                assertThat(fragment1, notNullValue());
-                assertThat(fragment2, notNullValue());
-                assertThat(fragment1.activityModel, is(fragment2.activityModel));
-                assertThat(fragment1.fragmentModel, not(is(fragment2.activityModel)));
-                assertThat(mActivityRule.getActivity().activityModel, is(fragment1.activityModel));
-                activityModel[0] = mActivityRule.getActivity().activityModel;
-                defaultActivityModel[0] = mActivityRule.getActivity().defaultActivityModel;
-                assertThat(defaultActivityModel[0], not(is(activityModel[0])));
-                fragment1Model[0] = fragment1.fragmentModel;
-                fragment2Model[0] = fragment2.fragmentModel;
-            }
+        mActivityRule.runOnUiThread(() -> {
+            ViewModelFragment fragment1 = getFragment(viewModelActivity[0],
+                    ViewModelActivity.FRAGMENT_TAG_1);
+            ViewModelFragment fragment2 = getFragment(viewModelActivity[0],
+                    ViewModelActivity.FRAGMENT_TAG_2);
+            assertThat(fragment1, notNullValue());
+            assertThat(fragment2, notNullValue());
+            assertThat(fragment1.activityModel, is(fragment2.activityModel));
+            assertThat(fragment1.fragmentModel, not(is(fragment2.activityModel)));
+            assertThat(mActivityRule.getActivity().activityModel, is(fragment1.activityModel));
+            activityModel[0] = mActivityRule.getActivity().activityModel;
+            defaultActivityModel[0] = mActivityRule.getActivity().defaultActivityModel;
+            assertThat(defaultActivityModel[0], not(is(activityModel[0])));
+            fragment1Model[0] = fragment1.fragmentModel;
+            fragment2Model[0] = fragment2.fragmentModel;
         });
         viewModelActivity[0] = recreateActivity();
-        mActivityRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                ViewModelFragment fragment1 = getFragment(viewModelActivity[0],
-                        ViewModelActivity.FRAGMENT_TAG_1);
-                ViewModelFragment fragment2 = getFragment(viewModelActivity[0],
-                        ViewModelActivity.FRAGMENT_TAG_2);
-                assertThat(fragment1, notNullValue());
-                assertThat(fragment2, notNullValue());
+        mActivityRule.runOnUiThread(() -> {
+            ViewModelFragment fragment1 = getFragment(viewModelActivity[0],
+                    ViewModelActivity.FRAGMENT_TAG_1);
+            ViewModelFragment fragment2 = getFragment(viewModelActivity[0],
+                    ViewModelActivity.FRAGMENT_TAG_2);
+            assertThat(fragment1, notNullValue());
+            assertThat(fragment2, notNullValue());
 
-                assertThat(fragment1.activityModel, is(activityModel[0]));
-                assertThat(fragment2.activityModel, is(activityModel[0]));
-                assertThat(fragment1.fragmentModel, is(fragment1Model[0]));
-                assertThat(fragment2.fragmentModel, is(fragment2Model[0]));
-                assertThat(fragment1.defaultActivityModel, is(defaultActivityModel[0]));
-                assertThat(fragment2.defaultActivityModel, is(defaultActivityModel[0]));
-                assertThat(mActivityRule.getActivity().activityModel, is(activityModel[0]));
-                assertThat(mActivityRule.getActivity().defaultActivityModel,
-                        is(defaultActivityModel[0]));
-            }
+            assertThat(fragment1.activityModel, is(activityModel[0]));
+            assertThat(fragment2.activityModel, is(activityModel[0]));
+            assertThat(fragment1.fragmentModel, is(fragment1Model[0]));
+            assertThat(fragment2.fragmentModel, is(fragment2Model[0]));
+            assertThat(fragment1.defaultActivityModel, is(defaultActivityModel[0]));
+            assertThat(fragment2.defaultActivityModel, is(defaultActivityModel[0]));
+            assertThat(mActivityRule.getActivity().activityModel, is(activityModel[0]));
+            assertThat(mActivityRule.getActivity().defaultActivityModel,
+                    is(defaultActivityModel[0]));
         });
     }
 
@@ -117,10 +110,9 @@
     public void testOnClear() throws Throwable {
         final ViewModelActivity activity = mActivityRule.getActivity();
         final CountDownLatch latch = new CountDownLatch(1);
-        final LifecycleObserver observer = new LifecycleObserver() {
-            @SuppressWarnings("unused")
-            @OnLifecycleEvent(ON_RESUME)
-            void onResume() {
+        final LifecycleObserver observer = new DefaultLifecycleObserver() {
+            @Override
+            public void onResume(@NonNull LifecycleOwner owner) {
                 try {
                     final FragmentManager manager = activity.getSupportFragmentManager();
                     Fragment fragment = new Fragment();
@@ -135,12 +127,7 @@
             }
         };
 
-        mActivityRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                activity.getLifecycle().addObserver(observer);
-            }
-        });
+        mActivityRule.runOnUiThread(() -> activity.getLifecycle().addObserver(observer));
         assertThat(latch.await(TIMEOUT, TimeUnit.SECONDS), is(true));
     }
 
@@ -155,12 +142,7 @@
         Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
         instrumentation.addMonitor(monitor);
         final ViewModelActivity previous = mActivityRule.getActivity();
-        mActivityRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                previous.recreate();
-            }
-        });
+        mActivityRule.runOnUiThread(() -> previous.recreate());
         ViewModelActivity result;
 
         // this guarantee that we will reinstall monitor between notifications about onDestroy
diff --git a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/ViewModelTestInTransaction.java b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/ViewModelTestInTransaction.java
similarity index 100%
rename from lifecycle/extensions/src/androidTest/java/androidx/lifecycle/ViewModelTestInTransaction.java
rename to lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/ViewModelTestInTransaction.java
diff --git a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/activity/EmptyActivity.java b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/activity/EmptyActivity.java
similarity index 100%
rename from lifecycle/extensions/src/androidTest/java/androidx/lifecycle/activity/EmptyActivity.java
rename to lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/activity/EmptyActivity.java
diff --git a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/activity/FragmentLifecycleActivity.java b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/activity/FragmentLifecycleActivity.java
similarity index 88%
rename from lifecycle/extensions/src/androidTest/java/androidx/lifecycle/activity/FragmentLifecycleActivity.java
rename to lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/activity/FragmentLifecycleActivity.java
index 597111d..caf1a05 100644
--- a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/activity/FragmentLifecycleActivity.java
+++ b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/activity/FragmentLifecycleActivity.java
@@ -24,9 +24,8 @@
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.fragment.app.Fragment;
 import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.LifecycleEventObserver;
 import androidx.lifecycle.LifecycleOwner;
-import androidx.lifecycle.OnLifecycleEvent;
 import androidx.lifecycle.extensions.test.R;
 
 import java.util.ArrayList;
@@ -41,7 +40,7 @@
     private static final String EXTRA_NESTED = "nested";
 
     private final List<Lifecycle.Event> mLoggedEvents = Collections
-            .synchronizedList(new ArrayList<Lifecycle.Event>());
+            .synchronizedList(new ArrayList<>());
     private LifecycleOwner mObservedOwner;
     private final CountDownLatch mDestroyLatch = new CountDownLatch(1);
 
@@ -97,13 +96,8 @@
 
     public void observe(LifecycleOwner provider) {
         mObservedOwner = provider;
-        provider.getLifecycle().addObserver(new LifecycleObserver() {
-            @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
-            public void anyEvent(@SuppressWarnings("unused") LifecycleOwner owner,
-                    Lifecycle.Event event) {
-                mLoggedEvents.add(event);
-            }
-        });
+        provider.getLifecycle().addObserver(
+                (LifecycleEventObserver) (source, event) -> mLoggedEvents.add(event));
     }
 
     public List<Lifecycle.Event> getLoggedEvents() {
diff --git a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/viewmodeltest/TestViewModel.java b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/viewmodeltest/TestViewModel.java
similarity index 100%
rename from lifecycle/extensions/src/androidTest/java/androidx/lifecycle/viewmodeltest/TestViewModel.java
rename to lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/viewmodeltest/TestViewModel.java
diff --git a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/viewmodeltest/ViewModelActivity.java b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/viewmodeltest/ViewModelActivity.java
similarity index 100%
rename from lifecycle/extensions/src/androidTest/java/androidx/lifecycle/viewmodeltest/ViewModelActivity.java
rename to lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/viewmodeltest/ViewModelActivity.java
diff --git a/lifecycle/extensions/src/androidTest/res/layout/activity_main.xml b/lifecycle/lifecycle-extensions/src/androidTest/res/layout/activity_main.xml
similarity index 100%
rename from lifecycle/extensions/src/androidTest/res/layout/activity_main.xml
rename to lifecycle/lifecycle-extensions/src/androidTest/res/layout/activity_main.xml
diff --git a/lifecycle/extensions/src/androidTest/res/layout/activity_view_model.xml b/lifecycle/lifecycle-extensions/src/androidTest/res/layout/activity_view_model.xml
similarity index 100%
rename from lifecycle/extensions/src/androidTest/res/layout/activity_view_model.xml
rename to lifecycle/lifecycle-extensions/src/androidTest/res/layout/activity_view_model.xml
diff --git a/lifecycle/extensions/src/main/AndroidManifest.xml b/lifecycle/lifecycle-extensions/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/extensions/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-extensions/src/main/AndroidManifest.xml
diff --git a/lifecycle/extensions/src/main/java/androidx/lifecycle/ViewModelProviders.java b/lifecycle/lifecycle-extensions/src/main/java/androidx/lifecycle/ViewModelProviders.java
similarity index 100%
rename from lifecycle/extensions/src/main/java/androidx/lifecycle/ViewModelProviders.java
rename to lifecycle/lifecycle-extensions/src/main/java/androidx/lifecycle/ViewModelProviders.java
diff --git a/lifecycle/extensions/src/main/java/androidx/lifecycle/ViewModelStores.java b/lifecycle/lifecycle-extensions/src/main/java/androidx/lifecycle/ViewModelStores.java
similarity index 100%
rename from lifecycle/extensions/src/main/java/androidx/lifecycle/ViewModelStores.java
rename to lifecycle/lifecycle-extensions/src/main/java/androidx/lifecycle/ViewModelStores.java
diff --git a/lifecycle/extensions/src/test/java/androidx/lifecycle/ViewModelProvidersTest.java b/lifecycle/lifecycle-extensions/src/test/java/androidx/lifecycle/ViewModelProvidersTest.java
similarity index 100%
rename from lifecycle/extensions/src/test/java/androidx/lifecycle/ViewModelProvidersTest.java
rename to lifecycle/lifecycle-extensions/src/test/java/androidx/lifecycle/ViewModelProvidersTest.java
diff --git a/lifecycle/livedata-core/ktx/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.1.0-beta00.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.1.0-beta01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.1.0-beta02.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/current.txt b/lifecycle/lifecycle-livedata-core-ktx/api/current.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/current.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/current.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha01.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha02.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha03.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha03.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha04.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha04.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha05.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha05.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-beta00.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-beta00.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-beta01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-beta01.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-beta02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-beta02.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.2.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-alpha03.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha03.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-alpha04.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha04.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-alpha05.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha05.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-beta00.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta00.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-beta01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta01.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-beta02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta02.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.2.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.2.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_current.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_current.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_current.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/restricted_current.txt
diff --git a/lifecycle/livedata-core/ktx/build.gradle b/lifecycle/lifecycle-livedata-core-ktx/build.gradle
similarity index 100%
rename from lifecycle/livedata-core/ktx/build.gradle
rename to lifecycle/lifecycle-livedata-core-ktx/build.gradle
diff --git a/lifecycle/livedata-core/ktx/src/main/AndroidManifest.xml b/lifecycle/lifecycle-livedata-core-ktx/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/livedata-core/ktx/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-livedata-core-ktx/src/main/AndroidManifest.xml
diff --git a/lifecycle/livedata-core/ktx/src/main/java/androidx/lifecycle/LiveData.kt b/lifecycle/lifecycle-livedata-core-ktx/src/main/java/androidx/lifecycle/LiveData.kt
similarity index 100%
rename from lifecycle/livedata-core/ktx/src/main/java/androidx/lifecycle/LiveData.kt
rename to lifecycle/lifecycle-livedata-core-ktx/src/main/java/androidx/lifecycle/LiveData.kt
diff --git a/lifecycle/livedata-core/ktx/src/test/java/androidx/lifecycle/LiveDataTest.kt b/lifecycle/lifecycle-livedata-core-ktx/src/test/java/androidx/lifecycle/LiveDataTest.kt
similarity index 100%
rename from lifecycle/livedata-core/ktx/src/test/java/androidx/lifecycle/LiveDataTest.kt
rename to lifecycle/lifecycle-livedata-core-ktx/src/test/java/androidx/lifecycle/LiveDataTest.kt
diff --git a/lifecycle/livedata-core/api/2.0.0.txt b/lifecycle/lifecycle-livedata-core/api/2.0.0.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.0.0.txt
rename to lifecycle/lifecycle-livedata-core/api/2.0.0.txt
diff --git a/lifecycle/livedata-core/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-livedata-core/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-core/api/2.1.0-alpha01.txt
diff --git a/lifecycle/livedata-core/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-livedata-core/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-core/api/2.1.0-alpha02.txt
diff --git a/lifecycle/livedata-core/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata-core/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata-core/api/2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata-core/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata-core/api/2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata-core/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata-core/api/2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/api/2.1.0-beta00.txt b/lifecycle/lifecycle-livedata-core/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata-core/api/2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/api/2.1.0-beta01.txt b/lifecycle/lifecycle-livedata-core/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata-core/api/2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/api/2.1.0-beta02.txt b/lifecycle/lifecycle-livedata-core/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata-core/api/2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata-core/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-core/api/2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata-core/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-core/api/2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/api/current.txt b/lifecycle/lifecycle-livedata-core/api/current.txt
similarity index 100%
rename from lifecycle/livedata-core/api/current.txt
rename to lifecycle/lifecycle-livedata-core/api/current.txt
diff --git a/lifecycle/livedata-core/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.1.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/livedata-core/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.1.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/livedata-core/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-livedata-core/api/res-2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-livedata-core/api/res-2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-livedata-core/api/res-2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata-core/api/res-2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata-core/api/res-2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.0.0.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_2.0.0.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/api/restricted_current.txt b/lifecycle/lifecycle-livedata-core/api/restricted_current.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_current.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_current.txt
diff --git a/lifecycle/livedata-core/api_legacy/1.1.0.txt b/lifecycle/lifecycle-livedata-core/api_legacy/1.1.0.txt
similarity index 100%
rename from lifecycle/livedata-core/api_legacy/1.1.0.txt
rename to lifecycle/lifecycle-livedata-core/api_legacy/1.1.0.txt
diff --git a/lifecycle/livedata-core/api_legacy/current.txt b/lifecycle/lifecycle-livedata-core/api_legacy/current.txt
similarity index 100%
rename from lifecycle/livedata-core/api_legacy/current.txt
rename to lifecycle/lifecycle-livedata-core/api_legacy/current.txt
diff --git a/lifecycle/livedata-core/build.gradle b/lifecycle/lifecycle-livedata-core/build.gradle
similarity index 100%
rename from lifecycle/livedata-core/build.gradle
rename to lifecycle/lifecycle-livedata-core/build.gradle
diff --git a/lifecycle/livedata-core/src/main/AndroidManifest.xml b/lifecycle/lifecycle-livedata-core/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/livedata-core/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-livedata-core/src/main/AndroidManifest.xml
diff --git a/lifecycle/livedata-core/src/main/java/androidx/lifecycle/LiveData.java b/lifecycle/lifecycle-livedata-core/src/main/java/androidx/lifecycle/LiveData.java
similarity index 100%
rename from lifecycle/livedata-core/src/main/java/androidx/lifecycle/LiveData.java
rename to lifecycle/lifecycle-livedata-core/src/main/java/androidx/lifecycle/LiveData.java
diff --git a/lifecycle/livedata-core/src/main/java/androidx/lifecycle/MutableLiveData.java b/lifecycle/lifecycle-livedata-core/src/main/java/androidx/lifecycle/MutableLiveData.java
similarity index 100%
rename from lifecycle/livedata-core/src/main/java/androidx/lifecycle/MutableLiveData.java
rename to lifecycle/lifecycle-livedata-core/src/main/java/androidx/lifecycle/MutableLiveData.java
diff --git a/lifecycle/livedata-core/src/main/java/androidx/lifecycle/Observer.java b/lifecycle/lifecycle-livedata-core/src/main/java/androidx/lifecycle/Observer.java
similarity index 100%
rename from lifecycle/livedata-core/src/main/java/androidx/lifecycle/Observer.java
rename to lifecycle/lifecycle-livedata-core/src/main/java/androidx/lifecycle/Observer.java
diff --git a/lifecycle/livedata-core/src/test/java/androidx/lifecycle/LiveDataTest.java b/lifecycle/lifecycle-livedata-core/src/test/java/androidx/lifecycle/LiveDataTest.java
similarity index 99%
rename from lifecycle/livedata-core/src/test/java/androidx/lifecycle/LiveDataTest.java
rename to lifecycle/lifecycle-livedata-core/src/test/java/androidx/lifecycle/LiveDataTest.java
index f57d864..8098459 100644
--- a/lifecycle/livedata-core/src/test/java/androidx/lifecycle/LiveDataTest.java
+++ b/lifecycle/lifecycle-livedata-core/src/test/java/androidx/lifecycle/LiveDataTest.java
@@ -37,6 +37,7 @@
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.arch.core.executor.ArchTaskExecutor;
 import androidx.arch.core.executor.testing.InstantTaskExecutorRule;
@@ -420,9 +421,9 @@
     @Test
     public void testDataChangeDuringStateChange() {
         mRegistry.handleLifecycleEvent(ON_START);
-        mRegistry.addObserver(new LifecycleObserver() {
-            @OnLifecycleEvent(ON_STOP)
-            public void onStop() {
+        mRegistry.addObserver(new DefaultLifecycleObserver() {
+            @Override
+            public void onStop(@NonNull LifecycleOwner owner) {
                 // change data in onStop, observer should not be called!
                 mLiveData.setValue("b");
             }
diff --git a/lifecycle/livedata-core/src/test/java/androidx/lifecycle/ThreadedLiveDataTest.java b/lifecycle/lifecycle-livedata-core/src/test/java/androidx/lifecycle/ThreadedLiveDataTest.java
similarity index 100%
rename from lifecycle/livedata-core/src/test/java/androidx/lifecycle/ThreadedLiveDataTest.java
rename to lifecycle/lifecycle-livedata-core/src/test/java/androidx/lifecycle/ThreadedLiveDataTest.java
diff --git a/lifecycle/livedata/ktx/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha01.txt
diff --git a/lifecycle/livedata/ktx/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha02.txt
diff --git a/lifecycle/livedata/ktx/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha03.txt
diff --git a/lifecycle/livedata/ktx/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha04.txt
diff --git a/lifecycle/livedata/ktx/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha05.txt
diff --git a/lifecycle/livedata/ktx/api/2.1.0-beta00.txt b/lifecycle/lifecycle-livedata-ktx/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.1.0-beta00.txt
diff --git a/lifecycle/livedata/ktx/api/2.1.0-beta01.txt b/lifecycle/lifecycle-livedata-ktx/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.1.0-beta01.txt
diff --git a/lifecycle/livedata/ktx/api/2.1.0-beta02.txt b/lifecycle/lifecycle-livedata-ktx/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.1.0-beta02.txt
diff --git a/lifecycle/livedata/ktx/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata-ktx/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.2.0-alpha01.txt
diff --git a/lifecycle/livedata/ktx/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata-ktx/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.2.0-alpha02.txt
diff --git a/lifecycle/livedata/ktx/api/current.txt b/lifecycle/lifecycle-livedata-ktx/api/current.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/current.txt
rename to lifecycle/lifecycle-livedata-ktx/api/current.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-ktx/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-ktx/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_current.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_current.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/restricted_current.txt
rename to lifecycle/lifecycle-livedata-ktx/api/restricted_current.txt
diff --git a/lifecycle/livedata/ktx/build.gradle b/lifecycle/lifecycle-livedata-ktx/build.gradle
similarity index 100%
rename from lifecycle/livedata/ktx/build.gradle
rename to lifecycle/lifecycle-livedata-ktx/build.gradle
diff --git a/lifecycle/livedata/ktx/src/main/AndroidManifest.xml b/lifecycle/lifecycle-livedata-ktx/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/livedata/ktx/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-livedata-ktx/src/main/AndroidManifest.xml
diff --git a/lifecycle/livedata/ktx/src/main/java/androidx/lifecycle/CoroutineLiveData.kt b/lifecycle/lifecycle-livedata-ktx/src/main/java/androidx/lifecycle/CoroutineLiveData.kt
similarity index 100%
rename from lifecycle/livedata/ktx/src/main/java/androidx/lifecycle/CoroutineLiveData.kt
rename to lifecycle/lifecycle-livedata-ktx/src/main/java/androidx/lifecycle/CoroutineLiveData.kt
diff --git a/lifecycle/livedata/ktx/src/main/java/androidx/lifecycle/CoroutineLiveDataApi26.kt b/lifecycle/lifecycle-livedata-ktx/src/main/java/androidx/lifecycle/CoroutineLiveDataApi26.kt
similarity index 100%
rename from lifecycle/livedata/ktx/src/main/java/androidx/lifecycle/CoroutineLiveDataApi26.kt
rename to lifecycle/lifecycle-livedata-ktx/src/main/java/androidx/lifecycle/CoroutineLiveDataApi26.kt
diff --git a/lifecycle/livedata/ktx/src/main/java/androidx/lifecycle/Transformations.kt b/lifecycle/lifecycle-livedata-ktx/src/main/java/androidx/lifecycle/Transformations.kt
similarity index 100%
rename from lifecycle/livedata/ktx/src/main/java/androidx/lifecycle/Transformations.kt
rename to lifecycle/lifecycle-livedata-ktx/src/main/java/androidx/lifecycle/Transformations.kt
diff --git a/lifecycle/livedata/ktx/src/test/java/androidx/lifecycle/BuildLiveDataTest.kt b/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/BuildLiveDataTest.kt
similarity index 100%
rename from lifecycle/livedata/ktx/src/test/java/androidx/lifecycle/BuildLiveDataTest.kt
rename to lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/BuildLiveDataTest.kt
diff --git a/lifecycle/livedata/ktx/src/test/java/androidx/lifecycle/TransformationsTest.kt b/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/TransformationsTest.kt
similarity index 100%
rename from lifecycle/livedata/ktx/src/test/java/androidx/lifecycle/TransformationsTest.kt
rename to lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/TransformationsTest.kt
diff --git a/lifecycle/livedata/api/2.0.0.txt b/lifecycle/lifecycle-livedata/api/2.0.0.txt
similarity index 100%
rename from lifecycle/livedata/api/2.0.0.txt
rename to lifecycle/lifecycle-livedata/api/2.0.0.txt
diff --git a/lifecycle/livedata/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-livedata/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-livedata/api/2.1.0-alpha01.txt
diff --git a/lifecycle/livedata/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-livedata/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-livedata/api/2.1.0-alpha02.txt
diff --git a/lifecycle/livedata/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata/api/2.1.0-alpha03.txt
diff --git a/lifecycle/livedata/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata/api/2.1.0-alpha04.txt
diff --git a/lifecycle/livedata/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata/api/2.1.0-alpha05.txt
diff --git a/lifecycle/livedata/api/2.1.0-beta00.txt b/lifecycle/lifecycle-livedata/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata/api/2.1.0-beta00.txt
diff --git a/lifecycle/livedata/api/2.1.0-beta01.txt b/lifecycle/lifecycle-livedata/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata/api/2.1.0-beta01.txt
diff --git a/lifecycle/livedata/api/2.1.0-beta02.txt b/lifecycle/lifecycle-livedata/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata/api/2.1.0-beta02.txt
diff --git a/lifecycle/livedata/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata/api/2.2.0-alpha01.txt
diff --git a/lifecycle/livedata/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata/api/2.2.0-alpha02.txt
diff --git a/lifecycle/livedata/api/current.txt b/lifecycle/lifecycle-livedata/api/current.txt
similarity index 100%
rename from lifecycle/livedata/api/current.txt
rename to lifecycle/lifecycle-livedata/api/current.txt
diff --git a/lifecycle/livedata/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-livedata/api/res-2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.1.0-alpha01.txt
rename to lifecycle/lifecycle-livedata/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/livedata/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-livedata/api/res-2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.1.0-alpha02.txt
rename to lifecycle/lifecycle-livedata/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/livedata/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata/api/res-2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/livedata/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata/api/res-2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/livedata/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata/api/res-2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/livedata/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-livedata/api/res-2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/livedata/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-livedata/api/res-2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/livedata/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-livedata/api/res-2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/livedata/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata/api/res-2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/livedata/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata/api/res-2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/livedata/api/restricted_2.0.0.txt b/lifecycle/lifecycle-livedata/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-livedata/api/restricted_2.0.0.txt
diff --git a/lifecycle/livedata/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/livedata/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/livedata/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/livedata/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-livedata/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/livedata/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-livedata/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/livedata/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-livedata/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/livedata/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/livedata/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/livedata/api/restricted_current.txt b/lifecycle/lifecycle-livedata/api/restricted_current.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_current.txt
rename to lifecycle/lifecycle-livedata/api/restricted_current.txt
diff --git a/lifecycle/livedata/api_legacy/1.1.0.txt b/lifecycle/lifecycle-livedata/api_legacy/1.1.0.txt
similarity index 100%
rename from lifecycle/livedata/api_legacy/1.1.0.txt
rename to lifecycle/lifecycle-livedata/api_legacy/1.1.0.txt
diff --git a/lifecycle/livedata/api_legacy/current.txt b/lifecycle/lifecycle-livedata/api_legacy/current.txt
similarity index 100%
rename from lifecycle/livedata/api_legacy/current.txt
rename to lifecycle/lifecycle-livedata/api_legacy/current.txt
diff --git a/lifecycle/livedata/build.gradle b/lifecycle/lifecycle-livedata/build.gradle
similarity index 100%
rename from lifecycle/livedata/build.gradle
rename to lifecycle/lifecycle-livedata/build.gradle
diff --git a/lifecycle/livedata/eap/api/current.txt b/lifecycle/lifecycle-livedata/eap/api/current.txt
similarity index 100%
rename from lifecycle/livedata/eap/api/current.txt
rename to lifecycle/lifecycle-livedata/eap/api/current.txt
diff --git a/lifecycle/livedata/src/main/AndroidManifest.xml b/lifecycle/lifecycle-livedata/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/livedata/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-livedata/src/main/AndroidManifest.xml
diff --git a/lifecycle/livedata/src/main/java/androidx/lifecycle/ComputableLiveData.java b/lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/ComputableLiveData.java
similarity index 100%
rename from lifecycle/livedata/src/main/java/androidx/lifecycle/ComputableLiveData.java
rename to lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/ComputableLiveData.java
diff --git a/lifecycle/livedata/src/main/java/androidx/lifecycle/MediatorLiveData.java b/lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/MediatorLiveData.java
similarity index 100%
rename from lifecycle/livedata/src/main/java/androidx/lifecycle/MediatorLiveData.java
rename to lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/MediatorLiveData.java
diff --git a/lifecycle/livedata/src/main/java/androidx/lifecycle/Transformations.java b/lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/Transformations.java
similarity index 100%
rename from lifecycle/livedata/src/main/java/androidx/lifecycle/Transformations.java
rename to lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/Transformations.java
diff --git a/lifecycle/livedata/src/test/java/androidx/lifecycle/ComputableLiveDataTest.java b/lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/ComputableLiveDataTest.java
similarity index 100%
rename from lifecycle/livedata/src/test/java/androidx/lifecycle/ComputableLiveDataTest.java
rename to lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/ComputableLiveDataTest.java
diff --git a/lifecycle/livedata/src/test/java/androidx/lifecycle/MediatorLiveDataTest.java b/lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/MediatorLiveDataTest.java
similarity index 100%
rename from lifecycle/livedata/src/test/java/androidx/lifecycle/MediatorLiveDataTest.java
rename to lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/MediatorLiveDataTest.java
diff --git a/lifecycle/livedata/src/test/java/androidx/lifecycle/TransformationsTest.java b/lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/TransformationsTest.java
similarity index 100%
rename from lifecycle/livedata/src/test/java/androidx/lifecycle/TransformationsTest.java
rename to lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/TransformationsTest.java
diff --git a/lifecycle/livedata/src/test/java/androidx/lifecycle/util/InstantTaskExecutor.java b/lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/util/InstantTaskExecutor.java
similarity index 100%
rename from lifecycle/livedata/src/test/java/androidx/lifecycle/util/InstantTaskExecutor.java
rename to lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/util/InstantTaskExecutor.java
diff --git a/lifecycle/process/.gitignore b/lifecycle/lifecycle-process/.gitignore
similarity index 100%
rename from lifecycle/process/.gitignore
rename to lifecycle/lifecycle-process/.gitignore
diff --git a/lifecycle/process/api/2.0.0.txt b/lifecycle/lifecycle-process/api/2.0.0.txt
similarity index 100%
rename from lifecycle/process/api/2.0.0.txt
rename to lifecycle/lifecycle-process/api/2.0.0.txt
diff --git a/lifecycle/process/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-process/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/process/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-process/api/2.1.0-alpha01.txt
diff --git a/lifecycle/process/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-process/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/process/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-process/api/2.1.0-alpha02.txt
diff --git a/lifecycle/process/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-process/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/process/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-process/api/2.1.0-alpha03.txt
diff --git a/lifecycle/process/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-process/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/process/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-process/api/2.1.0-alpha04.txt
diff --git a/lifecycle/process/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-process/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/process/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-process/api/2.1.0-alpha05.txt
diff --git a/lifecycle/process/api/2.1.0-beta00.txt b/lifecycle/lifecycle-process/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/process/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-process/api/2.1.0-beta00.txt
diff --git a/lifecycle/process/api/2.1.0-beta01.txt b/lifecycle/lifecycle-process/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/process/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-process/api/2.1.0-beta01.txt
diff --git a/lifecycle/process/api/2.1.0-beta02.txt b/lifecycle/lifecycle-process/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/process/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-process/api/2.1.0-beta02.txt
diff --git a/lifecycle/process/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-process/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/process/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-process/api/2.2.0-alpha01.txt
diff --git a/lifecycle/process/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-process/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/process/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-process/api/2.2.0-alpha02.txt
diff --git a/lifecycle/process/api/current.txt b/lifecycle/lifecycle-process/api/current.txt
similarity index 100%
rename from lifecycle/process/api/current.txt
rename to lifecycle/lifecycle-process/api/current.txt
diff --git a/lifecycle/process/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-process/api/res-2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/process/api/res-2.1.0-alpha01.txt
rename to lifecycle/lifecycle-process/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/process/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-process/api/res-2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/process/api/res-2.1.0-alpha02.txt
rename to lifecycle/lifecycle-process/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/process/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-process/api/res-2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/process/api/res-2.1.0-alpha03.txt
rename to lifecycle/lifecycle-process/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/process/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-process/api/res-2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/process/api/res-2.1.0-alpha04.txt
rename to lifecycle/lifecycle-process/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/process/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-process/api/res-2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/process/api/res-2.1.0-alpha05.txt
rename to lifecycle/lifecycle-process/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/process/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-process/api/res-2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/process/api/res-2.1.0-beta00.txt
rename to lifecycle/lifecycle-process/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/process/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-process/api/res-2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/process/api/res-2.1.0-beta01.txt
rename to lifecycle/lifecycle-process/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/process/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-process/api/res-2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/process/api/res-2.1.0-beta02.txt
rename to lifecycle/lifecycle-process/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/process/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-process/api/res-2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/process/api/res-2.2.0-alpha01.txt
rename to lifecycle/lifecycle-process/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/process/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-process/api/res-2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/process/api/res-2.2.0-alpha02.txt
rename to lifecycle/lifecycle-process/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/process/api/restricted_2.0.0.txt b/lifecycle/lifecycle-process/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/process/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-process/api/restricted_2.0.0.txt
diff --git a/lifecycle/process/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-process/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/process/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-process/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/process/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-process/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/process/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-process/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/process/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-process/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/process/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-process/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/process/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-process/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/process/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-process/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/process/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-process/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/process/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-process/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/process/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-process/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/process/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-process/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/process/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-process/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/process/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-process/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/process/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-process/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/process/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-process/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/process/api/restricted_current.txt b/lifecycle/lifecycle-process/api/restricted_current.txt
similarity index 100%
rename from lifecycle/process/api/restricted_current.txt
rename to lifecycle/lifecycle-process/api/restricted_current.txt
diff --git a/lifecycle/process/api_legacy/current.txt b/lifecycle/lifecycle-process/api_legacy/current.txt
similarity index 100%
rename from lifecycle/process/api_legacy/current.txt
rename to lifecycle/lifecycle-process/api_legacy/current.txt
diff --git a/lifecycle/process/build.gradle b/lifecycle/lifecycle-process/build.gradle
similarity index 100%
rename from lifecycle/process/build.gradle
rename to lifecycle/lifecycle-process/build.gradle
diff --git a/lifecycle/process/src/main/AndroidManifest.xml b/lifecycle/lifecycle-process/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/process/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-process/src/main/AndroidManifest.xml
diff --git a/lifecycle/process/src/main/java/androidx/lifecycle/EmptyActivityLifecycleCallbacks.java b/lifecycle/lifecycle-process/src/main/java/androidx/lifecycle/EmptyActivityLifecycleCallbacks.java
similarity index 100%
rename from lifecycle/process/src/main/java/androidx/lifecycle/EmptyActivityLifecycleCallbacks.java
rename to lifecycle/lifecycle-process/src/main/java/androidx/lifecycle/EmptyActivityLifecycleCallbacks.java
diff --git a/lifecycle/process/src/main/java/androidx/lifecycle/LifecycleDispatcher.java b/lifecycle/lifecycle-process/src/main/java/androidx/lifecycle/LifecycleDispatcher.java
similarity index 100%
rename from lifecycle/process/src/main/java/androidx/lifecycle/LifecycleDispatcher.java
rename to lifecycle/lifecycle-process/src/main/java/androidx/lifecycle/LifecycleDispatcher.java
diff --git a/lifecycle/process/src/main/java/androidx/lifecycle/ProcessLifecycleOwner.java b/lifecycle/lifecycle-process/src/main/java/androidx/lifecycle/ProcessLifecycleOwner.java
similarity index 100%
rename from lifecycle/process/src/main/java/androidx/lifecycle/ProcessLifecycleOwner.java
rename to lifecycle/lifecycle-process/src/main/java/androidx/lifecycle/ProcessLifecycleOwner.java
diff --git a/lifecycle/process/src/main/java/androidx/lifecycle/ProcessLifecycleOwnerInitializer.java b/lifecycle/lifecycle-process/src/main/java/androidx/lifecycle/ProcessLifecycleOwnerInitializer.java
similarity index 100%
rename from lifecycle/process/src/main/java/androidx/lifecycle/ProcessLifecycleOwnerInitializer.java
rename to lifecycle/lifecycle-process/src/main/java/androidx/lifecycle/ProcessLifecycleOwnerInitializer.java
diff --git a/lifecycle/process/src/test/java/androidx/lifecycle/DispatcherActivityCallbackTest.java b/lifecycle/lifecycle-process/src/test/java/androidx/lifecycle/DispatcherActivityCallbackTest.java
similarity index 100%
rename from lifecycle/process/src/test/java/androidx/lifecycle/DispatcherActivityCallbackTest.java
rename to lifecycle/lifecycle-process/src/test/java/androidx/lifecycle/DispatcherActivityCallbackTest.java
diff --git a/lifecycle/reactivestreams/ktx/OWNERS b/lifecycle/lifecycle-reactivestreams-ktx/OWNERS
similarity index 100%
rename from lifecycle/reactivestreams/ktx/OWNERS
rename to lifecycle/lifecycle-reactivestreams-ktx/OWNERS
diff --git a/lifecycle/reactivestreams/ktx/api/2.0.0.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.0.0.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.0.0.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.0.0.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha01.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha02.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha03.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha04.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha05.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.1.0-beta00.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-beta00.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.1.0-beta01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-beta01.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.1.0-beta02.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-beta02.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.2.0-alpha01.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.2.0-alpha02.txt
diff --git a/lifecycle/reactivestreams/ktx/api/current.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/current.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/current.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/current.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha01.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha02.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha03.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha03.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha04.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha04.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha05.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha05.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-beta00.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-beta00.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-beta01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-beta01.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-beta02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-beta02.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.2.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_2.0.0.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.0.0.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-alpha03.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha03.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-alpha04.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha04.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-alpha05.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha05.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-beta00.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta00.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-beta01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta01.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-beta02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta02.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.2.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.2.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_current.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_current.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_current.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_current.txt
diff --git a/lifecycle/reactivestreams/ktx/build.gradle b/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
similarity index 100%
rename from lifecycle/reactivestreams/ktx/build.gradle
rename to lifecycle/lifecycle-reactivestreams-ktx/build.gradle
diff --git a/lifecycle/reactivestreams/ktx/src/main/AndroidManifest.xml b/lifecycle/lifecycle-reactivestreams-ktx/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/reactivestreams/ktx/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-reactivestreams-ktx/src/main/AndroidManifest.xml
diff --git a/lifecycle/reactivestreams/ktx/src/main/java/androidx/lifecycle/LiveDataReactiveSteams.kt b/lifecycle/lifecycle-reactivestreams-ktx/src/main/java/androidx/lifecycle/LiveDataReactiveSteams.kt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/src/main/java/androidx/lifecycle/LiveDataReactiveSteams.kt
rename to lifecycle/lifecycle-reactivestreams-ktx/src/main/java/androidx/lifecycle/LiveDataReactiveSteams.kt
diff --git a/lifecycle/reactivestreams/ktx/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.kt b/lifecycle/lifecycle-reactivestreams-ktx/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.kt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.kt
rename to lifecycle/lifecycle-reactivestreams-ktx/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.kt
diff --git a/lifecycle/reactivestreams/.gitignore b/lifecycle/lifecycle-reactivestreams/.gitignore
similarity index 100%
rename from lifecycle/reactivestreams/.gitignore
rename to lifecycle/lifecycle-reactivestreams/.gitignore
diff --git a/lifecycle/reactivestreams/api/2.0.0.txt b/lifecycle/lifecycle-reactivestreams/api/2.0.0.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.0.0.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.0.0.txt
diff --git a/lifecycle/reactivestreams/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha01.txt
diff --git a/lifecycle/reactivestreams/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha02.txt
diff --git a/lifecycle/reactivestreams/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha03.txt
diff --git a/lifecycle/reactivestreams/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha04.txt
diff --git a/lifecycle/reactivestreams/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha05.txt
diff --git a/lifecycle/reactivestreams/api/2.1.0-beta00.txt b/lifecycle/lifecycle-reactivestreams/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.1.0-beta00.txt
diff --git a/lifecycle/reactivestreams/api/2.1.0-beta01.txt b/lifecycle/lifecycle-reactivestreams/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.1.0-beta01.txt
diff --git a/lifecycle/reactivestreams/api/2.1.0-beta02.txt b/lifecycle/lifecycle-reactivestreams/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.1.0-beta02.txt
diff --git a/lifecycle/reactivestreams/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.2.0-alpha01.txt
diff --git a/lifecycle/reactivestreams/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.2.0-alpha02.txt
diff --git a/lifecycle/reactivestreams/api/current.txt b/lifecycle/lifecycle-reactivestreams/api/current.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/current.txt
rename to lifecycle/lifecycle-reactivestreams/api/current.txt
diff --git a/lifecycle/reactivestreams/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.1.0-alpha01.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/reactivestreams/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.1.0-alpha02.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/reactivestreams/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.1.0-alpha03.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/reactivestreams/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.1.0-alpha04.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/reactivestreams/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.1.0-alpha05.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/reactivestreams/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.1.0-beta00.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/reactivestreams/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.1.0-beta01.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/reactivestreams/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.1.0-beta02.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/reactivestreams/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.2.0-alpha01.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/reactivestreams/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.2.0-alpha02.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/reactivestreams/api/restricted_2.0.0.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_2.0.0.txt
diff --git a/lifecycle/reactivestreams/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/reactivestreams/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/reactivestreams/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/reactivestreams/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/reactivestreams/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/reactivestreams/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/reactivestreams/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/reactivestreams/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/reactivestreams/api/restricted_current.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_current.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_current.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_current.txt
diff --git a/lifecycle/reactivestreams/api_legacy/1.0.0.txt b/lifecycle/lifecycle-reactivestreams/api_legacy/1.0.0.txt
similarity index 100%
rename from lifecycle/reactivestreams/api_legacy/1.0.0.txt
rename to lifecycle/lifecycle-reactivestreams/api_legacy/1.0.0.txt
diff --git a/lifecycle/reactivestreams/api_legacy/1.1.0.txt b/lifecycle/lifecycle-reactivestreams/api_legacy/1.1.0.txt
similarity index 100%
rename from lifecycle/reactivestreams/api_legacy/1.1.0.txt
rename to lifecycle/lifecycle-reactivestreams/api_legacy/1.1.0.txt
diff --git a/lifecycle/reactivestreams/api_legacy/current.txt b/lifecycle/lifecycle-reactivestreams/api_legacy/current.txt
similarity index 100%
rename from lifecycle/reactivestreams/api_legacy/current.txt
rename to lifecycle/lifecycle-reactivestreams/api_legacy/current.txt
diff --git a/lifecycle/reactivestreams/build.gradle b/lifecycle/lifecycle-reactivestreams/build.gradle
similarity index 100%
rename from lifecycle/reactivestreams/build.gradle
rename to lifecycle/lifecycle-reactivestreams/build.gradle
diff --git a/lifecycle/reactivestreams/lint-baseline.xml b/lifecycle/lifecycle-reactivestreams/lint-baseline.xml
similarity index 100%
rename from lifecycle/reactivestreams/lint-baseline.xml
rename to lifecycle/lifecycle-reactivestreams/lint-baseline.xml
diff --git a/lifecycle/reactivestreams/src/main/AndroidManifest.xml b/lifecycle/lifecycle-reactivestreams/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/reactivestreams/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-reactivestreams/src/main/AndroidManifest.xml
diff --git a/lifecycle/reactivestreams/src/main/java/androidx/lifecycle/LiveDataReactiveStreams.java b/lifecycle/lifecycle-reactivestreams/src/main/java/androidx/lifecycle/LiveDataReactiveStreams.java
similarity index 100%
rename from lifecycle/reactivestreams/src/main/java/androidx/lifecycle/LiveDataReactiveStreams.java
rename to lifecycle/lifecycle-reactivestreams/src/main/java/androidx/lifecycle/LiveDataReactiveStreams.java
diff --git a/lifecycle/reactivestreams/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.java b/lifecycle/lifecycle-reactivestreams/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.java
similarity index 100%
rename from lifecycle/reactivestreams/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.java
rename to lifecycle/lifecycle-reactivestreams/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.java
diff --git a/lifecycle/runtime/ktx/lint/build.gradle b/lifecycle/lifecycle-runtime-ktx-lint/build.gradle
similarity index 100%
rename from lifecycle/runtime/ktx/lint/build.gradle
rename to lifecycle/lifecycle-runtime-ktx-lint/build.gradle
diff --git a/lifecycle/runtime/ktx/lint/src/main/java/androidx/lifecycle/lint/LifecycleRuntimeIssueRegistry.kt b/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleRuntimeIssueRegistry.kt
similarity index 100%
rename from lifecycle/runtime/ktx/lint/src/main/java/androidx/lifecycle/lint/LifecycleRuntimeIssueRegistry.kt
rename to lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleRuntimeIssueRegistry.kt
diff --git a/lifecycle/runtime/ktx/lint/src/main/java/androidx/lifecycle/lint/LifecycleWhenChecks.kt b/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleWhenChecks.kt
similarity index 100%
rename from lifecycle/runtime/ktx/lint/src/main/java/androidx/lifecycle/lint/LifecycleWhenChecks.kt
rename to lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleWhenChecks.kt
diff --git a/lifecycle/runtime/ktx/lint/src/main/resources/META-INF/services/com.android.tools.lint.client.api.IssueRegistry b/lifecycle/lifecycle-runtime-ktx-lint/src/main/resources/META-INF/services/com.android.tools.lint.client.api.IssueRegistry
similarity index 100%
rename from lifecycle/runtime/ktx/lint/src/main/resources/META-INF/services/com.android.tools.lint.client.api.IssueRegistry
rename to lifecycle/lifecycle-runtime-ktx-lint/src/main/resources/META-INF/services/com.android.tools.lint.client.api.IssueRegistry
diff --git a/lifecycle/runtime/ktx/lint/src/test/java/androidx/lifecycle/lint/ApiLintVersionsTest.kt b/lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/ApiLintVersionsTest.kt
similarity index 100%
rename from lifecycle/runtime/ktx/lint/src/test/java/androidx/lifecycle/lint/ApiLintVersionsTest.kt
rename to lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/ApiLintVersionsTest.kt
diff --git a/lifecycle/runtime/ktx/lint/src/test/java/androidx/lifecycle/lint/LifecycleWhenChecksTest.kt b/lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/LifecycleWhenChecksTest.kt
similarity index 100%
rename from lifecycle/runtime/ktx/lint/src/test/java/androidx/lifecycle/lint/LifecycleWhenChecksTest.kt
rename to lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/LifecycleWhenChecksTest.kt
diff --git a/lifecycle/runtime/ktx/lint/src/test/java/androidx/lifecycle/lint/WhenMethodsTest.kt b/lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/WhenMethodsTest.kt
similarity index 100%
rename from lifecycle/runtime/ktx/lint/src/test/java/androidx/lifecycle/lint/WhenMethodsTest.kt
rename to lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/WhenMethodsTest.kt
diff --git a/lifecycle/runtime/ktx/lint/src/test/java/androidx/lifecycle/lint/stubs/Stubs.kt b/lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/stubs/Stubs.kt
similarity index 100%
rename from lifecycle/runtime/ktx/lint/src/test/java/androidx/lifecycle/lint/stubs/Stubs.kt
rename to lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/stubs/Stubs.kt
diff --git a/lifecycle/runtime/ktx/api/1.0.0-alpha01.txt b/lifecycle/lifecycle-runtime-ktx/api/1.0.0-alpha01.txt
similarity index 100%
rename from lifecycle/runtime/ktx/api/1.0.0-alpha01.txt
rename to lifecycle/lifecycle-runtime-ktx/api/1.0.0-alpha01.txt
diff --git a/lifecycle/runtime/ktx/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-runtime-ktx/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/runtime/ktx/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-runtime-ktx/api/2.2.0-alpha01.txt
diff --git a/lifecycle/runtime/ktx/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-runtime-ktx/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/runtime/ktx/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-runtime-ktx/api/2.2.0-alpha02.txt
diff --git a/lifecycle/runtime/ktx/api/current.txt b/lifecycle/lifecycle-runtime-ktx/api/current.txt
similarity index 100%
rename from lifecycle/runtime/ktx/api/current.txt
rename to lifecycle/lifecycle-runtime-ktx/api/current.txt
diff --git a/lifecycle/runtime/ktx/api/res-1.0.0-alpha01.txt b/lifecycle/lifecycle-runtime-ktx/api/res-1.0.0-alpha01.txt
similarity index 100%
rename from lifecycle/runtime/ktx/api/res-1.0.0-alpha01.txt
rename to lifecycle/lifecycle-runtime-ktx/api/res-1.0.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-runtime-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt
copy to lifecycle/lifecycle-runtime-ktx/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-runtime-ktx/api/res-2.2.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt
copy to lifecycle/lifecycle-runtime-ktx/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/runtime/ktx/api/restricted_1.0.0-alpha01.txt b/lifecycle/lifecycle-runtime-ktx/api/restricted_1.0.0-alpha01.txt
similarity index 100%
rename from lifecycle/runtime/ktx/api/restricted_1.0.0-alpha01.txt
rename to lifecycle/lifecycle-runtime-ktx/api/restricted_1.0.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-runtime-ktx/api/restricted_2.2.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt
copy to lifecycle/lifecycle-runtime-ktx/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-runtime-ktx/api/restricted_2.2.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt
copy to lifecycle/lifecycle-runtime-ktx/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_current.txt b/lifecycle/lifecycle-runtime-ktx/api/restricted_current.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_current.txt
copy to lifecycle/lifecycle-runtime-ktx/api/restricted_current.txt
diff --git a/lifecycle/runtime/ktx/build.gradle b/lifecycle/lifecycle-runtime-ktx/build.gradle
similarity index 100%
rename from lifecycle/runtime/ktx/build.gradle
rename to lifecycle/lifecycle-runtime-ktx/build.gradle
diff --git a/lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/Expectations.kt b/lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/Expectations.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/Expectations.kt
rename to lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/Expectations.kt
diff --git a/lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/FakeLifecycleOwner.kt b/lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/FakeLifecycleOwner.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/FakeLifecycleOwner.kt
rename to lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/FakeLifecycleOwner.kt
diff --git a/lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/PausingDispatcherTest.kt b/lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/PausingDispatcherTest.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/PausingDispatcherTest.kt
rename to lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/PausingDispatcherTest.kt
diff --git a/lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/TaskTracker.kt b/lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/TaskTracker.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/TaskTracker.kt
rename to lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/TaskTracker.kt
diff --git a/lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/TrackedExecutor.kt b/lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/TrackedExecutor.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/TrackedExecutor.kt
rename to lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/TrackedExecutor.kt
diff --git a/lifecycle/runtime/ktx/src/main/AndroidManifest.xml b/lifecycle/lifecycle-runtime-ktx/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/runtime/ktx/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-runtime-ktx/src/main/AndroidManifest.xml
diff --git a/lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/DispatchQueue.kt b/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/DispatchQueue.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/DispatchQueue.kt
rename to lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/DispatchQueue.kt
diff --git a/lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/Lifecycle.kt b/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/Lifecycle.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/Lifecycle.kt
rename to lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/Lifecycle.kt
diff --git a/lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/LifecycleController.kt b/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/LifecycleController.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/LifecycleController.kt
rename to lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/LifecycleController.kt
diff --git a/lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/LifecycleOwner.kt b/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/LifecycleOwner.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/LifecycleOwner.kt
rename to lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/LifecycleOwner.kt
diff --git a/lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/PausingDispatcher.kt b/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/PausingDispatcher.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/PausingDispatcher.kt
rename to lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/PausingDispatcher.kt
diff --git a/lifecycle/runtime/.gitignore b/lifecycle/lifecycle-runtime/.gitignore
similarity index 100%
rename from lifecycle/runtime/.gitignore
rename to lifecycle/lifecycle-runtime/.gitignore
diff --git a/lifecycle/runtime/api/2.0.0.txt b/lifecycle/lifecycle-runtime/api/2.0.0.txt
similarity index 100%
rename from lifecycle/runtime/api/2.0.0.txt
rename to lifecycle/lifecycle-runtime/api/2.0.0.txt
diff --git a/lifecycle/runtime/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-runtime/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/runtime/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-runtime/api/2.1.0-alpha01.txt
diff --git a/lifecycle/runtime/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-runtime/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/runtime/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-runtime/api/2.1.0-alpha02.txt
diff --git a/lifecycle/runtime/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-runtime/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/runtime/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-runtime/api/2.1.0-alpha03.txt
diff --git a/lifecycle/runtime/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-runtime/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/runtime/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-runtime/api/2.1.0-alpha04.txt
diff --git a/lifecycle/runtime/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-runtime/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/runtime/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-runtime/api/2.1.0-alpha05.txt
diff --git a/lifecycle/runtime/api/2.1.0-beta00.txt b/lifecycle/lifecycle-runtime/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/runtime/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-runtime/api/2.1.0-beta00.txt
diff --git a/lifecycle/runtime/api/2.1.0-beta01.txt b/lifecycle/lifecycle-runtime/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/runtime/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-runtime/api/2.1.0-beta01.txt
diff --git a/lifecycle/runtime/api/2.1.0-beta02.txt b/lifecycle/lifecycle-runtime/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/runtime/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-runtime/api/2.1.0-beta02.txt
diff --git a/lifecycle/runtime/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-runtime/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/runtime/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-runtime/api/2.2.0-alpha01.txt
diff --git a/lifecycle/runtime/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-runtime/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/runtime/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-runtime/api/2.2.0-alpha02.txt
diff --git a/lifecycle/runtime/api/current.txt b/lifecycle/lifecycle-runtime/api/current.txt
similarity index 100%
rename from lifecycle/runtime/api/current.txt
rename to lifecycle/lifecycle-runtime/api/current.txt
diff --git a/lifecycle/runtime/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-runtime/api/res-2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.1.0-alpha01.txt
rename to lifecycle/lifecycle-runtime/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/runtime/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-runtime/api/res-2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.1.0-alpha02.txt
rename to lifecycle/lifecycle-runtime/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/runtime/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-runtime/api/res-2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.1.0-alpha03.txt
rename to lifecycle/lifecycle-runtime/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/runtime/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-runtime/api/res-2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.1.0-alpha04.txt
rename to lifecycle/lifecycle-runtime/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/runtime/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-runtime/api/res-2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.1.0-alpha05.txt
rename to lifecycle/lifecycle-runtime/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/runtime/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-runtime/api/res-2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.1.0-beta00.txt
rename to lifecycle/lifecycle-runtime/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/runtime/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-runtime/api/res-2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.1.0-beta01.txt
rename to lifecycle/lifecycle-runtime/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/runtime/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-runtime/api/res-2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.1.0-beta02.txt
rename to lifecycle/lifecycle-runtime/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/runtime/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-runtime/api/res-2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.2.0-alpha01.txt
rename to lifecycle/lifecycle-runtime/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/runtime/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-runtime/api/res-2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.2.0-alpha02.txt
rename to lifecycle/lifecycle-runtime/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/runtime/api/restricted_2.0.0.txt b/lifecycle/lifecycle-runtime/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-runtime/api/restricted_2.0.0.txt
diff --git a/lifecycle/runtime/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-runtime/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-runtime/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/runtime/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-runtime/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-runtime/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/runtime/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-runtime/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-runtime/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/runtime/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-runtime/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-runtime/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/runtime/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-runtime/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-runtime/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/runtime/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-runtime/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-runtime/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/runtime/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-runtime/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-runtime/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/runtime/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-runtime/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-runtime/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/runtime/api/restricted_current.txt b/lifecycle/lifecycle-runtime/api/restricted_current.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_current.txt
rename to lifecycle/lifecycle-runtime/api/restricted_current.txt
diff --git a/lifecycle/runtime/api_legacy/0.0.0.txt b/lifecycle/lifecycle-runtime/api_legacy/0.0.0.txt
similarity index 100%
rename from lifecycle/runtime/api_legacy/0.0.0.txt
rename to lifecycle/lifecycle-runtime/api_legacy/0.0.0.txt
diff --git a/lifecycle/runtime/api_legacy/1.0.0.txt b/lifecycle/lifecycle-runtime/api_legacy/1.0.0.txt
similarity index 100%
rename from lifecycle/runtime/api_legacy/1.0.0.txt
rename to lifecycle/lifecycle-runtime/api_legacy/1.0.0.txt
diff --git a/lifecycle/runtime/api_legacy/1.1.0.txt b/lifecycle/lifecycle-runtime/api_legacy/1.1.0.txt
similarity index 100%
rename from lifecycle/runtime/api_legacy/1.1.0.txt
rename to lifecycle/lifecycle-runtime/api_legacy/1.1.0.txt
diff --git a/lifecycle/runtime/api_legacy/current.txt b/lifecycle/lifecycle-runtime/api_legacy/current.txt
similarity index 100%
rename from lifecycle/runtime/api_legacy/current.txt
rename to lifecycle/lifecycle-runtime/api_legacy/current.txt
diff --git a/lifecycle/runtime/build.gradle b/lifecycle/lifecycle-runtime/build.gradle
similarity index 100%
rename from lifecycle/runtime/build.gradle
rename to lifecycle/lifecycle-runtime/build.gradle
diff --git a/lifecycle/runtime/proguard-rules.pro b/lifecycle/lifecycle-runtime/proguard-rules.pro
similarity index 100%
rename from lifecycle/runtime/proguard-rules.pro
rename to lifecycle/lifecycle-runtime/proguard-rules.pro
diff --git a/lifecycle/runtime/src/androidTest/java/androidx/lifecycle/MissingClassTest.java b/lifecycle/lifecycle-runtime/src/androidTest/java/androidx/lifecycle/MissingClassTest.java
similarity index 100%
rename from lifecycle/runtime/src/androidTest/java/androidx/lifecycle/MissingClassTest.java
rename to lifecycle/lifecycle-runtime/src/androidTest/java/androidx/lifecycle/MissingClassTest.java
diff --git a/lifecycle/runtime/src/main/AndroidManifest.xml b/lifecycle/lifecycle-runtime/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/runtime/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-runtime/src/main/AndroidManifest.xml
diff --git a/lifecycle/runtime/src/main/java/androidx/lifecycle/LifecycleRegistry.java b/lifecycle/lifecycle-runtime/src/main/java/androidx/lifecycle/LifecycleRegistry.java
similarity index 100%
rename from lifecycle/runtime/src/main/java/androidx/lifecycle/LifecycleRegistry.java
rename to lifecycle/lifecycle-runtime/src/main/java/androidx/lifecycle/LifecycleRegistry.java
diff --git a/lifecycle/runtime/src/main/java/androidx/lifecycle/LifecycleRegistryOwner.java b/lifecycle/lifecycle-runtime/src/main/java/androidx/lifecycle/LifecycleRegistryOwner.java
similarity index 100%
rename from lifecycle/runtime/src/main/java/androidx/lifecycle/LifecycleRegistryOwner.java
rename to lifecycle/lifecycle-runtime/src/main/java/androidx/lifecycle/LifecycleRegistryOwner.java
diff --git a/lifecycle/runtime/src/main/java/androidx/lifecycle/ReportFragment.java b/lifecycle/lifecycle-runtime/src/main/java/androidx/lifecycle/ReportFragment.java
similarity index 100%
rename from lifecycle/runtime/src/main/java/androidx/lifecycle/ReportFragment.java
rename to lifecycle/lifecycle-runtime/src/main/java/androidx/lifecycle/ReportFragment.java
diff --git a/lifecycle/runtime/src/test/java/NoPackageObserver.java b/lifecycle/lifecycle-runtime/src/test/java/NoPackageObserver.java
similarity index 100%
rename from lifecycle/runtime/src/test/java/NoPackageObserver.java
rename to lifecycle/lifecycle-runtime/src/test/java/NoPackageObserver.java
diff --git a/lifecycle/runtime/src/test/java/NoPackageTest.java b/lifecycle/lifecycle-runtime/src/test/java/NoPackageTest.java
similarity index 100%
rename from lifecycle/runtime/src/test/java/NoPackageTest.java
rename to lifecycle/lifecycle-runtime/src/test/java/NoPackageTest.java
diff --git a/lifecycle/runtime/src/test/java/androidx/lifecycle/LifecycleRegistryTest.java b/lifecycle/lifecycle-runtime/src/test/java/androidx/lifecycle/LifecycleRegistryTest.java
similarity index 100%
rename from lifecycle/runtime/src/test/java/androidx/lifecycle/LifecycleRegistryTest.java
rename to lifecycle/lifecycle-runtime/src/test/java/androidx/lifecycle/LifecycleRegistryTest.java
diff --git a/lifecycle/savedstate-core/api/res-1.0.0-alpha01.txt b/lifecycle/lifecycle-savedstate-core/api/res-1.0.0-alpha01.txt
similarity index 100%
rename from lifecycle/savedstate-core/api/res-1.0.0-alpha01.txt
rename to lifecycle/lifecycle-savedstate-core/api/res-1.0.0-alpha01.txt
diff --git a/lifecycle/service/.gitignore b/lifecycle/lifecycle-service/.gitignore
similarity index 100%
rename from lifecycle/service/.gitignore
rename to lifecycle/lifecycle-service/.gitignore
diff --git a/lifecycle/service/api/2.0.0.txt b/lifecycle/lifecycle-service/api/2.0.0.txt
similarity index 100%
rename from lifecycle/service/api/2.0.0.txt
rename to lifecycle/lifecycle-service/api/2.0.0.txt
diff --git a/lifecycle/service/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-service/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/service/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-service/api/2.1.0-alpha01.txt
diff --git a/lifecycle/service/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-service/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/service/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-service/api/2.1.0-alpha02.txt
diff --git a/lifecycle/service/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-service/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/service/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-service/api/2.1.0-alpha03.txt
diff --git a/lifecycle/service/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-service/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/service/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-service/api/2.1.0-alpha04.txt
diff --git a/lifecycle/service/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-service/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/service/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-service/api/2.1.0-alpha05.txt
diff --git a/lifecycle/service/api/2.1.0-beta00.txt b/lifecycle/lifecycle-service/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/service/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-service/api/2.1.0-beta00.txt
diff --git a/lifecycle/service/api/2.1.0-beta01.txt b/lifecycle/lifecycle-service/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/service/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-service/api/2.1.0-beta01.txt
diff --git a/lifecycle/service/api/2.1.0-beta02.txt b/lifecycle/lifecycle-service/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/service/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-service/api/2.1.0-beta02.txt
diff --git a/lifecycle/service/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-service/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/service/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-service/api/2.2.0-alpha01.txt
diff --git a/lifecycle/service/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-service/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/service/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-service/api/2.2.0-alpha02.txt
diff --git a/lifecycle/service/api/current.txt b/lifecycle/lifecycle-service/api/current.txt
similarity index 100%
rename from lifecycle/service/api/current.txt
rename to lifecycle/lifecycle-service/api/current.txt
diff --git a/lifecycle/service/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-service/api/res-2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/service/api/res-2.1.0-alpha01.txt
rename to lifecycle/lifecycle-service/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/service/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-service/api/res-2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/service/api/res-2.1.0-alpha02.txt
rename to lifecycle/lifecycle-service/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/service/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-service/api/res-2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/service/api/res-2.1.0-alpha03.txt
rename to lifecycle/lifecycle-service/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/service/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-service/api/res-2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/service/api/res-2.1.0-alpha04.txt
rename to lifecycle/lifecycle-service/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/service/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-service/api/res-2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/service/api/res-2.1.0-alpha05.txt
rename to lifecycle/lifecycle-service/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/service/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-service/api/res-2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/service/api/res-2.1.0-beta00.txt
rename to lifecycle/lifecycle-service/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/service/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-service/api/res-2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/service/api/res-2.1.0-beta01.txt
rename to lifecycle/lifecycle-service/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/service/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-service/api/res-2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/service/api/res-2.1.0-beta02.txt
rename to lifecycle/lifecycle-service/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/service/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-service/api/res-2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/service/api/res-2.2.0-alpha01.txt
rename to lifecycle/lifecycle-service/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/service/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-service/api/res-2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/service/api/res-2.2.0-alpha02.txt
rename to lifecycle/lifecycle-service/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/service/api/restricted_2.0.0.txt b/lifecycle/lifecycle-service/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/service/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-service/api/restricted_2.0.0.txt
diff --git a/lifecycle/service/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-service/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/service/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-service/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/service/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-service/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/service/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-service/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/service/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-service/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/service/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-service/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/service/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-service/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/service/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-service/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/service/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-service/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/service/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-service/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/service/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-service/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/service/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-service/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/service/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-service/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/service/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-service/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/service/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-service/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/service/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-service/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/service/api/restricted_current.txt b/lifecycle/lifecycle-service/api/restricted_current.txt
similarity index 100%
rename from lifecycle/service/api/restricted_current.txt
rename to lifecycle/lifecycle-service/api/restricted_current.txt
diff --git a/lifecycle/service/api_legacy/current.txt b/lifecycle/lifecycle-service/api_legacy/current.txt
similarity index 100%
rename from lifecycle/service/api_legacy/current.txt
rename to lifecycle/lifecycle-service/api_legacy/current.txt
diff --git a/lifecycle/service/build.gradle b/lifecycle/lifecycle-service/build.gradle
similarity index 100%
rename from lifecycle/service/build.gradle
rename to lifecycle/lifecycle-service/build.gradle
diff --git a/lifecycle/service/src/androidTest/AndroidManifest.xml b/lifecycle/lifecycle-service/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from lifecycle/service/src/androidTest/AndroidManifest.xml
rename to lifecycle/lifecycle-service/src/androidTest/AndroidManifest.xml
diff --git a/lifecycle/service/src/androidTest/java/androidx/lifecycle/ServiceLifecycleTest.java b/lifecycle/lifecycle-service/src/androidTest/java/androidx/lifecycle/ServiceLifecycleTest.java
similarity index 100%
rename from lifecycle/service/src/androidTest/java/androidx/lifecycle/ServiceLifecycleTest.java
rename to lifecycle/lifecycle-service/src/androidTest/java/androidx/lifecycle/ServiceLifecycleTest.java
diff --git a/lifecycle/service/src/androidTest/java/androidx/lifecycle/service/TestService.java b/lifecycle/lifecycle-service/src/androidTest/java/androidx/lifecycle/service/TestService.java
similarity index 68%
rename from lifecycle/service/src/androidTest/java/androidx/lifecycle/service/TestService.java
rename to lifecycle/lifecycle-service/src/androidTest/java/androidx/lifecycle/service/TestService.java
index afc9dc8..b8d023f 100644
--- a/lifecycle/service/src/androidTest/java/androidx/lifecycle/service/TestService.java
+++ b/lifecycle/lifecycle-service/src/androidTest/java/androidx/lifecycle/service/TestService.java
@@ -22,11 +22,8 @@
 import android.os.IBinder;
 
 import androidx.annotation.Nullable;
-import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleObserver;
-import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.LifecycleEventObserver;
 import androidx.lifecycle.LifecycleService;
-import androidx.lifecycle.OnLifecycleEvent;
 import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 
 public class TestService extends LifecycleService {
@@ -37,14 +34,11 @@
     private final IBinder mBinder = new Binder();
 
     public TestService() {
-        getLifecycle().addObserver(new LifecycleObserver() {
-            @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
-            public void anyEvent(LifecycleOwner owner, Lifecycle.Event event) {
-                Context context = (TestService) owner;
-                Intent intent = new Intent(ACTION_LOG_EVENT);
-                intent.putExtra(EXTRA_KEY_EVENT, event);
-                LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
-            }
+        getLifecycle().addObserver((LifecycleEventObserver) (owner, event) -> {
+            Context context = (TestService) owner;
+            Intent intent = new Intent(ACTION_LOG_EVENT);
+            intent.putExtra(EXTRA_KEY_EVENT, event);
+            LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
         });
     }
 
diff --git a/lifecycle/service/src/main/AndroidManifest.xml b/lifecycle/lifecycle-service/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/service/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-service/src/main/AndroidManifest.xml
diff --git a/lifecycle/service/src/main/java/androidx/lifecycle/LifecycleService.java b/lifecycle/lifecycle-service/src/main/java/androidx/lifecycle/LifecycleService.java
similarity index 100%
rename from lifecycle/service/src/main/java/androidx/lifecycle/LifecycleService.java
rename to lifecycle/lifecycle-service/src/main/java/androidx/lifecycle/LifecycleService.java
diff --git a/lifecycle/service/src/main/java/androidx/lifecycle/ServiceLifecycleDispatcher.java b/lifecycle/lifecycle-service/src/main/java/androidx/lifecycle/ServiceLifecycleDispatcher.java
similarity index 100%
rename from lifecycle/service/src/main/java/androidx/lifecycle/ServiceLifecycleDispatcher.java
rename to lifecycle/lifecycle-service/src/main/java/androidx/lifecycle/ServiceLifecycleDispatcher.java
diff --git a/lifecycle/viewmodel/ktx/api/2.0.0.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.0.0.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.0.0.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.0.0.txt
diff --git a/lifecycle/viewmodel/ktx/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha01.txt
diff --git a/lifecycle/viewmodel/ktx/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha02.txt
diff --git a/lifecycle/viewmodel/ktx/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha03.txt
diff --git a/lifecycle/viewmodel/ktx/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha04.txt
diff --git a/lifecycle/viewmodel/ktx/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha05.txt
diff --git a/lifecycle/viewmodel/ktx/api/2.1.0-beta01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-beta01.txt
diff --git a/lifecycle/viewmodel/ktx/api/2.1.0-beta02.ignore b/lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-beta02.ignore
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.1.0-beta02.ignore
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-beta02.ignore
diff --git a/lifecycle/viewmodel/ktx/api/2.1.0-beta02.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-beta02.txt
diff --git a/lifecycle/viewmodel/ktx/api/2.2.0-alpha01.ignore b/lifecycle/lifecycle-viewmodel-ktx/api/2.2.0-alpha01.ignore
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.2.0-alpha01.ignore
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.2.0-alpha01.ignore
diff --git a/lifecycle/viewmodel/ktx/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.2.0-alpha01.txt
diff --git a/lifecycle/viewmodel/ktx/api/2.2.0-alpha02.ignore b/lifecycle/lifecycle-viewmodel-ktx/api/2.2.0-alpha02.ignore
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.2.0-alpha02.ignore
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.2.0-alpha02.ignore
diff --git a/lifecycle/viewmodel/ktx/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.2.0-alpha02.txt
diff --git a/lifecycle/viewmodel/ktx/api/current.txt b/lifecycle/lifecycle-viewmodel-ktx/api/current.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/current.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/current.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha01.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha02.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha03.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha03.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha04.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha04.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha05.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha05.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-beta00.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-beta00.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-beta01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-beta01.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-beta02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-beta02.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.2.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.0.0.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.0.0.txt
similarity index 100%
copy from lifecycle/livedata-core/api/restricted_2.0.0.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.0.0.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-alpha03.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha03.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-alpha04.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha04.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-alpha05.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha05.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-beta00.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta00.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-beta01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta01.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-beta02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta02.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.2.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.2.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_current.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_current.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_current.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_current.txt
diff --git a/lifecycle/viewmodel/ktx/build.gradle b/lifecycle/lifecycle-viewmodel-ktx/build.gradle
similarity index 100%
rename from lifecycle/viewmodel/ktx/build.gradle
rename to lifecycle/lifecycle-viewmodel-ktx/build.gradle
diff --git a/lifecycle/viewmodel/ktx/src/androidTest/java/androidx/lifecycle/ViewModelTest.kt b/lifecycle/lifecycle-viewmodel-ktx/src/androidTest/java/androidx/lifecycle/ViewModelTest.kt
similarity index 100%
rename from lifecycle/viewmodel/ktx/src/androidTest/java/androidx/lifecycle/ViewModelTest.kt
rename to lifecycle/lifecycle-viewmodel-ktx/src/androidTest/java/androidx/lifecycle/ViewModelTest.kt
diff --git a/lifecycle/viewmodel/ktx/src/main/AndroidManifest.xml b/lifecycle/lifecycle-viewmodel-ktx/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/viewmodel/ktx/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-viewmodel-ktx/src/main/AndroidManifest.xml
diff --git a/lifecycle/viewmodel/ktx/src/main/java/androidx/lifecycle/ViewModel.kt b/lifecycle/lifecycle-viewmodel-ktx/src/main/java/androidx/lifecycle/ViewModel.kt
similarity index 100%
rename from lifecycle/viewmodel/ktx/src/main/java/androidx/lifecycle/ViewModel.kt
rename to lifecycle/lifecycle-viewmodel-ktx/src/main/java/androidx/lifecycle/ViewModel.kt
diff --git a/lifecycle/viewmodel/ktx/src/main/java/androidx/lifecycle/ViewModelProvider.kt b/lifecycle/lifecycle-viewmodel-ktx/src/main/java/androidx/lifecycle/ViewModelProvider.kt
similarity index 100%
rename from lifecycle/viewmodel/ktx/src/main/java/androidx/lifecycle/ViewModelProvider.kt
rename to lifecycle/lifecycle-viewmodel-ktx/src/main/java/androidx/lifecycle/ViewModelProvider.kt
diff --git a/lifecycle/viewmodel/ktx/src/test/java/androidx/lifecycle/ViewModelLazyTest.kt b/lifecycle/lifecycle-viewmodel-ktx/src/test/java/androidx/lifecycle/ViewModelLazyTest.kt
similarity index 100%
rename from lifecycle/viewmodel/ktx/src/test/java/androidx/lifecycle/ViewModelLazyTest.kt
rename to lifecycle/lifecycle-viewmodel-ktx/src/test/java/androidx/lifecycle/ViewModelLazyTest.kt
diff --git a/lifecycle/viewmodel/ktx/src/test/java/androidx/lifecycle/ViewModelProviderTest.kt b/lifecycle/lifecycle-viewmodel-ktx/src/test/java/androidx/lifecycle/ViewModelProviderTest.kt
similarity index 100%
rename from lifecycle/viewmodel/ktx/src/test/java/androidx/lifecycle/ViewModelProviderTest.kt
rename to lifecycle/lifecycle-viewmodel-ktx/src/test/java/androidx/lifecycle/ViewModelProviderTest.kt
diff --git a/lifecycle/viewmodel-savedstate/api/1.0.0-alpha01.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/1.0.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel-savedstate/api/1.0.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel-savedstate/api/1.0.0-alpha01.txt
diff --git a/lifecycle/viewmodel-savedstate/api/current.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/current.txt
similarity index 100%
rename from lifecycle/viewmodel-savedstate/api/current.txt
rename to lifecycle/lifecycle-viewmodel-savedstate/api/current.txt
diff --git a/lifecycle/viewmodel-savedstate/api/res-1.0.0-alpha01.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/res-1.0.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel-savedstate/api/res-1.0.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel-savedstate/api/res-1.0.0-alpha01.txt
diff --git a/lifecycle/viewmodel-savedstate/api/restricted_1.0.0-alpha01.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_1.0.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel-savedstate/api/restricted_1.0.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel-savedstate/api/restricted_1.0.0-alpha01.txt
diff --git a/lifecycle/viewmodel-savedstate/api/restricted_current.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.txt
similarity index 100%
rename from lifecycle/viewmodel-savedstate/api/restricted_current.txt
rename to lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.txt
diff --git a/lifecycle/viewmodel-savedstate/build.gradle b/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
similarity index 100%
rename from lifecycle/viewmodel-savedstate/build.gradle
rename to lifecycle/lifecycle-viewmodel-savedstate/build.gradle
diff --git a/lifecycle/viewmodel-savedstate/lint-baseline.xml b/lifecycle/lifecycle-viewmodel-savedstate/lint-baseline.xml
similarity index 100%
rename from lifecycle/viewmodel-savedstate/lint-baseline.xml
rename to lifecycle/lifecycle-viewmodel-savedstate/lint-baseline.xml
diff --git a/lifecycle/viewmodel-savedstate/proguard-rules.pro b/lifecycle/lifecycle-viewmodel-savedstate/proguard-rules.pro
similarity index 100%
rename from lifecycle/viewmodel-savedstate/proguard-rules.pro
rename to lifecycle/lifecycle-viewmodel-savedstate/proguard-rules.pro
diff --git a/lifecycle/viewmodel-savedstate/src/androidTest/AndroidManifest.xml b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/androidTest/AndroidManifest.xml
rename to lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/AndroidManifest.xml
diff --git a/lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/SavedStateHandleParcelingTest.java b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/SavedStateHandleParcelingTest.java
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/SavedStateHandleParcelingTest.java
rename to lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/SavedStateHandleParcelingTest.java
diff --git a/lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateFactoryTest.kt b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateFactoryTest.kt
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateFactoryTest.kt
rename to lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateFactoryTest.kt
diff --git a/lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateHandleTest.kt b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateHandleTest.kt
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateHandleTest.kt
rename to lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateHandleTest.kt
diff --git a/lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/ViewModelsWithStateTests.java b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/ViewModelsWithStateTests.java
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/ViewModelsWithStateTests.java
rename to lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/ViewModelsWithStateTests.java
diff --git a/lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/activity/FakingSavedStateActivity.java b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/activity/FakingSavedStateActivity.java
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/activity/FakingSavedStateActivity.java
rename to lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/activity/FakingSavedStateActivity.java
diff --git a/lifecycle/viewmodel-savedstate/src/main/AndroidManifest.xml b/lifecycle/lifecycle-viewmodel-savedstate/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-viewmodel-savedstate/src/main/AndroidManifest.xml
diff --git a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateVMFactory.java b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateVMFactory.java
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateVMFactory.java
rename to lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateVMFactory.java
diff --git a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java
rename to lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java
diff --git a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateVMFactory.java b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateVMFactory.java
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateVMFactory.java
rename to lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateVMFactory.java
diff --git a/lifecycle/viewmodel/api/2.0.0.txt b/lifecycle/lifecycle-viewmodel/api/2.0.0.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.0.0.txt
rename to lifecycle/lifecycle-viewmodel/api/2.0.0.txt
diff --git a/lifecycle/viewmodel/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-viewmodel/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel/api/2.1.0-alpha01.txt
diff --git a/lifecycle/viewmodel/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-viewmodel/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-viewmodel/api/2.1.0-alpha02.txt
diff --git a/lifecycle/viewmodel/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-viewmodel/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-viewmodel/api/2.1.0-alpha03.txt
diff --git a/lifecycle/viewmodel/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-viewmodel/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-viewmodel/api/2.1.0-alpha04.txt
diff --git a/lifecycle/viewmodel/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-viewmodel/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-viewmodel/api/2.1.0-alpha05.txt
diff --git a/lifecycle/viewmodel/api/2.1.0-beta00.txt b/lifecycle/lifecycle-viewmodel/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-viewmodel/api/2.1.0-beta00.txt
diff --git a/lifecycle/viewmodel/api/2.1.0-beta01.txt b/lifecycle/lifecycle-viewmodel/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-viewmodel/api/2.1.0-beta01.txt
diff --git a/lifecycle/viewmodel/api/2.1.0-beta02.txt b/lifecycle/lifecycle-viewmodel/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-viewmodel/api/2.1.0-beta02.txt
diff --git a/lifecycle/viewmodel/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-viewmodel/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel/api/2.2.0-alpha01.txt
diff --git a/lifecycle/viewmodel/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-viewmodel/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-viewmodel/api/2.2.0-alpha02.txt
diff --git a/lifecycle/viewmodel/api/current.txt b/lifecycle/lifecycle-viewmodel/api/current.txt
similarity index 100%
rename from lifecycle/viewmodel/api/current.txt
rename to lifecycle/lifecycle-viewmodel/api/current.txt
diff --git a/lifecycle/viewmodel/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.1.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/viewmodel/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.1.0-alpha02.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/viewmodel/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.1.0-alpha03.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/viewmodel/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.1.0-alpha04.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/viewmodel/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.1.0-alpha05.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/viewmodel/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-viewmodel/api/res-2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.1.0-beta00.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/viewmodel/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-viewmodel/api/res-2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.1.0-beta01.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/viewmodel/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-viewmodel/api/res-2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.1.0-beta02.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/viewmodel/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-viewmodel/api/res-2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.2.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/viewmodel/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-viewmodel/api/res-2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.2.0-alpha02.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/viewmodel/api/restricted_2.0.0.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_2.0.0.txt
diff --git a/lifecycle/viewmodel/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/viewmodel/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/viewmodel/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/viewmodel/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/viewmodel/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/viewmodel/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/viewmodel/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/viewmodel/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/viewmodel/api/restricted_current.txt b/lifecycle/lifecycle-viewmodel/api/restricted_current.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_current.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_current.txt
diff --git a/lifecycle/viewmodel/api_legacy/1.1.0.txt b/lifecycle/lifecycle-viewmodel/api_legacy/1.1.0.txt
similarity index 100%
rename from lifecycle/viewmodel/api_legacy/1.1.0.txt
rename to lifecycle/lifecycle-viewmodel/api_legacy/1.1.0.txt
diff --git a/lifecycle/viewmodel/api_legacy/current.txt b/lifecycle/lifecycle-viewmodel/api_legacy/current.txt
similarity index 100%
rename from lifecycle/viewmodel/api_legacy/current.txt
rename to lifecycle/lifecycle-viewmodel/api_legacy/current.txt
diff --git a/lifecycle/viewmodel/build.gradle b/lifecycle/lifecycle-viewmodel/build.gradle
similarity index 100%
rename from lifecycle/viewmodel/build.gradle
rename to lifecycle/lifecycle-viewmodel/build.gradle
diff --git a/lifecycle/viewmodel/proguard-rules.pro b/lifecycle/lifecycle-viewmodel/proguard-rules.pro
similarity index 100%
rename from lifecycle/viewmodel/proguard-rules.pro
rename to lifecycle/lifecycle-viewmodel/proguard-rules.pro
diff --git a/lifecycle/viewmodel/src/main/AndroidManifest.xml b/lifecycle/lifecycle-viewmodel/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/viewmodel/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-viewmodel/src/main/AndroidManifest.xml
diff --git a/lifecycle/viewmodel/src/main/java/androidx/lifecycle/AndroidViewModel.java b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/AndroidViewModel.java
similarity index 100%
rename from lifecycle/viewmodel/src/main/java/androidx/lifecycle/AndroidViewModel.java
rename to lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/AndroidViewModel.java
diff --git a/lifecycle/viewmodel/src/main/java/androidx/lifecycle/ViewModel.java b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModel.java
similarity index 100%
rename from lifecycle/viewmodel/src/main/java/androidx/lifecycle/ViewModel.java
rename to lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModel.java
diff --git a/lifecycle/viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.java b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.java
similarity index 100%
rename from lifecycle/viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.java
rename to lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.java
diff --git a/lifecycle/viewmodel/src/main/java/androidx/lifecycle/ViewModelStore.java b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelStore.java
similarity index 100%
rename from lifecycle/viewmodel/src/main/java/androidx/lifecycle/ViewModelStore.java
rename to lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelStore.java
diff --git a/lifecycle/viewmodel/src/main/java/androidx/lifecycle/ViewModelStoreOwner.java b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelStoreOwner.java
similarity index 100%
rename from lifecycle/viewmodel/src/main/java/androidx/lifecycle/ViewModelStoreOwner.java
rename to lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelStoreOwner.java
diff --git a/lifecycle/viewmodel/src/test/java/androidx/lifecycle/ViewModelProviderTest.java b/lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelProviderTest.java
similarity index 100%
rename from lifecycle/viewmodel/src/test/java/androidx/lifecycle/ViewModelProviderTest.java
rename to lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelProviderTest.java
diff --git a/lifecycle/viewmodel/src/test/java/androidx/lifecycle/ViewModelStoreTest.java b/lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelStoreTest.java
similarity index 100%
rename from lifecycle/viewmodel/src/test/java/androidx/lifecycle/ViewModelStoreTest.java
rename to lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelStoreTest.java
diff --git a/lifecycle/viewmodel/src/test/java/androidx/lifecycle/ViewModelTest.java b/lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelTest.java
similarity index 100%
rename from lifecycle/viewmodel/src/test/java/androidx/lifecycle/ViewModelTest.java
rename to lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelTest.java
diff --git a/lifecycle/livedata/ktx/api/res-2.1.0-alpha01.txt b/lifecycle/livedata/ktx/api/res-2.1.0-alpha01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.1.0-alpha01.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/res-2.1.0-alpha02.txt b/lifecycle/livedata/ktx/api/res-2.1.0-alpha02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.1.0-alpha02.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/res-2.1.0-alpha03.txt b/lifecycle/livedata/ktx/api/res-2.1.0-alpha03.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.1.0-alpha03.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/res-2.1.0-alpha04.txt b/lifecycle/livedata/ktx/api/res-2.1.0-alpha04.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.1.0-alpha04.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/res-2.1.0-alpha05.txt b/lifecycle/livedata/ktx/api/res-2.1.0-alpha05.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.1.0-alpha05.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/res-2.1.0-beta00.txt b/lifecycle/livedata/ktx/api/res-2.1.0-beta00.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.1.0-beta00.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/res-2.1.0-beta01.txt b/lifecycle/livedata/ktx/api/res-2.1.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.1.0-beta01.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/res-2.1.0-beta02.txt b/lifecycle/livedata/ktx/api/res-2.1.0-beta02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.1.0-beta02.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/res-2.2.0-alpha01.txt b/lifecycle/livedata/ktx/api/res-2.2.0-alpha01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.2.0-alpha01.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/res-2.2.0-alpha02.txt b/lifecycle/livedata/ktx/api/res-2.2.0-alpha02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.2.0-alpha02.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/restricted_2.1.0-alpha03.txt b/lifecycle/livedata/ktx/api/restricted_2.1.0-alpha03.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/livedata/ktx/api/restricted_2.1.0-alpha03.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/livedata/ktx/api/restricted_2.1.0-alpha04.txt b/lifecycle/livedata/ktx/api/restricted_2.1.0-alpha04.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/livedata/ktx/api/restricted_2.1.0-alpha04.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/livedata/ktx/api/restricted_2.1.0-alpha05.txt b/lifecycle/livedata/ktx/api/restricted_2.1.0-alpha05.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/livedata/ktx/api/restricted_2.1.0-alpha05.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/livedata/ktx/api/restricted_2.1.0-beta00.txt b/lifecycle/livedata/ktx/api/restricted_2.1.0-beta00.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/livedata/ktx/api/restricted_2.1.0-beta00.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/livedata/ktx/api/restricted_2.1.0-beta01.txt b/lifecycle/livedata/ktx/api/restricted_2.1.0-beta01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/livedata/ktx/api/restricted_2.1.0-beta01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/livedata/ktx/api/restricted_2.1.0-beta02.txt b/lifecycle/livedata/ktx/api/restricted_2.1.0-beta02.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/livedata/ktx/api/restricted_2.1.0-beta02.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/livedata/ktx/api/restricted_2.2.0-alpha01.txt b/lifecycle/livedata/ktx/api/restricted_2.2.0-alpha01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/livedata/ktx/api/restricted_2.2.0-alpha01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/livedata/ktx/api/restricted_2.2.0-alpha02.txt b/lifecycle/livedata/ktx/api/restricted_2.2.0-alpha02.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/livedata/ktx/api/restricted_2.2.0-alpha02.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/livedata/ktx/api/restricted_current.txt b/lifecycle/livedata/ktx/api/restricted_current.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/livedata/ktx/api/restricted_current.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha01.txt b/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha01.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha02.txt b/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha02.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha03.txt b/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha03.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha03.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha04.txt b/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha04.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha04.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha05.txt b/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha05.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha05.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.1.0-beta00.txt b/lifecycle/reactivestreams/ktx/api/res-2.1.0-beta00.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.1.0-beta00.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.1.0-beta01.txt b/lifecycle/reactivestreams/ktx/api/res-2.1.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.1.0-beta01.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.1.0-beta02.txt b/lifecycle/reactivestreams/ktx/api/res-2.1.0-beta02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.1.0-beta02.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.2.0-alpha01.txt b/lifecycle/reactivestreams/ktx/api/res-2.2.0-alpha01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.2.0-alpha01.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.2.0-alpha02.txt b/lifecycle/reactivestreams/ktx/api/res-2.2.0-alpha02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.2.0-alpha02.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-alpha03.txt b/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-alpha03.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-alpha03.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-alpha04.txt b/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-alpha04.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-alpha04.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-alpha05.txt b/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-alpha05.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-alpha05.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-beta00.txt b/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-beta00.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-beta00.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-beta01.txt b/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-beta01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-beta01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-beta02.txt b/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-beta02.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-beta02.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_2.2.0-alpha01.txt b/lifecycle/reactivestreams/ktx/api/restricted_2.2.0-alpha01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/reactivestreams/ktx/api/restricted_2.2.0-alpha01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_2.2.0-alpha02.txt b/lifecycle/reactivestreams/ktx/api/restricted_2.2.0-alpha02.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/reactivestreams/ktx/api/restricted_2.2.0-alpha02.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_current.txt b/lifecycle/reactivestreams/ktx/api/restricted_current.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/reactivestreams/ktx/api/restricted_current.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/runtime/ktx/api/res-2.2.0-alpha01.txt b/lifecycle/runtime/ktx/api/res-2.2.0-alpha01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/runtime/ktx/api/res-2.2.0-alpha01.txt
+++ /dev/null
diff --git a/lifecycle/runtime/ktx/api/res-2.2.0-alpha02.txt b/lifecycle/runtime/ktx/api/res-2.2.0-alpha02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/runtime/ktx/api/res-2.2.0-alpha02.txt
+++ /dev/null
diff --git a/lifecycle/runtime/ktx/api/restricted_2.2.0-alpha01.txt b/lifecycle/runtime/ktx/api/restricted_2.2.0-alpha01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/runtime/ktx/api/restricted_2.2.0-alpha01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/runtime/ktx/api/restricted_2.2.0-alpha02.txt b/lifecycle/runtime/ktx/api/restricted_2.2.0-alpha02.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/runtime/ktx/api/restricted_2.2.0-alpha02.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/runtime/ktx/api/restricted_current.txt b/lifecycle/runtime/ktx/api/restricted_current.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/runtime/ktx/api/restricted_current.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha01.txt b/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha01.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha02.txt b/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha02.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha03.txt b/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha03.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha03.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha04.txt b/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha04.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha04.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha05.txt b/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha05.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha05.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/res-2.1.0-beta00.txt b/lifecycle/viewmodel/ktx/api/res-2.1.0-beta00.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.1.0-beta00.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/res-2.1.0-beta01.txt b/lifecycle/viewmodel/ktx/api/res-2.1.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.1.0-beta01.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/res-2.1.0-beta02.txt b/lifecycle/viewmodel/ktx/api/res-2.1.0-beta02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.1.0-beta02.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/res-2.2.0-alpha01.txt b/lifecycle/viewmodel/ktx/api/res-2.2.0-alpha01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.2.0-alpha01.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/res-2.2.0-alpha02.txt b/lifecycle/viewmodel/ktx/api/res-2.2.0-alpha02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.2.0-alpha02.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/restricted_2.0.0.txt b/lifecycle/viewmodel/ktx/api/restricted_2.0.0.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_2.0.0.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-alpha03.txt b/lifecycle/viewmodel/ktx/api/restricted_2.1.0-alpha03.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-alpha03.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-alpha04.txt b/lifecycle/viewmodel/ktx/api/restricted_2.1.0-alpha04.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-alpha04.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-alpha05.txt b/lifecycle/viewmodel/ktx/api/restricted_2.1.0-alpha05.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-alpha05.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-beta00.txt b/lifecycle/viewmodel/ktx/api/restricted_2.1.0-beta00.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-beta00.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-beta01.txt b/lifecycle/viewmodel/ktx/api/restricted_2.1.0-beta01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-beta01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-beta02.txt b/lifecycle/viewmodel/ktx/api/restricted_2.1.0-beta02.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-beta02.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/restricted_2.2.0-alpha01.txt b/lifecycle/viewmodel/ktx/api/restricted_2.2.0-alpha01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_2.2.0-alpha01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/restricted_2.2.0-alpha02.txt b/lifecycle/viewmodel/ktx/api/restricted_2.2.0-alpha02.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_2.2.0-alpha02.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/restricted_current.txt b/lifecycle/viewmodel/ktx/api/restricted_current.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_current.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/paging/runtime/api/2.2.0-alpha01.txt b/paging/runtime/api/2.2.0-alpha01.txt
index bca6b7a..a3f5310 100644
--- a/paging/runtime/api/2.2.0-alpha01.txt
+++ b/paging/runtime/api/2.2.0-alpha01.txt
@@ -30,6 +30,12 @@
     method public androidx.paging.LivePagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
   }
 
+  public final class LivePagedListKt {
+    ctor public LivePagedListKt();
+    method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
+    method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
+  }
+
   public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
     ctor protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
     ctor protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
diff --git a/paging/runtime/api/current.txt b/paging/runtime/api/current.txt
index bca6b7a..a3f5310 100644
--- a/paging/runtime/api/current.txt
+++ b/paging/runtime/api/current.txt
@@ -30,6 +30,12 @@
     method public androidx.paging.LivePagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
   }
 
+  public final class LivePagedListKt {
+    ctor public LivePagedListKt();
+    method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
+    method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
+  }
+
   public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
     ctor protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
     ctor protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
diff --git a/paging/runtime/build.gradle b/paging/runtime/build.gradle
index 582fb7c..6b083c7 100644
--- a/paging/runtime/build.gradle
+++ b/paging/runtime/build.gradle
@@ -37,6 +37,8 @@
 
 dependencies {
     api(project(":paging:paging-common"))
+    // Ensure that the -ktx dependency graph mirrors the Java dependency graph
+    api(project(":paging:paging-common-ktx"))
 
     api(project(":arch:core-runtime"))
     api(ARCH_LIFECYCLE_RUNTIME)
@@ -45,15 +47,17 @@
     api(KOTLIN_STDLIB)
 
     androidTestImplementation project(':internal-testutils-common')
+    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
+    androidTestImplementation(ANDROIDX_TEST_CORE)
+    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(ARCH_CORE_TESTING)
+    androidTestImplementation(ESPRESSO_CORE)
     androidTestImplementation(JUNIT)
     androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation MOCKITO_KOTLIN, {
         exclude group: 'org.mockito' // to keep control on the mockito version
     }
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
 }
 
 androidx {
diff --git a/paging/runtime/ktx/api/2.2.0-alpha01.ignore b/paging/runtime/ktx/api/2.2.0-alpha01.ignore
new file mode 100644
index 0000000..ffce0e5
--- /dev/null
+++ b/paging/runtime/ktx/api/2.2.0-alpha01.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedPackage: androidx.paging:
+    Removed package androidx.paging
diff --git a/paging/runtime/ktx/api/2.2.0-alpha01.txt b/paging/runtime/ktx/api/2.2.0-alpha01.txt
index 9d5a1df..da4f6cc 100644
--- a/paging/runtime/ktx/api/2.2.0-alpha01.txt
+++ b/paging/runtime/ktx/api/2.2.0-alpha01.txt
@@ -1,11 +1 @@
 // Signature format: 3.0
-package androidx.paging {
-
-  public final class LivePagedListKt {
-    ctor public LivePagedListKt();
-    method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
-    method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
-  }
-
-}
-
diff --git a/paging/runtime/ktx/api/current.txt b/paging/runtime/ktx/api/current.txt
index 9d5a1df..da4f6cc 100644
--- a/paging/runtime/ktx/api/current.txt
+++ b/paging/runtime/ktx/api/current.txt
@@ -1,11 +1 @@
 // Signature format: 3.0
-package androidx.paging {
-
-  public final class LivePagedListKt {
-    ctor public LivePagedListKt();
-    method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
-    method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
-  }
-
-}
-
diff --git a/paging/runtime/ktx/api/restricted_2.2.0-alpha01.ignore b/paging/runtime/ktx/api/restricted_2.2.0-alpha01.ignore
new file mode 100644
index 0000000..9a97707
--- /dev/null
+++ b/paging/runtime/ktx/api/restricted_2.2.0-alpha01.ignore
@@ -0,0 +1 @@
+// Baseline format: 1.0
diff --git a/paging/runtime/ktx/build.gradle b/paging/runtime/ktx/build.gradle
index 7113572..af1684c 100644
--- a/paging/runtime/ktx/build.gradle
+++ b/paging/runtime/ktx/build.gradle
@@ -37,14 +37,7 @@
 dependencies {
     api(project(":paging:paging-runtime"))
     // Ensure that the -ktx dependency graph mirrors the Java dependency graph
-    api(project(":paging:paging-common-ktx"))
-    implementation(KOTLIN_STDLIB)
-
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ARCH_CORE_TESTING)
-    androidTestImplementation(ESPRESSO_CORE)
+    implementation(project(":paging:paging-common-ktx"))
 }
 
 androidx {
diff --git a/paging/runtime/ktx/src/main/AndroidManifest.xml b/paging/runtime/ktx/src/main/AndroidManifest.xml
index 9746b1a..344917f 100644
--- a/paging/runtime/ktx/src/main/AndroidManifest.xml
+++ b/paging/runtime/ktx/src/main/AndroidManifest.xml
@@ -1,16 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
+<!--
+  Copyright 2019 The Android Open Source Project
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
 
-          http://www.apache.org/licenses/LICENSE-2.0
+       http://www.apache.org/licenses/LICENSE-2.0
 
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
 <manifest package="androidx.paging.runtime.ktx"/>
diff --git a/paging/runtime/ktx/src/main/java/androidx/paging/LivePagedList.kt b/paging/runtime/ktx/src/main/java/androidx/paging/LivePagedList.kt
deleted file mode 100644
index 52343f4..0000000
--- a/paging/runtime/ktx/src/main/java/androidx/paging/LivePagedList.kt
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.paging
-
-import androidx.arch.core.executor.ArchTaskExecutor
-import androidx.lifecycle.LiveData
-import java.util.concurrent.Executor
-
-/**
- * Constructs a `LiveData<PagedList>`, from this `DataSource.Factory`, convenience for
- * [LivePagedListBuilder].
- *
- * No work (such as loading) is done immediately, the creation of the first PagedList is is
- * deferred until the LiveData is observed.
- *
- * @param config Paging configuration.
- * @param initialLoadKey Initial load key passed to the first PagedList/DataSource.
- * @param boundaryCallback The boundary callback for listening to PagedList load state.
- * @param fetchExecutor Executor for fetching data from DataSources.
- *
- * @see LivePagedListBuilder
- */
-fun <Key : Any, Value : Any> DataSource.Factory<Key, Value>.toLiveData(
-    config: PagedList.Config,
-    initialLoadKey: Key? = null,
-    boundaryCallback: PagedList.BoundaryCallback<Value>? = null,
-    fetchExecutor: Executor = ArchTaskExecutor.getIOThreadExecutor()
-): LiveData<PagedList<Value>> {
-    return LivePagedListBuilder(this, config)
-        .setInitialLoadKey(initialLoadKey)
-        .setBoundaryCallback(boundaryCallback)
-        .setFetchExecutor(fetchExecutor)
-        .build()
-}
-
-/**
- * Constructs a `LiveData<PagedList>`, from this `DataSource.Factory`, convenience for
- * [LivePagedListBuilder].
- *
- * No work (such as loading) is done immediately, the creation of the first PagedList is is
- * deferred until the LiveData is observed.
- *
- * @param pageSize Page size.
- * @param initialLoadKey Initial load key passed to the first PagedList/DataSource.
- * @param boundaryCallback The boundary callback for listening to PagedList load state.
- * @param fetchExecutor Executor for fetching data from DataSources.
- *
- * @see LivePagedListBuilder
- */
-fun <Key : Any, Value : Any> DataSource.Factory<Key, Value>.toLiveData(
-    pageSize: Int,
-    initialLoadKey: Key? = null,
-    boundaryCallback: PagedList.BoundaryCallback<Value>? = null,
-    fetchExecutor: Executor = ArchTaskExecutor.getIOThreadExecutor()
-): LiveData<PagedList<Value>> {
-    return LivePagedListBuilder(this, Config(pageSize))
-        .setInitialLoadKey(initialLoadKey)
-        .setBoundaryCallback(boundaryCallback)
-        .setFetchExecutor(fetchExecutor)
-        .build()
-}
diff --git a/paging/runtime/ktx/src/androidTest/java/androidx/paging/LivePagedListTest.kt b/paging/runtime/src/androidTest/java/androidx/paging/LivePagedListTest.kt
similarity index 97%
rename from paging/runtime/ktx/src/androidTest/java/androidx/paging/LivePagedListTest.kt
rename to paging/runtime/src/androidTest/java/androidx/paging/LivePagedListTest.kt
index c913e98..1d48562 100644
--- a/paging/runtime/ktx/src/androidTest/java/androidx/paging/LivePagedListTest.kt
+++ b/paging/runtime/src/androidTest/java/androidx/paging/LivePagedListTest.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2018 The Android Open Source Project
+ * Copyright 2019 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt b/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
index a68a7c9..c2514b5 100644
--- a/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
+++ b/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
@@ -16,6 +16,7 @@
 
 package androidx.paging
 
+import androidx.arch.core.executor.ArchTaskExecutor
 import androidx.lifecycle.LiveData
 import androidx.paging.futures.FutureCallback
 import androidx.paging.futures.addCallback
@@ -99,3 +100,57 @@
         )
     }
 }
+
+/**
+ * Constructs a `LiveData<PagedList>`, from this `DataSource.Factory`, convenience for
+ * [LivePagedListBuilder].
+ *
+ * No work (such as loading) is done immediately, the creation of the first PagedList is is
+ * deferred until the LiveData is observed.
+ *
+ * @param config Paging configuration.
+ * @param initialLoadKey Initial load key passed to the first PagedList/DataSource.
+ * @param boundaryCallback The boundary callback for listening to PagedList load state.
+ * @param fetchExecutor Executor for fetching data from DataSources.
+ *
+ * @see LivePagedListBuilder
+ */
+fun <Key : Any, Value : Any> DataSource.Factory<Key, Value>.toLiveData(
+    config: PagedList.Config,
+    initialLoadKey: Key? = null,
+    boundaryCallback: PagedList.BoundaryCallback<Value>? = null,
+    fetchExecutor: Executor = ArchTaskExecutor.getIOThreadExecutor()
+): LiveData<PagedList<Value>> {
+    return LivePagedListBuilder(this, config)
+        .setInitialLoadKey(initialLoadKey)
+        .setBoundaryCallback(boundaryCallback)
+        .setFetchExecutor(fetchExecutor)
+        .build()
+}
+
+/**
+ * Constructs a `LiveData<PagedList>`, from this `DataSource.Factory`, convenience for
+ * [LivePagedListBuilder].
+ *
+ * No work (such as loading) is done immediately, the creation of the first PagedList is is
+ * deferred until the LiveData is observed.
+ *
+ * @param pageSize Page size.
+ * @param initialLoadKey Initial load key passed to the first PagedList/DataSource.
+ * @param boundaryCallback The boundary callback for listening to PagedList load state.
+ * @param fetchExecutor Executor for fetching data from DataSources.
+ *
+ * @see LivePagedListBuilder
+ */
+fun <Key : Any, Value : Any> DataSource.Factory<Key, Value>.toLiveData(
+    pageSize: Int,
+    initialLoadKey: Key? = null,
+    boundaryCallback: PagedList.BoundaryCallback<Value>? = null,
+    fetchExecutor: Executor = ArchTaskExecutor.getIOThreadExecutor()
+): LiveData<PagedList<Value>> {
+    return LivePagedListBuilder(this, Config(pageSize))
+        .setInitialLoadKey(initialLoadKey)
+        .setBoundaryCallback(boundaryCallback)
+        .setFetchExecutor(fetchExecutor)
+        .build()
+}
diff --git a/paging/rxjava2/api/2.2.0-alpha01.txt b/paging/rxjava2/api/2.2.0-alpha01.txt
index b6cb673..0517d76 100644
--- a/paging/rxjava2/api/2.2.0-alpha01.txt
+++ b/paging/rxjava2/api/2.2.0-alpha01.txt
@@ -1,15 +1,19 @@
 // Signature format: 3.0
 package androidx.paging {
 
+  public final class RxDataSourceUtilKt {
+    ctor public RxDataSourceUtilKt();
+  }
+
   public final class RxPagedListBuilder<Key, Value> {
-    ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key!,Value!>, androidx.paging.PagedList.Config);
-    ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key!,Value!>, int);
-    method public io.reactivex.Flowable<androidx.paging.PagedList<Value!>!> buildFlowable(io.reactivex.BackpressureStrategy);
-    method public io.reactivex.Observable<androidx.paging.PagedList<Value!>!> buildObservable();
-    method public androidx.paging.RxPagedListBuilder<Key!,Value!> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value!>?);
-    method public androidx.paging.RxPagedListBuilder<Key!,Value!> setFetchScheduler(io.reactivex.Scheduler);
-    method public androidx.paging.RxPagedListBuilder<Key!,Value!> setInitialLoadKey(Key?);
-    method public androidx.paging.RxPagedListBuilder<Key!,Value!> setNotifyScheduler(io.reactivex.Scheduler);
+    ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+    ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+    method public io.reactivex.Flowable<androidx.paging.PagedList<Value>> buildFlowable(io.reactivex.BackpressureStrategy backpressureStrategy);
+    method public io.reactivex.Observable<androidx.paging.PagedList<Value>> buildObservable();
+    method public androidx.paging.RxPagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+    method public androidx.paging.RxPagedListBuilder<Key,Value> setFetchScheduler(io.reactivex.Scheduler scheduler);
+    method public androidx.paging.RxPagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+    method public androidx.paging.RxPagedListBuilder<Key,Value> setNotifyScheduler(io.reactivex.Scheduler scheduler);
   }
 
 }
diff --git a/paging/rxjava2/api/current.txt b/paging/rxjava2/api/current.txt
index b6cb673..0517d76 100644
--- a/paging/rxjava2/api/current.txt
+++ b/paging/rxjava2/api/current.txt
@@ -1,15 +1,19 @@
 // Signature format: 3.0
 package androidx.paging {
 
+  public final class RxDataSourceUtilKt {
+    ctor public RxDataSourceUtilKt();
+  }
+
   public final class RxPagedListBuilder<Key, Value> {
-    ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key!,Value!>, androidx.paging.PagedList.Config);
-    ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key!,Value!>, int);
-    method public io.reactivex.Flowable<androidx.paging.PagedList<Value!>!> buildFlowable(io.reactivex.BackpressureStrategy);
-    method public io.reactivex.Observable<androidx.paging.PagedList<Value!>!> buildObservable();
-    method public androidx.paging.RxPagedListBuilder<Key!,Value!> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value!>?);
-    method public androidx.paging.RxPagedListBuilder<Key!,Value!> setFetchScheduler(io.reactivex.Scheduler);
-    method public androidx.paging.RxPagedListBuilder<Key!,Value!> setInitialLoadKey(Key?);
-    method public androidx.paging.RxPagedListBuilder<Key!,Value!> setNotifyScheduler(io.reactivex.Scheduler);
+    ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+    ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+    method public io.reactivex.Flowable<androidx.paging.PagedList<Value>> buildFlowable(io.reactivex.BackpressureStrategy backpressureStrategy);
+    method public io.reactivex.Observable<androidx.paging.PagedList<Value>> buildObservable();
+    method public androidx.paging.RxPagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+    method public androidx.paging.RxPagedListBuilder<Key,Value> setFetchScheduler(io.reactivex.Scheduler scheduler);
+    method public androidx.paging.RxPagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+    method public androidx.paging.RxPagedListBuilder<Key,Value> setNotifyScheduler(io.reactivex.Scheduler scheduler);
   }
 
 }
diff --git a/paging/rxjava2/build.gradle b/paging/rxjava2/build.gradle
index bec9e53..913c946 100644
--- a/paging/rxjava2/build.gradle
+++ b/paging/rxjava2/build.gradle
@@ -36,9 +36,10 @@
     api(project(":paging:paging-common"))
     api(project(":arch:core-runtime"))
     api(RX_JAVA)
+    implementation(KOTLIN_STDLIB)
 
+    testImplementation project(':internal-testutils-common')
     testImplementation(JUNIT)
-    testImplementation(KOTLIN_STDLIB)
     testImplementation(KOTLIN_TEST_COMMON)
 }
 
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxDataSourceUtil.java b/paging/rxjava2/src/main/java/androidx/paging/RxDataSourceUtil.java
deleted file mode 100644
index b51cc105..0000000
--- a/paging/rxjava2/src/main/java/androidx/paging/RxDataSourceUtil.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.paging;
-
-import android.annotation.SuppressLint;
-
-import androidx.annotation.NonNull;
-import androidx.concurrent.futures.ResolvableFuture;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-import java.util.concurrent.Executor;
-
-import io.reactivex.Scheduler;
-import io.reactivex.Single;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.functions.Action;
-import io.reactivex.functions.BiConsumer;
-import io.reactivex.functions.Consumer;
-
-class RxDataSourceUtil {
-    private static class ListenableFutureDisposeListener implements Runnable {
-        private final ListenableFuture mFuture;
-        private final Disposable mDisposable;
-
-        ListenableFutureDisposeListener(@NonNull ListenableFuture future,
-                @NonNull Disposable disposable) {
-            mFuture = future;
-            mDisposable = disposable;
-        }
-
-        @Override
-        public void run() {
-            if (mFuture.isCancelled()) {
-                mDisposable.dispose();
-            }
-        }
-    }
-
-    private static class ListenableFutureSubscribeConsumer implements Consumer<Disposable> {
-        private CompositeDisposable mCompositeDisposable;
-
-        ListenableFutureSubscribeConsumer(CompositeDisposable compositeDisposable) {
-            mCompositeDisposable = compositeDisposable;
-        }
-
-        @Override
-        public void accept(Disposable disposable) {
-            mCompositeDisposable.add(disposable);
-        }
-    }
-
-    private static class ListenableFutureDisposeAction<T> implements Action {
-        private ResolvableFuture<T> mFuture;
-
-        ListenableFutureDisposeAction(ResolvableFuture<T> future) {
-            mFuture = future;
-        }
-
-        @Override
-        public void run() {
-            mFuture.cancel(true);
-        }
-    }
-
-    private static class ListenableFutureBiConsumer<T> implements BiConsumer<T, Throwable> {
-        private ResolvableFuture<T> mFuture;
-
-        ListenableFutureBiConsumer(ResolvableFuture<T> future) {
-            mFuture = future;
-        }
-
-        @Override
-        public void accept(T data, Throwable throwable) {
-            if (throwable != null) {
-                mFuture.setException(throwable);
-            } else {
-                mFuture.set(data);
-            }
-        }
-    }
-
-    @SuppressLint("CheckResult")
-    @SuppressWarnings("ResultOfMethodCallIgnored")
-    @NonNull
-    static <T> ListenableFuture<T> singleToListenableFuture(@NonNull Single<T> single,
-            @NonNull Executor executor, @NonNull Scheduler scheduler) {
-        final CompositeDisposable compositeDisposable = new CompositeDisposable();
-        final ResolvableFuture<T> future = ResolvableFuture.create();
-
-        future.addListener(new ListenableFutureDisposeListener(future, compositeDisposable),
-                executor);
-
-        single.subscribeOn(scheduler)
-                .observeOn(scheduler)
-                .doOnSubscribe(new ListenableFutureSubscribeConsumer(compositeDisposable))
-                .doOnDispose(new ListenableFutureDisposeAction<>(future))
-                .subscribe(new ListenableFutureBiConsumer<>(future));
-
-        return future;
-    }
-}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxDataSourceUtil.kt b/paging/rxjava2/src/main/java/androidx/paging/RxDataSourceUtil.kt
new file mode 100644
index 0000000..596a76c
--- /dev/null
+++ b/paging/rxjava2/src/main/java/androidx/paging/RxDataSourceUtil.kt
@@ -0,0 +1,91 @@
+/*
+ * 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.paging
+
+import android.annotation.SuppressLint
+import androidx.concurrent.futures.ResolvableFuture
+import com.google.common.util.concurrent.ListenableFuture
+import io.reactivex.Scheduler
+import io.reactivex.Single
+import io.reactivex.disposables.CompositeDisposable
+import io.reactivex.disposables.Disposable
+import io.reactivex.functions.Action
+import io.reactivex.functions.Consumer
+import java.util.concurrent.Executor
+
+private class ListenableFutureDisposeListener internal constructor(
+    private val future: ListenableFuture<*>,
+    private val disposable: Disposable
+) : Runnable {
+    override fun run() {
+        if (future.isCancelled) {
+            disposable.dispose()
+        }
+    }
+}
+
+private class ListenableFutureSubscribeConsumer internal constructor(
+    private val compositeDisposable: CompositeDisposable
+) : Consumer<Disposable> {
+    override fun accept(disposable: Disposable) {
+        compositeDisposable.add(disposable)
+    }
+}
+
+private class ListenableFutureDisposeAction<T> internal constructor(
+    private val future: ResolvableFuture<T>
+) : Action {
+    override fun run() {
+        future.cancel(true)
+    }
+}
+
+private class ListenableFutureSuccessConsumer<T> internal constructor(
+    private val future: ResolvableFuture<T>
+) : Consumer<T> {
+    override fun accept(data: T) {
+        future.set(data)
+    }
+}
+
+private class ListenableFutureErrorConsumer<T>
+internal constructor(private val future: ResolvableFuture<T>) : Consumer<Throwable> {
+    override fun accept(e: Throwable) {
+        future.setException(e)
+    }
+}
+
+@SuppressLint("CheckResult")
+internal fun <T> Single<T>.asListenableFuture(
+    executor: Executor,
+    scheduler: Scheduler
+): ListenableFuture<T> {
+    val compositeDisposable = CompositeDisposable()
+    val future = ResolvableFuture.create<T>()
+
+    future.addListener(ListenableFutureDisposeListener(future, compositeDisposable), executor)
+
+    val successConsumer = ListenableFutureSuccessConsumer(future)
+    val errorConsumer = ListenableFutureErrorConsumer(future)
+    subscribeOn(scheduler)
+        .observeOn(scheduler)
+        .doOnSubscribe(ListenableFutureSubscribeConsumer(compositeDisposable))
+        .doOnDispose(ListenableFutureDisposeAction(future))
+        .subscribe(successConsumer, errorConsumer)
+
+    return future
+}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxItemKeyedDataSource.java b/paging/rxjava2/src/main/java/androidx/paging/RxItemKeyedDataSource.java
deleted file mode 100644
index 325a08e..0000000
--- a/paging/rxjava2/src/main/java/androidx/paging/RxItemKeyedDataSource.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.paging;
-
-import androidx.annotation.NonNull;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-import java.util.concurrent.Executor;
-
-import io.reactivex.Scheduler;
-import io.reactivex.Single;
-
-abstract class RxItemKeyedDataSource<Key, Value> extends ListenableItemKeyedDataSource<Key, Value> {
-    private Scheduler mScheduler;
-
-    @Override
-    @NonNull
-    public final ListenableFuture<InitialResult<Value>> loadInitial(
-            @NonNull LoadInitialParams<Key> params) {
-        return RxDataSourceUtil.singleToListenableFuture(onLoadInitial(params),
-                getExecutor(), getScheduler());
-    }
-
-    @Override
-    @NonNull
-    public final ListenableFuture<Result<Value>> loadAfter(@NonNull LoadParams<Key> params) {
-        return RxDataSourceUtil.singleToListenableFuture(onLoadAfter(params),
-                getExecutor(), getScheduler());
-    }
-
-    @Override
-    @NonNull
-    public final ListenableFuture<Result<Value>> loadBefore(@NonNull LoadParams<Key> params) {
-        return RxDataSourceUtil.singleToListenableFuture(onLoadBefore(params),
-                getExecutor(), getScheduler());
-    }
-
-    /**
-     * An explicit getter is necessary to lazily init mScheduler as {@link DataSource#getExecutor()}
-     * throws an error if it is accessed before this DataSource is added to a {@link PagedList} and
-     * assigned an {@link Executor}.
-     */
-    private Scheduler getScheduler() {
-        final Executor executor = getExecutor();
-        if (mScheduler == null && executor instanceof Scheduler) {
-            mScheduler = (Scheduler) getExecutor();
-        } else if (mScheduler == null) {
-            mScheduler = new ScheduledExecutor(getExecutor());
-        }
-
-        return mScheduler;
-    }
-
-    /**
-     * Invoked to load initial data from this DataSource as a {@link Single}, e.g., when
-     * initializing or resuming state of a {@link PagedList}.
-     *
-     * Rx-extension of the parent method:
-     * {@link ListenableItemKeyedDataSource#loadInitial(
-     *ListenableItemKeyedDataSource.LoadInitialParams)}.
-     * <p>
-     * The {@link Single} returned by this method will be
-     * subscribed on this DataSource's executor, which is normally supplied via
-     * {@link RxPagedListBuilder#setFetchScheduler(Scheduler)} or
-     * {@link LivePagedListBuilder#setFetchExecutor(Executor)}.
-     *
-     * @param params Parameters for initial load, including initial key and requested size.
-     * @return {@link Single} that receives the loaded data, its size, and any adjacent page keys.
-     */
-    @NonNull
-    public abstract Single<InitialResult<Value>> onLoadInitial(
-            @NonNull LoadInitialParams<Key> params);
-
-    /**
-     * Invoked to load a page of data to be appended to this DataSource as a {@link Single} with
-     * the key specified by {@link ItemKeyedDataSource.LoadParams#key LoadParams.key}
-     *
-     * Rx-extension of the parent method:
-     * {@link ListenableItemKeyedDataSource#loadAfter(ListenableItemKeyedDataSource.LoadParams)}.
-     * <p>
-     * It's valid to return a different list size than the page size if it's easier, e.g. if your
-     * backend defines page sizes. It is generally preferred to increase the number loaded than
-     * reduce.
-     * <p>
-     * If data cannot be loaded (for example, if the request is invalid, or the data would be stale
-     * and inconsistent), it is valid to call {@link #invalidate()} to invalidate the data source,
-     * and prevent further loading.
-     * <p>
-     * The {@link Single} returned by this method will be
-     * subscribed on this DataSource's executor, which is normally supplied via
-     * {@link RxPagedListBuilder#setFetchScheduler(Scheduler)} or
-     * {@link LivePagedListBuilder#setFetchExecutor(Executor)}.
-     *
-     * @param params Parameters for the load, including the key to load after, and requested size.
-     * @return {@link Single} that receives the loaded data.
-     */
-    @NonNull
-    public abstract Single<Result<Value>> onLoadAfter(@NonNull LoadParams<Key> params);
-
-    /**
-     * Invoked to load a page of data to be prepended to this DataSource as a {@link Single} with
-     * the key specified by {@link ItemKeyedDataSource.LoadParams#key LoadParams.key}.
-     *
-     * Rx-extension of the parent method:
-     * {@link ListenableItemKeyedDataSource#loadBefore(ListenableItemKeyedDataSource.LoadParams)}.
-     * <p>
-     * It's valid to return a different list size than the page size if it's easier, e.g. if your
-     * backend defines page sizes. It is generally preferred to increase the number loaded than
-     * reduce.
-     * <p>
-     * <p class="note"><strong>Note:</strong> Data returned will be prepended just before the key
-     * passed, so if you don't return a page of the requested size, ensure that the last item is
-     * adjacent to the passed key.
-     * It's valid to return a different list size than the page size if it's easier, e.g. if your
-     * backend defines page sizes. It is generally preferred to increase the number loaded than
-     * reduce.
-     * <p>
-     * If data cannot be loaded (for example, if the request is invalid, or the data would be stale
-     * and inconsistent), it is valid to call {@link #invalidate()} to invalidate the data source,
-     * and prevent further loading.
-     * <p>
-     * The {@link Single} returned by this method will be
-     * subscribed on this DataSource's executor, which is normally supplied via
-     * {@link RxPagedListBuilder#setFetchScheduler(Scheduler)} or
-     * {@link LivePagedListBuilder#setFetchExecutor(Executor)}.
-     *
-     * @param params Parameters for the load, including the key to load before, and requested size.
-     * @return {@link Single} that receives the loaded data.
-     */
-    @NonNull
-    public abstract Single<Result<Value>> onLoadBefore(@NonNull LoadParams<Key> params);
-}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxItemKeyedDataSource.kt b/paging/rxjava2/src/main/java/androidx/paging/RxItemKeyedDataSource.kt
new file mode 100644
index 0000000..5693f85
--- /dev/null
+++ b/paging/rxjava2/src/main/java/androidx/paging/RxItemKeyedDataSource.kt
@@ -0,0 +1,112 @@
+/*
+ * 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.paging
+
+import io.reactivex.Scheduler
+import io.reactivex.Single
+
+internal abstract class RxItemKeyedDataSource<Key : Any, Value : Any> :
+    ListenableItemKeyedDataSource<Key, Value>() {
+
+    /**
+     * Must be lazily init  as [DataSource.executor] throws an error if it is accessed before this
+     * DataSource is added to a [PagedList] and assigned an [java.util.concurrent.Executor].
+     */
+    private val scheduler: Scheduler by lazy {
+        when (executor) {
+            is Scheduler -> executor as Scheduler
+            else -> ScheduledExecutor(executor)
+        }
+    }
+
+    override fun loadInitial(params: LoadInitialParams<Key>) =
+        onLoadInitial(params).asListenableFuture(executor, scheduler)
+
+    override fun loadAfter(params: LoadParams<Key>) =
+        onLoadAfter(params).asListenableFuture(executor, scheduler)
+
+    override fun loadBefore(params: LoadParams<Key>) =
+        onLoadBefore(params).asListenableFuture(executor, scheduler)
+
+    /**
+     * Invoked to load initial data from this DataSource as a [Single], e.g., when initializing or
+     * resuming state of a [PagedList].
+     *
+     * Rx-extension of the parent method: [ListenableItemKeyedDataSource.loadInitial].
+     *
+     * The [Single] returned by this method will be subscribed on this DataSource's executor, which
+     * is normally supplied via [RxPagedListBuilder.setFetchScheduler] or
+     * [LivePagedListBuilder.setFetchExecutor].
+     *
+     * @param params Parameters for initial load, including initial key and requested size.
+     * @return [Single] that receives the loaded data, its size, and any adjacent page keys.
+     */
+    abstract fun onLoadInitial(params: LoadInitialParams<Key>): Single<InitialResult<Value>>
+
+    /**
+     * Invoked to load a page of data to be appended to this DataSource as a [Single] with the key
+     * specified by [LoadParams.key][ItemKeyedDataSource.LoadParams.key]
+     *
+     * Rx-extension of the parent method: [ListenableItemKeyedDataSource.loadAfter].
+     *
+     * It's valid to return a different list size than the page size if it's easier, e.g. if your
+     * backend defines page sizes. It is generally preferred to increase the number loaded than
+     * reduce.
+     *
+     * If data cannot be loaded (for example, if the request is invalid, or the data would be stale
+     * and inconsistent), it is valid to call [.invalidate] to invalidate the data source, and
+     * prevent further loading.
+     *
+     * The [Single] returned by this method will be subscribed on this DataSource's executor, which
+     * is normally supplied via [RxPagedListBuilder.setFetchScheduler] or
+     * [LivePagedListBuilder.setFetchExecutor].
+     *
+     * @param params Parameters for the load, including the key to load after, and requested size.
+     * @return [Single] that receives the loaded data.
+     */
+    abstract fun onLoadAfter(params: LoadParams<Key>): Single<Result<Value>>
+
+    /**
+     * Invoked to load a page of data to be prepended to this DataSource as a [Single] with the key
+     * specified by [LoadParams.key][ItemKeyedDataSource.LoadParams.key].
+     *
+     * Rx-extension of the parent method: [ListenableItemKeyedDataSource.loadBefore].
+     *
+     * It's valid to return a different list size than the page size if it's easier, e.g. if your
+     * backend defines page sizes. It is generally preferred to increase the number loaded than
+     * reduce.
+     *
+     * **Note:** Data returned will be prepended just before the key
+     * passed, so if you don't return a page of the requested size, ensure that the last item is
+     * adjacent to the passed key.
+     * It's valid to return a different list size than the page size if it's easier, e.g. if your
+     * backend defines page sizes. It is generally preferred to increase the number loaded than
+     * reduce.
+     *
+     * If data cannot be loaded (for example, if the request is invalid, or the data would be stale
+     * and inconsistent), it is valid to call [.invalidate] to invalidate the data source,
+     * and prevent further loading.
+     *
+     * The [Single] returned by this method will be subscribed on this DataSource's executor, which
+     * is normally supplied via [RxPagedListBuilder.setFetchScheduler] or
+     * [LivePagedListBuilder.setFetchExecutor].
+     *
+     * @param params Parameters for the load, including the key to load before, and requested size.
+     * @return [Single] that receives the loaded data.
+     */
+    abstract fun onLoadBefore(params: LoadParams<Key>): Single<Result<Value>>
+}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxPageKeyedDataSource.java b/paging/rxjava2/src/main/java/androidx/paging/RxPageKeyedDataSource.java
deleted file mode 100644
index 8d3c9a7..0000000
--- a/paging/rxjava2/src/main/java/androidx/paging/RxPageKeyedDataSource.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.paging;
-
-import androidx.annotation.NonNull;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-import java.util.concurrent.Executor;
-
-import io.reactivex.Scheduler;
-import io.reactivex.Single;
-
-abstract class RxPageKeyedDataSource<Key, Value> extends ListenablePageKeyedDataSource<Key, Value> {
-    private Scheduler mScheduler;
-
-    @Override
-    @NonNull
-    public final ListenableFuture<InitialResult<Key, Value>> loadInitial(
-            @NonNull LoadInitialParams<Key> params) {
-        return RxDataSourceUtil.singleToListenableFuture(onLoadInitial(params),
-                getExecutor(), getScheduler());
-    }
-
-    @Override
-    @NonNull
-    public final ListenableFuture<Result<Key, Value>> loadAfter(@NonNull LoadParams<Key> params) {
-        return RxDataSourceUtil.singleToListenableFuture(onLoadAfter(params),
-                getExecutor(), getScheduler());
-    }
-
-    @Override
-    @NonNull
-    public final ListenableFuture<Result<Key, Value>> loadBefore(@NonNull LoadParams<Key> params) {
-        return RxDataSourceUtil.singleToListenableFuture(onLoadBefore(params),
-                getExecutor(), getScheduler());
-    }
-
-    /**
-     * An explicit getter is necessary to lazily init mScheduler as {@link DataSource#getExecutor()}
-     * throws an error if it is accessed before this DataSource is added to a {@link PagedList} and
-     * assigned an {@link Executor}.
-     */
-    private Scheduler getScheduler() {
-        if (mScheduler == null) {
-            mScheduler = new ScheduledExecutor(getExecutor());
-        }
-
-        return mScheduler;
-    }
-
-    /**
-     * Invoked to load initial data from this DataSource as a {@link Single}, e.g., when
-     * initializing or resuming state of a {@link PagedList}.
-     *
-     * Rx-extension of the parent method:
-     * {@link ListenablePageKeyedDataSource#loadInitial(
-     *ListenablePageKeyedDataSource.LoadInitialParams)}.
-     * <p>
-     * The {@link Single} returned by this method will be
-     * subscribed on this DataSource's executor, which is normally supplied via
-     * {@link RxPagedListBuilder#setFetchScheduler(Scheduler)} or
-     * {@link LivePagedListBuilder#setFetchExecutor(Executor)}.
-     *
-     * @param params Parameters for initial load, including requested start position, load size, and
-     *               page size.
-     * @return {@link Single} that receives the loaded data, its size, and any adjacent page keys.
-     */
-    @NonNull
-    public abstract Single<InitialResult<Key, Value>> onLoadInitial(LoadInitialParams<Key> params);
-
-    /**
-     * Invoked to load a page of data to be appended to this DataSource as a {@link Single} with
-     * the key specified by {@link PageKeyedDataSource.LoadParams#key LoadParams.key}.
-     *
-     * Rx-extension of the parent method:
-     * {@link ListenablePageKeyedDataSource#loadAfter(ListenablePageKeyedDataSource.LoadParams)}.
-     * <p>
-     * It's valid to return a different list size than the page size if it's easier, e.g. if your
-     * backend defines page sizes. It is generally preferred to increase the number loaded than
-     * reduce.
-     * <p>
-     * If data cannot be loaded (for example, if the request is invalid, or the data would be stale
-     * and inconsistent), it is valid to call {@link #invalidate()} to invalidate the data source,
-     * and prevent further loading.
-     * <p>
-     * The {@link Single} returned by this method will be
-     * subscribed on this DataSource's executor, which is normally supplied via
-     * {@link RxPagedListBuilder#setFetchScheduler(Scheduler)} or
-     * {@link LivePagedListBuilder#setFetchExecutor(Executor)}.
-     *
-     * @param params Parameters for the load, including the key for the new page, and requested load
-     *               size.
-     * @return {@link Single} that receives the loaded data.
-     */
-    @NonNull
-    public abstract Single<Result<Key, Value>> onLoadAfter(LoadParams<Key> params);
-
-    /**
-     * Invoked to load a page of data to be prepended to this DataSource as a {@link Single} with
-     * the key specified by {@link PageKeyedDataSource.LoadParams#key LoadParams.key}.
-     *
-     * Rx-extension of the parent method:
-     * {@link ListenablePageKeyedDataSource#loadBefore(ListenablePageKeyedDataSource.LoadParams)}.
-     * <p>
-     * It's valid to return a different list size than the page size if it's easier, e.g. if your
-     * backend defines page sizes. It is generally preferred to increase the number loaded than
-     * reduce.
-     * <p>
-     * If data cannot be loaded (for example, if the request is invalid, or the data would be stale
-     * and inconsistent), it is valid to call {@link #invalidate()} to invalidate the data source,
-     * and prevent further loading.
-     * <p>
-     * The {@link Single} returned by this method will be
-     * subscribed on this DataSource's executor, which is normally supplied via
-     * {@link RxPagedListBuilder#setFetchScheduler(Scheduler)} or
-     * {@link LivePagedListBuilder#setFetchExecutor(Executor)}.
-     *
-     * @param params Parameters for the load, including the key for the new page, and requested load
-     *               size.
-     * @return {@link Single} that receives the loaded data.
-     */
-    @NonNull
-    public abstract Single<Result<Key, Value>> onLoadBefore(LoadParams<Key> params);
-}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxPageKeyedDataSource.kt b/paging/rxjava2/src/main/java/androidx/paging/RxPageKeyedDataSource.kt
new file mode 100644
index 0000000..0f1e7b5
--- /dev/null
+++ b/paging/rxjava2/src/main/java/androidx/paging/RxPageKeyedDataSource.kt
@@ -0,0 +1,110 @@
+/*
+ * 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.paging
+
+import com.google.common.util.concurrent.ListenableFuture
+import io.reactivex.Scheduler
+import io.reactivex.Single
+import java.util.concurrent.Executor
+
+internal abstract class RxPageKeyedDataSource<Key : Any, Value : Any> :
+    ListenablePageKeyedDataSource<Key, Value>() {
+
+    /**
+     * Must be lazily init  as [DataSource.executor] throws an error if it is accessed before this
+     * DataSource is added to a [PagedList] and assigned an [Executor].
+     */
+    private val scheduler: Scheduler by lazy {
+        when (executor) {
+            is Scheduler -> executor as Scheduler
+            else -> ScheduledExecutor(executor)
+        }
+    }
+
+    override fun loadInitial(params: LoadInitialParams<Key>) =
+        onLoadInitial(params).asListenableFuture(executor, scheduler)
+
+    override fun loadAfter(params: LoadParams<Key>) =
+        onLoadAfter(params).asListenableFuture(executor, scheduler)
+
+    override fun loadBefore(params: LoadParams<Key>): ListenableFuture<Result<Key, Value>> =
+        onLoadBefore(params).asListenableFuture(executor, scheduler)
+
+    /**
+     * Invoked to load initial data from this DataSource as a [Single], e.g., when initializing or
+     * resuming state of a [PagedList].
+     *
+     * Rx-extension of the parent method: [ListenablePageKeyedDataSource.loadInitial].
+     *
+     * The [Single] returned by this method will be
+     * subscribed on this DataSource's executor, which is normally supplied via
+     * [RxPagedListBuilder.setFetchScheduler] or [LivePagedListBuilder.setFetchExecutor].
+     *
+     * @param params Parameters for initial load, including requested start position, load size, and
+     *               page size.
+     * @return [Single] that receives the loaded data, its size, and any adjacent page keys.
+     */
+    abstract fun onLoadInitial(params: LoadInitialParams<Key>): Single<InitialResult<Key, Value>>
+
+    /**
+     * Invoked to load a page of data to be appended to this DataSource as a [Single] with
+     * the key specified by [LoadParams.key][PageKeyedDataSource.LoadParams.key].
+     *
+     * Rx-extension of the parent method: [ListenablePageKeyedDataSource.loadAfter].
+     *
+     * It's valid to return a different list size than the page size if it's easier, e.g. if your
+     * backend defines page sizes. It is generally preferred to increase the number loaded than
+     * reduce.
+     *
+     * If data cannot be loaded (for example, if the request is invalid, or the data would be stale
+     * and inconsistent), it is valid to call [.invalidate] to invalidate the data source,
+     * and prevent further loading.
+     *
+     * The [Single] returned by this method will be subscribed on this DataSource's executor,
+     * which is normally supplied via [RxPagedListBuilder.setFetchScheduler] or
+     * [LivePagedListBuilder.setFetchExecutor].
+     *
+     * @param params Parameters for the load, including the key for the new page, and requested load
+     *               size.
+     * @return [Single] that receives the loaded data.
+     */
+    abstract fun onLoadAfter(params: LoadParams<Key>): Single<Result<Key, Value>>
+
+    /**
+     * Invoked to load a page of data to be prepended to this DataSource as a [Single] with the key
+     * specified by [LoadParams.key][PageKeyedDataSource.LoadParams.key].
+     *
+     * Rx-extension of the parent method: [ListenablePageKeyedDataSource.loadBefore].
+     *
+     * It's valid to return a different list size than the page size if it's easier, e.g. if your
+     * backend defines page sizes. It is generally preferred to increase the number loaded than
+     * reduce.
+     *
+     * If data cannot be loaded (for example, if the request is invalid, or the data would be stale
+     * and inconsistent), it is valid to call [.invalidate] to invalidate the data source, and
+     * prevent further loading.
+     *
+     * The [Single] returned by this method will be subscribed on this DataSource's executor, which
+     * is normally supplied via [RxPagedListBuilder.setFetchScheduler] or
+     * [LivePagedListBuilder.setFetchExecutor].
+     *
+     * @param params Parameters for the load, including the key for the new page, and requested load
+     *               size.
+     * @return [Single] that receives the loaded data.
+     */
+    abstract fun onLoadBefore(params: LoadParams<Key>): Single<Result<Key, Value>>
+}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.java b/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.java
deleted file mode 100644
index 271a56d..0000000
--- a/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.paging;
-
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.arch.core.executor.ArchTaskExecutor;
-
-import java.util.concurrent.Executor;
-
-import io.reactivex.BackpressureStrategy;
-import io.reactivex.Flowable;
-import io.reactivex.Observable;
-import io.reactivex.ObservableEmitter;
-import io.reactivex.ObservableOnSubscribe;
-import io.reactivex.Scheduler;
-import io.reactivex.functions.Cancellable;
-
-/**
- * Builder for {@code Observable<PagedList>} or {@code Flowable<PagedList>}, given a
- * {@link androidx.paging.DataSource.Factory} and a {@link androidx.paging.PagedList.Config}.
- * <p>
- * The required parameters are in the constructor, so you can simply construct and build, or
- * optionally enable extra features (such as initial load key, or BoundaryCallback).
- * <p>
- * The returned observable/flowable will already be subscribed on the
- * {@link #setFetchScheduler(Scheduler)}, and will perform all loading on that scheduler. It will
- * already be observed on {@link #setNotifyScheduler(Scheduler)}, and will dispatch new PagedLists,
- * as well as their updates to that scheduler.
- *
- * @param <Key>   Type of input valued used to load data from the DataSource. Must be integer if
- *                you're using PositionalDataSource.
- * @param <Value> Item type being presented.
- */
-public final class RxPagedListBuilder<Key, Value> {
-    private Key mInitialLoadKey;
-    private PagedList.Config mConfig;
-    private DataSource.Factory<Key, Value> mDataSourceFactory;
-    private PagedList.BoundaryCallback mBoundaryCallback;
-    private Executor mNotifyExecutor;
-    private Scheduler mNotifyScheduler;
-    private Executor mFetchExecutor;
-    private Scheduler mFetchScheduler;
-
-    /**
-     * Creates a RxPagedListBuilder with required parameters.
-     *
-     * @param dataSourceFactory DataSource factory providing DataSource generations.
-     * @param config            Paging configuration.
-     */
-    public RxPagedListBuilder(@NonNull DataSource.Factory<Key, Value> dataSourceFactory,
-            @NonNull PagedList.Config config) {
-        //noinspection ConstantConditions
-        if (config == null) {
-            throw new IllegalArgumentException("PagedList.Config must be provided");
-        }
-        //noinspection ConstantConditions
-        if (dataSourceFactory == null) {
-            throw new IllegalArgumentException("DataSource.Factory must be provided");
-        }
-        mDataSourceFactory = dataSourceFactory;
-        mConfig = config;
-    }
-
-    /**
-     * Creates a RxPagedListBuilder with required parameters.
-     *
-     * This method is a convenience for:
-     * <pre>
-     * RxPagedListBuilder(dataSourceFactory,
-     *         new PagedList.Config.Builder().setPageSize(pageSize).build())
-     * </pre>
-     *
-     * @param dataSourceFactory DataSource.Factory providing DataSource generations.
-     * @param pageSize          Size of pages to load.
-     */
-    @SuppressWarnings("unused")
-    public RxPagedListBuilder(
-            @NonNull DataSource.Factory<Key, Value> dataSourceFactory,
-            int pageSize
-    ) {
-        this(dataSourceFactory, new PagedList.Config.Builder().setPageSize(pageSize).build());
-    }
-
-    /**
-     * First loading key passed to the first PagedList/DataSource.
-     *
-     * When a new PagedList/DataSource pair is created after the first, it acquires a load key from
-     * the previous generation so that data is loaded around the position already being observed.
-     *
-     * @param key Initial load key passed to the first PagedList/DataSource.
-     * @return this
-     */
-    @SuppressWarnings("unused")
-    @NonNull
-    public RxPagedListBuilder<Key, Value> setInitialLoadKey(@Nullable Key key) {
-        mInitialLoadKey = key;
-        return this;
-    }
-
-    /**
-     * Sets a {@link androidx.paging.PagedList.BoundaryCallback} on each PagedList created,
-     * typically used to load additional data from network when paging from local storage.
-     *
-     * Pass a BoundaryCallback to listen to when the PagedList runs out of data to load. If this
-     * method is not called, or {@code null} is passed, you will not be notified when each
-     * DataSource runs out of data to provide to its PagedList.
-     * <p>
-     * If you are paging from a DataSource.Factory backed by local storage, you can set a
-     * BoundaryCallback to know when there is no more information to page from local storage.
-     * This is useful to page from the network when local storage is a cache of network data.
-     * <p>
-     * Note that when using a BoundaryCallback with a {@code Observable<PagedList>}, method calls
-     * on the callback may be dispatched multiple times - one for each PagedList/DataSource
-     * pair. If loading network data from a BoundaryCallback, you should prevent multiple
-     * dispatches of the same method from triggering multiple simultaneous network loads.
-     *
-     * @param boundaryCallback The boundary callback for listening to PagedList load state.
-     * @return this
-     */
-    @SuppressWarnings("unused")
-    @NonNull
-    public RxPagedListBuilder<Key, Value> setBoundaryCallback(
-            @Nullable PagedList.BoundaryCallback<Value> boundaryCallback) {
-        mBoundaryCallback = boundaryCallback;
-        return this;
-    }
-
-    /**
-     * Sets scheduler which will be used for observing new PagedLists, as well as loading updates
-     * within the PagedLists.
-     *
-     * If not set, defaults to the UI thread.
-     * <p>
-     * The built observable/flowable will be observed on this scheduler, so that the thread
-     * receiving PagedLists will also receive the internal updates to the PagedList.
-     *
-     * @param scheduler Scheduler that receives PagedList updates, and where
-     *                  {@link androidx.paging.PagedList.Callback} calls are dispatched. Generally,
-     *                  this is the UI/main thread.
-     * @return this
-     */
-    @NonNull
-    public RxPagedListBuilder<Key, Value> setNotifyScheduler(final @NonNull Scheduler scheduler) {
-        if (scheduler instanceof Executor) {
-            mNotifyExecutor = (ScheduledExecutor) scheduler;
-        } else {
-            mNotifyExecutor = new ScheduledExecutor(scheduler);
-        }
-        mNotifyScheduler = scheduler;
-        return this;
-    }
-
-    /**
-     * Sets scheduler which will be used for background fetching of PagedLists, as well as on-demand
-     * fetching of pages inside.
-     *
-     * If not set, defaults to the Arch components I/O thread pool.
-     * <p>
-     * The built observable/flowable will be subscribed on this scheduler.
-     *
-     * @param scheduler Scheduler used to fetch from DataSources, generally a background
-     *                  thread pool for e.g. I/O or network loading.
-     * @return this
-     */
-    @SuppressWarnings("unused")
-    @NonNull
-    public RxPagedListBuilder<Key, Value> setFetchScheduler(final @NonNull Scheduler scheduler) {
-        if (scheduler instanceof ScheduledExecutor) {
-            mFetchExecutor = (ScheduledExecutor) scheduler;
-        } else {
-            mFetchExecutor = new ScheduledExecutor(scheduler);
-        }
-        mFetchScheduler = scheduler;
-        return this;
-    }
-
-    /**
-     * Constructs a {@code Observable<PagedList>}.
-     *
-     * The returned Observable will already be observed on the
-     * {@link #setNotifyScheduler(Scheduler) notify scheduler}, and subscribed on the
-     * {@link #setFetchScheduler(Scheduler) fetch scheduler}.
-     *
-     * @return The Observable of PagedLists
-     */
-    @NonNull
-    public Observable<PagedList<Value>> buildObservable() {
-        if (mNotifyExecutor == null) {
-            ScheduledExecutor scheduledExecutor = new ScheduledExecutor(
-                    ArchTaskExecutor.getMainThreadExecutor());
-            mNotifyExecutor = scheduledExecutor;
-            mNotifyScheduler = scheduledExecutor;
-        }
-        if (mFetchExecutor == null) {
-            ScheduledExecutor scheduledExecutor = new ScheduledExecutor(
-                    ArchTaskExecutor.getIOThreadExecutor());
-            mFetchExecutor = scheduledExecutor;
-            mFetchScheduler = scheduledExecutor;
-        }
-        return Observable.create(new PagingObservableOnSubscribe<>(
-                mInitialLoadKey,
-                mConfig,
-                mBoundaryCallback,
-                mDataSourceFactory,
-                mNotifyExecutor,
-                mFetchExecutor))
-                .observeOn(mNotifyScheduler)
-                .subscribeOn(mFetchScheduler);
-    }
-
-    /**
-     * Constructs a {@code Flowable<PagedList>}.
-     *
-     * The returned Observable will already be observed on the
-     * {@link #setNotifyScheduler(Scheduler) notify scheduler}, and subscribed on the
-     * {@link #setFetchScheduler(Scheduler) fetch scheduler}.
-     *
-     * @param backpressureStrategy BackpressureStrategy for the Flowable to use.
-     * @return The Flowable of PagedLists
-     */
-    @NonNull
-    public Flowable<PagedList<Value>> buildFlowable(
-            @NonNull BackpressureStrategy backpressureStrategy) {
-        return buildObservable()
-                .toFlowable(backpressureStrategy);
-    }
-
-    static class PagingObservableOnSubscribe<Key, Value>
-            implements ObservableOnSubscribe<PagedList<Value>>, DataSource.InvalidatedCallback,
-            Cancellable,
-            Runnable {
-
-        @Nullable
-        private final Key mInitialLoadKey;
-        @NonNull
-        private final PagedList.Config mConfig;
-        @Nullable
-        private final PagedList.BoundaryCallback mBoundaryCallback;
-        @NonNull
-        private final DataSource.Factory<Key, Value> mDataSourceFactory;
-        @NonNull
-        private final Executor mNotifyExecutor;
-        @NonNull
-        private final Executor mFetchExecutor;
-
-        @Nullable
-        private PagedList<Value> mList;
-        @Nullable
-        private DataSource<Key, Value> mDataSource;
-
-        private ObservableEmitter<PagedList<Value>> mEmitter;
-
-        PagingObservableOnSubscribe(@Nullable Key initialLoadKey,
-                @NonNull PagedList.Config config,
-                @Nullable PagedList.BoundaryCallback boundaryCallback,
-                @NonNull DataSource.Factory<Key, Value> dataSourceFactory,
-                @NonNull Executor notifyExecutor,
-                @NonNull Executor fetchExecutor) {
-            mInitialLoadKey = initialLoadKey;
-            mConfig = config;
-            mBoundaryCallback = boundaryCallback;
-            mDataSourceFactory = dataSourceFactory;
-            mNotifyExecutor = notifyExecutor;
-            mFetchExecutor = fetchExecutor;
-        }
-
-        @Override
-        public void subscribe(ObservableEmitter<PagedList<Value>> emitter) {
-            mEmitter = emitter;
-            mEmitter.setCancellable(this);
-
-            // known that subscribe is already on fetchScheduler
-            mEmitter.onNext(createPagedList());
-        }
-
-        @Override
-        public void cancel() {
-            if (mDataSource != null) {
-                mDataSource.removeInvalidatedCallback(this);
-            }
-        }
-
-        @Override
-        public void run() {
-            // fetch data, run on fetchExecutor
-            mEmitter.onNext(createPagedList());
-        }
-
-        @Override
-        public void onInvalidated() {
-            if (!mEmitter.isDisposed()) {
-                mFetchExecutor.execute(this);
-            }
-        }
-
-        @SuppressWarnings({"unchecked", "deprecation"}) // for getLastKey cast, and Builder.build()
-        private PagedList<Value> createPagedList() {
-            @Nullable Key initializeKey = mInitialLoadKey;
-            if (mList != null) {
-                initializeKey = (Key) mList.getLastKey();
-            }
-
-            do {
-                if (mDataSource != null) {
-                    mDataSource.removeInvalidatedCallback(this);
-                }
-                mDataSource = mDataSourceFactory.create();
-                mDataSource.addInvalidatedCallback(this);
-
-                mList = new PagedList.Builder<>(mDataSource, mConfig)
-                        .setNotifyExecutor(mNotifyExecutor)
-                        .setFetchExecutor(mFetchExecutor)
-                        .setBoundaryCallback(mBoundaryCallback)
-                        .setInitialKey(initializeKey)
-                        .build();
-            } while (mList.isDetached());
-            return mList;
-        }
-    }
-}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.kt b/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.kt
new file mode 100644
index 0000000..14d5f8f
--- /dev/null
+++ b/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.kt
@@ -0,0 +1,262 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.paging
+
+import androidx.arch.core.executor.ArchTaskExecutor
+import io.reactivex.BackpressureStrategy
+import io.reactivex.Flowable
+import io.reactivex.Observable
+import io.reactivex.ObservableEmitter
+import io.reactivex.ObservableOnSubscribe
+import io.reactivex.Scheduler
+import io.reactivex.functions.Cancellable
+import java.util.concurrent.Executor
+
+/**
+ * Builder for `Observable<PagedList>` or `Flowable<PagedList>`, given a [DataSource.Factory] and a
+ * [PagedList.Config].
+ *
+ * The required parameters are in the constructor, so you can simply construct and build, or
+ * optionally enable extra features (such as initial load key, or BoundaryCallback).
+ *
+ * The returned observable/flowable will already be subscribed on the [setFetchScheduler], and will
+ * perform all loading on that scheduler. It will already be observed on [setNotifyScheduler], and
+ * will dispatch new PagedLists, as well as their updates to that scheduler.
+ *
+ * @param Key Type of input valued used to load data from the DataSource. Must be integer if you're
+ *            using PositionalDataSource.
+ * @param Value Item type being presented.
+ *
+ * @constructor Creates a RxPagedListBuilder with required parameters.
+ * @param dataSourceFactory DataSource factory providing DataSource generations.
+ * @param config Paging configuration.
+ */
+class RxPagedListBuilder<Key : Any, Value : Any>(
+    private val dataSourceFactory: DataSource.Factory<Key, Value>,
+    private val config: PagedList.Config
+) {
+    private var initialLoadKey: Key? = null
+    private var boundaryCallback: PagedList.BoundaryCallback<Value>? = null
+    private lateinit var notifyExecutor: Executor
+    private lateinit var notifyScheduler: Scheduler
+    private lateinit var fetchExecutor: Executor
+    private lateinit var fetchScheduler: Scheduler
+
+    /**
+     * Creates a RxPagedListBuilder with required parameters.
+     *
+     * This method is a convenience for:
+     * ```
+     * RxPagedListBuilder(dataSourceFactory,
+     *         new PagedList.Config.Builder().setPageSize(pageSize).build())
+     * ```
+     *
+     * @param dataSourceFactory [DataSource.Factory] providing DataSource generations.
+     * @param pageSize Size of pages to load.
+     */
+    constructor(dataSourceFactory: DataSource.Factory<Key, Value>, pageSize: Int) : this(
+        dataSourceFactory,
+        PagedList.Config.Builder().setPageSize(pageSize).build()
+    )
+
+    /**
+     * First loading key passed to the first PagedList/DataSource.
+     *
+     * When a new PagedList/DataSource pair is created after the first, it acquires a load key from
+     * the previous generation so that data is loaded around the position already being observed.
+     *
+     * @param key Initial load key passed to the first PagedList/DataSource.
+     * @return this
+     */
+    fun setInitialLoadKey(key: Key?) = apply {
+        initialLoadKey = key
+    }
+
+    /**
+     * Sets a [androidx.paging.PagedList.BoundaryCallback] on each PagedList created,
+     * typically used to load additional data from network when paging from local storage.
+     *
+     * Pass a BoundaryCallback to listen to when the PagedList runs out of data to load. If this
+     * method is not called, or `null` is passed, you will not be notified when each
+     * DataSource runs out of data to provide to its PagedList.
+     *
+     * If you are paging from a DataSource.Factory backed by local storage, you can set a
+     * BoundaryCallback to know when there is no more information to page from local storage.
+     * This is useful to page from the network when local storage is a cache of network data.
+     *
+     * Note that when using a BoundaryCallback with a `Observable<PagedList>`, method calls
+     * on the callback may be dispatched multiple times - one for each PagedList/DataSource
+     * pair. If loading network data from a BoundaryCallback, you should prevent multiple
+     * dispatches of the same method from triggering multiple simultaneous network loads.
+     *
+     * @param boundaryCallback The boundary callback for listening to PagedList load state.
+     * @return this
+     */
+    fun setBoundaryCallback(boundaryCallback: PagedList.BoundaryCallback<Value>?) = apply {
+        this.boundaryCallback = boundaryCallback
+    }
+
+    /**
+     * Sets scheduler which will be used for observing new PagedLists, as well as loading updates
+     * within the PagedLists.
+     *
+     * If not set, defaults to the UI thread.
+     *
+     * The built observable/flowable will be observed on this scheduler, so that the thread
+     * receiving PagedLists will also receive the internal updates to the PagedList.
+     *
+     * @param scheduler Scheduler that receives PagedList updates, and where [PagedList.Callback]
+     *                  calls are dispatched. Generally, this is the UI/main thread.
+     * @return this
+     */
+    fun setNotifyScheduler(scheduler: Scheduler) = apply {
+        notifyExecutor = when (scheduler) {
+            is Executor -> scheduler
+            else -> ScheduledExecutor(scheduler)
+        }
+        notifyScheduler = scheduler
+    }
+
+    /**
+     * Sets scheduler which will be used for background fetching of PagedLists, as well as on-demand
+     * fetching of pages inside.
+     *
+     * If not set, defaults to the Arch components I/O thread pool.
+     *
+     * The built observable/flowable will be subscribed on this scheduler.
+     *
+     * @param scheduler Scheduler used to fetch from DataSources, generally a background
+     * thread pool for e.g. I/O or network loading.
+     * @return this
+     */
+    fun setFetchScheduler(scheduler: Scheduler) = apply {
+        fetchExecutor = when (scheduler) {
+            is Executor -> scheduler
+            else -> ScheduledExecutor(scheduler)
+        }
+        fetchScheduler = scheduler
+    }
+
+    /**
+     * Constructs a `Observable<PagedList>`.
+     *
+     * The returned Observable will already be observed on the
+     * [notify scheduler][.setNotifyScheduler], and subscribed on the
+     * [fetch scheduler][.setFetchScheduler].
+     *
+     * @return The Observable of PagedLists
+     */
+    fun buildObservable(): Observable<PagedList<Value>> {
+        if (!::notifyExecutor.isInitialized) {
+            val scheduledExecutor = ScheduledExecutor(ArchTaskExecutor.getMainThreadExecutor())
+            notifyExecutor = scheduledExecutor
+            notifyScheduler = scheduledExecutor
+        }
+        if (!::fetchExecutor.isInitialized) {
+            val scheduledExecutor = ScheduledExecutor(ArchTaskExecutor.getIOThreadExecutor())
+            fetchExecutor = scheduledExecutor
+            fetchScheduler = scheduledExecutor
+        }
+
+        return Observable
+            .create(
+                PagingObservableOnSubscribe(
+                    initialLoadKey,
+                    config,
+                    boundaryCallback,
+                    dataSourceFactory,
+                    notifyExecutor,
+                    fetchExecutor
+                )
+            )
+            .observeOn(notifyScheduler)
+            .subscribeOn(fetchScheduler)
+    }
+
+    /**
+     * Constructs a `Flowable<PagedList>`.
+     *
+     * The returned Observable will already be observed on the [notifyScheduler], and subscribed on
+     * the [fetchScheduler].
+     *
+     * @param backpressureStrategy BackpressureStrategy for the Flowable to use.
+     * @return The [Flowable] of PagedLists
+     */
+    fun buildFlowable(backpressureStrategy: BackpressureStrategy): Flowable<PagedList<Value>> {
+        return buildObservable().toFlowable(backpressureStrategy)
+    }
+
+    internal class PagingObservableOnSubscribe<Key : Any, Value : Any>(
+        private val initialLoadKey: Key?,
+        private val config: PagedList.Config,
+        private val boundaryCallback: PagedList.BoundaryCallback<Value>?,
+        private val dataSourceFactory: DataSource.Factory<Key, Value>,
+        private val notifyExecutor: Executor,
+        private val fetchExecutor: Executor
+    ) : ObservableOnSubscribe<PagedList<Value>>, DataSource.InvalidatedCallback, Cancellable,
+        Runnable {
+
+        private lateinit var list: PagedList<Value>
+        private var dataSource: DataSource<Key, Value>? = null
+        private lateinit var emitter: ObservableEmitter<PagedList<Value>>
+
+        override fun subscribe(emitter: ObservableEmitter<PagedList<Value>>) {
+            this.emitter = emitter
+            emitter.setCancellable(this)
+
+            // known that subscribe is already on fetchScheduler
+            emitter.onNext(createPagedList())
+        }
+
+        override fun cancel() {
+            dataSource?.removeInvalidatedCallback(this)
+        }
+
+        override fun run() {
+            // fetch data, run on fetchExecutor
+            emitter.onNext(createPagedList())
+        }
+
+        override fun onInvalidated() {
+            if (!emitter.isDisposed) {
+                fetchExecutor.execute(this)
+            }
+        }
+
+        // for getLastKey cast, and Builder.build()
+        private fun createPagedList(): PagedList<Value> {
+            @Suppress("UNCHECKED_CAST")
+            val initializeKey = if (::list.isInitialized) list.lastKey as Key? else initialLoadKey
+
+            do {
+                dataSource?.removeInvalidatedCallback(this)
+                val newDataSource = dataSourceFactory.create()
+                newDataSource.addInvalidatedCallback(this)
+                dataSource = newDataSource
+
+                @Suppress("DEPRECATION")
+                list = PagedList.Builder(newDataSource, config)
+                    .setNotifyExecutor(notifyExecutor)
+                    .setFetchExecutor(fetchExecutor)
+                    .setBoundaryCallback(boundaryCallback)
+                    .setInitialKey(initializeKey)
+                    .build()
+            } while (list.isDetached)
+            return list
+        }
+    }
+}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxPositionalDataSource.java b/paging/rxjava2/src/main/java/androidx/paging/RxPositionalDataSource.java
deleted file mode 100644
index 9c68c9f..0000000
--- a/paging/rxjava2/src/main/java/androidx/paging/RxPositionalDataSource.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.paging;
-
-import androidx.annotation.NonNull;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-import io.reactivex.Scheduler;
-import io.reactivex.Single;
-
-abstract class RxPositionalDataSource<T> extends ListenablePositionalDataSource<T> {
-    private Scheduler mScheduler;
-
-    @Override
-    @NonNull
-    public final ListenableFuture<InitialResult<T>> loadInitial(
-            @NonNull final LoadInitialParams params) {
-        return RxDataSourceUtil.singleToListenableFuture(onLoadInitial(params),
-                getExecutor(), getScheduler());
-    }
-
-    @Override
-    @NonNull
-    public final ListenableFuture<RangeResult<T>> loadRange(@NonNull final LoadRangeParams params) {
-        return RxDataSourceUtil.singleToListenableFuture(onLoadRange(params),
-                getExecutor(), getScheduler());
-    }
-
-    /**
-     * An explicit getter is necessary to lazily init mScheduler as {@link DataSource#getExecutor()}
-     * throws an error if it is accessed before this DataSource is added to a {@link PagedList} and
-     * assigned an {@link Executor}.
-     */
-    private Scheduler getScheduler() {
-        if (mScheduler == null) {
-            mScheduler = new ScheduledExecutor(getExecutor());
-        }
-
-        return mScheduler;
-    }
-
-    /**
-     * Invoked to load initial data from this DataSource as a {@link Single}, e.g., when
-     * initializing or resuming state of a {@link PagedList}.
-     *
-     * Rx-extension of the parent method:
-     * {@link ListenablePositionalDataSource#loadInitial(
-     *ListenablePositionalDataSource.LoadInitialParams)}.
-     * <p>
-     * This method is called to load the initial page(s) from the DataSource.
-     * <p>
-     * Result list must be a multiple of pageSize to enable efficient tiling.
-     * <p>
-     * The {@link Single} returned by this method will be
-     * subscribed on this DataSource's executor, which is normally supplied via
-     * {@link RxPagedListBuilder#setFetchScheduler(Scheduler)} or
-     * {@link LivePagedListBuilder#setFetchExecutor(Executor)}.
-     *
-     * @param params Parameters for initial load, including requested start position, load size, and
-     *               page size.
-     * @return {@link Single} that receives the loaded data, including position and total data
-     * set size.
-     */
-    @NonNull
-    public abstract Single<InitialResult<T>> onLoadInitial(LoadInitialParams params);
-
-    /**
-     * Invoked to load a range of data from this DataSource as a {@link Single}.
-     *
-     * Rx-extension of the parent method:
-     * {@link ListenablePositionalDataSource#loadRange(
-     *ListenablePositionalDataSource.LoadRangeParams)}.
-     * <p>
-     * This method is called to load additional pages from the DataSource after the
-     * LoadInitialCallback passed to dispatchLoadInitial has initialized a PagedList.
-     * <p>
-     * Unlike {@link #loadInitial(LoadInitialParams)}, this method must return
-     * the number of items requested, at the position requested.
-     * <p>
-     * The {@link Single} returned by this method will be
-     * subscribed on this DataSource's executor, which is normally supplied via
-     * {@link RxPagedListBuilder#setFetchScheduler(Scheduler)} or
-     * {@link LivePagedListBuilder#setFetchExecutor(Executor)}.
-     *
-     * @param params Parameters for load, including start position and load size.
-     * @return {@link Single} that receives the loaded data.
-     */
-    @NonNull
-    public abstract Single<RangeResult<T>> onLoadRange(LoadRangeParams params);
-}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxPositionalDataSource.kt b/paging/rxjava2/src/main/java/androidx/paging/RxPositionalDataSource.kt
new file mode 100644
index 0000000..6ecf405
--- /dev/null
+++ b/paging/rxjava2/src/main/java/androidx/paging/RxPositionalDataSource.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.paging
+
+import com.google.common.util.concurrent.ListenableFuture
+
+import io.reactivex.Scheduler
+import io.reactivex.Single
+
+internal abstract class RxPositionalDataSource<T : Any> : ListenablePositionalDataSource<T>() {
+    /**
+     * Must be lazily init  as [DataSource.executor] throws an error if it is accessed before this
+     * DataSource is added to a [PagedList] and assigned an [java.util.concurrent.Executor].
+     */
+    private val scheduler: Scheduler by lazy {
+        when (executor) {
+            is Scheduler -> executor as Scheduler
+            else -> ScheduledExecutor(executor)
+        }
+    }
+
+    override fun loadInitial(params: LoadInitialParams): ListenableFuture<InitialResult<T>> =
+        onLoadInitial(params).asListenableFuture(executor, scheduler)
+
+    override fun loadRange(params: LoadRangeParams) =
+        onLoadRange(params).asListenableFuture(executor, scheduler)
+
+    /**
+     * Invoked to load initial data from this DataSource as a [Single], e.g., when initializing or
+     * resuming state of a [PagedList].
+     *
+     * Rx-extension of the parent method:
+     * [ListenablePositionalDataSource.loadInitial].
+     *
+     * This method is called to load the initial page(s) from the DataSource.
+     *
+     * Result list must be a multiple of pageSize to enable efficient tiling.
+     *
+     * The [Single] returned by this method will be subscribed on this DataSource's executor, which
+     * is normally supplied via [RxPagedListBuilder.setFetchScheduler] or
+     * [LivePagedListBuilder.setFetchExecutor].
+     *
+     * @param params Parameters for initial load, including requested start position, load size, and
+     *               page size.
+     * @return [Single] that receives the loaded data, including position and total data
+     *                  set size.
+     */
+    abstract fun onLoadInitial(params: LoadInitialParams): Single<InitialResult<T>>
+
+    /**
+     * Invoked to load a range of data from this DataSource as a [Single].
+     *
+     * Rx-extension of the parent method: [ListenablePositionalDataSource.loadRange].
+     *
+     * This method is called to load additional pages from the DataSource after the
+     * LoadInitialCallback passed to dispatchLoadInitial has initialized a PagedList.
+     *
+     * Unlike [loadInitial], this method must return the number of items requested, at the position
+     * requested.
+     *
+     * The [Single] returned by this method will be subscribed on this DataSource's executor, which
+     * is normally supplied via [RxPagedListBuilder.setFetchScheduler] or
+     * [LivePagedListBuilder.setFetchExecutor].
+     *
+     * @param params Parameters for load, including start position and load size.
+     * @return [Single] that receives the loaded data.
+     */
+    abstract fun onLoadRange(params: LoadRangeParams): Single<RangeResult<T>>
+}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/ScheduledExecutor.java b/paging/rxjava2/src/main/java/androidx/paging/ScheduledExecutor.java
deleted file mode 100644
index 90dbcab..0000000
--- a/paging/rxjava2/src/main/java/androidx/paging/ScheduledExecutor.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.paging;
-
-import java.util.concurrent.Executor;
-
-import io.reactivex.Scheduler;
-import io.reactivex.schedulers.Schedulers;
-
-/**
- * To be used interchangeably as a Scheduler and an Executor, which retains both references to an
- * {@link Executor} and its {@link Scheduler} even after it has been converted by
- * {@link Schedulers#from(Executor)}.
- */
-final class ScheduledExecutor extends Scheduler implements Executor {
-    private final Executor mExecutor;
-    private final Scheduler mScheduler;
-
-    ScheduledExecutor(Scheduler scheduler) {
-        final Scheduler.Worker worker = scheduler.createWorker();
-        mExecutor = new Executor() {
-            @Override
-            public void execute(Runnable command) {
-                worker.schedule(command);
-            }
-        };
-        mScheduler = scheduler;
-    }
-
-    ScheduledExecutor(Executor executor) {
-        mExecutor = executor;
-        mScheduler = Schedulers.from(executor);
-    }
-
-    @Override
-    public Worker createWorker() {
-        return mScheduler.createWorker();
-    }
-
-    @Override
-    public void execute(Runnable command) {
-        mExecutor.execute(command);
-    }
-}
-
diff --git a/paging/rxjava2/src/main/java/androidx/paging/ScheduledExecutor.kt b/paging/rxjava2/src/main/java/androidx/paging/ScheduledExecutor.kt
new file mode 100644
index 0000000..4398665
--- /dev/null
+++ b/paging/rxjava2/src/main/java/androidx/paging/ScheduledExecutor.kt
@@ -0,0 +1,47 @@
+/*
+ * 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.paging
+
+import io.reactivex.Scheduler
+import io.reactivex.schedulers.Schedulers
+import java.util.concurrent.Executor
+
+/**
+ * To be used interchangeably as a Scheduler and an Executor, which retains both references to an
+ * [Executor] and its [Scheduler] even after it has been converted by [Schedulers.from].
+ */
+internal class ScheduledExecutor : Scheduler, Executor {
+    private val executor: Executor
+    private val scheduler: Scheduler
+
+    constructor(scheduler: Scheduler) {
+        val worker = scheduler.createWorker()
+        executor = Executor { command -> worker.schedule(command) }
+        this.scheduler = scheduler
+    }
+
+    constructor(executor: Executor) {
+        this.executor = executor
+        scheduler = Schedulers.from(executor)
+    }
+
+    override fun createWorker() = scheduler.createWorker()
+
+    override fun execute(command: Runnable) {
+        executor.execute(command)
+    }
+}
diff --git a/paging/rxjava2/src/test/java/androidx/paging/RxItemKeyedDataSourceTest.kt b/paging/rxjava2/src/test/java/androidx/paging/RxItemKeyedDataSourceTest.kt
index f2afb18..1691812 100644
--- a/paging/rxjava2/src/test/java/androidx/paging/RxItemKeyedDataSourceTest.kt
+++ b/paging/rxjava2/src/test/java/androidx/paging/RxItemKeyedDataSourceTest.kt
@@ -20,6 +20,7 @@
 import androidx.paging.ListenableItemKeyedDataSource.LoadInitialParams
 import androidx.paging.ListenableItemKeyedDataSource.LoadParams
 import androidx.paging.ListenableItemKeyedDataSource.Result
+import androidx.testutils.TestExecutor
 import io.reactivex.Single
 import io.reactivex.disposables.Disposable
 import org.junit.Test
@@ -125,7 +126,7 @@
         executor.executeAll()
         val actual = future.get(100, TimeUnit.MILLISECONDS)
 
-        assertEquals(InitialResult<Int>((0..2).toList(), 0, 3), actual)
+        assertEquals(InitialResult((0..2).toList(), 0, 3), actual)
     }
 
     @Test
@@ -161,7 +162,7 @@
         executor.executeAll()
         val actual = future.get(100, TimeUnit.MILLISECONDS)
 
-        assertEquals(Result<Int>((0..2).toList()), actual)
+        assertEquals(Result((0..2).toList()), actual)
     }
 
     @Test
@@ -197,7 +198,7 @@
         executor.executeAll()
         val actual = future.get(100, TimeUnit.MILLISECONDS)
 
-        assertEquals(Result<Int>((-3..-1).toList()), actual)
+        assertEquals(Result((-3..-1).toList()), actual)
     }
 
     @Test
diff --git a/paging/rxjava2/src/test/java/androidx/paging/RxPageKeyedDataSourceTest.kt b/paging/rxjava2/src/test/java/androidx/paging/RxPageKeyedDataSourceTest.kt
index 6021c44..00795af 100644
--- a/paging/rxjava2/src/test/java/androidx/paging/RxPageKeyedDataSourceTest.kt
+++ b/paging/rxjava2/src/test/java/androidx/paging/RxPageKeyedDataSourceTest.kt
@@ -18,6 +18,7 @@
 
 import androidx.paging.ListenablePageKeyedDataSource.LoadInitialParams
 import androidx.paging.ListenablePageKeyedDataSource.LoadParams
+import androidx.testutils.TestExecutor
 import io.reactivex.Single
 import io.reactivex.disposables.Disposable
 import org.junit.Test
@@ -168,7 +169,7 @@
         executor.executeAll()
         val actual = future.get(100, TimeUnit.MILLISECONDS)
 
-        assertEquals(ListenablePageKeyedDataSource.Result<Int, Int>((0..2).toList(), 3), actual)
+        assertEquals(ListenablePageKeyedDataSource.Result((0..2).toList(), 3), actual)
     }
 
     @Test
@@ -204,7 +205,7 @@
         executor.executeAll()
         val actual = future.get(100, TimeUnit.MILLISECONDS)
 
-        assertEquals(ListenablePageKeyedDataSource.Result<Int, Int>((-3..-1).toList(), 3), actual)
+        assertEquals(ListenablePageKeyedDataSource.Result((-3..-1).toList(), 3), actual)
     }
 
     @Test
diff --git a/paging/rxjava2/src/test/java/androidx/paging/RxPagedListBuilderTest.kt b/paging/rxjava2/src/test/java/androidx/paging/RxPagedListBuilderTest.kt
index b1003ae..87c6f85 100644
--- a/paging/rxjava2/src/test/java/androidx/paging/RxPagedListBuilderTest.kt
+++ b/paging/rxjava2/src/test/java/androidx/paging/RxPagedListBuilderTest.kt
@@ -36,7 +36,7 @@
             override fun create(): DataSource<Int, String> {
                 val currentList = localData.first()
                 localData = localData.drop(1)
-                return ListDataSource<String>(currentList)
+                return ListDataSource(currentList)
             }
         }
     }
@@ -46,9 +46,9 @@
         val factory = testDataSourceSequence(listOf(listOf("a", "b"), listOf("c", "d")))
         val scheduler = TestScheduler()
         val observable = RxPagedListBuilder(factory, 10)
-                .setFetchScheduler(scheduler)
-                .setNotifyScheduler(scheduler)
-                .buildObservable()
+            .setFetchScheduler(scheduler)
+            .setNotifyScheduler(scheduler)
+            .buildObservable()
         val observer = TestObserver<PagedList<String>>()
 
         observable.subscribe(observer)
@@ -75,10 +75,11 @@
         val notifyScheduler = TestScheduler()
         val fetchScheduler = TestScheduler()
         val observable: Observable<PagedList<String>> = RxPagedListBuilder(
-                factory, 10)
-                .setFetchScheduler(fetchScheduler)
-                .setNotifyScheduler(notifyScheduler)
-                .buildObservable()
+            factory, 10
+        )
+            .setFetchScheduler(fetchScheduler)
+            .setNotifyScheduler(notifyScheduler)
+            .buildObservable()
         val observer = TestObserver<PagedList<String>>()
         observable.subscribe(observer)
 
diff --git a/paging/rxjava2/src/test/java/androidx/paging/RxPositionalDataSourceTest.kt b/paging/rxjava2/src/test/java/androidx/paging/RxPositionalDataSourceTest.kt
index a2c1627..e8ff5e7 100644
--- a/paging/rxjava2/src/test/java/androidx/paging/RxPositionalDataSourceTest.kt
+++ b/paging/rxjava2/src/test/java/androidx/paging/RxPositionalDataSourceTest.kt
@@ -20,6 +20,7 @@
 import androidx.paging.ListenablePositionalDataSource.LoadInitialParams
 import androidx.paging.ListenablePositionalDataSource.LoadRangeParams
 import androidx.paging.ListenablePositionalDataSource.RangeResult
+import androidx.testutils.TestExecutor
 import io.reactivex.Single
 import io.reactivex.disposables.Disposable
 import org.junit.Assert.fail
@@ -106,7 +107,7 @@
         executor.executeAll()
         val actual = future.get(100, TimeUnit.MILLISECONDS)
 
-        assertEquals(InitialResult<Int>((0..3).toList(), 0, 4), actual)
+        assertEquals(InitialResult((0..3).toList(), 0, 4), actual)
     }
 
     @Test
@@ -145,7 +146,7 @@
         executor.executeAll()
         val actual = future.get(100, TimeUnit.MILLISECONDS)
 
-        assertEquals(RangeResult<Int>((0..9).toList()), actual)
+        assertEquals(RangeResult((0..9).toList()), actual)
     }
 
     @Test
diff --git a/paging/rxjava2/src/test/java/androidx/paging/TestExecutor.kt b/paging/rxjava2/src/test/java/androidx/paging/TestExecutor.kt
deleted file mode 100644
index fb1e8f20..0000000
--- a/paging/rxjava2/src/test/java/androidx/paging/TestExecutor.kt
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.paging
-
-import java.util.LinkedList
-import java.util.concurrent.Executor
-
-class TestExecutor : Executor {
-    private val mTasks = LinkedList<Runnable>()
-
-    override fun execute(runnable: Runnable) {
-        mTasks.add(runnable)
-    }
-
-    internal fun executeAll(): Boolean {
-        val consumed = !mTasks.isEmpty()
-
-        var task = mTasks.poll()
-        while (task != null) {
-            task.run()
-            task = mTasks.poll()
-        }
-        return consumed
-    }
-}
diff --git a/room/common/api/2.2.0-alpha01.ignore b/room/common/api/2.2.0-alpha01.ignore
index 155e4e0..c7d3751 100644
--- a/room/common/api/2.2.0-alpha01.ignore
+++ b/room/common/api/2.2.0-alpha01.ignore
@@ -1,3 +1,5 @@
 // Baseline format: 1.0
 AddedAbstractMethod: androidx.room.Relation#associateBy():
     Added method androidx.room.Relation.associateBy()
+AddedAbstractMethod: androidx.room.ColumnInfo#defaultValue():
+    Added method androidx.room.ColumnInfo#defaultValue()
diff --git a/room/common/api/2.2.0-alpha01.txt b/room/common/api/2.2.0-alpha01.txt
index a9643a9..b12b8cf 100644
--- a/room/common/api/2.2.0-alpha01.txt
+++ b/room/common/api/2.2.0-alpha01.txt
@@ -3,6 +3,7 @@
 
   @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ColumnInfo {
     method @androidx.room.ColumnInfo.Collate public abstract int collate() default androidx.room.ColumnInfo.UNSPECIFIED;
+    method public abstract String defaultValue() default androidx.room.ColumnInfo.VALUE_UNSPECIFIED;
     method public abstract boolean index() default false;
     method public abstract String name() default androidx.room.ColumnInfo.INHERIT_FIELD_NAME;
     method @androidx.room.ColumnInfo.SQLiteTypeAffinity public abstract int typeAffinity() default androidx.room.ColumnInfo.UNDEFINED;
@@ -18,6 +19,7 @@
     field public static final int UNDEFINED = 1; // 0x1
     field @RequiresApi(21) public static final int UNICODE = 6; // 0x6
     field public static final int UNSPECIFIED = 1; // 0x1
+    field public static final String VALUE_UNSPECIFIED = "[value-unspecified]";
   }
 
   @IntDef({androidx.room.ColumnInfo.UNSPECIFIED, androidx.room.ColumnInfo.BINARY, androidx.room.ColumnInfo.NOCASE, androidx.room.ColumnInfo.RTRIM, androidx.room.ColumnInfo.LOCALIZED, androidx.room.ColumnInfo.UNICODE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ColumnInfo.Collate {
diff --git a/room/common/api/current.txt b/room/common/api/current.txt
index a9643a9..b12b8cf 100644
--- a/room/common/api/current.txt
+++ b/room/common/api/current.txt
@@ -3,6 +3,7 @@
 
   @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ColumnInfo {
     method @androidx.room.ColumnInfo.Collate public abstract int collate() default androidx.room.ColumnInfo.UNSPECIFIED;
+    method public abstract String defaultValue() default androidx.room.ColumnInfo.VALUE_UNSPECIFIED;
     method public abstract boolean index() default false;
     method public abstract String name() default androidx.room.ColumnInfo.INHERIT_FIELD_NAME;
     method @androidx.room.ColumnInfo.SQLiteTypeAffinity public abstract int typeAffinity() default androidx.room.ColumnInfo.UNDEFINED;
@@ -18,6 +19,7 @@
     field public static final int UNDEFINED = 1; // 0x1
     field @RequiresApi(21) public static final int UNICODE = 6; // 0x6
     field public static final int UNSPECIFIED = 1; // 0x1
+    field public static final String VALUE_UNSPECIFIED = "[value-unspecified]";
   }
 
   @IntDef({androidx.room.ColumnInfo.UNSPECIFIED, androidx.room.ColumnInfo.BINARY, androidx.room.ColumnInfo.NOCASE, androidx.room.ColumnInfo.RTRIM, androidx.room.ColumnInfo.LOCALIZED, androidx.room.ColumnInfo.UNICODE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ColumnInfo.Collate {
diff --git a/room/common/src/main/java/androidx/room/ColumnInfo.java b/room/common/src/main/java/androidx/room/ColumnInfo.java
index 49c766d..ee2adc1 100644
--- a/room/common/src/main/java/androidx/room/ColumnInfo.java
+++ b/room/common/src/main/java/androidx/room/ColumnInfo.java
@@ -74,6 +74,47 @@
     @Collate int collate() default UNSPECIFIED;
 
     /**
+     * The default value for this column.
+     * <pre>
+     *   {@literal @}ColumnInfo(defaultValue = "No name")
+     *   public String name;
+     *
+     *  {@literal @}ColumnInfo(defaultValue = "0")
+     *   public int flag;
+     * </pre>
+     * <p>
+     * Note that the default value you specify here will <em>NOT</em> be used if you simply
+     * insert the {@link Entity} with {@link Insert @Insert}. In that case, any value assigned in
+     * Java/Kotlin will be used. Use {@link Query @Query} with an <code>INSERT</code> statement
+     * and skip this column there in order to use this default value.
+     * </p>
+     * <p>
+     * NULL, CURRENT_TIMESTAMP and other SQLite constant values are interpreted as such. If you want
+     * to use them as strings for some reason, surround them with single-quotes.
+     * </p>
+     * <pre>
+     *   {@literal @}ColumnInfo(defaultValue = "NULL")
+     *   {@literal @}Nullable
+     *   public String description;
+     *
+     *   {@literal @}ColumnInfo(defaultValue = "'NULL'")
+     *   {@literal @}NonNull
+     *   public String name;
+     * </pre>
+     * <p>
+     * You can also use constant expressions by surrounding them with parentheses.
+     * </p>
+     * <pre>
+     *   {@literal @}CoumnInfo(defaultValue = "('Created at' || CURRENT_TIMESTAMP)")
+     *   public String notice;
+     * </pre>
+     *
+     * @return The default value for this column.
+     * @see #VALUE_UNSPECIFIED
+     */
+    String defaultValue() default VALUE_UNSPECIFIED;
+
+    /**
      * Constant to let Room inherit the field name as the column name. If used, Room will use the
      * field name as the column name.
      */
@@ -162,4 +203,9 @@
     @Retention(RetentionPolicy.CLASS)
     @interface Collate {
     }
+
+    /**
+     * A constant for {@link #defaultValue()} that makes the column to have no default value.
+     */
+    String VALUE_UNSPECIFIED = "[value-unspecified]";
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/Context.kt b/room/compiler/src/main/kotlin/androidx/room/processor/Context.kt
index 6dfbb23..8a22899 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/Context.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/Context.kt
@@ -21,6 +21,7 @@
 import androidx.room.processor.cache.Cache
 import androidx.room.solver.TypeAdapterStore
 import androidx.room.verifier.DatabaseVerifier
+import androidx.room.vo.Warning
 import java.io.File
 import java.util.LinkedHashSet
 import javax.annotation.processing.ProcessingEnvironment
@@ -95,7 +96,7 @@
         return Pair(result, collector)
     }
 
-    fun fork(element: Element): Context {
+    fun fork(element: Element, forceSuppressedWarnings: Set<Warning> = emptySet()): Context {
         val suppressedWarnings = SuppressWarningProcessor.getSuppressedWarnings(element)
         val processConvertersResult = CustomConverterProcessor.findConverters(this, element)
         val canReUseAdapterStore = processConvertersResult.classes.isEmpty()
@@ -105,7 +106,8 @@
         } else {
             processConvertersResult + this.typeConverters
         }
-        val subSuppressedWarnings = suppressedWarnings + logger.suppressedWarnings
+        val subSuppressedWarnings =
+            forceSuppressedWarnings + suppressedWarnings + logger.suppressedWarnings
         val subCache = Cache(cache, subTypeConverters.classes, subSuppressedWarnings)
         val subContext = Context(
                 processingEnv = processingEnv,
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt
index f67016c..07d1f2c 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt
@@ -23,6 +23,7 @@
 import androidx.room.vo.EmbeddedField
 import androidx.room.vo.Field
 import com.squareup.javapoet.TypeName
+import java.util.Locale
 import javax.lang.model.element.Element
 import javax.lang.model.type.DeclaredType
 
@@ -57,22 +58,30 @@
         context.checker.notUnbound(type, element,
                 ProcessorErrors.CANNOT_USE_UNBOUND_GENERICS_IN_ENTITY_FIELDS)
 
-        val field = Field(name = name,
-                type = member,
-                element = element,
-                columnName = columnName,
-                affinity = affinity,
-                collate = Collate.fromAnnotationValue(columnInfo?.collate),
-                parent = fieldParent,
-                indexed = columnInfo?.index ?: false)
+        val adapter = context.typeAdapterStore.findColumnTypeAdapter(member, affinity)
+        val adapterAffinity = adapter?.typeAffinity ?: affinity
+        val nonNull = Field.calcNonNull(element, fieldParent)
+
+        val field = Field(
+            name = name,
+            type = member,
+            element = element,
+            columnName = columnName,
+            affinity = affinity,
+            collate = Collate.fromAnnotationValue(columnInfo?.collate),
+            defaultValue = extractDefaultValue(
+                columnInfo?.defaultValue, adapterAffinity, nonNull
+            ),
+            parent = fieldParent,
+            indexed = columnInfo?.index ?: false,
+            nonNull = nonNull
+        )
 
         when (bindingScope) {
             BindingScope.TWO_WAY -> {
-                val adapter = context.typeAdapterStore.findColumnTypeAdapter(field.type,
-                        field.affinity)
                 field.statementBinder = adapter
                 field.cursorValueReader = adapter
-                field.affinity = adapter?.typeAffinity ?: field.affinity
+                field.affinity = adapterAffinity
                 context.checker.check(adapter != null, field.element,
                         ProcessorErrors.CANNOT_FIND_COLUMN_TYPE_ADAPTER)
             }
@@ -89,9 +98,40 @@
                         ProcessorErrors.CANNOT_FIND_CURSOR_READER)
             }
         }
+
         return field
     }
 
+    private fun extractDefaultValue(
+        value: String?,
+        affinity: SQLTypeAffinity?,
+        fieldNonNull: Boolean
+    ): String? {
+        if (value == null) {
+            return null
+        }
+        val trimmed = value.trim().toLowerCase(Locale.ENGLISH)
+        val defaultValue = if (affinity == SQLTypeAffinity.TEXT) {
+            if (value == ColumnInfo.VALUE_UNSPECIFIED) {
+                null
+            } else if (trimmed.startsWith("(") || trimmed in SQLITE_VALUE_CONSTANTS) {
+                value
+            } else {
+                "'${value.trim('\'')}'"
+            }
+        } else {
+            if (value == ColumnInfo.VALUE_UNSPECIFIED || trimmed == "") {
+                null
+            } else {
+                value
+            }
+        }
+        if (trimmed == "null" && fieldNonNull) {
+            context.logger.e(element, ProcessorErrors.DEFAULT_VALUE_NULLABILITY)
+        }
+        return defaultValue
+    }
+
     /**
      * Defines what we need to assign
      */
@@ -101,3 +141,12 @@
         READ_FROM_CURSOR // just cursor to value
     }
 }
+
+internal val SQLITE_VALUE_CONSTANTS = listOf(
+    "null",
+    "current_time",
+    "current_date",
+    "current_timestamp",
+    "true",
+    "false"
+)
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt b/room/compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt
index 93b3435..4f1360e 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt
@@ -200,6 +200,8 @@
 
     val CANNOT_FIND_CURSOR_READER = "Cannot figure out how to read this field from a cursor."
 
+    const val DEFAULT_VALUE_NULLABILITY = "Use of NULL as the default value of a non-null field"
+
     private val MISSING_PARAMETER_FOR_BIND = "Each bind variable in the query must have a" +
             " matching method parameter. Cannot find method parameters for %s."
 
@@ -418,6 +420,30 @@
         """.trim()
     }
 
+    fun relationJunctionParentAffinityMismatch(
+        parentColumn: String,
+        junctionParentColumn: String,
+        parentAffinity: SQLTypeAffinity?,
+        junctionParentAffinity: SQLTypeAffinity?
+    ): String {
+        return """
+        The affinity of parent column ($parentColumn : $parentAffinity) does not match the type
+        affinity of the junction parent column ($junctionParentColumn : $junctionParentAffinity).
+        """.trim()
+    }
+
+    fun relationJunctionChildAffinityMismatch(
+        childColumn: String,
+        junctionChildColumn: String,
+        childAffinity: SQLTypeAffinity?,
+        junctionChildAffinity: SQLTypeAffinity?
+    ): String {
+        return """
+        The affinity of child column ($childColumn : $childAffinity) does not match the type
+        affinity of the junction child column ($junctionChildColumn : $junctionChildAffinity).
+        """.trim()
+    }
+
     val CANNOT_USE_MORE_THAN_ONE_POJO_FIELD_ANNOTATION = "A field can be annotated with only" +
             " one of the following:" + PojoProcessor.PROCESSED_ANNOTATIONS.joinToString(",") {
         it.java.simpleName
diff --git a/room/compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt b/room/compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt
index 4ed0504..1aa1c3d 100644
--- a/room/compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt
@@ -117,14 +117,22 @@
             } else {
                 entity.createTableQuery
             }
-            stmt.executeUpdate(stripLocalizeCollations(createTableQuery))
+            try {
+                stmt.executeUpdate(stripLocalizeCollations(createTableQuery))
+            } catch (e: SQLException) {
+                context.logger.e(entity.element, "${e.message}")
+            }
             entity.indices.forEach {
                 stmt.executeUpdate(it.createQuery(entity.tableName))
             }
         }
         views.forEach { view ->
             val stmt = connection.createStatement()
-            stmt.executeUpdate(stripLocalizeCollations(view.createViewQuery))
+            try {
+                stmt.executeUpdate(stripLocalizeCollations(view.createViewQuery))
+            } catch (e: SQLException) {
+                context.logger.e(view.element, "${e.message}")
+            }
         }
     }
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Field.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Field.kt
index b8b1513..35997f5 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Field.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Field.kt
@@ -26,16 +26,24 @@
 import com.squareup.javapoet.TypeName
 import javax.lang.model.element.Element
 import javax.lang.model.type.TypeMirror
+
 // used in cache matching, must stay as a data class or implement equals
-data class Field(val element: Element, val name: String, val type: TypeMirror,
-                 var affinity: SQLTypeAffinity?,
-                 val collate: Collate? = null,
-                 val columnName: String = name,
-                 /* means that this field does not belong to parent, instead, it belongs to a
-                 * embedded child of the main Pojo*/
-                 val parent: EmbeddedField? = null,
-                 // index might be removed when being merged into an Entity
-                 var indexed: Boolean = false) : HasSchemaIdentity {
+data class Field(
+    val element: Element,
+    val name: String,
+    val type: TypeMirror,
+    var affinity: SQLTypeAffinity?,
+    val collate: Collate? = null,
+    val columnName: String = name,
+    val defaultValue: String? = null,
+    // null here means that this field does not belong to parent, instead, it belongs to an
+    // embedded child of the main Pojo
+    val parent: EmbeddedField? = null,
+    // index might be removed when being merged into an Entity
+    var indexed: Boolean = false,
+    /** Whether the table column for this field should be NOT NULL */
+    val nonNull: Boolean = calcNonNull(element, parent)
+) : HasSchemaIdentity {
     lateinit var getter: FieldGetter
     lateinit var setter: FieldSetter
     // binds the field into a statement
@@ -44,12 +52,15 @@
     var cursorValueReader: CursorValueReader? = null
     val typeName: TypeName by lazy { type.typeName() }
 
-    /** Whether the table column for this field should be NOT NULL */
-    val nonNull = element.isNonNull() && (parent == null || parent.isNonNullRecursively())
-
     override fun getIdKey(): String {
-        // we don't get the collate information from sqlite so ignoring it here.
-        return "$columnName-${affinity?.name ?: SQLTypeAffinity.TEXT.name}-$nonNull"
+        return buildString {
+            // we don't get the collate information from sqlite so ignoring it here.
+            append("$columnName-${affinity?.name ?: SQLTypeAffinity.TEXT.name}-$nonNull")
+            // defaultValue was newly added; it should affect the ID only when it is used.
+            if (defaultValue != null) {
+                append("-defaultValue=$defaultValue")
+            }
+        }
     }
 
     /**
@@ -127,10 +138,19 @@
         if (collate != null) {
             columnSpec.append(" COLLATE ${collate.name}")
         }
+        if (defaultValue != null) {
+            columnSpec.append(" DEFAULT $defaultValue")
+        }
         return "`$columnName` ${(affinity ?: SQLTypeAffinity.TEXT).name}$columnSpec"
     }
 
     fun toBundle(): FieldBundle = FieldBundle(pathWithDotNotation, columnName,
-            affinity?.name ?: SQLTypeAffinity.TEXT.name, nonNull
+            affinity?.name ?: SQLTypeAffinity.TEXT.name, nonNull, defaultValue
     )
+
+    companion object {
+        fun calcNonNull(element: Element, parent: EmbeddedField?): Boolean {
+            return element.isNonNull() && (parent == null || parent.isNonNullRecursively())
+        }
+    }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/RelationCollector.kt b/room/compiler/src/main/kotlin/androidx/room/vo/RelationCollector.kt
index ed1cea4..dab9f3a 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/RelationCollector.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/RelationCollector.kt
@@ -28,6 +28,8 @@
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors.cannotFindQueryResultAdapter
 import androidx.room.processor.ProcessorErrors.relationAffinityMismatch
+import androidx.room.processor.ProcessorErrors.relationJunctionChildAffinityMismatch
+import androidx.room.processor.ProcessorErrors.relationJunctionParentAffinityMismatch
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.query.parameter.QueryParameterAdapter
 import androidx.room.solver.query.result.RowAdapter
@@ -210,19 +212,53 @@
         ): List<RelationCollector> {
             return relations.map { relation ->
                 // decide on the affinity
-                val context = baseContext.fork(relation.field.element)
+                val context = baseContext.fork(
+                    element = relation.field.element,
+                    forceSuppressedWarnings = setOf(Warning.CURSOR_MISMATCH))
+
+                fun checkAffinity(
+                    first: SQLTypeAffinity?,
+                    second: SQLTypeAffinity?,
+                    onAffinityMismatch: () -> Unit
+                ) = if (first != null && first == second) {
+                    first
+                } else {
+                    onAffinityMismatch()
+                    SQLTypeAffinity.TEXT
+                }
+
                 val parentAffinity = relation.parentField.cursorValueReader?.affinity()
                 val childAffinity = relation.entityField.cursorValueReader?.affinity()
-                val affinity = if (parentAffinity != null && parentAffinity == childAffinity) {
-                    parentAffinity
+                val junctionParentAffinity =
+                    relation.junction?.parentField?.cursorValueReader?.affinity()
+                val junctionChildAffinity =
+                    relation.junction?.entityField?.cursorValueReader?.affinity()
+                val affinity = if (relation.junction != null) {
+                    checkAffinity(childAffinity, junctionChildAffinity) {
+                        context.logger.w(Warning.RELATION_TYPE_MISMATCH, relation.field.element,
+                            relationJunctionChildAffinityMismatch(
+                                childColumn = relation.entityField.columnName,
+                                junctionChildColumn = relation.junction.entityField.columnName,
+                                childAffinity = childAffinity,
+                                junctionChildAffinity = junctionChildAffinity))
+                    }
+                    checkAffinity(parentAffinity, junctionParentAffinity) {
+                        context.logger.w(Warning.RELATION_TYPE_MISMATCH, relation.field.element,
+                            relationJunctionParentAffinityMismatch(
+                                parentColumn = relation.parentField.columnName,
+                                junctionParentColumn = relation.junction.parentField.columnName,
+                                parentAffinity = parentAffinity,
+                                junctionParentAffinity = junctionParentAffinity))
+                    }
                 } else {
-                    context.logger.w(Warning.RELATION_TYPE_MISMATCH, relation.field.element,
+                    checkAffinity(parentAffinity, childAffinity) {
+                        context.logger.w(Warning.RELATION_TYPE_MISMATCH, relation.field.element,
                             relationAffinityMismatch(
-                                    parentColumn = relation.parentField.columnName,
-                                    childColumn = relation.entityField.columnName,
-                                    parentAffinity = parentAffinity,
-                                    childAffinity = childAffinity))
-                    SQLTypeAffinity.TEXT
+                                parentColumn = relation.parentField.columnName,
+                                childColumn = relation.entityField.columnName,
+                                parentAffinity = parentAffinity,
+                                childAffinity = childAffinity))
+                    }
                 }
                 val keyType = keyTypeFor(context, affinity)
                 val collectionTypeName = if (relation.field.typeName is ParameterizedTypeName) {
@@ -318,9 +354,9 @@
                     if (cursorReader == null) {
                         getDefaultRowAdapter()
                     } else {
-                        context.logger.d("Choosing cursor adapter for the return value since" +
-                                " the query returns only 1 or 2 columns and there is a cursor" +
-                                " adapter for the return type.")
+                        context.logger.d(relation.field.element, "Choosing cursor adapter for" +
+                                " the return value since the query returns only 1 or 2 columns" +
+                                " and there is a cursor adapter for the return type.")
                         SingleColumnRowAdapter(cursorReader)
                     }
                 } else {
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/RelationCollectorMethodWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/RelationCollectorMethodWriter.kt
index be346d1..66afea2 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/RelationCollectorMethodWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/RelationCollectorMethodWriter.kt
@@ -148,7 +148,7 @@
                     // clause, this column is the rightmost column in the generated SELECT
                     // clause.
                     val junctionParentColumnIndex = relation.projection.size
-                    addStatement("final $T $L = $L; // $L",
+                    addStatement("final $T $L = $L; // _junction.$L",
                         TypeName.INT, itemKeyIndexVar, junctionParentColumnIndex,
                         relation.junction.parentField.columnName)
                 } else {
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt
index 83e1887..8a36228 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt
@@ -45,12 +45,13 @@
             addStatement("final $T $L = new $T($L)", columnListType, columnListVar,
                     columnListType, entity.fields.size)
             entity.fields.forEach { field ->
-                addStatement("$L.put($S, new $T($S, $S, $L, $L))",
+                addStatement("$L.put($S, new $T($S, $S, $L, $L, $S))",
                         columnListVar, field.columnName, RoomTypeNames.TABLE_INFO_COLUMN,
                         /*name*/ field.columnName,
                         /*type*/ field.affinity?.name ?: SQLTypeAffinity.TEXT.name,
                         /*nonNull*/ field.nonNull,
-                        /*pkeyPos*/ entity.primaryKey.fields.indexOf(field) + 1)
+                        /*pkeyPos*/ entity.primaryKey.fields.indexOf(field) + 1,
+                        /*defaultValue*/ field.defaultValue)
             }
 
             val foreignKeySetVar = scope.getTmpVar("_foreignKeys$suffix")
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/ValidationWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/ValidationWriter.kt
index a67d0a8..7499770 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/ValidationWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/ValidationWriter.kt
@@ -61,7 +61,7 @@
         var statementCount = 0
             private set
 
-        fun addStatement(format: String, vararg args: Any): CodeBlockWrapper {
+        fun addStatement(format: String, vararg args: Any?): CodeBlockWrapper {
             statementCount++
             builder.addStatement(format, *args)
             return this
diff --git a/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java b/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java
index aa1498c..3c1b537 100644
--- a/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java
+++ b/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java
@@ -81,10 +81,10 @@
             @Override
             protected void validateMigration(SupportSQLiteDatabase _db) {
                 final HashMap<String, TableInfo.Column> _columnsUser = new HashMap<String, TableInfo.Column>(4);
-                _columnsUser.put("uid", new TableInfo.Column("uid", "INTEGER", true, 1));
-                _columnsUser.put("name", new TableInfo.Column("name", "TEXT", false, 0));
-                _columnsUser.put("lastName", new TableInfo.Column("lastName", "TEXT", false, 0));
-                _columnsUser.put("ageColumn", new TableInfo.Column("ageColumn", "INTEGER", true, 0));
+                _columnsUser.put("uid", new TableInfo.Column("uid", "INTEGER", true, 1, null));
+                _columnsUser.put("name", new TableInfo.Column("name", "TEXT", false, 0, null));
+                _columnsUser.put("lastName", new TableInfo.Column("lastName", "TEXT", false, 0, null));
+                _columnsUser.put("ageColumn", new TableInfo.Column("ageColumn", "INTEGER", true, 0, null));
                 final HashSet<TableInfo.ForeignKey> _foreignKeysUser = new HashSet<TableInfo.ForeignKey>(0);
                 final HashSet<TableInfo.Index> _indicesUser = new HashSet<TableInfo.Index>(0);
                 final TableInfo _infoUser = new TableInfo("User", _columnsUser, _foreignKeysUser, _indicesUser);
@@ -95,10 +95,10 @@
                             + " Found:\n" + _existingUser);
                 }
                 final HashMap<String, TableInfo.Column> _columnsChild1 = new HashMap<String, TableInfo.Column>(4);
-                _columnsChild1.put("id", new TableInfo.Column("id", "INTEGER", true, 1));
-                _columnsChild1.put("name", new TableInfo.Column("name", "TEXT", false, 0));
-                _columnsChild1.put("serial", new TableInfo.Column("serial", "INTEGER", false, 0));
-                _columnsChild1.put("code", new TableInfo.Column("code", "TEXT", false, 0));
+                _columnsChild1.put("id", new TableInfo.Column("id", "INTEGER", true, 1, null));
+                _columnsChild1.put("name", new TableInfo.Column("name", "TEXT", false, 0, null));
+                _columnsChild1.put("serial", new TableInfo.Column("serial", "INTEGER", false, 0, null));
+                _columnsChild1.put("code", new TableInfo.Column("code", "TEXT", false, 0, null));
                 final HashSet<TableInfo.ForeignKey> _foreignKeysChild1 = new HashSet<TableInfo.ForeignKey>(0);
                 final HashSet<TableInfo.Index> _indicesChild1 = new HashSet<TableInfo.Index>(0);
                 final TableInfo _infoChild1 = new TableInfo("Child1", _columnsChild1, _foreignKeysChild1, _indicesChild1);
@@ -109,10 +109,10 @@
                             + " Found:\n" + _existingChild1);
                 }
                 final HashMap<String, TableInfo.Column> _columnsChild2 = new HashMap<String, TableInfo.Column>(4);
-                _columnsChild2.put("id", new TableInfo.Column("id", "INTEGER", true, 1));
-                _columnsChild2.put("name", new TableInfo.Column("name", "TEXT", false, 0));
-                _columnsChild2.put("serial", new TableInfo.Column("serial", "INTEGER", false, 0));
-                _columnsChild2.put("code", new TableInfo.Column("code", "TEXT", false, 0));
+                _columnsChild2.put("id", new TableInfo.Column("id", "INTEGER", true, 1, null));
+                _columnsChild2.put("name", new TableInfo.Column("name", "TEXT", false, 0, null));
+                _columnsChild2.put("serial", new TableInfo.Column("serial", "INTEGER", false, 0, null));
+                _columnsChild2.put("code", new TableInfo.Column("code", "TEXT", false, 0, null));
                 final HashSet<TableInfo.ForeignKey> _foreignKeysChild2 = new HashSet<TableInfo.ForeignKey>(0);
                 final HashSet<TableInfo.Index> _indicesChild2 = new HashSet<TableInfo.Index>(0);
                 final TableInfo _infoChild2 = new TableInfo("Child2", _columnsChild2, _foreignKeysChild2, _indicesChild2);
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt
index 949be1a..a685e40 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt
@@ -30,6 +30,8 @@
 import com.google.testing.compile.JavaFileObjects
 import com.google.testing.compile.JavaSourcesSubjectFactory
 import org.hamcrest.CoreMatchers.`is`
+import org.hamcrest.CoreMatchers.equalTo
+import org.hamcrest.CoreMatchers.nullValue
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -48,6 +50,7 @@
         const val ENTITY_PREFIX = """
                 package foo.bar;
                 import androidx.room.*;
+                import androidx.annotation.NonNull;
                 @Entity
                 abstract class MyEntity {
                 """
@@ -350,6 +353,79 @@
         }
     }
 
+    @Test
+    fun defaultValues_number() {
+        testDefaultValue("\"1\"", "int") { defaultValue ->
+            assertThat(defaultValue, `is`(equalTo("1")))
+        }.compilesWithoutError()
+        testDefaultValue("\"\"", "int") { defaultValue ->
+            assertThat(defaultValue, `is`(nullValue()))
+        }.compilesWithoutError()
+        testDefaultValue("\"null\"", "Integer") { defaultValue ->
+            assertThat(defaultValue, `is`(equalTo("null")))
+        }.compilesWithoutError()
+        testDefaultValue("ColumnInfo.VALUE_UNSPECIFIED", "int") { defaultValue ->
+            assertThat(defaultValue, `is`(nullValue()))
+        }.compilesWithoutError()
+        testDefaultValue("\"CURRENT_TIMESTAMP\"", "long") { defaultValue ->
+            assertThat(defaultValue, `is`(equalTo("CURRENT_TIMESTAMP")))
+        }.compilesWithoutError()
+        testDefaultValue("\"true\"", "boolean") { defaultValue ->
+            assertThat(defaultValue, `is`(equalTo("true")))
+        }.compilesWithoutError()
+        testDefaultValue("\"false\"", "boolean") { defaultValue ->
+            assertThat(defaultValue, `is`(equalTo("false")))
+        }.compilesWithoutError()
+    }
+
+    @Test
+    fun defaultValues_nonNull() {
+        testDefaultValue("\"null\"", "int") {
+        }.failsToCompile().withErrorContaining(ProcessorErrors.DEFAULT_VALUE_NULLABILITY)
+        testDefaultValue("\"null\"", "@NonNull String") {
+        }.failsToCompile().withErrorContaining(ProcessorErrors.DEFAULT_VALUE_NULLABILITY)
+    }
+
+    @Test
+    fun defaultValues_text() {
+        testDefaultValue("\"a\"", "String") { defaultValue ->
+            assertThat(defaultValue, `is`(equalTo("'a'")))
+        }.compilesWithoutError()
+        testDefaultValue("\"'a'\"", "String") { defaultValue ->
+            assertThat(defaultValue, `is`(equalTo("'a'")))
+        }.compilesWithoutError()
+        testDefaultValue("\"\"", "String") { defaultValue ->
+            assertThat(defaultValue, `is`(equalTo("''")))
+        }.compilesWithoutError()
+        testDefaultValue("\"null\"", "String") { defaultValue ->
+            assertThat(defaultValue, `is`(equalTo("null")))
+        }.compilesWithoutError()
+        testDefaultValue("ColumnInfo.VALUE_UNSPECIFIED", "String") { defaultValue ->
+            assertThat(defaultValue, `is`(nullValue()))
+        }.compilesWithoutError()
+        testDefaultValue("\"CURRENT_TIMESTAMP\"", "String") { defaultValue ->
+            assertThat(defaultValue, `is`(equalTo("CURRENT_TIMESTAMP")))
+        }.compilesWithoutError()
+        testDefaultValue("\"('Created at ' || CURRENT_TIMESTAMP)\"", "String") { defaultValue ->
+            assertThat(defaultValue, `is`(equalTo("('Created at ' || CURRENT_TIMESTAMP)")))
+        }.compilesWithoutError()
+    }
+
+    private fun testDefaultValue(
+        defaultValue: String,
+        fieldType: String,
+        body: (String?) -> Unit
+    ): CompileTester {
+        return singleEntity(
+            """
+                @ColumnInfo(defaultValue = $defaultValue)
+                $fieldType name;
+            """
+        ) { field, _ ->
+            body(field.defaultValue)
+        }
+    }
+
     fun singleEntity(vararg input: String, handler: (Field, invocation: TestInvocation) -> Unit):
             CompileTester {
         return Truth.assertAbout(JavaSourcesSubjectFactory.javaSources())
diff --git a/room/compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt b/room/compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt
index 675b39f..0c5ab32 100644
--- a/room/compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt
@@ -71,7 +71,7 @@
     }
 
     private fun createVerifier(invocation: TestInvocation): DatabaseVerifier {
-        val db = userDb(invocation.context)
+        val db = userDb(invocation)
         return DatabaseVerifier.create(invocation.context, mock(Element::class.java),
                 db.entities, db.views)!!
     }
@@ -213,6 +213,34 @@
         }.compilesWithoutError()
     }
 
+    @Test
+    fun defaultValue_exprError() {
+        simpleRun { invocation ->
+            val db = database(
+                listOf(
+                    entity(
+                        invocation,
+                        "User",
+                        field(
+                            "id",
+                            primitive(invocation.context, TypeKind.INT),
+                            SQLTypeAffinity.INTEGER
+                        ),
+                        field(
+                            "name",
+                            invocation.context.COMMON_TYPES.STRING,
+                            SQLTypeAffinity.TEXT,
+                            defaultValue = "(NO_SUCH_CONSTANT)"
+                        )
+                    )
+                ),
+                emptyList()
+            )
+            val element = mock(Element::class.java)
+            DatabaseVerifier.create(invocation.context, element, db.entities, db.views)!!
+        }.failsToCompile().withErrorContaining("default value of column [name]")
+    }
+
     private fun validQueryTest(sql: String, cb: (QueryResultInfo) -> Unit) {
         simpleRun { invocation ->
             val verifier = createVerifier(invocation)
@@ -221,16 +249,27 @@
         }.compilesWithoutError()
     }
 
-    private fun userDb(context: Context): Database {
+    private fun userDb(invocation: TestInvocation): Database {
+        val context = invocation.context
         return database(
-                listOf(entity("User",
-                        field("id", primitive(context, TypeKind.INT), SQLTypeAffinity.INTEGER),
-                        field("name", context.COMMON_TYPES.STRING, SQLTypeAffinity.TEXT),
-                        field("lastName", context.COMMON_TYPES.STRING, SQLTypeAffinity.TEXT),
-                        field("ratio", primitive(context, TypeKind.FLOAT), SQLTypeAffinity.REAL))),
-                listOf(view("UserSummary", "SELECT id, name FROM User",
-                        field("id", primitive(context, TypeKind.INT), SQLTypeAffinity.INTEGER),
-                        field("name", context.COMMON_TYPES.STRING, SQLTypeAffinity.TEXT))))
+            listOf(
+                entity(
+                    invocation,
+                    "User",
+                    field("id", primitive(context, TypeKind.INT), SQLTypeAffinity.INTEGER),
+                    field("name", context.COMMON_TYPES.STRING, SQLTypeAffinity.TEXT),
+                    field("lastName", context.COMMON_TYPES.STRING, SQLTypeAffinity.TEXT),
+                    field("ratio", primitive(context, TypeKind.FLOAT), SQLTypeAffinity.REAL)
+                )
+            ),
+            listOf(
+                view(
+                    "UserSummary", "SELECT id, name FROM User",
+                    field("id", primitive(context, TypeKind.INT), SQLTypeAffinity.INTEGER),
+                    field("name", context.COMMON_TYPES.STRING, SQLTypeAffinity.TEXT)
+                )
+            )
+        )
     }
 
     private fun database(entities: List<Entity>, views: List<DatabaseView>): Database {
@@ -245,18 +284,23 @@
                 enableForeignKeys = false)
     }
 
-    private fun entity(tableName: String, vararg fields: Field): Entity {
+    private fun entity(
+        invocation: TestInvocation,
+        tableName: String,
+        vararg fields: Field
+    ): Entity {
+        val element = invocation.typeElement("Dummy")
         return Entity(
-                element = mock(TypeElement::class.java),
-                tableName = tableName,
-                type = mock(DeclaredType::class.java),
-                fields = fields.toList(),
-                embeddedFields = emptyList(),
-                indices = emptyList(),
-                primaryKey = PrimaryKey(null, Fields(fields.take(1)), false),
-                foreignKeys = emptyList(),
-                constructor = Constructor(mock(ExecutableElement::class.java), emptyList()),
-                shadowTableName = null
+            element = element,
+            tableName = tableName,
+            type = mock(DeclaredType::class.java),
+            fields = fields.toList(),
+            embeddedFields = emptyList(),
+            indices = emptyList(),
+            primaryKey = PrimaryKey(null, Fields(fields.take(1)), false),
+            foreignKeys = emptyList(),
+            constructor = Constructor(mock(ExecutableElement::class.java), emptyList()),
+            shadowTableName = null
         )
     }
 
@@ -272,20 +316,26 @@
         )
     }
 
-    private fun field(name: String, type: TypeMirror, affinity: SQLTypeAffinity): Field {
+    private fun field(
+        name: String,
+        type: TypeMirror,
+        affinity: SQLTypeAffinity,
+        defaultValue: String? = null
+    ): Field {
         val element = mock(Element::class.java)
         doReturn(type).`when`(element).asType()
         val f = Field(
-                element = element,
-                name = name,
-                type = type,
-                columnName = name,
-                affinity = affinity,
-                collate = if (useLocalizedCollation && affinity == SQLTypeAffinity.TEXT) {
-                    Collate.LOCALIZED
-                } else {
-                    null
-                }
+            element = element,
+            name = name,
+            type = type,
+            columnName = name,
+            affinity = affinity,
+            collate = if (useLocalizedCollation && affinity == SQLTypeAffinity.TEXT) {
+                Collate.LOCALIZED
+            } else {
+                null
+            },
+            defaultValue = defaultValue
         )
         assignGetterSetter(f, name, type)
         return f
diff --git a/room/integration-tests/incremental-annotation-processing/build.gradle b/room/integration-tests/incremental-annotation-processing/build.gradle
index 0bbf5f9..6d4feae 100644
--- a/room/integration-tests/incremental-annotation-processing/build.gradle
+++ b/room/integration-tests/incremental-annotation-processing/build.gradle
@@ -71,6 +71,7 @@
 
 tasks.findByPath("test").dependsOn(
         tasks.findByPath(":room:room-common:uploadArchives"),
+        tasks.findByPath(":room:room-runtime:uploadArchives"),
         tasks.findByPath(":room:room-migration:uploadArchives"),
         tasks.findByPath(":room:room-compiler:uploadArchives"),
 )
diff --git a/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.MigrationDb/9.json b/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.MigrationDb/9.json
new file mode 100644
index 0000000..b436c21
--- /dev/null
+++ b/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.MigrationDb/9.json
@@ -0,0 +1,125 @@
+{
+  "formatVersion": 1,
+  "database": {
+    "version": 9,
+    "identityHash": "9ced6be3cddcc35aa6ec78f36c7214da",
+    "entities": [
+      {
+        "tableName": "Entity1",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
+        "fields": [
+          {
+            "fieldPath": "id",
+            "columnName": "id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": false
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "id"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [
+          {
+            "name": "index_Entity1_name",
+            "unique": true,
+            "columnNames": [
+              "name"
+            ],
+            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Entity1_name` ON `${TABLE_NAME}` (`name`)"
+          }
+        ],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "Entity2",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `addedInV3` TEXT, `name` TEXT DEFAULT 'Unknown')",
+        "fields": [
+          {
+            "fieldPath": "id",
+            "columnName": "id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "addedInV3",
+            "columnName": "addedInV3",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": false,
+            "defaultValue": "'Unknown'"
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "id"
+          ],
+          "autoGenerate": true
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "Entity4",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT COLLATE NOCASE, PRIMARY KEY(`id`), FOREIGN KEY(`name`) REFERENCES `Entity1`(`name`) ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED)",
+        "fields": [
+          {
+            "fieldPath": "id",
+            "columnName": "id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": false
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "id"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [],
+        "foreignKeys": [
+          {
+            "table": "Entity1",
+            "onDelete": "NO ACTION",
+            "onUpdate": "NO ACTION",
+            "columns": [
+              "name"
+            ],
+            "referencedColumns": [
+              "name"
+            ]
+          }
+        ]
+      }
+    ],
+    "views": [
+      {
+        "viewName": "View1",
+        "createSql": "CREATE VIEW `${VIEW_NAME}` AS SELECT Entity4.id, Entity4.name, Entity1.id AS entity1Id FROM Entity4 INNER JOIN Entity1 ON Entity4.name = Entity1.name"
+      }
+    ],
+    "setupQueries": [
+      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '9ced6be3cddcc35aa6ec78f36c7214da')"
+    ]
+  }
+}
\ No newline at end of file
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/JournalDbPostMigrationTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/JournalDbPostMigrationTest.java
index 6cc574e..eb380d1 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/JournalDbPostMigrationTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/JournalDbPostMigrationTest.java
@@ -91,7 +91,7 @@
         @ColumnInfo(name = "address")
         public String address;
 
-        @ColumnInfo(name = "age")
+        @ColumnInfo(name = "age", defaultValue = "0")
         public int age;
     }
 
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/MigrationDb.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/MigrationDb.java
index fbea08e..f6a1545 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/MigrationDb.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/MigrationDb.java
@@ -42,7 +42,7 @@
                 MigrationDb.Entity4.class},
         views = {MigrationDb.View1.class})
 public abstract class MigrationDb extends RoomDatabase {
-    static final int LATEST_VERSION = 8;
+    static final int LATEST_VERSION = 9;
     static final int MAX_VERSION = 1000;
     abstract MigrationDao dao();
     @Entity(indices = {@Index(value = "name", unique = true)})
@@ -59,6 +59,7 @@
         @PrimaryKey(autoGenerate = true)
         public int id;
         public String addedInV3;
+        @ColumnInfo(defaultValue = "Unknown") // Added in version 9
         public String name;
     }
 
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/MigrationTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/MigrationTest.java
index a9372c9..268e141 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/MigrationTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/MigrationTest.java
@@ -29,6 +29,7 @@
 
 import android.content.Context;
 
+import androidx.annotation.NonNull;
 import androidx.room.Room;
 import androidx.room.migration.Migration;
 import androidx.room.migration.bundle.SchemaBundle;
@@ -254,6 +255,26 @@
     }
 
     @Test
+    public void addDefaultValue() throws IOException {
+        SupportSQLiteDatabase db = helper.createDatabase(TEST_DB, 8);
+        final TableInfo oldTable = TableInfo.read(db, MigrationDb.Entity2.TABLE_NAME);
+        final TableInfo.Column oldColumn = oldTable.columns.get("name");
+        assertThat(oldColumn, is(notNullValue()));
+        assertThat(oldColumn.defaultValue, is(nullValue()));
+        db.close();
+        db = helper.runMigrationsAndValidate(TEST_DB, 9, false, MIGRATION_8_9);
+        final TableInfo table = TableInfo.read(db, MigrationDb.Entity2.TABLE_NAME);
+        final TableInfo.Column column = table.columns.get("name");
+        assertThat(column, is(notNullValue()));
+        assertThat(column.defaultValue, is(equalTo("'Unknown'")));
+    }
+
+    @Test
+    public void addDefaultValueFailure() throws IOException {
+        testFailure(8, 9);
+    }
+
+    @Test
     public void missingMigration_onUpgrade() throws IOException {
         SupportSQLiteDatabase database = helper.createDatabase(TEST_DB, 1);
         database.close();
@@ -541,6 +562,20 @@
         }
     };
 
+    private static final Migration MIGRATION_8_9 = new Migration(8, 9) {
+        @Override
+        public void migrate(@NonNull SupportSQLiteDatabase database) {
+            // Add DEFAULT constraint to Entity2.name.
+            database.execSQL("ALTER TABLE Entity2 RENAME TO save_Entity2");
+            database.execSQL("CREATE TABLE IF NOT EXISTS Entity2 "
+                    + "(`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+                    + "`addedInV3` TEXT, `name` TEXT DEFAULT 'Unknown')");
+            database.execSQL("INSERT INTO Entity2 (id, addedInV3, name) "
+                    + "SELECT id, addedInV3, name FROM save_Entity2");
+            database.execSQL("DROP TABLE save_Entity2");
+        }
+    };
+
     /**
      * Downgrade migration from {@link MigrationDb#MAX_VERSION} to
      * {@link MigrationDb#LATEST_VERSION} that uses the schema file and re-creates the tables such
@@ -581,7 +616,7 @@
 
     private static final Migration[] ALL_MIGRATIONS = new Migration[]{MIGRATION_1_2,
             MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5, MIGRATION_5_6, MIGRATION_6_7,
-            MIGRATION_7_8};
+            MIGRATION_7_8, MIGRATION_8_9};
 
     static final class EmptyMigration extends Migration {
         EmptyMigration(int startVersion, int endVersion) {
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/DefaultValueTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/DefaultValueTest.java
new file mode 100644
index 0000000..71d720e
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/DefaultValueTest.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.room.integration.testapp.test;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.Matchers.closeTo;
+import static org.junit.Assert.assertThat;
+
+import android.content.Context;
+
+import androidx.room.ColumnInfo;
+import androidx.room.Dao;
+import androidx.room.Database;
+import androidx.room.Entity;
+import androidx.room.PrimaryKey;
+import androidx.room.Query;
+import androidx.room.Room;
+import androidx.room.RoomDatabase;
+import androidx.room.TypeConverter;
+import androidx.room.TypeConverters;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.MediumTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
+@RunWith(AndroidJUnit4.class)
+public class DefaultValueTest {
+
+    @SuppressWarnings("unused")
+    public static class TimestampConverter {
+
+        private static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss");
+
+        static {
+            FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));
+        }
+
+        @TypeConverter
+        public String toTimestamp(Date date) {
+            return FORMAT.format(date);
+        }
+
+        @TypeConverter
+        public Date fromTimestamp(String timestamp) {
+            try {
+                return FORMAT.parse(timestamp);
+            } catch (ParseException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    @SuppressWarnings("WeakerAccess")
+    @Entity
+    public static class Sample {
+        @PrimaryKey
+        public long id;
+        public String name;
+        @ColumnInfo(defaultValue = "No description")
+        public String description;
+        @ColumnInfo(defaultValue = "1")
+        public boolean available;
+        @ColumnInfo(defaultValue = "0")
+        public int serial;
+        @ColumnInfo(defaultValue = "CURRENT_TIMESTAMP")
+        @TypeConverters(TimestampConverter.class)
+        public Date timestamp;
+    }
+
+    @Dao
+    public interface SampleDao {
+        @Query("INSERT INTO Sample (name) VALUES (:name)")
+        long insert(String name);
+
+        @Query("SELECT * FROM Sample WHERE id = :id")
+        Sample byId(long id);
+    }
+
+    @Database(entities = {Sample.class}, version = 1, exportSchema = false)
+    public abstract static class SampleDatabase extends RoomDatabase {
+        public abstract SampleDao dao();
+    }
+
+    private SampleDatabase openDatabase() {
+        final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+        return Room.inMemoryDatabaseBuilder(context, SampleDatabase.class).build();
+    }
+
+    @Test
+    @MediumTest
+    public void defaultValues() {
+        final SampleDatabase db = openDatabase();
+        final long id = db.dao().insert("A");
+        final long now = System.currentTimeMillis();
+        final Sample sample = db.dao().byId(id);
+        assertThat(sample.name, is(equalTo("A")));
+        assertThat(sample.description, is(equalTo("No description")));
+        assertThat(sample.available, is(true));
+        assertThat(sample.serial, is(0));
+        assertThat((double) sample.timestamp.getTime(), is(closeTo(now, 3000)));
+    }
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/vo/PlaylistSongXRef.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/vo/PlaylistSongXRef.java
index 9f0e768..fe155b6 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/vo/PlaylistSongXRef.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/vo/PlaylistSongXRef.java
@@ -20,6 +20,7 @@
 
 import androidx.room.Entity;
 import androidx.room.ForeignKey;
+import androidx.room.Index;
 
 @Entity(
         primaryKeys = {"mPlaylistId", "mSongId"},
@@ -34,6 +35,10 @@
                         parentColumns = "mSongId",
                         childColumns = "mSongId",
                         onDelete = CASCADE),
+        },
+        indices = {
+                @Index("mPlaylistId"),
+                @Index("mSongId")
         }
 )
 public class PlaylistSongXRef {
diff --git a/room/migration/api/restricted_2.2.0-alpha01.txt b/room/migration/api/restricted_2.2.0-alpha01.txt
index 86cdebf..ae8f58d 100644
--- a/room/migration/api/restricted_2.2.0-alpha01.txt
+++ b/room/migration/api/restricted_2.2.0-alpha01.txt
@@ -44,9 +44,11 @@
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FieldBundle {
-    ctor public FieldBundle(String!, String!, String!, boolean);
+    ctor @Deprecated public FieldBundle(String!, String!, String!, boolean);
+    ctor public FieldBundle(String!, String!, String!, boolean, String!);
     method public String! getAffinity();
     method public String! getColumnName();
+    method public String! getDefaultValue();
     method public String! getFieldPath();
     method public boolean isNonNull();
     method public boolean isSchemaEqual(androidx.room.migration.bundle.FieldBundle!);
diff --git a/room/migration/api/restricted_current.txt b/room/migration/api/restricted_current.txt
index 86cdebf..ae8f58d 100644
--- a/room/migration/api/restricted_current.txt
+++ b/room/migration/api/restricted_current.txt
@@ -44,9 +44,11 @@
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FieldBundle {
-    ctor public FieldBundle(String!, String!, String!, boolean);
+    ctor @Deprecated public FieldBundle(String!, String!, String!, boolean);
+    ctor public FieldBundle(String!, String!, String!, boolean, String!);
     method public String! getAffinity();
     method public String! getColumnName();
+    method public String! getDefaultValue();
     method public String! getFieldPath();
     method public boolean isNonNull();
     method public boolean isSchemaEqual(androidx.room.migration.bundle.FieldBundle!);
diff --git a/room/migration/src/main/java/androidx/room/migration/bundle/FieldBundle.java b/room/migration/src/main/java/androidx/room/migration/bundle/FieldBundle.java
index cb7c03f..af4574a 100644
--- a/room/migration/src/main/java/androidx/room/migration/bundle/FieldBundle.java
+++ b/room/migration/src/main/java/androidx/room/migration/bundle/FieldBundle.java
@@ -36,12 +36,24 @@
     private String mAffinity;
     @SerializedName("notNull")
     private boolean mNonNull;
+    @SerializedName("defaultValue")
+    private String mDefaultValue;
 
+    /**
+     * @deprecated Use {@link #FieldBundle(String, String, String, boolean, String)}
+     */
+    @Deprecated
     public FieldBundle(String fieldPath, String columnName, String affinity, boolean nonNull) {
+        this(fieldPath, columnName, affinity, nonNull, null);
+    }
+
+    public FieldBundle(String fieldPath, String columnName, String affinity, boolean nonNull,
+            String defaultValue) {
         mFieldPath = fieldPath;
         mColumnName = columnName;
         mAffinity = affinity;
         mNonNull = nonNull;
+        mDefaultValue = defaultValue;
     }
 
     public String getFieldPath() {
@@ -60,6 +72,10 @@
         return mNonNull;
     }
 
+    public String getDefaultValue() {
+        return mDefaultValue;
+    }
+
     @Override
     public boolean isSchemaEqual(FieldBundle other) {
         if (mNonNull != other.mNonNull) return false;
@@ -67,6 +83,10 @@
                 : other.mColumnName != null) {
             return false;
         }
+        if (mDefaultValue != null ? !mDefaultValue.equals(other.mDefaultValue)
+                : other.mDefaultValue != null) {
+            return false;
+        }
         return mAffinity != null ? mAffinity.equals(other.mAffinity) : other.mAffinity == null;
     }
 }
diff --git a/room/migration/src/test/java/androidx/room/migration/bundle/DatabaseBundleTest.java b/room/migration/src/test/java/androidx/room/migration/bundle/DatabaseBundleTest.java
index b607e35..cff8e216 100644
--- a/room/migration/src/test/java/androidx/room/migration/bundle/DatabaseBundleTest.java
+++ b/room/migration/src/test/java/androidx/room/migration/bundle/DatabaseBundleTest.java
@@ -100,7 +100,7 @@
     }
 
     private FieldBundle createFieldBundle(String name) {
-        return new FieldBundle("foo", name, "text", false);
+        return new FieldBundle("foo", name, "text", false, null);
     }
 
     private FtsOptionsBundle createFtsOptionsBundle(String contentTableName) {
diff --git a/room/migration/src/test/java/androidx/room/migration/bundle/EntityBundleTest.java b/room/migration/src/test/java/androidx/room/migration/bundle/EntityBundleTest.java
index 307f9d6..3b9bce2 100644
--- a/room/migration/src/test/java/androidx/room/migration/bundle/EntityBundleTest.java
+++ b/room/migration/src/test/java/androidx/room/migration/bundle/EntityBundleTest.java
@@ -153,7 +153,7 @@
     }
 
     private FieldBundle createFieldBundle(String name) {
-        return new FieldBundle("foo", name, "text", false);
+        return new FieldBundle("foo", name, "text", false, null);
     }
 
     private IndexBundle createIndexBundle(String colName) {
diff --git a/room/migration/src/test/java/androidx/room/migration/bundle/FieldBundleTest.java b/room/migration/src/test/java/androidx/room/migration/bundle/FieldBundleTest.java
index e48114a..5061a58 100644
--- a/room/migration/src/test/java/androidx/room/migration/bundle/FieldBundleTest.java
+++ b/room/migration/src/test/java/androidx/room/migration/bundle/FieldBundleTest.java
@@ -27,36 +27,43 @@
 public class FieldBundleTest {
     @Test
     public void schemaEquality_same_equal() {
-        FieldBundle bundle = new FieldBundle("foo", "foo", "text", false);
-        FieldBundle copy = new FieldBundle("foo", "foo", "text", false);
+        FieldBundle bundle = new FieldBundle("foo", "foo", "text", false, null);
+        FieldBundle copy = new FieldBundle("foo", "foo", "text", false, null);
         assertThat(bundle.isSchemaEqual(copy), is(true));
     }
 
     @Test
     public void schemaEquality_diffNonNull_notEqual() {
-        FieldBundle bundle = new FieldBundle("foo", "foo", "text", false);
-        FieldBundle copy = new FieldBundle("foo", "foo", "text", true);
+        FieldBundle bundle = new FieldBundle("foo", "foo", "text", false, null);
+        FieldBundle copy = new FieldBundle("foo", "foo", "text", true, null);
         assertThat(bundle.isSchemaEqual(copy), is(false));
     }
 
     @Test
     public void schemaEquality_diffColumnName_notEqual() {
-        FieldBundle bundle = new FieldBundle("foo", "foo", "text", false);
-        FieldBundle copy = new FieldBundle("foo", "foo2", "text", true);
+        FieldBundle bundle = new FieldBundle("foo", "foo", "text", false, null);
+        FieldBundle copy = new FieldBundle("foo", "foo2", "text", true, null);
         assertThat(bundle.isSchemaEqual(copy), is(false));
     }
 
     @Test
     public void schemaEquality_diffAffinity_notEqual() {
-        FieldBundle bundle = new FieldBundle("foo", "foo", "text", false);
-        FieldBundle copy = new FieldBundle("foo", "foo2", "int", false);
+        FieldBundle bundle = new FieldBundle("foo", "foo", "text", false, null);
+        FieldBundle copy = new FieldBundle("foo", "foo2", "int", false, null);
         assertThat(bundle.isSchemaEqual(copy), is(false));
     }
 
     @Test
     public void schemaEquality_diffPath_equal() {
-        FieldBundle bundle = new FieldBundle("foo", "foo", "text", false);
-        FieldBundle copy = new FieldBundle("foo>bar", "foo", "text", false);
+        FieldBundle bundle = new FieldBundle("foo", "foo", "text", false, null);
+        FieldBundle copy = new FieldBundle("foo>bar", "foo", "text", false, null);
         assertThat(bundle.isSchemaEqual(copy), is(true));
     }
+
+    @Test
+    public void schemeEquality_diffDefaultValue_notEqual() {
+        FieldBundle bundle = new FieldBundle("foo", "foo", "text", true, null);
+        FieldBundle copy = new FieldBundle("foo", "foo", "text", true, "bar");
+        assertThat(bundle.isSchemaEqual(copy), is(false));
+    }
 }
diff --git a/room/runtime/api/restricted_2.2.0-alpha01.txt b/room/runtime/api/restricted_2.2.0-alpha01.txt
index 3d317a3..9fa1148 100644
--- a/room/runtime/api/restricted_2.2.0-alpha01.txt
+++ b/room/runtime/api/restricted_2.2.0-alpha01.txt
@@ -153,9 +153,11 @@
   }
 
   public static class TableInfo.Column {
-    ctor public TableInfo.Column(String!, String!, boolean, int);
+    ctor @Deprecated public TableInfo.Column(String!, String!, boolean, int);
+    ctor public TableInfo.Column(String!, String!, boolean, int, String!);
     method public boolean isPrimaryKey();
     field public final int affinity;
+    field public final String! defaultValue;
     field public final String! name;
     field public final boolean notNull;
     field public final int primaryKeyPosition;
diff --git a/room/runtime/api/restricted_current.txt b/room/runtime/api/restricted_current.txt
index 3d317a3..9fa1148 100644
--- a/room/runtime/api/restricted_current.txt
+++ b/room/runtime/api/restricted_current.txt
@@ -153,9 +153,11 @@
   }
 
   public static class TableInfo.Column {
-    ctor public TableInfo.Column(String!, String!, boolean, int);
+    ctor @Deprecated public TableInfo.Column(String!, String!, boolean, int);
+    ctor public TableInfo.Column(String!, String!, boolean, int, String!);
     method public boolean isPrimaryKey();
     field public final int affinity;
+    field public final String! defaultValue;
     field public final String! name;
     field public final boolean notNull;
     field public final int primaryKeyPosition;
diff --git a/room/runtime/src/androidTest/java/androidx/room/migration/TableInfoTest.java b/room/runtime/src/androidTest/java/androidx/room/migration/TableInfoTest.java
index 1e2bcb8..7bf0506 100644
--- a/room/runtime/src/androidTest/java/androidx/room/migration/TableInfoTest.java
+++ b/room/runtime/src/androidTest/java/androidx/room/migration/TableInfoTest.java
@@ -60,8 +60,8 @@
                         + "name TEXT)");
         TableInfo info = TableInfo.read(mDb, "foo");
         assertThat(info, is(new TableInfo("foo",
-                toMap(new TableInfo.Column("id", "INTEGER", false, 1),
-                        new TableInfo.Column("name", "TEXT", false, 0)),
+                toMap(new TableInfo.Column("id", "INTEGER", false, 1, null),
+                        new TableInfo.Column("name", "TEXT", false, 0, null)),
                 Collections.<TableInfo.ForeignKey>emptySet())));
     }
 
@@ -72,8 +72,8 @@
                         + "name TEXT, PRIMARY KEY(name, id))");
         TableInfo info = TableInfo.read(mDb, "foo");
         assertThat(info, is(new TableInfo("foo",
-                toMap(new TableInfo.Column("id", "INTEGER", false, 2),
-                        new TableInfo.Column("name", "TEXT", false, 1)),
+                toMap(new TableInfo.Column("id", "INTEGER", false, 2, null),
+                        new TableInfo.Column("name", "TEXT", false, 1, null)),
                 Collections.<TableInfo.ForeignKey>emptySet())));
     }
 
@@ -85,9 +85,9 @@
         mDb.execSQL("ALTER TABLE foo ADD COLUMN added REAL;");
         TableInfo info = TableInfo.read(mDb, "foo");
         assertThat(info, is(new TableInfo("foo",
-                toMap(new TableInfo.Column("id", "INTEGER", false, 0),
-                        new TableInfo.Column("name", "TEXT", false, 1),
-                        new TableInfo.Column("added", "REAL", false, 0)),
+                toMap(new TableInfo.Column("id", "INTEGER", false, 0, null),
+                        new TableInfo.Column("name", "TEXT", false, 1, null),
+                        new TableInfo.Column("added", "REAL", false, 0, null)),
                 Collections.<TableInfo.ForeignKey>emptySet())));
     }
 
@@ -97,7 +97,7 @@
                 "CREATE TABLE foo (name TEXT NOT NULL)");
         TableInfo info = TableInfo.read(mDb, "foo");
         assertThat(info, is(new TableInfo("foo",
-                toMap(new TableInfo.Column("name", "TEXT", true, 0)),
+                toMap(new TableInfo.Column("name", "TEXT", true, 0, null)),
                 Collections.<TableInfo.ForeignKey>emptySet())));
     }
 
@@ -108,7 +108,7 @@
         TableInfo info = TableInfo.read(mDb, "foo");
         assertThat(info, is(new TableInfo(
                 "foo",
-                toMap(new TableInfo.Column("name", "TEXT", false, 0)),
+                toMap(new TableInfo.Column("name", "TEXT", false, 0, "blah")),
                 Collections.<TableInfo.ForeignKey>emptySet())));
     }
 
@@ -179,7 +179,7 @@
         TableInfo info = TableInfo.read(mDb, "foo");
         assertThat(info, is(new TableInfo(
                 "foo",
-                toMap(new TableInfo.Column("n", "INTEGER", false, 0)),
+                toMap(new TableInfo.Column("n", "INTEGER", false, 0, null)),
                 Collections.<TableInfo.ForeignKey>emptySet())));
     }
 
@@ -197,11 +197,11 @@
         TableInfo info = TableInfo.read(mDb, "foo");
         assertThat(info, is(new TableInfo(
                 "foo",
-                toMap(new TableInfo.Column("n", "INTEGER", false, 0),
-                        new TableInfo.Column("indexed", "TEXT", false, 0),
-                        new TableInfo.Column("unique_indexed", "TEXT", false, 0),
-                        new TableInfo.Column("a", "INTEGER", false, 0),
-                        new TableInfo.Column("b", "INTEGER", false, 0)),
+                toMap(new TableInfo.Column("n", "INTEGER", false, 0, null),
+                        new TableInfo.Column("indexed", "TEXT", false, 0, null),
+                        new TableInfo.Column("unique_indexed", "TEXT", false, 0, null),
+                        new TableInfo.Column("a", "INTEGER", false, 0, null),
+                        new TableInfo.Column("b", "INTEGER", false, 0, null)),
                 Collections.<TableInfo.ForeignKey>emptySet(),
                 toSet(new TableInfo.Index("index_foo_blahblah", false,
                         Arrays.asList("a", "b")),
diff --git a/room/runtime/src/main/java/androidx/room/util/TableInfo.java b/room/runtime/src/main/java/androidx/room/util/TableInfo.java
index c187334..5acda44 100644
--- a/room/runtime/src/main/java/androidx/room/util/TableInfo.java
+++ b/room/runtime/src/main/java/androidx/room/util/TableInfo.java
@@ -218,13 +218,16 @@
                 int typeIndex = cursor.getColumnIndex("type");
                 int notNullIndex = cursor.getColumnIndex("notnull");
                 int pkIndex = cursor.getColumnIndex("pk");
+                int defaultValueIndex = cursor.getColumnIndex("dflt_value");
 
                 while (cursor.moveToNext()) {
                     final String name = cursor.getString(nameIndex);
                     final String type = cursor.getString(typeIndex);
                     final boolean notNull = 0 != cursor.getInt(notNullIndex);
                     final int primaryKeyPosition = cursor.getInt(pkIndex);
-                    columns.put(name, new Column(name, type, notNull, primaryKeyPosition));
+                    final String defaultValue = cursor.getString(defaultValueIndex);
+                    columns.put(name,
+                            new Column(name, type, notNull, primaryKeyPosition, defaultValue));
                 }
             }
         } finally {
@@ -342,14 +345,28 @@
          * positives.
          */
         public final int primaryKeyPosition;
+        /**
+         * The default value of this column.
+         */
+        public final String defaultValue;
+
+        /**
+         * @deprecated Use {@link Column#Column(String, String, boolean, int, String)} instead.
+         */
+        @Deprecated
+        public Column(String name, String type, boolean notNull, int primaryKeyPosition) {
+            this(name, type, notNull, primaryKeyPosition, null);
+        }
 
         // if you change this constructor, you must change TableInfoWriter.kt
-        public Column(String name, String type, boolean notNull, int primaryKeyPosition) {
+        public Column(String name, String type, boolean notNull, int primaryKeyPosition,
+                String defaultValue) {
             this.name = name;
             this.type = type;
             this.notNull = notNull;
             this.primaryKeyPosition = primaryKeyPosition;
             this.affinity = findAffinity(type);
+            this.defaultValue = defaultValue;
         }
 
         /**
@@ -400,6 +417,11 @@
             if (!name.equals(column.name)) return false;
             //noinspection SimplifiableIfStatement
             if (notNull != column.notNull) return false;
+            //noinspection EqualsReplaceableByObjectsCall
+            if (defaultValue != null ? !defaultValue.equals(column.defaultValue)
+                    : column.defaultValue != null) {
+                return false;
+            }
             return affinity == column.affinity;
         }
 
@@ -418,6 +440,7 @@
             result = 31 * result + affinity;
             result = 31 * result + (notNull ? 1231 : 1237);
             result = 31 * result + primaryKeyPosition;
+            result = 31 * result + (defaultValue != null ? defaultValue.hashCode() : 0);
             return result;
         }
 
@@ -429,6 +452,7 @@
                     + ", affinity='" + affinity + '\''
                     + ", notNull=" + notNull
                     + ", primaryKeyPosition=" + primaryKeyPosition
+                    + ", defaultValue='" + defaultValue + '\''
                     + '}';
         }
     }
diff --git a/room/testing/src/main/java/androidx/room/testing/MigrationTestHelper.java b/room/testing/src/main/java/androidx/room/testing/MigrationTestHelper.java
index d9611e6..c8a10e6 100644
--- a/room/testing/src/main/java/androidx/room/testing/MigrationTestHelper.java
+++ b/room/testing/src/main/java/androidx/room/testing/MigrationTestHelper.java
@@ -387,7 +387,7 @@
 
     private static TableInfo.Column toColumn(EntityBundle entity, FieldBundle field) {
         return new TableInfo.Column(field.getColumnName(), field.getAffinity(),
-                field.isNonNull(), findPrimaryKeyPosition(entity, field));
+                field.isNonNull(), findPrimaryKeyPosition(entity, field), field.getDefaultValue());
     }
 
     private static int findPrimaryKeyPosition(EntityBundle entity, FieldBundle field) {
diff --git a/settings.gradle b/settings.gradle
index 1a89875..c6aa948 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -109,24 +109,26 @@
 includeProject(":lifecycle:integration-tests:incrementality", "lifecycle/integration-tests/incrementality")
 includeProject(":lifecycle:integration-tests:lifecycle-testapp", "lifecycle/integration-tests/testapp")
 includeProject(":lifecycle:integration-tests:lifecycle-testapp-kotlin", "lifecycle/integration-tests/kotlintestapp")
-includeProject(":lifecycle:lifecycle-common", "lifecycle/common")
-includeProject(":lifecycle:lifecycle-common-java8", "lifecycle/common-java8")
-includeProject(":lifecycle:lifecycle-compiler", "lifecycle/compiler")
-includeProject(":lifecycle:lifecycle-extensions", "lifecycle/extensions")
-includeProject(":lifecycle:lifecycle-livedata-core", "lifecycle/livedata-core")
-includeProject(":lifecycle:lifecycle-livedata-core-ktx", "lifecycle/livedata-core/ktx")
-includeProject(":lifecycle:lifecycle-livedata", "lifecycle/livedata")
-includeProject(":lifecycle:lifecycle-livedata-ktx", "lifecycle/livedata/ktx")
-includeProject(":lifecycle:lifecycle-process", "lifecycle/process")
-includeProject(":lifecycle:lifecycle-reactivestreams", "lifecycle/reactivestreams")
-includeProject(":lifecycle:lifecycle-reactivestreams-ktx", "lifecycle/reactivestreams/ktx")
-includeProject(":lifecycle:lifecycle-runtime", "lifecycle/runtime")
-includeProject(":lifecycle:lifecycle-runtime-ktx", "lifecycle/runtime/ktx")
-includeProject(":lifecycle:lifecycle-runtime-ktx-lint", "lifecycle/runtime/ktx/lint")
-includeProject(":lifecycle:lifecycle-service", "lifecycle/service")
-includeProject(":lifecycle:lifecycle-viewmodel", "lifecycle/viewmodel")
-includeProject(":lifecycle:lifecycle-viewmodel-ktx", "lifecycle/viewmodel/ktx")
-includeProject(":lifecycle:lifecycle-viewmodel-savedstate","lifecycle/viewmodel-savedstate")
+includeProject(":lifecycle:lifecycle-common", "lifecycle/lifecycle-common")
+// scheduled for removal, because it is part of common now. It was left only for docs
+// (till next release of alpha)
+includeProject(":lifecycle:lifecycle-common-java8", "lifecycle/lifecycle-common-java8")
+includeProject(":lifecycle:lifecycle-compiler", "lifecycle/lifecycle-compiler")
+includeProject(":lifecycle:lifecycle-extensions", "lifecycle/lifecycle-extensions")
+includeProject(":lifecycle:lifecycle-livedata-core", "lifecycle/lifecycle-livedata-core")
+includeProject(":lifecycle:lifecycle-livedata-core-ktx", "lifecycle/lifecycle-livedata-core-ktx")
+includeProject(":lifecycle:lifecycle-livedata", "lifecycle/lifecycle-livedata")
+includeProject(":lifecycle:lifecycle-livedata-ktx", "lifecycle/lifecycle-livedata-ktx")
+includeProject(":lifecycle:lifecycle-process", "lifecycle/lifecycle-process")
+includeProject(":lifecycle:lifecycle-reactivestreams", "lifecycle/lifecycle-reactivestreams")
+includeProject(":lifecycle:lifecycle-reactivestreams-ktx", "lifecycle/lifecycle-reactivestreams-ktx")
+includeProject(":lifecycle:lifecycle-runtime", "lifecycle/lifecycle-runtime")
+includeProject(":lifecycle:lifecycle-runtime-ktx", "lifecycle/lifecycle-runtime-ktx")
+includeProject(":lifecycle:lifecycle-runtime-ktx-lint", "lifecycle/lifecycle-runtime-ktx-lint")
+includeProject(":lifecycle:lifecycle-service", "lifecycle/lifecycle-service")
+includeProject(":lifecycle:lifecycle-viewmodel", "lifecycle/lifecycle-viewmodel")
+includeProject(":lifecycle:lifecycle-viewmodel-ktx", "lifecycle/lifecycle-viewmodel-ktx")
+includeProject(":lifecycle:lifecycle-viewmodel-savedstate","lifecycle/lifecycle-viewmodel-savedstate")
 includeProject(":loader:loader", "loader/loader")
 includeProject(":loader:loader-ktx", "loader/loader-ktx")
 includeProject(":localbroadcastmanager", "localbroadcastmanager")
diff --git a/ui/framework/api/1.0.0-alpha01.txt b/ui/framework/api/1.0.0-alpha01.txt
index 5026c84..104650a 100644
--- a/ui/framework/api/1.0.0-alpha01.txt
+++ b/ui/framework/api/1.0.0-alpha01.txt
@@ -119,30 +119,6 @@
     method public static void RepaintBoundary(String? name = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
-  public final class Selection {
-    ctor public Selection(androidx.ui.engine.geometry.Offset startOffset, androidx.ui.engine.geometry.Offset endOffset, androidx.ui.core.LayoutCoordinates? startLayoutCoordinates, androidx.ui.core.LayoutCoordinates? endLayoutCoordinates);
-    method public androidx.ui.engine.geometry.Offset component1();
-    method public androidx.ui.engine.geometry.Offset component2();
-    method public androidx.ui.core.LayoutCoordinates? component3();
-    method public androidx.ui.core.LayoutCoordinates? component4();
-    method public androidx.ui.core.Selection copy(androidx.ui.engine.geometry.Offset startOffset, androidx.ui.engine.geometry.Offset endOffset, androidx.ui.core.LayoutCoordinates? startLayoutCoordinates, androidx.ui.core.LayoutCoordinates? endLayoutCoordinates);
-    method public androidx.ui.core.LayoutCoordinates? getEndLayoutCoordinates();
-    method public androidx.ui.engine.geometry.Offset getEndOffset();
-    method public androidx.ui.core.LayoutCoordinates? getStartLayoutCoordinates();
-    method public androidx.ui.engine.geometry.Offset getStartOffset();
-  }
-
-  public final class SelectionKt {
-    ctor public SelectionKt();
-    method public static void SelectionContainer(androidx.ui.core.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.Selection,kotlin.Unit> onSelectionChange, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static androidx.compose.Ambient<androidx.ui.core.SelectionRegistrar> getSelectionRegistrarAmbient();
-  }
-
-  public interface SelectionRegistrar {
-    method public Object subscribe(androidx.ui.core.TextSelectionHandler handler);
-    method public void unsubscribe(Object key);
-  }
-
   public final class SemanticsKt {
     ctor public SemanticsKt();
     method public static void Semantics(boolean container = false, boolean explicitChildNodes = false, Boolean? enabled = null, Boolean? checked = null, Boolean? selected = null, Boolean? button = null, Boolean? inMutuallyExclusiveGroup = null, Boolean? hidden = null, String? label = null, String? value = null, androidx.ui.engine.text.TextDirection? textDirection = null, String? testTag = null, java.util.List<? extends androidx.ui.core.semantics.SemanticsAction<?>> actions = emptyList(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
@@ -163,10 +139,6 @@
     method public static androidx.compose.Effect<androidx.ui.painting.TextStyle> currentTextStyle();
   }
 
-  public interface TextSelectionHandler {
-    method public androidx.ui.core.Selection? getSelection(kotlin.Pair<androidx.ui.core.PxPosition,androidx.ui.core.PxPosition> selectionCoordinates, androidx.ui.core.LayoutCoordinates containerLayoutCoordinates);
-  }
-
   public final class TextSpanComposeKt {
     ctor public TextSpanComposeKt();
     method public static void Span(androidx.ui.core.TextSpanScope, String? text = null, androidx.ui.painting.TextStyle? style = null, kotlin.jvm.functions.Function1<? super androidx.ui.core.TextSpanScope,kotlin.Unit> child);
@@ -275,6 +247,32 @@
 
 }
 
+package androidx.ui.core.selection {
+
+  public final class Selection {
+    ctor public Selection(androidx.ui.engine.geometry.Rect startOffset, androidx.ui.engine.geometry.Rect endOffset, androidx.ui.core.LayoutCoordinates? startLayoutCoordinates, androidx.ui.core.LayoutCoordinates? endLayoutCoordinates);
+    method public androidx.ui.engine.geometry.Rect component1();
+    method public androidx.ui.engine.geometry.Rect component2();
+    method public androidx.ui.core.LayoutCoordinates? component3();
+    method public androidx.ui.core.LayoutCoordinates? component4();
+    method public androidx.ui.core.selection.Selection copy(androidx.ui.engine.geometry.Rect startOffset, androidx.ui.engine.geometry.Rect endOffset, androidx.ui.core.LayoutCoordinates? startLayoutCoordinates, androidx.ui.core.LayoutCoordinates? endLayoutCoordinates);
+    method public androidx.ui.core.LayoutCoordinates? getEndLayoutCoordinates();
+    method public androidx.ui.engine.geometry.Rect getEndOffset();
+    method public androidx.ui.core.LayoutCoordinates? getStartLayoutCoordinates();
+    method public androidx.ui.engine.geometry.Rect getStartOffset();
+  }
+
+  public final class SelectionContainerKt {
+    ctor public SelectionContainerKt();
+    method public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+  }
+
+  public final class SelectionManagerKt {
+    ctor public SelectionManagerKt();
+  }
+
+}
+
 package androidx.ui.core.vectorgraphics {
 
   public interface Brush {
diff --git a/ui/framework/api/current.txt b/ui/framework/api/current.txt
index 5026c84..104650a 100644
--- a/ui/framework/api/current.txt
+++ b/ui/framework/api/current.txt
@@ -119,30 +119,6 @@
     method public static void RepaintBoundary(String? name = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
-  public final class Selection {
-    ctor public Selection(androidx.ui.engine.geometry.Offset startOffset, androidx.ui.engine.geometry.Offset endOffset, androidx.ui.core.LayoutCoordinates? startLayoutCoordinates, androidx.ui.core.LayoutCoordinates? endLayoutCoordinates);
-    method public androidx.ui.engine.geometry.Offset component1();
-    method public androidx.ui.engine.geometry.Offset component2();
-    method public androidx.ui.core.LayoutCoordinates? component3();
-    method public androidx.ui.core.LayoutCoordinates? component4();
-    method public androidx.ui.core.Selection copy(androidx.ui.engine.geometry.Offset startOffset, androidx.ui.engine.geometry.Offset endOffset, androidx.ui.core.LayoutCoordinates? startLayoutCoordinates, androidx.ui.core.LayoutCoordinates? endLayoutCoordinates);
-    method public androidx.ui.core.LayoutCoordinates? getEndLayoutCoordinates();
-    method public androidx.ui.engine.geometry.Offset getEndOffset();
-    method public androidx.ui.core.LayoutCoordinates? getStartLayoutCoordinates();
-    method public androidx.ui.engine.geometry.Offset getStartOffset();
-  }
-
-  public final class SelectionKt {
-    ctor public SelectionKt();
-    method public static void SelectionContainer(androidx.ui.core.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.Selection,kotlin.Unit> onSelectionChange, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-    method public static androidx.compose.Ambient<androidx.ui.core.SelectionRegistrar> getSelectionRegistrarAmbient();
-  }
-
-  public interface SelectionRegistrar {
-    method public Object subscribe(androidx.ui.core.TextSelectionHandler handler);
-    method public void unsubscribe(Object key);
-  }
-
   public final class SemanticsKt {
     ctor public SemanticsKt();
     method public static void Semantics(boolean container = false, boolean explicitChildNodes = false, Boolean? enabled = null, Boolean? checked = null, Boolean? selected = null, Boolean? button = null, Boolean? inMutuallyExclusiveGroup = null, Boolean? hidden = null, String? label = null, String? value = null, androidx.ui.engine.text.TextDirection? textDirection = null, String? testTag = null, java.util.List<? extends androidx.ui.core.semantics.SemanticsAction<?>> actions = emptyList(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
@@ -163,10 +139,6 @@
     method public static androidx.compose.Effect<androidx.ui.painting.TextStyle> currentTextStyle();
   }
 
-  public interface TextSelectionHandler {
-    method public androidx.ui.core.Selection? getSelection(kotlin.Pair<androidx.ui.core.PxPosition,androidx.ui.core.PxPosition> selectionCoordinates, androidx.ui.core.LayoutCoordinates containerLayoutCoordinates);
-  }
-
   public final class TextSpanComposeKt {
     ctor public TextSpanComposeKt();
     method public static void Span(androidx.ui.core.TextSpanScope, String? text = null, androidx.ui.painting.TextStyle? style = null, kotlin.jvm.functions.Function1<? super androidx.ui.core.TextSpanScope,kotlin.Unit> child);
@@ -275,6 +247,32 @@
 
 }
 
+package androidx.ui.core.selection {
+
+  public final class Selection {
+    ctor public Selection(androidx.ui.engine.geometry.Rect startOffset, androidx.ui.engine.geometry.Rect endOffset, androidx.ui.core.LayoutCoordinates? startLayoutCoordinates, androidx.ui.core.LayoutCoordinates? endLayoutCoordinates);
+    method public androidx.ui.engine.geometry.Rect component1();
+    method public androidx.ui.engine.geometry.Rect component2();
+    method public androidx.ui.core.LayoutCoordinates? component3();
+    method public androidx.ui.core.LayoutCoordinates? component4();
+    method public androidx.ui.core.selection.Selection copy(androidx.ui.engine.geometry.Rect startOffset, androidx.ui.engine.geometry.Rect endOffset, androidx.ui.core.LayoutCoordinates? startLayoutCoordinates, androidx.ui.core.LayoutCoordinates? endLayoutCoordinates);
+    method public androidx.ui.core.LayoutCoordinates? getEndLayoutCoordinates();
+    method public androidx.ui.engine.geometry.Rect getEndOffset();
+    method public androidx.ui.core.LayoutCoordinates? getStartLayoutCoordinates();
+    method public androidx.ui.engine.geometry.Rect getStartOffset();
+  }
+
+  public final class SelectionContainerKt {
+    ctor public SelectionContainerKt();
+    method public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+  }
+
+  public final class SelectionManagerKt {
+    ctor public SelectionManagerKt();
+  }
+
+}
+
 package androidx.ui.core.vectorgraphics {
 
   public interface Brush {
diff --git a/ui/framework/src/main/java/androidx/ui/core/Selection.kt b/ui/framework/src/main/java/androidx/ui/core/Selection.kt
deleted file mode 100644
index 4b0846c..0000000
--- a/ui/framework/src/main/java/androidx/ui/core/Selection.kt
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.ui.core
-
-import androidx.ui.core.gesture.PressIndicatorGestureDetector
-import androidx.ui.engine.geometry.Offset
-import androidx.ui.graphics.Color
-import androidx.ui.painting.Paint
-import androidx.compose.Ambient
-import androidx.compose.Children
-import androidx.compose.Composable
-import androidx.compose.composer
-import androidx.compose.memo
-import androidx.compose.unaryPlus
-
-private val HANDLE_WIDTH = 20.px
-private val HANDLE_HEIGHT = 100.px
-
-/**
- * Data class of Selection.
- */
-data class Selection(
-    /**
-     * The coordinates of the start offset of the selection. For text, it's the left bottom corner
-     * of the character at the start offset.
-     */
-    val startOffset: Offset,
-    /**
-     * The coordinates of the end offset of the selection. For text, it's the left bottom corner
-     * of the character at the end offset.
-     */
-    val endOffset: Offset,
-    /**
-     * The layout coordinates of the child which contains the start of the selection. If the child
-     * does not contain the start of the selection, this should be null.
-     */
-    val startLayoutCoordinates: LayoutCoordinates?,
-    /**
-     * The layout coordinates of the child which contains the end of the selection. If the child
-     * does not contain the end of the selection, this should be null.
-     */
-    val endLayoutCoordinates: LayoutCoordinates?
-)
-
-/**
- * An interface handling selection. Get selection from a widget by passing in the start and end of
- * selection in a selection container as a pair, and the layout coordinates of the selection
- * container.
- */
-interface TextSelectionHandler {
-    fun getSelection(
-        selectionCoordinates: Pair<PxPosition, PxPosition>,
-        containerLayoutCoordinates: LayoutCoordinates
-    ): Selection?
-}
-
-/**
- *  An interface allowing a Text composable to "register" and "unregister" itself with the class
- *  implementing the interface.
- */
-interface SelectionRegistrar {
-    // TODO(qqd): Replace Any with a type in future.
-    fun subscribe(handler: TextSelectionHandler): Any
-
-    fun unsubscribe(key: Any)
-}
-
-internal class SelectionManager : SelectionRegistrar {
-    /**
-     * This is essentially the list of registered components that want
-     * to handle text selection that are below the SelectionContainer.
-     */
-    val handlers = mutableSetOf<TextSelectionHandler>()
-
-    /**
-     * Layout Coordinates of the selection container.
-     */
-    var containerLayoutCoordinates: LayoutCoordinates? = null
-
-    /**
-     * Allow a Text composable to "register" itself with the manager
-     */
-    override fun subscribe(handler: TextSelectionHandler): Any {
-        handlers.add(handler)
-        return handler
-    }
-
-    /**
-     * Allow a Text composable to "unregister" itself with the manager
-     */
-    override fun unsubscribe(key: Any) {
-        handlers.remove(key as TextSelectionHandler)
-    }
-
-    var selection: Selection? = null
-
-    var onSelectionChange: (Selection?) -> Unit = {}
-
-    fun onPress(position: PxPosition) {
-        var result: Selection? = null
-        for (handler in handlers) {
-            result = handler.getSelection(Pair(position, position), containerLayoutCoordinates!!)
-        }
-        onSelectionChange(result)
-    }
-}
-
-/** Ambient of SelectionRegistrar for SelectionManager. */
-val SelectionRegistrarAmbient = Ambient.of<SelectionRegistrar> { SelectionManager() }
-
-/**
- * Selection Widget.
- *
- * The selection widget wraps composables and let them to be selectable. It paints the selection
- * area with start and end handles.
- */
-@Composable
-fun SelectionContainer(
-    /** Current Selection status.*/
-    selection: Selection?,
-    /** A function containing customized behaviour when selection changes. */
-    onSelectionChange: (Selection?) -> Unit,
-    @Children children: @Composable() () -> Unit
-) {
-    val manager = +memo { SelectionManager() }
-    // TODO (qqd): After selection widget is fully implemented, evaluate if the following 2 items
-    // are expensive. If so, use
-    // +memo(selection) { manager.selection = selection }
-    // +memo(onSelectionChange) { manager.onSelectionChange = onSelectionChange }
-    manager.selection = selection
-    manager.onSelectionChange = onSelectionChange
-
-    SelectionRegistrarAmbient.Provider(value = manager) {
-        val content = @Composable {
-            val content = @Composable() {
-                // Get the layout coordinates of the selection container. This is for hit test of
-                // cross-widget selection.
-                OnPositioned(onPositioned = { manager.containerLayoutCoordinates = it })
-                PressIndicatorGestureDetector(onStart = { position -> manager.onPress(position) }) {
-                    children()
-                }
-            }
-            Layout(children = content, layoutBlock = { measurables, constraints ->
-                val placeable = measurables.firstOrNull()?.measure(constraints)
-                val width = placeable?.width ?: constraints.minWidth
-                val height = placeable?.height ?: constraints.minHeight
-                layout(width, height) {
-                    placeable?.place(0.ipx, 0.ipx)
-                }
-            })
-        }
-        val startHandle = @Composable {
-            Layout(children = { SelectionHandle() }, layoutBlock = { _, constraints ->
-                layout(constraints.minWidth, constraints.minHeight) {}
-            })
-        }
-        val endHandle = @Composable {
-            Layout(children = { SelectionHandle() }, layoutBlock = { _, constraints ->
-                layout(constraints.minWidth, constraints.minHeight) {}
-            })
-        }
-        @Suppress("USELESS_CAST")
-        Layout(
-            childrenArray = arrayOf(content, startHandle, endHandle),
-            layoutBlock = { measurables, constraints ->
-                val placeable = measurables[0].measure(constraints)
-                val width = placeable.width
-                val height = placeable.height
-                val start =
-                    measurables[startHandle as () -> Unit].first().measure(
-                        Constraints.tightConstraints(
-                            HANDLE_WIDTH.round(),
-                            HANDLE_HEIGHT.round()
-                        )
-                    )
-                val end =
-                    measurables[endHandle as () -> Unit].first().measure(
-                        Constraints.tightConstraints(
-                            HANDLE_WIDTH.round(),
-                            HANDLE_HEIGHT.round()
-                        )
-                    )
-                layout(width, height) {
-                    placeable.place(IntPx.Zero, IntPx.Zero)
-                    if (selection != null &&
-                        selection.startLayoutCoordinates != null &&
-                        selection.endLayoutCoordinates != null) {
-                        val startOffset = manager.containerLayoutCoordinates!!.childToLocal(
-                            selection.startLayoutCoordinates,
-                            PxPosition(selection.startOffset.dx.px, selection.startOffset.dy.px)
-                        )
-                        val endOffset = manager.containerLayoutCoordinates!!.childToLocal(
-                            selection.endLayoutCoordinates,
-                            PxPosition(selection.endOffset.dx.px, selection.endOffset.dy.px)
-                        )
-                        start.place(startOffset.x, startOffset.y - HANDLE_HEIGHT)
-                        end.place(endOffset.x - HANDLE_WIDTH, endOffset.y - HANDLE_HEIGHT)
-                    }
-                }
-            })
-    }
-}
-
-@Composable
-internal fun SelectionHandle() {
-    val paint = +memo { Paint() }
-    paint.color = Color(0xAAD94633.toInt())
-    Draw { canvas, parentSize ->
-        canvas.drawRect(parentSize.toRect(), paint)
-    }
-}
diff --git a/ui/framework/src/main/java/androidx/ui/core/Text.kt b/ui/framework/src/main/java/androidx/ui/core/Text.kt
index 222e421..b039494 100644
--- a/ui/framework/src/main/java/androidx/ui/core/Text.kt
+++ b/ui/framework/src/main/java/androidx/ui/core/Text.kt
@@ -37,6 +37,10 @@
 import androidx.compose.memo
 import androidx.compose.onDispose
 import androidx.compose.unaryPlus
+import androidx.ui.core.selection.Selection
+import androidx.ui.core.selection.SelectionRegistrarAmbient
+import androidx.ui.core.selection.TextSelectionHandler
+import androidx.ui.engine.text.TextAffinity
 import androidx.ui.painting.TextPainter
 
 private val DefaultTextAlign: TextAlign = TextAlign.Start
@@ -214,30 +218,37 @@
                     val startPx = selectionCoordinates.first - relativePosition
                     val endPx = selectionCoordinates.second - relativePosition
 
-                    val start = Offset(startPx.x.value, startPx.y.value)
-                    val end = Offset(endPx.x.value, endPx.y.value)
+                    val startOffset = Offset(startPx.x.value, startPx.y.value)
+                    val endOffset = Offset(endPx.x.value, endPx.y.value)
 
-                    var selectionStart = textPainter.getPositionForOffset(start)
-                    var selectionEnd = textPainter.getPositionForOffset(end)
+                    var selectionStart = textPainter.getPositionForOffset(startOffset)
+                    var selectionEnd = textPainter.getPositionForOffset(endOffset)
 
                     if (selectionStart.offset == selectionEnd.offset) {
                         val wordBoundary = textPainter.getWordBoundary(selectionStart)
                         selectionStart =
                             TextPosition(wordBoundary.start, selectionStart.affinity)
                         selectionEnd = TextPosition(wordBoundary.end, selectionEnd.affinity)
+                    } else {
+                        // Currently on Android, selection end is the offset after last character.
+                        // But when dragging happens, current Crane Text Selection end is the offset
+                        // of the last character. Thus before calling drawing selection background,
+                        // make the selection end matches Android behaviour.
+                        selectionEnd = TextPosition(selectionEnd.offset + 1, TextAffinity.upstream)
                     }
 
                     internalSelection.value =
                         TextSelection(selectionStart.offset, selectionEnd.offset)
 
-                    // TODO(qqd): Determine a set of coordinates around a character that we need.
-                    // Clean up the lower layer's getCaretForTextPosition methods.
-                    // Currently the left bottom corner of a character is returned.
+                    // In Crane Text Selection, the selection end should be the last character, thus
+                    // make the selection end matches Crane behaviour.
+                    selectionEnd = TextPosition(selectionEnd.offset - 1, TextAffinity.upstream)
+
                     return Selection(
                         startOffset =
-                        textPainter.getCaretForTextPosition(selectionStart).second,
+                        textPainter.getBoundingBoxForTextPosition(selectionStart),
                         endOffset =
-                        textPainter.getCaretForTextPosition(selectionEnd).second,
+                        textPainter.getBoundingBoxForTextPosition(selectionEnd),
                         startLayoutCoordinates = layoutCoordinates.value!!,
                         endLayoutCoordinates = layoutCoordinates.value!!
                     )
diff --git a/ui/framework/src/main/java/androidx/ui/core/selection/Selection.kt b/ui/framework/src/main/java/androidx/ui/core/selection/Selection.kt
new file mode 100644
index 0000000..fd376e0
--- /dev/null
+++ b/ui/framework/src/main/java/androidx/ui/core/selection/Selection.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.core.selection
+
+import androidx.ui.core.LayoutCoordinates
+import androidx.ui.engine.geometry.Rect
+
+/**
+ * Data class of Selection.
+ */
+data class Selection(
+    /**
+     * The bounding box of the character at the start offset as Rect. The bounding box includes the
+     * top, bottom, left, and right of the character. Note: It is temporary to use Rect.
+     */
+    // TODO(qqd): After solving the problem of getting the coordinates of a character, figure out
+    // what should the startOffset and endOffset should be.
+    val startOffset: Rect,
+    /**
+     * The bounding box of the character at the end offset as Rect. The bounding box includes the
+     * top, bottom, left, and right of the character. Note: It is temporary to use Rect.
+     */
+    val endOffset: Rect,
+    /**
+     * The layout coordinates of the child which contains the start of the selection. If the child
+     * does not contain the start of the selection, this should be null.
+     */
+    val startLayoutCoordinates: LayoutCoordinates?,
+    /**
+     * The layout coordinates of the child which contains the end of the selection. If the child
+     * does not contain the end of the selection, this should be null.
+     */
+    val endLayoutCoordinates: LayoutCoordinates?
+)
\ No newline at end of file
diff --git a/ui/framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt b/ui/framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt
new file mode 100644
index 0000000..84d9793
--- /dev/null
+++ b/ui/framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.core.selection
+
+import androidx.compose.Children
+import androidx.compose.Composable
+import androidx.compose.composer
+import androidx.compose.memo
+import androidx.compose.unaryPlus
+import androidx.ui.core.Constraints
+import androidx.ui.core.Draw
+import androidx.ui.core.IntPx
+import androidx.ui.core.Layout
+import androidx.ui.core.OnPositioned
+import androidx.ui.core.PxPosition
+import androidx.ui.core.gesture.DragGestureDetector
+import androidx.ui.core.gesture.PressIndicatorGestureDetector
+import androidx.ui.core.ipx
+import androidx.ui.core.px
+import androidx.ui.core.round
+import androidx.ui.core.toRect
+import androidx.ui.graphics.Color
+import androidx.ui.painting.Paint
+
+private val HANDLE_WIDTH = 100.px
+private val HANDLE_HEIGHT = 100.px
+
+/**
+ * Selection Widget.
+ *
+ * The selection widget wraps composables and let them to be selectable. It paints the selection
+ * area with start and end handles.
+ */
+@Composable
+fun SelectionContainer(
+    /** Current Selection status.*/
+    selection: Selection?,
+    /** A function containing customized behaviour when selection changes. */
+    onSelectionChange: (Selection?) -> Unit,
+    @Children children: @Composable() () -> Unit
+) {
+    val manager = +memo { SelectionManager() }
+    // TODO (qqd): After selection widget is fully implemented, evaluate if the following 2 items
+    // are expensive. If so, use
+    // +memo(selection) { manager.selection = selection }
+    // +memo(onSelectionChange) { manager.onSelectionChange = onSelectionChange }
+    manager.selection = selection
+    manager.onSelectionChange = onSelectionChange
+
+    SelectionRegistrarAmbient.Provider(value = manager) {
+        val content = @Composable {
+            val content = @Composable() {
+                // Get the layout coordinates of the selection container. This is for hit test of
+                // cross-widget selection.
+                OnPositioned(onPositioned = { manager.containerLayoutCoordinates = it })
+                PressIndicatorGestureDetector(onStart = { position -> manager.onPress(position) }) {
+                    children()
+                }
+            }
+            Layout(children = content, layoutBlock = { measurables, constraints ->
+                val placeable = measurables.firstOrNull()?.measure(constraints)
+                val width = placeable?.width ?: constraints.minWidth
+                val height = placeable?.height ?: constraints.minHeight
+                layout(width, height) {
+                    placeable?.place(0.ipx, 0.ipx)
+                }
+            })
+        }
+        val startHandle = @Composable {
+            DragGestureDetector(
+                canDrag = { true },
+                dragObserver = manager.handleDragObserver(dragStartHandle = true)
+            ) {
+                Layout(
+                    children = { SelectionHandle() },
+                    layoutBlock = { _, constraints ->
+                        layout(constraints.minWidth, constraints.minHeight) {}
+                    })
+            }
+        }
+        val endHandle = @Composable {
+            DragGestureDetector(
+                canDrag = { true },
+                dragObserver = manager.handleDragObserver(dragStartHandle = false)
+            ) {
+                Layout(
+                    children = { SelectionHandle() },
+                    layoutBlock = { _, constraints ->
+                        layout(constraints.minWidth, constraints.minHeight) {}
+                    })
+            }
+        }
+        @Suppress("USELESS_CAST")
+        (Layout(
+        childrenArray = arrayOf(content, startHandle, endHandle),
+        layoutBlock = { measurables, constraints ->
+            val placeable = measurables[0].measure(constraints)
+            val width = placeable.width
+            val height = placeable.height
+            val start =
+                measurables[startHandle as () -> Unit].first().measure(
+                    Constraints.tightConstraints(
+                        HANDLE_WIDTH.round(),
+                        HANDLE_HEIGHT.round()
+                    )
+                )
+            val end =
+                measurables[endHandle as () -> Unit].first().measure(
+                    Constraints.tightConstraints(
+                        HANDLE_WIDTH.round(),
+                        HANDLE_HEIGHT.round()
+                    )
+                )
+            layout(width, height) {
+                placeable.place(IntPx.Zero, IntPx.Zero)
+                if (selection != null &&
+                    selection.startLayoutCoordinates != null &&
+                    selection.endLayoutCoordinates != null
+                ) {
+                    val startOffset = manager.containerLayoutCoordinates.childToLocal(
+                        selection.startLayoutCoordinates,
+                        PxPosition(
+                            selection.startOffset.left.px,
+                            selection.startOffset.bottom.px
+                        )
+                    )
+                    val endOffset = manager.containerLayoutCoordinates.childToLocal(
+                        selection.endLayoutCoordinates,
+                        PxPosition(
+                            selection.endOffset.right.px,
+                            selection.endOffset.bottom.px
+                        )
+                    )
+                    start.place(startOffset.x - HANDLE_WIDTH, startOffset.y - HANDLE_HEIGHT)
+                    end.place(endOffset.x, endOffset.y - HANDLE_HEIGHT)
+                }
+            }
+        }))
+    }
+}
+
+@Composable
+internal fun SelectionHandle() {
+    val paint = +memo { Paint() }
+    paint.color = Color(0xAAD94633.toInt())
+    Draw { canvas, parentSize ->
+        canvas.drawRect(parentSize.toRect(), paint)
+    }
+}
diff --git a/ui/framework/src/main/java/androidx/ui/core/selection/SelectionManager.kt b/ui/framework/src/main/java/androidx/ui/core/selection/SelectionManager.kt
new file mode 100644
index 0000000..64727fd
--- /dev/null
+++ b/ui/framework/src/main/java/androidx/ui/core/selection/SelectionManager.kt
@@ -0,0 +1,185 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.core.selection
+
+import androidx.compose.Ambient
+import androidx.ui.core.LayoutCoordinates
+import androidx.ui.core.PxPosition
+import androidx.ui.core.gesture.DragObserver
+import androidx.ui.core.px
+import androidx.ui.engine.geometry.Rect
+
+/**
+ * An interface handling selection. Get selection from a widget by passing in the start and end of
+ * selection in a selection container as a pair, and the layout coordinates of the selection
+ * container.
+ */
+internal interface TextSelectionHandler {
+    fun getSelection(
+        selectionCoordinates: Pair<PxPosition, PxPosition>,
+        containerLayoutCoordinates: LayoutCoordinates
+    ): Selection?
+}
+
+/**
+ *  An interface allowing a Text composable to "register" and "unregister" itself with the class
+ *  implementing the interface.
+ */
+internal interface SelectionRegistrar {
+    // TODO(qqd): Replace Any with a type in future.
+    fun subscribe(handler: TextSelectionHandler): Any
+
+    fun unsubscribe(key: Any)
+}
+
+internal class SelectionManager : SelectionRegistrar {
+    /**
+     * The current selection.
+     */
+    var selection: Selection? = null
+
+    /**
+     * The manager will invoke this every time it comes to the conclusion that the selection should
+     * change. The expectation is that this callback will end up causing `setSelection` to get
+     * called. This is what makes this a "controlled component".
+     */
+    var onSelectionChange: (Selection?) -> Unit = {}
+
+    /**
+     * Layout Coordinates of the selection container.
+     */
+    lateinit var containerLayoutCoordinates: LayoutCoordinates
+
+    /**
+     * This is essentially the list of registered components that want
+     * to handle text selection that are below the SelectionContainer.
+     */
+    private val handlers = mutableSetOf<TextSelectionHandler>()
+
+    /**
+     * The beginning position of the drag gesture. Every time a new drag gesture starts, it wil be
+     * recalculated.
+     */
+    private var dragBeginPosition = PxPosition.Origin
+
+    /**
+     * The total distance being dragged of the drag gesture. Every time a new drag gesture starts,
+     * it will be zeroed out.
+     */
+    private var dragTotalDistance = PxPosition.Origin
+
+    /**
+     * Allow a Text composable to "register" itself with the manager
+     */
+    override fun subscribe(handler: TextSelectionHandler): Any {
+        handlers.add(handler)
+        return handler
+    }
+
+    /**
+     * Allow a Text composable to "unregister" itself with the manager
+     */
+    override fun unsubscribe(key: Any) {
+        handlers.remove(key as TextSelectionHandler)
+    }
+
+    fun onPress(position: PxPosition) {
+        var result: Selection? = null
+        for (handler in handlers) {
+            result = handler.getSelection(Pair(position, position), containerLayoutCoordinates)
+        }
+        onSelectionChange(result)
+    }
+
+    // Get the coordinates of a character. Currently, it's the middle point of the left edge of the
+    // bounding box of the character. This is a temporary solution.
+    // TODO(qqd): Read how Android solve this problem.
+    fun getCoordinatesForCharacter(box: Rect): PxPosition {
+        return PxPosition(box.left.px, box.top.px + (box.bottom.px - box.top.px) / 2)
+    }
+
+    fun handleDragObserver(dragStartHandle: Boolean): DragObserver {
+        return object : DragObserver {
+            override fun onStart() {
+                // The LayoutCoordinates of the widget where the drag gesture should begin. This
+                // is used to convert the position of the beginning of the drag gesture from the
+                // widget coordinates to selection container coordinates.
+                val beginLayoutCoordinates =
+                    if (dragStartHandle) {
+                        selection!!.startLayoutCoordinates!!
+                    } else {
+                        selection!!.endLayoutCoordinates!!
+                    }
+                // The position of the character where the drag gesture should begin. This is in
+                // the widget coordinates.
+                val beginCoordinates =
+                    getCoordinatesForCharacter(
+                        if (dragStartHandle) {
+                            selection!!.startOffset
+                        } else {
+                            selection!!.endOffset
+                        }
+                    )
+                // Convert the position where drag gesture begins from widget coordinates to
+                // selection container coordinates.
+                dragBeginPosition = containerLayoutCoordinates.childToLocal(
+                    beginLayoutCoordinates,
+                    beginCoordinates
+                )
+
+                // Zero out the total distance that being dragged.
+                dragTotalDistance = PxPosition.Origin
+            }
+
+            override fun onDrag(dragDistance: PxPosition): PxPosition {
+                var result = selection
+                dragTotalDistance += dragDistance
+
+                val currentStart =
+                    if (dragStartHandle) {
+                        dragBeginPosition + dragTotalDistance
+                    } else {
+                        containerLayoutCoordinates.childToLocal(
+                            selection!!.startLayoutCoordinates!!,
+                            getCoordinatesForCharacter(selection!!.startOffset)
+                        )
+                    }
+
+                val currentEnd =
+                    if (dragStartHandle) {
+                        containerLayoutCoordinates.childToLocal(
+                            selection!!.endLayoutCoordinates!!,
+                            getCoordinatesForCharacter(selection!!.endOffset)
+                        )
+                    } else {
+                        dragBeginPosition + dragTotalDistance
+                    }
+
+                for (handler in handlers) {
+                    result = handler.getSelection(
+                        Pair(currentStart, currentEnd),
+                        containerLayoutCoordinates)
+                }
+                onSelectionChange(result)
+                return dragDistance
+            }
+        }
+    }
+}
+
+/** Ambient of SelectionRegistrar for SelectionManager. */
+internal val SelectionRegistrarAmbient = Ambient.of<SelectionRegistrar> { SelectionManager() }
diff --git a/ui/text/api/1.0.0-alpha01.txt b/ui/text/api/1.0.0-alpha01.txt
index b039567..e403687 100644
--- a/ui/text/api/1.0.0-alpha01.txt
+++ b/ui/text/api/1.0.0-alpha01.txt
@@ -65,7 +65,6 @@
 
   public final class Paragraph {
     method public float getBaseline();
-    method public kotlin.Pair<androidx.ui.engine.geometry.Offset,androidx.ui.engine.geometry.Offset> getCaretForTextPosition(androidx.ui.engine.text.TextPosition textPosition);
     method public boolean getDidExceedMaxLines();
     method public float getHeight();
     method public float getLineHeight(int lineIndex);
@@ -384,7 +383,6 @@
     ctor public TextPainter(androidx.ui.painting.TextSpan? text, androidx.ui.engine.text.TextAlign textAlign, androidx.ui.engine.text.TextDirection? textDirection, float textScaleFactor, Integer? maxLines, boolean softWrap, androidx.ui.rendering.paragraph.TextOverflow overflow, androidx.ui.engine.window.Locale? locale, androidx.ui.graphics.Color selectionColor);
     ctor public TextPainter();
     method public androidx.ui.engine.text.ParagraphStyle createParagraphStyle(androidx.ui.engine.text.TextDirection? defaultTextDirection = null);
-    method public kotlin.Pair<androidx.ui.engine.geometry.Offset,androidx.ui.engine.geometry.Offset> getCaretForTextPosition(androidx.ui.engine.text.TextPosition position);
     method public boolean getDidExceedMaxLines();
     method public float getHeight();
     method public androidx.ui.engine.window.Locale? getLocale();
diff --git a/ui/text/api/current.txt b/ui/text/api/current.txt
index b039567..e403687 100644
--- a/ui/text/api/current.txt
+++ b/ui/text/api/current.txt
@@ -65,7 +65,6 @@
 
   public final class Paragraph {
     method public float getBaseline();
-    method public kotlin.Pair<androidx.ui.engine.geometry.Offset,androidx.ui.engine.geometry.Offset> getCaretForTextPosition(androidx.ui.engine.text.TextPosition textPosition);
     method public boolean getDidExceedMaxLines();
     method public float getHeight();
     method public float getLineHeight(int lineIndex);
@@ -384,7 +383,6 @@
     ctor public TextPainter(androidx.ui.painting.TextSpan? text, androidx.ui.engine.text.TextAlign textAlign, androidx.ui.engine.text.TextDirection? textDirection, float textScaleFactor, Integer? maxLines, boolean softWrap, androidx.ui.rendering.paragraph.TextOverflow overflow, androidx.ui.engine.window.Locale? locale, androidx.ui.graphics.Color selectionColor);
     ctor public TextPainter();
     method public androidx.ui.engine.text.ParagraphStyle createParagraphStyle(androidx.ui.engine.text.TextDirection? defaultTextDirection = null);
-    method public kotlin.Pair<androidx.ui.engine.geometry.Offset,androidx.ui.engine.geometry.Offset> getCaretForTextPosition(androidx.ui.engine.text.TextPosition position);
     method public boolean getDidExceedMaxLines();
     method public float getHeight();
     method public androidx.ui.engine.window.Locale? getLocale();
diff --git a/ui/text/api/restricted_1.0.0-alpha01.txt b/ui/text/api/restricted_1.0.0-alpha01.txt
index da4f6cc..1023f5c8 100644
--- a/ui/text/api/restricted_1.0.0-alpha01.txt
+++ b/ui/text/api/restricted_1.0.0-alpha01.txt
@@ -1 +1,8 @@
 // Signature format: 3.0
+package androidx.ui.painting {
+
+  public final class TextPainter {
+  }
+
+}
+
diff --git a/ui/text/api/restricted_current.txt b/ui/text/api/restricted_current.txt
index da4f6cc..1023f5c8 100644
--- a/ui/text/api/restricted_current.txt
+++ b/ui/text/api/restricted_current.txt
@@ -1 +1,8 @@
 // Signature format: 3.0
+package androidx.ui.painting {
+
+  public final class TextPainter {
+  }
+
+}
+
diff --git a/ui/text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneText.kt b/ui/text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneText.kt
index dc00b90..99f8585 100644
--- a/ui/text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneText.kt
+++ b/ui/text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneText.kt
@@ -19,11 +19,11 @@
 import androidx.ui.core.CraneWrapper
 import androidx.ui.core.EditableText
 import androidx.ui.core.EditorStyle
-import androidx.ui.core.Selection
-import androidx.ui.core.SelectionContainer
 import androidx.ui.core.Span
 import androidx.ui.core.Text
 import androidx.ui.core.px
+import androidx.ui.core.selection.Selection
+import androidx.ui.core.selection.SelectionContainer
 import androidx.ui.engine.geometry.Offset
 import androidx.ui.engine.text.BaselineShift
 import androidx.ui.engine.text.FontStyle
diff --git a/ui/text/src/androidTest/java/androidx/ui/engine/text/ParagraphIntegrationTest.kt b/ui/text/src/androidTest/java/androidx/ui/engine/text/ParagraphIntegrationTest.kt
index d8a13ca..683a2c2 100644
--- a/ui/text/src/androidTest/java/androidx/ui/engine/text/ParagraphIntegrationTest.kt
+++ b/ui/text/src/androidTest/java/androidx/ui/engine/text/ParagraphIntegrationTest.kt
@@ -292,115 +292,6 @@
     }
 
     @Test
-    fun getCaretForTextPosition_ltr_singleLine() {
-        val text = "abc"
-        val fontSize = 50.0f
-        val paragraph = simpleParagraph(text = text, fontSize = fontSize)
-
-        paragraph.layout(ParagraphConstraints(width = text.length * fontSize))
-        // test positions that are 0, 1, 2 ... which maps to chars 0, 1, 2 ...
-        for (i in 0..text.length) {
-            val textPosition = TextPosition(i, TextAffinity.upstream)
-            val caret = paragraph.getCaretForTextPosition(textPosition)
-            assertThat(caret.first.dx, equalTo(i * fontSize))
-            assertThat(caret.first.dy, equalTo(0f))
-            assertThat(caret.second.dx, equalTo(i * fontSize))
-            assertThat(caret.second.dy, equalTo(fontSize))
-        }
-    }
-
-    @Test
-    fun getCaretForTextPosition_rtl_singleLine() {
-        val text = "\u05D0\u05D1\u05D2"
-        val fontSize = 50.0f
-        val paragraph = simpleParagraph(text = text, fontSize = fontSize)
-
-        paragraph.layout(ParagraphConstraints(width = text.length * fontSize))
-
-        // test positions that are 0, 1, 2 which maps to chars .., 2, 1, 0
-        for (i in 0..text.length) {
-            val textPosition = TextPosition(i, TextAffinity.upstream)
-            val caret = paragraph.getCaretForTextPosition(textPosition)
-            assertThat(caret.first.dx, equalTo((text.length - i) * fontSize))
-            assertThat(caret.first.dy, equalTo(0f))
-            assertThat(caret.second.dx, equalTo((text.length - i) * fontSize))
-            assertThat(caret.second.dy, equalTo(fontSize))
-        }
-    }
-
-    @Test
-    fun getCaretForTextPosition_ltr_multiLines() {
-        val firstLine = "abc"
-        val secondLine = "def"
-        val text = firstLine + secondLine
-        val fontSize = 50.0f
-        val paragraph = simpleParagraph(text = text, fontSize = fontSize)
-
-        paragraph.layout(ParagraphConstraints(width = firstLine.length * fontSize))
-
-        // test positions are 3, 4, 5 and always on the second line
-        // which maps to chars 3, 4, 5
-        for (i in 0..secondLine.length) {
-            val textPosition = TextPosition(i + firstLine.length, TextAffinity.upstream)
-            val caret = paragraph.getCaretForTextPosition(textPosition)
-            assertThat(caret.first.dx, equalTo(i * fontSize))
-            assertThat(caret.first.dy, equalTo(fontSize))
-            assertThat(caret.second.dx, equalTo(i * fontSize))
-            assertThat(caret.second.dy, equalTo((2f + 1 / 5f) * fontSize))
-        }
-    }
-
-    @Test
-    fun getCaretForTextPosition_rtl_multiLines() {
-        val firstLine = "\u05D0\u05D1\u05D2"
-        val secondLine = "\u05D3\u05D4\u05D5"
-        val text = firstLine + secondLine
-        val fontSize = 50.0f
-        val paragraph = simpleParagraph(text = text, fontSize = fontSize)
-
-        paragraph.layout(ParagraphConstraints(width = firstLine.length * fontSize))
-
-        // test positions are 3, 4, 5 and always on the second line
-        // which maps to chars 5, 4, 3
-        for (i in 0..secondLine.length) {
-            val textPosition = TextPosition(i + firstLine.length, TextAffinity.upstream)
-            val caret = paragraph.getCaretForTextPosition(textPosition)
-            assertThat(caret.first.dx, equalTo((secondLine.length - i) * fontSize))
-            assertThat(caret.first.dy, equalTo(fontSize))
-            assertThat(caret.second.dx, equalTo((secondLine.length - i) * fontSize))
-            assertThat(caret.second.dy, equalTo((2f + 1 / 5f) * fontSize))
-        }
-    }
-
-    @Test
-    fun getCaretForTextPosition_ltr_textPosition_negative_return_zero() {
-        val text = "abc"
-        val fontSize = 50.0f
-        val paragraph = simpleParagraph(text = text, fontSize = fontSize)
-
-        paragraph.layout(ParagraphConstraints(width = text.length * fontSize))
-
-        val textPosition = TextPosition(-1, TextAffinity.upstream)
-        val caret = paragraph.getCaretForTextPosition(textPosition)
-        assertThat(caret.first.dx, equalTo(0f))
-        assertThat(caret.first.dy, equalTo(0f))
-        assertThat(caret.second.dx, equalTo(0f))
-        assertThat(caret.second.dy, equalTo(fontSize))
-    }
-
-    @Test(expected = java.lang.IndexOutOfBoundsException::class)
-    fun getCaretForTextPosition_ltr_textPosition_larger_than_length_throw_exception() {
-        val text = "abc"
-        val fontSize = 50.0f
-        val paragraph = simpleParagraph(text = text, fontSize = fontSize)
-
-        paragraph.layout(ParagraphConstraints(width = text.length * fontSize))
-
-        val textPosition = TextPosition(text.length + 1, TextAffinity.upstream)
-        paragraph.getCaretForTextPosition(textPosition)
-    }
-
-    @Test
     fun getBoundingBoxForTextPosition_ltr_singleLine() {
         val text = "abc"
         val fontSize = 50.0f
diff --git a/ui/text/src/main/java/androidx/ui/engine/text/Paragraph.kt b/ui/text/src/main/java/androidx/ui/engine/text/Paragraph.kt
index 446dd9f..13fde31 100644
--- a/ui/text/src/main/java/androidx/ui/engine/text/Paragraph.kt
+++ b/ui/text/src/main/java/androidx/ui/engine/text/Paragraph.kt
@@ -160,15 +160,6 @@
     }
 
     /**
-     * Returns the coordinates of top and bottom end of the Caret for given TextPosition. The Caret
-     * is on the left side of the character at the given TextPosition for LTR text, and on the right
-     * side of the character at the given TextPosition for RTL text.
-     */
-    fun getCaretForTextPosition(textPosition: TextPosition): Pair<Offset, Offset> {
-        return paragraphImpl.getCaretForTextPosition(textPosition)
-    }
-
-    /**
      * Returns the bounding box as Rect of the character for given TextPosition. Rect includes the
      * top, bottom, left and right of a character.
      */
diff --git a/ui/text/src/main/java/androidx/ui/engine/text/platform/ParagraphAndroid.kt b/ui/text/src/main/java/androidx/ui/engine/text/platform/ParagraphAndroid.kt
index d813263..125588b 100644
--- a/ui/text/src/main/java/androidx/ui/engine/text/platform/ParagraphAndroid.kt
+++ b/ui/text/src/main/java/androidx/ui/engine/text/platform/ParagraphAndroid.kt
@@ -214,16 +214,6 @@
         )
     }
 
-    fun getCaretForTextPosition(textPosition: TextPosition): Pair<Offset, Offset> {
-        val horizontal = ensureLayout.getPrimaryHorizontal(textPosition.offset)
-
-        val line = ensureLayout.getLineForOffset(textPosition.offset)
-        val top = ensureLayout.getLineTop(line)
-        val bottom = ensureLayout.getLineBottom(line)
-
-        return Pair(Offset(horizontal, top), Offset(horizontal, bottom))
-    }
-
     /**
      * Returns the bounding box as Rect of the character for given TextPosition. Rect includes the
      * top, bottom, left and right of a character.
diff --git a/ui/text/src/main/java/androidx/ui/painting/TextPainter.kt b/ui/text/src/main/java/androidx/ui/painting/TextPainter.kt
index b7036f5..ad35fd6 100644
--- a/ui/text/src/main/java/androidx/ui/painting/TextPainter.kt
+++ b/ui/text/src/main/java/androidx/ui/painting/TextPainter.kt
@@ -16,6 +16,7 @@
 
 package androidx.ui.painting
 
+import androidx.annotation.RestrictTo
 import androidx.annotation.VisibleForTesting
 import androidx.ui.core.Constraints
 import androidx.ui.core.IntPxSize
@@ -503,22 +504,15 @@
     }
 
     /**
-     * Returns the Caret as a vertical bar for given text position, at which to paint the caret.
-     *
-     * Valid only after [layout] has been called.
-     */
-    fun getCaretForTextPosition(position: TextPosition): Pair<Offset, Offset> {
-        assert(!needsLayout)
-        return paragraph!!.getCaretForTextPosition(position)
-    }
-
-    /**
      * Returns the bounding box as Rect of the character for given TextPosition. Rect includes the
      * top, bottom, left and right of a character.
      *
      * Valid only after [layout] has been called.
+     *
+     * @hide
      */
-    internal fun getBoundingBoxForTextPosition(textPosition: TextPosition): Rect {
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    fun getBoundingBoxForTextPosition(textPosition: TextPosition): Rect {
         assert(!needsLayout)
         return paragraph!!.getBoundingBoxForTextPosition(textPosition)
     }