diff --git a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
index a40d6d9..62e8c5b 100644
--- a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
@@ -24,7 +24,7 @@
 import androidx.build.Strategy.Ignore
 
 val RELEASE_RULE = docsRules("public") {
-    val defaultVersion = "1.0.0-alpha1"
+    val defaultVersion = "1.0.0-alpha3"
     prebuilts(LibraryGroups.ANNOTATION, defaultVersion)
     prebuilts(LibraryGroups.APPCOMPAT, defaultVersion)
     prebuilts(LibraryGroups.ASYNCLAYOUTINFLATER, defaultVersion)
@@ -33,9 +33,7 @@
             .addStubs("car/car-stubs/android.car.jar")
     prebuilts(LibraryGroups.CARDVIEW, defaultVersion)
     prebuilts(LibraryGroups.COLLECTION, defaultVersion)
-    // misses prebuilts, because it was released under different name in alpha1
-    tipOfTree(LibraryGroups.CONTENTPAGER)
-
+    prebuilts(LibraryGroups.CONTENTPAGER, defaultVersion)
     prebuilts(LibraryGroups.COORDINATORLAYOUT, defaultVersion)
     prebuilts(LibraryGroups.CORE, defaultVersion)
     prebuilts(LibraryGroups.CURSORADAPTER, defaultVersion)
@@ -57,7 +55,6 @@
     prebuilts(LibraryGroups.MEDIAROUTER, defaultVersion)
     prebuilts(LibraryGroups.PALETTE, defaultVersion)
     prebuilts(LibraryGroups.PERCENTLAYOUT, defaultVersion)
-    ignore(LibraryGroups.PREFERENCE, "preference-ktx")
     prebuilts(LibraryGroups.PREFERENCE, defaultVersion)
     prebuilts(LibraryGroups.PRINT, defaultVersion)
     prebuilts(LibraryGroups.RECOMMENDATION, defaultVersion)
@@ -76,17 +73,11 @@
     val flatfootVersion = "2.0.0-alpha1"
     prebuilts(LibraryGroups.ROOM, flatfootVersion)
     prebuilts(LibraryGroups.PERSISTENCE, flatfootVersion)
-    // lifecycle-viewmodel-ktx / lifecycle-process / lifecycle-service miss their prebuilts
-    tipOfTree(LibraryGroups.LIFECYCLE, "lifecycle-viewmodel-ktx")
-    tipOfTree(LibraryGroups.LIFECYCLE, "lifecycle-process")
-    tipOfTree(LibraryGroups.LIFECYCLE, "lifecycle-service")
     prebuilts(LibraryGroups.LIFECYCLE, flatfootVersion)
     prebuilts(LibraryGroups.ARCH_CORE, flatfootVersion)
-    prebuilts(LibraryGroups.PAGING, "paging-rxjava2", "1.0.0-alpha1")
-    prebuilts(LibraryGroups.PAGING, "2.0.0-alpha1")
-    // navigation & workmanager don't have prebuilts currently
-    tipOfTree(LibraryGroups.NAVIGATION)
-    tipOfTree(LibraryGroups.WORKMANAGER)
+    prebuilts(LibraryGroups.PAGING, flatfootVersion)
+    prebuilts(LibraryGroups.NAVIGATION, "1.0.0-alpha01")
+    prebuilts(LibraryGroups.WORKMANAGER, "1.0.0-alpha02")
     default(Ignore)
 }
 
diff --git a/work/workmanager-firebase/src/main/java/androidx/work/impl/background/firebase/FirebaseDelayedJobAlarmReceiver.java b/work/workmanager-firebase/src/main/java/androidx/work/impl/background/firebase/FirebaseDelayedJobAlarmReceiver.java
index f17fde4..5e549d2 100644
--- a/work/workmanager-firebase/src/main/java/androidx/work/impl/background/firebase/FirebaseDelayedJobAlarmReceiver.java
+++ b/work/workmanager-firebase/src/main/java/androidx/work/impl/background/firebase/FirebaseDelayedJobAlarmReceiver.java
@@ -21,6 +21,7 @@
 import android.support.annotation.RestrictTo;
 import android.util.Log;
 
+import androidx.work.Configuration;
 import androidx.work.impl.Schedulers;
 import androidx.work.impl.WorkDatabase;
 import androidx.work.impl.WorkManagerImpl;
@@ -41,6 +42,7 @@
         final PendingResult pendingResult = goAsync();
         final String workSpecId = intent.getStringExtra(WORKSPEC_ID_KEY);
         final WorkManagerImpl workManagerImpl = WorkManagerImpl.getInstance();
