diff --git a/src/org/openstreetmap/josm/data/coor/ILatLon.java b/src/org/openstreetmap/josm/data/coor/ILatLon.java
index 0b1bcb40d6..7b930deca0 100644
--- a/src/org/openstreetmap/josm/data/coor/ILatLon.java
+++ b/src/org/openstreetmap/josm/data/coor/ILatLon.java
@@ -15,6 +15,11 @@ import org.openstreetmap.josm.data.projection.Projecting;
  * @since 12161
  */
 public interface ILatLon {
+    /**
+     * Minimum difference in location to not be represented as the same position.
+     * The API returns 7 decimals.
+     */
+    double MAX_SERVER_PRECISION = 1e-7;
 
     /**
      * Returns the longitude, i.e., the east-west position in degrees.
@@ -51,4 +56,28 @@ public interface ILatLon {
             return projecting.latlon2eastNorth(this);
         }
     }
+
+    /**
+     * Determines if the other point has almost the same lat/lon values.
+     * @param other other lat/lon
+     * @return <code>true</code> if the other point has almost the same lat/lon
+     * values, only differing by no more than 1 / {@link #MAX_SERVER_PRECISION MAX_SERVER_PRECISION}.
+     * @since xxx (extracted from {@link LatLon})
+     */
+    default boolean equalsEpsilon(ILatLon other) {
+        return equalsEpsilon(other, MAX_SERVER_PRECISION);
+    }
+
+    /**
+     * Determines if the other point has almost the same lat/lon values.
+     * @param other other lat/lon
+     * @param precision The precision to use
+     * @return <code>true</code> if the other point has almost the same lat/lon
+     * values, only differing by no more than 1 / {@link #MAX_SERVER_PRECISION MAX_SERVER_PRECISION}.
+     * @since xxx (extracted from {@link LatLon})
+     */
+    default boolean equalsEpsilon(ILatLon other, double precision) {
+        double p = precision / 2;
+        return Math.abs(lat()-other.lat()) <= p && Math.abs(lon()-other.lon()) <= p;
+    }
 }
diff --git a/src/org/openstreetmap/josm/data/coor/LatLon.java b/src/org/openstreetmap/josm/data/coor/LatLon.java
index dcbd54e444..6b2b5231f6 100644
--- a/src/org/openstreetmap/josm/data/coor/LatLon.java
+++ b/src/org/openstreetmap/josm/data/coor/LatLon.java
@@ -45,7 +45,7 @@ public class LatLon extends Coordinate implements ILatLon {
      * Minimum difference in location to not be represented as the same position.
      * The API returns 7 decimals.
      */
-    public static final double MAX_SERVER_PRECISION = 1e-7;
+    public static final double MAX_SERVER_PRECISION = ILatLon.MAX_SERVER_PRECISION;
     /**
      * The inverse of the server precision
      * @see #MAX_SERVER_PRECISION
@@ -185,10 +185,11 @@ public class LatLon extends Coordinate implements ILatLon {
      * @param other other lat/lon
      * @return <code>true</code> if the other point has almost the same lat/lon
      * values, only differing by no more than 1 / {@link #MAX_SERVER_PRECISION MAX_SERVER_PRECISION}.
+     * @deprecated since xxx (use {@link ILatLon#equalsEpsilon(ILatLon)} instead)
      */
+    @Deprecated
     public boolean equalsEpsilon(LatLon other) {
-        double p = MAX_SERVER_PRECISION / 2;
-        return Math.abs(lat()-other.lat()) <= p && Math.abs(lon()-other.lon()) <= p;
+        return ILatLon.super.equalsEpsilon(other);
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/data/osm/Node.java b/src/org/openstreetmap/josm/data/osm/Node.java
index 3936917229..e0b780ed22 100644
--- a/src/org/openstreetmap/josm/data/osm/Node.java
+++ b/src/org/openstreetmap/josm/data/osm/Node.java
@@ -292,9 +292,10 @@ public final class Node extends OsmPrimitive implements INode {
     }
 
     private boolean hasEqualCoordinates(Node other) {
-        final LatLon c1 = getCoor();
-        final LatLon c2 = other.getCoor();
-        return (c1 == null && c2 == null) || (c1 != null && c2 != null && c1.equalsEpsilon(c2));
+        if (this.isLatLonKnown() && other.isLatLonKnown()) {
+            return this.equalsEpsilon(other);
+        }
+        return false;
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/data/osm/NodePositionComparator.java b/src/org/openstreetmap/josm/data/osm/NodePositionComparator.java
index 96aa69af31..ce8cdb3e96 100644
--- a/src/org/openstreetmap/josm/data/osm/NodePositionComparator.java
+++ b/src/org/openstreetmap/josm/data/osm/NodePositionComparator.java
@@ -16,7 +16,7 @@ public class NodePositionComparator implements Comparator<Node>, Serializable {
     @Override
     public int compare(Node n1, Node n2) {
 
-        if (n1.getCoor().equalsEpsilon(n2.getCoor()))
+        if (n1.equalsEpsilon(n2))
             return 0;
 
         int dLat = Double.compare(n1.lat(), n2.lat());
diff --git a/test/unit/org/openstreetmap/josm/gui/datatransfer/OsmTransferHandlerTest.java b/test/unit/org/openstreetmap/josm/gui/datatransfer/OsmTransferHandlerTest.java
index 985cea6449..6954d8fe7c 100644
--- a/test/unit/org/openstreetmap/josm/gui/datatransfer/OsmTransferHandlerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/datatransfer/OsmTransferHandlerTest.java
@@ -41,14 +41,14 @@ class OsmTransferHandlerTest {
         OsmDataLayer target = new OsmDataLayer(ds2, "target", null);
 
         transferHandler.pasteOn(target, null);
-        assertTrue(n1.getCoor().equalsEpsilon(ds2.getNodes().iterator().next().getCoor()));
+        assertTrue(n1.equalsEpsilon(ds2.getNodes().iterator().next()));
 
         ds2.clear();
         assertTrue(ds2.getNodes().isEmpty());
 
         LatLon pos = new LatLon(55, -5);
         transferHandler.pasteOn(target, ProjectionRegistry.getProjection().latlon2eastNorth(pos));
-        assertTrue(pos.equalsEpsilon(ds2.getNodes().iterator().next().getCoor()));
+        assertTrue(pos.equalsEpsilon(ds2.getNodes().iterator().next()));
     }
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/io/GeoJSONReaderTest.java b/test/unit/org/openstreetmap/josm/io/GeoJSONReaderTest.java
index 9317c2be05..94eeb2bf13 100644
--- a/test/unit/org/openstreetmap/josm/io/GeoJSONReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/io/GeoJSONReaderTest.java
@@ -166,7 +166,7 @@ class GeoJSONReaderTest {
     private static boolean areEqualNodes(final OsmPrimitive p1, final OsmPrimitive p2) {
         return (p1 instanceof Node)
             && (p2 instanceof Node)
-            && ((Node) p1).getCoor().equalsEpsilon(((Node) p2).getCoor());
+            && ((Node) p1).equalsEpsilon(((Node) p2));
     }
 
     private static boolean areEqualWays(final OsmPrimitive p1, final OsmPrimitive p2) {
