Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 19526)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 19528)
@@ -13,4 +13,5 @@
 import java.util.Objects;
 import java.util.Set;
+import java.util.HashMap;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
@@ -23,4 +24,5 @@
 import org.openstreetmap.josm.data.osm.visitor.OsmPrimitiveVisitor;
 import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor;
+import org.openstreetmap.josm.gui.mappaint.ElemStyles;
 import org.openstreetmap.josm.gui.mappaint.StyleCache;
 import org.openstreetmap.josm.spi.preferences.Config;
@@ -144,24 +146,29 @@
      * MAPPAINT
      *--------*/
-    private StyleCache mappaintStyle;
-
-    @Override
-    public final StyleCache getCachedStyle() {
-        return mappaintStyle;
-    }
-
-    @Override
-    public final void setCachedStyle(StyleCache mappaintStyle) {
-        this.mappaintStyle = mappaintStyle;
-    }
-
-    @Override
-    public final boolean isCachedStyleUpToDate() {
-        return mappaintStyle != null && mappaintCacheIdx == dataSet.getMappaintCacheIndex();
-    }
-
-    @Override
-    public final void declareCachedStyleUpToDate() {
+    private final Map<ElemStyles, StyleCache> mappaintStyle = new HashMap<>();
+
+    @Override
+    public final StyleCache getCachedStyle(ElemStyles elemStyles) {
+        return mappaintStyle.get(elemStyles);
+    }
+
+    @Override
+    public final void setCachedStyle(ElemStyles elemStyles, StyleCache mappaintStyle) {
+        this.mappaintStyle.put(elemStyles, mappaintStyle);
+    }
+
+    @Override
+    public final boolean isCachedStyleUpToDate(ElemStyles elemStyles) {
+        return mappaintStyle.get(elemStyles) != null && mappaintCacheIdx == dataSet.getMappaintCacheIndex();
+    }
+
+    @Override
+    public final void declareCachedStyleUpToDate(ElemStyles styles) {
         this.mappaintCacheIdx = dataSet.getMappaintCacheIndex();
+    }
+
+    @Override
+    public void clearCachedStyle() {
+        this.mappaintStyle.clear();
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/PrimitiveData.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/PrimitiveData.java	(revision 19526)
+++ trunk/src/org/openstreetmap/josm/data/osm/PrimitiveData.java	(revision 19528)
@@ -12,4 +12,5 @@
 
 import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor;
+import org.openstreetmap.josm.gui.mappaint.ElemStyles;
 import org.openstreetmap.josm.gui.mappaint.StyleCache;
 
@@ -152,20 +153,25 @@
 
     @Override
-    public StyleCache getCachedStyle() {
+    public StyleCache getCachedStyle(ElemStyles styles) {
         return null;
     }
 
     @Override
-    public void setCachedStyle(StyleCache mappaintStyle) {
+    public void setCachedStyle(ElemStyles styles, StyleCache mappaintStyle) {
         // Override if needed
     }
 
     @Override
-    public boolean isCachedStyleUpToDate() {
+    public boolean isCachedStyleUpToDate(ElemStyles styles) {
         return false;
     }
 
     @Override
-    public void declareCachedStyleUpToDate() {
+    public void declareCachedStyleUpToDate(ElemStyles styles) {
+        // Override if needed
+    }
+
+    @Override
+    public void clearCachedStyle(){
         // Override if needed
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/Stylable.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Stylable.java	(revision 19526)
+++ trunk/src/org/openstreetmap/josm/data/osm/Stylable.java	(revision 19528)
@@ -2,4 +2,5 @@
 package org.openstreetmap.josm.data.osm;
 
+import org.openstreetmap.josm.gui.mappaint.ElemStyles;
 import org.openstreetmap.josm.gui.mappaint.StyleCache;
 
@@ -12,13 +13,17 @@
     /**
      * Returns the cached style.
+     * @param styles styles for which the data is retrieved
      * @return the cached style
+     * @since 19528 (added param styles)
      */
-    StyleCache getCachedStyle();
+    StyleCache getCachedStyle(ElemStyles styles);
 
     /**
      * Sets the cached style.
+     * @param styles styles for which the data is stored
      * @param mappaintStyle the cached style
+     * @since 19528 (added param styles)
      */
-    void setCachedStyle(StyleCache mappaintStyle);
+    void setCachedStyle(ElemStyles styles, StyleCache mappaintStyle);
 
     /**
@@ -28,19 +33,21 @@
      * transparent cache handling in the future.
      */
-    default void clearCachedStyle() {
-        setCachedStyle(null);
-    }
+    void clearCachedStyle();
 
     /**
      * Check if the cached style for this primitive is up to date.
+     * @param styles styles for which the data is checked
      * @return true if the cached style for this primitive is up to date
      * @since 13420
+     * @since 19528 (added param styles)
      */
-    boolean isCachedStyleUpToDate();
+    boolean isCachedStyleUpToDate(ElemStyles styles);
 
     /**
      * Declare that the cached style for this primitive is up to date.
+     * @param styles styles for which the data is handled
      * @since 13420
+     * @since 19528 (added param styles)
      */
-    void declareCachedStyleUpToDate();
+    void declareCachedStyleUpToDate(ElemStyles styles);
 }
Index: trunk/src/org/openstreetmap/josm/data/vector/VectorPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/vector/VectorPrimitive.java	(revision 19526)
+++ trunk/src/org/openstreetmap/josm/data/vector/VectorPrimitive.java	(revision 19528)
@@ -6,4 +6,5 @@
 import java.util.List;
 import java.util.Map;
+import java.util.HashMap;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
@@ -14,4 +15,5 @@
 import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor;
+import org.openstreetmap.josm.gui.mappaint.ElemStyles;
 import org.openstreetmap.josm.gui.mappaint.StyleCache;
 import org.openstreetmap.josm.tools.Utils;
@@ -25,5 +27,5 @@
     private VectorDataSet dataSet;
     private boolean highlighted;
-    private StyleCache mappaintStyle;
+    private final Map<ElemStyles, StyleCache> mappaintStyle = new HashMap<>();
     private final String layer;
 
@@ -78,21 +80,25 @@
 
     @Override
-    public final StyleCache getCachedStyle() {
-        return mappaintStyle;
-    }
-
-    @Override
-    public final void setCachedStyle(StyleCache mappaintStyle) {
-        this.mappaintStyle = mappaintStyle;
-    }
-
-    @Override
-    public final boolean isCachedStyleUpToDate() {
-        return mappaintStyle != null && mappaintCacheIdx == dataSet.getMappaintCacheIndex();
-    }
-
-    @Override
-    public final void declareCachedStyleUpToDate() {
+    public final StyleCache getCachedStyle(ElemStyles elemStyles) {
+        return mappaintStyle.get(elemStyles);
+    }
+
+    @Override
+    public final void setCachedStyle(ElemStyles elemStyles, StyleCache mappaintStyle) {
+        this.mappaintStyle.put(elemStyles, mappaintStyle);
+    }
+
+    @Override
+    public final boolean isCachedStyleUpToDate(ElemStyles elemStyles) {
+        return mappaintStyle.get(elemStyles) != null && mappaintCacheIdx == dataSet.getMappaintCacheIndex();
+    }
+
+    @Override
+    public final void declareCachedStyleUpToDate(ElemStyles elemStyles) {
         this.mappaintCacheIdx = dataSet.getMappaintCacheIndex();
+    }
+
+    public void clearCachedStyle() {
+        this.mappaintStyle.clear();
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java	(revision 19526)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java	(revision 19528)
@@ -164,6 +164,6 @@
         if (sel.size() == 2) {
             List<IPrimitive> selList = new ArrayList<>(sel);
-            StyleCache sc1 = selList.get(0).getCachedStyle();
-            StyleCache sc2 = selList.get(1).getCachedStyle();
+            StyleCache sc1 = selList.get(0).getCachedStyle(elemstyles);
+            StyleCache sc2 = selList.get(1).getCachedStyle(elemstyles);
             if (sc1 == sc2) {
                 txtMappaint.println(tr("The 2 selected objects have identical style caches."));
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java	(revision 19526)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java	(revision 19528)
@@ -164,8 +164,8 @@
     public Pair<StyleElementList, Range> getStyleCacheWithRange(IPrimitive osm, double scale, NavigatableComponent nc) {
         synchronized (osm.getStyleCacheSyncObject()) {
-            if (!osm.isCachedStyleUpToDate() || scale <= 0) {
-                osm.setCachedStyle(StyleCache.EMPTY_STYLECACHE);
+            if (!osm.isCachedStyleUpToDate(this) || scale <= 0) {
+                osm.setCachedStyle(this, StyleCache.EMPTY_STYLECACHE);
             } else {
-                Pair<StyleElementList, Range> lst = osm.getCachedStyle().getWithRange(scale, osm.isSelected());
+                Pair<StyleElementList, Range> lst = osm.getCachedStyle(this).getWithRange(scale, osm.isSelected());
                 if (lst.a != null)
                     return lst;
@@ -217,13 +217,13 @@
                 }
             }
-            StyleCache style = osm.getCachedStyle() != null ? osm.getCachedStyle() : StyleCache.EMPTY_STYLECACHE;
+            StyleCache style = osm.getCachedStyle(this) != null ? osm.getCachedStyle(this) : StyleCache.EMPTY_STYLECACHE;
             try {
-                osm.setCachedStyle(style.put(p.a, p.b, osm.isSelected()));
+                osm.setCachedStyle(this, style.put(p.a, p.b, osm.isSelected()));
             } catch (RangeViolatedError e) {
                 throw new AssertionError("Range violated: " + e.getMessage()
-                  + " (object: " + osm.getPrimitiveId() + ", current style: " + osm.getCachedStyle()
+                  + " (object: " + osm.getPrimitiveId() + ", current style: " + osm.getCachedStyle(this)
                   + ", scale: " + scale + ", new stylelist: " + p.a + ", new range: " + p.b + ')', e);
             }
-            osm.declareCachedStyleUpToDate();
+            osm.declareCachedStyleUpToDate(this);
             return p;
         }
