Index: /trunk/src/org/openstreetmap/josm/data/gpx/WayPoint.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/gpx/WayPoint.java	(revision 1424)
+++ /trunk/src/org/openstreetmap/josm/data/gpx/WayPoint.java	(revision 1425)
@@ -18,5 +18,5 @@
     public final EastNorth eastNorth;
     public double time;
-    public Color speedLineColor;
+    public Color customColoring;
     public boolean drawLine;
     public int dir;
Index: /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 1424)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 1425)
@@ -86,5 +86,5 @@
     private int computeCacheMaxLineLengthUsed;
     private Color computeCacheColorUsed;
-    private boolean computeCacheColored;
+    private colorModes computeCacheColored;
     private int computeCacheColorTracksTune;
 
@@ -369,5 +369,8 @@
         {-ll0,-sl9,-ll0,+sl9}
     };
-
+    
+    // the different color modes
+    enum colorModes { none, velocity, dilution }
+    
     @Override public void paint(Graphics g, MapView mv) {
 
@@ -377,18 +380,29 @@
         // Long startTime = System.currentTimeMillis();
         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
-        int maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length", -1);
+        // also draw lines between points belonging to different segments
+        boolean forceLines = Main.pref.getBoolean("draw.rawgps.lines.force");   
+        // draw direction arrows on the lines
+        boolean direction = Main.pref.getBoolean("draw.rawgps.direction");   
         // don't draw lines if longer than x meters
-        boolean lines = Main.pref.getBoolean("draw.rawgps.lines");                                // draw line between points, global setting
+        int maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length", -1);        
+        // draw line between points, global setting
+        boolean lines = Main.pref.getBoolean("draw.rawgps.lines");                                
         String linesKey = "draw.rawgps.lines.layer "+name;
+        // draw lines, per-layer setting
         if (Main.pref.hasKey(linesKey))
-            lines = Main.pref.getBoolean(linesKey);                                                 // draw lines, per-layer setting
-        boolean large = Main.pref.getBoolean("draw.rawgps.large");                                // paint large dots for points
-        boolean colored = Main.pref.getBoolean("draw.rawgps.colors");                             // color the lines
-        boolean alternatedirection = Main.pref.getBoolean("draw.rawgps.alternatedirection");      // paint direction arrow with alternate math. may be faster
-        int delta = Main.pref.getInteger("draw.rawgps.min-arrow-distance", 0);
+            lines = Main.pref.getBoolean(linesKey);    
+        // paint large dots for points
+        boolean large = Main.pref.getBoolean("draw.rawgps.large");
+        // color the lines
+        colorModes colored = colorModes.none;
+        try {
+            colored = colorModes.values()[Main.pref.getInteger("draw.rawgps.colors", 0)]; 
+        } catch(Exception e) { }
+        // paint direction arrow with alternate math. may be faster
+        boolean alternatedirection = Main.pref.getBoolean("draw.rawgps.alternatedirection");    
         // don't draw arrows nearer to each other than this
-        int colorTracksTune = Main.pref.getInteger("draw.rawgps.colorTracksTune", 45); // allows to tweak line coloring for different speed levels.
+        int delta = Main.pref.getInteger("draw.rawgps.min-arrow-distance", 0);        
+        // allows to tweak line coloring for different speed levels.
+        int colorTracksTune = Main.pref.getInteger("draw.rawgps.colorTracksTune", 45); 
         /****************************************************************
          ********** STEP 2a - CHECK CACHE VALIDITY **********************
@@ -420,17 +434,32 @@
                             continue;
                         }
+                        trkPnt.customColoring = neutralColor;
                         if (oldWp != null) {
                             double dist = trkPnt.latlon.greatCircleDistance(oldWp.latlon);
-                            double dtime = trkPnt.time - oldWp.time;
-                            double vel = dist/dtime;
-                            double velColor = vel/colorTracksTune*255;
-
-                            if (!colored) {
-                                trkPnt.speedLineColor = neutralColor;
-                            } else if (dtime <= 0 || vel < 0 || velColor > 255) { // attn: bad case first
-                                trkPnt.speedLineColor = colors[255];
-                            } else {
-                                trkPnt.speedLineColor = colors[(int) (velColor)];
+
+                            switch(colored) {
+                                case velocity:
+                                    double dtime = trkPnt.time - oldWp.time;
+                                    double vel = dist/dtime;
+                                    double velColor = vel/colorTracksTune*255;
+                                    // Bad case first
+                                    if (dtime <= 0 || vel < 0 || velColor > 255)
+                                        trkPnt.customColoring = colors[255];
+                                    else
+                                        trkPnt.customColoring = colors[(int) (velColor)];
+                                    break;
+                                
+                                case dilution:
+                                    if(trkPnt.attr.get("hdop") != null) {
+                                        float hdop = ((Float)trkPnt.attr.get("hdop")).floatValue();
+                                        int hdoplvl = Math.round(hdop * 25);
+                                        // 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];
+                                    }
+                                    break;                                
                             }
+
                             if (maxLineLength == -1 || dist <= maxLineLength) {
                                 trkPnt.drawLine = true;
@@ -440,5 +469,4 @@
                             }
                         } else { // make sure we reset outdated data
-                            trkPnt.speedLineColor = colors[255];
                             trkPnt.drawLine = false;
                         }
@@ -464,5 +492,5 @@
                             // skip points that are on the same screenposition
                             if (old != null && ((old.x != screen.x) || (old.y != screen.y))) {
-                                g.setColor(trkPnt.speedLineColor);
+                                g.setColor(trkPnt.customColoring);
                                 g.drawLine(old.x, old.y, screen.x, screen.y);
                             }
@@ -489,5 +517,5 @@
                             // skip points that are on the same screenposition
                             if (old != null && (oldA == null || screen.x < oldA.x-delta || screen.x > oldA.x+delta || screen.y < oldA.y-delta || screen.y > oldA.y+delta)) {
-                                g.setColor(trkPnt.speedLineColor);
+                                g.setColor(trkPnt.customColoring);
                                 double t = Math.atan2(screen.y-old.y, screen.x-old.x) + Math.PI;
                                 g.drawLine(screen.x,screen.y, (int)(screen.x + 10*Math.cos(t-PHI)), (int)(screen.y
@@ -519,5 +547,5 @@
                             // skip points that are on the same screenposition
                             if (old != null && (oldA == null || screen.x < oldA.x-delta || screen.x > oldA.x+delta || screen.y < oldA.y-delta || screen.y > oldA.y+delta)) {
-                                g.setColor(trkPnt.speedLineColor);
+                                g.setColor(trkPnt.customColoring);
                                 g.drawLine(screen.x, screen.y, screen.x + dir[trkPnt.dir][0], screen.y + dir[trkPnt.dir][1]);
                                 g.drawLine(screen.x, screen.y, screen.x + dir[trkPnt.dir][2], screen.y + dir[trkPnt.dir][3]);
@@ -542,5 +570,6 @@
                             continue;
                         Point screen = mv.getPoint(trkPnt.eastNorth);
-                            g.fillRect(screen.x-1, screen.y-1, 3, 3);
+                        g.setColor(trkPnt.customColoring);
+                        g.fillRect(screen.x-1, screen.y-1, 3, 3);
                     } // end for trkpnt
                 } // end for segment
@@ -578,4 +607,5 @@
                             continue;
                         Point screen = mv.getPoint(trkPnt.eastNorth);
+                        g.setColor(trkPnt.customColoring);
                         g.drawRect(screen.x, screen.y, 0, 0);
                     } // end for trkpnt
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(revision 1424)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(revision 1425)
@@ -10,11 +10,15 @@
 
 import javax.swing.BorderFactory;
+import javax.swing.ButtonGroup;
 import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JLabel;
+import javax.swing.JRadioButton;
 import javax.swing.JTextField;
 import javax.swing.JScrollPane;
 import javax.swing.JPanel;
 import javax.swing.Box;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 
 import org.openstreetmap.josm.Main;
@@ -27,6 +31,9 @@
     private JCheckBox forceRawGpsLines = new JCheckBox(tr("Force lines if no segments imported."));
     private JCheckBox largeGpsPoints = new JCheckBox(tr("Draw large GPS points."));
-    private JCheckBox colorTracks = new JCheckBox(tr("Color tracks by velocity."));
-    private JComboBox colorTracksTune = new JComboBox(new String[] {tr("Car"), tr("Bicycle"), tr("Foot")});
+    private ButtonGroup colorGroup;
+    private JRadioButton colorTypeVelocity = new JRadioButton(tr("Velocity (red = slow, green = fast)"));
+    private JRadioButton colorTypeDilution = new JRadioButton(tr("Dilution of Position (red = high, green = low, if available)"));
+    private JRadioButton colorTypeNone = new JRadioButton(tr("Single Color (can be customized for named layers)"));
+    private JComboBox colorTypeVelocityTune = new JComboBox(new String[] {tr("Car"), tr("Bicycle"), tr("Foot")});
     private JCheckBox directionHint = new JCheckBox(tr("Draw Direction Arrows"));
     private JCheckBox drawGpsArrows = new JCheckBox(tr("Draw Direction Arrows"));
@@ -49,11 +56,9 @@
         drawRawGpsLines.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent e) {
-                            forceRawGpsLines.setEnabled(drawRawGpsLines.isSelected());
-                            drawRawGpsMaxLineLength.setEnabled(drawRawGpsLines.isSelected());
-                            drawGpsArrows.setEnabled(drawRawGpsLines.isSelected());
-                            drawGpsArrowsFast.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
-                            drawGpsArrowsMinDist.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
-                            colorTracks.setEnabled(drawRawGpsLines.isSelected());
-                            colorTracksTune.setEnabled(colorTracks.isSelected() && drawRawGpsLines.isSelected());
+                forceRawGpsLines.setEnabled(drawRawGpsLines.isSelected());
+                drawRawGpsMaxLineLength.setEnabled(drawRawGpsLines.isSelected());
+                drawGpsArrows.setEnabled(drawRawGpsLines.isSelected());
+                drawGpsArrowsFast.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
+                drawGpsArrowsMinDist.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
             }
         });
@@ -100,26 +105,50 @@
         panel.add(drawGpsArrowsMinDist, GBC.eol().fill(GBC.HORIZONTAL).insets(5,0,0,5));
 
-        // colorTracks
-        colorTracks.addActionListener(new ActionListener(){
-            public void actionPerformed(ActionEvent e) {
-                            colorTracksTune.setEnabled(colorTracks.isSelected() && drawRawGpsLines.isSelected());
-            }
-        });
-        colorTracks.setSelected(Main.pref.getBoolean("draw.rawgps.colors"));
-        colorTracks.setToolTipText(tr("Choose the hue for the track color by the velocity at that point."));
-        colorTracks.setEnabled(drawRawGpsLines.isSelected());
-        panel.add(colorTracks, GBC.std().insets(40,0,0,0));
-        
-        // color Tracks by Velocity Tune
-        int ccts = Main.pref.getInteger("draw.rawgps.colorTracksTune", 45);
-        colorTracksTune.setSelectedIndex(ccts==10 ? 2 : (ccts==20 ? 1 : 0));
-        colorTracksTune.setToolTipText(tr("Allows to tune the track coloring for different average speeds."));
-        colorTracksTune.setEnabled(colorTracks.isSelected() && colorTracks.isEnabled());
-        panel.add(colorTracksTune, GBC.eop().insets(5,0,0,5));
-        
         // largeGpsPoints
         largeGpsPoints.setSelected(Main.pref.getBoolean("draw.rawgps.large"));
         largeGpsPoints.setToolTipText(tr("Draw larger dots for the GPS points."));
         panel.add(largeGpsPoints, GBC.eop().insets(20,0,0,0));
+
+        // colorTracks
+        colorGroup = new ButtonGroup();
+        colorGroup.add(colorTypeNone);
+        colorGroup.add(colorTypeVelocity);
+        colorGroup.add(colorTypeDilution);
+
+        colorTypeVelocity.addChangeListener(new ChangeListener(){
+            public void stateChanged(ChangeEvent e) {
+                colorTypeVelocityTune.setEnabled(colorTypeVelocity.isSelected());
+            }
+        });
+
+        switch(Main.pref.getInteger("draw.rawgps.colors", 0)) {
+            case 0:
+                colorTypeNone.setSelected(true);
+                break;
+            case 1:
+                colorTypeVelocity.setSelected(true);
+                break;
+            case 2:
+                colorTypeDilution.setSelected(true);
+                break;
+        }
+
+        colorTypeNone.setToolTipText(tr("All points and track segments will have the same color. Can be customized in Layer Manager."));
+        colorTypeVelocity.setToolTipText(tr("Colors points and track segments by velocity."));
+        colorTypeDilution.setToolTipText(tr("Colors points and track segments by dilution of position (HDOP). Your capture device needs to logs that information."));
+
+        // color Tracks by Velocity Tune
+        int ccts = Main.pref.getInteger("draw.rawgps.colorTracksTune", 45);
+        colorTypeVelocityTune.setSelectedIndex(ccts==10 ? 2 : (ccts==20 ? 1 : 0));
+        colorTypeVelocityTune.setToolTipText(tr("Allows to tune the track coloring for different average speeds."));
+        colorTypeVelocityTune.setEnabled(colorTypeVelocity.isSelected() && colorTypeVelocity.isEnabled());
+
+        panel.add(Box.createVerticalGlue(), GBC.eol().insets(0, 20, 0, 0));
+
+        panel.add(new JLabel(tr("Track and Point Coloring")), GBC.eol().insets(20,0,0,0));
+        panel.add(colorTypeNone, GBC.eol().insets(40,0,0,0));
+        panel.add(colorTypeVelocity, GBC.std().insets(40,0,0,0));
+        panel.add(colorTypeVelocityTune, GBC.eop().insets(5,0,0,5));
+        panel.add(colorTypeDilution, GBC.eol().insets(40,0,0,0));
 
         panel.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
@@ -198,6 +227,11 @@
         Main.pref.put("draw.rawgps.alternatedirection", drawGpsArrowsFast.isSelected());
         Main.pref.put("draw.rawgps.min-arrow-distance", drawGpsArrowsMinDist.getText());
-        Main.pref.put("draw.rawgps.colors", colorTracks.isSelected());
-        int ccti=colorTracksTune.getSelectedIndex();
+        if(colorTypeVelocity.isSelected())
+            Main.pref.putInteger("draw.rawgps.colors", 1);
+        else if(colorTypeDilution.isSelected())
+            Main.pref.putInteger("draw.rawgps.colors", 2);
+        else
+            Main.pref.putInteger("draw.rawgps.colors", 0);
+        int ccti=colorTypeVelocityTune.getSelectedIndex();
         Main.pref.putInteger("draw.rawgps.colorTracksTune", ccti==2 ? 10 : (ccti==1 ? 20 : 45));
         Main.pref.put("draw.rawgps.large", largeGpsPoints.isSelected());
Index: /trunk/src/org/openstreetmap/josm/io/GpxReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/GpxReader.java	(revision 1424)
+++ /trunk/src/org/openstreetmap/josm/io/GpxReader.java	(revision 1425)
@@ -224,8 +224,15 @@
                 break;
             case wpt:
-                if (qName.equals("ele") || qName.equals("magvar")
-                        || qName.equals("geoidheight") || qName.equals("name")
-                        || qName.equals("sym") || qName.equals("type")) {
+                if (   qName.equals("ele")  || qName.equals("magvar")
+                    || qName.equals("name") || qName.equals("geoidheight")
+                    || qName.equals("type") || qName.equals("sym")) {
                     currentWayPoint.attr.put(qName, accumulator.toString());
+                } else if(qName.equals("hdop") /*|| qName.equals("vdop") ||
+                        qName.equals("pdop")*/) {
+                    try {
+                        currentWayPoint.attr.put(qName, Float.parseFloat(accumulator.toString()));
+                    } catch(Exception e) {
+                        currentWayPoint.attr.put(qName, new Float(0));
+                    }
                 } else if (qName.equals("time")) {
                     currentWayPoint.attr.put(qName, accumulator.toString());
Index: /trunk/src/org/openstreetmap/josm/io/NmeaReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/NmeaReader.java	(revision 1424)
+++ /trunk/src/org/openstreetmap/josm/io/NmeaReader.java	(revision 1425)
@@ -309,8 +309,6 @@
                 // h-dilution
                 accu=e[GPGGA.HDOP.position];
-                if(!accu.equals("")) {
-                    Double.parseDouble(accu);
-                    currentwp.attr.put("hdop", accu);
-                }
+                if(!accu.equals(""))
+                    currentwp.attr.put("hdop", Float.parseFloat(accu));
                 // fix
                 accu=e[GPGGA.QUALITY.position];
@@ -356,20 +354,14 @@
                 // vdop
                 accu=e[GPGSA.VDOP.position];
-                if(!accu.equals("")) {
-                    Double.parseDouble(accu);
-                    currentwp.attr.put("vdop", accu);
-                }
+                if(!accu.equals(""))
+                    currentwp.attr.put("vdop", Float.parseFloat(accu));
                 // hdop
                 accu=e[GPGSA.HDOP.position];
-                if(!accu.equals("")) {
-                    Double.parseDouble(accu);
-                    currentwp.attr.put("hdop", accu);
-                }
+                if(!accu.equals(""))
+                    currentwp.attr.put("hdop", Float.parseFloat(accu));
                 // pdop
                 accu=e[GPGSA.PDOP.position];
-                if(!accu.equals("")) {
-                    Double.parseDouble(accu);
-                    currentwp.attr.put("pdop", accu);
-                }
+                if(!accu.equals(""))
+                    currentwp.attr.put("pdop", Float.parseFloat(accu));
             }
             else if(e[0].equals("$GPRMC")) {
Index: /trunk/src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 1424)
+++ /trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 1425)
@@ -478,5 +478,5 @@
       * @param ref The dataset that is search in for references first. If
       *      the Reference is not found here, Main.ds is searched and a copy of the
-      *  elemet found there is returned.
+      *  element found there is returned.
       */
      public static DataSet parseDataSet(InputStream source, DataSet ref, PleaseWaitDialog pleaseWaitDlg) throws SAXException, IOException {
