Index: src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/DataSet.java	(Revision 8535)
+++ src/org/openstreetmap/josm/data/osm/DataSet.java	(Arbeitskopie)
@@ -499,7 +499,7 @@
                 throw new RuntimeException("failed to remove primitive: "+primitive);
             synchronized (selectionLock) {
                 selectedPrimitives.remove(primitive);
-                selectionSnapshot = null;
+                handleSelectionChanged(primitive);
             }
             allPrimitives.remove(primitive);
             primitive.setDataset(null);
@@ -548,7 +548,29 @@
         }
     }
 
+    private void handleSelectionChanged(OsmPrimitive p){
+        handleSelectionChanged(Collections.singleton(p));
+    }
+
+    private void handleSelectionChanged(Collection<OsmPrimitive> col){
+        for (OsmPrimitive o : col) {
+            o.clearCachedStyle();
+            for (OsmPrimitive ref : o.getReferrers()) {
+                ref.clearCachedStyle();
+            }
+        }
+        selectionSnapshot = null;
+    }
+
+    /**
+     * List of currently selected primitives.
+     */
     private Set<OsmPrimitive> selectedPrimitives = new LinkedHashSet<>();
+    /**
+     * Cache of the collection returned by {@link getAllSelected()}. Must be
+     * invalidated by the calling function through {@link handleSelectionChanged()}
+     * when selection is changed.
+     */
     private Collection<OsmPrimitive> selectionSnapshot;
 
     /**
@@ -662,9 +684,6 @@
             for (PrimitiveId o : osm) {
                 changed = changed | this.__toggleSelected(o);
             }
-            if (changed) {
-                selectionSnapshot = null;
-            }
         }
         if (changed) {
             fireSelectionChanged();
@@ -686,7 +705,7 @@
         if (!selectedPrimitives.remove(primitive)) {
             selectedPrimitives.add(primitive);
         }
-        selectionSnapshot = null;
+        handleSelectionChanged(primitive);
         return true;
     }
 
@@ -733,7 +752,7 @@
             addSelected(selection, false);
             changed = !oldSelection.equals(selectedPrimitives);
             if (changed) {
-                selectionSnapshot = null;
+                handleSelectionChanged(oldSelection);
             }
         }
 
@@ -803,11 +822,9 @@
                 OsmPrimitive primitive = getPrimitiveByIdChecked(id);
                 if (primitive != null) {
                     changed = changed | selectedPrimitives.add(primitive);
+                    handleSelectionChanged(primitive);
                 }
             }
-            if (changed) {
-                selectionSnapshot = null;
-            }
         }
         if (fireSelectionChangeEvent && changed) {
             fireSelectionChanged();
@@ -848,11 +865,9 @@
                 OsmPrimitive primitive = getPrimitiveById(id);
                 if (primitive != null) {
                     changed = changed | selectedPrimitives.remove(primitive);
+                    handleSelectionChanged(primitive);
                 }
             }
-            if (changed) {
-                selectionSnapshot = null;
-            }
         }
         if (changed) {
             fireSelectionChanged();
@@ -865,8 +880,8 @@
     public void clearSelection() {
         if (!selectedPrimitives.isEmpty()) {
             synchronized (selectionLock) {
+                handleSelectionChanged(selectedPrimitives);
                 selectedPrimitives.clear();
-                selectionSnapshot = null;
             }
             fireSelectionChanged();
         }
@@ -1268,7 +1283,7 @@
                 OsmPrimitive primitive = it.next();
                 if (primitive.isDeleted() && (!primitive.isVisible() || primitive.isNew())) {
                     selectedPrimitives.remove(primitive);
-                    selectionSnapshot = null;
+                    handleSelectionChanged(primitive);
                     allPrimitives.remove(primitive);
                     primitive.setDataset(null);
                     changed = true;
Index: src/org/openstreetmap/josm/gui/mappaint/Environment.java
===================================================================
--- src/org/openstreetmap/josm/gui/mappaint/Environment.java	(Revision 8535)
+++ src/org/openstreetmap/josm/gui/mappaint/Environment.java	(Arbeitskopie)
@@ -221,8 +221,8 @@
     }
 
     public String getRole() {
-        if (getContext().equals(Context.PRIMITIVE))
-            return null;
+        //if (getContext().equals(Context.PRIMITIVE))
+        //    return null;
 
         if (parent instanceof Relation)
             return ((Relation) parent).getMember(index).getRole();
Index: src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java
===================================================================
--- src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java	(Revision 8535)
+++ src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java	(Arbeitskopie)
@@ -445,6 +445,13 @@
         }
 
         /**
+         * {@code :selected} tests whether the object is selected.
+         */
+        static boolean selected(Environment e) {
+            return e.osm.isSelected();
+        }
+
+        /**
          * {@code unconnected}: tests whether the object is a unconnected node.
          */
         static boolean unconnected(Environment e) {
