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 47ac4a9..1f32e03 100644
--- a/work/workmanager/src/androidTest/java/androidx/work/impl/WorkContinuationImplTest.java
+++ b/work/workmanager/src/androidTest/java/androidx/work/impl/WorkContinuationImplTest.java
@@ -17,9 +17,11 @@
 package androidx.work.impl;
 
 import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.CoreMatchers.nullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.contains;
 import static org.hamcrest.Matchers.containsInAnyOrder;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
@@ -33,26 +35,32 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
+import androidx.work.Arguments;
+import androidx.work.State;
+import androidx.work.TestLifecycleOwner;
+import androidx.work.Work;
+import androidx.work.WorkContinuation;
+import androidx.work.WorkManagerTest;
+import androidx.work.impl.model.WorkSpec;
+import androidx.work.impl.model.WorkSpecDao;
+import androidx.work.impl.utils.taskexecutor.InstantTaskExecutorRule;
+import androidx.work.worker.TestWorker;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.Executors;
 
-import androidx.work.TestLifecycleOwner;
-import androidx.work.Work;
-import androidx.work.WorkContinuation;
-import androidx.work.impl.utils.taskexecutor.InstantTaskExecutorRule;
-import androidx.work.worker.TestWorker;
-
 
 @RunWith(AndroidJUnit4.class)
 @SmallTest
-public class WorkContinuationImplTest {
+public class WorkContinuationImplTest extends WorkManagerTest {
 
     private WorkDatabase mDatabase;
     private WorkManagerImpl mWorkManagerImpl;
@@ -233,6 +241,60 @@
         verifyEnqueued(dependent);
     }
 
+    @Test
+    @SmallTest
+    @SuppressWarnings("unchecked")
+    public void testContinuation_joinPassesAllOutput() throws InterruptedException {
+        final String intTag = "myint";
+        final String stringTag = "mystring";
+
+        Work firstWork = new Work.Builder(TestWorker.class)
+                .withInitialState(State.SUCCEEDED)
+                .build();
+        Work secondWork = new Work.Builder(TestWorker.class)
+                .withInitialState(State.SUCCEEDED)
+                .build();
+
+        WorkSpecDao workSpecDao = mDatabase.workSpecDao();
+        workSpecDao.insertWorkSpec(getWorkSpec(firstWork));
+        workSpecDao.insertWorkSpec(getWorkSpec(secondWork));
+
+        workSpecDao.setOutput(
+                firstWork.getId(),
+                new Arguments.Builder().putInt(intTag, 0).build());
+        workSpecDao.setOutput(
+                secondWork.getId(),
+                new Arguments.Builder().putInt(intTag, 1).putString(stringTag, "hello").build());
+
+        WorkContinuationImpl firstContinuation =
+                new WorkContinuationImpl(mWorkManagerImpl, Collections.singletonList(firstWork));
+        WorkContinuationImpl secondContinuation =
+                new WorkContinuationImpl(mWorkManagerImpl, Collections.singletonList(secondWork));
+        WorkContinuationImpl dependentContinuation =
+                (WorkContinuationImpl) WorkContinuation.join(firstContinuation, secondContinuation);
+        dependentContinuation.enqueue();
+
+        String joinId = null;
+        for (String id : dependentContinuation.getAllIds()) {
+            if (!firstWork.getId().equals(id) && !secondWork.getId().equals(id)) {
+                joinId = id;
+                mWorkManagerImpl.getProcessor().startWork(id);
+                Thread.sleep(5000L);
+                break;
+            }
+        }
+
+        assertThat(joinId, is(not(nullValue())));
+        WorkSpec joinWorkSpec = workSpecDao.getWorkSpec(joinId);
+        assertThat(joinWorkSpec, is(not(nullValue())));
+
+        Arguments output = joinWorkSpec.getOutput();
+        assertThat(output.getIntArray(intTag), is(not(nullValue())));
+        assertThat(Arrays.asList(output.getIntArray(intTag)), containsInAnyOrder(0, 1));
+        assertThat(output.getStringArray(stringTag), is(not(nullValue())));
+        assertThat(Arrays.asList(output.getStringArray(stringTag)), contains("hello"));
+    }
+
     private void verifyEnqueued(WorkContinuationImpl continuation) {
         assertThat(continuation.isEnqueued(), is(true));
         List<WorkContinuationImpl> parents = continuation.getParents();
diff --git a/work/workmanager/src/main/java/androidx/work/impl/WorkContinuationImpl.java b/work/workmanager/src/main/java/androidx/work/impl/WorkContinuationImpl.java
index 4675a86..be9782f 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/WorkContinuationImpl.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/WorkContinuationImpl.java
@@ -24,6 +24,7 @@
 import android.support.annotation.WorkerThread;
 import android.text.TextUtils;
 
+import androidx.work.ArrayCreatingInputMerger;
 import androidx.work.BaseWork;
 import androidx.work.BlockingWorkContinuation;
 import androidx.work.ExistingWorkPolicy;
@@ -199,7 +200,9 @@
             @NonNull List<WorkContinuation> continuations) {
 
         if (work == null) {
-            work = new Work.Builder(JoinWorker.class).build();
+            work = new Work.Builder(JoinWorker.class)
+                    .withInputMerger(ArrayCreatingInputMerger.class)
+                    .build();
         }
 
         List<WorkContinuationImpl> parents = new ArrayList<>(continuations.size());
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 6055290..7307e75 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
@@ -16,7 +16,7 @@
 
 package androidx.work.impl.model;
 
-import static android.arch.persistence.room.OnConflictStrategy.FAIL;
+import static android.arch.persistence.room.OnConflictStrategy.IGNORE;
 
 import static androidx.work.impl.model.EnumTypeConverters.StateIds.COMPLETED_STATES;
 
@@ -43,7 +43,7 @@
      *
      * @param workSpec The WorkSpec to insert.
      */
-    @Insert(onConflict = FAIL)
+    @Insert(onConflict = IGNORE)
     void insertWorkSpec(WorkSpec workSpec);
 
     /**
diff --git a/work/workmanager/src/main/java/androidx/work/impl/workers/JoinWorker.java b/work/workmanager/src/main/java/androidx/work/impl/workers/JoinWorker.java
index fb876b8..ad04256 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/workers/JoinWorker.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/workers/JoinWorker.java
@@ -30,6 +30,7 @@
 public class JoinWorker extends Worker {
     @Override
     public WorkerResult doWork() {
+        setOutput(getArguments());
         return WorkerResult.SUCCESS;
     }
 }
