Index: /trunk/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java	(revision 8739)
+++ /trunk/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java	(revision 8740)
@@ -27,4 +27,21 @@
 public abstract class AbstractPrimitive implements IPrimitive {
 
+    /**
+     * This is a visitor that can be used to loop over the keys/values of this primitive.
+     *
+     * @author Michael Zangl
+     * @since 8740
+     */
+    public interface KeyValueVisitor {
+
+        /**
+         * This method gets called for every tag received.
+         *
+         * @param key   The key
+         * @param value The value
+         */
+        void visitKeyValue(String key, String value);
+    }
+
     private static final AtomicLong idCounter = new AtomicLong(0);
 
@@ -477,4 +494,5 @@
      * @return tags of this primitive. Changes made in returned map are not mapped
      * back to the primitive, use setKeys() to modify the keys
+     * @see #visitKeys(KeyValueVisitor)
      */
     @Override
@@ -489,4 +507,20 @@
         }
         return result;
+    }
+
+    /**
+     * Calls the visitor for every key/value pair of this primitive.
+     *
+     * @param visitor The visitor to call.
+     * @see #getKeys()
+     * @since 8740
+     */
+    public void visitKeys(KeyValueVisitor visitor) {
+        final String[] keys = this.keys;
+        if (keys != null) {
+            for (int i = 0; i < keys.length; i += 2) {
+                visitor.visitKeyValue(keys[i], keys[i + 1]);
+            }
+        }
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java	(revision 8739)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java	(revision 8740)
@@ -30,4 +30,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Version;
+import org.openstreetmap.josm.data.osm.AbstractPrimitive.KeyValueVisitor;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -145,5 +146,5 @@
          * @author Michael Zangl
          */
-        private final class RuleCandidatesIterator implements Iterator<MapCSSRule> {
+        private final class RuleCandidatesIterator implements Iterator<MapCSSRule>, KeyValueVisitor {
             private final BitSet ruleCandidates;
             private int next;
@@ -151,5 +152,4 @@
             private RuleCandidatesIterator(BitSet ruleCandidates) {
                 this.ruleCandidates = ruleCandidates;
-                next = ruleCandidates.nextSetBit(0);
             }
 
@@ -169,4 +169,20 @@
             public void remove() {
                 throw new UnsupportedOperationException();
+            }
+
+            @Override
+            public void visitKeyValue(String key, String value) {
+                MapCSSKeyRules v = index.get(key);
+                if (v != null) {
+                    BitSet rs = v.get(value);
+                    ruleCandidates.or(rs);
+                }
+            }
+
+            /**
+             * Call this before using the iterator.
+             */
+            public void prepare() {
+                next = ruleCandidates.nextSetBit(0);
             }
         }
@@ -318,12 +334,8 @@
             ruleCandidates.or(remaining);
 
-            for (Map.Entry<String, String> e : osm.getKeys().entrySet()) {
-                MapCSSKeyRules v = index.get(e.getKey());
-                if (v != null) {
-                    BitSet rs = v.get(e.getValue());
-                    ruleCandidates.or(rs);
-                }
-            }
-            return new RuleCandidatesIterator(ruleCandidates);
+            final RuleCandidatesIterator candidatesIterator = new RuleCandidatesIterator(ruleCandidates);
+            osm.visitKeys(candidatesIterator);
+            candidatesIterator.prepare();
+            return candidatesIterator;
         }
 
