Index: src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java
===================================================================
--- src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java	(revision 16583)
+++ src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java	(working copy)
@@ -20,6 +20,7 @@
 import org.openstreetmap.josm.data.osm.visitor.paint.PaintColors;
 import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon;
 import org.openstreetmap.josm.data.osm.visitor.paint.relations.MultipolygonCache;
+import org.openstreetmap.josm.data.preferences.NamedColorProperty;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
@@ -39,6 +40,7 @@
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.spi.preferences.PreferenceChangeEvent;
 import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;
+import org.openstreetmap.josm.tools.ColorHelper;
 import org.openstreetmap.josm.tools.Pair;
 
 /**
@@ -603,17 +605,24 @@
      * as frequent preference lookup (using <code>Config.getPref().get()</code>) for
      * each primitive can be slow during rendering.
      *
+     * @param source style source
      * @param key preference key
      * @param def default value
      * @return the corresponding preference value
      * @see org.openstreetmap.josm.data.Preferences#get(String, String)
      */
-    public String getPreferenceCached(String key, String def) {
+    public String getPreferenceCached(StyleSource source, String key, String def) {
         String res;
         if (preferenceCache.containsKey(key)) {
             res = preferenceCache.get(key);
         } else {
-            res = Config.getPref().get(key, null);
+            Object realDef = Cascade.convertTo(def, Color.class);
+            if (realDef instanceof Color) {
+                String prefName = source != null ? source.getFileNamePart() : "unknown";
+                res = ColorHelper.color2html(new NamedColorProperty(NamedColorProperty.COLOR_CATEGORY_MAPPAINT, prefName, key, (Color) realDef).get());
+            } else {
+                res = Config.getPref().get(key, null);
+            }
             preferenceCache.put(key, res);
         }
         return res != null ? res : def;
Index: src/org/openstreetmap/josm/gui/mappaint/mapcss/Functions.java
===================================================================
--- src/org/openstreetmap/josm/gui/mappaint/mapcss/Functions.java	(revision 16583)
+++ src/org/openstreetmap/josm/gui/mappaint/mapcss/Functions.java	(working copy)
@@ -773,7 +773,7 @@
      * @return value for key, or default value if not found
      */
     public static String JOSM_pref(Environment env, String key, String def) { // NO_UCD (unused code)
-        return MapPaintStyles.getStyles().getPreferenceCached(key, def);
+        return MapPaintStyles.getStyles().getPreferenceCached(env != null ? env.source : null, key, def);
     }
 
     /**
Index: test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/FunctionsTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/FunctionsTest.java	(revision 16583)
+++ test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/FunctionsTest.java	(working copy)
@@ -5,6 +5,9 @@
 import static org.junit.Assert.assertTrue;
 import static org.openstreetmap.josm.data.osm.OsmPrimitiveType.NODE;
 
+import java.util.Collections;
+import java.util.function.BiConsumer;
+
 import org.junit.Rule;
 import org.junit.Test;
 import org.openstreetmap.josm.TestUtils;
@@ -11,6 +14,7 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.User;
+import org.openstreetmap.josm.data.preferences.NamedColorProperty;
 import org.openstreetmap.josm.gui.mappaint.Environment;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.spi.preferences.Config;
@@ -111,17 +115,38 @@
      */
     @Test
     public void testPref() {
+        testPrefKey("", "foobar", "baz", (key, def) -> Config.getPref().put(key, def));
+        testPrefKey(NamedColorProperty.NAMED_COLOR_PREFIX + NamedColorProperty.COLOR_CATEGORY_MAPPAINT + ".unknown.", "#000000", "#00FF00",
+                (key, def) -> {
+                    if (def != null) {
+                        Config.getPref().putList(key, Collections.singletonList(def));
+                    } else {
+                        Config.getPref().put(key, def);
+                    }
+                });
+    }
+
+    /**
+     * Test a preference key
+     * @param prefix A prefix, if necessary. Some objects (color specifically) will add a prefix.
+     * @param def The default value
+     * @param toSet The value to set and test against
+     * @param setPref A biconsumer to set the key and pref values
+     */
+    private void testPrefKey(String prefix, String def, String toSet, BiConsumer<String, String> setPref) {
         String key = "Functions.JOSM_pref";
-        assertEquals("foobar", Functions.JOSM_pref(null, key, "foobar"));
-        Config.getPref().put(key, "baz");
+        setPref.accept(prefix + key, null);
+        assertEquals(def, Functions.JOSM_pref(null, key, def));
+        setPref.accept(prefix + key, toSet);
         GuiHelper.runInEDTAndWait(() -> {
             // await org.openstreetmap.josm.gui.mappaint.ElemStyles.clearCached
         });
-        assertEquals("baz", Functions.JOSM_pref(null, key, "foobar"));
-        Config.getPref().put(key, null);
+        assertEquals(toSet, Functions.JOSM_pref(null, key, def));
+        setPref.accept(prefix + key, null);
         GuiHelper.runInEDTAndWait(() -> {
             // await org.openstreetmap.josm.gui.mappaint.ElemStyles.clearCached
         });
-        assertEquals("foobar", Functions.JOSM_pref(null, key, "foobar"));
+        assertEquals(def, Functions.JOSM_pref(null, key, def));
+        setPref.accept(prefix + key, null);
     }
 }
