Index: src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- src/org/openstreetmap/josm/data/Preferences.java	(revision 16899)
+++ src/org/openstreetmap/josm/data/Preferences.java	(working copy)
@@ -13,7 +13,9 @@
 import java.io.Reader;
 import java.io.StringWriter;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 import java.nio.file.InvalidPathException;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -922,4 +924,37 @@
             saveOnPut = enable;
         }
     }
+
+    /**
+     * Cleanup entries where it is the same as the default, or it matches some other condition (for example, cached files).
+     * This should (generally) be run by JOSM core, <i>not</i> plugins.
+     *
+     * @throws IOException - if any I/O error occurs
+     * @since xxx
+     */
+    public void cleanup() throws IOException {
+        List<String> keysToRemove = new ArrayList<>();
+        for (Map.Entry<String, Setting<?>> defaultSetting : defaultsMap.entrySet()) {
+            Setting<?> setting = this.settingsMap.get(defaultSetting.getKey());
+            if ((setting != null && setting.equals(setting.getValue()))
+                    || (setting == null && defaultSetting.getValue() == null)) {
+                keysToRemove.add(defaultSetting.getKey());
+            } else if (defaultSetting.getKey() != null && defaultSetting.getKey().startsWith("mirror.") &&
+                    !defaultSetting.getKey().equals("mirror.maxtime")) {
+                if (defaultSetting.getValue() == null || setting == null) {
+                    keysToRemove.add(defaultSetting.getKey());
+                } else if (setting instanceof ListSetting) {
+                    ListSetting listSetting = (ListSetting) setting;
+                    if (listSetting.getValue().isEmpty() || Long.parseLong(listSetting.getValue().get(0)) < System.currentTimeMillis()) {
+                        Files.deleteIfExists(Paths.get(listSetting.getValue().get(1)));
+                        keysToRemove.add(defaultSetting.getKey());
+                    }
+                }
+            }
+        }
+        keysToRemove.stream().forEach(this.defaultsMap::remove);
+        keysToRemove.stream().forEach(this.settingsMap::remove);
+        this.save();
+        this.saveDefaults();
+    }
 }
