Index: josm/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
===================================================================
--- josm/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(Revision 8433)
+++ josm/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(Arbeitskopie)
@@ -55,6 +55,7 @@
 import org.openstreetmap.josm.io.UTFInputStreamReader;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.MultiMap;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
  * Check for misspelled or wrong tags
@@ -124,6 +125,7 @@
     protected static final int LONG_KEY          = 1209;
     protected static final int LOW_CHAR_VALUE    = 1210;
     protected static final int LOW_CHAR_KEY      = 1211;
+    protected static final int MISSPELLED_VALUE  = 1212;
     /** 1250 and up is used by tagcheck */
 
     protected EditableList sourcesList;
@@ -416,10 +418,21 @@
                                 tr(i, key), MessageFormat.format(i, key), INVALID_VALUE, p) );
                         withErrors.put(p, "UPK");
                     } else if (!tagInPresets) {
-                        String i = marktr("Value ''{0}'' for key ''{1}'' not in presets.");
-                        errors.add( new TestError(this, Severity.OTHER, tr("Presets do not contain property value"),
-                                tr(i, prop.getValue(), key), MessageFormat.format(i, prop.getValue(), key), INVALID_VALUE, p) );
-                        withErrors.put(p, "UPV");
+                        // try to fix common typos and check again if value is still unknown
+                        String fixedValue = prettifyValue(prop.getValue());
+                        if (values != null && values.contains(fixedValue)) {
+                            // misspelled preset value
+                            String i = marktr("Value ''{0}'' for key ''{1}'' looks like ''{2}}.");
+                            errors.add( new TestError(this, Severity.WARNING, tr("Misspelled property value"),
+                                    tr(i, prop.getValue(), key, fixedValue), MessageFormat.format(i, prop.getValue(), fixedValue), MISSPELLED_VALUE, p) );
+                            withErrors.put(p, "WPV");
+                        } else {
+                            // unknown preset value
+                            String i = marktr("Value ''{0}'' for key ''{1}'' not in presets.");
+                            errors.add( new TestError(this, Severity.OTHER, tr("Presets do not contain property value"),
+                                    tr(i, prop.getValue(), key), MessageFormat.format(i, prop.getValue(), key), INVALID_VALUE, p) );
+                            withErrors.put(p, "UPV");
+                        }
                     }
                 }
             }
@@ -436,6 +449,16 @@
         }
     }
 
+    private String prettifyValue(String value) {
+        // convert to lower case
+        value = value.toLowerCase().replace('-', '_').replace(' ', '_');
+        // replace ' ' or '-' with '_'
+        value = value.replace(' ', '_');
+        value = value.replace('-', '_');
+        // remove trailing or leading special chars
+        return Utils.strip(value, "-_;:,");
+    }
+
     @Override
     public void startTest(ProgressMonitor monitor) {
         super.startTest(monitor);
@@ -570,13 +593,19 @@
                 } else if (key.startsWith(" ") || key.endsWith(" ")) {
                     commands.add(new ChangePropertyKeyCommand(p, key, Tag.removeWhiteSpaces(key)));
                 } else {
-                    String evalue = entities.unescape(value);
-                    if (!evalue.equals(value)) {
-                        commands.add(new ChangePropertyCommand(p, key, evalue));
+                    final Set<String> values = presetsValueData.get(key);
+                    String fixedValue = prettifyValue(value);
+                    if (!value.equals(fixedValue) && values != null && values.contains(fixedValue)) {
+                        commands.add(new ChangePropertyCommand(p, key, fixedValue));
                     } else {
-                        String replacementKey = spellCheckKeyData.get(key);
-                        if (replacementKey != null) {
-                            commands.add(new ChangePropertyKeyCommand(p, key, replacementKey));
+                        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));
+                            }
                         }
                     }
                 }
