diff --git a/src/org/openstreetmap/josm/data/imagery/Shape.java b/src/org/openstreetmap/josm/data/imagery/Shape.java
index 9e7fa16076..81783e87b7 100644
--- a/src/org/openstreetmap/josm/data/imagery/Shape.java
+++ b/src/org/openstreetmap/josm/data/imagery/Shape.java
@@ -1,6 +1,8 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.imagery;
 
+import static org.openstreetmap.josm.tools.I18n.tr;
+
 import java.awt.Polygon;
 import java.text.MessageFormat;
 import java.util.AbstractList;
@@ -13,8 +15,6 @@ import org.openstreetmap.gui.jmapviewer.Coordinate;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
-import static org.openstreetmap.josm.tools.I18n.tr;
-
 /**
  * Data class to store the outline for background imagery coverage.
  *
@@ -85,6 +85,12 @@ public class Shape {
         };
     }
 
+    /**
+     * Check if the coordinates are inside this shape.
+     * @see Polygon#contains(int, int)
+     * @param latlon The latlon to look for
+     * @return {@code true} if the LatLon is inside the shape.
+     */
     public boolean contains(LatLon latlon) {
         return coords.contains(
                 latlon.getX() * LatLon.MAX_SERVER_INV_PRECISION,
@@ -128,7 +134,38 @@ public class Shape {
         if (this == obj) return true;
         if (obj == null || getClass() != obj.getClass()) return false;
         Shape shape = (Shape) obj;
-        return Objects.equals(getPoints(), shape.getPoints());
+        return Objects.equals(getPoints(), shape.getPoints()) || checkPointsEqualEpsilon(getPoints(), shape.getPoints());
+    }
+
+    /**
+     * Check if two point lists are equal to OSM precision
+     * @param pointsOne The first list of points
+     * @param pointsTwo The second list of points
+     * @return {@code true} if they are equal within OSM precision
+     */
+    private static boolean checkPointsEqualEpsilon(List<Coordinate> pointsOne, List<Coordinate> pointsTwo) {
+        if (pointsOne.size() == pointsTwo.size()) {
+            for (int i = 0; i < pointsOne.size(); i++) {
+                final Coordinate one = pointsOne.get(i);
+                final Coordinate two = pointsTwo.get(i);
+                if (!one.equals(two) &&
+                        !equalsEpsilon(one.getLat(), two.getLat()) && !equalsEpsilon(one.getLon(), two.getLon())) {
+                    return false;
+                }
+            }
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Check if two doubles are equal based off of {@link LatLon#MAX_SERVER_PRECISION}
+     * @param first The first double
+     * @param second The second double
+     * @return {@code true} if they are equal to OSM precision
+     */
+    private static boolean equalsEpsilon(final double first, final double second) {
+        return Math.abs(first - second) < LatLon.MAX_SERVER_PRECISION;
     }
 
     @Override
