Index: josm/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
===================================================================
--- josm/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(Revision 8650)
+++ josm/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(Arbeitskopie)
@@ -71,7 +71,8 @@
     public static final String SPELL_FILE = "resource://data/validator/words.cfg";
 
     /** The spell check key substitutions: the key should be substituted by the value */
-    private static volatile Map<String, String> spellCheckKeyData;
+    private static final Map<String, String> spellCheckKeyData = new HashMap<>();
+    private static final Map<String, String> prettyfiedKeys = new HashMap<>();
     /** The spell check preset values */
     private static volatile MultiMap<String, String> presetsValueData;
     /** The TagChecker data */
@@ -125,6 +126,7 @@
     protected static final int LOW_CHAR_VALUE    = 1210;
     protected static final int LOW_CHAR_KEY      = 1211;
     protected static final int MISSPELLED_VALUE  = 1212;
+    protected static final int MISSPELLED_KEY    = 1213;
     /** 1250 and up is used by tagcheck */
 
     protected EditableList sourcesList;
@@ -160,9 +162,9 @@
         ignoreDataEquals.clear();
         ignoreDataEndsWith.clear();
         ignoreDataKeyPair.clear();
+        spellCheckKeyData.clear();
+        prettyfiedKeys.clear();
 
-        spellCheckKeyData = new HashMap<>();
-
         String errorSources = "";
         for (String source : Main.pref.getCollection(PREF_SOURCES, DEFAULT_SOURCES)) {
             try (
@@ -290,6 +292,7 @@
         if (ky.key != null && values != null) {
             try {
                 presetsValueData.putAll(ky.key, values);
+                addKey(prettifyKey(ky.key), ky.key);
             } catch (NullPointerException e) {
                 Main.error(p+": Unable to initialize "+ky);
             }
@@ -411,10 +414,22 @@
 
                 if (!ignore) {
                     if (!keyInPresets) {
-                        String i = marktr("Key ''{0}'' not in presets.");
-                        errors.add(new TestError(this, Severity.OTHER, tr("Presets do not contain property key"),
-                                tr(i, key), MessageFormat.format(i, key), INVALID_VALUE, p));
-                        withErrors.put(p, "UPK");
+                        String prettifiedKey = prettifyKey(key);
+                        String fixedKey = prettyfiedKeys.get(prettifiedKey);
+                        if (fixedKey != null && !"".equals(fixedKey)) {
+                            // misspelled preset key
+                            String i = marktr("Key ''{0}'' looks like ''{1}''.");
+                            errors.add(new FixableTestError(this, Severity.WARNING, tr("Misspelled property key"),
+                                    tr(i, key, fixedKey),
+                                    MessageFormat.format(i, key, fixedKey), MISSPELLED_KEY, p,
+                                    new ChangePropertyKeyCommand(p, key, fixedKey)));
+                            withErrors.put(p, "WPK");
+                        } else {
+                            String i = marktr("Key ''{0}'' not in presets.");
+                            errors.add(new TestError(this, Severity.OTHER, tr("Presets do not contain property key"),
+                                    tr(i, key), MessageFormat.format(i, key), INVALID_VALUE, p));
+                            withErrors.put(p, "UPK");
+                        }
                     } else if (!tagInPresets) {
                         // try to fix common typos and check again if value is still unknown
                         String fixedValue = prettifyValue(prop.getValue());
@@ -464,6 +479,26 @@
         return map;
     }
 
+    private static void addKey(String prettyKey, String key) {
+        String otherKey = prettyfiedKeys.get(prettyKey);
+        if (otherKey == null) {
+            prettyfiedKeys.put(prettyKey, key);
+            // Main.debug(prettyKey + " -> " + key);
+        } else if ("".equals(key)) {
+            Main.warn("Ignore also: " + prettyKey + " -> " + key);
+        } else if (!otherKey.equals(key)) {
+            Main.warn("Ignore '" + prettyKey + "' bacause it's the normalized form of preset key '" + key + "' and '" + otherKey + "'!");
+            prettyfiedKeys.put(prettyKey, "");
+        }
+    }
+
+    private static String prettifyKey(String key) {
+        // convert to lower case, replace ' ', ':' or '-' with '_'
+        key = key.toLowerCase(Locale.ENGLISH).replace('-', '_').replace(':', '_').replace(' ', '_');
+        // remove trailing or leading special chars
+        return Utils.strip(key, "-_;:,");
+    }
+
     private static String prettifyValue(String value) {
         // convert to lower case, replace ' ' or '-' with '_'
         value = value.toLowerCase(Locale.ENGLISH).replace('-', '_').replace(' ', '_');
