Index: src/org/openstreetmap/josm/data/ImageData.java
===================================================================
--- src/org/openstreetmap/josm/data/ImageData.java	(revision 17577)
+++ src/org/openstreetmap/josm/data/ImageData.java	(working copy)
@@ -59,11 +59,11 @@
         if (data != null) {
             Collections.sort(data);
             this.data = data;
+            this.data.forEach(image -> image.setDataSet(this));
         } else {
             this.data = new ArrayList<>();
         }
         this.geoImages.addAll(this.data);
-        data.forEach(image -> image.setDataSet(this));
         selectedImagesIndex.add(-1);
     }
 
Index: src/org/openstreetmap/josm/data/gpx/GpxImageCorrelation.java
===================================================================
--- src/org/openstreetmap/josm/data/gpx/GpxImageCorrelation.java	(revision 17577)
+++ src/org/openstreetmap/josm/data/gpx/GpxImageCorrelation.java	(working copy)
@@ -240,6 +240,8 @@
                     }
                     curTmp.setGpsTime(new Date(curImg.getExifTime().getTime() - offset));
                     curTmp.flagNewGpsData();
+                    curImg.tmpUpdated();
+
                     ret++;
                 }
                 i--;
@@ -264,6 +266,7 @@
                     }
                     curTmp.setGpsTime(new Date(curImg.getExifTime().getTime() - offset));
                     curTmp.flagNewGpsData();
+                    curImg.tmpUpdated();
 
                     ret++;
                 }
Index: src/org/openstreetmap/josm/data/gpx/GpxImageEntry.java
===================================================================
--- src/org/openstreetmap/josm/data/gpx/GpxImageEntry.java	(revision 17577)
+++ src/org/openstreetmap/josm/data/gpx/GpxImageEntry.java	(working copy)
@@ -508,6 +508,7 @@
             isNewGpsData = tmp.isNewGpsData;
             tmp = null;
         }
+        tmpUpdated();
     }
 
     /**
@@ -516,6 +517,7 @@
      */
     public void discardTmp() {
         tmp = null;
+        tmpUpdated();
     }
 
     /**
@@ -548,6 +550,15 @@
         isNewGpsData = true;
    }
 
+    /**
+     * Indicate that the temporary copy has been updated. Mostly used to prevent UI issues.
+     * By default, this is a no-op. Override when needed in subclasses.
+     * @since xxx
+     */
+    protected void tmpUpdated() {
+        // No-op by default
+    }
+
     @Override
     public BBox getBBox() {
         // new BBox(LatLon) is null safe.
Index: src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java	(revision 17577)
+++ src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java	(working copy)
@@ -32,6 +32,7 @@
     public ImageEntry(ImageEntry other) {
         super(other);
         thumbnail = other.thumbnail;
+        dataSet = other.dataSet;
     }
 
     /**
@@ -77,21 +78,13 @@
     }
 
     @Override
-    public void applyTmp() {
-        super.applyTmp();
+    protected void tmpUpdated() {
+        super.tmpUpdated();
         if (this.dataSet != null) {
             this.dataSet.fireNodeMoved(this);
         }
     }
 
-    @Override
-    public void discardTmp() {
-        super.discardTmp();
-        if (this.dataSet != null) {
-            this.dataSet.fireNodeMoved(this);
-        }
-    }
-
     /**
      * Set the dataset for this image
      * @param imageData The dataset
@@ -122,6 +115,6 @@
         if (!super.equals(obj) || getClass() != obj.getClass())
             return false;
         ImageEntry other = (ImageEntry) obj;
-        return Objects.equals(thumbnail, other.thumbnail);
+        return Objects.equals(thumbnail, other.thumbnail) && Objects.equals(dataSet, other.dataSet);
     }
 }