+        final Configuration configuration = workManagerImpl.getConfiguration();
         final WorkDatabase database = workManagerImpl.getWorkDatabase();
         // TODO (rahulrav@) Use WorkManager's task executor here instead.
         new Thread(new Runnable() {
@@ -48,7 +50,7 @@
             public void run() {
                 WorkSpec workSpec = database.workSpecDao().getWorkSpec(workSpecId);
                 if (workSpec != null) {
-                    Schedulers.schedule(database, workManagerImpl.getSchedulers());
+                    Schedulers.schedule(configuration, database, workManagerImpl.getSchedulers());
                 } else {
                     Log.e(TAG, "WorkSpec not found! Cannot schedule!");
                 }
diff --git a/work/workmanager/src/androidTest/java/androidx/work/WorkDatabaseMigrationTest.java b/work/workmanager/src/androidTest/java/androidx/work/WorkDatabaseMigrationTest.java
index 1c1893f..c131117 100644
--- a/work/workmanager/src/androidTest/java/androidx/work/WorkDatabaseMigrationTest.java
+++ b/work/workmanager/src/androidTest/java/androidx/work/WorkDatabaseMigrationTest.java
@@ -16,12 +16,15 @@
 
 package androidx.work;
 
+import static android.database.sqlite.SQLiteDatabase.CONFLICT_FAIL;
+
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import android.arch.persistence.db.SupportSQLiteDatabase;
 import android.arch.persistence.db.framework.FrameworkSQLiteOpenHelperFactory;
 import android.arch.persistence.room.testing.MigrationTestHelper;
+import android.content.ContentValues;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteException;
 import android.support.test.InstrumentationRegistry;
@@ -30,6 +33,9 @@
 
 import androidx.work.impl.WorkDatabase;
 import androidx.work.impl.WorkDatabaseMigrations;
+import androidx.work.impl.model.WorkSpec;
+import androidx.work.impl.model.WorkTypeConverters;
+import androidx.work.worker.TestWorker;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -53,12 +59,12 @@
 
     // Queries
     private static final String INSERT_ALARM_INFO = "INSERT INTO alarmInfo VALUES (?, ?)";
-    private static final String INSERT_SYSTEM_ID_INFO = "INSERT INTO systemIdInfo VALUES (?, ?)";
-    private static final String CHECK_SYSTEM_ID_INFO = "SELECT * FROM systemIdInfo";
+    private static final String INSERT_SYSTEM_ID_INFO = "INSERT INTO SystemIdInfo VALUES (?, ?)";
+    private static final String CHECK_SYSTEM_ID_INFO = "SELECT * FROM SystemIdInfo";
     private static final String CHECK_ALARM_INFO = "SELECT * FROM alarmInfo";
     private static final String CHECK_TABLE_NAME = "SELECT * FROM %s";
     private static final String TABLE_ALARM_INFO = "alarmInfo";
-    private static final String TABLE_SYSTEM_ID_INFO = "systemIdInfo";
+    private static final String TABLE_SYSTEM_ID_INFO = "SystemIdInfo";
     private static final String TABLE_WORKSPEC = "WorkSpec";
     private static final String TABLE_WORKTAG = "WorkTag";
     private static final String TABLE_WORKNAME = "WorkName";
@@ -86,6 +92,33 @@
         SupportSQLiteDatabase database =
                 mMigrationTestHelper.createDatabase(TEST_DATABASE, OLD_VERSION);
 
+        String workSpecId0 = UUID.randomUUID().toString();
+        ContentValues contentValues = new ContentValues();
+        contentValues.put("id", workSpecId0);
+        contentValues.put("state", WorkTypeConverters.StateIds.ENQUEUED);
+        contentValues.put("worker_class_name", TestWorker.class.getName());
+        contentValues.put("input_merger_class_name", OverwritingInputMerger.class.getName());
+        contentValues.put("input", Data.toByteArray(Data.EMPTY));
+        contentValues.put("output", Data.toByteArray(Data.EMPTY));
+        contentValues.put("initial_delay", 0L);
+        contentValues.put("interval_duration", 0L);
+        contentValues.put("flex_duration", 0L);
+        contentValues.put("required_network_type", false);
+        contentValues.put("requires_charging", false);
+        contentValues.put("requires_device_idle", false);
+        contentValues.put("requires_battery_not_low", false);
+        contentValues.put("requires_storage_not_low", false);
+        contentValues.put("content_uri_triggers",
+                WorkTypeConverters.contentUriTriggersToByteArray(new ContentUriTriggers()));
+        contentValues.put("run_attempt_count", 0);
+        contentValues.put("backoff_policy",
+                WorkTypeConverters.backoffPolicyToInt(BackoffPolicy.EXPONENTIAL));
+        contentValues.put("backoff_delay_duration", WorkRequest.DEFAULT_BACKOFF_DELAY_MILLIS);
+        contentValues.put("period_start_time", 0L);
+        contentValues.put("minimum_retention_duration", 0L);
+        contentValues.put("schedule_requested_at", WorkSpec.SCHEDULE_NOT_REQUESTED_YET);
+        database.insert("workspec", CONFLICT_FAIL, contentValues);
+
         String workSpecId1 = UUID.randomUUID().toString();
         String workSpecId2 = UUID.randomUUID().toString();
 
@@ -101,6 +134,14 @@
                 VALIDATE_DROPPED_TABLES,
                 WorkDatabaseMigrations.MIGRATION_1_2);
 
+        Cursor tagCursor = database.query("SELECT * FROM worktag");
+        assertThat(tagCursor.getCount(), is(1));
+        tagCursor.moveToFirst();
+        assertThat(tagCursor.getString(tagCursor.getColumnIndex("tag")),
+                is(TestWorker.class.getName()));
+        assertThat(tagCursor.getString(tagCursor.getColumnIndex("work_spec_id")), is(workSpecId0));
+        tagCursor.close();
+
         Cursor cursor = database.query(CHECK_SYSTEM_ID_INFO);
         assertThat(cursor.getCount(), is(2));
         cursor.moveToFirst();
@@ -127,7 +168,7 @@
         String workSpecId1 = UUID.randomUUID().toString();
         String workSpecId2 = UUID.randomUUID().toString();
 
-        // insert systemIdInfo
+        // insert SystemIdInfo
         database.execSQL(INSERT_SYSTEM_ID_INFO, new Object[]{workSpecId1, 1});
         database.execSQL(INSERT_SYSTEM_ID_INFO, new Object[]{workSpecId2, 2});
 
diff --git a/work/workmanager/src/androidTest/java/androidx/work/WorkSpecDaoTest.java b/work/workmanager/src/androidTest/java/androidx/work/WorkSpecDaoTest.java
index da5a8e0..6dd23cb 100644
--- a/work/workmanager/src/androidTest/java/androidx/work/WorkSpecDaoTest.java
+++ b/work/workmanager/src/androidTest/java/androidx/work/WorkSpecDaoTest.java
@@ -19,6 +19,7 @@
 import static androidx.work.State.BLOCKED;
 import static androidx.work.State.FAILED;
 import static androidx.work.State.SUCCEEDED;
+import static androidx.work.impl.Scheduler.MAX_SCHEDULER_LIMIT;
 
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.is;
@@ -70,7 +71,9 @@
         WorkSpecDao workSpecDao = mDatabase.workSpecDao();
         // Treat the scheduled request as previously scheduled
         workSpecDao.markWorkSpecScheduled(scheduled.getStringId(), System.currentTimeMillis());
-        List<WorkSpec> eligibleWorkSpecs = workSpecDao.getEligibleWorkForScheduling();
+        List<WorkSpec> eligibleWorkSpecs =
+                workSpecDao.getEligibleWorkForScheduling(MAX_SCHEDULER_LIMIT);
+
         assertThat(eligibleWorkSpecs.size(), equalTo(2));
         assertThat(eligibleWorkSpecs,
                 containsInAnyOrder(work.getWorkSpec(), enqueued.getWorkSpec()));
@@ -100,7 +103,8 @@
         insertWork(succeeded);
         insertWork(failed);
 
-        List<WorkSpec> eligibleWorkSpecs = workSpecDao.getEligibleWorkForScheduling();
+        List<WorkSpec> eligibleWorkSpecs =
+                workSpecDao.getEligibleWorkForScheduling(MAX_SCHEDULER_LIMIT);
         assertThat(eligibleWorkSpecs, notNullValue());
         assertThat(eligibleWorkSpecs.size(), is(1));
         assertThat(eligibleWorkSpecs, containsInAnyOrder(enqueued.getWorkSpec()));
@@ -131,7 +135,8 @@
         insertWork(succeeded);
         insertWork(failed);
 
-        List<WorkSpec> eligibleWorkSpecs = workSpecDao.getEligibleWorkForScheduling();
+        List<WorkSpec> eligibleWorkSpecs =
+                workSpecDao.getEligibleWorkForScheduling(MAX_SCHEDULER_LIMIT);
         assertThat(eligibleWorkSpecs, notNullValue());
         assertThat(eligibleWorkSpecs.size(), is(0));
     }
@@ -171,7 +176,8 @@
 
         workSpecDao.resetScheduledState();
 
-        List<WorkSpec> eligibleWorkSpecs = workSpecDao.getEligibleWorkForScheduling();
+        List<WorkSpec> eligibleWorkSpecs =
+                workSpecDao.getEligibleWorkForScheduling(MAX_SCHEDULER_LIMIT);
         assertThat(eligibleWorkSpecs.size(), is(1));
         // Not using contains in any order as the scheduleRequestedAt changes post reset.
         assertThat(eligibleWorkSpecs.get(0).id, is(enqueued.getStringId()));
diff --git a/work/workmanager/src/androidTest/java/androidx/work/impl/ProcessorTest.java b/work/workmanager/src/androidTest/java/androidx/work/impl/ProcessorTest.java
index cfaa1f3..1e178b1 100644
--- a/work/workmanager/src/androidTest/java/androidx/work/impl/ProcessorTest.java
+++ b/work/workmanager/src/androidTest/java/androidx/work/impl/ProcessorTest.java
@@ -25,6 +25,7 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
+import androidx.work.Configuration;
 import androidx.work.DatabaseTest;
 import androidx.work.OneTimeWorkRequest;
 import androidx.work.worker.InfiniteTestWorker;
@@ -43,8 +44,10 @@
     @Before
     public void setUp() {
         Context appContext = InstrumentationRegistry.getTargetContext().getApplicationContext();
+        Configuration configuration = new Configuration.Builder().build();
         mProcessor = new Processor(
                 appContext,
+                configuration,
                 mDatabase,
                 Collections.singletonList(mock(Scheduler.class)),
                 Executors.newSingleThreadScheduledExecutor()) {
diff --git a/work/workmanager/src/androidTest/java/androidx/work/impl/WorkContinuationImplTest.java b/work/workmanager/src/androidTest/java/androidx/work/impl/WorkContinuationImplTest.java
index 7783208..f4a3a7b 100644
--- a/work/workmanager/src/androidTest/java/androidx/work/impl/WorkContinuationImplTest.java
+++ b/work/workmanager/src/androidTest/java/androidx/work/impl/WorkContinuationImplTest.java
@@ -72,6 +72,7 @@
 @SmallTest
 public class WorkContinuationImplTest extends WorkManagerTest {
 
+    private Configuration mConfiguration;
     private WorkDatabase mDatabase;
     private WorkManagerImpl mWorkManagerImpl;
     private Scheduler mScheduler;
@@ -103,11 +104,11 @@
 
         mScheduler = mock(Scheduler.class);
         Context context = InstrumentationRegistry.getTargetContext();
-        Configuration configuration = new Configuration.Builder()
+        mConfiguration = new Configuration.Builder()
                 .setExecutor(Executors.newSingleThreadExecutor())
                 .build();
 
-        mWorkManagerImpl = spy(new WorkManagerImpl(context, configuration));
+        mWorkManagerImpl = spy(new WorkManagerImpl(context, mConfiguration));
         when(mWorkManagerImpl.getSchedulers()).thenReturn(Collections.singletonList(mScheduler));
         WorkManagerImpl.setDelegate(mWorkManagerImpl);
         mDatabase = mWorkManagerImpl.getWorkDatabase();
@@ -306,7 +307,8 @@
 
         // TODO(sumir): I can't seem to get this kicked off automatically, so I'm running it myself.
         // Figure out what's going on here.
-        new WorkerWrapper.Builder(InstrumentationRegistry.getTargetContext(), mDatabase, joinId)
+        Context context = InstrumentationRegistry.getTargetContext();
+        new WorkerWrapper.Builder(context, mConfiguration, mDatabase, joinId)
                 .build()
                 .run();
 
@@ -514,6 +516,7 @@
     }
 
     private static void verifyScheduled(Scheduler scheduler, WorkContinuationImpl continuation) {
+        Configuration configuration = continuation.getWorkManagerImpl().getConfiguration();
         ArgumentCaptor<WorkSpec> captor = ArgumentCaptor.forClass(WorkSpec.class);
         verify(scheduler, times(1)).schedule(captor.capture());
         List<WorkSpec> workSpecs = captor.getAllValues();
@@ -521,7 +524,10 @@
 
         WorkDatabase workDatabase = continuation.getWorkManagerImpl().getWorkDatabase();
         List<WorkSpec> eligibleWorkSpecs =
-                workDatabase.workSpecDao().getEligibleWorkForScheduling();
+                workDatabase
+                        .workSpecDao()
+                        .getEligibleWorkForScheduling(
+                                configuration.getMaxSchedulerLimit());
 
         Set<String> capturedIds = new HashSet<>();
         for (WorkSpec workSpec : workSpecs) {
diff --git a/work/workmanager/src/androidTest/java/androidx/work/impl/WorkManagerImplLargeExecutorTest.java b/work/workmanager/src/androidTest/java/androidx/work/impl/WorkManagerImplLargeExecutorTest.java
index 51e98e5..72ebe94 100644
--- a/work/workmanager/src/androidTest/java/androidx/work/impl/WorkManagerImplLargeExecutorTest.java
+++ b/work/workmanager/src/androidTest/java/androidx/work/impl/WorkManagerImplLargeExecutorTest.java
@@ -16,25 +16,33 @@
 
 package androidx.work.impl;
 
+import static androidx.work.worker.CheckLimitsWorker.KEY_EXCEEDS_SCHEDULER_LIMIT;
+import static androidx.work.worker.CheckLimitsWorker.KEY_LIMIT_TO_ENFORCE;
+
+import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.lessThanOrEqualTo;
 
 import static java.util.concurrent.TimeUnit.SECONDS;
 
 import android.arch.core.executor.ArchTaskExecutor;
 import android.arch.core.executor.TaskExecutor;
+import android.arch.lifecycle.Observer;
 import android.content.Context;
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.LargeTest;
 import android.support.test.filters.SdkSuppress;
 import android.support.test.runner.AndroidJUnit4;
 
 import androidx.work.Configuration;
+import androidx.work.Data;
 import androidx.work.OneTimeWorkRequest;
-import androidx.work.impl.model.WorkSpec;
+import androidx.work.TestLifecycleOwner;
+import androidx.work.WorkContinuation;
+import androidx.work.WorkStatus;
 import androidx.work.impl.utils.taskexecutor.InstantTaskExecutorRule;
-import androidx.work.worker.TestWorker;
+import androidx.work.worker.CheckLimitsWorker;
 
 import org.junit.After;
 import org.junit.Before;
@@ -42,16 +50,23 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
+import java.util.UUID;
 import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 
 @RunWith(AndroidJUnit4.class)
 public class WorkManagerImplLargeExecutorTest {
 
     private static final int NUM_WORKERS = 500;
+    private static final int TEST_TIMEOUT_SECONDS = 30;
 
     // ThreadPoolExecutor parameters.
     private static final int MIN_POOL_SIZE = 0;
@@ -61,6 +76,7 @@
     private static final long KEEP_ALIVE_TIME = 2L;
 
     private WorkManagerImpl mWorkManagerImpl;
+    private TestLifecycleOwner mLifecycleOwner;
 
     @Rule
     public InstantTaskExecutorRule mRule = new InstantTaskExecutorRule();
@@ -90,8 +106,10 @@
                 MIN_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, SECONDS, queue);
         Configuration configuration = new Configuration.Builder()
                 .setExecutor(executor)
+                .setMaxSchedulerLimit(50)
                 .build();
-        mWorkManagerImpl = new WorkManagerImpl(context, configuration);
+        mWorkManagerImpl = new WorkManagerImpl(context, configuration, true);
+        mLifecycleOwner = new TestLifecycleOwner();
         WorkManagerImpl.setDelegate(mWorkManagerImpl);
     }
 
@@ -104,15 +122,57 @@
     @Test
     @LargeTest
     @SdkSuppress(maxSdkVersion = 22)
-    public void testSchedulerLimits() {
-        for (int i = 0; i < NUM_WORKERS; i++) {
-            mWorkManagerImpl.enqueue(OneTimeWorkRequest.from(TestWorker.class));
-            List<WorkSpec> eligibleWorkSpecs = mWorkManagerImpl.getWorkDatabase()
-                    .workSpecDao()
-                    .getEligibleWorkForScheduling();
+    public void testSchedulerLimits() throws InterruptedException {
+        List<OneTimeWorkRequest> workRequests = new ArrayList<>(NUM_WORKERS);
+        final Set<UUID> completed = new HashSet<>(NUM_WORKERS);
+        final int schedulerLimit = mWorkManagerImpl
+                .getConfiguration()
+                .getMaxSchedulerLimit();
 
-            int size = eligibleWorkSpecs != null ? eligibleWorkSpecs.size() : 0;
-            assertThat(size, lessThanOrEqualTo(Scheduler.MAX_SCHEDULER_LIMIT));
+        final Data input = new Data.Builder()
+                .putInt(KEY_LIMIT_TO_ENFORCE, schedulerLimit)
+                .build();
+
+        for (int i = 0; i < NUM_WORKERS; i++) {
+            OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(CheckLimitsWorker.class)
+                    .setInputData(input)
+                    .build();
+
+            workRequests.add(request);
         }
+
+
+        final CountDownLatch latch = new CountDownLatch(NUM_WORKERS);
+        WorkContinuation continuation = mWorkManagerImpl.beginWith(workRequests);
+
+        continuation.getStatuses()
+                .observe(mLifecycleOwner, new Observer<List<WorkStatus>>() {
+                    @Override
+                    public void onChanged(@Nullable List<WorkStatus> workStatuses) {
+                        if (workStatuses == null || workStatuses.isEmpty()) {
+                            return;
+                        }
+
+                        for (WorkStatus workStatus: workStatuses) {
+                            if (workStatus.getState().isFinished()) {
+
+                                Data output = workStatus.getOutputData();
+
+                                boolean exceededLimits = output.getBoolean(
+                                        KEY_EXCEEDS_SCHEDULER_LIMIT, true);
+
+                                assertThat(exceededLimits, is(false));
+                                if (!completed.contains(workStatus.getId())) {
+                                    completed.add(workStatus.getId());
+                                    latch.countDown();
+                                }
+                            }
+                        }
+                    }
+                });
+
+        continuation.enqueue();
+        latch.await(TEST_TIMEOUT_SECONDS, TimeUnit.SECONDS);
+        assertThat(latch.getCount(), is(0L));
     }
 }
diff --git a/work/workmanager/src/androidTest/java/androidx/work/impl/WorkManagerImplTest.java b/work/workmanager/src/androidTest/java/androidx/work/impl/WorkManagerImplTest.java
index 7168600..3e01164 100644
--- a/work/workmanager/src/androidTest/java/androidx/work/impl/WorkManagerImplTest.java
+++ b/work/workmanager/src/androidTest/java/androidx/work/impl/WorkManagerImplTest.java
@@ -171,6 +171,18 @@
 
     @Test
     @SmallTest
+    public void testEnqueue_AddsImplicitTags() {
+        OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build();
+        mWorkManagerImpl.synchronous().enqueueSync(work);
+
+        WorkTagDao workTagDao = mDatabase.workTagDao();
+        List<String> tags = workTagDao.getTagsForWorkSpecId(work.getStringId());
+        assertThat(tags, is(notNullValue()));
+        assertThat(tags, contains(TestWorker.class.getName()));
+    }
+
+    @Test
+    @SmallTest
     public void testEnqueue_insertMultipleWork() {
         OneTimeWorkRequest work1 = new OneTimeWorkRequest.Builder(TestWorker.class).build();
         OneTimeWorkRequest work2 = new OneTimeWorkRequest.Builder(TestWorker.class).build();
@@ -841,12 +853,12 @@
                 work0.getId(),
                 ENQUEUED,
                 Data.EMPTY,
-                Collections.<String>emptyList());
+                Collections.singletonList(TestWorker.class.getName()));
         WorkStatus workStatus1 = new WorkStatus(
                 work1.getId(),
                 ENQUEUED,
                 Data.EMPTY,
-                Collections.<String>emptyList());
+                Collections.singletonList(TestWorker.class.getName()));
         assertThat(captor.getValue(), containsInAnyOrder(workStatus0, workStatus1));
 
         WorkSpecDao workSpecDao = mDatabase.workSpecDao();
@@ -860,7 +872,7 @@
                 work0.getId(),
                 RUNNING,
                 Data.EMPTY,
-                Collections.<String>emptyList());
+                Collections.singletonList(TestWorker.class.getName()));
         assertThat(captor.getValue(), containsInAnyOrder(workStatus0, workStatus1));
 
         clearInvocations(mockObserver);
@@ -874,7 +886,7 @@
                 work1.getId(),
                 RUNNING,
                 Data.EMPTY,
-                Collections.<String>emptyList());
+                Collections.singletonList(TestWorker.class.getName()));
         assertThat(captor.getValue(), containsInAnyOrder(workStatus0, workStatus1));
 
         liveData.removeObservers(testLifecycleOwner);
