diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java b/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java
index 3ab46fc..51c1de5 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java
@@ -58,8 +58,17 @@ public class MapCSSStyleSource extends StyleSource {
     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 wayRules = new MapCSSRuleIndex();          // ways
+    /**
+     * Ways which are considered as line.
+     * @see GeneralSelector#isLineAccordingToMapCSS(Way)
+     */
+    public final MapCSSRuleIndex wayLineRules = new MapCSSRuleIndex();
+    /**
+     * Ways which are considered as area.
+     * @see GeneralSelector#isAreaAccordingToMapCSS(Way)
+     */
+    public final MapCSSRuleIndex wayAreaRules = new MapCSSRuleIndex();
     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
@@ -184,7 +193,8 @@ public class MapCSSStyleSource extends StyleSource {
         rules.clear();
         nodeRules.clear();
         wayRules.clear();
-        wayNoAreaRules.clear();
+        wayLineRules.clear();
+        wayAreaRules.clear();
         relationRules.clear();
         multipolygonRules.clear();
         canvasRules.clear();
@@ -231,11 +241,15 @@ public class MapCSSStyleSource extends StyleSource {
                     nodeRules.add(optRule);
                     break;
                 case "way":
-                    wayNoAreaRules.add(optRule);
                     wayRules.add(optRule);
+                    wayLineRules.add(optRule);
+                    wayAreaRules.add(optRule);
+                    break;
+                case "line":
+                    wayLineRules.add(optRule);
                     break;
                 case "area":
-                    wayRules.add(optRule);
+                    wayAreaRules.add(optRule);
                     multipolygonRules.add(optRule);
                     break;
                 case "relation":
@@ -245,7 +259,8 @@ public class MapCSSStyleSource extends StyleSource {
                 case "*":
                     nodeRules.add(optRule);
                     wayRules.add(optRule);
-                    wayNoAreaRules.add(optRule);
+                    wayLineRules.add(optRule);
+                    wayAreaRules.add(optRule);
                     relationRules.add(optRule);
                     multipolygonRules.add(optRule);
                     break;
@@ -263,7 +278,8 @@ public class MapCSSStyleSource extends StyleSource {
         }
         nodeRules.initIndex();
         wayRules.initIndex();
-        wayNoAreaRules.initIndex();
+        wayLineRules.initIndex();
+        wayAreaRules.initIndex();
         relationRules.initIndex();
         multipolygonRules.initIndex();
         canvasRules.initIndex();
@@ -358,13 +374,15 @@ public class MapCSSStyleSource extends StyleSource {
 
     @Override
     public void apply(MultiCascade mc, OsmPrimitive osm, double scale, OsmPrimitive multipolyOuterWay, boolean pretendWayIsClosed) {
-        Environment env = new Environment(osm, mc, null, this);
-        MapCSSRuleIndex matchingRuleIndex;
+        final Environment env = new Environment(osm, mc, null, this);
+        final MapCSSRuleIndex matchingRuleIndex;
         if (osm instanceof Node) {
             matchingRuleIndex = nodeRules;
         } else if (osm instanceof Way) {
-            if (osm.isKeyFalse("area")) {
-                matchingRuleIndex = wayNoAreaRules;
+            if (GeneralSelector.isLineAccordingToMapCSS((Way) osm)) {
+                matchingRuleIndex = wayLineRules;
+            } else if (GeneralSelector.isAreaAccordingToMapCSS((Way) osm)) {
+                matchingRuleIndex = wayAreaRules;
             } else {
                 matchingRuleIndex = wayRules;
             }
diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java b/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java
index 18e687e..a9db6be 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java
@@ -443,6 +443,22 @@ public interface Selector {
         public GeneralSelector(String base, Pair<Integer, Integer> zoom, List<Condition> conds, String subpart) {
             super(base, zoom, conds, subpart);
         }
+
+        /**
+         * Determines whether the way is an area according to the MapCSS standard, i.e.,
+         * "A way where the start and finish nodes are the same node, or area=yes has been set."
+         */
+        public static boolean isAreaAccordingToMapCSS(Way w) {
+            return w.isClosed() || w.isKeyTrue("area");
+        }
+
+        /**
+         * Determines whether the way is an line according to the MapCSS standard, i.e.,
+         * "A way where the start and finish nodes are not the same node, or area=no has been set."
+         */
+        public static boolean isLineAccordingToMapCSS(Way w) {
+            return !w.isClosed() || w.isKeyFalse("area");
+        }
         
         public boolean matchesBase(OsmPrimitiveType type) {
             if ("*".equals(base)) {
@@ -450,7 +466,7 @@ public interface Selector {
             } 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 +483,10 @@ public interface Selector {
                     } else if ("canvas".equals(base)) {
                         return p.get("#canvas") != null;
                     }
+                } else if (p instanceof Way && "area".equals(base)) {
+                    return isAreaAccordingToMapCSS((Way) p);
+                } else if (p instanceof Way && "line".equals(base)) {
+                    return isLineAccordingToMapCSS((Way) p);
                 }
                 return true;
             }
