Index: /trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 14844)
+++ /trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 14845)
@@ -284,8 +284,11 @@
      * Executes the command and add it to the intern command queue.
      * @param c The command to execute. Must not be {@code null}.
-     */
-    public void addNoRedraw(final Command c) {
+     * @param execute true: Execute, else it is assumed that the command was already executed
+     */
+    public void addNoRedraw(final Command c, boolean execute) {
         CheckParameterUtil.ensureParameterNotNull(c, "c");
-        c.executeCommand();
+        if (execute) {
+            c.executeCommand();
+        }
         commands.add(c);
         // Limit the number of commands in the undo list.
@@ -325,9 +328,20 @@
 
     /**
+     * Executes the command only if wanted and add it to the intern command queue.
+     * @param c The command to execute. Must not be {@code null}.
+     * @param execute true: Execute, else it is assumed that the command was already executed
+     */
+    public void add(final Command c, boolean execute) {
+        addNoRedraw(c, execute);
+        afterAdd(c);
+
+    }
+
+    /**
      * Executes the command and add it to the intern command queue.
      * @param c The command to execute. Must not be {@code null}.
      */
     public synchronized void add(final Command c) {
-        addNoRedraw(c);
+        addNoRedraw(c, true);
         afterAdd(c);
     }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 14844)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 14845)
@@ -35,4 +35,5 @@
 import org.openstreetmap.josm.actions.relation.EditRelationAction;
 import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.DataSelectionListener;
@@ -604,8 +605,10 @@
         protected void fixError(TestError error) throws InterruptedException, InvocationTargetException {
             if (error.isFixable()) {
-                final Command fixCommand = error.getFix();
-                if (fixCommand != null) {
-                    SwingUtilities.invokeAndWait(() -> UndoRedoHandler.getInstance().addNoRedraw(fixCommand));
-                    fixCommands.add(fixCommand);
+                if (error.getPrimitives().stream().noneMatch(OsmPrimitive::isDeleted)) {
+                    final Command fixCommand = error.getFix();
+                    if (fixCommand != null) {
+                        SwingUtilities.invokeAndWait(fixCommand::executeCommand);
+                        fixCommands.add(fixCommand);
+                    }
                 }
                 // It is wanted to ignore an error if it said fixable, even if fixCommand was null
@@ -638,15 +641,38 @@
                 monitor.subTask(tr("Updating map ..."));
                 SwingUtilities.invokeAndWait(() -> {
-                    UndoRedoHandler.getInstance().afterAdd(fixCommands);
+                    if (!fixCommands.isEmpty()) {
+                        UndoRedoHandler.getInstance().add(
+                                fixCommands.size() > 1 ? new AutofixCommand(fixCommands) : fixCommands.get(0), false);
+                    }
                     invalidateValidatorLayers();
                     tree.resetErrors();
                 });
-            } catch (InterruptedException | InvocationTargetException e) {
+            } catch (InterruptedException e) {
+                tryUndo();
+                throw new JosmRuntimeException(e);
+            } catch (InvocationTargetException e) {
                 // FIXME: signature of realRun should have a generic checked exception we could throw here
                 throw new JosmRuntimeException(e);
             } finally {
+                if (monitor.isCanceled()) {
+                    tryUndo();
+                }
                 monitor.finishTask();
             }
         }
+
+        /**
+         * Undo commands as they were not yet added to the UndoRedo Handler
+         */
+        private void tryUndo() {
+            final DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
+            int i = fixCommands.size() - 1;
+            ds.beginUpdate();
+            for (; i >= 0; i--) {
+                fixCommands.get(i).undoCommand();
+            }
+            ds.endUpdate();
+        }
+
     }
 
@@ -663,3 +689,25 @@
         super.destroy();
     }
+
+    private class AutofixCommand extends SequenceCommand {
+        AutofixCommand(Collection<Command> sequenz) {
+            super(tr("auto-fixed validator issues"), sequenz, true);
+            setSequenceComplete(true);
+        }
+
+        @Override
+        public void undoCommand() {
+            getAffectedDataSet().beginUpdate();
+            super.undoCommand();
+            getAffectedDataSet().endUpdate();
+        }
+
+        @Override
+        public boolean executeCommand() {
+            getAffectedDataSet().beginUpdate();
+            boolean rc = super.executeCommand();
+            getAffectedDataSet().endUpdate();
+            return rc;
+        }
+    }
 }
