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)
@@ -70,8 +70,8 @@
     /** The config file of dictionary words */
     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;
+    /** Normalized keys: the key should be substituted by the value if the key was not found in presets */
+    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 +125,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 +161,8 @@
         ignoreDataEquals.clear();
         ignoreDataEndsWith.clear();
         ignoreDataKeyPair.clear();
+        prettyfiedKeys.clear();
 
-        spellCheckKeyData = new HashMap<>();
-
         String errorSources = "";
         for (String source : Main.pref.getCollection(PREF_SOURCES, DEFAULT_SOURCES)) {
             try (
@@ -228,7 +228,7 @@
                     } else if (line.charAt(0) == '+') {
                         okValue = line.substring(1);
                     } else if (line.charAt(0) == '-' && okValue != null) {
-                        spellCheckKeyData.put(line.substring(1), okValue);
+                        addKey(prettifyKey(line.substring(1)), okValue);
                     } else {
                         Main.error(tr("Invalid spellcheck line: {0}", line));
                     }
@@ -290,6 +290,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);
             }
@@ -359,11 +360,6 @@
                         tr(s, key), MessageFormat.format(s, key), EMPTY_VALUES, p));
                 withErrors.put(p, "EV");
             }
-            if (checkKeys && spellCheckKeyData.containsKey(key) && !withErrors.contains(p, "IPK")) {
-                errors.add(new TestError(this, Severity.WARNING, tr("Invalid property key"),
-                        tr(s, key), MessageFormat.format(s, key), INVALID_KEY, p));
-                withErrors.put(p, "IPK");
-            }
             if (checkKeys && key != null && key.indexOf(' ') >= 0 && !withErrors.contains(p, "IPK")) {
                 errors.add(new TestError(this, Severity.WARNING, tr("Invalid white space in property key"),
                         tr(s, key), MessageFormat.format(s, key), INVALID_KEY_SPACE, p));
@@ -411,10 +407,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 +472,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(' ', '_');
@@ -611,11 +639,6 @@
                         String evalue = entities.unescape(value);
                         if (!evalue.equals(value)) {
                             commands.add(new ChangePropertyCommand(p, key, evalue));
-                        } else {
-                            String replacementKey = spellCheckKeyData.get(key);
-                            if (replacementKey != null) {
-                                commands.add(new ChangePropertyKeyCommand(p, key, replacementKey));
-                            }
                         }
                     }
                 }
