Index: trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 1164)
+++ trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 1165)
@@ -386,4 +386,10 @@
 		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 = 0;
+		try {
+			delta = Integer.parseInt(Main.pref.get("draw.rawgps.min-arrow-distance", "0"));         // don't draw arrows nearer to each other than this
+		} catch (java.lang.NumberFormatException e) {
+			Main.pref.put("draw.rawgps.min-arrow-distance", "0");
+		}
 
 		/****************************************************************
@@ -472,4 +478,5 @@
 		if (lines && direction && !alternatedirection) {
 			Point old = null;
+			Point oldA = null; // last arrow painted
 			for (GpxTrack trk : data.tracks) {
 				for (Collection<WayPoint> segment : trk.trackSegs) {
@@ -480,5 +487,5 @@
 							Point screen = mv.getPoint(trkPnt.eastNorth);
 							// skip points that are on the same screenposition
-							if (old != null && ((old.x != screen.x) || (old.y != screen.y))) {
+							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);
 								double t = Math.atan2(screen.y-old.y, screen.x-old.x) + Math.PI;
@@ -487,4 +494,5 @@
 								g.drawLine(screen.x,screen.y, (int)(screen.x + 10*Math.cos(t+PHI)), (int)(screen.y
 								+ 10*Math.sin(t+PHI)));
+								oldA = screen;
 							}
 							old = screen;
@@ -500,4 +508,5 @@
 		if (lines && direction && alternatedirection) {
 			Point old = null;
+			Point oldA = null; // last arrow painted
 			for (GpxTrack trk : data.tracks) {
 				for (Collection<WayPoint> segment : trk.trackSegs) {
@@ -508,8 +517,9 @@
 							Point screen = mv.getPoint(trkPnt.eastNorth);
 							// skip points that are on the same screenposition
-							if (old != null && ((old.x != screen.x) || (old.y != screen.y))) {
+							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.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;
 							}
 							old = screen;
Index: trunk/src/org/openstreetmap/josm/gui/preferences/ColorPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/ColorPreference.java	(revision 1164)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/ColorPreference.java	(revision 1165)
@@ -8,4 +8,5 @@
 import java.awt.Component;
 import java.awt.Dimension;
+import java.awt.GridBagLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
@@ -22,4 +23,5 @@
 import javax.swing.JLabel;
 import javax.swing.JOptionPane;
+import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTable;
@@ -27,4 +29,6 @@
 import javax.swing.table.DefaultTableModel;
 import javax.swing.table.TableCellRenderer;
+import javax.swing.BorderFactory;
+import javax.swing.Box;
 
 import org.openstreetmap.josm.Main;
@@ -105,5 +109,4 @@
 			}
 		};
-		colors.setPreferredSize(new Dimension(200,200));
 		colors.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
 		final TableCellRenderer oldColorsRenderer = colors.getDefaultRenderer(Object.class);
@@ -137,7 +140,12 @@
 		colors.setToolTipText(tr("Colors used by different objects in JOSM."));
 		colors.setPreferredScrollableViewportSize(new Dimension(100,112));
-		gui.display.add(new JLabel(tr("Colors")), GBC.eol());
-		gui.display.add(new JScrollPane(colors), GBC.eol().fill(GBC.BOTH));
-		gui.display.add(colorEdit, GBC.eol().anchor(GBC.EAST));
+
+		JPanel panel = new JPanel(new GridBagLayout());
+		panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
+		JScrollPane scrollpane = new JScrollPane(colors);
+		scrollpane.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
+		panel.add(scrollpane, GBC.eol().fill(GBC.BOTH));
+		panel.add(colorEdit, GBC.eol().anchor(GBC.EAST));
+		gui.displaycontent.addTab(tr("Colors"), panel);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(revision 1164)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(revision 1165)
@@ -7,8 +7,13 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.GridBagLayout;
 
+import javax.swing.BorderFactory;
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JTextField;
+import javax.swing.JScrollPane;
+import javax.swing.JPanel;
+import javax.swing.Box;
 
 import org.openstreetmap.josm.Main;
@@ -25,4 +30,5 @@
 	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 interestingDirections = new JCheckBox(tr("Only interesting direction hints (e.g. with oneway tag)."));
 	private JCheckBox segmentOrderNumber = new JCheckBox(tr("Draw segment order numbers"));
@@ -31,8 +37,10 @@
 	private JCheckBox inactive = new JCheckBox(tr("Draw inactive layers in other color"));
 	private JCheckBox useAntialiasing = new JCheckBox(tr("Smooth map graphics (antialiasing)"));
-	private JCheckBox showSplashScreen = new JCheckBox(tr("Show splash screen at startup"));
 
 	public void addGui(PreferenceDialog gui) {
 	    gui.display.setPreferredSize(new Dimension(400,600));
+        JPanel panel = new JPanel(new GridBagLayout());
+        panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
+
 	    // drawRawGpsLines
 		drawRawGpsLines.addActionListener(new ActionListener(){
@@ -42,4 +50,5 @@
                             drawGpsArrows.setEnabled(drawRawGpsLines.isSelected());
                             drawGpsArrowsFast.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
+                            drawGpsArrowsMinDist.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
                             colorTracks.setEnabled(drawRawGpsLines.isSelected());
 			}
@@ -47,12 +56,12 @@
 		drawRawGpsLines.setSelected(Main.pref.getBoolean("draw.rawgps.lines"));
 		drawRawGpsLines.setToolTipText(tr("If your gps device draw too few lines, select this to draw lines along your way."));
-		gui.display.add(drawRawGpsLines, GBC.eol().insets(20,0,0,0));
+		panel.add(drawRawGpsLines, GBC.eol().insets(20,0,0,0));
 
 		// drawRawGpsMaxLineLength
-		drawRawGpsMaxLineLength.setText(Main.pref.get("draw.rawgps.max-line-length", "-1"));
+		drawRawGpsMaxLineLength.setText(Integer.toString(Main.pref.getInteger("draw.rawgps.max-line-length", -1)));
 		drawRawGpsMaxLineLength.setToolTipText(tr("Maximum length (in meters) to draw lines. Set to '-1' to draw all lines."));
 		drawRawGpsMaxLineLength.setEnabled(drawRawGpsLines.isSelected());
-		gui.display.add(new JLabel(tr("Maximum length (meters)")), GBC.std().insets(40,0,0,0));
-		gui.display.add(drawRawGpsMaxLineLength, GBC.eol().fill(GBC.HORIZONTAL).insets(5,0,0,5));
+		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
@@ -60,5 +69,5 @@
 		forceRawGpsLines.setSelected(Main.pref.getBoolean("draw.rawgps.lines.force"));
 		forceRawGpsLines.setEnabled(drawRawGpsLines.isSelected());
-		gui.display.add(forceRawGpsLines, GBC.eop().insets(40,0,0,0));
+		panel.add(forceRawGpsLines, GBC.eop().insets(40,0,0,0));
 		
 		// drawGpsArrows
@@ -66,4 +75,5 @@
 			public void actionPerformed(ActionEvent e) {
                             drawGpsArrowsFast.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
+                            drawGpsArrowsMinDist.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
 			}
 		});
@@ -71,5 +81,5 @@
 		drawGpsArrows.setSelected(Main.pref.getBoolean("draw.rawgps.direction"));
 		drawGpsArrows.setEnabled(drawRawGpsLines.isSelected());
-		gui.display.add(drawGpsArrows, GBC.eop().insets(40,0,0,0));
+		panel.add(drawGpsArrows, GBC.eop().insets(40,0,0,0));
 
 		// drawGpsArrowsFast
@@ -77,5 +87,12 @@
 		drawGpsArrowsFast.setSelected(Main.pref.getBoolean("draw.rawgps.alternatedirection"));
 		drawGpsArrowsFast.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
-		gui.display.add(drawGpsArrowsFast, GBC.eop().insets(60,0,0,0));
+		panel.add(drawGpsArrowsFast, GBC.eop().insets(60,0,0,0));
+
+		// drawGpsArrowsMinDist
+		drawGpsArrowsMinDist.setToolTipText(tr("Don't 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", 0)));
+		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));
 
 		// colorTracks
@@ -83,11 +100,18 @@
 		colorTracks.setToolTipText(tr("Choose the hue for the track color by the velocity at that point."));
 		colorTracks.setEnabled(drawRawGpsLines.isSelected());
-		gui.display.add(colorTracks, GBC.eop().insets(40,0,0,0));
+		panel.add(colorTracks, GBC.eop().insets(40,0,0,0));
 		
 		// largeGpsPoints
 		largeGpsPoints.setSelected(Main.pref.getBoolean("draw.rawgps.large"));
 		largeGpsPoints.setToolTipText(tr("Draw larger dots for the GPS points."));
-		gui.display.add(largeGpsPoints, GBC.eop().insets(20,0,0,0));
+		panel.add(largeGpsPoints, GBC.eop().insets(20,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 ));
+		gui.displaycontent.addTab(tr("GPS Points"), scrollpane);
+		panel = new JPanel(new GridBagLayout());
+		panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
+
 		// directionHint
 		directionHint.addActionListener(new ActionListener(){
@@ -103,5 +127,5 @@
 		directionHint.setToolTipText(tr("Draw direction hints for way segments."));
 		directionHint.setSelected(Main.pref.getBoolean("draw.segment.direction"));
-		gui.display.add(directionHint, GBC.eop().insets(20,0,0,0));
+		panel.add(directionHint, GBC.eop().insets(20,0,0,0));
 
 		// only interesting directions
@@ -109,35 +133,35 @@
 		interestingDirections.setSelected(Main.pref.getBoolean("draw.segment.relevant_directions_only"));
 		interestingDirections.setEnabled(directionHint.isSelected());
-		gui.display.add(interestingDirections, GBC.eop().insets(40,0,0,0));
+		panel.add(interestingDirections, GBC.eop().insets(40,0,0,0));
 		
 		// segment order number
 		segmentOrderNumber.setToolTipText(tr("Draw the order numbers of all segments within their way."));
 		segmentOrderNumber.setSelected(Main.pref.getBoolean("draw.segment.order_number"));
-		gui.display.add(segmentOrderNumber, GBC.eop().insets(20,0,0,0));
+		panel.add(segmentOrderNumber, GBC.eop().insets(20,0,0,0));
 		
 		// antialiasing
 		useAntialiasing.setToolTipText(tr("Apply antialiasing to the map view resulting in a smoother appearance."));
 		useAntialiasing.setSelected(Main.pref.getBoolean("mappaint.use-antialiasing"));
-		gui.display.add(useAntialiasing, GBC.eop().insets(20,0,0,0));
+		panel.add(useAntialiasing, GBC.eop().insets(20,0,0,0));
 		
 		// downloaded area
 		sourceBounds.setToolTipText(tr("Draw the boundaries of data loaded from the server."));
 		sourceBounds.setSelected(Main.pref.getBoolean("draw.data.downloaded_area", true));
-		gui.display.add(sourceBounds, GBC.eop().insets(20,0,0,0));
+		panel.add(sourceBounds, GBC.eop().insets(20,0,0,0));
 
 		// virtual nodes
 		virtualNodes.setToolTipText(tr("Draw virtual nodes in select mode for easy way modification."));
 		virtualNodes.setSelected(Main.pref.getInteger("mappaint.node.virtual-size", 8) != 0);
-		gui.display.add(virtualNodes, GBC.eop().insets(20,0,0,0));
+		panel.add(virtualNodes, GBC.eop().insets(20,0,0,0));
 
 		// background layers in inactive color
 		inactive.setToolTipText(tr("Draw the inactive data layers in a different color."));
 		inactive.setSelected(Main.pref.getBoolean("draw.data.inactive_color", true));
-		gui.display.add(inactive, GBC.eop().insets(20,0,0,0));
+		panel.add(inactive, GBC.eop().insets(20,0,0,0));
 
-		// Show splash screen on startup
-		showSplashScreen.setToolTipText(tr("Show splash screen at startup"));
-		showSplashScreen.setSelected(Main.pref.getBoolean("draw.splashscreen", true));
-		gui.display.add(showSplashScreen, GBC.eop().insets(20, 0, 0, 0));
+ 		panel.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
+ 		scrollpane = new JScrollPane(panel);
+ 		scrollpane.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
+ 		gui.displaycontent.addTab(tr("OSM Data"), scrollpane);
 	}
 
@@ -148,4 +172,5 @@
 		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());
 		Main.pref.put("draw.rawgps.large", largeGpsPoints.isSelected());
@@ -156,5 +181,4 @@
 		Main.pref.put("draw.data.inactive_color", inactive.isSelected());
 		Main.pref.put("mappaint.use-antialiasing", useAntialiasing.isSelected());
-		Main.pref.put("draw.splashscreen", showSplashScreen.isSelected());
 		int vn = Main.pref.getInteger("mappaint.node.virtual-size", 8);
 		if(virtualNodes.isSelected()) {	if (vn < 1) vn = 8; }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/LafPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/LafPreference.java	(revision 1164)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/LafPreference.java	(revision 1165)
@@ -5,9 +5,15 @@
 
 import java.awt.Component;
+import java.awt.GridBagLayout;
 
+import javax.swing.BorderFactory;
+import javax.swing.Box;
 import javax.swing.DefaultListCellRenderer;
+import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JLabel;
 import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
 import javax.swing.ListCellRenderer;
 import javax.swing.UIManager;
@@ -23,4 +29,7 @@
 	 */
 	private JComboBox lafCombo;
