diff --git a/src/main/java/bdv/tools/HelpDialog.java b/src/main/java/bdv/tools/HelpDialog.java
index e056c40bd56ef990baa1a3c6224ae8005168f59a..4ccd0fcbd32270429b621fa8cfd7c101815e0581 100644
--- a/src/main/java/bdv/tools/HelpDialog.java
+++ b/src/main/java/bdv/tools/HelpDialog.java
@@ -28,6 +28,8 @@
  */
 package bdv.tools;
 
+import bdv.util.MemoryFixedDialog;
+
 import java.awt.BorderLayout;
 import java.awt.Dimension;
 import java.awt.Frame;
@@ -42,14 +44,13 @@ import javax.swing.ActionMap;
 import javax.swing.BorderFactory;
 import javax.swing.InputMap;
 import javax.swing.JComponent;
-import javax.swing.JDialog;
 import javax.swing.JEditorPane;
 import javax.swing.JScrollPane;
 import javax.swing.KeyStroke;
 import javax.swing.ScrollPaneConstants;
 import javax.swing.WindowConstants;
 
-public class HelpDialog extends JDialog
+public class HelpDialog extends MemoryFixedDialog
 {
 	private static final long serialVersionUID = 1L;
 
@@ -100,7 +101,6 @@ public class HelpDialog extends JDialog
 			am.put( hideKey, hideAction );
 
 			pack();
-			setDefaultCloseOperation( WindowConstants.HIDE_ON_CLOSE );
 		}
 		catch ( final IOException e )
 		{
diff --git a/src/main/java/bdv/tools/RecordMaxProjectionDialog.java b/src/main/java/bdv/tools/RecordMaxProjectionDialog.java
index d2b076638596892417775eb2879c09fcd123ee0e..dcc42668172a2277d0a04afa581aee655de121f5 100644
--- a/src/main/java/bdv/tools/RecordMaxProjectionDialog.java
+++ b/src/main/java/bdv/tools/RecordMaxProjectionDialog.java
@@ -30,6 +30,7 @@ package bdv.tools;
 
 import bdv.cache.CacheControl;
 import bdv.export.ProgressWriter;
+import bdv.util.MemoryFixedDialog;
 import bdv.util.Prefs;
 import bdv.viewer.BasicViewerState;
 import bdv.viewer.ViewerPanel;
@@ -56,7 +57,6 @@ import javax.swing.BoxLayout;
 import javax.swing.InputMap;
 import javax.swing.JButton;
 import javax.swing.JComponent;
-import javax.swing.JDialog;
 import javax.swing.JFileChooser;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
@@ -77,7 +77,7 @@ import bdv.viewer.OverlayRenderer;
 import bdv.viewer.render.RenderTarget;
 import net.imglib2.util.LinAlgHelpers;
 
-public class RecordMaxProjectionDialog extends JDialog implements OverlayRenderer
+public class RecordMaxProjectionDialog extends MemoryFixedDialog implements OverlayRenderer
 {
 	private static final long serialVersionUID = 1L;
 
@@ -275,7 +275,6 @@ public class RecordMaxProjectionDialog extends JDialog implements OverlayRendere
 		am.put( hideKey, hideAction );
 
 		pack();
-		setDefaultCloseOperation( WindowConstants.HIDE_ON_CLOSE );
 	}
 
 	/**
diff --git a/src/main/java/bdv/tools/RecordMovieDialog.java b/src/main/java/bdv/tools/RecordMovieDialog.java
index 9ae851aa1bcd269c953521ebcd1ff63f0987ca5c..ae5c564f509274844d17347984df56e1d23ab5ba 100644
--- a/src/main/java/bdv/tools/RecordMovieDialog.java
+++ b/src/main/java/bdv/tools/RecordMovieDialog.java
@@ -30,6 +30,7 @@ package bdv.tools;
 
 import bdv.cache.CacheControl;
 import bdv.export.ProgressWriter;
+import bdv.util.MemoryFixedDialog;
 import bdv.util.Prefs;
 import bdv.viewer.BasicViewerState;
 import bdv.viewer.ViewerPanel;
@@ -55,7 +56,6 @@ import javax.swing.BoxLayout;
 import javax.swing.InputMap;
 import javax.swing.JButton;
 import javax.swing.JComponent;
-import javax.swing.JDialog;
 import javax.swing.JFileChooser;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
@@ -70,7 +70,7 @@ import net.imglib2.realtransform.AffineTransform3D;
 import bdv.viewer.OverlayRenderer;
 import bdv.viewer.render.RenderTarget;
 
-public class RecordMovieDialog extends JDialog implements OverlayRenderer
+public class RecordMovieDialog extends MemoryFixedDialog implements OverlayRenderer
 {
 	private static final long serialVersionUID = 1L;
 
@@ -248,7 +248,6 @@ public class RecordMovieDialog extends JDialog implements OverlayRenderer
 		am.put( hideKey, hideAction );
 
 		pack();
-		setDefaultCloseOperation( WindowConstants.HIDE_ON_CLOSE );
 	}
 
 	public void recordMovie( final int width, final int height, final int minTimepointIndex, final int maxTimepointIndex, final File dir ) throws IOException
diff --git a/src/main/java/bdv/tools/VisibilityAndGroupingDialog.java b/src/main/java/bdv/tools/VisibilityAndGroupingDialog.java
index b4a42dca5980fff34b6b93abacda8e8eb0ad09f1..9b5b2bacd33a6deb883a8fd77df7fd698ab933a8 100644
--- a/src/main/java/bdv/tools/VisibilityAndGroupingDialog.java
+++ b/src/main/java/bdv/tools/VisibilityAndGroupingDialog.java
@@ -28,6 +28,7 @@
  */
 package bdv.tools;
 
+import bdv.util.MemoryFixedDialog;
 import bdv.viewer.SourceAndConverter;
 import bdv.viewer.ViewerState;
 import bdv.viewer.VisibilityAndGrouping;
@@ -61,7 +62,6 @@ import javax.swing.ButtonGroup;
 import javax.swing.InputMap;
 import javax.swing.JCheckBox;
 import javax.swing.JComponent;
-import javax.swing.JDialog;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JRadioButton;
@@ -73,7 +73,7 @@ import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
 
 @Deprecated
-public class VisibilityAndGroupingDialog extends JDialog
+public class VisibilityAndGroupingDialog extends MemoryFixedDialog
 {
 	private static final long serialVersionUID = 1L;
 
@@ -117,7 +117,7 @@ public class VisibilityAndGroupingDialog extends JDialog
 		content.add( visibilityPanel );
 		content.add( groupingPanel );
 		content.add( modePanel );
-		getContentPane().add( content, BorderLayout.NORTH );
+		add( content, BorderLayout.NORTH );
 
 		final ActionMap am = getRootPane().getActionMap();
 		final InputMap im = getRootPane().getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT );
@@ -147,7 +147,6 @@ public class VisibilityAndGroupingDialog extends JDialog
 		} );
 
 		pack();
