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
     }
Index: trunk/test/unit/org/openstreetmap/josm/data/osm/QuadBucketsTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/osm/QuadBucketsTest.java	(revision 3165)
+++ trunk/test/unit/org/openstreetmap/josm/data/osm/QuadBucketsTest.java	(revision 3166)
@@ -9,4 +9,5 @@
 import org.junit.Test;
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.projection.Mercator;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
@@ -15,8 +16,5 @@
 public class QuadBucketsTest {
 
-    @Test
-    public void testRemove() throws Exception {
-        Main.proj = new Mercator();
-        DataSet ds = OsmReader.parseDataSet(new FileInputStream("data_nodist/restriction.osm"), NullProgressMonitor.INSTANCE);
+    private void removeAllTest(DataSet ds) {
         List<Node> allNodes = new ArrayList<Node>(ds.getNodes());
         List<Way> allWays = new ArrayList<Way>(ds.getWays());
@@ -37,3 +35,22 @@
     }
 
+    @Test
+    public void testRemove() throws Exception {
+        Main.proj = new Mercator();
+        DataSet ds = OsmReader.parseDataSet(new FileInputStream("data_nodist/restriction.osm"), NullProgressMonitor.INSTANCE);
+        removeAllTest(ds);
+    }
+
+    @Test
+    public void testMove() throws Exception {
+        Main.proj = new Mercator();
+        DataSet ds = OsmReader.parseDataSet(new FileInputStream("data_nodist/restriction.osm"), NullProgressMonitor.INSTANCE);
+
+        for (Node n: ds.getNodes()) {
+            n.setCoor(new LatLon(10, 10));
+        }
+
+        removeAllTest(ds);
+    }
+
 }
