Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 14516)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 14517)
@@ -533,9 +533,12 @@
                 } else if (!isTagInPresets(key, value)) {
                     // try to fix common typos and check again if value is still unknown
-                    String fixedValue = harmonizeValue(prop.getValue());
+                    final String harmonizedValue = harmonizeValue(prop.getValue());
+                    String fixedValue = null;
                     Set<String> possibleValues = getPresetValues(key);
                     List<String> fixVals = new ArrayList<>();
                     int maxPresetValueLen = 0;
-                    if (!possibleValues.contains(fixedValue)) {
+                    if (possibleValues.contains(harmonizedValue)) {
+                        fixedValue = harmonizedValue;
+                    } else {
                         // use Levenshtein distance to find typical typos
                         int minDist = MAX_LEVENSHTEIN_DISTANCE + 1;
@@ -544,6 +547,11 @@
                             if (possibleVal.isEmpty())
                                 continue;
+                            if (harmonizedValue.length() < 3 && possibleVal.length() >= harmonizedValue.length() + MAX_LEVENSHTEIN_DISTANCE) {
+                                // don't suggest fix value when given value is short and lengths are too different
+                                // for example surface=u would result in surface=mud
+                                continue;
+                            }
                             maxPresetValueLen = Math.max(maxPresetValueLen, possibleVal.length());
-                            int dist = Utils.getLevenshteinDistance(possibleVal, fixedValue);
+                            int dist = Utils.getLevenshteinDistance(possibleVal, harmonizedValue);
                             if (dist < minDist) {
                                 closest = possibleVal;
@@ -555,5 +563,4 @@
                             }
                         }
-                        fixedValue = null;
                         if (minDist <= MAX_LEVENSHTEIN_DISTANCE && maxPresetValueLen > MAX_LEVENSHTEIN_DISTANCE) {
                             if (fixVals.size() < 2) {
Index: /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/TagCheckerTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/TagCheckerTest.java	(revision 14516)
+++ /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/TagCheckerTest.java	(revision 14517)
@@ -138,4 +138,5 @@
         assertTrue(errors.get(0).isFixable());
     }
+
     /**
      * Check for misspelled value.
@@ -167,3 +168,32 @@
         assertTrue(errors.toString(), errors.isEmpty());
     }
+
+    /**
+     * Check regression: Don't fix surface=u -> surface=mud.
+     * @throws IOException if any I/O error occurs
+     */
+    @Test
+    public void testTooShortToFix() throws IOException {
+        final List<TestError> errors = test(OsmUtils.createPrimitive("node surface=u"));
+        assertEquals(1, errors.size());
+        assertEquals("Presets do not contain property value", errors.get(0).getMessage());
+        assertEquals("Value 'u' for key 'surface' not in presets.", errors.get(0).getDescription());
+        assertEquals(Severity.OTHER, errors.get(0).getSeverity());
+        assertFalse(errors.get(0).isFixable());
+    }
+
+    /**
+     * Check value with upper case
+     * @throws IOException if any I/O error occurs
+     */
+    @Test
+    public void testValueDifferentCase() throws IOException {
+        final List<TestError> errors = test(OsmUtils.createPrimitive("node highway=Residential"));
+        assertEquals(1, errors.size());
+        assertEquals("Misspelled property value", errors.get(0).getMessage());
+        assertEquals("Value 'Residential' for key 'highway' looks like 'residential'.", errors.get(0).getDescription());
+        assertEquals(Severity.WARNING, errors.get(0).getSeverity());
+        assertTrue(errors.get(0).isFixable());
+    }
+
 }