@@ -907,17 +919,17 @@
                 work0.getId(),
                 RUNNING,
                 Data.EMPTY,
-                Arrays.asList(firstTag, secondTag));
+                Arrays.asList(TestWorker.class.getName(), firstTag, secondTag));
         WorkStatus workStatus1 = new WorkStatus(
                 work1.getId(),
                 BLOCKED,
                 Data.EMPTY,
-                Collections.singletonList(firstTag));
+                Arrays.asList(TestWorker.class.getName(), firstTag));
         WorkStatus workStatus2 = new WorkStatus(
                 work2.getId(),
                 SUCCEEDED,
                 Data.EMPTY,
-                Collections.singletonList(secondTag));
+                Arrays.asList(TestWorker.class.getName(), secondTag));
 
         List<WorkStatus> workStatuses = mWorkManagerImpl.getStatusesByTagSync(firstTag);
         assertThat(workStatuses, containsInAnyOrder(workStatus0, workStatus1));
@@ -969,12 +981,12 @@
                 work0.getId(),
                 RUNNING,
                 Data.EMPTY,
-                Arrays.asList(firstTag, secondTag));
+                Arrays.asList(TestWorker.class.getName(), firstTag, secondTag));
         WorkStatus workStatus1 = new WorkStatus(
                 work1.getId(),
                 BLOCKED,
                 Data.EMPTY,
-                Collections.singletonList(firstTag));
+                Arrays.asList(TestWorker.class.getName(), firstTag));
         assertThat(captor.getValue(), containsInAnyOrder(workStatus0, workStatus1));
 
         workSpecDao.setState(ENQUEUED, work0.getStringId());
@@ -987,7 +999,7 @@
                 work0.getId(),
                 ENQUEUED,
                 Data.EMPTY,
-                Arrays.asList(firstTag, secondTag));
+                Arrays.asList(TestWorker.class.getName(), firstTag, secondTag));
         assertThat(captor.getValue(), containsInAnyOrder(workStatus0, workStatus1));
 
         liveData.removeObservers(testLifecycleOwner);
@@ -1015,17 +1027,17 @@
                 work0.getId(),
                 RUNNING,
                 Data.EMPTY,
-                Collections.<String>emptyList());
+                Collections.singletonList(InfiniteTestWorker.class.getName()));
         WorkStatus workStatus1 = new WorkStatus(
                 work1.getId(),
                 BLOCKED,
                 Data.EMPTY,
-                Collections.<String>emptyList());
+                Collections.singletonList(InfiniteTestWorker.class.getName()));
         WorkStatus workStatus2 = new WorkStatus(
                 work2.getId(),
                 BLOCKED,
                 Data.EMPTY,
-                Collections.<String>emptyList());
+                Collections.singletonList(InfiniteTestWorker.class.getName()));
 
         List<WorkStatus> workStatuses = mWorkManagerImpl.getStatusesForUniqueWorkSync(uniqueName);
         assertThat(workStatuses, containsInAnyOrder(workStatus0, workStatus1, workStatus2));
@@ -1069,17 +1081,17 @@
                 work0.getId(),
                 RUNNING,
                 Data.EMPTY,
-                Collections.<String>emptyList());
+                Collections.singletonList(InfiniteTestWorker.class.getName()));
         WorkStatus workStatus1 = new WorkStatus(
                 work1.getId(),
                 BLOCKED,
                 Data.EMPTY,
-                Collections.<String>emptyList());
+                Collections.singletonList(InfiniteTestWorker.class.getName()));
         WorkStatus workStatus2 = new WorkStatus(
                 work2.getId(),
                 BLOCKED,
                 Data.EMPTY,
-                Collections.<String>emptyList());
+                Collections.singletonList(InfiniteTestWorker.class.getName()));
         assertThat(captor.getValue(), containsInAnyOrder(workStatus0, workStatus1, workStatus2));
 
         workSpecDao.setState(ENQUEUED, work0.getStringId());
