Index: trunk/src/org/openstreetmap/josm/data/gpx/GpxConstants.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/gpx/GpxConstants.java	(revision 18395)
+++ trunk/src/org/openstreetmap/josm/data/gpx/GpxConstants.java	(revision 18396)
@@ -4,5 +4,4 @@
 import java.awt.Color;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -253,5 +252,5 @@
      * Possible fix values. NMEA 0183 Version 4.00
      */
-    Collection<String> FIX_VALUES = Collections.unmodifiableList(
+    List<String> FIX_VALUES = Collections.unmodifiableList(
             Arrays.asList("none", "2d", "3d", "dgps", "pps", "rtk", "float rtk", "estimated", "manual", "simulated"));
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java	(revision 18395)
+++ trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java	(revision 18396)
@@ -133,4 +133,5 @@
     private ColorScale hdopScale;
     private ColorScale qualityScale;
+    private ColorScale fixScale;
     private ColorScale dateScale;
     private ColorScale directionScale;
@@ -191,4 +192,42 @@
     };
 
+    private static final String[] rtkLibQualityNames = {
+            tr("1 - Fixed"),
+            tr("2 - Float"),
+            tr("3 - Reserved"),
+            tr("4 - DGPS"),
+            tr("5 - Single"),
+            tr("6 - PPP")
+    };
+
+    /**
+     *  @see GpxConstants#FIX_VALUES
+     */
+    private static final Color[] gpsFixQualityColors = {
+            Color.MAGENTA, //None
+            new Color(255, 125, 0), //2D (orange-red)
+            Color.ORANGE, //3D
+            Color.CYAN, //DGPS
+            new Color(150, 255, 150), //PPS (light-green)
+            Color.GREEN, //RTK
+            Color.YELLOW, //Float RTK
+            Color.RED, //Estimated
+            Color.BLUE, //Manual
+            Color.GRAY //Simulated
+    };
+
+    private static final String[] gpsFixQualityNames = {
+            tr("None"),
+            tr("2D"),
+            tr("3D"),
+            tr("DGPS"),
+            tr("PPS"),
+            tr("RTK"),
+            tr("Float RTK"),
+            tr("Estimated"),
+            tr("Manual"),
+            tr("Simulated")
+    };
+
     // user defined heatmap color
     private Color[] heatMapLutColor = createColorLut(0, Color.BLACK, Color.WHITE);
@@ -202,5 +241,6 @@
         /** Colors (without custom alpha channel, if given) for HDOP painting. **/
         hdopScale = ColorScale.createHSBScale(256).makeReversed().addTitle(tr("HDOP"));
-        qualityScale = ColorScale.createFixedScale(rtkLibQualityColors).addTitle(tr("Quality"));
+        qualityScale = ColorScale.createFixedScale(rtkLibQualityColors).addTitle(tr("Quality")).addColorBarTitles(rtkLibQualityNames);
+        fixScale = ColorScale.createFixedScale(gpsFixQualityColors).addTitle(tr("GPS fix")).addColorBarTitles(gpsFixQualityNames);
         dateScale = ColorScale.createHSBScale(256).addTitle(tr("Time"));
         directionScale = ColorScale.createCyclicScale(256).setIntervalCount(4).addTitle(tr("Direction"));
@@ -247,5 +287,9 @@
          * Color by quality (RTKLib)
          */
-        QUALITY;
+        QUALITY,
+        /**
+         * Color by GPS fix
+         */
+        FIX;
 
         static ColorMode fromIndex(final int index) {
@@ -348,4 +392,5 @@
         hdopScale.setNoDataColor(neutralColor);
         qualityScale.setNoDataColor(neutralColor);
+        fixScale.setNoDataColor(neutralColor);
         directionScale.setNoDataColor(neutralColor);
 
@@ -563,4 +608,5 @@
             hdopScale.setRange(0, hdoprange);
             qualityScale.setRange(1, rtkLibQualityColors.length);
+            fixScale.setRange(0, gpsFixQualityColors.length);
         }
         double now = System.currentTimeMillis()/1000.0;
