diff --git a/src/main/java/bdv/ij/OpenImagePlusPlugIn.java b/src/main/java/bdv/ij/OpenImagePlusPlugIn.java
index 132a981cb9851e965df599b1e254910e5ee05a30..d84afa91d8556557a907028b5509a80107a98589 100644
--- a/src/main/java/bdv/ij/OpenImagePlusPlugIn.java
+++ b/src/main/java/bdv/ij/OpenImagePlusPlugIn.java
@@ -1,9 +1,13 @@
 package bdv.ij;
 
+import bdv.viewer.ConverterSetups;
+import bdv.viewer.SynchronizedViewerState;
+import bdv.viewer.ViewerState;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.HashMap;
 
+import java.util.List;
 import net.imglib2.FinalDimensions;
 import net.imglib2.realtransform.AffineTransform3D;
 import net.imglib2.type.numeric.ARGBType;
@@ -21,11 +25,9 @@ import bdv.spimdata.SequenceDescriptionMinimal;
 import bdv.spimdata.SpimDataMinimal;
 import bdv.spimdata.WrapBasicImgLoader;
 import bdv.tools.brightness.ConverterSetup;
-import bdv.tools.brightness.SetupAssignments;
 import bdv.viewer.DisplayMode;
 import bdv.viewer.SourceAndConverter;
 import bdv.viewer.ViewerOptions;
-import bdv.viewer.VisibilityAndGrouping;
 import ij.CompositeImage;
 import ij.IJ;
 import ij.ImageJ;
@@ -132,18 +134,19 @@ public class OpenImagePlusPlugIn implements Command
 					nTimepoints, cache,
 					"BigDataViewer", new ProgressWriterIJ(), ViewerOptions.options() );
 
-			final SetupAssignments sa = bdv.getSetupAssignments();
-			final VisibilityAndGrouping vg = bdv.getViewer().getVisibilityAndGrouping();
-
-			int channelOffset = 0;
-			int numActiveChannels = 0;
-			for ( ImagePlus imp : imgList )
+			final SynchronizedViewerState state = bdv.getViewer().state();
+			synchronized ( state )
 			{
-				numActiveChannels += transferChannelVisibility( channelOffset, imp,vg );
-				transferChannelSettings( channelOffset, imp, sa );
-				channelOffset += imp.getNChannels();
+				int channelOffset = 0;
+				int numActiveChannels = 0;
+				for ( ImagePlus imp : imgList )
+				{
+					numActiveChannels += transferChannelVisibility( channelOffset, imp, state );
+					transferChannelSettings( channelOffset, imp, state, bdv.getConverterSetups() );
+					channelOffset += imp.getNChannels();
+				}
+				state.setDisplayMode( numActiveChannels > 1 ? DisplayMode.FUSED : DisplayMode.SINGLE );
 			}
-			vg.setDisplayMode( numActiveChannels > 1 ? DisplayMode.FUSED : DisplayMode.SINGLE );
 		}
 	}
 
@@ -257,19 +260,20 @@ public class OpenImagePlusPlugIn implements Command
 	/**
 	 * @return number of setups that were set active.
 	 */
-	protected int transferChannelVisibility( int channelOffset, final ImagePlus imp, final VisibilityAndGrouping visibility )
+	protected int transferChannelVisibility( int channelOffset, final ImagePlus imp, final ViewerState state )
 	{
 		final int nChannels = imp.getNChannels();
 		final CompositeImage ci = imp.isComposite() ? ( CompositeImage ) imp : null;
+		final List< SourceAndConverter< ? > > sources = state.getSources();
 		if ( ci != null && ci.getCompositeMode() == IJ.COMPOSITE )
 		{
 			final boolean[] activeChannels = ci.getActiveChannels();
 			int numActiveChannels = 0;
-			for ( int i = 0; i < activeChannels.length; ++i )
+			for ( int i = 0; i < Math.min( activeChannels.length, nChannels ); ++i )
 			{
-				final int setup = channelOffset + i;
-				visibility.setSourceActive( setup, activeChannels[ i ] );
-				visibility.setCurrentSource( setup );
+				final SourceAndConverter< ? > source = sources.get( channelOffset + i );
+				state.setSourceActive( source, activeChannels[ i ] );
+				state.setCurrentSource( source );
 				numActiveChannels += activeChannels[ i ] ? 1 : 0;
 			}
 			return numActiveChannels;
@@ -278,16 +282,17 @@ public class OpenImagePlusPlugIn implements Command
 		{
 			final int activeChannel = imp.getChannel() - 1;
 			for ( int i = 0; i < nChannels; ++i )
-				visibility.setSourceActive( channelOffset + i, i == activeChannel );
-			visibility.setCurrentSource( channelOffset + activeChannel );
+				state.setSourceActive( sources.get( channelOffset + i ), i == activeChannel );
+			state.setCurrentSource( sources.get( channelOffset + activeChannel ) );
 			return 1;
 		}
 	}
 
-	protected void transferChannelSettings( int channelOffset, final ImagePlus imp, final SetupAssignments setupAssignments )
+	protected void transferChannelSettings( int channelOffset, final ImagePlus imp, final ViewerState state, final ConverterSetups converterSetups )
 	{
 		final int nChannels = imp.getNChannels();
 		final CompositeImage ci = imp.isComposite() ? ( CompositeImage ) imp : null;
+		final List< SourceAndConverter< ? > > sources = state.getSources();
 		if ( ci != null )
 		{
 			final int mode = ci.getCompositeMode();
@@ -295,7 +300,7 @@ public class OpenImagePlusPlugIn implements Command
 			for ( int c = 0; c < nChannels; ++c )
 			{
 				final LUT lut = ci.getChannelLut( c + 1 );
-				final ConverterSetup setup = setupAssignments.getConverterSetups().get( channelOffset + c );
+				final ConverterSetup setup = converterSetups.getConverterSetup( sources.get( channelOffset + c ) );
 				if ( transferColor )
 					setup.setColor( new ARGBType( lut.getRGB( 255 ) ) );
 				setup.setDisplayRange( lut.min, lut.max );
@@ -307,7 +312,7 @@ public class OpenImagePlusPlugIn implements Command
 			final double displayRangeMax = imp.getDisplayRangeMax();
 			for ( int i = 0; i < nChannels; ++i )
 			{
-				final ConverterSetup setup = setupAssignments.getConverterSetups().get( channelOffset + i );
+				final ConverterSetup setup = converterSetups.getConverterSetup( sources.get( channelOffset + i ) );
 				final LUT[] luts = imp.getLuts();
 				if ( luts.length != 0 )
 					setup.setColor( new ARGBType( luts[ 0 ].getRGB( 255 ) ) );