@@ -1092,7 +1104,7 @@
                 work0.getId(),
                 ENQUEUED,
                 Data.EMPTY,
-                Collections.<String>emptyList());
+                Collections.singletonList(InfiniteTestWorker.class.getName()));
         assertThat(captor.getValue(), containsInAnyOrder(workStatus0, workStatus1, workStatus2));
 
         liveData.removeObservers(testLifecycleOwner);
@@ -1333,6 +1345,38 @@
 
     @Test
     @SmallTest
+    public void pruneFinishedWork() {
+        OneTimeWorkRequest enqueuedWork = new OneTimeWorkRequest.Builder(TestWorker.class).build();
+        OneTimeWorkRequest finishedWork =
+                new OneTimeWorkRequest.Builder(TestWorker.class).setInitialState(SUCCEEDED).build();
+        OneTimeWorkRequest finishedWorkWithUnfinishedDependent =
+                new OneTimeWorkRequest.Builder(TestWorker.class).setInitialState(SUCCEEDED).build();
+        OneTimeWorkRequest finishedWorkWithLongKeepForAtLeast =
+                new OneTimeWorkRequest.Builder(TestWorker.class)
+                        .setInitialState(SUCCEEDED)
+                        .keepResultsForAtLeast(999, TimeUnit.DAYS)
+                        .build();
+
+        insertWorkSpecAndTags(enqueuedWork);
+        insertWorkSpecAndTags(finishedWork);
+        insertWorkSpecAndTags(finishedWorkWithUnfinishedDependent);
+        insertWorkSpecAndTags(finishedWorkWithLongKeepForAtLeast);
+
+        insertDependency(enqueuedWork, finishedWorkWithUnfinishedDependent);
+
+        mWorkManagerImpl.synchronous().pruneWorkSync();
+
+        WorkSpecDao workSpecDao = mDatabase.workSpecDao();
+        assertThat(workSpecDao.getWorkSpec(enqueuedWork.getStringId()), is(notNullValue()));
+        assertThat(workSpecDao.getWorkSpec(finishedWork.getStringId()), is(nullValue()));
+        assertThat(workSpecDao.getWorkSpec(finishedWorkWithUnfinishedDependent.getStringId()),
+                is(notNullValue()));
+        assertThat(workSpecDao.getWorkSpec(finishedWorkWithLongKeepForAtLeast.getStringId()),
+                is(nullValue()));
+    }
+
+    @Test
+    @SmallTest
     public void testSynchronousCancelAndGetStatus() {
         OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build();
         insertWorkSpecAndTags(work);
diff --git a/work/workmanager/src/androidTest/java/androidx/work/impl/WorkerWrapperTest.java b/work/workmanager/src/androidTest/java/androidx/work/impl/WorkerWrapperTest.java
index 4a50d10..739fcf7 100644
--- a/work/workmanager/src/androidTest/java/androidx/work/impl/WorkerWrapperTest.java
+++ b/work/workmanager/src/androidTest/java/androidx/work/impl/WorkerWrapperTest.java
@@ -44,6 +44,7 @@
 import android.support.test.runner.AndroidJUnit4;
 
 import androidx.work.ArrayCreatingInputMerger;
+import androidx.work.Configuration;
 import androidx.work.Data;
 import androidx.work.DatabaseTest;
 import androidx.work.OneTimeWorkRequest;
@@ -78,6 +79,7 @@
 
 @RunWith(AndroidJUnit4.class)
 public class WorkerWrapperTest extends DatabaseTest {
+    private Configuration mConfiguration;
     private WorkSpecDao mWorkSpecDao;
     private DependencyDao mDependencyDao;
     private Context mContext;
@@ -90,6 +92,7 @@
     @Before
     public void setUp() {
         mContext = InstrumentationRegistry.getTargetContext();
+        mConfiguration = new Configuration.Builder().build();
         mWorkSpecDao = spy(mDatabase.workSpecDao());
         mDependencyDao = mDatabase.dependencyDao();
         mMockListener = mock(ExecutionListener.class);
@@ -101,7 +104,7 @@
     public void testSuccess() {
         OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build();
         insertWork(work);
-        new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
                 .withListener(mMockListener)
                 .build()
                 .run();
@@ -114,7 +117,7 @@
     public void testRunAttemptCountIncremented_successfulExecution() {
         OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build();
         insertWork(work);
-        new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
                 .withSchedulers(Collections.singletonList(mMockScheduler))
                 .withListener(mMockListener)
                 .build()
@@ -128,7 +131,7 @@
     public void testRunAttemptCountIncremented_failedExecution() {
         OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(FailureWorker.class).build();
         insertWork(work);
-        new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
                 .withSchedulers(Collections.singletonList(mMockScheduler))
                 .withListener(mMockListener)
                 .build()
@@ -141,7 +144,7 @@
     @SmallTest
     public void testPermanentErrorWithInvalidWorkSpecId() {
         final String invalidWorkSpecId = "INVALID_ID";
-        new WorkerWrapper.Builder(mContext, mDatabase, invalidWorkSpecId)
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, invalidWorkSpecId)
                 .withListener(mMockListener)
                 .build()
                 .run();
@@ -155,7 +158,7 @@
                 .setInitialState(RUNNING)
                 .build();
         insertWork(work);
-        new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
                 .withListener(mMockListener)
                 .build()
                 .run();
@@ -169,7 +172,7 @@
                 .setInitialState(CANCELLED)
                 .build();
         insertWork(work);
-        new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
                 .withListener(mMockListener)
                 .build()
                 .run();
@@ -183,7 +186,7 @@
         OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build();
         getWorkSpec(work).workerClassName = "INVALID_CLASS_NAME";
         insertWork(work);
-        new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
                 .withListener(mMockListener)
                 .build()
                 .run();
@@ -197,7 +200,7 @@
         OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build();
         getWorkSpec(work).inputMergerClassName = "INVALID_CLASS_NAME";
         insertWork(work);
-        new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
                 .withSchedulers(Collections.singletonList(mMockScheduler))
                 .withListener(mMockListener)
                 .build()
@@ -211,7 +214,7 @@
     public void testFailed() {
         OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(FailureWorker.class).build();
         insertWork(work);
-        new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
                 .withListener(mMockListener)
                 .build()
                 .run();
@@ -224,7 +227,8 @@
     public void testRunning() throws InterruptedException {
         OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(SleepTestWorker.class).build();
         insertWork(work);
-        WorkerWrapper wrapper = new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+        WorkerWrapper wrapper = new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase,
+                work.getStringId())
                 .withListener(mMockListener)
                 .build();
         Executors.newSingleThreadExecutor().submit(wrapper);
@@ -241,7 +245,7 @@
                 .setInitialState(RUNNING)
                 .build();
         insertWork(work);
-        new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
                 .withListener(mMockListener)
                 .build()
                 .run();
@@ -271,7 +275,8 @@
         assertThat(mWorkSpecDao.getState(work.getStringId()), is(BLOCKED));
         assertThat(mDependencyDao.hasCompletedAllPrerequisites(work.getStringId()), is(false));
 
-        new WorkerWrapper.Builder(mContext, mDatabase, prerequisiteWork.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase,
+                prerequisiteWork.getStringId())
                 .withListener(mMockListener)
                 .withSchedulers(Collections.singletonList(mMockScheduler))
                 .build()
@@ -306,7 +311,8 @@
             mDatabase.endTransaction();
         }
 
-        new WorkerWrapper.Builder(mContext, mDatabase, prerequisiteWork.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase,
+                prerequisiteWork.getStringId())
                 .withSchedulers(Collections.singletonList(mMockScheduler))
                 .build().run();
 
@@ -349,17 +355,19 @@
         }
 
         // Run the prerequisites.
-        new WorkerWrapper.Builder(mContext, mDatabase, prerequisiteWork1.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase,
+                prerequisiteWork1.getStringId())
                 .withSchedulers(Collections.singletonList(mMockScheduler))
                 .build().run();
 
-        new WorkerWrapper.Builder(mContext, mDatabase, prerequisiteWork2.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase,
+                prerequisiteWork2.getStringId())
                 .withSchedulers(Collections.singletonList(mMockScheduler))
                 .build().run();
 
         // Create and run the dependent work.
         WorkerWrapper workerWrapper =
-                new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+                new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
                         .withSchedulers(Collections.singletonList(mMockScheduler))
                         .build();
         workerWrapper.run();
@@ -392,7 +400,8 @@
 
         long beforeUnblockedTime = System.currentTimeMillis();
 
-        new WorkerWrapper.Builder(mContext, mDatabase, prerequisiteWork.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase,
+                prerequisiteWork.getStringId())
                 .withListener(mMockListener)
                 .withSchedulers(Collections.singletonList(mMockScheduler))
                 .build()
@@ -429,7 +438,8 @@
             mDatabase.endTransaction();
         }
 
-        new WorkerWrapper.Builder(mContext, mDatabase, prerequisiteWork.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase,
+                prerequisiteWork.getStringId())
                 .build()
                 .run();
 
@@ -452,7 +462,7 @@
 
         insertWork(periodicWork);
 
-        new WorkerWrapper.Builder(mContext, mDatabase, periodicWork.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, periodicWork.getStringId())
                 .withListener(mMockListener)
                 .build()
                 .run();
@@ -475,7 +485,7 @@
 
         insertWork(periodicWork);
 
-        new WorkerWrapper.Builder(mContext, mDatabase, periodicWork.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, periodicWork.getStringId())
                 .withListener(mMockListener)
                 .build()
                 .run();
@@ -495,7 +505,7 @@
 
         final String periodicWorkId = periodicWork.getStringId();
         insertWork(periodicWork);
-        new WorkerWrapper.Builder(mContext, mDatabase, periodicWorkId)
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, periodicWorkId)
                 .withListener(mMockListener)
                 .build()
                 .run();
@@ -517,7 +527,7 @@
 
         final String periodicWorkId = periodicWork.getStringId();
         insertWork(periodicWork);
-        new WorkerWrapper.Builder(mContext, mDatabase, periodicWorkId)
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, periodicWorkId)
                 .withListener(mMockListener)
                 .build()
                 .run();
@@ -539,7 +549,7 @@
 
         final String periodicWorkId = periodicWork.getStringId();
         insertWork(periodicWork);
-        new WorkerWrapper.Builder(mContext, mDatabase, periodicWorkId)
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, periodicWorkId)
                 .withListener(mMockListener)
                 .build()
                 .run();
@@ -557,7 +567,7 @@
         insertWork(work);
         Scheduler mockScheduler = mock(Scheduler.class);
 
-        new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
                 .withSchedulers(Collections.singletonList(mockScheduler))
                 .build()
                 .run();
@@ -629,8 +639,8 @@
         OneTimeWorkRequest work =
                 new OneTimeWorkRequest.Builder(TestWorker.class).build();
         Extras.RuntimeExtras runtimeExtras = new Extras.RuntimeExtras();
-        runtimeExtras.triggeredContentAuthorities = new String[] { "tca1", "tca2", "tca3" };
-        runtimeExtras.triggeredContentUris = new Uri[] { Uri.parse("tcu1"), Uri.parse("tcu2") };
+        runtimeExtras.triggeredContentAuthorities = new String[]{"tca1", "tca2", "tca3"};
+        runtimeExtras.triggeredContentUris = new Uri[]{Uri.parse("tcu1"), Uri.parse("tcu2")};
 
         Worker worker = WorkerWrapper.workerFromWorkSpec(
                 mContext,
@@ -653,7 +663,7 @@
         OneTimeWorkRequest unscheduled = new OneTimeWorkRequest.Builder(TestWorker.class).build();
         insertWork(unscheduled);
 
-        new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
                 .withSchedulers(Collections.singletonList(mMockScheduler))
                 .withListener(mMockListener)
                 .build()
@@ -673,7 +683,7 @@
         OneTimeWorkRequest unscheduled = new OneTimeWorkRequest.Builder(TestWorker.class).build();
         insertWork(unscheduled);
 
-        new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
                 .withSchedulers(Collections.singletonList(mMockScheduler))
                 .withListener(mMockListener)
                 .build()
@@ -691,7 +701,7 @@
         insertWork(work);
 
         WorkerWrapper workerWrapper =
-                new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+                new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
                         .withSchedulers(Collections.singletonList(mMockScheduler))
                         .withListener(mMockListener)
                         .build();
@@ -717,7 +727,7 @@
         assertThat(worker.isStopped(), is(false));
 
         WorkerWrapper workerWrapper =
-                new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+                new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
                         .withSchedulers(Collections.singletonList(mMockScheduler))
                         .withListener(mMockListener)
                         .withWorker(worker)
@@ -744,7 +754,7 @@
         assertThat(worker.isStopped(), is(false));
 
         WorkerWrapper workerWrapper =
-                new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+                new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
                         .withSchedulers(Collections.singletonList(mMockScheduler))
                         .withListener(mMockListener)
                         .withWorker(worker)
@@ -761,7 +771,7 @@
         OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(ExceptionWorker.class).build();
         insertWork(work);
 
-        new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+        new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
                 .withSchedulers(Collections.singletonList(mMockScheduler))
                 .withListener(mMockListener)
                 .build()
@@ -777,7 +787,7 @@
         insertWork(work);
 
         WorkerWrapper workerWrapper =
-                new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
+                new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
                         .withSchedulers(Collections.singletonList(mMockScheduler))
                         .withListener(mMockListener)
                         .build();
@@ -797,10 +807,10 @@
         insertWork(work);
 
         WorkerWrapper workerWrapper =
-                new WorkerWrapper.Builder(mContext, mDatabase, work.getStringId())
-                .withSchedulers(Collections.singletonList(mMockScheduler))
-                .withListener(mMockListener)
-                .build();
+                new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId())
+                        .withSchedulers(Collections.singletonList(mMockScheduler))
+                        .withListener(mMockListener)
+                        .build();
 
         Executors.newSingleThreadExecutor().submit(workerWrapper);
         Thread.sleep(1000L);
diff --git a/work/workmanager/src/androidTest/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcherTest.java b/work/workmanager/src/androidTest/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcherTest.java
index 5e36dfd..cfe2cef 100644
--- a/work/workmanager/src/androidTest/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcherTest.java
+++ b/work/workmanager/src/androidTest/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcherTest.java
@@ -34,6 +34,7 @@
 import android.support.test.filters.MediumTest;
 import android.support.test.runner.AndroidJUnit4;
 
+import androidx.work.Configuration;
 import androidx.work.Constraints;
 import androidx.work.DatabaseTest;
 import androidx.work.OneTimeWorkRequest;
@@ -81,6 +82,7 @@
     private Context mContext;
     private Scheduler mScheduler;
     private WorkManagerImpl mWorkManager;
+    private Configuration mConfiguration;
     private ExecutorService mExecutorService;
     private Processor mProcessor;
     private Processor mSpyProcessor;
@@ -108,10 +110,13 @@
             }
         };
 
