Index: src/org/openstreetmap/josm/actions/AlignInCircleAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/AlignInCircleAction.java	(revision 1629)
+++ src/org/openstreetmap/josm/actions/AlignInCircleAction.java	(working copy)
@@ -15,7 +15,6 @@
 import org.openstreetmap.josm.command.MoveCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.coor.EastNorth;
-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.Way;
@@ -134,7 +133,7 @@
         Collection<OsmPrimitive> sel = Main.ds.getSelected();
         Collection<Node> nodes = new LinkedList<Node>();
         Collection<Way> ways = new LinkedList<Way>();
-        Node center = null;
+        EastNorth center = null;
         double radius = 0;
         boolean regular = false;
 
@@ -163,7 +162,7 @@
                     regular = true;
                 } else {
 
-                    center = (Node) nodes.toArray()[way.nodes.contains(nodes.toArray()[0]) ? 1 : 0];
+                    center = ((Node) nodes.toArray()[way.nodes.contains(nodes.toArray()[0]) ? 1 : 0]).eastNorth;
                     if (nodes.size() == 2)
                         radius = distance(((Node) nodes.toArray()[0]).eastNorth, ((Node) nodes.toArray()[1]).eastNorth);
                 }
@@ -183,8 +182,7 @@
 
         // Get average position of circumcircles of the triangles of all triplets of neighbour nodes
         if (center == null) {
-            center = new Node(new LatLon(0, 0));
-            center.eastNorth = new EastNorth(0, 0); // to be independent of projection
+            center = new EastNorth(0, 0);
             Node n0 = (Node) nodes.toArray()[nodes.size() - 1];
             Node n1 = (Node) nodes.toArray()[nodes.size() - 2];
             Node n2;
@@ -195,13 +193,12 @@
                 EastNorth cc = circumcenter(n0.eastNorth, n1.eastNorth, n2.eastNorth);
                 if (cc == null)
                     return;
-                center.eastNorth = new EastNorth(center.eastNorth.east() + cc.east(), center.eastNorth.north()
+                center = new EastNorth(center.east() + cc.east(), center.north()
                         + cc.north());
             }
 
-            center.eastNorth = new EastNorth(center.eastNorth.east() / nodes.size(), center.eastNorth.north()
+            center = new EastNorth(center.east() / nodes.size(), center.north()
                     / nodes.size());
-            center.coor = Main.proj.eastNorth2latlon(center.eastNorth);
         }
 
         // Node "center" now is central to all selected nodes.
@@ -211,7 +208,7 @@
         // relative to the distance from the N or S poles.
         if (radius == 0) {
             for (Node n : nodes) {
-                radius += distance(center.eastNorth, n.eastNorth);
+                radius += distance(center, n.eastNorth);
             }
             radius = radius / nodes.size();
         }
@@ -222,9 +219,9 @@
 
         if (regular) { // Make a regular polygon
             double angle = Math.PI * 2 / nodes.size();
-            pc = new PolarCoor(((Node) nodes.toArray()[0]).eastNorth, center.eastNorth, 0);
+            pc = new PolarCoor(((Node) nodes.toArray()[0]).eastNorth, center, 0);
 
-            if (pc.angle > (new PolarCoor(((Node) nodes.toArray()[1]).eastNorth, center.eastNorth, 0).angle))
+            if (pc.angle > (new PolarCoor(((Node) nodes.toArray()[1]).eastNorth, center, 0).angle))
                 angle *= -1;
 
             pc.radius = radius;
@@ -235,7 +232,7 @@
             }
         } else { // Move each node to that distance from the centre.
             for (Node n : nodes) {
-                pc = new PolarCoor(n.eastNorth, center.eastNorth, 0);
+                pc = new PolarCoor(n.eastNorth, center, 0);
                 pc.radius = radius;
                 EastNorth no = pc.toEastNorth();
                 cmds.add(new MoveCommand(n, no.east() - n.eastNorth.east(), no.north() - n.eastNorth.north()));
Index: src/org/openstreetmap/josm/actions/UnGlueAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/UnGlueAction.java	(revision 1629)
+++ src/org/openstreetmap/josm/actions/UnGlueAction.java	(working copy)
@@ -20,7 +20,6 @@
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
-import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -148,8 +147,7 @@
         // If this wasn't called from menu, place it where the cursor is/was
         if(e.getSource() instanceof JPanel) {
             MapView mv = Main.map.mapView;
-            n.eastNorth = mv.getEastNorth(mv.lastMEvent.getX(), mv.lastMEvent.getY());
-            n.coor = Main.proj.eastNorth2latlon(n.eastNorth);
+            n.setEastNorth(mv.getEastNorth(mv.lastMEvent.getX(), mv.lastMEvent.getY()));
         }
         
         cmds.add(new AddCommand(n));
Index: src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 1629)
+++ src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(working copy)
@@ -800,7 +800,7 @@
             // fall through to default action.
             // (for semi-parallel lines, intersection might be miles away!)
             if (Main.map.mapView.getPoint(n.eastNorth).distance(Main.map.mapView.getPoint(intersection)) < snapToIntersectionThreshold) {
-                n.eastNorth = intersection;
+                n.setEastNorth(intersection);
                 return;
             }
 
@@ -813,9 +813,7 @@
             double b = P.distanceSq(A);
             double c = A.distanceSq(B);
             q = (a - b + c) / (2*c);
-            n.eastNorth = new EastNorth(
-                B.east() + q * (A.east() - B.east()),
-                B.north() + q * (A.north() - B.north()));
+            n.setEastNorth(B.east() + q * (A.east() - B.east()), B.north() + q * (A.north() - B.north()));
         }
     }
 
