Index: /trunk/src/org/openstreetmap/josm/actions/CopyCoordinatesAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/CopyCoordinatesAction.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/actions/CopyCoordinatesAction.java	(revision 12161)
@@ -31,7 +31,7 @@
         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');
         }
Index: /trunk/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/SimplifyWayAction.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/actions/SimplifyWayAction.java	(revision 12161)
@@ -245,7 +245,6 @@
             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;
Index: /trunk/src/org/openstreetmap/josm/data/Bounds.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/Bounds.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/data/Bounds.java	(revision 12161)
@@ -10,4 +10,5 @@
 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;
@@ -18,4 +19,6 @@
  * This is a simple data class for "rectangular" areas of the world, given in
  * lat/lon min/max values.  The values are rounded to LatLon.OSM_SERVER_PRECISION
+ *
+ * @see BBox to represent invalid areas.
  *
  * @author imi
@@ -390,8 +393,26 @@
     /**
      * 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
+     * @since xxx
+     */
+    public boolean contains(ILatLon ll) {
+        if (!ll.isLatLonKnown()) {
+            return false;
+        }
         if (ll.lat() < minLat || ll.lat() > maxLat)
             return false;
Index: /trunk/src/org/openstreetmap/josm/data/coor/CachedLatLon.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/coor/CachedLatLon.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/data/coor/CachedLatLon.java	(revision 12161)
@@ -5,4 +5,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.projection.Projecting;
 import org.openstreetmap.josm.data.projection.Projection;
 
@@ -20,5 +21,5 @@
 
     private EastNorth eastNorth;
-    private transient Projection proj;
+    private transient Object cacheKey;
 
     /**
@@ -37,5 +38,5 @@
     public CachedLatLon(LatLon coor) {
         super(coor.lat(), coor.lon());
-        proj = null;
+        cacheKey = null;
     }
 
@@ -45,6 +46,10 @@
      */
     public CachedLatLon(EastNorth eastNorth) {
-        super(Main.getProjection().eastNorth2latlon(eastNorth));
-        proj = Main.getProjection();
+        this(eastNorth, Main.getProjection());
+    }
+
+    private CachedLatLon(EastNorth eastNorth, Projection projection) {
+        super(projection.eastNorth2latlon(eastNorth));
+        cacheKey = projection.getCacheKey();
         this.eastNorth = eastNorth;
     }
@@ -55,8 +60,9 @@
      * @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(cacheKey, projecting.getCacheKey())) {
+            cacheKey = projecting.getCacheKey();
+            eastNorth = projecting.latlon2eastNorth(this);
         }
         return eastNorth;
Index: /trunk/src/org/openstreetmap/josm/data/coor/LatLon.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/coor/LatLon.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/data/coor/LatLon.java	(revision 12161)
@@ -43,5 +43,5 @@
  * @author Imi
  */
-public class LatLon extends Coordinate {
+public class LatLon extends Coordinate implements ILatLon {
 
     private static final long serialVersionUID = 1L;
@@ -251,5 +251,9 @@
     }
 
-    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());
     }
@@ -263,8 +267,5 @@
     }
 
-    /**
-     * Returns the latitude, i.e., the north-south position in degrees.
-     * @return the latitude
-     */
+    @Override
     public double lat() {
         return y;
@@ -286,8 +287,5 @@
     }
 