+        mConfiguration = new Configuration.Builder().build();
         when(mWorkManager.getWorkDatabase()).thenReturn(mDatabase);
+        when(mWorkManager.getConfiguration()).thenReturn(mConfiguration);
         mExecutorService = Executors.newSingleThreadExecutor();
         mProcessor = new Processor(
                 mContext,
+                mConfiguration,
                 mDatabase,
                 Collections.singletonList(mScheduler),
                 // simulate real world use-case
diff --git a/work/workmanager/src/androidTest/java/androidx/work/impl/workers/ConstraintTrackingWorkerTest.java b/work/workmanager/src/androidTest/java/androidx/work/impl/workers/ConstraintTrackingWorkerTest.java
index a86df66..6f136bf 100644
--- a/work/workmanager/src/androidTest/java/androidx/work/impl/workers/ConstraintTrackingWorkerTest.java
+++ b/work/workmanager/src/androidTest/java/androidx/work/impl/workers/ConstraintTrackingWorkerTest.java
@@ -31,6 +31,7 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
+import androidx.work.Configuration;
 import androidx.work.Constraints;
 import androidx.work.Data;
 import androidx.work.DatabaseTest;
@@ -76,6 +77,7 @@
     private ExecutorService mExecutorService;
 
     private WorkManagerImpl mWorkManagerImpl;
+    private Configuration mConfiguration;
     private Scheduler mScheduler;
     private Trackers mTracker;
     private BatteryChargingTracker mBatteryChargingTracker;
@@ -89,10 +91,12 @@
         mHandler = new Handler(Looper.getMainLooper());
         mExecutorService = Executors.newSingleThreadScheduledExecutor();
         mLatch = new CountDownLatch(1);
+        mConfiguration = new Configuration.Builder().build();
 
         mWorkManagerImpl = mock(WorkManagerImpl.class);
         mScheduler = mock(Scheduler.class);
         when(mWorkManagerImpl.getWorkDatabase()).thenReturn(mDatabase);
+        when(mWorkManagerImpl.getConfiguration()).thenReturn(mConfiguration);
 
         mBatteryChargingTracker = spy(new BatteryChargingTracker(mContext));
         mBatteryNotLowTracker = spy(new BatteryNotLowTracker(mContext));
@@ -149,7 +153,8 @@
         ConstraintTrackingWorker spyWorker = spy(worker);
         when(spyWorker.getWorkDatabase()).thenReturn(mDatabase);
 
-        WorkerWrapper.Builder builder = new WorkerWrapper.Builder(mContext, mDatabase, workSpecId);
+        WorkerWrapper.Builder builder =
+                new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, workSpecId);
         builder.withWorker(spyWorker)
                 .withListener(this)
                 .withSchedulers(Collections.singletonList(mScheduler));
@@ -194,7 +199,8 @@
         ConstraintTrackingWorker spyWorker = spy(worker);
         when(spyWorker.getWorkDatabase()).thenReturn(mDatabase);
 
-        WorkerWrapper.Builder builder = new WorkerWrapper.Builder(mContext, mDatabase, workSpecId);
+        WorkerWrapper.Builder builder =
+                new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, workSpecId);
         builder.withWorker(spyWorker)
                 .withListener(this)
                 .withSchedulers(Collections.singletonList(mScheduler));
@@ -237,8 +243,8 @@
 
         ConstraintTrackingWorker spyWorker = spy(worker);
         when(spyWorker.getWorkDatabase()).thenReturn(mDatabase);
-
-        WorkerWrapper.Builder builder = new WorkerWrapper.Builder(mContext, mDatabase, workSpecId);
+        WorkerWrapper.Builder builder =
+                new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, workSpecId);
         builder.withWorker(spyWorker)
                 .withListener(this)
                 .withSchedulers(Collections.singletonList(mScheduler));
@@ -290,7 +296,8 @@
         ConstraintTrackingWorker spyWorker = spy(worker);
         when(spyWorker.getWorkDatabase()).thenReturn(mDatabase);
 
-        WorkerWrapper.Builder builder = new WorkerWrapper.Builder(mContext, mDatabase, workSpecId);
+        WorkerWrapper.Builder builder =
+                new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, workSpecId);
         builder.withWorker(spyWorker)
                 .withListener(this)
                 .withSchedulers(Collections.singletonList(mScheduler));
