Index: src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java
===================================================================
--- src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java	(revision 7166)
+++ src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java	(working copy)
@@ -26,6 +26,7 @@
 import org.openstreetmap.josm.data.Version;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.OsmUtils;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.mappaint.Cascade;
@@ -58,8 +59,9 @@
     public final List<MapCSSRule> rules = new ArrayList<>();
     // rule indices, filtered by primitive type
     public final MapCSSRuleIndex nodeRules = new MapCSSRuleIndex();         // nodes
-    public final MapCSSRuleIndex wayRules = new MapCSSRuleIndex();          // ways without tag area=no
-    public final MapCSSRuleIndex wayNoAreaRules = new MapCSSRuleIndex();    // ways with tag area=no
+    public final MapCSSRuleIndex wayNoAreaTagRules = new MapCSSRuleIndex(); // ways without the tag area=yes/no
+    public final MapCSSRuleIndex wayAreaEqYesRules = new MapCSSRuleIndex(); // ways with tag area=yes
+    public final MapCSSRuleIndex wayAreaEqNoRules = new MapCSSRuleIndex();  // ways with tag area=no
     public final MapCSSRuleIndex relationRules = new MapCSSRuleIndex();     // relations that are not multipolygon relations
     public final MapCSSRuleIndex multipolygonRules = new MapCSSRuleIndex(); // multipolygon relations
     public final MapCSSRuleIndex canvasRules = new MapCSSRuleIndex();       // rules to apply canvas properties
@@ -183,8 +185,9 @@
         init();
         rules.clear();
         nodeRules.clear();
-        wayRules.clear();
-        wayNoAreaRules.clear();
+        wayNoAreaTagRules.clear();
+        wayAreaEqYesRules.clear();
+        wayAreaEqNoRules.clear();
         relationRules.clear();
         multipolygonRules.clear();
         canvasRules.clear();
@@ -231,11 +234,17 @@
                     nodeRules.add(optRule);
                     break;
                 case "way":
-                    wayNoAreaRules.add(optRule);
-                    wayRules.add(optRule);
+                    wayNoAreaTagRules.add(optRule);
+                    wayAreaEqYesRules.add(optRule);
+                    wayAreaEqNoRules.add(optRule);
                     break;
+                case "line":
+                    wayNoAreaTagRules.add(optRule);
+                    wayAreaEqNoRules.add(optRule);
+                    break;
                 case "area":
-                    wayRules.add(optRule);
+                    wayNoAreaTagRules.add(optRule);
+                    wayAreaEqYesRules.add(optRule);
                     multipolygonRules.add(optRule);
                     break;
                 case "relation":
@@ -244,8 +253,8 @@
                     break;
                 case "*":
                     nodeRules.add(optRule);
-                    wayRules.add(optRule);
-                    wayNoAreaRules.add(optRule);
+                    wayNoAreaTagRules.add(optRule);
+                    wayAreaEqNoRules.add(optRule);
                     relationRules.add(optRule);
                     multipolygonRules.add(optRule);
                     break;
@@ -262,8 +271,9 @@
             }
         }
         nodeRules.initIndex();
-        wayRules.initIndex();
-        wayNoAreaRules.initIndex();
+        wayNoAreaTagRules.initIndex();
+        wayAreaEqYesRules.initIndex();
+        wayAreaEqNoRules.initIndex();
         relationRules.initIndex();
         multipolygonRules.initIndex();
         canvasRules.initIndex();
@@ -363,10 +373,15 @@
         if (osm instanceof Node) {
             matchingRuleIndex = nodeRules;
         } else if (osm instanceof Way) {
-            if (osm.isKeyFalse("area")) {
-                matchingRuleIndex = wayNoAreaRules;
+            String areaValue = osm.get("area");
+            if (areaValue == null) {
+                matchingRuleIndex = wayNoAreaTagRules;
+            } else if (OsmUtils.isTrue(areaValue)) {
+                matchingRuleIndex = wayAreaEqYesRules;
+            } else if (OsmUtils.isFalse(areaValue)) {
+                matchingRuleIndex = wayAreaEqNoRules;
             } else {
-                matchingRuleIndex = wayRules;
+                matchingRuleIndex = wayNoAreaTagRules;
             }
         } else {
             if (((Relation) osm).isMultipolygon()) {
Index: src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java
===================================================================
--- src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java	(revision 7166)
+++ src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java	(working copy)
@@ -450,7 +450,7 @@
             } else if (OsmPrimitiveType.NODE.equals(type)) {
                 return "node".equals(base);
             } else if (OsmPrimitiveType.WAY.equals(type)) {
-                return "way".equals(base) || "area".equals(base);
+                return "way".equals(base) || "area".equals(base) || "line".equals(base);
             } else if (OsmPrimitiveType.RELATION.equals(type)) {
                 return "area".equals(base) || "relation".equals(base) || "canvas".equals(base);
             }
@@ -467,6 +467,12 @@
                     } else if ("canvas".equals(base)) {
                         return p.get("#canvas") != null;
                     }
+                } else if (p instanceof Way) {
+                    if ("area".equals(base)) {
+                        return !p.isKeyFalse("area");
+                    } else if ("line".equals(base)) {
+                        return !p.isKeyTrue("area");
+                    }
                 }
                 return true;
             }
