Index: org/openstreetmap/josm/gui/layer/CustomizeColor.java
===================================================================
--- org/openstreetmap/josm/gui/layer/CustomizeColor.java	(revision 4261)
+++ org/openstreetmap/josm/gui/layer/CustomizeColor.java	(working copy)
@@ -62,7 +62,8 @@
 
     @Override
     public void actionPerformed(ActionEvent e) {
-        JColorChooser c = new JColorChooser(layers.get(0).getColor(false));
+        Color cl=layers.get(0).getColor(false); if (cl==null) cl=Color.gray;
+        JColorChooser c = new JColorChooser(cl);
         Object[] options = new Object[]{tr("OK"), tr("Cancel"), tr("Default")};
         int answer = JOptionPane.showOptionDialog(
                 Main.parent,
Index: org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 4261)
+++ org/openstreetmap/josm/gui/layer/GpxLayer.java	(working copy)
@@ -25,14 +25,18 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.Future;
 
 import javax.swing.AbstractAction;
 import javax.swing.Action;
 import javax.swing.Box;
 import javax.swing.ButtonGroup;
+import javax.swing.ButtonModel;
 import javax.swing.Icon;
 import javax.swing.JFileChooser;
 import javax.swing.JLabel;
@@ -69,6 +73,7 @@
 import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
 import org.openstreetmap.josm.gui.layer.markerlayer.AudioMarker;
 import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
+import org.openstreetmap.josm.gui.preferences.GPXSettingsPanel;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
 import org.openstreetmap.josm.gui.widgets.HtmlPanel;
@@ -229,7 +234,8 @@
 
     public colorModes getColorMode() {
         try {
-            return colorModes.values()[Main.pref.getInteger("draw.rawgps.colors", "layer "+getName(), 0)];
+            int i=Main.pref.getInteger("draw.rawgps.colors", "layer " + getName(), 0);
+            return colorModes.values()[i];
         } catch (Exception e) {
         }
         return colorModes.none;
@@ -248,7 +254,7 @@
                 LayerListDialog.getInstance().createDeleteLayerAction(),
                 SeparatorLayerAction.INSTANCE,
                 new CustomizeColor(this),
-                new CustomizeLineDrawing(this),
+                new CustomizeDrawing(this),
                 new ConvertToDataLayerAction(),
                 SeparatorLayerAction.INSTANCE,
                 new RenameLayerAction(getAssociatedFile(), this),
@@ -261,7 +267,7 @@
                 new LayerSaveAction(this),
                 new LayerSaveAsAction(this),
                 new CustomizeColor(this),
-                new CustomizeLineDrawing(this),
+                new CustomizeDrawing(this),
                 new ImportImages(),
                 new ImportAudio(),
                 new MarkersFromNamedPoins(),
@@ -375,7 +381,7 @@
 
     // the different color modes
     enum colorModes {
-        none, velocity, dilution, direction
+        none, velocity, dilution, direction, time
     }
 
     @Override
@@ -393,35 +399,37 @@
          ****************************************************************/
         // Long startTime = System.currentTimeMillis();
         Color neutralColor = getColor(true);
+        String spec="layer "+getName();
+
         // also draw lines between points belonging to different segments
-        boolean forceLines = Main.pref.getBoolean("draw.rawgps.lines.force", "layer "+getName(), false);
+        boolean forceLines = Main.pref.getBoolean("draw.rawgps.lines.force", spec, false);
         // draw direction arrows on the lines
-        boolean direction = Main.pref.getBoolean("draw.rawgps.direction", "layer "+getName(), false);
+        boolean direction = Main.pref.getBoolean("draw.rawgps.direction", spec, false);
         // don't draw lines if longer than x meters
-        int lineWidth = Main.pref.getInteger("draw.rawgps.linewidth", "layer "+getName(), 0);
+        int lineWidth = Main.pref.getInteger("draw.rawgps.linewidth", spec, 0);
 
         int maxLineLength;
         boolean lines;
         if (this.isLocalFile) {
-            maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length.local", "layer "+getName(), -1);
-            lines = Main.pref.getBoolean("draw.rawgps.lines.local", "layer "+getName(), true);
+            maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length.local", spec, -1);
+            lines = Main.pref.getBoolean("draw.rawgps.lines.local", spec, true);
         } else {
-            maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length", "layer "+getName(), 200);
-            lines = Main.pref.getBoolean("draw.rawgps.lines", "layer "+getName(), true);
+            maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length", spec, 200);
+            lines = Main.pref.getBoolean("draw.rawgps.lines", spec, true);
         }
         // paint large dots for points
-        boolean large = Main.pref.getBoolean("draw.rawgps.large", "layer "+getName(), false);
-        int largesize = Main.pref.getInteger("draw.rawgps.large.size", "layer "+getName(), 3);
-        boolean hdopcircle = Main.pref.getBoolean("draw.rawgps.hdopcircle", "layer "+getName(), false);
+        boolean large = Main.pref.getBoolean("draw.rawgps.large", spec, false);
+        int largesize = Main.pref.getInteger("draw.rawgps.large.size", spec, 3);
+        boolean hdopcircle = Main.pref.getBoolean("draw.rawgps.hdopcircle", spec, false);
         // color the lines
         colorModes colored = getColorMode();
         // paint direction arrow with alternate math. may be faster
-        boolean alternatedirection = Main.pref.getBoolean("draw.rawgps.alternatedirection", "layer "+getName(), false);
+        boolean alternatedirection = Main.pref.getBoolean("draw.rawgps.alternatedirection", spec, false);
         // don't draw arrows nearer to each other than this
-        int delta = Main.pref.getInteger("draw.rawgps.min-arrow-distance", "layer "+getName(), 40);
+        int delta = Main.pref.getInteger("draw.rawgps.min-arrow-distance", spec, 40);
         // allows to tweak line coloring for different speed levels.
-        int colorTracksTune = Main.pref.getInteger("draw.rawgps.colorTracksTune", "layer "+getName(), 45);
-        boolean colorModeDynamic = Main.pref.getBoolean("draw.rawgps.colors.dynamic", "layer "+getName(), false);
+        int colorTracksTune = Main.pref.getInteger("draw.rawgps.colorTracksTune", spec, 45);
+        boolean colorModeDynamic = Main.pref.getBoolean("draw.rawgps.colors.dynamic", spec, false);
         int hdopfactor = Main.pref.getInteger("hdop.factor", 25);
 
         if(lineWidth != 0)
@@ -447,8 +455,8 @@
          ********** STEP 2b - RE-COMPUTE CACHE DATA *********************
          ****************************************************************/
         if (!computeCacheInSync) { // don't compute if the cache is good
-            Float minval = null;
-            Float maxval = null;
+            double minval = +1e10;
+            double maxval = -1e10;
             WayPoint oldWp = null;
             if (colorModeDynamic) {
                 if (colored == colorModes.velocity) {
@@ -461,9 +469,10 @@
                                     continue;
                                 }
                                 if (oldWp != null && trkPnt.time > oldWp.time) {
-                                    Float vel = new Float(c.greatCircleDistance(oldWp.getCoor()) / (trkPnt.time - oldWp.time));
-                                    if(maxval == null || vel > maxval) maxval = vel;
-                                    if(minval == null || vel < minval) minval = vel;
+                                    double vel = c.greatCircleDistance(oldWp.getCoor())
+                                            / (trkPnt.time - oldWp.time);
+                                    if(vel > maxval) maxval = vel;
+                                    if(vel < minval) minval = vel;
                                 }
                                 oldWp = trkPnt;
                             }
@@ -475,9 +484,9 @@
                             for (WayPoint trkPnt : segment.getWayPoints()) {
                                 Object val = trkPnt.attr.get("hdop");
                                 if (val != null) {
-                                    Float hdop = (Float) val;
-                                    if(maxval == null || hdop > maxval) maxval = hdop;
-                                    if(minval == null || hdop < minval) minval = hdop;
+                                    double hdop = ((Float) val).doubleValue();
+                                    if(hdop > maxval) maxval = hdop;
+                                    if(hdop < minval) minval = hdop;
                                 }
                             }
                         }
@@ -485,6 +494,19 @@
                 }
                 oldWp = null;
             }