-    /**
-     * Returns the longitude, i.e., the east-west position in degrees.
-     * @return the longitude
-     */
+    @Override
     public double lon() {
         return x;
Index: /trunk/src/org/openstreetmap/josm/data/osm/BBox.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/BBox.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/data/osm/BBox.java	(revision 12161)
@@ -7,4 +7,5 @@
 
 import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.coor.QuadTiling;
@@ -85,5 +86,5 @@
      */
     public BBox(Way w) {
-        w.getNodes().forEach(n -> add(n.getCoor()));
+        w.getNodes().forEach(this::add);
     }
 
@@ -93,7 +94,23 @@
      */
     public BBox(Node n) {
-        if (n.isLatLonKnown()) {
-            add(n.getCoor());
-        }
+        this((ILatLon) n);
+    }
+
+    /**
+     * Create BBox for a given latlon. An invalid BBox is returned if the coordinates are not known.
+     * @param ll The lat lon position
+     */
+    public BBox(ILatLon ll) {
+        add(ll);
+    }
+
+    /**
+     * Add a point to an existing BBox. Extends this bbox if necessary so that this.bounds(c) will return true
+     * if c is a valid LatLon instance.
+     * Kept for binary compatibility
+     * @param c a LatLon point
+     */
+    public final void add(LatLon c) {
+        add((ILatLon) c);
     }
 
@@ -103,8 +120,6 @@
      * @param c a LatLon point
      */
-    public final void add(LatLon c) {
-        if (c != null && c.isValid()) {
-            add(c.lon(), c.lat());
-        }
+    public final void add(ILatLon c) {
+        add(c.lon(), c.lat());
     }
 
Index: /trunk/src/org/openstreetmap/josm/data/osm/INode.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/INode.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/data/osm/INode.java	(revision 12161)
@@ -3,4 +3,5 @@
 
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 
@@ -9,5 +10,5 @@
  * @since 4098
  */
-public interface INode extends IPrimitive {
+public interface INode extends IPrimitive, ILatLon {
 
     /**
@@ -24,10 +25,4 @@
 
     /**
-     * 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
Index: /trunk/src/org/openstreetmap/josm/data/osm/Node.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 12161)
@@ -15,5 +15,5 @@
 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;
@@ -48,5 +48,7 @@
      * @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);
     }
@@ -81,34 +83,23 @@
     @Override
     public LatLon getCoor() {
-        if (!isLatLonKnown()) return null;
-        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());
-    }
-
-    /**
-     * 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) {
+        if (!isLatLonKnown()) {
+            return null;
+        } else {
+            return new LatLon(lat, lon);
+        }
+    }
+
+    @Override
+    public double lat() {
+        return lat;
+    }
+
+    @Override
+    public double lon() {
+        return lon;
+    }
+
+    @Override
+    public EastNorth getEastNorth(Projecting projection) {
         if (!isLatLonKnown()) return null;
 
Index: /trunk/src/org/openstreetmap/josm/data/osm/NodeData.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/NodeData.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/data/osm/NodeData.java	(revision 12161)
@@ -41,5 +41,16 @@
     }
 
-    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);
     }
Index: /trunk/src/org/openstreetmap/josm/data/osm/NodePositionComparator.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/NodePositionComparator.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/data/osm/NodePositionComparator.java	(revision 12161)
@@ -20,6 +20,6 @@
             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());
     }
 }
Index: /trunk/src/org/openstreetmap/josm/data/projection/AbstractProjection.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/AbstractProjection.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/data/projection/AbstractProjection.java	(revision 12161)
@@ -10,4 +10,5 @@
 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;
@@ -114,6 +115,7 @@
 
     @Override
-    public EastNorth latlon2eastNorth(LatLon ll) {
-        ll = datum.fromWGS84(ll);
+    public EastNorth latlon2eastNorth(ILatLon toConvert) {
+        // TODO: Use ILatLon in datum, so we don't need to wrap it here.
+        LatLon ll = datum.fromWGS84(new LatLon(toConvert));
         double[] en = proj.project(Utils.toRadians(ll.lat()), Utils.toRadians(LatLon.normalizeLon(ll.lon() - lon0 - pm)));
         return new EastNorth((ellps.a * k0 * en[0] + x0) / toMeter, (ellps.a * k0 * en[1] + y0) / toMeter);
@@ -122,4 +124,5 @@
     @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);
     }
@@ -127,5 +130,5 @@
     @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()),
Index: /trunk/src/org/openstreetmap/josm/data/projection/Ellipsoid.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/Ellipsoid.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/data/projection/Ellipsoid.java	(revision 12161)
@@ -7,4 +7,5 @@
 package org.openstreetmap.josm.data.projection;
 
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.tools.Utils;
Index: /trunk/src/org/openstreetmap/josm/data/projection/Projecting.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/Projecting.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/data/projection/Projecting.java	(revision 12161)
@@ -6,4 +6,5 @@
 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;
 
@@ -19,9 +20,22 @@
     /**
      * 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
+     * @since xxx
+     */
+    EastNorth latlon2eastNorth(ILatLon ll);
 
     /**
@@ -48,3 +62,12 @@
      */
     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;
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/data/projection/Projection.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/Projection.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/data/projection/Projection.java	(revision 12161)
@@ -119,12 +119,3 @@
      */
     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;
-    }
 }
Index: /trunk/src/org/openstreetmap/josm/data/projection/ShiftedProjecting.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/ShiftedProjecting.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/data/projection/ShiftedProjecting.java	(revision 12161)
@@ -7,4 +7,5 @@
 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;
 
@@ -29,5 +30,5 @@
 
     @Override
-    public EastNorth latlon2eastNorth(LatLon ll) {
+    public EastNorth latlon2eastNorth(ILatLon ll) {
         return base.latlon2eastNorth(ll).add(offset);
     }
Index: /trunk/src/org/openstreetmap/josm/data/validation/PaintVisitor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/PaintVisitor.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/data/validation/PaintVisitor.java	(revision 12161)
@@ -3,5 +3,5 @@
 
 import java.awt.Color;
-import java.awt.Graphics;
+import java.awt.Graphics2D;
 import java.awt.Point;
 import java.util.HashSet;
@@ -18,4 +18,6 @@
 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.draw.SymbolShape;
 import org.openstreetmap.josm.tools.Utils;
 
@@ -27,5 +29,5 @@
 public class PaintVisitor extends AbstractVisitor implements ValidatorVisitor {
     /** The graphics */
-    private final Graphics g;
+    private final Graphics2D g;
     /** The MapView */
     private final MapView mv;
@@ -44,5 +46,5 @@
      * @param mv The Mapview
      */
-    public PaintVisitor(Graphics g, MapView mv) {
+    public PaintVisitor(Graphics2D g, MapView mv) {
         this.g = g;
         this.mv = mv;
@@ -121,12 +123,12 @@
 
         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);
         }
Index: /trunk/src/org/openstreetmap/josm/gui/MapViewState.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MapViewState.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/gui/MapViewState.java	(revision 12161)
@@ -20,4 +20,5 @@
 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;
@@ -180,4 +181,6 @@
     /**
      * Gets the {@link MapViewPoint} for the given {@link LatLon} coordinate.
+     * <p>
+     * This method exists to not break binary compatibility with old plugins
      * @param latlon the position
      * @return The point for that position.
@@ -185,5 +188,20 @@
      */
     public MapViewPoint getPointFor(LatLon latlon) {
-        return getPointFor(getProjection().latlon2eastNorth(latlon));
+        return getPointFor((ILatLon) latlon);
+    }
+
+    /**
+     * Gets the {@link MapViewPoint} for the given {@link LatLon} coordinate.
+     * @param latlon the position
+     * @return The point for that position.
+     * @since xxx
+     */
+    public MapViewPoint getPointFor(ILatLon latlon) {
+        try {
+            return getPointFor(Optional.ofNullable(latlon.getEastNorth(getProjection()))
+                    .orElseThrow(IllegalArgumentException::new));
+        } catch (JosmRuntimeException | IllegalArgumentException | IllegalStateException e) {
+            throw BugReport.intercept(e).put("latlon", latlon);
+        }
     }
 
@@ -196,10 +214,5 @@
      */
     public MapViewPoint getPointFor(Node node) {
-        try {
-            return getPointFor(Optional.ofNullable(node.getEastNorth(getProjection()))
-                    .orElseThrow(IllegalArgumentException::new));
-        } catch (JosmRuntimeException | IllegalArgumentException | IllegalStateException e) {
-            throw BugReport.intercept(e).put("node", node);
-        }
+        return getPointFor((ILatLon) node);
     }
 
@@ -249,7 +262,17 @@
      * 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;
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDataText.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDataText.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDataText.java	(revision 12161)
@@ -203,8 +203,8 @@
 
     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()), ", ",
Index: /trunk/src/org/openstreetmap/josm/gui/draw/MapViewPath.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/draw/MapViewPath.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/gui/draw/MapViewPath.java	(revision 12161)
@@ -9,5 +9,5 @@
 
 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.MapView;
 import org.openstreetmap.josm.gui.MapViewState;
@@ -57,6 +57,6 @@
      * @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;
     }
@@ -85,6 +85,6 @@
      * @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;
     }
@@ -115,6 +115,6 @@
      * @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;
     }