Index: src/org/openstreetmap/josm/actions/PasteAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/PasteAction.java	(revision 1629)
+++ src/org/openstreetmap/josm/actions/PasteAction.java	(working copy)
@@ -16,13 +16,13 @@
 import org.openstreetmap.josm.command.AddCommand;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -69,8 +69,7 @@
             Node nnew = new Node(n);
             nnew.id = 0;
             if (Main.main.editLayer() == source) {
-                nnew.eastNorth = new EastNorth(nnew.eastNorth.east() + offsetEast, nnew.eastNorth.north() + offsetNorth);
-                nnew.coor = Main.proj.eastNorth2latlon(nnew.eastNorth);
+                nnew.setEastNorth(nnew.eastNorth.add(offsetEast, offsetNorth));
             }
             map.put(n, nnew);
         }
Index: src/org/openstreetmap/josm/data/conflict/PositionConflict.java
===================================================================
--- src/org/openstreetmap/josm/data/conflict/PositionConflict.java	(revision 1629)
+++ src/org/openstreetmap/josm/data/conflict/PositionConflict.java	(working copy)
@@ -22,8 +22,7 @@
 
     @Override public void apply(OsmPrimitive target, OsmPrimitive other) {
         if (target instanceof Node) {
-            ((Node)target).coor = ((Node)other).coor;
-            ((Node)target).eastNorth = ((Node)other).eastNorth;
+            ((Node)target).setEastNorth(((Node)other).eastNorth);
             int newversion = Math.max(target.version, other.version);
             // set version on "other" as well in case user decides to keep local
             target.version = newversion;
Index: src/org/openstreetmap/josm/data/osm/Node.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/Node.java	(revision 1629)
+++ src/org/openstreetmap/josm/data/osm/Node.java	(working copy)
@@ -4,8 +4,8 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon.CoordinateFormat;
 import org.openstreetmap.josm.data.osm.visitor.Visitor;
 
@@ -19,7 +19,21 @@
 
     public LatLon coor;
     public volatile EastNorth eastNorth;
-
+        
+    public void setCoor(LatLon coor) {
+        this.coor = coor;
+        this.eastNorth = Main.proj.latlon2eastNorth(coor); 
+    }
+        
+    public void setEastNorth(EastNorth eastNorth) {
+       this.eastNorth = eastNorth;
+       this.coor = Main.proj.eastNorth2latlon(eastNorth);
+    }
+    
+    public void setEastNorth(double east, double north) {
+        this.setEastNorth(new EastNorth(east, north));
+    }
+    
     private static CoordinateFormat mCord;
 
     static {
@@ -46,8 +60,7 @@
     }
 
     public Node(LatLon latlon) {
-        this.coor = latlon;
-        eastNorth = Main.proj.latlon2eastNorth(latlon);
+        setCoor(latlon);
     }
 
     @Override public void visit(Visitor visitor) {
Index: src/org/openstreetmap/josm/command/MoveCommand.java
===================================================================
--- src/org/openstreetmap/josm/command/MoveCommand.java	(revision 1629)
+++ src/org/openstreetmap/josm/command/MoveCommand.java	(working copy)
@@ -14,7 +14,6 @@
 import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.MutableTreeNode;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Node;
@@ -87,8 +86,7 @@
      */
     public void moveAgain(double x, double y) {
         for (Node n : objects) {
-            n.eastNorth = new EastNorth(n.eastNorth.east()+x, n.eastNorth.north()+y);
-            n.coor = Main.proj.eastNorth2latlon(n.eastNorth);
+            n.setEastNorth(n.eastNorth.add(x, y));
         }
         this.x += x;
         this.y += y;
@@ -96,8 +94,7 @@
 
     @Override public boolean executeCommand() {
         for (Node n : objects) {
-            n.eastNorth = new EastNorth(n.eastNorth.east()+x, n.eastNorth.north()+y);
-            n.coor = Main.proj.eastNorth2latlon(n.eastNorth);
+            n.setEastNorth(n.eastNorth.add(x, y));
             n.modified = true;
         }
         return true;
@@ -107,8 +104,7 @@
         Iterator<OldState> it = oldState.iterator();
         for (Node n : objects) {
             OldState os = it.next();
-            n.eastNorth = os.eastNorth;
-            n.coor = os.latlon;
+            n.setEastNorth(os.eastNorth);
             n.modified = os.modified;
         }
     }
Index: src/org/openstreetmap/josm/command/RotateCommand.java
===================================================================
--- src/org/openstreetmap/josm/command/RotateCommand.java	(revision 1629)
+++ src/org/openstreetmap/josm/command/RotateCommand.java	(working copy)
@@ -12,9 +12,7 @@
 import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.MutableTreeNode;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.EastNorth;
-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.visitor.AllNodesVisitor;
@@ -35,7 +33,7 @@
     /**
      * pivot point
      */
-    private Node pivot;
+    private EastNorth pivot;
 
     /**
      * angle of rotation starting click to pivot
@@ -61,8 +59,7 @@
     public RotateCommand(Collection<OsmPrimitive> objects, EastNorth start, EastNorth end) {
 
         this.objects = AllNodesVisitor.getAllNodes(objects);
-        pivot = new Node(new LatLon(0,0));
-        pivot.eastNorth = new EastNorth(0,0);
+        pivot = new EastNorth(0,0);
 
         for (Node n : this.objects) {
             MoveCommand.OldState os = new MoveCommand.OldState();
@@ -70,10 +67,9 @@
             os.latlon = n.coor;
             os.modified = n.modified;
             oldState.put(n, os);
-            pivot.eastNorth = new EastNorth(pivot.eastNorth.east()+os.eastNorth.east(), pivot.eastNorth.north()+os.eastNorth.north());
+            pivot = pivot.add(os.eastNorth.east(), os.eastNorth.north());
         }
-        pivot.eastNorth = new EastNorth(pivot.eastNorth.east()/this.objects.size(), pivot.eastNorth.north()/this.objects.size());
-        pivot.coor = Main.proj.eastNorth2latlon(pivot.eastNorth);
+        pivot = new EastNorth(pivot.east()/this.objects.size(), pivot.north()/this.objects.size());
 
         rotationAngle = Math.PI/2;
         rotateAgain(start, end);
@@ -86,8 +82,8 @@
      */
     public void rotateAgain(EastNorth start, EastNorth end) {
         // compute angle
-        startAngle = Math.atan2(start.east()-pivot.eastNorth.east(), start.north()-pivot.eastNorth.north());
-        double endAngle = Math.atan2(end.east()-pivot.eastNorth.east(), end.north()-pivot.eastNorth.north());
+        startAngle = Math.atan2(start.east()-pivot.east(), start.north()-pivot.north());
+        double endAngle = Math.atan2(end.east()-pivot.east(), end.north()-pivot.north());
         rotationAngle += startAngle - endAngle;
         rotateNodes(false);
     }
@@ -101,12 +97,11 @@
             double cosPhi = Math.cos(rotationAngle);
             double sinPhi = Math.sin(rotationAngle);
             EastNorth oldEastNorth = oldState.get(n).eastNorth;
-            double x = oldEastNorth.east() - pivot.eastNorth.east();
-            double y = oldEastNorth.north() - pivot.eastNorth.north();
-            double nx =  sinPhi * x + cosPhi * y + pivot.eastNorth.east();
-            double ny = -cosPhi * x + sinPhi * y + pivot.eastNorth.north();
-            n.eastNorth = new EastNorth(nx, ny);
-            n.coor = Main.proj.eastNorth2latlon(n.eastNorth);
+            double x = oldEastNorth.east() - pivot.east();
+            double y = oldEastNorth.north() - pivot.north();
+            double nx =  sinPhi * x + cosPhi * y + pivot.east();
+            double ny = -cosPhi * x + sinPhi * y + pivot.north();
+            n.setEastNorth(nx, ny);
             if (setModified)
                 n.modified = true;
         }
@@ -120,8 +115,7 @@
     @Override public void undoCommand() {
         for (Node n : objects) {
             MoveCommand.OldState os = oldState.get(n);
-            n.eastNorth = os.eastNorth;
-            n.coor = os.latlon;
+            n.setEastNorth(os.eastNorth);
             n.modified = os.modified;
         }
     }
