Index: trunk/src/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityAction.java	(revision 18017)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityAction.java	(revision 18018)
@@ -20,4 +20,5 @@
 import java.util.Hashtable;
 import java.util.List;
+import java.util.Objects;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
@@ -43,5 +44,4 @@
 import org.openstreetmap.josm.gui.dialogs.IEnabledStateUpdating;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog.LayerListModel;
-import org.openstreetmap.josm.gui.layer.GpxLayer;
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -56,4 +56,5 @@
  *
  * @author Michael Zangl
+ * @since 10144
  */
 public final class LayerVisibilityAction extends AbstractAction implements IEnabledStateUpdating, LayerAction {
@@ -77,7 +78,6 @@
      * The real content, just to add a border
      */
-    private final JPanel content = new JPanel();
-    final OpacitySlider opacitySlider = new OpacitySlider();
-    private final ArrayList<LayerVisibilityMenuEntry> sliders = new ArrayList<>();
+    protected final JPanel content = new JPanel();
+    protected final List<VisibilityMenuEntry> sliders = new ArrayList<>();
 
     /**
@@ -107,9 +107,9 @@
 
         new ImageProvider(DIALOGS_LAYERLIST, "visibility").getResource().attachImageIcon(this, true);
-        putValue(SHORT_DESCRIPTION, tr("Change visibility of the selected layer."));
+        putValue(SHORT_DESCRIPTION, tr("Change visibility."));
 
         addContentEntry(new VisibilityCheckbox());
 
-        addContentEntry(opacitySlider);
+        addContentEntry(new OpacitySlider());
         addContentEntry(new ColorfulnessSlider());
         addContentEntry(new GammaFilterSlider());
@@ -118,5 +118,5 @@
     }
 
-    private void addContentEntry(LayerVisibilityMenuEntry slider) {
+    private void addContentEntry(VisibilityMenuEntry slider) {
         content.add(slider.getPanel(), GBC.eop().fill(GBC.HORIZONTAL));
         sliders.add(slider);
@@ -148,6 +148,6 @@
 
     void updateValues() {
-        for (LayerVisibilityMenuEntry slider : sliders) {
-            slider.updateLayers();
+        for (VisibilityMenuEntry slider : sliders) {
+            slider.updateValue();
         }
     }
@@ -180,10 +180,10 @@
      * @author Michael Zangl
      */
-    private interface LayerVisibilityMenuEntry {
-
-        /**
-         * Update the displayed value depending on the current layers
-         */
-        void updateLayers();
+    protected interface VisibilityMenuEntry {
+
+        /**
+         * Update the displayed value
+         */
+        void updateValue();
 
         /**
@@ -194,5 +194,5 @@
     }
 
-    private class VisibilityCheckbox extends JCheckBox implements LayerVisibilityMenuEntry {
+    private class VisibilityCheckbox extends JCheckBox implements VisibilityMenuEntry {
 
         VisibilityCheckbox() {
@@ -207,10 +207,10 @@
 
         @Override
-        public void updateLayers() {
+        public void updateValue() {
             Collection<Layer> layers = layerSupplier.get();
             boolean allVisible = layers.stream().allMatch(Layer::isVisible);
             boolean allHidden = layers.stream().noneMatch(Layer::isVisible);
 
-            setEnabled(!layers.isEmpty());
+            setVisible(!layers.isEmpty());
             // TODO: Indicate tristate.
             setSelected(allVisible && !allHidden);
@@ -227,5 +227,5 @@
      * @author Michael Zangl
      */
-    private abstract static class AbstractFilterSlider extends JPanel implements LayerVisibilityMenuEntry {
+    private abstract static class AbstractFilterSlider extends JPanel implements VisibilityMenuEntry {
         private final double minValue;
         private final double maxValue;
@@ -264,7 +264,4 @@
                 }
             });
-
-            //final NumberFormat format = DecimalFormat.getInstance();
-            //setLabels(format.format(minValue), format.format((minValue + maxValue) / 2), format.format(maxValue));
         }
 
@@ -369,5 +366,5 @@
 
         @Override
-        public void updateLayers() {
+        public void updateValue() {
             Collection<Layer> usedLayers = layerSupplier.get();
             setVisible(!usedLayers.isEmpty());
@@ -405,5 +402,5 @@
 
     /**
-     * This slider allows you to change the gamma value of a layer.
+     * This slider allows you to change the gamma value.
      *
      * @author Michael Zangl
@@ -418,9 +415,9 @@
             super(-1, 1, DEFAULT_GAMMA_VALUE);
             setLabels("0", "1", "∞");
-            slider.setToolTipText(tr("Adjust gamma value of the layer.") + " " + tr("Double click to reset."));
-        }
-
-        @Override
-        public void updateLayers() {
+            slider.setToolTipText(tr("Adjust gamma value.") + " " + tr("Double click to reset."));
+        }
+
+        @Override
+        public void updateValue() {
             Collection<ImageryFilterSettings> settings = filterSettingsSupplier.get();
             setVisible(!settings.isEmpty());
@@ -471,5 +468,5 @@
 
     /**
-     * This slider allows you to change the sharpness of a layer.
+     * This slider allows you to change the sharpness.
      *
      * @author Michael Zangl
@@ -484,9 +481,9 @@
             super(0, MAX_SHARPNESS_FACTOR, DEFAULT_SHARPNESS_FACTOR);
             setLabels(trc("image sharpness", "blurred"), trc("image sharpness", "normal"), trc("image sharpness", "sharp"));
-            slider.setToolTipText(tr("Adjust sharpness/blur value of the layer.") + " " + tr("Double click to reset."));
-        }
-
-        @Override
-        public void updateLayers() {
+            slider.setToolTipText(tr("Adjust sharpness/blur value.") + " " + tr("Double click to reset."));
+        }
+
+        @Override
+        public void updateValue() {
             Collection<ImageryFilterSettings> settings = filterSettingsSupplier.get();
             setVisible(!settings.isEmpty());
@@ -515,5 +512,5 @@
 
     /**
-     * This slider allows you to change the colorfulness of a layer.
+     * This slider allows you to change the colorfulness.
      *
      * @author Michael Zangl
@@ -528,9 +525,9 @@
             super(0, MAX_COLORFUL_FACTOR, DEFAULT_COLORFUL_FACTOR);
             setLabels(trc("image colorfulness", "less"), trc("image colorfulness", "normal"), trc("image colorfulness", "more"));
-            slider.setToolTipText(tr("Adjust colorfulness of the layer.") + " " + tr("Double click to reset."));
-        }
-
-        @Override
-        public void updateLayers() {
+            slider.setToolTipText(tr("Adjust colorfulness.") + " " + tr("Double click to reset."));
+        }
+
+        @Override
+        public void updateValue() {
             Collection<ImageryFilterSettings> settings = filterSettingsSupplier.get();
             setVisible(!settings.isEmpty());
@@ -559,8 +556,8 @@
 
     /**
-     * Allows to select the color for the GPX layer
+     * Allows to select the color of a layer
      * @author Michael Zangl
      */
-    private class ColorSelector extends JPanel implements LayerVisibilityMenuEntry {
+    private class ColorSelector extends JPanel implements VisibilityMenuEntry {
 
         private final Border NORMAL_BORDER = BorderFactory.createEmptyBorder(2, 2, 2, 2);
@@ -600,7 +597,5 @@
                     Collection<Layer> layers = layerSupplier.get();
                     for (Layer l : layers) {
-                        if (l instanceof GpxLayer) {
-                            l.setColor(color);
-                        }
+                        l.setColor(color);
                     }
                     highlightColor(color);
@@ -618,6 +613,6 @@
         private List<Color> getColors() {
             return layerSupplier.get().stream()
-                    .filter(layer -> layer instanceof GpxLayer)
                     .map(Layer::getColor)
+                    .filter(Objects::nonNull)
                     .distinct()
                     .collect(Collectors.toList());
@@ -625,5 +620,5 @@
 
         @Override
-        public void updateLayers() {
+        public void updateValue() {
             List<Color> colors = getColors();
             if (colors.size() == 1) {
@@ -634,5 +629,4 @@
                 highlightColor(null);
             } else {
-                // no GPX layer
                 setVisible(false);
             }
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java	(revision 18017)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java	(revision 18018)
@@ -44,4 +44,5 @@
  *
  * Offers basic mouse interaction (zoom, drag) and on-screen text.
+ * @since 2566
  */
 public class ImageDisplay extends JComponent implements Destroyable, PreferenceChangedListener, FilterChangeListener {
@@ -103,7 +104,7 @@
     private static final BooleanProperty ERROR_MESSAGE_BACKGROUND = new BooleanProperty("geoimage.message.error.background", false);
 
-    private updateImageThread updateImageThreadInstance;
-
-    private class updateImageThread extends Thread {
+    private UpdateImageThread updateImageThreadInstance;
+
+    private class UpdateImageThread extends Thread {
         private boolean restart;
 
@@ -121,5 +122,5 @@
             if (!isAlive()) {
                 restart = false;
-                updateImageThreadInstance = new updateImageThread();
+                updateImageThreadInstance = new UpdateImageThread();
                 updateImageThreadInstance.start();
             }
@@ -597,5 +598,5 @@
 
     /**
-     * Constructs a new {@code ImageDisplay}.
+     * Constructs a new {@code ImageDisplay} with no image processor.
      */
     public ImageDisplay() {
@@ -603,4 +604,9 @@
     }
 
+    /**
+     * Constructs a new {@code ImageDisplay} with a given image processor.
+     * @param imageProcessor image processor
+     * @since 17740
+     */
     public ImageDisplay(ImageProcessor imageProcessor) {
         addMouseListener(imgMouseListener);
@@ -679,5 +685,5 @@
             updateImageThreadInstance.restart();
         } else {
-            updateImageThreadInstance = new updateImageThread();
+            updateImageThreadInstance = new UpdateImageThread();
             updateImageThreadInstance.start();
         }
@@ -732,5 +738,5 @@
                 g.drawRect(topLeft.x, topLeft.y, bottomRight.x - topLeft.x, bottomRight.y - topLeft.y);
             }
-            if (errorLoading) {
+            if (errorLoading && entry != null) {
                 String loadingStr = tr("Error on file {0}", entry.getDisplayName());
                 Rectangle2D noImageSize = g.getFontMetrics(g.getFont()).getStringBounds(loadingStr, g);
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 18017)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 18018)
@@ -20,4 +20,5 @@
 import java.util.Optional;
 
+import javax.swing.AbstractAction;
 import javax.swing.Box;
 import javax.swing.JButton;
@@ -116,7 +117,12 @@
     }
 
-    private static JButton createNavigationButton(JosmAction action, Dimension buttonDim) {
+    private static JButton createButton(AbstractAction action, Dimension buttonDim) {
         JButton btn = new JButton(action);
         btn.setPreferredSize(buttonDim);
+        return btn;
+    }
+
+    private static JButton createNavigationButton(AbstractAction action, Dimension buttonDim) {
+        JButton btn = createButton(action, buttonDim);
         btn.setEnabled(false);
         return btn;
@@ -133,12 +139,7 @@
         btnPrevious = createNavigationButton(imagePreviousAction, buttonDim);
 
-        btnDelete = new JButton(imageRemoveAction);
-        btnDelete.setPreferredSize(buttonDim);
-
-        btnDeleteFromDisk = new JButton(imageRemoveFromDiskAction);
-        btnDeleteFromDisk.setPreferredSize(buttonDim);
-
-        btnCopyPath = new JButton(imageCopyPathAction);
-        btnCopyPath.setPreferredSize(buttonDim);
+        btnDelete = createButton(imageRemoveAction, buttonDim);
+        btnDeleteFromDisk = createButton(imageRemoveFromDiskAction, buttonDim);
+        btnCopyPath = createButton(imageCopyPathAction, buttonDim);
 
         btnNext = createNavigationButton(imageNextAction, buttonDim);
@@ -151,6 +152,5 @@
         btnZoomBestFit.setPreferredSize(buttonDim);
 
-        btnCollapse = new JButton(imageCollapseAction);
-        btnCollapse.setPreferredSize(new Dimension(20, 20));
+        btnCollapse = createButton(imageCollapseAction, new Dimension(20, 20));
         btnCollapse.setAlignmentY(Component.TOP_ALIGNMENT);
 
@@ -169,5 +169,5 @@
         buttons.add(btnCopyPath);
         buttons.add(Box.createRigidArea(new Dimension(7, 0)));
-        buttons.add(new JButton(visibilityAction));
+        buttons.add(createButton(visibilityAction, buttonDim));
 
         JPanel bottomPane = new JPanel(new GridBagLayout());
Index: trunk/src/org/openstreetmap/josm/gui/layer/imagery/ImageryFilterSettings.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/imagery/ImageryFilterSettings.java	(revision 18017)
+++ trunk/src/org/openstreetmap/josm/gui/layer/imagery/ImageryFilterSettings.java	(revision 18018)
@@ -10,5 +10,5 @@
 
 /**
- * This class holds the filter settings for an imagery layer.
+ * This class holds the filter settings for an imagery.
  * @author Michael Zangl
  * @since 10547
@@ -47,5 +47,5 @@
 
     /**
-     * Sets the sharpen level for the layer.
+     * Sets the sharpen level for the imagery.
      * <code>1</code> means no change in sharpness.
      * Values in range 0..1 blur the image.
