Index: src/org/openstreetmap/josm/actions/OpenFileAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/OpenFileAction.java	(revision 19106)
+++ src/org/openstreetmap/josm/actions/OpenFileAction.java	(working copy)
@@ -6,6 +6,7 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 import static org.openstreetmap.josm.tools.I18n.trn;
 
+import java.awt.GraphicsEnvironment;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 import java.io.BufferedReader;
@@ -42,6 +43,8 @@
 import org.openstreetmap.josm.gui.io.importexport.AllFormatsImporter;
 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;
 import org.openstreetmap.josm.gui.widgets.FileChooserManager;
@@ -273,6 +276,7 @@
         @Override
         protected void realRun() throws SAXException, IOException, OsmTransferException {
             if (Utils.isEmpty(files)) return;
+            List<Layer> oldLayers = MainApplication.getLayerManager().getLayers();
 
             /*
              * Find the importer with the chosen file filter
@@ -377,8 +381,29 @@
                 int maxsize = Math.max(0, Config.getPref().getInt("file-open.history.max-size", 15));
                 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;
+                    }
+                }
+            }));
+        }
+
         /**
          * Import data files with the given importer.
          * @param importer file importer
Index: src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 19106)
+++ src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(working copy)
@@ -64,7 +64,6 @@
 import org.openstreetmap.josm.gui.layer.JumpToMarkerActions.JumpToPreviousMarker;
 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;
 import org.openstreetmap.josm.tools.ListenerList;
@@ -191,19 +190,6 @@
         this.useThumbs = useThumbs;
         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())));
-        }
     }
 
     private final class ImageMouseListener extends MouseAdapter {
@@ -517,7 +503,6 @@
             }
         }
 
-        final IImageEntry<?> currentImage = ImageViewerDialog.getCurrentImage();
         for (ImageEntry e: data.getSelectedImages()) {
             if (e != null && e.getPos() != null) {
                 Point p = mv.getPoint(e.getPos());
@@ -532,7 +517,7 @@
                 if (useThumbs && e.hasThumbnail()) {
                     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,
                             p.y - imgDim.height / 2);
@@ -919,11 +904,16 @@
     @Override
     public void jumpToNextMarker() {
         data.setSelectedImage(data.getNextImage());
+        if (data.getSelectedImage() != null)
+            ImageViewerDialog.getInstance().displayImages(Collections.singletonList(data.getSelectedImage()));
+
     }
 
     @Override
     public void jumpToPreviousMarker() {
         data.setSelectedImage(data.getPreviousImage());
+        if (data.getSelectedImage() != null)
+            ImageViewerDialog.getInstance().displayImages(Collections.singletonList(data.getSelectedImage()));
     }
 
     /**