+            if (colored == colorModes.time) {
+                    for (GpxTrack trk : data.tracks) {
+                        for (GpxTrackSegment segment : trk.getSegments()) {
+                            for (WayPoint trkPnt : segment.getWayPoints()) {
+                               double t=trkPnt.time;
+                               if (t==0) continue; // skip non-dated trackpoints
+                               if(t > maxval) maxval = t;
+                               if(t < minval) minval = t;
+                            }
+                        }
+                    }
+                }
+            
             for (GpxTrack trk : data.tracks) {
                 for (GpxTrackSegment segment : trk.getSegments()) {
                     if (!forceLines) { // don't draw lines between segments, unless forced to
@@ -498,7 +520,7 @@
                         trkPnt.customColoring = neutralColor;
                         if(colored == colorModes.dilution && trkPnt.attr.get("hdop") != null) {
                             float hdop = ((Float) trkPnt.attr.get("hdop")).floatValue();
-                            int hdoplvl = Math.round(colorModeDynamic ? ((hdop-minval)*255/(maxval-minval))
+                            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
@@ -507,13 +529,13 @@
                         }
                         if (oldWp != null) {
                             double dist = c.greatCircleDistance(oldWp.getCoor());
-
+                            boolean noDraw=false;
                             switch (colored) {
                             case velocity:
                                 double dtime = trkPnt.time - oldWp.time;
                                 if(dtime > 0) {
                                     float vel = (float) (dist / dtime);
-                                    int velColor = Math.round(colorModeDynamic ? ((vel-minval)*255/(maxval-minval))
+                                    int velColor =(int) Math.round(colorModeDynamic ? ((vel-minval)*255/(maxval-minval))
                                     : (vel <= 0 ? 0 : vel / colorTracksTune * 255));
                                     trkPnt.customColoring = colors[velColor > 255 ? 255 : velColor];
                                 } else {
@@ -529,9 +551,17 @@
                                     trkPnt.customColoring = colors_cyclic[(int) (dirColor)];
                                 }
                                 break;
+                            case time:
+                                if (trkPnt.time>0){
+                                    int tColor = (int) Math.round((trkPnt.time-minval)*255/(maxval-minval));
+                                    trkPnt.customColoring = colors[tColor];
+                                } else {
+                                    trkPnt.customColoring = neutralColor;
+                                }
+                                break;
                             }
-
-                            if (maxLineLength == -1 || dist <= maxLineLength) {
+                            
+                            if (!noDraw && (maxLineLength == -1 || dist <= maxLineLength)) {
                                 trkPnt.drawLine = true;
                                 trkPnt.dir = (int) oldWp.getCoor().heading(trkPnt.getCoor());
                             } else {
@@ -1337,22 +1367,22 @@
         return best;
     }
 
-    private class CustomizeLineDrawing extends AbstractAction implements LayerAction, MultiLayerAction {
+    private class CustomizeDrawing extends AbstractAction implements LayerAction, MultiLayerAction {
         List<Layer> layers;
 
-        public CustomizeLineDrawing(List<Layer> l) {
+        public CustomizeDrawing(List<Layer> l) {
             this();
             layers = l;
         }
 
-        public CustomizeLineDrawing(Layer l) {
+        public CustomizeDrawing(Layer l) {
             this();
             layers = new LinkedList<Layer>();
             layers.add(l); 
         }
 
-        private CustomizeLineDrawing() {
-            super(tr("Customize line drawing"), ImageProvider.get("mapmode/addsegment"));
+        private CustomizeDrawing() {
+            super(tr("Customize track drawing"), ImageProvider.get("mapmode/addsegment"));
         }
 
         @Override
@@ -1371,53 +1401,24 @@
 
         @Override
         public Action getMultiLayerAction(List<Layer> layers) {
-            return new CustomizeLineDrawing(layers);
+            return new CustomizeDrawing(layers);
         }
 
         @Override
         public void actionPerformed(ActionEvent e) {
-            /* FIXME: Add all the other GPX settings here as well. Unify with DrawingPreferences
-               Each option should be able to "use global settings". Attention with the handling
-               of local layer for the two local layer options! */
-            JRadioButton[] r = new JRadioButton[3];
-            r[0] = new JRadioButton(tr("Use global settings."));
-            r[1] = new JRadioButton(tr("Draw lines between points for this layer."));
-            r[2] = new JRadioButton(tr("Do not draw lines between points for this layer."));
-            ButtonGroup group = new ButtonGroup();
-            Box panel = Box.createVerticalBox();
-            for (JRadioButton b : r) {
-                group.add(b);
-                panel.add(b);
-            }
-            String propbase = isLocalFile ? "draw.rawgps.lines.local" : "draw.rawgps.lines";
-            String propName = propbase + ".layer " + layers.get(0).getName();
-            if (Main.pref.hasKey(propName)) {
-                group.setSelected(r[Main.pref.getBoolean(propName) ? 1 : 2].getModel(), true);
-            } else {
-                group.setSelected(r[0].getModel(), true);
-            }
+            GPXSettingsPanel panel=new GPXSettingsPanel(getName());
             int answer = JOptionPane.showConfirmDialog(Main.parent, panel,
-                    tr("Select line drawing options"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
-            switch (answer) {
-            case JOptionPane.CANCEL_OPTION:
-            case JOptionPane.CLOSED_OPTION:
-                return;
-            default:
-                // continue
-            }
+                    tr("Customize track drawing"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
+            if (answer == JOptionPane.CANCEL_OPTION || answer == JOptionPane.CLOSED_OPTION) return;
             for(Layer layer : layers) {
-                propName = propbase + ".layer " + layer.getName();
-                if (group.getSelection() == r[0].getModel()) {
-                    Main.pref.put(propName, null);
-                } else {
-                    Main.pref.put(propName, group.getSelection() == r[1].getModel());
-                }
+                // save preferences for all layers
+                panel.savePreferences(layer.getName());
             }
             Main.map.repaint();
         }
     }
 
-    private class MarkersFromNamedPoins extends AbstractAction {
+      private class MarkersFromNamedPoins extends AbstractAction {
 
         public MarkersFromNamedPoins() {
             super(tr("Markers From Named Points"), ImageProvider.get("addmarkers"));
Index: org/openstreetmap/josm/gui/preferences/GPXSettingsPanel.java
===================================================================
--- org/openstreetmap/josm/gui/preferences/GPXSettingsPanel.java	(revision 0)
+++ org/openstreetmap/josm/gui/preferences/GPXSettingsPanel.java	(revision 0)
@@ -0,0 +1,313 @@
+package org.openstreetmap.josm.gui.preferences;
+
+import javax.swing.AbstractButton;
+import javax.swing.Box;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.event.ActionEvent;
+import javax.swing.JLabel;
+import javax.swing.BorderFactory;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.tools.GBC;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionListener;
+import javax.swing.ButtonGroup;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JTextField;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trc;
+
+public class GPXSettingsPanel extends JPanel {
+    private JRadioButton drawRawGpsLinesGlobal = new JRadioButton(tr("Use global settings."));
+    private JRadioButton drawRawGpsLinesAll = new JRadioButton(tr("All"));
+    private JRadioButton drawRawGpsLinesLocal = new JRadioButton(tr("Local files"));
+    private JRadioButton drawRawGpsLinesNone = new JRadioButton(tr("None"));
+    private ActionListener drawRawGpsLinesActionListener;
+    private JTextField drawRawGpsMaxLineLength = new JTextField(8);
+    private JTextField drawRawGpsMaxLineLengthLocal = 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 hdopCircleGpsPoints = new JCheckBox(tr("Draw a circle form HDOP value."));
+    private ButtonGroup colorGroup;
+    private JRadioButton colorTypeVelocity = new JRadioButton(tr("Velocity (red = slow, green = fast)"));
+    private JRadioButton colorTypeDirection = new JRadioButton(tr("Direction (red = west, yellow = north, green = east, blue = south)"));
+    private JRadioButton colorTypeDilution = new JRadioButton(tr("Dilution of Position (red = high, green = low, if available)"));
+    private JRadioButton colorTypeTime = new JRadioButton(tr("Track date"));
+    private JRadioButton colorTypeNone = new JRadioButton(tr("Single Color (can be customized for named layers)"));
+    private JRadioButton colorTypeGlobal  = new JRadioButton(tr("Use global settings."));
+    private JComboBox colorTypeVelocityTune = new JComboBox(new String[] {tr("Car"), tr("Bicycle"), tr("Foot")});
+    private JCheckBox makeAutoMarkers = new JCheckBox(tr("Create markers when reading GPX."));
+    private JCheckBox drawGpsArrows = new JCheckBox(tr("Draw Direction Arrows"));
+    private JCheckBox drawGpsArrowsFast = new JCheckBox(tr("Fast drawing (looks uglier)"));
+    private JTextField drawGpsArrowsMinDist = new JTextField(8);
+    private JCheckBox colorDynamic = new JCheckBox(tr("Dynamic color range based on data limits"));
+    private JComboBox waypointLabel = new JComboBox(new String[] {tr("Auto"), /* gpx data field name */ trc("gpx_field", "Name"),
+            /* gpx data field name */ trc("gpx_field", "Desc(ription)"), tr("Both"), tr("None"), tr("Global settings")});
+    private String spec;
+    
+    public GPXSettingsPanel(String layerName) {
+        super(new GridBagLayout());
+        this.spec="layer "+layerName;
+        initComponents();
+        loadPreferences(); 
+    }
+    
+    public GPXSettingsPanel() {
+        super(new GridBagLayout());
+        initComponents();
+        loadPreferences(); // preferences -> controls
+    }
+    private void initComponents() {
+        setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
+
+        // makeAutoMarkers
+        makeAutoMarkers.setToolTipText(tr("Automatically make a marker layer from any waypoints when opening a GPX layer."));
+        add(makeAutoMarkers, GBC.eol().insets(20,0,0,5));
+
+        // drawRawGpsLines
+        ButtonGroup gpsLinesGroup = new ButtonGroup();
+        if (spec!=null) gpsLinesGroup.add(drawRawGpsLinesGlobal);
+        gpsLinesGroup.add(drawRawGpsLinesNone);
+        gpsLinesGroup.add(drawRawGpsLinesLocal);
+        gpsLinesGroup.add(drawRawGpsLinesAll);
+
+        /* ensure that default is in data base */
+        
+        add(new JLabel(tr("Draw lines between raw GPS points")), GBC.eol().insets(20,0,0,0));
+        if (spec!=null) add(drawRawGpsLinesGlobal, GBC.eol().insets(40,0,0,0));
+        add(drawRawGpsLinesNone, GBC.eol().insets(40,0,0,0));
+        add(drawRawGpsLinesLocal, GBC.eol().insets(40,0,0,0));
+        add(drawRawGpsLinesAll, GBC.eol().insets(40,0,0,0));
+
+        drawRawGpsLinesActionListener = new ActionListener(){
+            public void actionPerformed(ActionEvent e) {
+                boolean f=drawRawGpsLinesNone.isSelected()||drawRawGpsLinesGlobal.isSelected();
+                forceRawGpsLines.setEnabled(!f);
+                drawRawGpsMaxLineLength.setEnabled(!(f || drawRawGpsLinesLocal.isSelected()));
+                drawRawGpsMaxLineLengthLocal.setEnabled(!f);
+                drawGpsArrows.setEnabled(!f);
+                drawGpsArrowsFast.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
+                drawGpsArrowsMinDist.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
+            }
+        };
+
+        drawRawGpsLinesGlobal.addActionListener(drawRawGpsLinesActionListener);
+        drawRawGpsLinesNone.addActionListener(drawRawGpsLinesActionListener);
+        drawRawGpsLinesLocal.addActionListener(drawRawGpsLinesActionListener);
+        drawRawGpsLinesAll.addActionListener(drawRawGpsLinesActionListener);
+
+        // drawRawGpsMaxLineLengthLocal
+        drawRawGpsMaxLineLengthLocal.setToolTipText(tr("Maximum length (in meters) to draw lines for local files. Set to ''-1'' to draw all lines."));
+        add(new JLabel(tr("Maximum length for local files (meters)")), GBC.std().insets(40,0,0,0));
+        add(drawRawGpsMaxLineLengthLocal, GBC.eol().fill(GBC.HORIZONTAL).insets(5,0,0,5));
+
+        // drawRawGpsMaxLineLength
+        drawRawGpsMaxLineLength.setToolTipText(tr("Maximum length (in meters) to draw lines. Set to ''-1'' to draw all lines."));
+        add(new JLabel(tr("Maximum length (meters)")), GBC.std().insets(40,0,0,0));
+        add(drawRawGpsMaxLineLength, GBC.eol().fill(GBC.HORIZONTAL).insets(5,0,0,5));
+
+        // forceRawGpsLines
+        forceRawGpsLines.setToolTipText(tr("Force drawing of lines if the imported data contain no line information."));
+        add(forceRawGpsLines, GBC.eop().insets(40,0,0,0));
+        
+        // drawGpsArrows
+        drawGpsArrows.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e) {
+                drawGpsArrowsFast.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
+                drawGpsArrowsMinDist.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
+            }
+        });
+        drawGpsArrows.setToolTipText(tr("Draw direction arrows for lines, connecting GPS points."));
+        add(drawGpsArrows, GBC.eop().insets(40,0,0,0));
+
+        // drawGpsArrowsFast
+        drawGpsArrowsFast.setToolTipText(tr("Draw the direction arrows using table lookups instead of complex math."));
+        add(drawGpsArrowsFast, GBC.eop().insets(60,0,0,0));
+
+        // drawGpsArrowsMinDist
+        drawGpsArrowsMinDist.setToolTipText(tr("Do not draw arrows if they are not at least this distance away from the last one."));
+        add(new JLabel(tr("Minimum distance (pixels)")), GBC.std().insets(60,0,0,0));
+        add(drawGpsArrowsMinDist, GBC.eol().fill(GBC.HORIZONTAL).insets(5,0,0,5));
+
+        // hdopCircleGpsPoints
+        hdopCircleGpsPoints.setToolTipText(tr("Draw a circle form HDOP value."));
+        add(hdopCircleGpsPoints, GBC.eop().insets(20,0,0,0));
+
+        // largeGpsPoints
+        largeGpsPoints.setToolTipText(tr("Draw larger dots for the GPS points."));
+        add(largeGpsPoints, GBC.eop().insets(20,0,0,0));
+
+        // colorTracks
+        colorGroup = new ButtonGroup();
+        if (spec!=null) colorGroup.add(colorTypeGlobal);
+        colorGroup.add(colorTypeNone);
+        colorGroup.add(colorTypeVelocity);
+        colorGroup.add(colorTypeDirection);
+        colorGroup.add(colorTypeDilution);
+        colorGroup.add(colorTypeTime);
+
+        colorTypeVelocity.addChangeListener(new ChangeListener(){
+            public void stateChanged(ChangeEvent e) {
+                colorTypeVelocityTune.setEnabled(colorTypeVelocity.isSelected());
+                colorDynamic.setEnabled(colorTypeVelocity.isSelected() || colorTypeDilution.isSelected());
+            }
+        });
+        colorTypeDilution.addChangeListener(new ChangeListener(){
+            public void stateChanged(ChangeEvent e) {
+                colorDynamic.setEnabled(colorTypeVelocity.isSelected() || colorTypeDilution.isSelected());
+            }
+        });
+        
+        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."));
+        colorTypeDirection.setToolTipText(tr("Colors points and track segments by direction."));
+        colorTypeDilution.setToolTipText(tr("Colors points and track segments by dilution of position (HDOP). Your capture device needs to log that information."));
+        colorTypeTime.setToolTipText(tr("Colors points and track segments by its timestamp."));
+
+        // color Tracks by Velocity Tune
+        colorTypeVelocityTune.setToolTipText(tr("Allows to tune the track coloring for different average speeds."));
+
+        add(Box.createVerticalGlue(), GBC.eol().insets(0, 20, 0, 0));
+
+        add(new JLabel(tr("Track and Point Coloring")), GBC.eol().insets(20,0,0,0));
+        if (spec!=null) add(colorTypeGlobal, GBC.eol().insets(40,0,0,0));
+        add(colorTypeNone, GBC.eol().insets(40,0,0,0));
+        add(colorTypeVelocity, GBC.std().insets(40,0,0,0));
+        add(colorTypeVelocityTune, GBC.eop().insets(5,0,0,5));
+        add(colorTypeDirection, GBC.eol().insets(40,0,0,0));
+        add(colorTypeDilution, GBC.eol().insets(40,0,0,0));
+        add(colorTypeTime, GBC.eol().insets(40,0,0,0));
+        
+        colorDynamic.setToolTipText(tr("Draw direction arrows for lines, connecting GPS points."));
+        add(colorDynamic, GBC.eop().insets(40,0,0,0));
+
+        // waypointLabel
+        add(Box.createVerticalGlue(), GBC.eol().insets(0, 20, 0, 0));
+        add(new JLabel(tr("Waypoint labelling")), GBC.std().insets(20,0,0,0));
+        add(waypointLabel, GBC.eol().fill(GBC.HORIZONTAL).insets(5,0,0,5));
+        add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
+    }
+    
+    /**
+     * Loads preferences to UI controls
+     */
+    public void loadPreferences () {
+        makeAutoMarkers.setSelected(Main.pref.getBoolean("marker.makeautomarkers", true));
+        if(spec!=null && !Main.pref.hasKey("draw.rawgps.lines."+spec)
+                && !Main.pref.hasKey("draw.rawgps.lines.local"+spec)){
+            // no line preferences for layer is found
+            drawRawGpsLinesGlobal.setSelected(true);
+        } else {
+            Boolean lf = Main.pref.getBoolean("draw.rawgps.lines.local",spec, true);
+            if(Main.pref.getBoolean("draw.rawgps.lines",spec, true)) {
+                drawRawGpsLinesAll.setSelected(true);
+            } else if (lf) {
+                drawRawGpsLinesLocal.setSelected(true);
+            } else {
+                drawRawGpsLinesNone.setSelected(true);
+            }
+        }
+        
+        drawRawGpsMaxLineLengthLocal.setText(Integer.toString(Main.pref.getInteger("draw.rawgps.max-line-length.local",spec, -1)));
+        drawRawGpsMaxLineLengthLocal.setEnabled(!drawRawGpsLinesNone.isSelected());
+        drawRawGpsMaxLineLength.setText(Integer.toString(Main.pref.getInteger("draw.rawgps.max-line-length",spec, 200)));
+        drawRawGpsMaxLineLength.setEnabled(!drawRawGpsLinesNone.isSelected());
+        forceRawGpsLines.setSelected(Main.pref.getBoolean("draw.rawgps.lines.force",spec, false));
+        forceRawGpsLines.setEnabled(!drawRawGpsLinesNone.isSelected());
+        drawGpsArrows.setSelected(Main.pref.getBoolean("draw.rawgps.direction",spec, false));
+        drawGpsArrows.setEnabled(!drawRawGpsLinesNone.isSelected());
+        drawGpsArrowsFast.setSelected(Main.pref.getBoolean("draw.rawgps.alternatedirection",spec, false));
+        drawGpsArrowsFast.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
+        drawGpsArrowsMinDist.setText(Integer.toString(Main.pref.getInteger("draw.rawgps.min-arrow-distance",spec, 40)));
+        drawGpsArrowsMinDist.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
+        hdopCircleGpsPoints.setSelected(Main.pref.getBoolean("draw.rawgps.hdopcircle",spec, false));
+        largeGpsPoints.setSelected(Main.pref.getBoolean("draw.rawgps.large",spec, false));
+        
+        if(spec!=null && !Main.pref.hasKey("draw.rawgps.colors."+spec)) {
+            colorTypeGlobal.setSelected(true);
+            colorDynamic.setSelected(false);
+            colorDynamic.setEnabled(false);
+        } else {
+         switch(Main.pref.getInteger("draw.rawgps.colors",spec, 0)) {
+            case 0: colorTypeNone.setSelected(true);   break;
+            case 1: colorTypeVelocity.setSelected(true);  break;
+            case 2: colorTypeDilution.setSelected(true);  break;
+            case 3: colorTypeDirection.setSelected(true); break;
+            case 4: colorTypeTime.setSelected(true);  break;
+            }
+            int ccts = Main.pref.getInteger("draw.rawgps.colorTracksTune",spec, 45);
+            colorTypeVelocityTune.setSelectedIndex(ccts==10 ? 2 : (ccts==20 ? 1 : 0));
+            colorTypeVelocityTune.setEnabled(colorTypeVelocity.isSelected() && colorTypeVelocity.isEnabled());
+            colorDynamic.setSelected(Main.pref.getBoolean("draw.rawgps.colors.dynamic",spec, false));
+            colorDynamic.setEnabled(colorTypeVelocity.isSelected() || colorTypeDilution.isSelected());
+        }
+        waypointLabel.setSelectedIndex(Main.pref.getInteger("draw.rawgps.layer.wpt",spec, 5 ));
+    }
+    
+    
+    /**
+     * Save preferences from UI controls for specified layer
+     * if spec==null, global preferences are written
+     */
+    public boolean savePreferences (String spec) {
+        String specSp;
+        if (spec!=null) specSp=".layer "+spec; else specSp="";
+        Main.pref.put("marker.makeautomarkers"+specSp, makeAutoMarkers.isSelected());
+        if (drawRawGpsLinesGlobal.isSelected()) {
+            Main.pref.put("draw.rawgps.lines"+specSp, null);
+            Main.pref.put("draw.rawgps.lines.local"+specSp, null);
+            Main.pref.put("draw.rawgps.max-line-length"+specSp, null);
+            Main.pref.put("draw.rawgps.max-line-length.local"+specSp, null);
+            Main.pref.put("draw.rawgps.lines.force"+specSp, null);
+            Main.pref.put("draw.rawgps.direction"+specSp, null);
+            Main.pref.put("draw.rawgps.alternatedirection"+specSp, null);
+            Main.pref.put("draw.rawgps.min-arrow-distance"+specSp, null);
+        } else {
+            Main.pref.put("draw.rawgps.lines"+specSp, drawRawGpsLinesAll.isSelected());
+            Main.pref.put("draw.rawgps.lines.local"+specSp, drawRawGpsLinesAll.isSelected() || drawRawGpsLinesLocal.isSelected());
+            Main.pref.put("draw.rawgps.max-line-length"+specSp, drawRawGpsMaxLineLength.getText());
+            Main.pref.put("draw.rawgps.max-line-length.local"+specSp, drawRawGpsMaxLineLengthLocal.getText());
+            Main.pref.put("draw.rawgps.lines.force"+specSp, forceRawGpsLines.isSelected());
+            Main.pref.put("draw.rawgps.direction"+specSp, drawGpsArrows.isSelected());
+            Main.pref.put("draw.rawgps.alternatedirection"+specSp, drawGpsArrowsFast.isSelected());
+            Main.pref.put("draw.rawgps.min-arrow-distance"+specSp, drawGpsArrowsMinDist.getText());
+        }
+        
+        Main.pref.put("draw.rawgps.hdopcircle"+specSp, hdopCircleGpsPoints.isSelected());
+        Main.pref.put("draw.rawgps.large"+specSp, largeGpsPoints.isSelected());
+        if (waypointLabel.getSelectedIndex()==5) Main.pref.put("draw.rawgps.layer.wpt"+specSp,null);
+        else Main.pref.putInteger("draw.rawgps.layer.wpt"+specSp, waypointLabel.getSelectedIndex());
+                
+        if(colorTypeGlobal.isSelected()) {
+            Main.pref.put("draw.rawgps.colors"+specSp, null);
+            Main.pref.put("draw.rawgps.colors.dynamic"+specSp, null);
+            Main.pref.put("draw.rawgps.colorTracksTunec"+specSp, null);
+            return false;
+        } else if(colorTypeVelocity.isSelected()) {
+            Main.pref.putInteger("draw.rawgps.colors"+specSp, 1);
+        } else if(colorTypeDilution.isSelected()) {
+            Main.pref.putInteger("draw.rawgps.colors"+specSp, 2);
+        } else if(colorTypeDirection.isSelected()) {
+            Main.pref.putInteger("draw.rawgps.colors"+specSp, 3);
+        } else if(colorTypeTime.isSelected()) {
+            Main.pref.putInteger("draw.rawgps.colors"+specSp, 4);
+        } else {
+            Main.pref.putInteger("draw.rawgps.colors"+specSp, 0);
+        }
+        Main.pref.put("draw.rawgps.colors.dynamic"+specSp, colorDynamic.isSelected());
+        int ccti=colorTypeVelocityTune.getSelectedIndex();
+        Main.pref.putInteger("draw.rawgps.colorTracksTune"+specSp, ccti==2 ? 10 : (ccti==1 ? 20 : 45));
+        return false;
+    }
+
+    /**
+     * Save preferences from UI controls for initial layer or globally
+     */
+    public void savePreferences() {
+        savePreferences(null);
+    }
+}
Index: org/openstreetmap/josm/gui/preferences/DrawingPreference.java
===================================================================
--- org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(revision 4261)
+++ org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(working copy)
@@ -33,25 +33,8 @@
         }
     }
 
-    private JRadioButton drawRawGpsLinesAll = new JRadioButton(tr("All"));
-    private JRadioButton drawRawGpsLinesLocal = new JRadioButton(tr("Local files"));
-    private JRadioButton drawRawGpsLinesNone = new JRadioButton(tr("None"));
-    private ActionListener drawRawGpsLinesActionListener;
-    private JTextField drawRawGpsMaxLineLength = new JTextField(8);
-    private JTextField drawRawGpsMaxLineLengthLocal = 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 hdopCircleGpsPoints = new JCheckBox(tr("Draw a circle form HDOP value."));
-    private ButtonGroup colorGroup;
-    private JRadioButton colorTypeVelocity = new JRadioButton(tr("Velocity (red = slow, green = fast)"));
-    private JRadioButton colorTypeDirection = new JRadioButton(tr("Direction (red = west, yellow = north, green = east, blue = south)"));
-    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 GPXSettingsPanel gpxPanel;
     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)"));
-    private JTextField drawGpsArrowsMinDist = new JTextField(8);
     private JCheckBox headArrow = new JCheckBox(tr("Only on the head of a way."));
     private JCheckBox onewayArrow = new JCheckBox(tr("Draw oneway arrows."));
     private JCheckBox segmentOrderNumber = new JCheckBox(tr("Draw segment order numbers"));
@@ -59,180 +42,13 @@
     private JCheckBox virtualNodes = new JCheckBox(tr("Draw virtual nodes in select mode"));
     private JCheckBox inactive = new JCheckBox(tr("Draw inactive layers in other color"));
     private JCheckBox useAntialiasing = new JCheckBox(tr("Smooth map graphics (antialiasing)"));
-    private JCheckBox makeAutoMarkers = new JCheckBox(tr("Create markers when reading GPX."));
     private JCheckBox outlineOnly = new JCheckBox(tr("Draw only outlines of areas"));
-    private JCheckBox colorDynamic = new JCheckBox(tr("Dynamic color range based on data limits"));
-    private JComboBox waypointLabel = new JComboBox(new String[] {tr("Auto"), /* gpx data field name */ trc("gpx_field", "Name"),
-            /* gpx data field name */ trc("gpx_field", "Desc(ription)"), tr("Both"), tr("None")});
 
     public void addGui(PreferenceTabbedPane gui) {
         gui.display.setPreferredSize(new Dimension(400,600));
-        JPanel panel = new JPanel(new GridBagLayout());
-        panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
-
-        // makeAutoMarkers
-        makeAutoMarkers.setSelected(Main.pref.getBoolean("marker.makeautomarkers", true));
-        makeAutoMarkers.setToolTipText(tr("Automatically make a marker layer from any waypoints when opening a GPX layer."));
-        panel.add(makeAutoMarkers, GBC.eol().insets(20,0,0,5));
-
-        // drawRawGpsLines
-        ButtonGroup gpsLinesGroup = new ButtonGroup();
-        gpsLinesGroup.add(drawRawGpsLinesNone);
-        gpsLinesGroup.add(drawRawGpsLinesLocal);
-        gpsLinesGroup.add(drawRawGpsLinesAll);
-
-
-        /* ensure that default is in data base */
-        Boolean lf = Main.pref.getBoolean("draw.rawgps.lines.local", true);
-        if(Main.pref.getBoolean("draw.rawgps.lines", true)) {
-            drawRawGpsLinesAll.setSelected(true);
-        } else if (lf) {
-            drawRawGpsLinesLocal.setSelected(true);
-        } else {
-            drawRawGpsLinesNone.setSelected(true);
-        }
-
-        panel.add(new JLabel(tr("Draw lines between raw GPS points")), GBC.eol().insets(20,0,0,0));
-        panel.add(drawRawGpsLinesNone, GBC.eol().insets(40,0,0,0));
-        panel.add(drawRawGpsLinesLocal, GBC.eol().insets(40,0,0,0));
-        panel.add(drawRawGpsLinesAll, GBC.eol().insets(40,0,0,0));
-
-        drawRawGpsLinesActionListener = new ActionListener(){
-            public void actionPerformed(ActionEvent e) {
-                forceRawGpsLines.setEnabled(!drawRawGpsLinesNone.isSelected());
-                drawRawGpsMaxLineLength.setEnabled(!(drawRawGpsLinesNone.isSelected() || drawRawGpsLinesLocal.isSelected()));
-                drawRawGpsMaxLineLengthLocal.setEnabled(!drawRawGpsLinesNone.isSelected());
-                drawGpsArrows.setEnabled(!drawRawGpsLinesNone.isSelected() );
-                drawGpsArrowsFast.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
-                drawGpsArrowsMinDist.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
-            }
-        };
-
-        drawRawGpsLinesNone.addActionListener(drawRawGpsLinesActionListener);
-        drawRawGpsLinesLocal.addActionListener(drawRawGpsLinesActionListener);
-        drawRawGpsLinesAll.addActionListener(drawRawGpsLinesActionListener);
-
-        // drawRawGpsMaxLineLengthLocal
-        drawRawGpsMaxLineLengthLocal.setText(Integer.toString(Main.pref.getInteger("draw.rawgps.max-line-length.local", -1)));
-        drawRawGpsMaxLineLengthLocal.setToolTipText(tr("Maximum length (in meters) to draw lines for local files. Set to ''-1'' to draw all lines."));
-        drawRawGpsMaxLineLengthLocal.setEnabled(!drawRawGpsLinesNone.isSelected());
-        panel.add(new JLabel(tr("Maximum length for local files (meters)")), GBC.std().insets(40,0,0,0));
-        panel.add(drawRawGpsMaxLineLengthLocal, GBC.eol().fill(GBC.HORIZONTAL).insets(5,0,0,5));
-
-        // drawRawGpsMaxLineLength
-        drawRawGpsMaxLineLength.setText(Integer.toString(Main.pref.getInteger("draw.rawgps.max-line-length", 200)));
-        drawRawGpsMaxLineLength.setToolTipText(tr("Maximum length (in meters) to draw lines. Set to ''-1'' to draw all lines."));
-        drawRawGpsMaxLineLength.setEnabled(!drawRawGpsLinesNone.isSelected());
-        panel.add(new JLabel(tr("Maximum length (meters)")), GBC.std().insets(40,0,0,0));
-        panel.add(drawRawGpsMaxLineLength, GBC.eol().fill(GBC.HORIZONTAL).insets(5,0,0,5));
-
-        // forceRawGpsLines
-        forceRawGpsLines.setToolTipText(tr("Force drawing of lines if the imported data contain no line information."));
-        forceRawGpsLines.setSelected(Main.pref.getBoolean("draw.rawgps.lines.force", false));
-        forceRawGpsLines.setEnabled(!drawRawGpsLinesNone.isSelected());
-        panel.add(forceRawGpsLines, GBC.eop().insets(40,0,0,0));
-
-        // drawGpsArrows
-        drawGpsArrows.addActionListener(new ActionListener(){
-            public void actionPerformed(ActionEvent e) {
-                drawGpsArrowsFast.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
-                drawGpsArrowsMinDist.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
-            }
-        });
-        drawGpsArrows.setToolTipText(tr("Draw direction arrows for lines, connecting GPS points."));
-        drawGpsArrows.setSelected(Main.pref.getBoolean("draw.rawgps.direction", false));
-        drawGpsArrows.setEnabled(!drawRawGpsLinesNone.isSelected());
-        panel.add(drawGpsArrows, GBC.eop().insets(40,0,0,0));
-
-        // drawGpsArrowsFast
-        drawGpsArrowsFast.setToolTipText(tr("Draw the direction arrows using table lookups instead of complex math."));
-        drawGpsArrowsFast.setSelected(Main.pref.getBoolean("draw.rawgps.alternatedirection", false));
-        drawGpsArrowsFast.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
-        panel.add(drawGpsArrowsFast, GBC.eop().insets(60,0,0,0));
-
-        // drawGpsArrowsMinDist
-        drawGpsArrowsMinDist.setToolTipText(tr("Do not draw arrows if they are not at least this distance away from the last one."));
-        drawGpsArrowsMinDist.setText(Integer.toString(Main.pref.getInteger("draw.rawgps.min-arrow-distance", 40)));
-        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));
-
-        // hdopCircleGpsPoints
-        hdopCircleGpsPoints.setSelected(Main.pref.getBoolean("draw.rawgps.hdopcircle", false));
-        hdopCircleGpsPoints.setToolTipText(tr("Draw a circle form HDOP value."));
-        panel.add(hdopCircleGpsPoints, GBC.eop().insets(20,0,0,0));
-
-        // largeGpsPoints
-        largeGpsPoints.setSelected(Main.pref.getBoolean("draw.rawgps.large", false));
-        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(colorTypeDirection);
-        colorGroup.add(colorTypeDilution);
-
-        colorTypeVelocity.addChangeListener(new ChangeListener(){
-            public void stateChanged(ChangeEvent e) {
-                colorTypeVelocityTune.setEnabled(colorTypeVelocity.isSelected());
-                colorDynamic.setEnabled(colorTypeVelocity.isSelected() || colorTypeDilution.isSelected());
-            }
-        });
-        colorTypeDilution.addChangeListener(new ChangeListener(){
-            public void stateChanged(ChangeEvent e) {
-                colorDynamic.setEnabled(colorTypeVelocity.isSelected() || colorTypeDilution.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;
-        case 3:
-            colorTypeDirection.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."));
-        colorTypeDirection.setToolTipText(tr("Colors points and track segments by direction."));
-        colorTypeDilution.setToolTipText(tr("Colors points and track segments by dilution of position (HDOP). Your capture device needs to log 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(colorTypeDirection, GBC.eol().insets(40,0,0,0));
-        panel.add(colorTypeDilution, GBC.eol().insets(40,0,0,0));
-        colorDynamic.setToolTipText(tr("Draw direction arrows for lines, connecting GPS points."));
-        colorDynamic.setSelected(Main.pref.getBoolean("draw.rawgps.colors.dynamic", false));
-        colorDynamic.setEnabled(colorTypeVelocity.isSelected() || colorTypeDilution.isSelected());
-        panel.add(colorDynamic, GBC.eop().insets(40,0,0,0));
-
-        // waypointLabel
-        panel.add(Box.createVerticalGlue(), GBC.eol().insets(0, 20, 0, 0));
-
-        waypointLabel.setSelectedIndex(Main.pref.getInteger("draw.rawgps.layer.wpt", 0 ));
-        panel.add(new JLabel(tr("Waypoint labelling")), GBC.std().insets(20,0,0,0));
-        panel.add(waypointLabel, GBC.eol().fill(GBC.HORIZONTAL).insets(5,0,0,5));
-
-        panel.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
+        gpxPanel = new GPXSettingsPanel();
+        JPanel panel = gpxPanel;
+        
         JScrollPane scrollpane = new JScrollPane(panel);
         scrollpane.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
         gui.displaycontent.addTab(tr("GPS Points"), scrollpane);
@@ -302,30 +118,8 @@
     }
 
     public boolean ok() {
-        Main.pref.put("marker.makeautomarkers", makeAutoMarkers.isSelected());
+        gpxPanel.savePreferences();
         Main.pref.put("draw.data.area_outline_only", outlineOnly.isSelected());
-        Main.pref.put("draw.rawgps.lines", drawRawGpsLinesAll.isSelected());
-        Main.pref.put("draw.rawgps.lines.local", drawRawGpsLinesAll.isSelected() || drawRawGpsLinesLocal.isSelected());
-        Main.pref.put("draw.rawgps.max-line-length", drawRawGpsMaxLineLength.getText());
-        Main.pref.put("draw.rawgps.max-line-length.local", drawRawGpsMaxLineLengthLocal.getText());
-        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.dynamic", colorDynamic.isSelected());
-        if(colorTypeVelocity.isSelected()) {
-            Main.pref.putInteger("draw.rawgps.colors", 1);
-        } else if(colorTypeDilution.isSelected()) {
-            Main.pref.putInteger("draw.rawgps.colors", 2);
-        } else if(colorTypeDirection.isSelected()) {
-            Main.pref.putInteger("draw.rawgps.colors", 3);
-        } 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.hdopcircle", hdopCircleGpsPoints.isSelected());
-        Main.pref.put("draw.rawgps.large", largeGpsPoints.isSelected());
         Main.pref.put("draw.segment.direction", directionHint.isSelected());
         Main.pref.put("draw.segment.head_only", headArrow.isSelected());
         Main.pref.put("draw.oneway", onewayArrow.isSelected());
@@ -343,7 +137,6 @@
             vn = 0;
         }
         Main.pref.putInteger("mappaint.node.virtual-size", vn);
-        Main.pref.putInteger("draw.rawgps.layer.wpt", waypointLabel.getSelectedIndex());
         return false;
     }
 }
