Index: applications/editors/josm/plugins/reverter/build.xml
===================================================================
--- applications/editors/josm/plugins/reverter/build.xml	(revision 34957)
+++ applications/editors/josm/plugins/reverter/build.xml	(revision 34958)
@@ -4,5 +4,5 @@
     <property name="commit.message" value="Reverter: Update MultiOsmReader to support null data after redaction"/>
     <!-- enter the *lowest* JOSM version this plugin is currently compatible with -->
-    <property name="plugin.main.version" value="14153"/>
+    <property name="plugin.main.version" value="14946"/>
 
     <!-- Configure these properties (replace "..." accordingly).
Index: applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java
===================================================================
--- applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java	(revision 34957)
+++ applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java	(revision 34958)
@@ -10,4 +10,5 @@
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -20,4 +21,7 @@
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Changeset;
+import org.openstreetmap.josm.data.osm.ChangesetDataSet;
+import org.openstreetmap.josm.data.osm.ChangesetDataSet.ChangesetDataSetEntry;
+import org.openstreetmap.josm.data.osm.ChangesetDataSet.ChangesetModificationType;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
@@ -39,12 +43,8 @@
 import org.openstreetmap.josm.io.MultiFetchServerObjectReader;
 import org.openstreetmap.josm.io.OsmApiException;
+import org.openstreetmap.josm.io.OsmServerChangesetReader;
 import org.openstreetmap.josm.io.OsmTransferException;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
-
-import reverter.corehacks.ChangesetDataSet;
-import reverter.corehacks.ChangesetDataSet.ChangesetDataSetEntry;
-import reverter.corehacks.ChangesetDataSet.ChangesetModificationType;
-import reverter.corehacks.OsmServerChangesetReader;
 
 /**
@@ -80,4 +80,5 @@
     private final HashSet<HistoryOsmPrimitive> updated = new HashSet<>();
     private final HashSet<HistoryOsmPrimitive> deleted = new HashSet<>();
+    private final HashMap<PrimitiveId, Integer> earliestVersions = new HashMap<>();
 
     //// Handling missing objects
@@ -142,7 +143,7 @@
         this.revertType = revertType;
 
-        OsmServerChangesetReader csr = new OsmServerChangesetReader();
+        OsmServerChangesetReader csr = new OsmServerChangesetReader(true);
         monitor.beginTask("", 2);
-        changeset = csr.readChangeset(changesetId, monitor.createSubTaskMonitor(1, false));
+        changeset = csr.readChangeset(changesetId, false, monitor.createSubTaskMonitor(1, false));
         if (MODERATOR_REDACTION_ACCOUNTS.contains(changeset.getUser().getId())) {
             throw new RevertRedactedChangesetException(tr("It is not allowed to revert changeset from {0}", changeset.getUser().getName()));
@@ -158,14 +159,14 @@
 
         // Build our own lists of created/updated/modified objects for better performance
-        for (Iterator<ChangesetDataSetEntry> it = cds.iterator(); it.hasNext();) {
-            ChangesetDataSetEntry entry = it.next();
-            if (!checkOsmChangeEntry(entry)) continue;
-            if (entry.getModificationType() == ChangesetModificationType.CREATED) {
-                created.add(entry.getPrimitive());
-            } else if (entry.getModificationType() == ChangesetModificationType.UPDATED) {
-                updated.add(entry.getPrimitive());
-            } else if (entry.getModificationType() == ChangesetModificationType.DELETED) {
-                deleted.add(entry.getPrimitive());
-            } else throw new AssertionError();
+        for (PrimitiveId id : cds.getIds()) {
+            ChangesetDataSetEntry first = cds.getFirstEntry(id);
+            ChangesetDataSetEntry last = cds.getLastEntry(id);
+            earliestVersions.put(id, (int) first.getPrimitive().getVersion());
+            if (first.getModificationType() == ChangesetModificationType.CREATED)
+                created.add(first.getPrimitive());
+            else if (last.getModificationType() == ChangesetModificationType.UPDATED)
+                updated.add(last.getPrimitive());
+            else if (last.getModificationType() == ChangesetModificationType.DELETED)
+                deleted.add(last.getPrimitive());
         }
     }
@@ -220,5 +221,8 @@
                 for (HistoryOsmPrimitive entry : collection) {
                     PrimitiveId id = entry.getPrimitiveId();
-                    readObjectVersion(rdr, id, cds.getEarliestVersion(id)-1, progressMonitor);
+                    Integer earliestVersion = earliestVersions.get(id);
+                    if (earliestVersion == null || earliestVersion <= 1)
+                        throw new OsmTransferException(tr("Unexpected data in changeset #{1}" , String.valueOf(changesetId)));
+                    readObjectVersion(rdr, id, earliestVersion - 1, progressMonitor);
                     if (progressMonitor.isCanceled()) return;
                 }
