Index: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 3165)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 3166)
@@ -19,4 +19,5 @@
 
 import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
 import org.openstreetmap.josm.data.osm.event.ChangesetIdChangedEvent;
@@ -201,4 +202,5 @@
                     tr("Unable to add primitive {0} to the dataset because it is already included", primitive.toString()));
 
+        primitive.updatePosition(); // Set cached bbox for way and relation (required for reindexWay and reinexRelation to work properly)
         if (primitive instanceof Node) {
             nodes.add((Node) primitive);
@@ -209,5 +211,5 @@
         }
         allPrimitives.add(primitive);
-        primitive.setDataset(this);
+        primitive.setDataset(this);        
         firePrimitivesAdded(Collections.singletonList(primitive), false);
     }
@@ -765,7 +767,7 @@
     }
 
-    private void reindexNode(Node node) {
+    private void reindexNode(Node node, LatLon newCoor) {
         nodes.remove(node);
-        node.updatePosition();
+        node.setCoorInternal(newCoor);
         nodes.add(node);
         for (OsmPrimitive primitive: node.getReferrers()) {
@@ -868,6 +870,6 @@
     }
 
-    void fireNodeMoved(Node node) {
-        reindexNode(node);
+    void fireNodeMoved(Node node, LatLon newCoor) {
+        reindexNode(node, newCoor);
         fireEvent(new NodeMovedEvent(this, node));
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/Node.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 3165)
+++ trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 3166)
@@ -2,4 +2,5 @@
 package org.openstreetmap.josm.data.osm;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.CachedLatLon;
 import org.openstreetmap.josm.data.coor.EastNorth;
@@ -15,15 +16,11 @@
 
     private CachedLatLon coor;
-    private BBox bbox;
 
     public final void setCoor(LatLon coor) {
         if(coor != null){
-            if(this.coor == null) {
-                this.coor = new CachedLatLon(coor);
+            if (getDataSet() != null) {
+                getDataSet().fireNodeMoved(this, coor);
             } else {
-                this.coor.setCoor(coor);
-            }
-            if (getDataSet() != null) {
-                getDataSet().fireNodeMoved(this);
+                setCoorInternal(coor);
             }
         }
@@ -35,14 +32,6 @@
 
     public final void setEastNorth(EastNorth eastNorth) {
-        if(eastNorth != null)
-        {
-            if(coor != null) {
-                coor.setEastNorth(eastNorth);
-            } else {
-                coor = new CachedLatLon(eastNorth);
-            }
-            if (getDataSet() != null) {
-                getDataSet().fireNodeMoved(this);
-            }
+        if(eastNorth != null) {
+            setCoor(Main.proj.eastNorth2latlon(eastNorth));
         }
     }
@@ -50,4 +39,15 @@
     public final EastNorth getEastNorth() {
         return coor != null ? coor.getEastNorth() : null;
+    }
+
+    /**
+     * To be used only by Dataset.reindexNode
+     */
+    protected void setCoorInternal(LatLon coor) {
+        if(this.coor == null) {
+            this.coor = new CachedLatLon(coor);
+        } else {
+            this.coor.setCoor(coor);
+        }
     }
 
@@ -187,15 +187,9 @@
     @Override
     public BBox getBBox() {
-        if (getDataSet() == null)
-            return new BBox(this);
-        if (bbox == null) {
-            bbox = new BBox(this);
-        }
-        return new BBox(bbox);
+        return new BBox(this);
     }
 
     @Override
     public void updatePosition() {
-        bbox = new BBox(this);
         // TODO: replace CachedLatLon with simple doubles and update precalculated EastNorth value here
     }
