Index: /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/SpellCheck.java
===================================================================
--- /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/SpellCheck.java	(revision 8693)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/SpellCheck.java	(revision 8694)
@@ -215,5 +215,5 @@
 		checkPrimitive(w);
 	}
-	
+
 	/**
 	 * Checks the spelling of the primitive properties
@@ -223,7 +223,7 @@
 	{
 	    // Just a collection to know if a primitive has been already marked with error
-        Bag<OsmPrimitive, String> withErrors = new Bag<OsmPrimitive, String>();
-        
-        Map<String, String> props = (p.keys == null) ? Collections.<String, String>emptyMap() : p.keys;
+		Bag<OsmPrimitive, String> withErrors = new Bag<OsmPrimitive, String>();
+
+		Map<String, String> props = (p.keys == null) ? Collections.<String, String>emptyMap() : p.keys;
 		for(Entry<String, String> prop: props.entrySet() )
 		{
@@ -237,28 +237,38 @@
 			if( checkKeys && spellCheckKeyData.containsKey(key) && !withErrors.contains(p, "IPK"))
 			{
-				errors.add( new TestError(this, Severity.WARNING, tr("Invalid property keys"), p, INVALID_KEY) );
+				errors.add( new TestError(this, Severity.WARNING, tr("Invalid property key ''{0}''", key), p, INVALID_KEY) );
 				withErrors.add(p, "IPK");
 			}
-            if( checkValues && value != null && value.length() > 0 && spellCheckValueData != null)
-            {
-                List<String> values = spellCheckValueData.get(key);
-                if( values != null && !values.contains(prop.getValue()) && !withErrors.contains(p, "UPV"))
-                {
-                    errors.add( new TestError(this, Severity.OTHER, tr("Unknown property values"), p, INVALID_VALUE) );
-                    withErrors.add(p, "UPV");
-                }
-            }
-            if( checkFixmes && value != null && value.length() > 0 )
-            {
-                if( (value.contains("FIXME") || key.contains("todo") || key.contains("fixme"))
-				  && !withErrors.contains(p, "FIXME"))
-                {
-                    errors.add( new TestError(this, Severity.OTHER, tr("FIXMES"), p, FIXME) );
-                    withErrors.add(p, "FIXME");
-                }
-            }
-		}
-	}
-	
+			if( checkKeys && key.indexOf(" ") >= 0 && !withErrors.contains(p, "IPK"))
+			{
+				errors.add( new TestError(this, Severity.WARNING, tr("Invalid white space in property key ''{0}''", key), p, INVALID_KEY) );
+				withErrors.add(p, "IPK");
+			}
+			if( checkValues && value != null && (value.startsWith(" ") || value.endsWith(" ")) && !withErrors.contains(p, "SPACE"))
+			{
+				errors.add( new TestError(this, Severity.OTHER, tr("Property values start or end with white space"), p, INVALID_VALUE) );
+				withErrors.add(p, "SPACE");
+			}
+			if( checkValues && value != null && value.length() > 0 && spellCheckValueData != null)
+			{
+				List<String> values = spellCheckValueData.get(key);
+				if( values != null && !values.contains(prop.getValue()) && !withErrors.contains(p, "UPV"))
+				{
+					errors.add( new TestError(this, Severity.OTHER, tr("Unknown property values"), p, INVALID_VALUE) );
+					withErrors.add(p, "UPV");
+				}
+			}
+			if( checkFixmes && value != null && value.length() > 0 )
+			{
+				if( (value.contains("FIXME") || value.contains("check and delete") || key.contains("todo") || key.contains("fixme"))
+				&& !withErrors.contains(p, "FIXME"))
+				{
+					errors.add( new TestError(this, Severity.OTHER, tr("FIXMES"), p, FIXME) );
+					withErrors.add(p, "FIXME");
+				}
+			}
+		}
+	}
+
 	/**
 	 * Parse an anotation preset from a stream
