Index: /applications/editors/josm/plugins/undelete/build.xml
===================================================================
--- /applications/editors/josm/plugins/undelete/build.xml	(revision 35397)
+++ /applications/editors/josm/plugins/undelete/build.xml	(revision 35398)
@@ -4,5 +4,5 @@
     <property name="commit.message" value="adapt to core changes (backwards compatible)"/>
     <!-- enter the *lowest* JOSM version this plugin is currently compatible with -->
-    <property name="plugin.main.version" value="14763"/>
+    <property name="plugin.main.version" value="16205"/>
 
     <property name="plugin.author" value="Nakor"/>
Index: /applications/editors/josm/plugins/undelete/src/org/openstreetmap/josm/plugins/undelete/UndeleteAction.java
===================================================================
--- /applications/editors/josm/plugins/undelete/src/org/openstreetmap/josm/plugins/undelete/UndeleteAction.java	(revision 35397)
+++ /applications/editors/josm/plugins/undelete/src/org/openstreetmap/josm/plugins/undelete/UndeleteAction.java	(revision 35398)
@@ -3,4 +3,5 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
 
 import java.awt.event.ActionEvent;
@@ -35,7 +36,7 @@
 import org.openstreetmap.josm.data.osm.history.HistoryWay;
 import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.gui.history.HistoryLoadTask;
 import org.openstreetmap.josm.gui.io.DownloadPrimitivesTask;
+import org.openstreetmap.josm.gui.io.DownloadPrimitivesWithReferrersTask;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.GuiHelper;
@@ -58,10 +59,14 @@
         private Set<OsmPrimitive> restored;
 
-        private Worker(OsmPrimitive parent, OsmDataLayer layer, List<PrimitiveId> ids, Set<OsmPrimitive> restored) {
-            this.parent = parent;
-            this.layer = layer;
-            this.ids = ids;
-            this.restored = restored != null ? restored : new LinkedHashSet<>();
-        }
+		private Set<PrimitiveId> missingPrimitives;
+
+		private Worker(OsmPrimitive parent, OsmDataLayer layer, List<PrimitiveId> ids, Set<OsmPrimitive> restored,
+				HistoryLoadTask task) {
+			this.parent = parent;
+			this.layer = layer;
+			this.ids = ids;
+			this.restored = restored;
+			this.missingPrimitives = task.getMissingPrimitives();
+		}
 
         @Override
@@ -69,4 +74,8 @@
             List<Node> nodes = new ArrayList<>();
             for (PrimitiveId pid : ids) {
+				if (missingPrimitives == null || missingPrimitives.contains(pid)) {
+					continue;
+				}
+
                 OsmPrimitive primitive = layer.data.getPrimitiveById(pid);
                 if (primitive == null) {
@@ -77,8 +86,8 @@
                         History h = HistoryDataSet.getInstance().getHistory(id, type);
 
-                        if (h == null) {
-                            Logging.warn("Cannot find history for " + type + " " + id);
-                            return;
-                        }
+						if (h == null) {
+							Logging.warn("Cannot find history for " + type + " " + id);
+							return;
+						}
 
                         HistoryOsmPrimitive hPrimitive1 = h.getLatest();
@@ -186,14 +195,4 @@
                                 layer.data.addPrimitive(primitive);
                                 restored.add(primitive);
-                            } else {
-                              final String msg = OsmPrimitiveType.NODE == type
-                                  ? tr("Unable to undelete node {0}. Object has likely been redacted", id)
-                                  : OsmPrimitiveType.WAY == type
-                                  ? tr("Unable to undelete way {0}. Object has likely been redacted", id)
-                                  : OsmPrimitiveType.RELATION == type
-                                  ? tr("Unable to undelete relation {0}. Object has likely been redacted", id)
-                                  : null;
-                                GuiHelper.runInEDT(() -> new Notification(msg).setIcon(JOptionPane.WARNING_MESSAGE).show());
-                                Logging.warn(msg);
                             }
                         }
@@ -215,5 +214,20 @@
                 });
             }
+            if (missingPrimitives != null && !missingPrimitives.isEmpty()) {
+                GuiHelper.runInEDTAndWait(() -> DownloadPrimitivesWithReferrersTask.reportProblemDialog(missingPrimitives,
+                        trn("Object could not be undeleted", "Some objects could not be undeleted", missingPrimitives.size()),
+                        trn("One object could not be undeleted.<br>",
+                                "{0} objects could not be undeleted.<br>",
+                                missingPrimitives.size(),
+                                missingPrimitives.size())
+                                + tr("The server replied with response code 404.<br>"
+                                     + "This usually means, the server does not know an object with the requested id. Maybe it was redacted."),
+                        tr("missing objects:"),
+                        JOptionPane.ERROR_MESSAGE
+                        ).showDialog());
+
+            }
         }
+
     }
 
@@ -255,4 +269,5 @@
         HistoryLoadTask task = new HistoryLoadTask();
         task.setChangesetDataNeeded(false);
+        task.setCollectMissing(true);
         for (PrimitiveId id : ids) {
             task.add(id);
@@ -260,5 +275,5 @@
 
         MainApplication.worker.execute(task);
-        MainApplication.worker.submit(new Worker(parent, layer, ids, restored));
+        MainApplication.worker.submit(new Worker(parent, layer, ids, restored, task));
     }
 }
