Index: trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 1220)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 1221)
@@ -82,5 +82,5 @@
 
         //putValue("help", "Action/AddNode/Autnode");
-        selectedColor = Main.pref.getColor(marktr("selected"), Color.YELLOW);
+        selectedColor = Main.pref.getColor(marktr("selected"), Color.red);
 
         drawHelperLine = Main.pref.getBoolean("draw.helper-line", true);
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 1220)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 1221)
@@ -79,5 +79,5 @@
         putValue("help", "Action/Extrude/Extrude");
         initialMoveDelay = Main.pref.getInteger("edit.initial-move-delay",200);
-        selectedColor = Main.pref.getColor(marktr("selected"), Color.YELLOW);
+        selectedColor = Main.pref.getColor(marktr("selected"), Color.red);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 1220)
+++ trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 1221)
@@ -183,4 +183,21 @@
     }
 
+    synchronized public TreeMap<String, String> getAllColors() {
+        final TreeMap<String,String> all = new TreeMap<String,String>();
+        for (final Entry<String,String> e : defaults.entrySet())
+            if (e.getKey().startsWith("color."))
+                all.put(e.getKey().substring(6), e.getValue());
+        for (final Entry<String,String> e : properties.entrySet())
+            if (e.getKey().startsWith("color."))
+                all.put(e.getKey().substring(6), e.getValue());
+        for (final Entry<String,String> e : override.entrySet())
+            if (e.getKey().startsWith("color."))
+                if (e.getValue() == null)
+                    all.remove(e.getKey().substring(6));
+                else
+                    all.put(e.getKey().substring(6), e.getValue());
+        return all;
+    }
+
     synchronized public Map<String, String> getDefaults() {
         return defaults;
@@ -345,10 +362,5 @@
      */
     synchronized public Color getColor(String colName, Color def) {
-        String colStr = get("color."+colName);
-        if (colStr.equals("")) {
-            put("color."+colName, ColorHelper.color2html(def));
-            return def;
-        }
-        return ColorHelper.html2color(colStr);
+        return getColor(colName, null, def);
     }
 
@@ -362,15 +374,9 @@
      */
     synchronized public Color getColor(String colName, String specName, Color def) {
-        String colStr = get("color."+specName);
+        putDefault("color."+colName, ColorHelper.color2html(def));
+        String colStr = specName != null ? get("color."+specName) : "";
         if(colStr.equals(""))
-        {
             colStr = get("color."+colName);
-            if (colStr.equals("")) {
-                put("color."+colName, ColorHelper.color2html(def));
-                return def;
-            }
-        }
-        putDefault("color."+colName, ColorHelper.color2html(def));
-        return ColorHelper.html2color(colStr);
+        return colStr.equals("") ? def : ColorHelper.html2color(colStr);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 1220)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 1221)
@@ -752,14 +752,21 @@
                 g.drawRect(p.x - radius, p.y - radius, size, size);
 
-			String name = getNodeName(n);
-			if (name!=null /* && annotate */)
-			{
-				g.setColor(textColor);
-				Font defaultFont = g.getFont();
-				g.setFont (orderFont);
-				g.drawString (name, p.x+radius+2, p.y+radius+2);
-				g.setFont(defaultFont);
-			}
-        }
+            String name = getNodeName(n);
+            if (name!=null /* && annotate */)
+            {
+                g.setColor(textColor);
+                Font defaultFont = g.getFont();
+                g.setFont (orderFont);
+                g.drawString (name, p.x+radius+2, p.y+radius+2);
+                g.setFont(defaultFont);
+            }
+        }
+    }
+
+    public void getColors()
+    {
+        super.getColors();
+        untaggedColor = Main.pref.getColor(marktr("untagged"),Color.GRAY);
+        textColor = Main.pref.getColor (marktr("text"), Color.WHITE);
     }
 