@@ -595,7 +624,7 @@
     public boolean isFixable(TestError testError) {
         if (testError.getTester() instanceof TagChecker) {
             int code = testError.getCode();
-            return code == INVALID_KEY || code == EMPTY_VALUES || code == INVALID_SPACE || code == INVALID_KEY_SPACE || code == INVALID_HTML;
+            return code == INVALID_KEY || code == EMPTY_VALUES || code == INVALID_SPACE || code == INVALID_KEY_SPACE || code == INVALID_HTML || code == MISSPELLED_VALUE;
         }
 
         return false;
Index: josm/src/org/openstreetmap/josm/tools/Utils.java
===================================================================
--- josm/src/org/openstreetmap/josm/tools/Utils.java	(Revision 8433)
+++ josm/src/org/openstreetmap/josm/tools/Utils.java	(Arbeitskopie)
@@ -39,6 +39,7 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
@@ -898,26 +899,47 @@
      * @see <a href="https://bugs.openjdk.java.net/browse/JDK-4080617">JDK bug 4080617</a>
      * @since 5772
      */
-    public static String strip(String str) {
+    public static String strip(final String str) {
+        return strip(str, null);
+    }
+
+    /**
+     * An alternative to {@link String#trim()} to effectively remove all leading and trailing white characters, including Unicode ones.
+     * @param str The string to strip
+     * @param skipChars additional characters to skip
+     * @return <code>str</code>, without leading and trailing characters, according to
+     *         {@link Character#isWhitespace(char)}, {@link Character#isSpaceChar(char)} and skipChars.
+     * @since ????
+     */
+    public static String strip(final String str, final String skipChars) {
         if (str == null || str.isEmpty()) {
             return str;
         }
+        // create set with chars to skip
+        HashSet<Character> skipSet = new HashSet<>();
+        // '\u200B' (ZERO WIDTH SPACE character) needs to be handled manually because of change in Unicode 6.0 (Java 7, see #8918)
+        skipSet.add('\u200B');
+        // same for '\uFEFF' (ZERO WIDTH NO-BREAK SPACE)
+        skipSet.add('\uFEFF');
+        if (skipChars != null) {
+            for(char c : skipChars.toCharArray()) {
+                skipSet.add(c);
+            }
+        }
         int start = 0, end = str.length();
-        boolean leadingWhite = true;
-        while (leadingWhite && start < end) {
+        boolean leadingSkipChar = true;
+        while (leadingSkipChar && start < end) {
             char c = str.charAt(start);
-            // '\u200B' (ZERO WIDTH SPACE character) needs to be handled manually because of change in Unicode 6.0 (Java 7, see #8918)
-            // same for '\uFEFF' (ZERO WIDTH NO-BREAK SPACE)
-            leadingWhite = (Character.isWhitespace(c) || Character.isSpaceChar(c) || c == '\u200B' || c == '\uFEFF');
-            if (leadingWhite) {
+            leadingSkipChar = Character.isWhitespace(c) || Character.isSpaceChar(c) || skipSet.contains(c);
+            if (leadingSkipChar) {
                 start++;
             }
         }
-        boolean trailingWhite = true;
-        while (trailingWhite && end > start+1) {
+        boolean trailingSkipChar = true;
+        while (trailingSkipChar && end > start+1) {
             char c = str.charAt(end-1);
-            trailingWhite = (Character.isWhitespace(c) || Character.isSpaceChar(c) || c == '\u200B' || c == '\uFEFF');
-            if (trailingWhite) {
+            trailingSkipChar = Character.isWhitespace(c) || Character.isSpaceChar(c) || skipSet.contains(c);
+            if (trailingSkipChar) {
                 end--;
             }
         }
Index: josm/test/unit/org/openstreetmap/josm/tools/UtilsTest.java
===================================================================
--- josm/test/unit/org/openstreetmap/josm/tools/UtilsTest.java	(Revision 8433)
+++ josm/test/unit/org/openstreetmap/josm/tools/UtilsTest.java	(Arbeitskopie)
@@ -59,6 +59,10 @@
         Assert.assertEquals("a", Utils.strip(someWhite+"a"+someWhite));
         Assert.assertEquals("ab", Utils.strip(someWhite+"ab"+someWhite));
         Assert.assertEquals("abc", Utils.strip(someWhite+"abc"+someWhite));
+
+        // extended skip
+        Assert.assertEquals("a", Utils.strip("a", "b"));
+        Assert.assertEquals("b", Utils.strip("acbcac", "ac"));
     }
 
     /**
