diff --git a/src/main/java/bdv/viewer/render/AccumulateProjector.java b/src/main/java/bdv/viewer/render/AccumulateProjector.java
index 740036805c654c4ab1e9b2ecd359e121b0d252b0..91be77098862c3dec46629db2bb75981534b836b 100644
--- a/src/main/java/bdv/viewer/render/AccumulateProjector.java
+++ b/src/main/java/bdv/viewer/render/AccumulateProjector.java
@@ -48,12 +48,12 @@ public abstract class AccumulateProjector< A, B > implements VolatileProjector
 	 * Projectors that render the source images to accumulate.
 	 * For every rendering pass, ({@link VolatileProjector#map(boolean)}) is run on each source projector that is not yet {@link VolatileProjector#isValid() valid}.
 	 */
-	private final ArrayList< VolatileProjector > sourceProjectors;
+	private final List< VolatileProjector > sourceProjectors;
 
 	/**
 	 * The source images to accumulate
 	 */
-	private final ArrayList< IterableInterval< ? extends A > > sources;
+	private final List< IterableInterval< ? extends A > > sources;
 
 	/**
 	 * The target interval. Pixels of the target interval should be set by
@@ -84,8 +84,8 @@ public abstract class AccumulateProjector< A, B > implements VolatileProjector
 	private volatile boolean valid = false;
 
 	public AccumulateProjector(
-			final ArrayList< VolatileProjector > sourceProjectors,
-			final ArrayList< ? extends RandomAccessible< ? extends A > > sources,
+			final List< VolatileProjector > sourceProjectors,
+			final List< ? extends RandomAccessible< ? extends A > > sources,
 			final RandomAccessibleInterval< B > target,
 			final int numThreads,
 			final ExecutorService executorService )
diff --git a/src/main/java/bdv/viewer/render/AccumulateProjectorARGB.java b/src/main/java/bdv/viewer/render/AccumulateProjectorARGB.java
index 7c22a70c0794c28999bee444a398c11aae09a37c..c92260f53354d218e78dc68740ac5e268ce22dfc 100644
--- a/src/main/java/bdv/viewer/render/AccumulateProjectorARGB.java
+++ b/src/main/java/bdv/viewer/render/AccumulateProjectorARGB.java
@@ -49,9 +49,9 @@ public class AccumulateProjectorARGB implements VolatileProjector
 	{
 		@Override
 		public VolatileProjector createProjector(
-				final ArrayList< VolatileProjector > sourceProjectors,
-				final ArrayList< SourceAndConverter< ? > > sources,
-				final ArrayList< ? extends RandomAccessible< ? extends ARGBType > > sourceScreenImages,
+				final List< VolatileProjector > sourceProjectors,
+				final List< SourceAndConverter< ? > > sources,
+				final List< ? extends RandomAccessible< ? extends ARGBType > > sourceScreenImages,
 				final RandomAccessibleInterval< ARGBType > targetScreenImage,
 				final int numThreads,
 				final ExecutorService executorService )
@@ -69,8 +69,8 @@ public class AccumulateProjectorARGB implements VolatileProjector
 	public static class AccumulateProjectorARGBGeneric extends AccumulateProjector< ARGBType, ARGBType >
 	{
 		public AccumulateProjectorARGBGeneric(
-				final ArrayList< VolatileProjector > sourceProjectors,
-				final ArrayList< ? extends RandomAccessible< ? extends ARGBType > > sources,
+				final List< VolatileProjector > sourceProjectors,
+				final List< ? extends RandomAccessible< ? extends ARGBType > > sources,
 				final RandomAccessibleInterval< ARGBType > target,
 				final int numThreads,
 				final ExecutorService executorService )
@@ -110,12 +110,12 @@ public class AccumulateProjectorARGB implements VolatileProjector
 	 * Projectors that render the source images to accumulate.
 	 * For every rendering pass, ({@link VolatileProjector#map(boolean)}) is run on each source projector that is not yet {@link VolatileProjector#isValid() valid}.
 	 */
-	private final ArrayList< VolatileProjector > sourceProjectors;
+	private final List< VolatileProjector > sourceProjectors;
 
 	/**
 	 * The source images to accumulate
 	 */
-	private final ArrayList< ? extends RandomAccessible< ? extends ARGBType > > sources;
+	private final List< ? extends RandomAccessible< ? extends ARGBType > > sources;
 
 	private final int[][] sourceData;
 
@@ -144,8 +144,8 @@ public class AccumulateProjectorARGB implements VolatileProjector
 	private volatile boolean valid = false;
 
 	public AccumulateProjectorARGB(
-			final ArrayList< VolatileProjector > sourceProjectors,
-			final ArrayList< ? extends RandomAccessible< ? extends ARGBType > > sources,
+			final List< VolatileProjector > sourceProjectors,
+			final List< ? extends RandomAccessible< ? extends ARGBType > > sources,
 			final RandomAccessibleInterval< ARGBType > target,
 			final int numThreads,
 			final ExecutorService executorService )
diff --git a/src/main/java/bdv/viewer/render/AccumulateProjectorFactory.java b/src/main/java/bdv/viewer/render/AccumulateProjectorFactory.java
index 4343f596c2b6c0cf240b69cc15c61344a6439d47..8a141730781be7eca6c1decbed8fa39c48fbb94d 100644
--- a/src/main/java/bdv/viewer/render/AccumulateProjectorFactory.java
+++ b/src/main/java/bdv/viewer/render/AccumulateProjectorFactory.java
@@ -30,6 +30,7 @@ package bdv.viewer.render;
 
 import bdv.viewer.SourceAndConverter;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.ExecutorService;
 
 import bdv.viewer.Source;
@@ -54,9 +55,9 @@ public interface AccumulateProjectorFactory< A >
 	 *            {@link ExecutorService} to use for rendering. may be null.
 	 */
 	default VolatileProjector createProjector(
-			final ArrayList< VolatileProjector > sourceProjectors,
-			final ArrayList< SourceAndConverter< ? > > sources,
-			final ArrayList< ? extends RandomAccessible< ? extends A > > sourceScreenImages,
+			final List< VolatileProjector > sourceProjectors,
+			final List< SourceAndConverter< ? > > sources,
+			final List< ? extends RandomAccessible< ? extends A > > sourceScreenImages,
 			final RandomAccessibleInterval< A > targetScreenImage,
 			final int numThreads,
 			final ExecutorService executorService )
@@ -64,11 +65,17 @@ public interface AccumulateProjectorFactory< A >
 		final ArrayList< Source< ? > > spimSources = new ArrayList<>();
 		for ( SourceAndConverter< ? > source : sources )
 			spimSources.add( source.getSpimSource() );
-		return createAccumulateProjector( sourceProjectors, spimSources, sourceScreenImages, targetScreenImage, numThreads, executorService );
+		final ArrayList< VolatileProjector > sp = sourceProjectors instanceof ArrayList
+				? ( ArrayList ) sourceProjectors
+				: new ArrayList<>( sourceProjectors );
+		final ArrayList< ? extends RandomAccessible< ? extends A > > si = sourceScreenImages instanceof ArrayList
+				? ( ArrayList ) sourceScreenImages
+				: new ArrayList<>( sourceScreenImages );
+		return createAccumulateProjector( sp, spimSources, si, targetScreenImage, numThreads, executorService );
 	}
 
 	/**
-	 * @deprecated Use {@link #createProjector(ArrayList, ArrayList, ArrayList, RandomAccessibleInterval, int, ExecutorService)} instead.
+	 * @deprecated Use {@link #createProjector(List, List, List, RandomAccessibleInterval, int, ExecutorService)} instead.
 	 *
 	 * @param sourceProjectors
 	 *            projectors that will be used to render {@code sources}.