diff --git a/work/workmanager/src/androidTest/java/androidx/work/worker/CheckLimitsWorker.java b/work/workmanager/src/androidTest/java/androidx/work/worker/CheckLimitsWorker.java
new file mode 100644
index 0000000..1176364
--- /dev/null
+++ b/work/workmanager/src/androidTest/java/androidx/work/worker/CheckLimitsWorker.java
@@ -0,0 +1,56 @@
+/*
+ * 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.work.worker;
+
+import static androidx.work.Worker.Result.SUCCESS;
+
+import android.support.annotation.NonNull;
+
+import androidx.work.Data;
+import androidx.work.Worker;
+import androidx.work.impl.Scheduler;
+import androidx.work.impl.WorkManagerImpl;
+import androidx.work.impl.model.WorkSpec;
+
+import java.util.List;
+
+public class CheckLimitsWorker extends Worker {
+    /* The limit to enforce */
+    public static final String KEY_LIMIT_TO_ENFORCE = "limit";
+
+    /* The output key which tells us if we exceeded the scheduler limits. */
+    public static final String KEY_EXCEEDS_SCHEDULER_LIMIT = "exceed_scheduler_limit";
+
+    @NonNull
+    @Override
+    public Result doWork() {
+        Data input = getInputData();
+        int limitToEnforce = input.getInt(KEY_LIMIT_TO_ENFORCE, Scheduler.MAX_SCHEDULER_LIMIT);
+        WorkManagerImpl workManager = WorkManagerImpl.getInstance();
+        List<WorkSpec> eligibleWorkSpecs = workManager.getWorkDatabase()
+                .workSpecDao()
+                .getEligibleWorkForScheduling(limitToEnforce);
+        int size = eligibleWorkSpecs != null ? eligibleWorkSpecs.size() : 0;
+        boolean exceedsLimits = size > limitToEnforce;
+        Data output = new Data.Builder()
+                .putBoolean(KEY_EXCEEDS_SCHEDULER_LIMIT, exceedsLimits)
+                .build();
+
+        setOutputData(output);
+        return SUCCESS;
+    }
+}
diff --git a/work/workmanager/src/main/java/androidx/work/Configuration.java b/work/workmanager/src/main/java/androidx/work/Configuration.java
index 4fe1470..77f5ffa 100644
--- a/work/workmanager/src/main/java/androidx/work/Configuration.java
+++ b/work/workmanager/src/main/java/androidx/work/Configuration.java
@@ -16,7 +16,11 @@
 
 package androidx.work;
 
+import static androidx.work.impl.Scheduler.MAX_SCHEDULER_LIMIT;
+
+import android.os.Build;
 import android.support.annotation.NonNull;
+import android.support.annotation.RestrictTo;
 
 import androidx.work.impl.utils.IdGenerator;
 
@@ -28,9 +32,16 @@
  */
 public final class Configuration {
 
+    /**
+     * The minimum number of system requests which can be enqueued by {@link WorkManager}
+     * when using {@link android.app.job.JobScheduler} or {@link android.app.AlarmManager}.
+     */
+    public static final int MIN_SCHEDULER_LIMIT = 20;
+
     private final Executor mExecutor;
     private final int mMinJobSchedulerId;
     private final int mMaxJobSchedulerId;
+    private final int mMaxSchedulerLimit;
 
     private Configuration(@NonNull Configuration.Builder builder) {
         if (builder.mExecutor == null) {
@@ -40,6 +51,7 @@
         }
         mMinJobSchedulerId = builder.mMinJobSchedulerId;
         mMaxJobSchedulerId = builder.mMaxJobSchedulerId;
+        mMaxSchedulerLimit = builder.mMaxSchedulerLimit;
     }
 
     /**
@@ -75,6 +87,22 @@
         return mMaxJobSchedulerId;
     }
 
+    /**
+     * @return The maximum number of system requests which can be enqueued by {@link WorkManager}
+     * when using {@link android.app.job.JobScheduler} or {@link android.app.AlarmManager}.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public int getMaxSchedulerLimit() {
+        // We double schedule jobs in SDK 23. So use half the number of max slots specified.
+        if (Build.VERSION.SDK_INT == 23) {
+            return mMaxSchedulerLimit / 2;
+        } else {
+            return mMaxSchedulerLimit;
+        }
+    }
+
     private Executor createDefaultExecutor() {
         return Executors.newFixedThreadPool(
                 // This value is the same as the core pool size for AsyncTask#THREAD_POOL_EXECUTOR.
@@ -88,6 +116,7 @@
 
         int mMinJobSchedulerId = IdGenerator.INITIAL_ID;
         int mMaxJobSchedulerId = Integer.MAX_VALUE;
+        int mMaxSchedulerLimit = MIN_SCHEDULER_LIMIT;
         Executor mExecutor;
 
         /**
@@ -122,6 +151,33 @@
         }
 
         /**
+         * Specifies the maximum number of system requests made by {@link WorkManager}
+         * when using {@link android.app.job.JobScheduler} or {@link android.app.AlarmManager}.
+         * When the application exceeds this limit {@link WorkManager} maintains an internal queue
+         * of {@link WorkRequest}s, and enqueues when slots become free.
+         *
+         * {@link WorkManager} requires a minimum of {@link Configuration#MIN_SCHEDULER_LIMIT}
+         * slots. The total number of slots also cannot exceed {@code 100} which is
+         * the {@link android.app.job.JobScheduler} limit.
+         *
+         * @param maxSchedulerLimit The total number of jobs which can be enqueued by
+         *                                {@link WorkManager} when using
+         *                                {@link android.app.job.JobScheduler}.
+         * @return This {@link Builder} instance
+         * @throws IllegalArgumentException when the number of jobs <
+         *                                  {@link Configuration#MIN_SCHEDULER_LIMIT}
+         */
+        public Builder setMaxSchedulerLimit(int maxSchedulerLimit) {
+            if (maxSchedulerLimit < MIN_SCHEDULER_LIMIT) {
+                throw new IllegalArgumentException(
+                        "WorkManager needs to be able to schedule at least 20 jobs in "
+                                + "JobScheduler.");
+            }
+            mMaxSchedulerLimit = Math.min(maxSchedulerLimit, MAX_SCHEDULER_LIMIT);
+            return this;
+        }
+
+        /**
          * Specifies a custom {@link Executor} for WorkManager.
          *
          * @param executor An {@link Executor} for processing work
diff --git a/work/workmanager/src/main/java/androidx/work/SynchronousWorkManager.java b/work/workmanager/src/main/java/androidx/work/SynchronousWorkManager.java
index f01e363..9f633d8 100644
--- a/work/workmanager/src/main/java/androidx/work/SynchronousWorkManager.java
+++ b/work/workmanager/src/main/java/androidx/work/SynchronousWorkManager.java
@@ -21,6 +21,7 @@
 
 import java.util.List;
 import java.util.UUID;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Blocking methods for {@link WorkManager} operations.  These methods are expected to be called
@@ -129,6 +130,20 @@
     long getLastCancelAllTimeMillisSync();
 
     /**
+     * Prunes all eligible finished work from the internal database in a synchronous fashion.
+     * Eligible work must be finished ({@link State#SUCCEEDED}, {@link State#FAILED}, or
+     * {@link State#CANCELLED}), with zero unfinished dependents.
+     * <p>
+     * <b>Use this method with caution</b>; by invoking it, you (and any modules and libraries in
+     * your codebase) will no longer be able to observe the {@link WorkStatus} of the pruned work.
+     * You do not normally need to call this method - WorkManager takes care to auto-prune its work
+     * after a sane period of time.  This method also ignores the
+     * {@link OneTimeWorkRequest.Builder#keepResultsForAtLeast(long, TimeUnit)} policy.
+     */
+    @WorkerThread
+    void pruneWorkSync();
+
+    /**
      * Gets the {@link WorkStatus} of a given work id in a synchronous fashion.  This method is
      * expected to be called from a background thread.
      *
diff --git a/work/workmanager/src/main/java/androidx/work/WorkManager.java b/work/workmanager/src/main/java/androidx/work/WorkManager.java
index 83891dc..5960e50 100644
--- a/work/workmanager/src/main/java/androidx/work/WorkManager.java
+++ b/work/workmanager/src/main/java/androidx/work/WorkManager.java
@@ -26,6 +26,7 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.UUID;
+import java.util.concurrent.TimeUnit;
 
 /**
  * WorkManager is a library used to enqueue work that is guaranteed to execute after its constraints
@@ -288,6 +289,19 @@
     public abstract void cancelAllWork();
 
     /**
+     * Prunes all eligible finished work from the internal database.  Eligible work must be finished
+     * ({@link State#SUCCEEDED}, {@link State#FAILED}, or {@link State#CANCELLED}), with zero
+     * unfinished dependents.
+     * <p>
+     * <b>Use this method with caution</b>; by invoking it, you (and any modules and libraries in
+     * your codebase) will no longer be able to observe the {@link WorkStatus} of the pruned work.
+     * You do not normally need to call this method - WorkManager takes care to auto-prune its work
+     * after a sane period of time.  This method also ignores the
+     * {@link OneTimeWorkRequest.Builder#keepResultsForAtLeast(long, TimeUnit)} policy.
+     */
+    public abstract void pruneWork();
+
+    /**
      * Gets a {@link LiveData} of the last time all work was cancelled.  This method is intended for
      * use by library and module developers who have dependent data in their own repository that
      * must be updated or deleted in case someone cancels their work without their prior knowledge.
diff --git a/work/workmanager/src/main/java/androidx/work/WorkRequest.java b/work/workmanager/src/main/java/androidx/work/WorkRequest.java
index c1eae64..cfb72b8 100644
--- a/work/workmanager/src/main/java/androidx/work/WorkRequest.java
+++ b/work/workmanager/src/main/java/androidx/work/WorkRequest.java
@@ -121,6 +121,7 @@
         public Builder(@NonNull Class<? extends Worker> workerClass) {
             mId = UUID.randomUUID();
             mWorkSpec = new WorkSpec(mId.toString(), workerClass.getName());
+            addTag(workerClass.getName());
         }
 
         /**
diff --git a/work/workmanager/src/main/java/androidx/work/impl/Processor.java b/work/workmanager/src/main/java/androidx/work/impl/Processor.java
index 4092686..86b7edf 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/Processor.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/Processor.java
@@ -20,6 +20,8 @@
 import android.support.annotation.RestrictTo;
 import android.util.Log;
 
+import androidx.work.Configuration;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -38,8 +40,8 @@
     private static final String TAG = "Processor";
 
     private Context mAppContext;
+    private Configuration mConfiguration;
     private WorkDatabase mWorkDatabase;
-
     private Map<String, WorkerWrapper> mEnqueuedWorkMap;
     private List<Scheduler> mSchedulers;
     private Executor mExecutor;
@@ -50,10 +52,12 @@
 
     public Processor(
             Context appContext,
+            Configuration configuration,
             WorkDatabase workDatabase,
             List<Scheduler> schedulers,
             Executor executor) {
         mAppContext = appContext;
+        mConfiguration = configuration;
         mWorkDatabase = workDatabase;
         mEnqueuedWorkMap = new HashMap<>();
         mSchedulers = schedulers;
@@ -87,11 +91,12 @@
             return false;
         }
 
-        WorkerWrapper workWrapper = new WorkerWrapper.Builder(mAppContext, mWorkDatabase, id)
-                .withListener(this)
-                .withSchedulers(mSchedulers)
-                .withRuntimeExtras(runtimeExtras)
-                .build();
+        WorkerWrapper workWrapper =
+                new WorkerWrapper.Builder(mAppContext, mConfiguration, mWorkDatabase, id)
+                        .withListener(this)
+                        .withSchedulers(mSchedulers)
+                        .withRuntimeExtras(runtimeExtras)
+                        .build();
         mEnqueuedWorkMap.put(id, workWrapper);
         mExecutor.execute(workWrapper);
         Log.d(TAG, String.format("%s: processing %s", getClass().getSimpleName(), id));
diff --git a/work/workmanager/src/main/java/androidx/work/impl/Schedulers.java b/work/workmanager/src/main/java/androidx/work/impl/Schedulers.java
index c6e5b81..4944549 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/Schedulers.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/Schedulers.java
@@ -25,6 +25,7 @@
 import android.support.annotation.VisibleForTesting;
 import android.util.Log;
 
+import androidx.work.Configuration;
 import androidx.work.impl.background.systemalarm.SystemAlarmScheduler;
 import androidx.work.impl.background.systemalarm.SystemAlarmService;
 import androidx.work.impl.background.systemjob.SystemJobScheduler;
@@ -61,11 +62,14 @@
      * @param schedulers   The {@link List} of {@link Scheduler}s to delegate to.
      */
     public static void schedule(
+            @NonNull Configuration configuration,
             @NonNull WorkDatabase workDatabase,
             List<Scheduler> schedulers) {
 
         WorkSpecDao workSpecDao = workDatabase.workSpecDao();
-        List<WorkSpec> eligibleWorkSpecs = workSpecDao.getEligibleWorkForScheduling();
+        List<WorkSpec> eligibleWorkSpecs =
+                workSpecDao.getEligibleWorkForScheduling(
+                        configuration.getMaxSchedulerLimit());
         scheduleInternal(workDatabase, schedulers, eligibleWorkSpecs);
     }
 
diff --git a/work/workmanager/src/main/java/androidx/work/impl/WorkDatabaseMigrations.java b/work/workmanager/src/main/java/androidx/work/impl/WorkDatabaseMigrations.java
index 0c3e3db..82a26ac 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/WorkDatabaseMigrations.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/WorkDatabaseMigrations.java
@@ -38,7 +38,7 @@
     private static final int VERSION_2 = 2;
 
     private static final String CREATE_SYSTEM_ID_INFO =
-            "CREATE TABLE IF NOT EXISTS `systemIdInfo` (`work_spec_id` TEXT NOT NULL, `system_id`"
+            "CREATE TABLE IF NOT EXISTS `SystemIdInfo` (`work_spec_id` TEXT NOT NULL, `system_id`"
                     + " INTEGER NOT NULL, PRIMARY KEY(`work_spec_id`), FOREIGN KEY(`work_spec_id`)"
                     + " REFERENCES `WorkSpec`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )";
 
@@ -49,20 +49,20 @@
                     + "CASCADE )";
 
     private static final String MIGRATE_ALARM_INFO_TO_SYSTEM_ID_INFO =
-            "INSERT INTO systemIdInfo(work_spec_id, system_id) "
+            "INSERT INTO SystemIdInfo(work_spec_id, system_id) "
                     + "SELECT work_spec_id, alarm_id AS system_id FROM alarmInfo";
 
     private static final String MIGRATE_SYSTEM_ID_INFO_TO_ALARM_INFO =
             "INSERT INTO alarmInfo(work_spec_id, alarm_id) "
-                    + "SELECT work_spec_id, system_id AS alarm_id FROM systemIdInfo";
+                    + "SELECT work_spec_id, system_id AS alarm_id FROM SystemIdInfo";
 
     private static final String REMOVE_ALARM_INFO = "DROP TABLE IF EXISTS alarmInfo";
-    private static final String REMOVE_SYSTEM_ID_INFO = "DROP TABLE IF EXISTS systemIdInfo";
-
+    private static final String REMOVE_SYSTEM_ID_INFO = "DROP TABLE IF EXISTS SystemIdInfo";
 
     /**
      * Removes the {@code alarmInfo} table and substitutes it for a more general
-     * {@code systemIdInfo} table.
+     * {@code SystemIdInfo} table.
+     * Adds implicit work tags for all work (a tag with the worker class name).
      */
     public static Migration MIGRATION_1_2 = new Migration(VERSION_1, VERSION_2) {
         @Override
@@ -70,12 +70,14 @@
             database.execSQL(CREATE_SYSTEM_ID_INFO);
             database.execSQL(MIGRATE_ALARM_INFO_TO_SYSTEM_ID_INFO);
             database.execSQL(REMOVE_ALARM_INFO);
+            database.execSQL("INSERT INTO worktag(tag, work_spec_id) "
+                    + "SELECT worker_class_name AS tag, id AS work_spec_id FROM workspec");
         }
     };
 
     /**
      * Removes the {@code alarmInfo} table and substitutes it for a more general
-     * {@code systemIdInfo} table.
+     * {@code SystemIdInfo} table.
      */
     public static Migration MIGRATION_2_1 = new Migration(VERSION_2, VERSION_1) {
         @Override
@@ -83,6 +85,7 @@
             database.execSQL(CREATE_ALARM_INFO);
             database.execSQL(MIGRATE_SYSTEM_ID_INFO_TO_ALARM_INFO);
             database.execSQL(REMOVE_SYSTEM_ID_INFO);
+            // Don't remove implicit tags; they may have been added by the developer.
         }
     };
 }