@@ -590,4 +636,12 @@
                 } else if (colored == ColorMode.QUALITY) {
                     color = qualityScale.getColor((Integer) trkPnt.get(GpxConstants.RTKLIB_Q));
+                } else if (colored == ColorMode.FIX) {
+                    Object fixval = trkPnt.get(GpxConstants.PT_FIX);
+                    if (fixval != null) {
+                        int fix = GpxConstants.FIX_VALUES.indexOf(fixval);
+                        if (fix >= 0) {
+                            color = fixScale.getColor(fix);
+                        }
+                    }
                 }
                 if (oldWp != null) { // other coloring modes need segment for calcuation
@@ -1517,4 +1571,6 @@
         } else if (colored == ColorMode.QUALITY) {
             qualityScale.drawColorBar(g, w-30, 50, 20, 100, 1.0);
+        } else if (colored == ColorMode.FIX) {
+            fixScale.drawColorBar(g, w-30, 50, 20, 175, 1.0);
         } else if (colored == ColorMode.VELOCITY) {
             SystemOfMeasurement som = SystemOfMeasurement.getSystemOfMeasurement();
Index: trunk/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java	(revision 18395)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java	(revision 18396)
@@ -71,4 +71,5 @@
     private final JRadioButton colorTypeDilution = new JRadioButton(tr("Dilution of Position (red = high, green = low, if available)"));
     private final JRadioButton colorTypeQuality = new JRadioButton(tr("Quality (RTKLib only, if available)"));
+    private final JRadioButton colorTypeFix = new JRadioButton(tr("GPS fix value"));
     private final JRadioButton colorTypeTime = new JRadioButton(tr("Track date"));
     private final JRadioButton colorTypeHeatMap = new JRadioButton(tr("Heat Map (dark = few, bright = many)"));
@@ -453,4 +454,5 @@
         colorGroup.add(colorTypeDilution);
         colorGroup.add(colorTypeQuality);
+        colorGroup.add(colorTypeFix);
         colorGroup.add(colorTypeTime);
         colorGroup.add(colorTypeHeatMap);
@@ -463,4 +465,5 @@
         colorTypeQuality.setToolTipText(
                 tr("Colors points and track segments by RTKLib quality flag (Q). Your capture device needs to log that information."));
+        colorTypeFix.setToolTipText(tr("Colors points and track segments by GPS fix value."));
         colorTypeTime.setToolTipText(tr("Colors points and track segments by its timestamp."));
         colorTypeHeatMap.setToolTipText(tr("Collected points and track segments for a position and displayed as heat map."));
@@ -484,4 +487,5 @@
         add(colorTypeDilution, GBC.eol().insets(40, 0, 0, 0));
         add(colorTypeQuality, GBC.eol().insets(40, 0, 0, 0));
+        add(colorTypeFix, GBC.eol().insets(40, 0, 0, 0));
         add(colorTypeTime, GBC.eol().insets(40, 0, 0, 0));
         add(colorTypeHeatMap, GBC.std().insets(40, 0, 0, 0));
@@ -637,4 +641,5 @@
             case 5: colorTypeHeatMap.setSelected(true); break;
             case 6: colorTypeQuality.setSelected(true); break;
+            case 7: colorTypeFix.setSelected(true); break;
             default: Logging.warn("Unknown color type: " + colorType);
             }
@@ -713,4 +718,6 @@
         } else if (colorTypeQuality.isSelected()) {
             putPref("colormode", 6);
+        } else if (colorTypeFix.isSelected()) {
+            putPref("colormode", 7);
         } else {
             putPref("colormode", 0);
Index: trunk/src/org/openstreetmap/josm/io/GpxReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/GpxReader.java	(revision 18395)
+++ trunk/src/org/openstreetmap/josm/io/GpxReader.java	(revision 18396)
@@ -465,4 +465,5 @@
                 case "cmt":
                 case "desc":
+                case "fix":
                     currentWayPoint.put(localName, accumulator.toString());
                     break;
Index: trunk/src/org/openstreetmap/josm/tools/ColorScale.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/ColorScale.java	(revision 18395)
+++ trunk/src/org/openstreetmap/josm/tools/ColorScale.java	(revision 18396)
@@ -5,4 +5,5 @@
 import java.awt.FontMetrics;
 import java.awt.Graphics2D;
+import java.util.Arrays;
 
 /**
@@ -17,4 +18,5 @@
 
     private Color[] colors;
+    private String[] colorBarTitles;
     private String title = "";
     private int intervalCount = 5;
@@ -184,4 +186,16 @@
 
     /**
+     * Adds titles to the color bar for a fixed scale
+     * @param titles Array of String, same length as the colors array
+     * @return This scale, for chaining
+     * @since 18396
+     */
+    public ColorScale addColorBarTitles(String[] titles) {
+        this.intervalCount = titles.length - 1;
+        this.colorBarTitles = titles;
+        return this;
+    }
+
+    /**
      * Sets the interval count for this scale
      * @param intervalCount The interval count hint
@@ -235,6 +249,11 @@
         FontMetrics fm = g.getFontMetrics();
         fh = fm.getHeight()/2;
-        fw = fm.stringWidth(String.valueOf(Math.max((int) Math.abs(max*valueScale),
-                (int) Math.abs(min*valueScale)))) + fm.stringWidth("0.123");
+        if (colorBarTitles != null && colorBarTitles.length > 0) {
+             fw = Arrays.asList(colorBarTitles).stream().mapToInt(title -> fm.stringWidth(title)).max().orElse(50);
+        } else {
+            fw = fm.stringWidth(
+                    String.valueOf(Math.max((int) Math.abs(max * valueScale), (int) Math.abs(min * valueScale))))
+                    + fm.stringWidth("0.123");
+        }
         g.setColor(noDataColor);
         if (title != null) {
@@ -243,6 +262,11 @@
         for (int i = 0; i <= intervalCount; i++) {
             g.setColor(colors[(int) (1.0*i*n/intervalCount-1e-10)]);
-            final double val = min+i*(max-min)/intervalCount;
-            final String txt = String.format("%.3f", val*valueScale);
+            String txt;
+            if (colorBarTitles != null && i < colorBarTitles.length) {
+                txt = colorBarTitles[i];
+            } else {
+                final double val = min+i*(max-min)/intervalCount;
+                txt = String.format("%.3f", val*valueScale);
+            }
             if (w < h) {
                 g.drawString(txt, x-fw-3, y+i*h/intervalCount+fh/2);
