Index: /trunk/src/org/openstreetmap/josm/actions/OpenFileAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/OpenFileAction.java	(revision 19122)
+++ /trunk/src/org/openstreetmap/josm/actions/OpenFileAction.java	(revision 19123)
@@ -7,4 +7,5 @@
 import static org.openstreetmap.josm.tools.I18n.trn;
 
+import java.awt.GraphicsEnvironment;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
@@ -43,4 +44,6 @@
 import org.openstreetmap.josm.gui.io.importexport.FileImporter;
 import org.openstreetmap.josm.gui.io.importexport.Options;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
@@ -274,4 +277,5 @@
         protected void realRun() throws SAXException, IOException, OsmTransferException {
             if (Utils.isEmpty(files)) return;
+            List<Layer> oldLayers = MainApplication.getLayerManager().getLayers();
 
             /*
@@ -378,4 +382,25 @@
                 PreferencesUtils.putListBounded(Config.getPref(), "file-open.history", maxsize, new ArrayList<>(fileHistory));
             }
+            if (!canceled && !GraphicsEnvironment.isHeadless()) {
+                checkNewLayers(oldLayers);
+            }
+        }
+
+        private static void checkNewLayers(List<Layer> oldLayers) {
+            // We do have to wrap the EDT call in a worker call, since layers may be created in the EDT.
+            // And the layer(s) must be added to the layer list in order for the dialog to work properly.
+            MainApplication.worker.execute(() -> GuiHelper.runInEDT(() -> {
+                List<Layer> newLayers = MainApplication.getLayerManager().getLayers();
+                // see #23728: open first image of topmost new image layer
+                for (Layer l : newLayers) {
+                    if (oldLayers.contains(l))
+                        return;
+                    if (l instanceof GeoImageLayer) {
+                        GeoImageLayer imageLayer = (GeoImageLayer) l;
+                        imageLayer.jumpToNextMarker();
+                        return;
+                    }
+                }
+            }));
         }
 
Index: /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 19122)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 19123)
@@ -65,5 +65,4 @@
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
-import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.util.imagery.Vector3D;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -192,17 +191,4 @@
         this.data.addImageDataUpdateListener(this);
         this.data.setLayer(this);
-        if (!ImageViewerDialog.hasInstance()) {
-            GuiHelper.runInEDTAndWait(() -> {
-                if (!ImageViewerDialog.hasInstance()) {
-                    ImageViewerDialog.createInstance();
-                }
-            });
-        }
-        if (getInvalidGeoImages().size() == data.size()) {
-            this.data.setSelectedImage(this.data.getFirstImage());
-            // We do have to wrap the EDT call in a worker call, since layers may be created in the EDT.
-            // And the layer must be added to the layer list in order for the dialog to work properly.
-            MainApplication.worker.execute(() -> GuiHelper.runInEDT(() -> ImageViewerDialog.getInstance().displayImages(this.getSelection())));
-        }
     }
 
@@ -518,5 +504,4 @@
         }
 
-        final IImageEntry<?> currentImage = ImageViewerDialog.getCurrentImage();
         for (ImageEntry e: data.getSelectedImages()) {
             if (e != null && e.getPos() != null) {
@@ -533,5 +518,5 @@
                     g.setColor(new Color(128, 0, 0, 122));
                     g.fillRect(p.x - imgDim.width / 2, p.y - imgDim.height / 2, imgDim.width, imgDim.height);
-                } else if (e.equals(currentImage)) {
+                } else if (e.equals(ImageViewerDialog.getCurrentImage())) {
                     selectedIcon.paintIcon(mv, g,
                             p.x - imgDim.width / 2,
@@ -920,4 +905,7 @@
     public void jumpToNextMarker() {
         data.setSelectedImage(data.getNextImage());
+        if (data.getSelectedImage() != null)
+            ImageViewerDialog.getInstance().displayImages(Collections.singletonList(data.getSelectedImage()));
+
     }
 
@@ -925,4 +913,6 @@
     public void jumpToPreviousMarker() {
         data.setSelectedImage(data.getPreviousImage());
+        if (data.getSelectedImage() != null)
+            ImageViewerDialog.getInstance().displayImages(Collections.singletonList(data.getSelectedImage()));
     }
 