diff --git a/work/workmanager/src/main/java/androidx/work/impl/WorkManagerImpl.java b/work/workmanager/src/main/java/androidx/work/impl/WorkManagerImpl.java
index 119325c..0dcdda3 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/WorkManagerImpl.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/WorkManagerImpl.java
@@ -43,6 +43,7 @@
 import androidx.work.impl.utils.ForceStopRunnable;
 import androidx.work.impl.utils.LiveDataUtils;
 import androidx.work.impl.utils.Preferences;
+import androidx.work.impl.utils.PruneWorkRunnable;
 import androidx.work.impl.utils.StartWorkRunnable;
 import androidx.work.impl.utils.StopWorkRunnable;
 import androidx.work.impl.utils.taskexecutor.TaskExecutor;
@@ -166,6 +167,7 @@
         mTaskExecutor = WorkManagerTaskExecutor.getInstance();
         mProcessor = new Processor(
                 context,
+                mConfiguration,
                 mWorkDatabase,
                 getSchedulers(),
                 configuration.getExecutor());
@@ -349,6 +351,7 @@
     }
 
     @Override
+    @WorkerThread
     public void cancelUniqueWorkSync(@NonNull String uniqueWorkName) {
         assertBackgroundThread("Cannot cancelAllWorkByNameBlocking on main thread!");
         CancelWorkRunnable.forName(uniqueWorkName, this).run();
@@ -360,6 +363,7 @@
     }
 
     @Override
+    @WorkerThread
     public void cancelAllWorkSync() {
         assertBackgroundThread("Cannot cancelAllWorkSync on main thread!");
         CancelWorkRunnable.forAll(this).run();
@@ -376,6 +380,18 @@
     }
 
     @Override
+    public void pruneWork() {
+        mTaskExecutor.executeOnBackgroundThread(new PruneWorkRunnable(this));
+    }
+
+    @Override
+    @WorkerThread
+    public void pruneWorkSync() {
+        assertBackgroundThread("Cannot pruneWork on main thread!");
+        new PruneWorkRunnable(this).run();
+    }
+
+    @Override
     public LiveData<WorkStatus> getStatusById(@NonNull UUID id) {
         WorkSpecDao dao = mWorkDatabase.workSpecDao();
         LiveData<List<WorkSpec.WorkStatusPojo>> inputLiveData =
@@ -500,7 +516,7 @@
         // Delegate to the WorkManager's schedulers.
         // Using getters here so we can use from a mocked instance
         // of WorkManagerImpl.
-        Schedulers.schedule(getWorkDatabase(), getSchedulers());
+        Schedulers.schedule(getConfiguration(), getWorkDatabase(), getSchedulers());
     }
 
     private void assertBackgroundThread(String errorMessage) {
diff --git a/work/workmanager/src/main/java/androidx/work/impl/WorkerWrapper.java b/work/workmanager/src/main/java/androidx/work/impl/WorkerWrapper.java
index b6d4fc1..0b8c44c 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/WorkerWrapper.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/WorkerWrapper.java
@@ -30,6 +30,7 @@
 import android.support.annotation.WorkerThread;
 import android.util.Log;
 
+import androidx.work.Configuration;
 import androidx.work.Data;
 import androidx.work.InputMerger;
 import androidx.work.State;
@@ -63,6 +64,7 @@
     private WorkSpec mWorkSpec;
     Worker mWorker;
 
+    private Configuration mConfiguration;
     private WorkDatabase mWorkDatabase;
     private WorkSpecDao mWorkSpecDao;
     private DependencyDao mDependencyDao;
@@ -78,6 +80,7 @@
         mRuntimeExtras = builder.mRuntimeExtras;
         mWorker = builder.mWorker;
 
+        mConfiguration = builder.mConfiguration;
         mWorkDatabase = builder.mWorkDatabase;
         mWorkSpecDao = mWorkDatabase.workSpecDao();
         mDependencyDao = mWorkDatabase.dependencyDao();
@@ -300,7 +303,7 @@
             notifyListener(false, false);
         }
 
-        Schedulers.schedule(mWorkDatabase, mSchedulers);
+        Schedulers.schedule(mConfiguration, mWorkDatabase, mSchedulers);
     }
 
     private void recursivelyFailWorkAndDependents(String workSpecId) {
@@ -370,7 +373,7 @@
         }
 
         // This takes of scheduling the dependent workers as they have been marked ENQUEUED.
