Index: trunk/src/org/openstreetmap/josm/data/osm/Tag.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Tag.java	(revision 6512)
+++ trunk/src/org/openstreetmap/josm/data/osm/Tag.java	(revision 6513)
@@ -99,4 +99,10 @@
     }
 
+    /**
+     * This constructs a {@link Tag} by splitting {@code s} on the first equality sign.
+     * @see org.openstreetmap.josm.tools.TextTagParser
+     * @param s the string to convert
+     * @return the constructed tag
+     */
     public static Tag ofString(String s) {
         CheckParameterUtil.ensureParameterNotNull(s, "s");
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 6512)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 6513)
@@ -229,4 +229,5 @@
     public void initialize() throws Exception {
         addMapCSS(new InputStreamReader(getClass().getResourceAsStream("/data/validator/deprecated.mapcss"), "UTF-8"));
+        addMapCSS(new InputStreamReader(getClass().getResourceAsStream("/data/validator/highway.mapcss"), "UTF-8"));
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java	(revision 6512)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java	(revision 6513)
@@ -38,10 +38,10 @@
     }
 
-    public static Condition create(String k, boolean not, boolean yes, Context context) {
+    public static Condition create(String k, boolean not, boolean yes, boolean no, Context context) {
         switch (context) {
         case PRIMITIVE:
-            return new KeyCondition(k, not, yes);
+            return new KeyCondition(k, not, yes, no);
         case LINK:
-            if (yes)
+            if (yes || no)
                 throw new MapCSSException("Question mark operator ''?'' not supported in LINK context");
             if (not)
@@ -216,4 +216,7 @@
      *     ["a label"?]  PRIMITIVE:  the primitive has a tag "a label" whose value evaluates to a true-value
      *                   LINK:       not supported
+     *
+     *     ["a label"?!] PRIMITIVE:  the primitive has a tag "a label" whose value evaluates to a false-value
+     *                   LINK:       not supported
      * </pre>
      */
@@ -221,17 +224,13 @@
 
         private String label;
-        private boolean exclamationMarkPresent;
-        private boolean questionMarkPresent;
-
-        /**
-         *
-         * @param label
-         * @param exclamationMarkPresent
-         * @param questionMarkPresent
-         */
-        public KeyCondition(String label, boolean exclamationMarkPresent, boolean questionMarkPresent){
+        private boolean negateResult;
+        private boolean testForTrueValues;
+        private boolean testForFalseValues;
+
+        public KeyCondition(String label, boolean negateResult, boolean testForTrueValues, boolean testForFalseValues){
             this.label = label;
-            this.exclamationMarkPresent = exclamationMarkPresent;
-            this.questionMarkPresent = questionMarkPresent;
+            this.negateResult = negateResult;
+            this.testForTrueValues = testForTrueValues;
+            this.testForFalseValues = testForFalseValues;
         }
 
@@ -240,8 +239,10 @@
             switch(e.getContext()) {
             case PRIMITIVE:
-                if (questionMarkPresent)
-                    return OsmUtils.isTrue(e.osm.get(label)) ^ exclamationMarkPresent;
+                if (testForTrueValues)
+                    return OsmUtils.isTrue(e.osm.get(label)) ^ negateResult;
+                else if (testForFalseValues)
+                    return OsmUtils.isFalse(e.osm.get(label)) ^ negateResult;
                 else
-                    return e.osm.hasKey(label) ^ exclamationMarkPresent;
+                    return e.osm.hasKey(label) ^ negateResult;
             case LINK:
                 Utils.ensure(false, "Illegal state: KeyCondition not supported in LINK context");
@@ -253,5 +254,5 @@
         @Override
         public String toString() {
-            return "[" + (exclamationMarkPresent ? "!" : "") + label + "]";
+            return "[" + (negateResult ? "!" : "") + label + "]";
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj	(revision 6512)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj	(revision 6513)
@@ -345,4 +345,5 @@
     boolean not = false;
     boolean yes = false;
+    boolean no = false;
     String key;
 }
@@ -350,6 +351,7 @@
     ( <EXCLAMATION> { not = true; } )?
     key=tag_key()
+    ( LOOKAHEAD(2) <QUESTION> <EXCLAMATION> { no = true; } )?
     ( <QUESTION> { yes = true; } )?
-    { return Condition.create(key, not, yes, context); }
+    { return Condition.create(key, not, yes, no, context); }
 }
 
