Index: src/reverter/ChangesetReverter.java
===================================================================
--- src/reverter/ChangesetReverter.java	(revision 34921)
+++ src/reverter/ChangesetReverter.java	(working copy)
@@ -4,6 +4,7 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.net.HttpURLConnection;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -23,7 +24,6 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.PrimitiveId;
 import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.RelationMemberData;
 import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
 import org.openstreetmap.josm.data.osm.Way;
@@ -343,12 +343,13 @@
      *
      */
     public List<Command> getCommands() {
-        if (this.nds == null) return null;
+    	List<Command> cmds = new ArrayList<>();
+        if (this.nds == null) return cmds;
 
         //////////////////////////////////////////////////////////////////////////
         // Create commands to restore/update all affected objects
         DataSetCommandMerger merger = new DataSetCommandMerger(nds, ds);
-        List<Command> cmds = merger.getCommandList();
+        cmds.addAll(merger.getCommandList());
 
         //////////////////////////////////////////////////////////////////////////
         // Create a set of objects to be deleted
@@ -439,25 +440,33 @@
     }
 
     public void fixNodesWithoutCoordinates(ProgressMonitor progressMonitor) throws OsmTransferException {
+        DataSet mod = new DataSet();
         for (Node n : nds.getNodes()) {
             if (!n.isDeleted() && n.getCoor() == null) {
                 PrimitiveId id = n.getPrimitiveId();
                 OsmPrimitive p = ds.getPrimitiveById(id);
-                if (p instanceof Node && p.getVersion() > 1) {
-                    LatLon coor = ((Node) p).getCoor();
-                    if (coor == null) {
-                        final OsmServerMultiObjectReader rdr = new OsmServerMultiObjectReader();
-                        readObjectVersion(rdr, id, p.getVersion()-1, progressMonitor);
-                        Collection<OsmPrimitive> result = rdr.parseOsm(progressMonitor.createSubTaskMonitor(1, true)).allPrimitives();
-                        if (!result.isEmpty()) {
-                            coor = ((Node) result.iterator().next()).getCoor();
+                if (p instanceof Node) {
+                    if (p.getVersion() == 1 && ((Node) p).isLatLonKnown()) {
+                        n.cloneFrom(p);
+                    } else if (p.getVersion() > 1 && !((Node) p).isLatLonKnown()) {
+                        int version = p.getVersion() - 1;
+                        while (version > 0) {
+                            final OsmServerMultiObjectReader rdr = new OsmServerMultiObjectReader();
+                            readObjectVersion(rdr, id, version, progressMonitor);
+                            DataSet history = rdr.parseOsm(progressMonitor.createSubTaskMonitor(1, true));
+                            if (!history.isEmpty() ) {
+                                Node historyNode = (Node) history.allPrimitives().iterator().next();
+                                if (historyNode.isLatLonKnown() && changeset.getClosedAt().after(historyNode.getTimestamp())) {
+                                    mod.mergeFrom(history);
+                                    break;
+                                }
+                            }
+                            --version;
                         }
                     }
-                    if (coor != null) {
-                        n.setCoor(coor);
-                    }
                 }
             }
         }
+        nds.mergeFrom(mod);
     }
 }
