Index: src/org/openstreetmap/josm/data/gpx/WayPoint.java
===================================================================
--- src/org/openstreetmap/josm/data/gpx/WayPoint.java	(revision 1413)
+++ src/org/openstreetmap/josm/data/gpx/WayPoint.java	(working copy)
@@ -17,7 +17,7 @@
     public final LatLon latlon;
     public final EastNorth eastNorth;
     public double time;
-    public Color speedLineColor;
+    public Color customColoring;
     public boolean drawLine;
     public int dir;
 
Index: src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 1413)
+++ src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(working copy)
@@ -85,7 +85,7 @@
     private boolean computeCacheInSync;
     private int computeCacheMaxLineLengthUsed;
     private Color computeCacheColorUsed;
-    private boolean computeCacheColored;
+    private colorModes computeCacheColored;
     private int computeCacheColorTracksTune;
 
     public GpxLayer(GpxData d) {
@@ -368,7 +368,10 @@
         {-ll0,+sl4,-sl4,+ll0},
         {-ll0,-sl9,-ll0,+sl9}
     };
-
+    
+    // the different color modes
+    enum colorModes { none, velocity, dilution }
+    
     @Override public void paint(Graphics g, MapView mv) {
 
         /****************************************************************
@@ -376,20 +379,31 @@
          ****************************************************************/
         // 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 **********************
          ****************************************************************/
@@ -419,19 +433,34 @@
                         if (Double.isNaN(trkPnt.latlon.lat()) || Double.isNaN(trkPnt.latlon.lon())) {
                             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;
                                 trkPnt.dir = (int)(Math.atan2(-trkPnt.eastNorth.north()+oldWp.eastNorth.north(), trkPnt.eastNorth.east()-oldWp.eastNorth.east()) / Math.PI * 4 + 3.5); // crude but works
@@ -439,7 +468,6 @@
                                 trkPnt.drawLine = false;
                             }
                         } else { // make sure we reset outdated data
-                            trkPnt.speedLineColor = colors[255];
                             trkPnt.drawLine = false;
                         }
                         oldWp = trkPnt;
@@ -463,7 +491,7 @@
                         if (trkPnt.drawLine) {
                             // 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);
                             }
                         }
@@ -488,7 +516,7 @@
                             Point screen = mv.getPoint(trkPnt.eastNorth);
                             // 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
                                 + 10*Math.sin(t-PHI)));
@@ -518,7 +546,7 @@
                             Point screen = mv.getPoint(trkPnt.eastNorth);
                             // 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]);
                                 oldA = screen;
@@ -541,7 +569,8 @@
                         if (Double.isNaN(trkPnt.latlon.lat()) || Double.isNaN(trkPnt.latlon.lon()))
                             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
             } // end for trk
@@ -577,6 +606,7 @@
                         if (Double.isNaN(trkPnt.latlon.lat()) || Double.isNaN(trkPnt.latlon.lon()))
                             continue;
                         Point screen = mv.getPoint(trkPnt.eastNorth);
+                        g.setColor(trkPnt.customColoring);
                         g.drawRect(screen.x, screen.y, 0, 0);
                     } // end for trkpnt
                 } // end for segment
Index: src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(revision 1413)
+++ src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(working copy)
@@ -9,13 +9,17 @@
 import java.awt.GridBagLayout;
 
 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;
 import org.openstreetmap.josm.tools.GBC;
@@ -26,8 +30,11 @@
     private JTextField drawRawGpsMaxLineLength = new JTextField(8);
     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 (red = high, green = low, if available)"));
+    private JRadioButton colorTypeNone = new JRadioButton(tr("Single Color (can be customized in Layer Manager)"));
+    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"));
     private JCheckBox drawGpsArrowsFast = new JCheckBox(tr("Fast drawing (looks uglier)"));
@@ -48,13 +55,11 @@
         // drawRawGpsLines
         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());
             }
         });
         drawRawGpsLines.setSelected(Main.pref.getBoolean("draw.rawgps.lines"));
@@ -98,30 +103,54 @@
         drawGpsArrowsMinDist.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
         panel.add(new JLabel(tr("Minimum distance (pixels)")), GBC.std().insets(60,0,0,0));
         panel.add(drawGpsArrowsMinDist, GBC.eol().fill(GBC.HORIZONTAL).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
-        colorTracks.addActionListener(new ActionListener(){
-            public void actionPerformed(ActionEvent e) {
-                            colorTracksTune.setEnabled(colorTracks.isSelected() && drawRawGpsLines.isSelected());
+        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());
             }
         });
-        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));
         
+        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. Your capture device needs to logs that information."));
+
         // 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));
+        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());
         
-        // 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));
-
+        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));
         JScrollPane scrollpane = new JScrollPane(panel);
         scrollpane.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
@@ -196,9 +225,14 @@
         Main.pref.put("draw.rawgps.lines.force", forceRawGpsLines.isSelected());
         Main.pref.put("draw.rawgps.direction", drawGpsArrows.isSelected());
         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();
+        Main.pref.put("draw.rawgps.min-arrow-distance", drawGpsArrowsMinDist.getText());        
+        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());
         Main.pref.put("draw.segment.direction", directionHint.isSelected());
Index: src/org/openstreetmap/josm/io/GpxReader.java
===================================================================
--- src/org/openstreetmap/josm/io/GpxReader.java	(revision 1413)
+++ src/org/openstreetmap/josm/io/GpxReader.java	(working copy)
@@ -223,10 +223,17 @@
                 }
                 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());
                     currentWayPoint.setTime();
Index: src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmReader.java	(revision 1413)
+++ src/org/openstreetmap/josm/io/OsmReader.java	(working copy)
@@ -479,7 +479,7 @@
       * Parse the given input source and return the dataset.
       * @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 {
           return parseDataSetOsm(source, ref, pleaseWaitDlg).ds;
