Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerRule.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerRule.java	(revision 17641)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerRule.java	(revision 17642)
@@ -17,4 +17,5 @@
 import org.openstreetmap.josm.gui.mappaint.Keyword;
 import org.openstreetmap.josm.gui.mappaint.mapcss.Condition;
+import org.openstreetmap.josm.gui.mappaint.mapcss.Condition.TagCondition;
 import org.openstreetmap.josm.gui.mappaint.mapcss.Expression;
 import org.openstreetmap.josm.gui.mappaint.mapcss.Instruction;
@@ -237,6 +238,6 @@
         try {
             final Condition c = matchingSelector.getConditions().get(index);
-            final Tag tag = c instanceof Condition.ToTagConvertable
-                    ? ((Condition.ToTagConvertable) c).asTag(p)
+            final Tag tag = c instanceof TagCondition
+                    ? ((TagCondition) c).asTag(p)
                     : null;
             if (tag == null) {
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java	(revision 17641)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java	(revision 17642)
@@ -2,7 +2,8 @@
 package org.openstreetmap.josm.gui.mappaint.mapcss;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
+import org.openstreetmap.josm.data.osm.Tagged;
 import org.openstreetmap.josm.gui.mappaint.Environment;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
 
 /**
@@ -18,4 +19,13 @@
      */
     boolean applies(Environment e);
+
+    /**
+     * Checks if the condition applies in the given {@link Tagged} element.
+     * @param tagged The tagged to check.
+     * @return <code>true</code> if the condition applies.
+     */
+    default boolean applies(Tagged tagged) {
+        return false;
+    }
 
     /**
@@ -37,14 +47,23 @@
      * This is a condition that can be converted to a tag
      * @author Michael Zangl
-     * @since 10674
+     * @since 10674 (ToTagConvertable), 17642 (TagCondition)
      */
-    @FunctionalInterface
-    interface ToTagConvertable {
+    interface TagCondition extends Condition {
+
+        @Override
+        default boolean applies(Environment e) {
+            CheckParameterUtil.ensureThat(!e.isLinkContext(), "Illegal state: TagCondition not supported in LINK context");
+            return applies(e.osm);
+        }
+
+        @Override
+        boolean applies(Tagged tagged);
+
         /**
          * Converts the current condition to a tag
-         * @param primitive A primitive to use as context. May be ignored.
+         * @param tagged A tagged object to use as context. May be ignored.
          * @return A tag with the key/value of this condition.
          */
-        Tag asTag(OsmPrimitive primitive);
+        Tag asTag(Tagged tagged);
     }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionFactory.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionFactory.java	(revision 17641)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionFactory.java	(revision 17642)
@@ -23,4 +23,5 @@
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Tag;
+import org.openstreetmap.josm.data.osm.Tagged;
 import org.openstreetmap.josm.data.osm.search.SearchCompiler.InDataSourceArea;
 import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon;
@@ -30,5 +31,5 @@
 import org.openstreetmap.josm.gui.mappaint.Environment;
 import org.openstreetmap.josm.gui.mappaint.mapcss.Condition.Context;
-import org.openstreetmap.josm.gui.mappaint.mapcss.Condition.ToTagConvertable;
+import org.openstreetmap.josm.gui.mappaint.mapcss.Condition.TagCondition;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.JosmRuntimeException;
@@ -257,5 +258,5 @@
      * Extra class for performance reasons.
      */
-    public static class SimpleKeyValueCondition implements Condition, ToTagConvertable {
+    public static class SimpleKeyValueCondition implements TagCondition {
         /**
          * The key to search for.
@@ -278,10 +279,10 @@
 
         @Override
-        public boolean applies(Environment e) {
-            return v.equals(e.osm.get(k));
-        }
-
-        @Override
-        public Tag asTag(OsmPrimitive primitive) {
+        public boolean applies(Tagged osm) {
+            return v.equals(osm.get(k));
+        }
+
+        @Override
+        public Tag asTag(Tagged primitive) {
             return new Tag(k, v);
         }
@@ -298,5 +299,5 @@
      *
      */
-    public static class KeyValueCondition implements Condition, ToTagConvertable {
+    public static class KeyValueCondition implements TagCondition {
         /**
          * The key to search for.
@@ -341,10 +342,10 @@
 
         @Override
-        public boolean applies(Environment env) {
-            return op.eval(env.osm.get(k), considerValAsKey ? env.osm.get(v) : v);
-        }
-
-        @Override
-        public Tag asTag(OsmPrimitive primitive) {
+        public boolean applies(Tagged osm) {
+            return op.eval(osm.get(k), considerValAsKey ? osm.get(v) : v);
+        }
+
+        @Override
+        public Tag asTag(Tagged primitive) {
             return new Tag(k, v);
         }
@@ -379,15 +380,15 @@
         }
 
-        protected boolean matches(Environment env) {
-            final String value = env.osm.get(k);
+        protected boolean matches(Tagged osm) {
+            final String value = osm.get(k);
             return value != null && pattern.matcher(value).find();
         }
 
         @Override
-        public boolean applies(Environment env) {
+        public boolean applies(Tagged osm) {
             if (Op.REGEX == op) {
-                return matches(env);
+                return matches(osm);
             } else if (Op.NREGEX == op) {
-                return !matches(env);
+                return !matches(osm);
             } else {
                 throw new IllegalStateException();
@@ -420,6 +421,6 @@
 
         @Override
-        protected boolean matches(Environment env) {
-            return env.osm.getKeys().entrySet().stream()
+        protected boolean matches(Tagged osm) {
+            return osm.getKeys().entrySet().stream()
                     .anyMatch(kv -> keyPattern.matcher(kv.getKey()).find() && pattern.matcher(kv.getValue()).find());
         }
@@ -537,5 +538,5 @@
      * @see KeyRegexpCondition
      */
-    public static class KeyCondition implements Condition, ToTagConvertable {
+    public static class KeyCondition implements TagCondition {
 
         /**
@@ -567,17 +568,16 @@
 
         @Override
-        public boolean applies(Environment e) {
-            CheckParameterUtil.ensureThat(!e.isLinkContext(), "Illegal state: KeyCondition not supported in LINK context");
+        public boolean applies(Tagged osm) {
             switch (matchType) {
                 case TRUE:
-                    return e.osm.isKeyTrue(label) ^ negateResult;
+                    return osm.isKeyTrue(label) ^ negateResult;
                 case FALSE:
-                    return e.osm.isKeyFalse(label) ^ negateResult;
+                    return osm.isKeyFalse(label) ^ negateResult;
                 case ANY_CONTAINS:
                 case ANY_STARTS_WITH:
                 case ANY_ENDS_WITH:
-                    return e.osm.keys().anyMatch(keyPredicate()) ^ negateResult;
+                    return osm.keys().anyMatch(keyPredicate()) ^ negateResult;
                 default:
-                    return e.osm.hasKey(label) ^ negateResult;
+                    return osm.hasKey(label) ^ negateResult;
             }
         }
@@ -604,5 +604,5 @@
          */
         @Override
-        public Tag asTag(OsmPrimitive p) {
+        public Tag asTag(Tagged p) {
             String key = label;
             Predicate<String> keyPredicate = keyPredicate();
@@ -622,5 +622,5 @@
      * KeyPatternCondition represents a conditions matching keys based on a pattern.
      */
-    public static class KeyRegexpCondition implements Condition, ToTagConvertable {
+    public static class KeyRegexpCondition implements TagCondition {
 
         /**
@@ -644,7 +644,6 @@
 
         @Override
-        public boolean applies(Environment e) {
-            CheckParameterUtil.ensureThat(!e.isLinkContext(), "Illegal state: KeyCondition not supported in LINK context");
-            return e.osm.keys().anyMatch(pattern.asPredicate()) ^ negateResult;
+        public boolean applies(Tagged osm) {
+            return osm.keys().anyMatch(pattern.asPredicate()) ^ negateResult;
         }
 
@@ -659,5 +658,5 @@
          */
         @Override
-        public Tag asTag(OsmPrimitive p) {
+        public Tag asTag(Tagged p) {
             String key = p.keys().filter(pattern.asPredicate()).findAny().orElse(pattern.pattern());
             return new Tag(key, p.get(key));
Index: /trunk/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionTest.java	(revision 17641)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionTest.java	(revision 17642)
@@ -13,5 +13,5 @@
 import org.openstreetmap.josm.gui.mappaint.Environment;
 import org.openstreetmap.josm.gui.mappaint.mapcss.Condition.Context;
-import org.openstreetmap.josm.gui.mappaint.mapcss.Condition.ToTagConvertable;
+import org.openstreetmap.josm.gui.mappaint.mapcss.Condition.TagCondition;
 import org.openstreetmap.josm.gui.mappaint.mapcss.ConditionFactory.Op;
 import org.openstreetmap.josm.gui.mappaint.mapcss.ConditionFactory.SimpleKeyValueCondition;
@@ -63,6 +63,6 @@
         assertTrue(op instanceof SimpleKeyValueCondition);
         assertEquals("[k1=v1]", op.toString());
-        assertEquals("k1", ((ToTagConvertable) op).asTag(null).getKey());
-        assertEquals("v1", ((ToTagConvertable) op).asTag(null).getValue());
+        assertEquals("k1", ((TagCondition) op).asTag(null).getKey());
+        assertEquals("v1", ((TagCondition) op).asTag(null).getValue());
     }
 
@@ -79,6 +79,6 @@
         assertFalse(op.applies(genEnv(node4)));
 
-        assertEquals("k1", ((ToTagConvertable) op).asTag(null).getKey());
-        assertEquals("k2", ((ToTagConvertable) op).asTag(null).getValue());
+        assertEquals("k1", ((TagCondition) op).asTag(null).getKey());
+        assertEquals("k2", ((TagCondition) op).asTag(null).getValue());
     }
 