+	public JPanel panel = new JPanel(new GridBagLayout());
+	private JCheckBox showSplashScreen = new JCheckBox(tr("Show splash screen at startup"));
+	private JCheckBox showID = new JCheckBox(tr("Show object ID in selection lists"));
 
 	public void addGui(PreferenceDialog gui) {
@@ -56,11 +65,31 @@
 		lafCombo.addActionListener(gui.requireRestartAction);
 
-		gui.display.add(new JLabel(tr("Look and Feel")), GBC.std());
-		gui.display.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
-		gui.display.add(lafCombo, GBC.eol().fill(GBC.HORIZONTAL));
+		panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
+
+		// Show splash screen on startup
+		showSplashScreen.setToolTipText(tr("Show splash screen at startup"));
+		showSplashScreen.setSelected(Main.pref.getBoolean("draw.splashscreen", true));
+		panel.add(showSplashScreen, GBC.eop().insets(20, 0, 0, 0));
+
+		// Show ID in selection
+		showID.setToolTipText(tr("Show object ID in selection lists"));
+		showID.setSelected(Main.pref.getBoolean("osm-primitives.showid", false));
+		panel.add(showID, GBC.eop().insets(20, 0, 0, 0));
+
+		panel.add(Box.createVerticalGlue(), GBC.eol().insets(0, 20, 0, 0));
+
+		panel.add(new JLabel(tr("Look and Feel")), GBC.std().insets(20, 0, 0, 0));
+		panel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
+		panel.add(lafCombo, GBC.eol().fill(GBC.HORIZONTAL));
+
+		JScrollPane scrollpane = new JScrollPane(panel);
+		scrollpane.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
+		gui.displaycontent.addTab(tr("Look and Feel"), scrollpane);
 	}
 
 	public void ok() {
 		Main.pref.put("laf", ((LookAndFeelInfo)lafCombo.getSelectedItem()).getClassName());
+		Main.pref.put("draw.splashscreen", showSplashScreen.isSelected());
+		Main.pref.put("osm-primitives.showid", showID.isSelected());
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java	(revision 1164)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java	(revision 1165)
@@ -7,8 +7,10 @@
 import java.util.Locale;
 
+import javax.swing.Box;
 import javax.swing.DefaultListCellRenderer;
 import javax.swing.JComboBox;
 import javax.swing.JLabel;
 import javax.swing.JList;
+import javax.swing.JPanel;
 import javax.swing.ListCellRenderer;
 
@@ -53,7 +55,14 @@
 		langCombo.addActionListener(gui.requireRestartAction);
 
-		gui.display.add(new JLabel(tr("Language")), GBC.std());
-		gui.display.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
-		gui.display.add(langCombo, GBC.eol().fill(GBC.HORIZONTAL));
+		JPanel panel = null;
+		for(PreferenceSetting s : gui.settings)
+		{
+			if(s instanceof LafPreference)
+				panel = ((LafPreference)s).panel;
+		}
+		panel.add(new JLabel(tr("Language")), GBC.std().insets(20, 0, 0, 0));
+		panel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
+		panel.add(langCombo, GBC.eol().fill(GBC.HORIZONTAL));
+		panel.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
 	}
 