-        Schedulers.schedule(mWorkDatabase, mSchedulers);
+        Schedulers.schedule(mConfiguration, mWorkDatabase, mSchedulers);
     }
 
     static Worker workerFromWorkSpec(@NonNull Context context,
@@ -434,6 +437,7 @@
         private Context mAppContext;
         @Nullable
         private Worker mWorker;
+        private Configuration mConfiguration;
         private WorkDatabase mWorkDatabase;
         private String mWorkSpecId;
         private ExecutionListener mListener;
@@ -441,9 +445,11 @@
         private Extras.RuntimeExtras mRuntimeExtras;
 
         public Builder(@NonNull Context context,
+                @NonNull Configuration configuration,
                 @NonNull WorkDatabase database,
                 @NonNull String workSpecId) {
             mAppContext = context.getApplicationContext();
+            mConfiguration = configuration;
             mWorkDatabase = database;
             mWorkSpecId = workSpecId;
         }
diff --git a/work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/ConstraintsCommandHandler.java b/work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/ConstraintsCommandHandler.java
index 94cc2db..6dbd752 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/ConstraintsCommandHandler.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/ConstraintsCommandHandler.java
@@ -60,9 +60,14 @@
 
     @WorkerThread
     void handleConstraintsChanged() {
+        int schedulerLimit = mDispatcher
+                .getWorkManager()
+                .getConfiguration()
+                .getMaxSchedulerLimit();
+
         List<WorkSpec> candidates = mDispatcher.getWorkManager().getWorkDatabase()
                 .workSpecDao()
-                .getEligibleWorkForScheduling();
+                .getEligibleWorkForScheduling(schedulerLimit);
 
         // Filter candidates that are marked as SCHEDULE_NOT_REQUESTED_AT
         List<WorkSpec> eligibleWorkSpecs = new ArrayList<>(candidates.size());
diff --git a/work/workmanager/src/main/java/androidx/work/impl/model/SystemIdInfo.java b/work/workmanager/src/main/java/androidx/work/impl/model/SystemIdInfo.java
index e869762..cd97958 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/model/SystemIdInfo.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/model/SystemIdInfo.java
@@ -28,8 +28,7 @@
  *
  * @hide
  */
-@Entity(tableName = "systemIdInfo",
-        foreignKeys = {
+@Entity(foreignKeys = {
                 @ForeignKey(
                         entity = WorkSpec.class,
                         parentColumns = "id",
diff --git a/work/workmanager/src/main/java/androidx/work/impl/model/SystemIdInfoDao.java b/work/workmanager/src/main/java/androidx/work/impl/model/SystemIdInfoDao.java
index bcee05b..383e516 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/model/SystemIdInfoDao.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/model/SystemIdInfoDao.java
@@ -42,7 +42,7 @@
      * @return The instance of {@link SystemIdInfo} if exists.
      */
     @Nullable
-    @Query("SELECT * FROM systemIdInfo WHERE work_spec_id=:workSpecId")
+    @Query("SELECT * FROM SystemIdInfo WHERE work_spec_id=:workSpecId")
     SystemIdInfo getSystemIdInfo(@NonNull String workSpecId);
 
     /**
@@ -50,6 +50,6 @@
      *
      * @param workSpecId The {@link WorkSpec} identifier.
      */
-    @Query("DELETE FROM systemIdInfo where work_spec_id=:workSpecId")
+    @Query("DELETE FROM SystemIdInfo where work_spec_id=:workSpecId")
     void removeSystemIdInfo(@NonNull String workSpecId);
 }
diff --git a/work/workmanager/src/main/java/androidx/work/impl/model/WorkSpecDao.java b/work/workmanager/src/main/java/androidx/work/impl/model/WorkSpecDao.java
index 7d9775d..e15124f 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/model/WorkSpecDao.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/model/WorkSpecDao.java
@@ -29,7 +29,6 @@
 
 import androidx.work.Data;
 import androidx.work.State;
-import androidx.work.impl.Scheduler;
 
 import java.util.List;
 
@@ -285,10 +284,23 @@
             // We only want WorkSpecs which have not been previously scheduled.
             + " AND schedule_requested_at=" + WorkSpec.SCHEDULE_NOT_REQUESTED_YET
             + " LIMIT "
-                + "(SELECT " + Scheduler.MAX_SCHEDULER_LIMIT + "-COUNT(*) FROM workspec WHERE"
+                + "(SELECT :schedulerLimit" + "-COUNT(*) FROM workspec WHERE"
                     + " schedule_requested_at<>" + WorkSpec.SCHEDULE_NOT_REQUESTED_YET
                     + " AND state NOT IN " + COMPLETED_STATES
                 + ")"
     )
-    List<WorkSpec> getEligibleWorkForScheduling();
+    List<WorkSpec> getEligibleWorkForScheduling(int schedulerLimit);
+
+    /**
+     * Immediately prunes eligible work from the database meeting the following criteria:
+     * - Is finished (succeeded, failed, or cancelled)
+     * - Has zero unfinished dependents
+     */
+    @Query("DELETE FROM workspec WHERE "
+            + "state IN " + COMPLETED_STATES
+            + " AND (SELECT COUNT(*)=0 FROM dependency WHERE "
+            + "    prerequisite_id=id AND "
+            + "    work_spec_id NOT IN "
+            + "        (SELECT id FROM workspec WHERE state IN " + COMPLETED_STATES + "))")
+    void pruneFinishedWorkWithZeroDependentsIgnoringKeepForAtLeast();
 }
diff --git a/work/workmanager/src/main/java/androidx/work/impl/utils/CancelWorkRunnable.java b/work/workmanager/src/main/java/androidx/work/impl/utils/CancelWorkRunnable.java
index e117c95..842fdc2 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/utils/CancelWorkRunnable.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/utils/CancelWorkRunnable.java
@@ -56,7 +56,10 @@
     }
 
     void reschedulePendingWorkers(WorkManagerImpl workManagerImpl) {
-        Schedulers.schedule(workManagerImpl.getWorkDatabase(), workManagerImpl.getSchedulers());
+        Schedulers.schedule(
+                workManagerImpl.getConfiguration(),
+                workManagerImpl.getWorkDatabase(),
+                workManagerImpl.getSchedulers());
     }
 
     private void recursivelyCancelWorkAndDependents(WorkDatabase workDatabase, String workSpecId) {
diff --git a/work/workmanager/src/main/java/androidx/work/impl/utils/EnqueueRunnable.java b/work/workmanager/src/main/java/androidx/work/impl/utils/EnqueueRunnable.java
index 004b895..00d7b8f 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/utils/EnqueueRunnable.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/utils/EnqueueRunnable.java
@@ -106,7 +106,10 @@
     @VisibleForTesting
     public void scheduleWorkInBackground() {
         WorkManagerImpl workManager = mWorkContinuation.getWorkManagerImpl();
-        Schedulers.schedule(workManager.getWorkDatabase(), workManager.getSchedulers());
+        Schedulers.schedule(
+                workManager.getConfiguration(),
+                workManager.getWorkDatabase(),
+                workManager.getSchedulers());
     }
 
     private static boolean processContinuation(@NonNull WorkContinuationImpl workContinuation) {
diff --git a/work/workmanager/src/main/java/androidx/work/impl/utils/PruneWorkRunnable.java b/work/workmanager/src/main/java/androidx/work/impl/utils/PruneWorkRunnable.java
new file mode 100644
index 0000000..bf93f46
--- /dev/null
+++ b/work/workmanager/src/main/java/androidx/work/impl/utils/PruneWorkRunnable.java
@@ -0,0 +1,47 @@
+/*
+ * 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.work.impl.utils;
+
+import android.support.annotation.RestrictTo;
+
+import androidx.work.impl.WorkDatabase;
+import androidx.work.impl.WorkManagerImpl;
+import androidx.work.impl.model.WorkSpecDao;
+
+/**
+ * A Runnable that prunes work in the background.  Pruned work meets the following criteria:
+ * - Is finished (succeeded, failed, or cancelled)
+ * - Has zero unfinished dependents
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class PruneWorkRunnable implements Runnable {
+
+    private WorkManagerImpl mWorkManagerImpl;
+
+    public PruneWorkRunnable(WorkManagerImpl workManagerImpl) {
+        mWorkManagerImpl = workManagerImpl;
+    }
+
+    @Override
+    public void run() {
+        WorkDatabase workDatabase = mWorkManagerImpl.getWorkDatabase();
+        WorkSpecDao workSpecDao = workDatabase.workSpecDao();
+        workSpecDao.pruneFinishedWorkWithZeroDependentsIgnoringKeepForAtLeast();
+    }
+}
diff --git a/work/workmanager/src/schemas/androidx.work.impl.WorkDatabase/2.json b/work/workmanager/src/schemas/androidx.work.impl.WorkDatabase/2.json
index 00bc68d..400e545 100644
--- a/work/workmanager/src/schemas/androidx.work.impl.WorkDatabase/2.json
+++ b/work/workmanager/src/schemas/androidx.work.impl.WorkDatabase/2.json
@@ -2,7 +2,7 @@
   "formatVersion": 1,
   "database": {
     "version": 2,
-    "identityHash": "244d2ac5ecd0a7fb47b3755737585d7b",
+    "identityHash": "c45e5fcbdf3824dead9778f19e2fd8af",
     "entities": [
       {
         "tableName": "Dependency",
@@ -269,7 +269,7 @@
         ]
       },
       {
-        "tableName": "systemIdInfo",
+        "tableName": "SystemIdInfo",
         "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`work_spec_id` TEXT NOT NULL, `system_id` INTEGER NOT NULL, PRIMARY KEY(`work_spec_id`), FOREIGN KEY(`work_spec_id`) REFERENCES `WorkSpec`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )",
         "fields": [
           {
@@ -357,7 +357,7 @@
     ],
     "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, \"244d2ac5ecd0a7fb47b3755737585d7b\")"
+      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"c45e5fcbdf3824dead9778f19e2fd8af\")"
     ]
   }
 }
\ No newline at end of file
