Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java	(revision 18145)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java	(revision 18150)
@@ -22,4 +22,5 @@
 import java.io.IOException;
 import java.util.Objects;
+import java.util.concurrent.Future;
 
 import javax.swing.JComponent;
@@ -635,11 +636,10 @@
      * Sets a new source image to be displayed by this {@code ImageDisplay}.
      * @param entry new source image
-     * @since 13220
+     * @return a {@link Future} representing pending completion of the image loading task
+     * @since 18150
      */
-    public void setImage(ImageEntry entry) {
+    public Future<?> setImage(ImageEntry entry) {
         LoadImageRunnable runnable = setImage0(entry);
-        if (runnable != null) {
-            MainApplication.worker.execute(runnable);
-        }
+        return runnable != null ? MainApplication.worker.submit(runnable) : null;
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 18145)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 18150)
@@ -19,4 +19,5 @@
 import java.util.List;
 import java.util.Optional;
+import java.util.concurrent.Future;
 
 import javax.swing.AbstractAction;
@@ -73,4 +74,5 @@
 
     private final ImageDisplay imgDisplay = new ImageDisplay(imageryFilterSettings);
+    private Future<?> imgLoadingFuture;
     private boolean centerView;
 
@@ -205,4 +207,5 @@
         imageRemoveFromDiskAction.destroy();
         imageZoomAction.destroy();
+        cancelLoadingImage();
         super.destroy();
         dialog = null;
@@ -467,7 +470,8 @@
 
             if (imageChanged) {
+                cancelLoadingImage();
                 // Set only if the image is new to preserve zoom and position if the same image is redisplayed
                 // (e.g. to update the OSD).
-                imgDisplay.setImage(entry);
+                imgLoadingFuture = imgDisplay.setImage(entry);
             }
             setTitle(tr("Geotagged Images") + (!entry.getDisplayName().isEmpty() ? " - " + entry.getDisplayName() : ""));
@@ -628,4 +632,11 @@
     }
 
+    private void cancelLoadingImage() {
+        if (imgLoadingFuture != null) {
+            imgLoadingFuture.cancel(false);
+            imgLoadingFuture = null;
+        }
+    }
+
     @Override
     public void selectedImageChanged(ImageData data) {
Index: trunk/src/org/openstreetmap/josm/gui/progress/swing/ProgressMonitorExecutor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/progress/swing/ProgressMonitorExecutor.java	(revision 18145)
+++ trunk/src/org/openstreetmap/josm/gui/progress/swing/ProgressMonitorExecutor.java	(revision 18150)
@@ -49,5 +49,5 @@
                 ((Future<?>) r).get();
             } catch (CancellationException cancellationException) {
-                t = cancellationException;
+                Logging.debug("Thread {0} raised {1}", Thread.currentThread().getName(), cancellationException);
             } catch (ExecutionException executionException) {
                 Logging.trace(executionException);
