Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/RemoteEntry.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/RemoteEntry.java	(revision 18621)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/RemoteEntry.java	(revision 18622)
@@ -331,3 +331,41 @@
         this.title = text;
     }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(this.uri, this.width, this.height, this.pos,
+                this.exifOrientation, this.elevation, this.speed, this.exifImgDir,
+                this.exifCoor, this.exifTime, this.exifGpsTime, this.gpsTime,
+                this.iptcObjectName, this.iptcCaption, this.iptcHeadline, this.iptcKeywords,
+                this.projection, this.title);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (super.equals(obj)) {
+            return true;
+        }
+        if (obj != null && obj.getClass() == this.getClass()) {
+            RemoteEntry other = this.getClass().cast(obj);
+            return Objects.equals(this.uri, other.uri)
+                    && this.height == other.height
+                    && this.width == other.width
+                    && Objects.equals(this.elevation, other.elevation)
+                    && Objects.equals(this.exifCoor, other.exifCoor)
+                    && Objects.equals(this.exifGpsTime, other.exifGpsTime)
+                    && Objects.equals(this.exifImgDir, other.exifImgDir)
+                    && Objects.equals(this.exifOrientation, other.exifOrientation)
+                    && Objects.equals(this.exifTime, other.exifTime)
+                    && Objects.equals(this.gpsTime, other.gpsTime)
+                    && Objects.equals(this.iptcCaption, other.iptcCaption)
+                    && Objects.equals(this.iptcHeadline, other.iptcHeadline)
+                    && Objects.equals(this.iptcKeywords, other.iptcKeywords)
+                    && Objects.equals(this.iptcObjectName, other.iptcObjectName)
+                    && Objects.equals(this.pos, other.pos)
+                    && Objects.equals(this.projection, other.projection)
+                    && Objects.equals(this.speed, other.speed)
+                    && Objects.equals(this.title, other.title);
+        }
+        return false;
+    }
 }
Index: trunk/test/unit/org/openstreetmap/josm/gui/layer/geoimage/RemoteEntryTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/layer/geoimage/RemoteEntryTest.java	(revision 18622)
+++ trunk/test/unit/org/openstreetmap/josm/gui/layer/geoimage/RemoteEntryTest.java	(revision 18622)
@@ -0,0 +1,29 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer.geoimage;
+
+import java.net.URI;
+import java.util.Objects;
+import java.util.function.Supplier;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Test class for {@link RemoteEntry}
+ */
+class RemoteEntryTest {
+    @Test
+    void testHashCodeEquals() {
+        RemoteEntry remoteEntryA = new RemoteEntry(URI.create("https://somewhere.com/image.png?hash=a"),
+                () -> null, () -> null, () -> null, () -> null);
+        RemoteEntry remoteEntryB = new RemoteEntry(URI.create("https://somewhere.com/image.png?hash=b"),
+                () -> null, () -> null, () -> null, () -> null);
+        EqualsVerifier.simple().forClass(RemoteEntry.class).usingGetClass()
+                .withIgnoredFields("firstImage", "lastImage", "nextImage", "previousImage")
+                .withNonnullFields("uri")
+                .withPrefabValues(RemoteEntry.class, remoteEntryA, remoteEntryB)
+                .withGenericPrefabValues(Supplier.class,
+                        a -> () -> new RemoteEntry(URI.create("https://somewhere.com/image.png?hash=" + Objects.hash(a)),
+                                () -> null, () -> null, () -> null, () -> null)).verify();
+    }
+}
