Index: applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java
===================================================================
--- applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java	(revision 36230)
+++ applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java	(revision 36233)
@@ -504,5 +504,5 @@
 
     public void fixNodesWithoutCoordinates(ProgressMonitor progressMonitor) throws OsmTransferException {
-        Collection<Node> nodes = nds.getNodes();
+        Collection<Node> nodes = new ArrayList<>(nds.getNodes());
         int num = nodes.size();
         progressMonitor.beginTask(addChangesetIdPrefix(
@@ -510,4 +510,12 @@
                 // downloads == num ticks, then we get the downloaded data (1 tick), then we process the nodes (num ticks)
                 2 * num + 1);
+
+        // Remove primitives where we already know the LatLon.
+        nodes.removeIf(n -> {
+            PrimitiveId id = n.getPrimitiveId();
+            OsmPrimitive p = ds.getPrimitiveById(id);
+            return !(p instanceof Node) || ((Node) p).isLatLonKnown();
+        });
+        progressMonitor.worked(num - nodes.size());
 
         // Do bulk version fetches first
@@ -526,20 +534,5 @@
                 versionMap.replaceAll((key, value) -> value - 1);
                 versionMap.values().removeIf(i -> i <= 0);
-                ds.update(() -> {
-                    for (Node n : nodes) {
-                        if (!n.isDeleted() && !n.isLatLonKnown()) {
-                            final Node historyNode = (Node) history.getPrimitiveById(n);
-                            if (historyNode != null && historyNode.isLatLonKnown()
-                                    && changeset.getClosedAt().isAfter(historyNode.getInstant())) {
-                                n.load(historyNode.save());
-                                versionMap.remove(n.getUniqueId());
-                                progressMonitor.worked(1);
-                            }
-                        }
-                        if (progressMonitor.isCanceled()) {
-                            break;
-                        }
-                    }
-                });
+                ds.update(() -> updateNodes(progressMonitor, nodes, versionMap, history));
                 if (progressMonitor.isCanceled()) {
                     break;
@@ -548,4 +541,28 @@
         } finally {
             progressMonitor.finishTask();
+        }
+    }
+
+    /**
+     * Update nodes lacking a lat/lon
+     * @param progressMonitor The monitor to update
+     * @param nodes The nodes to update
+     * @param versionMap The version map to update for the next round
+     * @param history The history dataset
+     */
+    private void updateNodes(ProgressMonitor progressMonitor, Collection<Node> nodes, Map<Long, Integer> versionMap, DataSet history) {
+        for (Node n : nodes) {
+            if (!n.isDeleted() && !n.isLatLonKnown()) {
+                final Node historyNode = (Node) history.getPrimitiveById(n);
+                if (historyNode != null && historyNode.isLatLonKnown()
+                        && changeset.getClosedAt().isAfter(historyNode.getInstant())) {
+                    n.load(historyNode.save());
+                    versionMap.remove(n.getUniqueId());
+                    progressMonitor.worked(1);
+                }
+            }
+            if (progressMonitor.isCanceled()) {
+                break;
+            }
         }
     }