Index: trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java	(revision 1164)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java	(revision 1165)
@@ -44,4 +44,6 @@
 	public final JPanel map = createPreferenceTab("map", I18n.tr("Map Settings"), I18n.tr("Settings for the map projection and data interpretation."));
 	public final JPanel audio = createPreferenceTab("audio", I18n.tr("Audio Settings"), I18n.tr("Settings for the audio player and audio markers."));
+
+  public final javax.swing.JTabbedPane displaycontent = new javax.swing.JTabbedPane();
 
 	/**
@@ -111,4 +113,5 @@
 	public PreferenceDialog() {
 		super(JTabbedPane.LEFT, JTabbedPane.SCROLL_TAB_LAYOUT);
+		display.add(displaycontent, GBC.eol().fill(GBC.BOTH));
 		for (Iterator<PreferenceSetting> it = settings.iterator(); it.hasNext();) {
 			try {
@@ -122,8 +125,8 @@
 	static {
 		// order is important!
+		settings.add(new DrawingPreference());
+		settings.add(new ColorPreference());
 		settings.add(new LafPreference());
 		settings.add(new LanguagePreference());
-		settings.add(new DrawingPreference());
-		settings.add(new ColorPreference());
 		settings.add(new MapPaintPreference());
 		settings.add(new ServerAccessPreference());