@@ -144,5 +144,5 @@
      * @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;
@@ -155,13 +155,13 @@
      * @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);
Index: /trunk/src/org/openstreetmap/josm/tools/Geometry.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/Geometry.java	(revision 12160)
+++ /trunk/src/org/openstreetmap/josm/tools/Geometry.java	(revision 12161)
@@ -22,5 +22,4 @@
 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.DataSet;
@@ -224,5 +223,5 @@
         BBox bounds = new BBox(nodes.get(0));
         for (Node n: nodes) {
-            bounds.add(n.getCoor());
+            bounds.add(n);
         }
         return bounds;
@@ -417,5 +416,5 @@
             return p2;
         else
-            return new EastNorth(p1.getX() + ldx * offset, p1.getY() + ldy * offset);
+            return p1.interpolate(p2, offset);
     }
 
@@ -513,8 +512,8 @@
         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());
             }
         }
@@ -728,6 +727,6 @@
 
         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();
@@ -988,11 +987,13 @@
         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();
Index: /trunk/test/unit/org/openstreetmap/josm/data/projection/ShiftedProjectionTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/projection/ShiftedProjectionTest.java	(revision 12160)
+++ /trunk/test/unit/org/openstreetmap/josm/data/projection/ShiftedProjectionTest.java	(revision 12161)
@@ -14,4 +14,5 @@
 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;
 
@@ -23,5 +24,5 @@
     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);
         }
@@ -53,5 +54,5 @@
 
     /**
-     * Test {@link ShiftedProjecting#latlon2eastNorth(LatLon)}
+     * Test {@link ShiftedProjecting#latlon2eastNorth(ILatLon)}
      */
     @Test
