Index: src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 14749)
+++ src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(working copy)
@@ -6,8 +6,11 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
+import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Enumeration;
@@ -46,6 +49,7 @@
 import org.openstreetmap.josm.data.validation.OsmValidator;
 import org.openstreetmap.josm.data.validation.TestError;
 import org.openstreetmap.josm.data.validation.ValidatorVisitor;
+import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.PopupMenuHandler;
@@ -63,6 +67,7 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.InputMapUtils;
 import org.openstreetmap.josm.tools.JosmRuntimeException;
+import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Shortcut;
 import org.xml.sax.SAXException;
 
@@ -85,6 +90,8 @@
     private final SideButton fixButton;
     /** The ignore button */
     private final SideButton ignoreButton;
+    /** The reset ignorelist button */
+    private final SideButton resetignorelistButton;
     /** The select button */
     private final SideButton selectButton;
     /** The lookup button */
@@ -177,6 +184,57 @@
         } else {
             ignoreButton = null;
         }
+
+        resetignorelistButton = new SideButton(new AbstractAction() {
+            int reset = 0;
+            {
+                toggle();
+            }
+
+            public void toggle() {
+                this.setEnabled(true);
+                if (!OsmValidator.getIgnoredErrors().isEmpty()) {
+                    putValue(NAME, tr("Clear Ignore"));
+                    putValue(SHORT_DESCRIPTION, tr("Clear ignore list"));
+                    new ImageProvider("dialogs", "fix").getResource().attachImageIcon(this, true);
+                    reset = 1;
+                } else {
+                    File ignoredErrors = new File(OsmValidator.getValidatorDir());
+                    ignoredErrors = new File(ignoredErrors.getAbsolutePath() + File.separator + "ignorederrors.bak");
+                    if (ignoredErrors.isFile()) {
+                        putValue(NAME, tr("Restore Ignore"));
+                        putValue(SHORT_DESCRIPTION, tr("Restore ignore list"));
+                        new ImageProvider("copy").getResource().attachImageIcon(this, true);
+                        reset = 2;
+                    } else if (!OsmValidator.getIgnoredErrors().isEmpty()) {
+                        putValue(NAME, tr("Save Ignore"));
+                        putValue(SHORT_DESCRIPTION, tr("Save ignore list"));
+                        new ImageProvider("save").getResource().attachImageIcon(this, true);
+                        reset = 3;
+                    } else {
+                        putValue(NAME, tr("Ignore list modification"));
+                        putValue(SHORT_DESCRIPTION, tr("Clear/Restore/Save the ignore list, depending upon various conditions"));
+                        new ImageProvider("dialogs", "validator").getResource().attachImageIcon(this, true);
+                        //this.setEnabled(false); // TODO enable when I figure out how to call from ignore
+                    }
+                }
+            }
+
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                if (reset == 1) {
+                    resetErrorList();
+                } else if (reset == 2) {
+                    restoreErrorList();
+                } else if (reset == 3 && !OsmValidator.getIgnoredErrors().isEmpty()) {
+                    OsmValidator.saveIgnoredErrors();
+                } else if (reset == 0) {
+                    // Do nothing
+                }
+                toggle();
+            }
+        });
+        buttons.add(resetignorelistButton);
         createLayout(tree, true, buttons);
     }
 
@@ -285,6 +343,67 @@
     }
 
     /**
+     * Prompt to rerun the validator when the ignore list changes
+     */
+    public void rerunValidatorPrompt() {
+        final int answer = ConditionalOptionPaneUtil.showOptionDialog(
+                "rerun_validation_when_ignorelist_changed",
+                MainApplication.getMainFrame(),
+                tr("Should the validation be rerun?"),
+                tr("ignorederrors list changed"),
+                JOptionPane.YES_NO_CANCEL_OPTION,
+                JOptionPane.QUESTION_MESSAGE,
+                null,
+                null);
+        if (answer == JOptionPane.YES_OPTION) {
+            validateAction.doValidate(true);
+        }
+    }
+
+    /**
+     * Reset the error list by deleting ignorederrors
+     */
+    public void resetErrorList() {
+        OsmValidator.saveIgnoredErrors();
+        File ignoredErrors = new File(OsmValidator.getValidatorDir(), "ignorederrors");
+        if (!ignoredErrors.isFile()) return;
+        File ignoredErrorsBak = new File(ignoredErrors.getAbsolutePath() + ".bak");
+        try {
+            Files.move(ignoredErrors.toPath(), ignoredErrorsBak.toPath(), StandardCopyOption.REPLACE_EXISTING);
+        } catch (IOException e) {
+            ignoredErrors.delete();
+        }
+        OsmValidator.initialize();
+        rerunValidatorPrompt();
+    }
+
+    /**
+     * Restore the error list by copying ignorederrors.bak to ignorederrors
+     */
+    public void restoreErrorList() {
+        OsmValidator.saveIgnoredErrors();
+        File ignoredErrors = new File(OsmValidator.getValidatorDir(), "ignorederrors");
+        File ignoredErrorsBak = new File(ignoredErrors.getAbsolutePath() + ".bak");
+        if (!ignoredErrors.isFile() || !ignoredErrorsBak.isFile()) return;
+        File ignoredErrorsBak2 = new File(ignoredErrorsBak.getAbsolutePath() + "2");
+        try {
+            Files.move(ignoredErrors.toPath(),
+                    ignoredErrorsBak2.toPath(),
+                    StandardCopyOption.REPLACE_EXISTING);
+            if (ignoredErrorsBak.isFile()) {
+                Files.move(ignoredErrorsBak.toPath(),
+                        ignoredErrors.toPath(), StandardCopyOption.REPLACE_EXISTING);
+            }
+            Files.move(ignoredErrorsBak2.toPath(),
+                    ignoredErrorsBak.toPath(), StandardCopyOption.REPLACE_EXISTING);
+        } catch (IOException e) {
+            Logging.debug(e);
+        }
+        OsmValidator.initialize();
+        rerunValidatorPrompt();
+    }
+
+    /**
      * Sets the selection of the map to the current selected items.
      */
     @SuppressWarnings("unchecked")
Index: src/org/openstreetmap/josm/data/validation/OsmValidator.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/OsmValidator.java	(revision 14749)
+++ src/org/openstreetmap/josm/data/validation/OsmValidator.java	(working copy)
@@ -241,6 +241,14 @@
     }
 
     /**
+     * Get the list of all ignored errors
+     * @return The <code>Collection&ltString&gt</code> of errors that are ignored
+     */
+    public static Collection<String> getIgnoredErrors() {
+        return ignoredErrors;
+    }
+
+    /**
      * Saves the names of the ignored errors to a file
      */
     public static void saveIgnoredErrors() {
