diff --git a/src/org/openstreetmap/josm/actions/AddNodeAction.java b/src/org/openstreetmap/josm/actions/AddNodeAction.java
index 5cc050f..8130bf2 100644
--- a/src/org/openstreetmap/josm/actions/AddNodeAction.java
+++ b/src/org/openstreetmap/josm/actions/AddNodeAction.java
@@ -66,7 +66,7 @@ public final class AddNodeAction extends JosmAction {
         Main.main.undoRedo.add(new AddCommand(nnew));
         getLayerManager().getEditDataSet().setSelected(nnew);
         if (Main.map.mapView != null) {
-            if (Main.map.mapView.getRealBounds().contains(nnew.getCoor())) {
+            if (Main.map.mapView.getRealBounds().contains(nnew)) {
                 Main.map.mapView.repaint();
             } else {
                 AutoScaleAction.zoomTo(Collections.<OsmPrimitive>singleton(nnew));
diff --git a/src/org/openstreetmap/josm/actions/CopyCoordinatesAction.java b/src/org/openstreetmap/josm/actions/CopyCoordinatesAction.java
index f13f2db..e07dfa1 100644
--- a/src/org/openstreetmap/josm/actions/CopyCoordinatesAction.java
+++ b/src/org/openstreetmap/josm/actions/CopyCoordinatesAction.java
@@ -30,9 +30,9 @@ public class CopyCoordinatesAction extends JosmAction {
     public void actionPerformed(ActionEvent ae) {
         StringBuilder s = new StringBuilder();
         for (Node n : getSelectedNodes()) {
-            s.append(n.getCoor().lat());
+            s.append(n.lat());
             s.append(", ");
-            s.append(n.getCoor().lon());
+            s.append(n.lon());
             s.append('\n');
         }
         ClipboardUtils.copyString(s.toString().trim());
diff --git a/src/org/openstreetmap/josm/actions/SimplifyWayAction.java b/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
index 8a979c3..c828c68 100644
--- a/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
+++ b/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
@@ -227,9 +227,8 @@ public class SimplifyWayAction extends JosmAction {
         for (int i = from + 1; i < to; i++) {
             Node n = wnew.get(i);
             double xte = Math.abs(Ellipsoid.WGS84.a
-                    * xtd(fromN.getCoor().lat() * Math.PI / 180, fromN.getCoor().lon() * Math.PI / 180, toN.getCoor().lat() * Math.PI
-                            / 180, toN.getCoor().lon() * Math.PI / 180, n.getCoor().lat() * Math.PI / 180, n.getCoor().lon() * Math.PI
-                            / 180));
+                    * xtd(fromN.lat() * Math.PI / 180, fromN.lon() * Math.PI / 180, toN.lat() * Math.PI / 180,
+                            toN.lon() * Math.PI / 180,     n.lat() * Math.PI / 180,   n.lon() * Math.PI / 180));
             if (xte > xtemax) {
                 xtemax = xte;
                 imax = i;
diff --git a/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java b/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
index ca1ede9..7f3ba05 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
@@ -1062,12 +1062,13 @@ public class ExtrudeAction extends MapMode implements MapViewPaintable, KeyPress
                     }
                 } else if (mode == Mode.translate || mode == Mode.translate_node) {
                     g2.setColor(mainColor);
-                    if (p1.distance(p2) < 3) {
+                    MapViewPath line = new MapViewPath(mv.getState()).moveTo(p1).lineTo(p2);
+                    if (line.getBounds2D().getWidth() < 3 && line.getBounds2D().getHeight() < 3) {
                         g2.setStroke(mainStroke);
-                        g2.draw(new MapViewPath(mv.getState()).shapeAround(p1, SymbolShape.CIRCLE, symbolSize));
+                        g2.draw(new MapViewPath(mv.getState()).shapeAround(p1.interpolate(p2, .5), SymbolShape.CIRCLE, symbolSize));
                     } else {
                         g2.setStroke(oldLineStroke);
-                        g2.draw(new MapViewPath(mv.getState()).moveTo(p1).lineTo(p2));
+                        g2.draw(line);
                     }
 
                     if (dualAlignActive) {
diff --git a/src/org/openstreetmap/josm/data/Bounds.java b/src/org/openstreetmap/josm/data/Bounds.java
index 5cdbd0e..9c8c620 100644
--- a/src/org/openstreetmap/josm/data/Bounds.java
+++ b/src/org/openstreetmap/josm/data/Bounds.java
@@ -9,6 +9,7 @@ import java.text.MessageFormat;
 import java.util.Objects;
 import java.util.function.Consumer;
 
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.BBox;
 import org.openstreetmap.josm.data.projection.Projection;
@@ -345,10 +346,27 @@ public class Bounds {
 
     /**
      * Determines if the given point {@code ll} is within these bounds.
+     * <p>
+     * Points with unknown coordinates are always outside the coordinates.
      * @param ll The lat/lon to check
      * @return {@code true} if {@code ll} is within these bounds, {@code false} otherwise
      */
     public boolean contains(LatLon ll) {
+        // binary compatibility
+        return contains((ILatLon) ll);
+    }
+
+    /**
+     * Determines if the given point {@code ll} is within these bounds.
+     * <p>
+     * Points with unknown coordinates are always outside the coordinates.
+     * @param ll The lat/lon to check
+     * @return {@code true} if {@code ll} is within these bounds, {@code false} otherwise
+     */
+    public boolean contains(ILatLon ll) {
+        if (!ll.isLatLonKnown()) {
+            return false;
+        }
         if (ll.lat() < minLat || ll.lat() > maxLat)
             return false;
         if (crosses180thMeridian()) {
diff --git a/src/org/openstreetmap/josm/data/coor/CachedLatLon.java b/src/org/openstreetmap/josm/data/coor/CachedLatLon.java
index 12ee12b..36cc364 100644
--- a/src/org/openstreetmap/josm/data/coor/CachedLatLon.java
+++ b/src/org/openstreetmap/josm/data/coor/CachedLatLon.java
@@ -4,7 +4,7 @@ package org.openstreetmap.josm.data.coor;
 import java.util.Objects;
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.data.projection.Projecting;
 
 /**
  * LatLon class that maintains a cache of projected EastNorth coordinates.
@@ -19,7 +19,7 @@ public class CachedLatLon extends LatLon {
     private static final long serialVersionUID = 1L;
 
     private EastNorth eastNorth;
-    private transient Projection proj;
+    private transient Object proj;
 
     /**
      * Constructs a new {@code CachedLatLon}.
@@ -45,7 +45,7 @@ public class CachedLatLon extends LatLon {
      */
     public CachedLatLon(EastNorth eastNorth) {
         super(Main.getProjection().eastNorth2latlon(eastNorth));
-        proj = Main.getProjection();
+        proj = Main.getProjection().getCacheKey();
         this.eastNorth = eastNorth;
     }
 
@@ -54,10 +54,11 @@ public class CachedLatLon extends LatLon {
      *
      * @return the internally cached east/north coordinates. null, if the globally defined projection is null
      */
-    public final EastNorth getEastNorth() {
-        if (!Objects.equals(proj, Main.getProjection())) {
-            proj = Main.getProjection();
-            eastNorth = proj.latlon2eastNorth(this);
+    @Override
+    public final EastNorth getEastNorth(Projecting projecting) {
+        if (!Objects.equals(proj, projecting.getCacheKey())) {
+            proj = projecting.getCacheKey();
+            eastNorth = projecting.latlon2eastNorth(this);
         }
         return eastNorth;
     }
diff --git a/src/org/openstreetmap/josm/data/coor/ILatLon.java b/src/org/openstreetmap/josm/data/coor/ILatLon.java
new file mode 100644
index 0000000..8447e68
--- /dev/null
+++ b/src/org/openstreetmap/josm/data/coor/ILatLon.java
@@ -0,0 +1,62 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.coor;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.projection.Projecting;
+
+/**
+ * This interface represents a coordinate in LatLon space.
+ * <p>
+ * It provides methods to get the coordinates. The coordinates may be unknown.
+ * In this case, both {@link #lat()} and {@link #lon()} need to return a NaN value and {@link #isLatLonKnown()} needs to return false.
+ * <p>
+ * Whether the coordinates are immutable or not is implementation specific.
+ *
+ * @author Michael Zangl
+ * @since xxx
+ */
+public interface ILatLon {
+
+    /**
+     * Returns the longitude, i.e., the east-west position in degrees.
+     * @return the longitude or NaN if {@link #isLatLonKnown()} returns false
+     */
+    public double lon();
+
+    /**
+     * Returns the latitude, i.e., the north-south position in degrees.
+     * @return the latitude or NaN if {@link #isLatLonKnown()} returns false
+     */
+    public double lat();
+
+    /**
+     * Determines if this object has valid coordinates.
+     * @return {@code true} if this object has valid coordinates
+     */
+    default boolean isLatLonKnown() {
+        return !Double.isNaN(lat()) && !Double.isNaN(lon());
+    }
+
+    /**
+     * <p>Replies the projected east/north coordinates.</p>
+     *
+     * <p>Uses the {@link Main#getProjection() global projection} to project the lan/lon-coordinates.</p>
+     *
+     * @return the east north coordinates or {@code null} if #is
+     */
+    default EastNorth getEastNorth() {
+        return getEastNorth(Main.getProjection());
+    }
+
+    /**
+     * Replies the projected east/north coordinates.
+     * <p>
+     * The result of the last conversion is cached. The cache object is used as cache key.
+     * @param projecting The projection to use.
+     * @return The projected east/north coordinates
+     * @since 10827
+     */
+    default EastNorth getEastNorth(Projecting projecting) {
+        return projecting.latlon2eastNorth(this);
+    }
+}
diff --git a/src/org/openstreetmap/josm/data/coor/LatLon.java b/src/org/openstreetmap/josm/data/coor/LatLon.java
index 2a7e628..f6257e9 100644
--- a/src/org/openstreetmap/josm/data/coor/LatLon.java
+++ b/src/org/openstreetmap/josm/data/coor/LatLon.java
@@ -38,7 +38,7 @@ import org.openstreetmap.josm.tools.Utils;
  *
  * @author Imi
  */
-public class LatLon extends Coordinate {
+public class LatLon extends Coordinate implements ILatLon {
 
     private static final long serialVersionUID = 1L;
 
@@ -213,7 +213,11 @@ public class LatLon extends Coordinate {
         super(lon, lat);
     }
 
-    protected LatLon(LatLon coor) {
+    /**
+     * Creates a new LatLon object for the given coordinate
+     * @param coor The coordinates to copy from.
+     */
+    public LatLon(ILatLon coor) {
         super(coor.lon(), coor.lat());
     }
 
@@ -225,10 +229,7 @@ public class LatLon extends Coordinate {
         this(coor.getLat(), coor.getLon());
     }
 
-    /**
-     * Returns the latitude, i.e., the north-south position in degrees.
-     * @return the latitude
-     */
+    @Override
     public double lat() {
         return y;
     }
@@ -251,10 +252,7 @@ public class LatLon extends Coordinate {
         }
     }
 
-    /**
-     * Returns the longitude, i.e., the east-west position in degrees.
-     * @return the longitude
-     */
+    @Override
     public double lon() {
         return x;
     }
diff --git a/src/org/openstreetmap/josm/data/osm/BBox.java b/src/org/openstreetmap/josm/data/osm/BBox.java
index a5c5d78..e4bafc9 100644
--- a/src/org/openstreetmap/josm/data/osm/BBox.java
+++ b/src/org/openstreetmap/josm/data/osm/BBox.java
@@ -5,6 +5,7 @@ import java.awt.geom.Rectangle2D;
 import java.util.Arrays;
 import java.util.Objects;
 
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.coor.QuadTiling;
 import org.openstreetmap.josm.tools.Utils;
@@ -75,24 +76,23 @@ public class BBox {
 
     public BBox(Way w) {
         for (Node n : w.getNodes()) {
-            LatLon coor = n.getCoor();
-            if (coor == null) {
-                continue;
-            }
-            add(coor);
+            add(n);
         }
     }
 
-    public BBox(Node n) {
-        LatLon coor = n.getCoor();
-        if (coor == null) {
+    public BBox(ILatLon n) {
+        if (!n.isLatLonKnown()) {
             xmin = xmax = ymin = ymax = 0;
         } else {
-            xmin = xmax = coor.lon();
-            ymin = ymax = coor.lat();
+            xmin = xmax = n.lon();
+            ymin = ymax = n.lat();
         }
     }
 
+    public BBox(Node n) {
+        this((ILatLon) n);
+    }
+
     private void sanity() {
         if (xmin < -180.0) {
             xmin = -180.0;
@@ -112,6 +112,12 @@ public class BBox {
         add(c.lon(), c.lat());
     }
 
+    public final void add(ILatLon c) {
+        if (c.isLatLonKnown()) {
+            add(c.lon(), c.lat());
+        }
+    }
+
     /**
      * Extends this bbox to include the point (x, y)
      * @param x X coordinate
diff --git a/src/org/openstreetmap/josm/data/osm/INode.java b/src/org/openstreetmap/josm/data/osm/INode.java
index b9b43c5..02d7b8a 100644
--- a/src/org/openstreetmap/josm/data/osm/INode.java
+++ b/src/org/openstreetmap/josm/data/osm/INode.java
@@ -2,13 +2,14 @@
 package org.openstreetmap.josm.data.osm;
 
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 
 /**
  * INode captures the common functions of {@link Node} and {@link NodeData}.
  * @since 4098
  */
-public interface INode extends IPrimitive {
+public interface INode extends IPrimitive, ILatLon {
 
     /**
      * Returns lat/lon coordinates of this node.
@@ -23,12 +24,6 @@ public interface INode extends IPrimitive {
     void setCoor(LatLon coor);
 
     /**
-     * Returns east/north coordinates of this node.
-     * @return east/north coordinates of this node
-     */
-    EastNorth getEastNorth();
-
-    /**
      * Sets east/north coordinates of this node.
      * @param eastNorth east/north coordinates of this node
      */
diff --git a/src/org/openstreetmap/josm/data/osm/Node.java b/src/org/openstreetmap/josm/data/osm/Node.java
index cb753f0..80e302e 100644
--- a/src/org/openstreetmap/josm/data/osm/Node.java
+++ b/src/org/openstreetmap/josm/data/osm/Node.java
@@ -12,7 +12,7 @@ import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor;
 import org.openstreetmap.josm.data.osm.visitor.Visitor;
-import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.data.projection.Projecting;
 import org.openstreetmap.josm.data.projection.Projections;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Utils;
@@ -45,7 +45,9 @@ public final class Node extends OsmPrimitive implements INode {
      * @return {@code true} if this node has valid coordinates
      * @since 7828
      */
+    @Override
     public boolean isLatLonKnown() {
+        // We cannot use default implementation - if we remove this implementation, we will break binary compatibility.
         return !Double.isNaN(lat) && !Double.isNaN(lon);
     }
 
@@ -74,36 +76,25 @@ public final class Node extends OsmPrimitive implements INode {
 
     @Override
     public LatLon getCoor() {
-        if (!isLatLonKnown()) return null;
-        return new LatLon(lat, lon);
+        if (!isLatLonKnown()) {
+            return null;
+        } else {
+            return new LatLon(lat, lon);
+        }
     }
 
-    /**
-     * <p>Replies the projected east/north coordinates.</p>
-     *
-     * <p>Uses the {@link Main#getProjection() global projection} to project the lan/lon-coordinates.
-     * Internally caches the projected coordinates.</p>
-     *
-     * <p>Replies {@code null} if this node doesn't know lat/lon-coordinates, i.e. because it is an incomplete node.
-     *
-     * @return the east north coordinates or {@code null}
-     * @see #invalidateEastNorthCache()
-     *
-     */
     @Override
-    public EastNorth getEastNorth() {
-        return getEastNorth(Main.getProjection());
+    public double lat() {
+        return lat;
     }
 
-    /**
-     * Replies the projected east/north coordinates.
-     * <p>
-     * The result of the last conversion is cached. The cache object is used as cache key.
-     * @param projection The projection to use.
-     * @return The projected east/north coordinates
-     * @since 10827
-     */
-    public EastNorth getEastNorth(Projection projection) {
+    @Override
+    public double lon() {
+        return lon;
+    }
+
+    @Override
+    public EastNorth getEastNorth(Projecting projection) {
         if (!isLatLonKnown()) return null;
 
         if (Double.isNaN(east) || Double.isNaN(north) || !Objects.equals(projection.getCacheKey(), eastNorthCacheKey)) {
diff --git a/src/org/openstreetmap/josm/data/osm/NodeData.java b/src/org/openstreetmap/josm/data/osm/NodeData.java
index 650ab19..d3a0578 100644
--- a/src/org/openstreetmap/josm/data/osm/NodeData.java
+++ b/src/org/openstreetmap/josm/data/osm/NodeData.java
@@ -31,7 +31,18 @@ public class NodeData extends PrimitiveData implements INode {
         setCoor(data.getCoor());
     }
 
-    private boolean isLatLonKnown() {
+    @Override
+    public double lat() {
+        return lat;
+    }
+
+    @Override
+    public double lon() {
+        return lon;
+    }
+
+    @Override
+    public boolean isLatLonKnown() {
         return !Double.isNaN(lat) && !Double.isNaN(lon);
     }
 
diff --git a/src/org/openstreetmap/josm/data/osm/NodePositionComparator.java b/src/org/openstreetmap/josm/data/osm/NodePositionComparator.java
index a6b0312..96aa69a 100644
--- a/src/org/openstreetmap/josm/data/osm/NodePositionComparator.java
+++ b/src/org/openstreetmap/josm/data/osm/NodePositionComparator.java
@@ -19,7 +19,7 @@ public class NodePositionComparator implements Comparator<Node>, Serializable {
         if (n1.getCoor().equalsEpsilon(n2.getCoor()))
             return 0;
 
-        int dLat = Double.compare(n1.getCoor().lat(), n2.getCoor().lat());
-        return dLat != 0 ? dLat : Double.compare(n1.getCoor().lon(), n2.getCoor().lon());
+        int dLat = Double.compare(n1.lat(), n2.lat());
+        return dLat != 0 ? dLat : Double.compare(n1.lon(), n2.lon());
     }
 }
diff --git a/src/org/openstreetmap/josm/data/projection/AbstractProjection.java b/src/org/openstreetmap/josm/data/projection/AbstractProjection.java
index 8129cbc..eeefb8a 100644
--- a/src/org/openstreetmap/josm/data/projection/AbstractProjection.java
+++ b/src/org/openstreetmap/josm/data/projection/AbstractProjection.java
@@ -9,6 +9,7 @@ import java.util.function.DoubleUnaryOperator;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.projection.datum.Datum;
 import org.openstreetmap.josm.data.projection.proj.Proj;
@@ -113,7 +114,7 @@ public abstract class AbstractProjection implements Projection {
     }
 
     @Override
-    public EastNorth latlon2eastNorth(LatLon ll) {
+    public EastNorth latlon2eastNorth(ILatLon ll) {
         ll = datum.fromWGS84(ll);
         double[] en = proj.project(Math.toRadians(ll.lat()), Math.toRadians(LatLon.normalizeLon(ll.lon() - lon0 - pm)));
         return new EastNorth((ellps.a * k0 * en[0] + x0) / toMeter, (ellps.a * k0 * en[1] + y0) / toMeter);
@@ -121,12 +122,13 @@ public abstract class AbstractProjection implements Projection {
 
     @Override
     public LatLon eastNorth2latlon(EastNorth en) {
+        // We know it is a latlon. Nice would be to change this method return type to ILatLon
         return eastNorth2latlon(en, LatLon::normalizeLon);
     }
 
     @Override
     public LatLon eastNorth2latlonClamped(EastNorth en) {
-        LatLon ll = eastNorth2latlon(en, lon -> Utils.clamp(lon, -180, 180));
+        ILatLon ll = eastNorth2latlon(en, lon -> Utils.clamp(lon, -180, 180));
         Bounds bounds = getWorldBoundsLatLon();
         return new LatLon(Utils.clamp(ll.lat(), bounds.getMinLat(), bounds.getMaxLat()),
                 Utils.clamp(ll.lon(), bounds.getMinLon(), bounds.getMaxLon()));
diff --git a/src/org/openstreetmap/josm/data/projection/Ellipsoid.java b/src/org/openstreetmap/josm/data/projection/Ellipsoid.java
index 4ea41db..a7e60c7 100644
--- a/src/org/openstreetmap/josm/data/projection/Ellipsoid.java
+++ b/src/org/openstreetmap/josm/data/projection/Ellipsoid.java
@@ -6,6 +6,7 @@
  */
 package org.openstreetmap.josm.data.projection;
 
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 
 /**
@@ -347,7 +348,7 @@ public final class Ellipsoid {
      * @param coord The Latitude and longitude in degrees
      * @return the corresponding (X, Y Z) cartesian coordinates in meters.
      */
-    public double[] latLon2Cart(LatLon coord) {
+    public double[] latLon2Cart(ILatLon coord) {
         double phi = Math.toRadians(coord.lat());
         double lambda = Math.toRadians(coord.lon());
 
diff --git a/src/org/openstreetmap/josm/data/projection/Projecting.java b/src/org/openstreetmap/josm/data/projection/Projecting.java
index 80d0101..6cdca12 100644
--- a/src/org/openstreetmap/josm/data/projection/Projecting.java
+++ b/src/org/openstreetmap/josm/data/projection/Projecting.java
@@ -5,6 +5,7 @@ import java.util.Map;
 
 import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 
 /**
@@ -18,11 +19,23 @@ public interface Projecting {
 
     /**
      * Convert from lat/lon to easting/northing.
+     * <p>
+     * This method exists to not break binary compatibility with old plugins
      *
      * @param ll the geographical point to convert (in WGS84 lat/lon)
      * @return the corresponding east/north coordinates
      */
-    EastNorth latlon2eastNorth(LatLon ll);
+    default EastNorth latlon2eastNorth(LatLon ll) {
+        return latlon2eastNorth((ILatLon) ll);
+    }
+
+    /**
+     * Convert from lat/lon to easting/northing. This method uses the newer {@link ILatLon} interface.
+     *
+     * @param ll the geographical point to convert (in WGS84 lat/lon)
+     * @return the corresponding east/north coordinates
+     */
+    EastNorth latlon2eastNorth(ILatLon ll);
 
     /**
      * Convert a east/north coordinate to the {@link LatLon} coordinate.
@@ -47,4 +60,13 @@ public interface Projecting {
      * @return a map of non-overlapping {@link ProjectionBounds} instances mapped to the {@link Projecting} object to use for that area.
      */
     Map<ProjectionBounds, Projecting> getProjectingsForArea(ProjectionBounds area);
+
+    /**
+     * Gets the object used as cache identifier when caching results of this projection.
+     * @return The object to use as cache key
+     * @since 10827
+     */
+    default Object getCacheKey() {
+        return this;
+    }
 }
diff --git a/src/org/openstreetmap/josm/data/projection/Projection.java b/src/org/openstreetmap/josm/data/projection/Projection.java
index e2739d1..62c7050 100644
--- a/src/org/openstreetmap/josm/data/projection/Projection.java
+++ b/src/org/openstreetmap/josm/data/projection/Projection.java
@@ -102,13 +102,4 @@ public interface Projection extends Projecting {
      * @return true if natural order of coordinates is North East, false if East North
      */
     boolean switchXY();
-
-    /**
-     * Gets the object used as cache identifier when caching results of this projection.
-     * @return The object to use as cache key
-     * @since 10827
-     */
-    default Object getCacheKey() {
-        return this;
-    }
 }
diff --git a/src/org/openstreetmap/josm/data/projection/ShiftedProjecting.java b/src/org/openstreetmap/josm/data/projection/ShiftedProjecting.java
index 3b30174..6638263 100644
--- a/src/org/openstreetmap/josm/data/projection/ShiftedProjecting.java
+++ b/src/org/openstreetmap/josm/data/projection/ShiftedProjecting.java
@@ -6,6 +6,7 @@ import java.util.Map;
 
 import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 
 /**
@@ -28,7 +29,7 @@ public class ShiftedProjecting implements Projecting {
     }
 
     @Override
-    public EastNorth latlon2eastNorth(LatLon ll) {
+    public EastNorth latlon2eastNorth(ILatLon ll) {
         return base.latlon2eastNorth(ll).add(offset);
     }
 
diff --git a/src/org/openstreetmap/josm/data/projection/datum/CentricDatum.java b/src/org/openstreetmap/josm/data/projection/datum/CentricDatum.java
index 0def3ea..fd938a1 100644
--- a/src/org/openstreetmap/josm/data/projection/datum/CentricDatum.java
+++ b/src/org/openstreetmap/josm/data/projection/datum/CentricDatum.java
@@ -1,6 +1,7 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.projection.datum;
 
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.projection.Ellipsoid;
 
@@ -15,12 +16,12 @@ public class CentricDatum extends AbstractDatum {
     }
 
     @Override
-    public LatLon toWGS84(LatLon ll) {
+    public LatLon toWGS84(ILatLon ll) {
         return Ellipsoid.WGS84.cart2LatLon(ellps.latLon2Cart(ll));
     }
 
     @Override
-    public LatLon fromWGS84(LatLon ll) {
+    public ILatLon fromWGS84(ILatLon ll) {
         return this.ellps.cart2LatLon(Ellipsoid.WGS84.latLon2Cart(ll));
     }
 
diff --git a/src/org/openstreetmap/josm/data/projection/datum/Datum.java b/src/org/openstreetmap/josm/data/projection/datum/Datum.java
index 16cf527..04a30d7 100644
--- a/src/org/openstreetmap/josm/data/projection/datum/Datum.java
+++ b/src/org/openstreetmap/josm/data/projection/datum/Datum.java
@@ -1,6 +1,7 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.projection.datum;
 
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.projection.Ellipsoid;
 
@@ -33,12 +34,12 @@ public interface Datum {
      * @param ll original lat/lon in this datum
      * @return lat/lon converted to WGS84
      */
-    LatLon toWGS84(LatLon ll);
+    LatLon toWGS84(ILatLon ll);
 
     /**
      * Convert lat/lon from {@link Ellipsoid#WGS84} to this datum.
      * @param ll original lat/lon in WGS84
      * @return converted lat/lon in this datum
      */
-    LatLon fromWGS84(LatLon ll);
+    ILatLon fromWGS84(ILatLon ll);
 }
diff --git a/src/org/openstreetmap/josm/data/projection/datum/NTV2Datum.java b/src/org/openstreetmap/josm/data/projection/datum/NTV2Datum.java
index dd427b8..fcf69c8 100644
--- a/src/org/openstreetmap/josm/data/projection/datum/NTV2Datum.java
+++ b/src/org/openstreetmap/josm/data/projection/datum/NTV2Datum.java
@@ -1,6 +1,7 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.projection.datum;
 
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.projection.Ellipsoid;
 
@@ -17,14 +18,14 @@ public class NTV2Datum extends AbstractDatum {
     }
 
     @Override
-    public LatLon toWGS84(LatLon ll) {
+    public LatLon toWGS84(ILatLon ll) {
         NTV2GridShift gs = new NTV2GridShift(ll);
         nadgrids.getShiftFile().gridShiftForward(gs);
         return new LatLon(ll.lat() + gs.getLatShiftDegrees(), ll.lon() + gs.getLonShiftPositiveEastDegrees());
     }
 
     @Override
-    public LatLon fromWGS84(LatLon ll) {
+    public ILatLon fromWGS84(ILatLon ll) {
         NTV2GridShift gs = new NTV2GridShift(ll);
         nadgrids.getShiftFile().gridShiftReverse(gs);
         return new LatLon(ll.lat() + gs.getLatShiftDegrees(), ll.lon() + gs.getLonShiftPositiveEastDegrees());
diff --git a/src/org/openstreetmap/josm/data/projection/datum/NTV2GridShift.java b/src/org/openstreetmap/josm/data/projection/datum/NTV2GridShift.java
index f38e97d..9ab56d0 100644
--- a/src/org/openstreetmap/josm/data/projection/datum/NTV2GridShift.java
+++ b/src/org/openstreetmap/josm/data/projection/datum/NTV2GridShift.java
@@ -21,7 +21,7 @@ package org.openstreetmap.josm.data.projection.datum;
 
 import java.io.Serializable;
 
-import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.projection.Ellipsoid;
 
 /**
@@ -62,7 +62,7 @@ public class NTV2GridShift implements Serializable {
      * Constructs a new {@code NTV2GridShift} from a {@code LatLon}.
      * @param p lat/lon
      */
-    public NTV2GridShift(LatLon p) {
+    public NTV2GridShift(ILatLon p) {
         setLatDegrees(p.lat());
         setLonPositiveEastDegrees(p.lon());
     }
diff --git a/src/org/openstreetmap/josm/data/projection/datum/NullDatum.java b/src/org/openstreetmap/josm/data/projection/datum/NullDatum.java
index b86a59c..24d0cdd 100644
--- a/src/org/openstreetmap/josm/data/projection/datum/NullDatum.java
+++ b/src/org/openstreetmap/josm/data/projection/datum/NullDatum.java
@@ -1,6 +1,7 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.projection.datum;
 
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.projection.Ellipsoid;
 
@@ -15,12 +16,12 @@ public class NullDatum extends AbstractDatum {
     }
 
     @Override
-    public LatLon toWGS84(LatLon ll) {
-        return ll;
+    public LatLon toWGS84(ILatLon ll) {
+        return new LatLon(ll);
     }
 
     @Override
-    public LatLon fromWGS84(LatLon ll) {
+    public ILatLon fromWGS84(ILatLon ll) {
         return ll;
     }
 
diff --git a/src/org/openstreetmap/josm/data/projection/datum/SevenParameterDatum.java b/src/org/openstreetmap/josm/data/projection/datum/SevenParameterDatum.java
index 65c28d7..114eefb 100644
--- a/src/org/openstreetmap/josm/data/projection/datum/SevenParameterDatum.java
+++ b/src/org/openstreetmap/josm/data/projection/datum/SevenParameterDatum.java
@@ -1,6 +1,7 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.projection.datum;
 
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.projection.Ellipsoid;
 
@@ -45,7 +46,7 @@ public class SevenParameterDatum extends AbstractDatum {
     }
 
     @Override
-    public LatLon toWGS84(LatLon ll) {
+    public LatLon toWGS84(ILatLon ll) {
         double[] xyz = ellps.latLon2Cart(ll);
         double x = dx + xyz[0]*(1+s) + xyz[2]*ry - xyz[1]*rz;
         double y = dy + xyz[1]*(1+s) + xyz[0]*rz - xyz[2]*rx;
@@ -54,7 +55,7 @@ public class SevenParameterDatum extends AbstractDatum {
     }
 
     @Override
-    public LatLon fromWGS84(LatLon ll) {
+    public ILatLon fromWGS84(ILatLon ll) {
         double[] xyz = Ellipsoid.WGS84.latLon2Cart(ll);
         double x = (1-s)*(-dx + xyz[0] + ((-dz+xyz[2])*(-ry) - (-dy+xyz[1])*(-rz)));
         double y = (1-s)*(-dy + xyz[1] + ((-dx+xyz[0])*(-rz) - (-dz+xyz[2])*(-rx)));
diff --git a/src/org/openstreetmap/josm/data/projection/datum/ThreeParameterDatum.java b/src/org/openstreetmap/josm/data/projection/datum/ThreeParameterDatum.java
index 7311915..1fe6f73 100644
--- a/src/org/openstreetmap/josm/data/projection/datum/ThreeParameterDatum.java
+++ b/src/org/openstreetmap/josm/data/projection/datum/ThreeParameterDatum.java
@@ -1,6 +1,7 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.projection.datum;
 
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.projection.Ellipsoid;
 
@@ -19,7 +20,7 @@ public class ThreeParameterDatum extends AbstractDatum {
     }
 
     @Override
-    public LatLon toWGS84(LatLon ll) {
+    public LatLon toWGS84(ILatLon ll) {
         double[] xyz = ellps.latLon2Cart(ll);
         xyz[0] += dx;
         xyz[1] += dy;
@@ -28,7 +29,7 @@ public class ThreeParameterDatum extends AbstractDatum {
     }
 
     @Override
-    public LatLon fromWGS84(LatLon ll) {
+    public ILatLon fromWGS84(ILatLon ll) {
         double[] xyz = Ellipsoid.WGS84.latLon2Cart(ll);
         xyz[0] -= dx;
         xyz[1] -= dy;
diff --git a/src/org/openstreetmap/josm/data/validation/PaintVisitor.java b/src/org/openstreetmap/josm/data/validation/PaintVisitor.java
index 18181ae..185d6c2 100644
--- a/src/org/openstreetmap/josm/data/validation/PaintVisitor.java
+++ b/src/org/openstreetmap/josm/data/validation/PaintVisitor.java
@@ -2,7 +2,7 @@
 package org.openstreetmap.josm.data.validation;
 
 import java.awt.Color;
-import java.awt.Graphics;
+import java.awt.Graphics2D;
 import java.awt.Point;
 import java.util.HashSet;
 import java.util.List;
@@ -17,6 +17,8 @@ import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.WaySegment;
 import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
 import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.gui.draw.MapViewPath;
+import org.openstreetmap.josm.gui.mappaint.styleelement.Symbol.SymbolShape;
 
 /**
  * Visitor that highlights the primitives affected by an error
@@ -25,7 +27,7 @@ import org.openstreetmap.josm.gui.MapView;
  */
 public class PaintVisitor extends AbstractVisitor implements ValidatorVisitor {
     /** The graphics */
-    private final Graphics g;
+    private final Graphics2D g;
     /** The MapView */
     private final MapView mv;
 
@@ -42,7 +44,7 @@ public class PaintVisitor extends AbstractVisitor implements ValidatorVisitor {
      * @param g The graphics
      * @param mv The Mapview
      */
-    public PaintVisitor(Graphics g, MapView mv) {
+    public PaintVisitor(Graphics2D g, MapView mv) {
         this.g = g;
         this.mv = mv;
     }
@@ -119,14 +121,14 @@ public class PaintVisitor extends AbstractVisitor implements ValidatorVisitor {
         PaintedPoint pp = new PaintedPoint(n.getCoor(), color);
 
         if (!paintedPoints.contains(pp)) {
-            Point p = mv.getPoint(n);
+            MapViewPath circle = new MapViewPath(mv.getState()).shapeAround(n, SymbolShape.CIRCLE, 10);
 
             if (selected) {
                 g.setColor(getHighlightColor(color));
-                g.fillOval(p.x - 5, p.y - 5, 10, 10);
+                g.fill(circle);
             }
             g.setColor(color);
-            g.drawOval(p.x - 5, p.y - 5, 10, 10);
+            g.draw(circle);
             paintedPoints.add(pp);
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/MapViewState.java b/src/org/openstreetmap/josm/gui/MapViewState.java
index e3bbe51..cef7239 100644
--- a/src/org/openstreetmap/josm/gui/MapViewState.java
+++ b/src/org/openstreetmap/josm/gui/MapViewState.java
@@ -17,8 +17,8 @@ import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.projection.Projecting;
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.gui.download.DownloadDialog;
@@ -174,24 +174,13 @@ public final class MapViewState implements Serializable {
     }
 
     /**
-     * Gets the {@link MapViewPoint} for the given {@link LatLon} coordinate.
-     * @param latlon the position
-     * @return The point for that position.
-     * @since 10651
-     */
-    public MapViewPoint getPointFor(LatLon latlon) {
-        return getPointFor(getProjection().latlon2eastNorth(latlon));
-    }
-
-    /**
-     * Gets the {@link MapViewPoint} for the given node. This is faster than {@link #getPointFor(LatLon)} because it uses the node east/north
-     * cache.
-     * @param node The node
-     * @return The position of that node.
-     * @since 10827
+     * Gets the {@link MapViewPoint} for the given lat lon coordinates.
+     * @param latlon The lat lon position, e.g. a node
+     * @return The position of that object.
+     * @since xxx
      */
-    public MapViewPoint getPointFor(Node node) {
-        return getPointFor(node.getEastNorth(getProjection()));
+    public MapViewPoint getPointFor(ILatLon latlon) {
+        return getPointFor(latlon.getEastNorth(getProjecting()));
     }
 
     /**
@@ -248,12 +237,22 @@ public final class MapViewState implements Serializable {
     /**
      * Gets the current projection used for the MapView.
      * @return The projection.
+     * @see #getProjecting()
      */
     public Projection getProjection() {
         return projecting.getBaseProjection();
     }
 
     /**
+     * Gets the current projecting instance that is used to convert between east/north and lat/lon space.
+     * @return The projection.
+     * @since xxx
+     */
+    public Projecting getProjecting() {
+        return projecting;
+    }
+
+    /**
      * Creates an affine transform that is used to convert the east/north coordinates to view coordinates.
      * @return The affine transform. It should not be changed.
      * @since 10375
diff --git a/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDataText.java b/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDataText.java
index 11cb3f9..99a0649 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDataText.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDataText.java
@@ -202,10 +202,10 @@ public class InspectPrimitiveDataText {
     }
 
     void addCoordinates(Node n) {
-        if (n.getCoor() != null) {
+        if (n.isLatLonKnown()) {
             add(tr("Coordinates: "),
-                    Double.toString(n.getCoor().lat()), ", ",
-                    Double.toString(n.getCoor().lon()));
+                    Double.toString(n.lat()), ", ",
+                    Double.toString(n.lon()));
             add(tr("Coordinates (projected): "),
                     Double.toString(n.getEastNorth().east()), ", ",
                     Double.toString(n.getEastNorth().north()));
diff --git a/src/org/openstreetmap/josm/gui/draw/MapViewPath.java b/src/org/openstreetmap/josm/gui/draw/MapViewPath.java
index 7b2fb49..55d29a9 100644
--- a/src/org/openstreetmap/josm/gui/draw/MapViewPath.java
+++ b/src/org/openstreetmap/josm/gui/draw/MapViewPath.java
@@ -2,7 +2,7 @@
 package org.openstreetmap.josm.gui.draw;
 
 import org.openstreetmap.josm.data.coor.EastNorth;
-import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.gui.MapViewState;
 import org.openstreetmap.josm.gui.MapViewState.MapViewPoint;
 import org.openstreetmap.josm.gui.mappaint.styleelement.Symbol.SymbolShape;
@@ -29,8 +29,8 @@ public class MapViewPath extends MapPath2D {
      * @param n The node
      * @return this for easy chaining.
      */
-    public MapViewPath moveTo(Node n) {
-        moveTo(n.getEastNorth());
+    public MapViewPath moveTo(ILatLon n) {
+        moveTo(n.getEastNorth(state.getProjecting()));
         return this;
     }
 
@@ -55,8 +55,8 @@ public class MapViewPath extends MapPath2D {
      * @param n The node
      * @return this for easy chaining.
      */
-    public MapViewPath lineTo(Node n) {
-        lineTo(n.getEastNorth());
+    public MapViewPath lineTo(ILatLon n) {
+        lineTo(n.getEastNorth(state.getProjecting()));
         return this;
     }
 
@@ -83,8 +83,8 @@ public class MapViewPath extends MapPath2D {
      * @param size The size of the symbol in pixel
      * @return this for easy chaining.
      */
-    public MapViewPath shapeAround(Node p1, SymbolShape symbol, double size) {
-        shapeAround(p1.getEastNorth(), symbol, size);
+    public MapViewPath shapeAround(ILatLon p1, SymbolShape symbol, double size) {
+        shapeAround(p1.getEastNorth(state.getProjecting()), symbol, size);
         return this;
     }
 
@@ -112,7 +112,7 @@ public class MapViewPath extends MapPath2D {
      * @param connect <code>true</code> if we should use a lineTo as first command.
      * @return this for easy chaining.
      */
-    public MapViewPath append(Iterable<Node> nodes, boolean connect) {
+    public MapViewPath append(Iterable<? extends ILatLon> nodes, boolean connect) {
         appendWay(nodes, connect, false);
         return this;
     }
@@ -123,15 +123,15 @@ public class MapViewPath extends MapPath2D {
      * @param connect <code>true</code> if we should use a lineTo as first command.
      * @return this for easy chaining.
      */
-    public MapViewPath appendClosed(Iterable<Node> nodes, boolean connect) {
+    public MapViewPath appendClosed(Iterable<? extends ILatLon> nodes, boolean connect) {
         appendWay(nodes, connect, true);
         return this;
     }
 
-    private void appendWay(Iterable<Node> nodes, boolean connect, boolean close) {
+    private void appendWay(Iterable<? extends ILatLon> nodes, boolean connect, boolean close) {
         boolean useMoveTo = !connect;
-        Node first = null;
-        for (Node n : nodes) {
+        ILatLon first = null;
+        for (ILatLon n : nodes) {
             if (useMoveTo) {
                 moveTo(n);
             } else {
diff --git a/src/org/openstreetmap/josm/tools/Geometry.java b/src/org/openstreetmap/josm/tools/Geometry.java
index 7cafef3..d399d89 100644
--- a/src/org/openstreetmap/josm/tools/Geometry.java
+++ b/src/org/openstreetmap/josm/tools/Geometry.java
@@ -21,7 +21,6 @@ import org.openstreetmap.josm.command.AddCommand;
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.data.coor.EastNorth;
-import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.BBox;
 import org.openstreetmap.josm.data.osm.MultipolygonBuilder;
 import org.openstreetmap.josm.data.osm.MultipolygonBuilder.JoinedPolygon;
@@ -218,7 +217,7 @@ public final class Geometry {
 
         BBox bounds = new BBox(nodes.get(0));
         for (Node n: nodes) {
-            bounds.add(n.getCoor());
+            bounds.add(n);
         }
         return bounds;
     }
@@ -413,7 +412,7 @@ public final class Geometry {
         else if (segmentOnly && offset >= 1)
             return p2;
         else
-            return new EastNorth(p1.getX() + ldx * offset, p1.getY() + ldy * offset);
+            return p1.interpolate(p2, offset);
     }
 
     /**
@@ -510,10 +509,10 @@ public final class Geometry {
         boolean begin = true;
         for (Node n : polygon) {
             if (begin) {
-                path.moveTo(n.getCoor().lon(), n.getCoor().lat());
+                path.moveTo(n.lon(), n.lat());
                 begin = false;
             } else {
-                path.lineTo(n.getCoor().lon(), n.getCoor().lat());
+                path.lineTo(n.lon(), n.lat());
             }
         }
         if (!begin) {
@@ -706,8 +705,8 @@ public final class Geometry {
         double area2 = 0.;
 
         for (int node = 1; node <= /*sic! consider last-first as well*/ nodesCount; node++) {
-            LatLon coorPrev = nodes.get(node - 1).getCoor();
-            LatLon coorCurr = nodes.get(node % nodesCount).getCoor();
+            Node coorPrev = nodes.get(node - 1);
+            Node coorCurr = nodes.get(node % nodesCount);
             area2 += coorPrev.lon() * coorCurr.lat();
             area2 -= coorCurr.lon() * coorPrev.lat();
         }
@@ -966,13 +965,15 @@ public final class Geometry {
         CheckParameterUtil.ensureParameterNotNull(nodes, "nodes");
         double area = 0;
         double perimeter = 0;
+        Projection useProjection = projection == null ? Main.getProjection() : projection;
+
         if (!nodes.isEmpty()) {
             boolean closed = nodes.get(0) == nodes.get(nodes.size() - 1);
             int numSegments = closed ? nodes.size() - 1 : nodes.size();
-            EastNorth p1 = projection == null ? nodes.get(0).getEastNorth() : projection.latlon2eastNorth(nodes.get(0).getCoor());
+            EastNorth p1 = nodes.get(0).getEastNorth(useProjection);
             for (int i = 1; i <= numSegments; i++) {
                 final Node node = nodes.get(i == numSegments ? 0 : i);
-                final EastNorth p2 = projection == null ? node.getEastNorth() : projection.latlon2eastNorth(node.getCoor());
+                final EastNorth p2 = node.getEastNorth(useProjection);
                 if (p1 != null && p2 != null) {
                     area += p1.east() * p2.north() - p2.east() * p1.north();
                     perimeter += p1.distance(p2);
diff --git a/test/unit/org/openstreetmap/josm/data/projection/ShiftedProjectionTest.java b/test/unit/org/openstreetmap/josm/data/projection/ShiftedProjectionTest.java
index 8a2b625..7e5c2a1 100644
--- a/test/unit/org/openstreetmap/josm/data/projection/ShiftedProjectionTest.java
+++ b/test/unit/org/openstreetmap/josm/data/projection/ShiftedProjectionTest.java
@@ -13,6 +13,7 @@ import java.util.stream.Collectors;
 import org.junit.Test;
 import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 
 /**
@@ -22,7 +23,7 @@ import org.openstreetmap.josm.data.coor.LatLon;
 public class ShiftedProjectionTest {
     private static final class ProjectingBase implements Projecting {
         @Override
-        public EastNorth latlon2eastNorth(LatLon ll) {
+        public EastNorth latlon2eastNorth(ILatLon ll) {
             return new EastNorth(ll.lat() * 2, ll.lon() * 3);
         }
 
@@ -52,7 +53,7 @@ public class ShiftedProjectionTest {
     }
 
     /**
-     * Test {@link ShiftedProjecting#latlon2eastNorth(LatLon)}
+     * Test {@link ShiftedProjecting#latlon2eastNorth(ILatLon)}
      */
     @Test
     public void testLatlon2eastNorth() {
