Index: trunk/src/org/openstreetmap/josm/data/gpx/WayPoint.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/gpx/WayPoint.java	(revision 6894)
+++ trunk/src/org/openstreetmap/josm/data/gpx/WayPoint.java	(revision 6895)
@@ -25,4 +25,5 @@
     public double time;
     public Color customColoring;
+    public Color customColoringTransparent;
     public boolean drawLine;
     public int dir;
@@ -36,4 +37,5 @@
         time = p.time;
         customColoring = p.customColoring;
+        customColoringTransparent = p.customColoringTransparent;
         drawLine = p.drawLine;
         dir = p.dir;
Index: trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 6894)
+++ trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 6895)
@@ -367,4 +367,17 @@
         for (int i = 0; i < colors.length; i++) {
             colors[i] = Color.getHSBColor(i / 300.0f, 1, 1);
+        }
+    }
+    /** Colors (with custom alpha channel, if given) for HDOP painting. */
+    private final Color[] hdopColors;
+    private final int hdopAlpha = Main.pref.getInteger("hdop.color.alpha", -1);
+    {
+        if (hdopAlpha >= 0) {
+            hdopColors = new Color[256];
+            for (int i = 0; i < hdopColors.length; i++) {
+                hdopColors[i] = new Color((colors[i].getRGB() & 0xFFFFFF) | ((hdopAlpha & 0xFF) << 24), true);
+            }
+        } else {
+            hdopColors = colors;
         }
     }
@@ -556,12 +569,18 @@
                     }
                     trkPnt.customColoring = neutralColor;
-                    if(colored == colorModes.dilution && trkPnt.attr.get("hdop") != null) {
-                        float hdop = ((Float) trkPnt.attr.get("hdop")).floatValue();
-                        int hdoplvl =(int) Math.round(colorModeDynamic ? ((hdop-minval)*255/(maxval-minval))
-                                : (hdop <= 0 ? 0 : hdop * hdopfactor));
-                        // High hdop is bad, but high values in colors are green.
-                        // Therefore inverse the logic
-                        int hdopcolor = 255 - (hdoplvl > 255 ? 255 : hdoplvl);
-                        trkPnt.customColoring = colors[hdopcolor];
+                    if (trkPnt.attr.get("hdop") != null) {
+                        if (colored == colorModes.dilution) {
+                            float hdop = ((Float) trkPnt.attr.get("hdop")).floatValue();
+                            int hdoplvl =(int) Math.round(colorModeDynamic ? ((hdop-minval)*255/(maxval-minval))
+                                    : (hdop <= 0 ? 0 : hdop * hdopfactor));
+                            // High hdop is bad, but high values in colors are green.
+                            // Therefore inverse the logic
+                            int hdopcolor = 255 - (hdoplvl > 255 ? 255 : hdoplvl);
+                            trkPnt.customColoring = colors[hdopcolor];
+                            trkPnt.customColoringTransparent = hdopColors[hdopcolor];
+                        } else {
+                            trkPnt.customColoringTransparent = new Color(
+                                    neutralColor.getRed(), neutralColor.getGreen(), neutralColor.getBlue(), hdopAlpha & 0xFF);
+                        }
                     }
                     if (oldWp != null) {
@@ -740,5 +759,5 @@
                 }
                 Point screen = mv.getPoint(trkPnt.getEastNorth());
-                g.setColor(trkPnt.customColoring);
+                g.setColor(trkPnt.customColoringTransparent);
                 if (hdopcircle && trkPnt.attr.get("hdop") != null) {
                     // hdop value
