Index: src/org/openstreetmap/josm/actions/OpenFileAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/OpenFileAction.java	(revision 19104)
+++ 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;
@@ -23,6 +24,7 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.Future;
 import java.util.regex.Matcher;
@@ -41,7 +43,10 @@
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.io.importexport.AllFormatsImporter;
 import org.openstreetmap.josm.gui.io.importexport.FileImporter;
+import org.openstreetmap.josm.gui.io.importexport.ImageImporter;
 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;
@@ -293,6 +298,7 @@
                 chosenImporter = null;
             }
             getProgressMonitor().setTicksCount(files.size());
+            boolean openImageViewerDialog = false;
 
             if (chosenImporter != null) {
                 // The importer was explicitly chosen, so use it.
@@ -345,8 +351,9 @@
                 List<FileImporter> importers = new ArrayList<>(importerMap.keySet());
                 Collections.sort(importers);
                 Collections.reverse(importers);
-
                 for (FileImporter importer : importers) {
+                    if (importer instanceof ImageImporter)
+                        openImageViewerDialog = true;
                     importData(importer, new ArrayList<>(importerMap.get(importer)));
                 }
 
@@ -377,8 +384,24 @@
                 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 (openImageViewerDialog && !GraphicsEnvironment.isHeadless()) {
+                showFirstImage();
+            }
         }
 
+        private static void showFirstImage() {
+            // 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(() -> {
+                Optional<Layer> l = MainApplication.getLayerManager().getLayers().stream()
+                        .filter(GeoImageLayer.class::isInstance).findFirst();
+                if (l.isPresent()) {
+                    GeoImageLayer imageLayer = (GeoImageLayer) l.get();
+                    GuiHelper.runInEDT(imageLayer::showFirstImage);
+                }
+            });
+        }
+
         /**
          * 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 19104)
+++ src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(working copy)
@@ -15,6 +15,7 @@
 import java.awt.Point;
 import java.awt.Rectangle;
 import java.awt.RenderingHints;
+import java.awt.event.ActionEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseMotionAdapter;
@@ -30,6 +31,7 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
+import javax.swing.AbstractAction;
 import javax.swing.Action;
 import javax.swing.Icon;
 import javax.swing.ImageIcon;
@@ -64,7 +66,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;
@@ -89,6 +90,7 @@
     GpxData gpxFauxData;
 
     private CorrelateGpxWithImages gpxCorrelateAction;
+    private ShowImageAction showImageAction;
 
     private final Icon icon = ImageProvider.get("dialogs/geoimage/photo-marker");
     private final Icon selectedIcon = ImageProvider.get("dialogs/geoimage/photo-marker-selected");
@@ -191,19 +193,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 {
@@ -348,6 +337,7 @@
         entries.add(SeparatorLayerAction.INSTANCE);
         entries.add(new JumpToNextMarker(this));
         entries.add(new JumpToPreviousMarker(this));
+        entries.add(getShowImageAction());
         entries.add(SeparatorLayerAction.INSTANCE);
         entries.add(new LayerListPopup.InfoAction(this));
 
@@ -517,6 +507,9 @@
             }
         }
 
+        if (!ImageViewerDialog.hasInstance())
+            return;
+        
         final IImageEntry<?> currentImage = ImageViewerDialog.getCurrentImage();
         for (ImageEntry e: data.getSelectedImages()) {
             if (e != null && e.getPos() != null) {
@@ -997,4 +990,43 @@
                 .sorted(Comparator.comparing(ImageEntry::getExifInstant))
                 .collect(toList());
     }
+
+    private class ShowImageAction extends AbstractAction {
+        ShowImageAction() {
+            super(tr("Show image"), ImageProvider.get("dialogs/geoimage", ImageProvider.ImageSizes.MENU));
+            setEnabled(true);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            if (getSelection().isEmpty())
+                showFirstImage();
+            else
+                ImageViewerDialog.getInstance().displayImages(getSelection());
+        }
+    }
+
+    /**
+     * Returns the showImageAction
+     * 
+     * @return the showImageAction
+     */
+    private ShowImageAction getShowImageAction() {
+        if (showImageAction == null) {
+            showImageAction = new ShowImageAction();
+        }
+        return showImageAction;
+    }
+
+    /**
+     * Open ImageViewerDialog with the first image in layer (if available).
+     * 
+     * @since xxx
+     */
+    public void showFirstImage() {
+        if (data != null && !data.getImages().isEmpty()) {
+            data.setSelectedImage(data.getFirstImage());
+            ImageViewerDialog.getInstance().displayImages(getSelection());
+        }
+    }
 }