@@ -767,17 +774,15 @@
     // Shows areas before non-areas
     public void visitAll(DataSet data, Boolean virtual) {
-	
-		boolean profiler = Main.pref.getBoolean("mappaint.profiler",false);
-		long profilerStart = java.lang.System.currentTimeMillis();
-		long profilerLast = profilerStart;
-		int profilerN;
-		if(profiler)
-		{
-			System.out.println("Mappaint Profiler");
-		}
-		
+
+        boolean profiler = Main.pref.getBoolean("mappaint.profiler",false);
+        long profilerStart = java.lang.System.currentTimeMillis();
+        long profilerLast = profilerStart;
+        int profilerN;
+        if(profiler)
+        {
+            System.out.println("Mappaint Profiler");
+        }
+
         getSettings(virtual);
-        untaggedColor = Main.pref.getColor(marktr("untagged"),Color.GRAY);
-        textColor = Main.pref.getColor (marktr("text"), Color.WHITE);
         useRealWidth = Main.pref.getBoolean("mappaint.useRealWidth",false);
         zoomLevelDisplay = Main.pref.getBoolean("mappaint.zoomLevelDisplay",false);
@@ -795,32 +800,32 @@
         selectedCall = false;
 
-		if(profiler) 
-		{
-			System.out.format("Prepare  : %4dms\n", (java.lang.System.currentTimeMillis()-profilerLast));
-			profilerLast = java.lang.System.currentTimeMillis();
-		}
-		
+        if(profiler) 
+        {
+            System.out.format("Prepare  : %4dms\n", (java.lang.System.currentTimeMillis()-profilerLast));
+            profilerLast = java.lang.System.currentTimeMillis();
+        }
+
         if (fillAreas && styles.hasAreas()) {
             Collection<Way> noAreaWays = new LinkedList<Way>();
 
-			/*** RELATIONS ***/
-			profilerN = 0;
+            /*** RELATIONS ***/
+            profilerN = 0;
             for (final Relation osm : data.relations)
             {
                 if(!osm.deleted && !osm.incomplete)
-				{
+                {
                     osm.visit(this);
-					profilerN++;
-				}
-            }
-
-			if(profiler) 
-			{
-				System.out.format("Relations: %4dms, n=%d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
-				profilerLast = java.lang.System.currentTimeMillis();
-			}
-			
-			/*** AREAS ***/
-			profilerN = 0;
+                    profilerN++;
+                }
+            }
+
+            if(profiler) 
+            {
+                System.out.format("Relations: %4dms, n=%d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
+                profilerLast = java.lang.System.currentTimeMillis();
+            }
+
+            /*** AREAS ***/
+            profilerN = 0;
             for (final Way osm : data.ways)
             {
@@ -836,13 +841,13 @@
             }
             alreadyDrawnAreas = null;
-			
-			if(profiler) 
-			{
-				System.out.format("Areas    : %4dms, n=%d\n",  (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
-				profilerLast = java.lang.System.currentTimeMillis();
-			}
-
-			/*** WAYS ***/
-			profilerN = 0;
+
+            if(profiler)
+            {
+                System.out.format("Areas    : %4dms, n=%d\n",  (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
+                profilerLast = java.lang.System.currentTimeMillis();
+            }
+
+            /*** WAYS ***/
+            profilerN = 0;
             fillAreas = false;
             for (final OsmPrimitive osm : noAreaWays)
@@ -851,96 +856,96 @@
                 profilerN++;
             }
-			
-			if(profiler) 
-			{
-				System.out.format("Ways     : %4dms, n=%d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
-				profilerLast = java.lang.System.currentTimeMillis();
-			}
+
+            if(profiler)
+            {
+                System.out.format("Ways     : %4dms, n=%d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
+                profilerLast = java.lang.System.currentTimeMillis();
+            }
         }
         else
         {
-			/*** WAYS (filling disabled)  ***/			
-			profilerN = 0;
+            /*** WAYS (filling disabled)  ***/
+            profilerN = 0;
             for (final OsmPrimitive osm : data.ways)
                 if (!osm.incomplete && !osm.deleted && !osm.selected)
-				{
+                {
                     osm.visit(this);
                     profilerN++;
-				}
-					
-			if(profiler) 
-			{
-				System.out.format("Ways     : %4dms, n=%d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
-				profilerLast = java.lang.System.currentTimeMillis();
-			}
-        }
-
-		/*** SELECTED  ***/
+                }
+
+            if(profiler)
+            {
+                System.out.format("Ways     : %4dms, n=%d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
+                profilerLast = java.lang.System.currentTimeMillis();
+            }
+        }
+
+        /*** SELECTED  ***/
         selectedCall = true;
-		profilerN = 0;
+        profilerN = 0;
         for (final OsmPrimitive osm : data.getSelected()) {
             if (!osm.incomplete && !osm.deleted
             && !(osm instanceof Node) && !alreadyDrawn.contains(osm))
-			{
+            {
                 osm.visit(this);
-				profilerN++;
-			}
-        }
-		
-		if(profiler) 
-		{
-			System.out.format("Selected : %4dms, n=%d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
-			profilerLast = java.lang.System.currentTimeMillis();
-		}
-
-		/*** DISPLAY CACHED SEGMENTS (WAYS) NOW ***/
+                profilerN++;
+            }
+        }
+
+        if(profiler)
+        {
+            System.out.format("Selected : %4dms, n=%d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
+            profilerLast = java.lang.System.currentTimeMillis();
+        }
+
+        /*** DISPLAY CACHED SEGMENTS (WAYS) NOW ***/
         displaySegments();
-		/*System.out.println("display segments " + (java.lang.System.currentTimeMillis()-profilerLast) + "ms");
-		profilerLast = java.lang.System.currentTimeMillis();*/
-
-		/*** NODES ***/
-		profilerN = 0;
+        /*System.out.println("display segments " + (java.lang.System.currentTimeMillis()-profilerLast) + "ms");
+        profilerLast = java.lang.System.currentTimeMillis();*/
+
+        /*** NODES ***/
+        profilerN = 0;
         for (final OsmPrimitive osm : data.nodes)
             if (!osm.incomplete && !osm.deleted && !alreadyDrawn.contains(osm))
             {
                 osm.visit(this);
-				profilerN++;
-			}
-				
-		if(profiler) 
-		{
-			System.out.format("Nodes    : %4dms, n=%d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
-			profilerLast = java.lang.System.currentTimeMillis();
-		}
+                profilerN++;
+            }
+
+        if(profiler)
+        {
+            System.out.format("Nodes    : %4dms, n=%d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
+            profilerLast = java.lang.System.currentTimeMillis();
+        }
 
         alreadyDrawn = null;
 
-		/*** VIRTUAL  ***/
+        /*** VIRTUAL  ***/
         if (virtualNodeSize != 0)
         {
-			profilerN = 0;
+            profilerN = 0;
             currentColor = nodeColor;
             for (final OsmPrimitive osm : data.ways)
                 if (!osm.incomplete && !osm.deleted)
-				{
+                {
                     visitVirtual((Way)osm);
-					profilerN++;
-				}
-					
-			if(profiler) 
-			{
-				System.out.format("Virtual  : %4dms, n=%d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
-				profilerLast = java.lang.System.currentTimeMillis();
-			}
-            
-			displaySegments(null);
-			/*System.out.println("display segments virtual " + (java.lang.System.currentTimeMillis()-profilerLast) + "ms");
-			profilerLast = java.lang.System.currentTimeMillis();*/
-        }
-		
-		if(profiler) 
-		{
-			System.out.format("All      : %4dms\n", (profilerLast-profilerStart));
-		}
+                    profilerN++;
+                }
+
+            if(profiler)
+            {
+                System.out.format("Virtual  : %4dms, n=%d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
+                profilerLast = java.lang.System.currentTimeMillis();
+            }
+
+            displaySegments(null);
+            /*System.out.println("display segments virtual " + (java.lang.System.currentTimeMillis()-profilerLast) + "ms");
+            profilerLast = java.lang.System.currentTimeMillis();*/
+        }
+
+        if(profiler)
+        {
+            System.out.format("All      : %4dms\n", (profilerLast-profilerStart));
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 1220)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 1221)
@@ -85,8 +85,9 @@
     Rectangle bbox = new Rectangle();
 
-    protected void getSettings(Boolean virtual) {
-        inactiveColor = Main.pref.getColor(marktr("inactive"), Color.DARK_GRAY);
-        selectedColor = Main.pref.getColor(marktr("selected"), Color.WHITE);
-        nodeColor = Main.pref.getColor(marktr("node"), Color.RED);
+    public void getColors()
+    {
+        inactiveColor = Main.pref.getColor(marktr("inactive"), Color.darkGray);
+        selectedColor = Main.pref.getColor(marktr("selected"), Color.red);
+        nodeColor = Main.pref.getColor(marktr("node"), Color.yellow);
         dfltWayColor = Main.pref.getColor(marktr("way"), darkblue);
         relationColor = Main.pref.getColor(marktr("relation"), teal);
@@ -94,4 +95,7 @@
         incompleteColor = Main.pref.getColor(marktr("incomplete way"), darkerblue);
         backgroundColor = Main.pref.getColor(marktr("background"), Color.BLACK);
+    }
+
+    protected void getSettings(Boolean virtual) {
         showDirectionArrow = Main.pref.getBoolean("draw.segment.direction");
         showRelevantDirectionsOnly = Main.pref.getBoolean("draw.segment.relevant_directions_only", true);
Index: trunk/src/org/openstreetmap/josm/gui/MapScaler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapScaler.java	(revision 1220)
+++ trunk/src/org/openstreetmap/josm/gui/MapScaler.java	(revision 1221)
@@ -31,5 +31,5 @@
         String text = dist > 1000 ? (Math.round(dist/100)/10.0)+" km" : Math.round(dist*10)/10+" m";
         Rectangle2D bound = g.getFontMetrics().getStringBounds(text, g);
-        g.setColor(Main.pref.getColor(marktr("scale"), Color.white));
+        g.setColor(getColor());
         g.drawLine(0, 5, 99, 5);
         g.drawLine(0, 0, 0, 10);
@@ -41,4 +41,9 @@
     }
 
+    static public Color getColor()
+    {
+        return Main.pref.getColor(marktr("scale"), Color.white);
+    }
+
     public String helpTopic() {
         return "MapView/Scaler";
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 1220)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 1221)
@@ -137,10 +137,15 @@
     }
 
+    static public Color getColor()
+    {
+        return Main.pref.getColor(marktr("conflict"), Color.gray);
+    }
+
     /**
      * Paint all conflicts that can be expressed on the main window.
      */
     public void paintConflicts(final Graphics g, final NavigatableComponent nc) {
-        Color preferencesColor = Main.pref.getColor("conflict", Color.gray);
-        if (preferencesColor.equals(Color.BLACK))
+        Color preferencesColor = getColor();
+        if (preferencesColor.equals(Main.pref.getColor(marktr("background"), Color.black)))
             return;
         g.setColor(preferencesColor);
Index: trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 1220)
+++ trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 1221)
@@ -108,4 +108,9 @@
     }
 
+    static public Color getColor(String name)
+    {
+        return Main.pref.getColor(marktr("gps point"), name != null ? "layer "+name : null, Color.gray);
+    }
+
     @Override public Component[] getMenuEntries() {
         JMenuItem line = new JMenuItem(tr("Customize line drawing"), ImageProvider.get("mapmode/addsegment"));
@@ -142,5 +147,5 @@
         color.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
-                JColorChooser c = new JColorChooser(Main.pref.getColor(marktr("gps point"), "layer "+name, Color.gray));
+                JColorChooser c = new JColorChooser(getColor(name));
                 Object[] options = new Object[]{tr("OK"), tr("Cancel"), tr("Default")};
                 int answer = JOptionPane.showOptionDialog(Main.parent, c, tr("Choose a color"), JOptionPane.OK_CANCEL_OPTION,
@@ -370,5 +375,5 @@
          ****************************************************************/
         // Long startTime = System.currentTimeMillis();
-        Color neutralColor = Main.pref.getColor(marktr("gps point"), "layer "+name, Color.GRAY);
+        Color neutralColor = getColor(name);
         boolean forceLines = Main.pref.getBoolean("draw.rawgps.lines.force");                     // also draw lines between points belonging to different segments
         boolean direction = Main.pref.getBoolean("draw.rawgps.direction");                        // draw direction arrows on the lines
Index: trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java	(revision 1220)
+++ trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java	(revision 1221)
@@ -147,4 +147,9 @@
     }
 
+    static public Color getColor(String name)
+    {
+        return Main.pref.getColor(marktr("gps marker"), name != null ? "layer "+name : null, Color.gray);
+    }
+
     @Override public void paint(Graphics g, MapView mv) {
         boolean mousePressedTmp = mousePressed;
@@ -152,5 +157,5 @@
         String mkrTextShow = Main.pref.get("marker.show "+name, "show");
 
-        g.setColor(Main.pref.getColor(marktr("gps marker"), "layer "+name, Color.gray));
+        g.setColor(getColor(name));
 
         for (Marker mkr : data) {
@@ -191,5 +196,5 @@
         color.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent e) {
-                JColorChooser c = new JColorChooser(Main.pref.getColor(marktr("gps marker"), "layer "+name, Color.gray));
+                JColorChooser c = new JColorChooser(getColor(name));
                 Object[] options = new Object[]{tr("OK"), tr("Cancel"), tr("Default")};
                 int answer = JOptionPane.showOptionDialog(Main.parent, c, tr("Choose a color"), JOptionPane.OK_CANCEL_OPTION,
Index: trunk/src/org/openstreetmap/josm/gui/preferences/ColorPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/ColorPreference.java	(revision 1220)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/ColorPreference.java	(revision 1221)
@@ -33,6 +33,10 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.visitor.SimplePaintVisitor;
+import org.openstreetmap.josm.data.osm.visitor.MapPaintVisitor;
+import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
+import org.openstreetmap.josm.gui.layer.GpxLayer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.MapScaler;
+import org.openstreetmap.josm.gui.dialogs.ConflictDialog;
 import org.openstreetmap.josm.tools.ColorHelper;
 import org.openstreetmap.josm.tools.GBC;
@@ -95,12 +99,6 @@
 
     public void addGui(final PreferenceDialog gui) {
-        // initial fill with colors from preferences:
-        Map<String,String> prefColorMap = new TreeMap<String, String>(Main.pref.getAllPrefix("color."));
-        fixColorPrefixes(prefColorMap);
-        Map<String,String> colorMap = new TreeMap<String, String>();
-        for(String key : prefColorMap.keySet()) {
-            colorMap.put(key.substring("color.".length()), prefColorMap.get(key));
-        }
-        setColorModel(colorMap);
+        fixColorPrefixes();
+        setColorModel(Main.pref.getAllColors());
 
         colors = new JTable(tableModel) {
@@ -153,24 +151,9 @@
      * Add all missing color entries.
      */
-    private void fixColorPrefixes(Map<String, String> prefColorMap) {
-        String[] cp = {
-            marktr("background"), ColorHelper.color2html(Color.black),
-            marktr("node"), ColorHelper.color2html(Color.red),
-            marktr("way"), ColorHelper.color2html(SimplePaintVisitor.darkblue),
-            marktr("incomplete way"), ColorHelper.color2html(SimplePaintVisitor.darkerblue),
-            marktr("relation"), ColorHelper.color2html(SimplePaintVisitor.teal),
-            marktr("selected"), ColorHelper.color2html(Color.white),
-            marktr("gps marker"), ColorHelper.color2html(Color.gray),
-            marktr("gps point"), ColorHelper.color2html(Color.gray),
-            marktr("conflict"), ColorHelper.color2html(Color.gray),
-            marktr("scale"), ColorHelper.color2html(Color.white),
-            marktr("inactive"), ColorHelper.color2html(Color.darkGray),
-        };
-        for (int i = 0; i < cp.length/2; ++i)
-        {
-            if (!Main.pref.hasKey("color."+cp[i*2]))
-                Main.pref.put("color."+cp[i*2], cp[i*2+1]);
-            Main.pref.putDefault("color."+cp[i*2], cp[i*2+1]);
-        }
+    private void fixColorPrefixes() {
+        (new MapPaintVisitor()).getColors();
+        MarkerLayer.getColor(null);
+        MapScaler.getColor();
+        ConflictDialog.getColor();
     }
 