-		setDefaultCloseOperation( WindowConstants.HIDE_ON_CLOSE );
 	}
 
 	public void update()
diff --git a/src/main/java/bdv/tools/brightness/BrightnessDialog.java b/src/main/java/bdv/tools/brightness/BrightnessDialog.java
index 1e71f960cdaec7ba438f14de6c7fe35903ae15c1..aabaeea494471bbcb2a2b90462774a30a87dec13 100644
--- a/src/main/java/bdv/tools/brightness/BrightnessDialog.java
+++ b/src/main/java/bdv/tools/brightness/BrightnessDialog.java
@@ -65,6 +65,7 @@ import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 
 import bdv.util.InvokeOnEDT;
+import bdv.util.MemoryFixedDialog;
 import mpicbg.spim.data.generic.sequence.BasicViewSetup;
 import net.imglib2.type.numeric.ARGBType;
 
@@ -75,7 +76,7 @@ import net.imglib2.type.numeric.ARGBType;
  * @author Tobias Pietzsch <tobias.pietzsch@gmail.com>
  */
 @Deprecated
-public class BrightnessDialog extends JDialog
+public class BrightnessDialog extends MemoryFixedDialog
 {
 	public BrightnessDialog( final Frame owner, final SetupAssignments setupAssignments )
 	{
@@ -148,7 +149,6 @@ public class BrightnessDialog extends JDialog
 		} );
 
 		pack();
-		setDefaultCloseOperation( WindowConstants.HIDE_ON_CLOSE );
 	}
 
 	public static class ColorsPanel extends JPanel
diff --git a/src/main/java/bdv/util/MemoryFixedDialog.java b/src/main/java/bdv/util/MemoryFixedDialog.java
new file mode 100644
index 0000000000000000000000000000000000000000..9f60c07b398f24d7fb1d4a90fc9baaada73aa7d4
--- /dev/null
+++ b/src/main/java/bdv/util/MemoryFixedDialog.java
@@ -0,0 +1,49 @@
+package bdv.util;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class MemoryFixedDialog extends JDialog
+{
+	private boolean packIsPending = false;
+
+	public MemoryFixedDialog()
+	{
+		super();
+		super.setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE );
+	}
+
+	public MemoryFixedDialog( Frame owner, String title, boolean modal )
+	{
+		super( owner, title, modal );
+	}
+
+	@Override
+	public void pack()
+	{
+		if ( isVisible() )
+		{
+			packIsPending = false;
+			super.pack();
+		}
+		else
+			packIsPending = true;
+	}
+
+	@Override
+	public void setVisible( boolean visible )
+	{
+		if ( visible && packIsPending )
+		{
+			packIsPending = false;
+			super.pack();
+		}
+		super.setVisible( visible );
+	}
+
+	@Override
+	public void setDefaultCloseOperation( int operation )
+	{
+		// do nothing
+	}
+}