diff --git a/src/main/java/bdv/tools/RecordMaxProjectionDialog.java b/src/main/java/bdv/tools/RecordMaxProjectionDialog.java
index 9d91b44b710dc9a604ab2ab02b4e6873b84bf47b..ba3dfd53efdae1384b1da22d5da9fdd0c55405c5 100644
--- a/src/main/java/bdv/tools/RecordMaxProjectionDialog.java
+++ b/src/main/java/bdv/tools/RecordMaxProjectionDialog.java
@@ -74,7 +74,6 @@ import net.imglib2.img.array.ArrayImgs;
 import net.imglib2.realtransform.AffineTransform3D;
 import net.imglib2.type.numeric.ARGBType;
 import bdv.viewer.OverlayRenderer;
-import net.imglib2.ui.PainterThread;
 import bdv.viewer.render.RenderTarget;
 import net.imglib2.util.LinAlgHelpers;
 
@@ -369,7 +368,7 @@ public class RecordMaxProjectionDialog extends JDialog implements OverlayRendere
 		}
 		final MyTarget target = new MyTarget();
 		final MultiResolutionRenderer renderer = new MultiResolutionRenderer(
-				target, new PainterThread( null ), new double[] { 1 }, 0, 1, null, false,
+				target, () -> {}, new double[] { 1 }, 0, 1, null, false,
 				viewer.getOptionValues().getAccumulateProjectorFactory(), new CacheControl.Dummy() );
 		progressWriter.setProgress( 0 );
 		for ( int timepoint = minTimepointIndex; timepoint <= maxTimepointIndex; ++timepoint )
diff --git a/src/main/java/bdv/tools/RecordMovieDialog.java b/src/main/java/bdv/tools/RecordMovieDialog.java
index c4adb030d275a3154f5478927908db03c02d5cf5..4fe673696c745c300b4234e737e6050162ef856c 100644
--- a/src/main/java/bdv/tools/RecordMovieDialog.java
+++ b/src/main/java/bdv/tools/RecordMovieDialog.java
@@ -68,7 +68,6 @@ import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 import net.imglib2.realtransform.AffineTransform3D;
 import bdv.viewer.OverlayRenderer;
-import net.imglib2.ui.PainterThread;
 import bdv.viewer.render.RenderTarget;
 
 public class RecordMovieDialog extends JDialog implements OverlayRenderer
@@ -303,7 +302,7 @@ public class RecordMovieDialog extends JDialog implements OverlayRenderer
 		}
 		final MyTarget target = new MyTarget();
 		final MultiResolutionRenderer renderer = new MultiResolutionRenderer(
-				target, new PainterThread( null ), new double[] { 1 }, 0, 1, null, false,
+				target, () -> {}, new double[] { 1 }, 0, 1, null, false,
 				viewer.getOptionValues().getAccumulateProjectorFactory(), new CacheControl.Dummy() );
 		progressWriter.setProgress( 0 );
 		for ( int timepoint = minTimepointIndex; timepoint <= maxTimepointIndex; ++timepoint )
diff --git a/src/main/java/bdv/viewer/render/MultiResolutionRenderer.java b/src/main/java/bdv/viewer/render/MultiResolutionRenderer.java
index 89b26654f4f8b6613204a6410c4f37ff7e3905ee..679721875664beea16df86a40ba72473a483adf2 100644
--- a/src/main/java/bdv/viewer/render/MultiResolutionRenderer.java
+++ b/src/main/java/bdv/viewer/render/MultiResolutionRenderer.java
@@ -28,6 +28,7 @@
  */
 package bdv.viewer.render;
 
+import bdv.viewer.RequestRepaint;
 import java.util.concurrent.ExecutorService;
 
 import net.imglib2.Interval;
@@ -36,7 +37,6 @@ import net.imglib2.Volatile;
 import net.imglib2.cache.iotiming.CacheIoTiming;
 import net.imglib2.realtransform.AffineTransform3D;
 import net.imglib2.type.numeric.ARGBType;
-import net.imglib2.ui.PainterThread;
 import net.imglib2.util.Intervals;
 
 import bdv.cache.CacheControl;
@@ -98,7 +98,7 @@ public class MultiResolutionRenderer
 	 * Thread that triggers repainting of the display.
 	 * Requests for repainting are send there.
 	 */
-	private final PainterThread painterThread;
+	private final RequestRepaint painterThread;
 
 	/**
 	 * Creates projectors for rendering current {@code ViewerState} to a
@@ -265,7 +265,7 @@ public class MultiResolutionRenderer
 	 */
 	public MultiResolutionRenderer(
 			final RenderTarget< ? > display,
-			final PainterThread painterThread,
+			final RequestRepaint painterThread,
 			final double[] screenScaleFactors,
 			final long targetRenderNanos,
 			final int numRenderingThreads,
diff --git a/src/main/java/net/imglib2/ui/PainterThread.java b/src/main/java/net/imglib2/ui/PainterThread.java
index e6d1ed5dc6d28ffc3ab5a5ea9bb986bfa28a983f..143b45354c0c5d12517acfaf3b8c3f655a0d7c91 100644
--- a/src/main/java/net/imglib2/ui/PainterThread.java
+++ b/src/main/java/net/imglib2/ui/PainterThread.java
@@ -33,12 +33,13 @@
  */
 package net.imglib2.ui;
 
+import bdv.viewer.RequestRepaint;
 import java.util.concurrent.RejectedExecutionException;
 
 /**
  * Thread to repaint display.
  */
-final public class PainterThread extends Thread
+public class PainterThread extends Thread implements RequestRepaint
 {
 	public interface Paintable
 	{
@@ -109,6 +110,7 @@ final public class PainterThread extends Thread
 	 * Request repaint. This will trigger a call to {@link Paintable#paint()}
 	 * from the {@link PainterThread}.
 	 */
+	@Override
 	public void requestRepaint()
 	{
 		synchronized ( this )