Index: /applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java
===================================================================
--- /applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java	(revision 34929)
+++ /applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java	(revision 34930)
@@ -5,4 +5,5 @@
 
 import java.net.HttpURLConnection;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -24,5 +25,4 @@
 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;
@@ -92,19 +92,12 @@
         for (HistoryOsmPrimitive p : primitives) {
             addIfMissing(p.getPrimitiveId());
-            if (p.getType() == OsmPrimitiveType.WAY) {
-                for (long nd : ((HistoryWay) p).getNodes()) {
-                    addIfMissing(new SimplePrimitiveId(nd, OsmPrimitiveType.NODE));
-                }
-            }
-        }
-    }
-
-    private void addMissingIds(Iterable<OsmPrimitive> primitives) {
-        for (OsmPrimitive p : primitives) {
-            addIfMissing(p);
-            if (p.getType() == OsmPrimitiveType.WAY) {
-                for (Node nd : ((Way) p).getNodes()) {
-                    addIfMissing(nd);
-                }
+        }
+    }
+
+    private void addMissingId(OsmPrimitive p) {
+        addIfMissing(p);
+        if (p.getType() == OsmPrimitiveType.WAY) {
+            for (Node nd : ((Way) p).getNodes()) {
+                addIfMissing(nd);
             }
         }
@@ -233,5 +226,5 @@
             for (OsmPrimitive p : nds.allPrimitives()) {
                 if (!p.isIncomplete()) {
-                    addMissingIds(Collections.singleton(p));
+                    addMissingId(p);
                 } else {
                     if (ds.getPrimitiveById(p.getPrimitiveId()) == null) {
@@ -344,10 +337,11 @@
      */
     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());
 
         //////////////////////////////////////////////////////////////////////////
@@ -444,17 +438,20 @@
                 PrimitiveId id = n.getPrimitiveId();
                 OsmPrimitive p = ds.getPrimitiveById(id);
-                if (p instanceof Node && p.getVersion() > 1) {
-                    LatLon coor = ((Node) p).getCoor();
-                    if (coor == null) {
+                if (p instanceof Node && !((Node) p).isLatLonKnown()) {
+                    int version = p.getVersion();
+                    while (version > 1) {
+                        // find the version that was in use when the current changeset was closed
+                        --version;
                         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();
+                        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())) {
+                                n.load(historyNode.save());
+                                break;
+                            }
                         }
                     }
-                    if (coor != null) {
-                        n.setCoor(coor);
-                    }
                 }
             }
