Index: trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 8752)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 8753)
@@ -71,6 +71,6 @@
     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> harmonizedKeys = new HashMap<>();
     /** The spell check preset values */
     private static volatile MultiMap<String, String> presetsValueData;
@@ -126,4 +126,5 @@
     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 */
 
@@ -161,6 +162,5 @@
         ignoreDataEndsWith.clear();
         ignoreDataKeyPair.clear();
-
-        spellCheckKeyData = new HashMap<>();
+        harmonizedKeys.clear();
 
         String errorSources = "";
@@ -229,5 +229,5 @@
                         okValue = line.substring(1);
                     } else if (line.charAt(0) == '-' && okValue != null) {
-                        spellCheckKeyData.put(line.substring(1), okValue);
+                        harmonizedKeys.put(harmonizeKey(line.substring(1)), okValue);
                     } else {
                         Main.error(tr("Invalid spellcheck line: {0}", line));
@@ -291,4 +291,5 @@
             try {
                 presetsValueData.putAll(ky.key, values);
+                harmonizedKeys.put(harmonizeKey(ky.key), ky.key);
             } catch (NullPointerException e) {
                 Main.error(p+": Unable to initialize "+ky);
@@ -360,9 +361,4 @@
                 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"),
@@ -412,11 +408,23 @@
                 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 = harmonizeKey(key);
+                        String fixedKey = harmonizedKeys.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());
+                        String fixedValue = harmonizeValue(prop.getValue());
                         Map<String, String> possibleValues = getPossibleValues(values);
                         if (possibleValues.containsKey(fixedValue)) {
@@ -465,8 +473,11 @@
     }
 
-    private static String prettifyValue(String value) {
-        // convert to lower case, replace ' ' or '-' with '_'
+    private static String harmonizeKey(String key) {
+        key = key.toLowerCase(Locale.ENGLISH).replace('-', '_').replace(':', '_').replace(' ', '_');
+        return Utils.strip(key, "-_;:,");
+    }
+
+    private static String harmonizeValue(String value) {
         value = value.toLowerCase(Locale.ENGLISH).replace('-', '_').replace(' ', '_');
-        // remove trailing or leading special chars
         return Utils.strip(value, "-_;:,");
     }
@@ -612,9 +623,4 @@
                         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));
-                            }
                         }
                     }
