Index: trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/ButtonMarker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/ButtonMarker.java	(revision 3395)
+++ trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/ButtonMarker.java	(revision 3396)
@@ -26,5 +26,5 @@
 
     public ButtonMarker(LatLon ll, String buttonImage, MarkerLayer parentLayer, double time, double offset) {
-        super(ll, null, buttonImage, parentLayer, time, offset);
+        super(ll, "", buttonImage, parentLayer, time, offset);
         buttonRectangle = new Rectangle(0, 0, symbol.getIconWidth(), symbol.getIconHeight());
     }
@@ -62,6 +62,8 @@
         r.grow((inset.top+inset.bottom)/2, (inset.left+inset.right)/2);
         b.paintBorder(mv, g, r.x, r.y, r.width, r.height);
-        if ((text != null) && showTextOrIcon && Main.pref.getBoolean("marker.buttonlabels", true)) {
-            g.drawString(text, screen.x+4, screen.y+2);
+
+        String labelText = getText();
+        if ((labelText != null) && showTextOrIcon && Main.pref.getBoolean("marker.buttonlabels", true)) {
+            g.drawString(labelText, screen.x+4, screen.y+2);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java	(revision 3395)
+++ trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java	(revision 3396)
@@ -10,5 +10,7 @@
 import java.net.URL;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.LinkedList;
+import java.util.Map;
 
 import javax.swing.Icon;
@@ -20,5 +22,5 @@
 import org.openstreetmap.josm.data.gpx.GpxLink;
 import org.openstreetmap.josm.data.gpx.WayPoint;
-import org.openstreetmap.josm.data.preferences.StringProperty;
+import org.openstreetmap.josm.data.preferences.IntegerProperty;
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -61,4 +63,5 @@
 public class Marker implements ActionListener {
     public final String text;
+    public final Map<String,String> textMap = new HashMap<String,String>();
     public final Icon symbol;
     public final MarkerLayer parentLayer;
@@ -96,5 +99,6 @@
     public static LinkedList<MarkerProducers> markerProducers = new LinkedList<MarkerProducers>();
 
-    private static final StringProperty PROP_NAME_DESC = new StringProperty( "draw.gpx.layer.wpt", "nameordesc" );
+    private static final IntegerProperty PROP_LABEL = new IntegerProperty("draw.rawgps.layer.wpt", 0 );
+    private static final String[] labelAttributes = new String[] {"name", "desc"};
 
     // Add one Maker specifying the default behaviour.
@@ -118,31 +122,8 @@
                 }
 
-                String name_desc = "";
-                if (PROP_NAME_DESC.get() == null || "nameordesc".equals(PROP_NAME_DESC.get()))
-                {
-                    if (wpt.attr.containsKey("name")) {
-                        name_desc = wpt.getString("name");
-                    } else if (wpt.attr.containsKey("desc")) {
-                        name_desc = wpt.getString("desc");
-                    }
-                } else if ("name".equals(PROP_NAME_DESC.get())) {
-                    if (wpt.attr.containsKey("name")) {
-                        name_desc = wpt.getString("name");
-                    }
-                }
-                else if ("desc".equals(PROP_NAME_DESC.get())) {
-                    if (wpt.attr.containsKey("desc")) {
-                        name_desc = wpt.getString("desc");
-                    }
-                }
-                else if ("both".equals(PROP_NAME_DESC.get()) ) {
-                    if (wpt.attr.containsKey("name")) {
-                        name_desc = wpt.getString("name");
-
-                        if (wpt.attr.containsKey("desc")) {
-                            name_desc += " (" + wpt.getString("desc") + ")" ;
-                        }
-                    } else if (wpt.attr.containsKey("desc")) {
-                        name_desc = wpt.getString("desc");
+                Map<String,String> nameDesc = new HashMap<String,String>();
+                for(String attribute : labelAttributes) {
+                    if (wpt.attr.containsKey(attribute)) {
+                        nameDesc.put(attribute, wpt.getString(attribute));
                     }
                 }
@@ -153,8 +134,8 @@
                         symbolName = wpt.getString("sym");
                     }
-                    return new Marker(wpt.getCoor(), name_desc, symbolName, parentLayer, time, offset);
+                    return new Marker(wpt.getCoor(), nameDesc, symbolName, parentLayer, time, offset);
                 }
                 else if (uri.endsWith(".wav"))
-                    return AudioMarker.create(wpt.getCoor(), name_desc, uri, parentLayer, time, offset);
+                    return AudioMarker.create(wpt.getCoor(), getText(nameDesc), uri, parentLayer, time, offset);
                 else if (uri.endsWith(".png") || uri.endsWith(".jpg") || uri.endsWith(".jpeg") || uri.endsWith(".gif"))
                     return ImageMarker.create(wpt.getCoor(), uri, parentLayer, time, offset);
@@ -176,5 +157,24 @@
     public Marker(LatLon ll, String text, String iconName, MarkerLayer parentLayer, double time, double offset) {
         setCoor(ll);
-        this.text = text;
+        if (text == null || text.length() == 0) {
+            this.text = null;
+        }
+        else {
+            this.text = text;
+        }
+        this.offset = offset;
+        this.time = time;
+        this.symbol = ImageProvider.getIfAvailable("markers",iconName);
+        this.parentLayer = parentLayer;
+    }
+
+    public Marker(LatLon ll, Map<String,String> textMap, String iconName, MarkerLayer parentLayer, double time, double offset) {
+        setCoor(ll);
+        if (textMap != null) {
+            this.textMap.clear();
+            this.textMap.putAll(textMap);
+        }
+        
+        this.text = null;
         this.offset = offset;
         this.time = time;
@@ -218,6 +218,7 @@
         }
 
-        if ((text != null) && showTextOrIcon) {
-            g.drawString(text, screen.x+4, screen.y+2);
+        String labelText = getText();
+        if ((labelText != null) && showTextOrIcon) {
+            g.drawString(labelText, screen.x+4, screen.y+2);
         }
     }
@@ -254,6 +255,83 @@
 
     public AudioMarker audioMarkerFromMarker(String uri) {
-        AudioMarker audioMarker = AudioMarker.create(getCoor(), this.text, uri, this.parentLayer, this.time, this.offset);
+        AudioMarker audioMarker = AudioMarker.create(getCoor(), this.getText(), uri, this.parentLayer, this.time, this.offset);
         return audioMarker;
     }
+
+    /**
+     * Returns the Text which should be displayed, depending on chosen preference
+     * @return Text
+     */
+    public String getText() {
+        if (this.text != null ) {
+            return this.text;
+        }
+        else {
+            return getText(this.textMap);
+        }
+    }
+
+    /**
+     * Returns the Text which should be displayed, depending on chosen preference.
+     * The possible attributes are read from textMap.
+     *
+     * @param textMap A map with available texts/attributes
+     * @return Text
+     */
+    private static String getText(Map<String,String> textMap) {
+        String text = "";
+
+        if (textMap != null && !textMap.isEmpty()) {
+            switch(PROP_LABEL.get())
+            {
+                // name
+                case 1:
+                {
+                    if (textMap.containsKey("name")) {
+                        text = textMap.get("name");
+                    }
+                    break;
+                }
+
+                // desc
+                case 2:
+                {
+                    if (textMap.containsKey("desc")) {
+                        text = textMap.get("desc");
+                    }
+                    break;
+                }
+
+                // auto
+                case 0:
+                // both
+                case 3:
+                {
+                    if (textMap.containsKey("name")) {
+                        text = textMap.get("name");
+
+                        if (textMap.containsKey("desc")) {
+                            if (PROP_LABEL.get() != 0 || !text.equals(textMap.get("desc"))) {
+                                text += " - " + textMap.get("desc");
+                            }
+                        }
+                    }
+                    else if (textMap.containsKey("desc")) {
+                        text = textMap.get("desc");
+                    }
+                    break;
+                }
+
+                // none
+                case 4:
+                default:
+                {
+                    text = "";
+                    break;
+                }
+            }
+        }
+
+        return text;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(revision 3395)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(revision 3396)
@@ -59,4 +59,5 @@
     private JCheckBox useAntialiasing = new JCheckBox(tr("Smooth map graphics (antialiasing)"));
     private JCheckBox makeAutoMarkers = new JCheckBox(tr("Create markers when reading GPX."));
+    private JComboBox waypointLabel = new JComboBox(new String[] {tr("Auto"), tr("Name"), tr("Desc"), tr("Both"), tr("None")});
 
     public void addGui(PreferenceTabbedPane gui) {
@@ -203,4 +204,12 @@
         panel.add(colorTypeVelocityTune, GBC.eop().insets(5,0,0,5));
         panel.add(colorTypeDilution, GBC.eol().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 ));
+        colorTypeDilution.setToolTipText(tr("Allows to change the labelling of track waypoints."));
+        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));
@@ -301,9 +310,14 @@
         Main.pref.put("mappaint.use-antialiasing", useAntialiasing.isSelected());
         int vn = Main.pref.getInteger("mappaint.node.virtual-size", 8);
-        if(virtualNodes.isSelected()) { if (vn < 1) {
-            vn = 8;
-        } }
-        else { vn = 0; }
+        if (virtualNodes.isSelected()) {
+            if (vn < 1) {
+                vn = 8;
+            }
+        }
+        else {
+            vn = 0;
+        }
         Main.pref.putInteger("mappaint.node.virtual-size", vn);
+        Main.pref.putInteger("draw.rawgps.layer.wpt", waypointLabel.getSelectedIndex());
         return false;
     }
