Index: src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 6159)
+++ src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(working copy)
@@ -683,7 +683,7 @@
                 Point p3 = mv.getPoint(newN1en);
                 Point p4 = mv.getPoint(newN2en);
 
-                EastNorth normalUnitVector = getNormalUniVector();
+                Point2D normalUnitVector = getNormalUniVector();
 
                 if (mode == Mode.extrude || mode == Mode.create_new) {
                     g2.setColor(mainColor);
@@ -752,16 +752,16 @@
         }
     }
 
-    private EastNorth getNormalUniVector() {
-        double fac = 1.0 / activeMoveDirection.en.distance(0,0);
+    private Point2D getNormalUniVector() {
+        double fac = 1.0 / activeMoveDirection.en.length();
         // mult by factor to get unit vector.
-        EastNorth normalUnitVector = new EastNorth(activeMoveDirection.en.getX() * fac, activeMoveDirection.en.getY() * fac);
+        Point2D normalUnitVector = new Point2D.Double(activeMoveDirection.en.getX() * fac, activeMoveDirection.en.getY() * fac);
 
         // Check to see if our new N1 is in a positive direction with respect to the normalUnitVector.
         // Even if the x component is zero, we should still be able to discern using +0.0 and -0.0
         if (newN1en != null && ((newN1en.getX() > initialN1en.getX()) != (normalUnitVector.getX() > -0.0))) {
             // If not, use a sign-flipped version of the normalUnitVector.
-            normalUnitVector = new EastNorth(-normalUnitVector.getX(), -normalUnitVector.getY());
+            normalUnitVector = new Point2D.Double(-normalUnitVector.getX(), -normalUnitVector.getY());
         }
 
         //HACK: swap Y, because the target pixels are top down, but EastNorth is bottom-up.
@@ -770,7 +770,7 @@
         return normalUnitVector;
     }
 
-    private void drawAngleSymbol(Graphics2D g2, Point2D center, EastNorth normal, boolean mirror) {
+    private void drawAngleSymbol(Graphics2D g2, Point2D center, Point2D normal, boolean mirror) {
         // EastNorth units per pixel
         double factor = 1.0/g2.getTransform().getScaleX();
         double raoffsetx = symbolSize*factor*normal.getX();
Index: src/org/openstreetmap/josm/command/Command.java
===================================================================
--- src/org/openstreetmap/josm/command/Command.java	(revision 6159)
+++ src/org/openstreetmap/josm/command/Command.java	(working copy)
@@ -15,7 +15,6 @@
 import javax.swing.JPanel;
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.PrimitiveData;
@@ -221,8 +220,7 @@
 
     private static boolean isOutlying(OsmPrimitive osm, Area area) {
         if (osm instanceof Node && !osm.isNewOrUndeleted()) {
-            LatLon coor = ((Node) osm).getCoor();
-            return coor != null && !area.contains(coor);
+            return !((Node) osm).getCoor().isIn(area);
         } else if (osm instanceof Way) {
             for (Node n : ((Way) osm).getNodes()) {
                 if (isOutlying(n, area)) {
Index: src/org/openstreetmap/josm/command/SequenceCommand.java
===================================================================
--- src/org/openstreetmap/josm/command/SequenceCommand.java	(revision 6159)
+++ src/org/openstreetmap/josm/command/SequenceCommand.java	(working copy)
@@ -6,7 +6,6 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.List;
 
 import javax.swing.Icon;
 
Index: src/org/openstreetmap/josm/data/Bounds.java
===================================================================
--- src/org/openstreetmap/josm/data/Bounds.java	(revision 6159)
+++ src/org/openstreetmap/josm/data/Bounds.java	(working copy)
@@ -205,7 +205,7 @@
         if (crosses180thMeridian()) {
             LatLon result = new LatLon(minLat, minLon-360.0).getCenter(getMax());
             if (result.lon() < -180.0) {
-                result.setLocation(result.lon()+360.0, result.lat());
+                result = new LatLon(result.lat(), result.lon() + 360.0);
             }
             return result;
         } else {
Index: src/org/openstreetmap/josm/data/coor/CachedLatLon.java
===================================================================
--- src/org/openstreetmap/josm/data/coor/CachedLatLon.java	(revision 6159)
+++ src/org/openstreetmap/josm/data/coor/CachedLatLon.java	(working copy)
@@ -32,18 +32,6 @@
         this.eastNorth = eastNorth;
     }
 
-    public final void setCoor(LatLon coor) {
-        setLocation(coor.lon(), coor.lat());
-        proj = null;
-    }
-
-    public final void setEastNorth(EastNorth eastNorth) {
-        proj = Main.getProjection();
-        this.eastNorth = eastNorth;
-        LatLon l = proj.eastNorth2latlon(eastNorth);
-        setLocation(l.lon(), l.lat());
-    }
-
     /**
      * Replies the projected east/north coordinates.
      *
Index: src/org/openstreetmap/josm/data/coor/Coordinate.java
===================================================================
--- src/org/openstreetmap/josm/data/coor/Coordinate.java	(revision 6159)
+++ src/org/openstreetmap/josm/data/coor/Coordinate.java	(working copy)
@@ -1,7 +1,6 @@
 // License: GPL. Copyright 2007 by Immanuel Scholz and others
 package org.openstreetmap.josm.data.coor;
 
-import java.awt.geom.Point2D;
 import java.io.Serializable;
 
 /**
@@ -16,10 +15,10 @@
  *
  * @author imi
  */
-abstract class Coordinate extends Point2D implements Serializable {
+abstract class Coordinate implements Serializable {
 
-    protected double x;
-    protected double y;
+    protected final double x;
+    protected final double y;
 
     /**
      * Construct the point with latitude / longitude values.
@@ -31,23 +30,15 @@
         this.x = x; this.y = y;
     }
 
-    @Override
     public double getX() {
         return x;
     }
 
-    @Override
     public double getY() {
         return y;
     }
 
     @Override
-    public void setLocation (double x, double y) {
-        this.x = x;
-        this.y = y;
-    }
-
-    @Override
     public int hashCode() {
         final int prime = 31;
         int result = super.hashCode();
Index: src/org/openstreetmap/josm/data/coor/EastNorth.java
===================================================================
--- src/org/openstreetmap/josm/data/coor/EastNorth.java	(revision 6159)
+++ src/org/openstreetmap/josm/data/coor/EastNorth.java	(working copy)
@@ -43,11 +43,40 @@
         return new EastNorth((this.x + en2.x)/2.0, (this.y + en2.y)/2.0);
     }
 
-    public double distance(EastNorth en2) {
-        return Math.sqrt((this.x-en2.x)*(this.x-en2.x) + (this.y-en2.y)*(this.y-en2.y));
+    /**
+     * Counts euclidean distance between this and other EastNorth.
+     * 
+     * @param en2 other EastNorth
+     * @return distance between this and other EastNorth
+     */
+    public double distance(final EastNorth en2) {
+        final double dx = this.x-en2.x;
+        final double dy = this.y-en2.y;
+        return Math.sqrt(dx*dx + dy*dy);
     }
 
     /**
+     * Counts square of euclidean distance between this and other EastNorth.
+     * 
+     * @param en2 other EastNorth
+     * @return square of distance between this and other EastNorth
+     */
+    public double distanceSq(final EastNorth en2) {
+        final double dx = this.x-en2.x;
+        final double dy = this.y-en2.y;
+        return dx*dx + dy*dy;
+    }
+
+    /**
+     * Counts length (distance from [0,0]) of this.
+     * 
+     * @return length of this
+     */
+    public double length(){
+        return Math.sqrt(x*x + y*y);
+    }
+    
+    /**
      * Returns the heading, in radians, that you have to use to get from
      * this EastNorth to another. Heading is mapped into [0, 2pi)
      *
Index: src/org/openstreetmap/josm/data/coor/LatLon.java
===================================================================
--- src/org/openstreetmap/josm/data/coor/LatLon.java	(revision 6159)
+++ src/org/openstreetmap/josm/data/coor/LatLon.java	(working copy)
@@ -10,6 +10,7 @@
 import static java.lang.Math.toRadians;
 import static org.openstreetmap.josm.tools.I18n.trc;
 
+import java.awt.geom.Area;
 import java.text.DecimalFormat;
 import java.text.NumberFormat;
 import java.util.Locale;
@@ -221,6 +222,16 @@
     }
 
     /**
+     * Check if this is contained in given area or area is null. 
+     * 
+     * @param a Area
+     * @return <code>true</code> if this is contained in given area or area is null. 
+     */
+    public boolean isIn(Area a) {
+        return a == null || a.contains(x, y);
+    }
+
+    /**
      * Computes the distance between this lat/lon and another point on the earth.
      * Uses Haversine formular.
      * @param other the other point.
@@ -285,6 +296,18 @@
         return new LatLon((this.lat() + ll2.lat())/2.0, (this.lon() + ll2.lon())/2.0);
     }
 
+    /**
+     * Counts euclidean distance between this and other LatLon.
+     * 
+     * @param ll2 other LatLon
+     * @return distance between this and other LatLon
+     */
+   public double distance(final LatLon ll2) {
+        final double dx = this.x-ll2.x;
+        final double dy = this.y-ll2.y;
+        return Math.sqrt(dx*dx + dy*dy);
+    }
+
     @Override public String toString() {
         return "LatLon[lat="+lat()+",lon="+lon()+"]";
     }
Index: src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 6159)
+++ src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(working copy)
@@ -1341,7 +1341,7 @@
         Path2D.Double path = new Path2D.Double();
         boolean initial = true;
         for (Node n : w.getNodes()) {
-            Point2D p = n.getEastNorth();
+            EastNorth p = n.getEastNorth();
             if (p != null) {
                 if (initial) {
                     path.moveTo(p.getX(), p.getY());
Index: src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java	(revision 6159)
+++ src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java	(working copy)
@@ -17,6 +17,7 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
+import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
@@ -212,7 +213,7 @@
         private void buildPoly() {
             boolean initial = true;
             for (Node n : nodes) {
-                Point2D p = n.getEastNorth();
+                EastNorth p = n.getEastNorth();
                 if (p != null) {
                     if (initial) {
                         poly.moveTo(p.getX(), p.getY());
Index: src/org/openstreetmap/josm/data/validation/tests/Coastlines.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/tests/Coastlines.java	(revision 6159)
+++ src/org/openstreetmap/josm/data/validation/tests/Coastlines.java	(working copy)
@@ -149,10 +149,10 @@
             if (headWays == 0 || tailWays == 0) {
                 List<OsmPrimitive> highlight = new ArrayList<OsmPrimitive>();
 
-                if (headWays == 0 && (downloadedArea == null || downloadedArea.contains(head.getCoor()))) {
+                if (headWays == 0 && head.getCoor().isIn(downloadedArea)) {
                     highlight.add(head);
                 }
-                if (tailWays == 0 && (downloadedArea == null || downloadedArea.contains(tail.getCoor()))) {
+                if (tailWays == 0 && tail.getCoor().isIn(downloadedArea)) {
                     highlight.add(tail);
                 }
 
Index: src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java	(revision 6159)
+++ src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java	(working copy)
@@ -292,8 +292,7 @@
             found_nodes.addAll(endnodes.search(new BBox(bounds.get(0), bounds.get(1))));
 
             for (Node n : found_nodes) {
-                if (!nearby(n, dist) ||
-                        (ds_area != null && !ds_area.contains(n.getCoor()))) {
+                if (!nearby(n, dist) || !n.getCoor().isIn(ds_area)) {
                     continue;
                 }
                 // It is actually very rare for us to find a node
Index: src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java	(revision 6159)
+++ src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java	(working copy)
@@ -340,11 +340,7 @@
     }
 
     public final void setCoor(LatLon coor) {
-        if(this.coor == null) {
-            this.coor = new CachedLatLon(coor);
-        } else {
-            this.coor.setCoor(coor);
-        }
+        this.coor = new CachedLatLon(coor);
     }
 
     public final LatLon getCoor() {
@@ -352,7 +348,7 @@
     }
 
     public final void setEastNorth(EastNorth eastNorth) {
-        coor.setEastNorth(eastNorth);
+        this.coor = new CachedLatLon(eastNorth);
     }
 
     public final EastNorth getEastNorth() {
