Index: src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/DataSet.java	(Revision 8465)
+++ 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;
+                selectionChanged(primitive);
             }
             allPrimitives.remove(primitive);
             primitive.setDataset(null);
@@ -548,7 +548,29 @@
         }
     }
 
+    private void selectionChanged(OsmPrimitive p){
+        selectionChanged(Collections.singleton(p));
+    }
+
+    private void selectionChanged(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 selectionChanged()}
+     * 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;
+        selectionChanged(primitive);
         return true;
     }
 
@@ -733,7 +752,7 @@
             addSelected(selection, false);
             changed = !oldSelection.equals(selectedPrimitives);
             if (changed) {
-                selectionSnapshot = null;
+                selectionChanged(oldSelection);
             }
         }
 
@@ -803,11 +822,9 @@
                 OsmPrimitive primitive = getPrimitiveByIdChecked(id);
                 if (primitive != null) {
                     changed = changed | selectedPrimitives.add(primitive);
+                    selectionChanged(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);
+                    selectionChanged(primitive);
                 }
             }
-            if (changed) {
-                selectionSnapshot = null;
-            }
         }
         if (changed) {
             fireSelectionChanged();
@@ -865,8 +880,8 @@
     public void clearSelection() {
         if (!selectedPrimitives.isEmpty()) {
             synchronized (selectionLock) {
+                selectionChanged(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;
+                    selectionChanged(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 8465)
+++ 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 8465)
+++ src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java	(Arbeitskopie)
@@ -401,6 +401,8 @@
                 break;
             case "modified":
                 return e.osm.isModified() || e.osm.isNewOrUndeleted();
+            case "selected":
+                return e.osm.isSelected();
             case "new":
                 return e.osm.isNew();
             case "connection":
