Index: /trunk/src/org/openstreetmap/josm/actions/UnselectAllAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UnselectAllAction.java	(revision 767)
+++ /trunk/src/org/openstreetmap/josm/actions/UnselectAllAction.java	(revision 768)
@@ -14,10 +14,22 @@
 
 	public UnselectAllAction() {
-		super(tr("Unselect All"),"unselectall", tr("Unselect all objects."), KeyEvent.VK_U, 0, true);
+		super(tr("Unselect All"), "unselectall", tr("Unselect all objects."),
+		        KeyEvent.VK_U, 0, true);
 
 		// Add extra shortcut C-S-a
 		Main.contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
-			KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK), tr("Unselect All"));
-    }
+		        KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_DOWN_MASK
+		                | KeyEvent.SHIFT_DOWN_MASK), tr("Unselect All"));
+
+		// Add extra shortcut ESCAPE
+		/*
+		 * FIXME: this isn't optimal. In a better world the mapmode actions
+		 * would be able to capture keyboard events and react accordingly. But
+		 * for now this is a reasonable approximation.
+		 */
+		Main.contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
+		        KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
+		        tr("Unselect All"));
+	}
 
 	public void actionPerformed(ActionEvent e) {
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 767)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 768)
@@ -54,5 +54,5 @@
 	 */
 	public DeleteAction(MapFrame mapFrame) {
-		super(tr("Delete"), 
+		super(tr("DeleteMode"), 
 				"delete", 
 				tr("Delete nodes or ways."), 
@@ -75,5 +75,9 @@
 	@Override public void actionPerformed(ActionEvent e) {
 		super.actionPerformed(e);
-		boolean ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;
+		doActionPerformed(e);
+	}
+
+	public void doActionPerformed(ActionEvent e) {
+	    boolean ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;
 		boolean alt = (e.getModifiers() & ActionEvent.ALT_MASK) != 0;
 
@@ -89,5 +93,5 @@
 
 		Main.map.repaint();
-	}
+    }
 
 	/**
Index: /trunk/src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 767)
+++ /trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 768)
@@ -277,3 +277,17 @@
 		return ColorHelper.html2color(colStr);
 	}
+
+	public int getInteger(String key, int def) {
+	    String v = get(key);
+	    if(null == v)
+	    	return def;
+	    
+	    try {
+	    	return Integer.parseInt(v);
+	    } catch(NumberFormatException e) {
+	    	// fall out
+	    }
+	    
+	    return def;
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 767)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 768)
@@ -9,4 +9,5 @@
 import java.awt.Point;
 import java.awt.Polygon;
+import java.awt.RenderingHints;
 import java.awt.Stroke;
 import java.awt.geom.GeneralPath;
@@ -17,4 +18,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.UnselectAllAction;
 import org.openstreetmap.josm.data.Preferences;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -77,4 +79,18 @@
     protected boolean showOrderNumber;
     
+	private boolean fillSelectedNode;
+
+	private boolean fillUnselectedNode;
+
+	private int selectedNodeRadius;
+
+	private int unselectedNodeRadius;
+
+	private int selectedNodeSize;
+
+	private int unselectedNodeSize;
+
+	private int defaultSegmentWidth = 2;
+
     public final static Color darkerblue = new Color(0,0,96);
     public final static Color darkblue = new Color(0,0,128);
@@ -126,5 +142,8 @@
             }
         } else {
-            drawNode(n, n.selected ? selectedColor : nodeColor);
+			if (n.selected)
+				drawNode(n, selectedColor, selectedNodeSize, selectedNodeRadius, fillSelectedNode);
+			else
+				drawNode(n, nodeColor, unselectedNodeSize, unselectedNodeRadius, fillUnselectedNode);
         }
     }
@@ -143,5 +162,5 @@
 
         Color colour = untaggedColor;
-        int width = 2;
+		int width = defaultSegmentWidth;
         int realWidth = 0; //the real width of the element in meters 
         boolean dashed = false;
@@ -326,12 +345,17 @@
      * @param color The color of the node.
      */
-    public void drawNode(Node n, Color color) {
-        if(isZoomOk(null)) {
-            Point p = nc.getPoint(n.eastNorth);
-            if ((p.x < 0) || (p.y < 0) || (p.x > nc.getWidth()) || (p.y > nc.getHeight())) return;
-            g.setColor(color);
-            g.drawRect(p.x-1, p.y-1, 2, 2);
-        }
-    }
+    public void drawNode(Node n, Color color, int size, int radius, boolean fill) {
+		if (isZoomOk(null) && size > 1) {
+			Point p = nc.getPoint(n.eastNorth);
+			if ((p.x < 0) || (p.y < 0) || (p.x > nc.getWidth())
+			        || (p.y > nc.getHeight()))
+				return;
+			g.setColor(color);
+			if (fill)
+				g.fillRect(p.x - radius, p.y - radius, size, size);
+			else
+				g.drawRect(p.x - radius, p.y - radius, size, size);
+		}
+	}
 
     // NW 111106 Overridden from SimplePaintVisitor in josm-1.4-nw1
@@ -353,16 +377,27 @@
         fillAreas = Main.pref.getBoolean("mappaint.fillareas", true);
 
-        /* XXX - there must be a better way to get a bounded Integer pref! */
-        try {
-            fillAlpha = Integer.valueOf(Main.pref.get("mappaint.fillalpha", "50"));
-            if (fillAlpha < 0) {
-                fillAlpha = 0;
-            }
-            if (fillAlpha > 255) {
-                fillAlpha = 255;
-            }
-        } catch (NumberFormatException nfe) {
-            fillAlpha = 50;
-        }
+		selectedNodeRadius = Main.pref.getInteger("mappaint.node.selected-size",
+		        5) / 2;
+		selectedNodeSize = selectedNodeRadius * 2;
+		unselectedNodeRadius = Main.pref.getInteger(
+		        "mappaint.node.unselected-size", 3) / 2;
+		unselectedNodeSize = unselectedNodeRadius * 2;
+
+		defaultSegmentWidth = Main.pref.getInteger(
+		        "mappaint.segment.default-width", 2);
+
+		fillSelectedNode = Main.pref.getBoolean("mappaint.node.fill-selected",
+		        true);
+		fillUnselectedNode = Main.pref.getBoolean(
+		        "mappaint.node.fill-unselected", false);
+
+		((Graphics2D)g)
+		        .setRenderingHint(
+		                RenderingHints.KEY_ANTIALIASING,
+		                Main.pref.getBoolean("mappaint.use-antialiasing", true) ? RenderingHints.VALUE_ANTIALIAS_ON
+		                        : RenderingHints.VALUE_ANTIALIAS_OFF);
+
+		fillAlpha = Math.min(255, Math.max(0, Integer.valueOf(Main.pref
+		        .getInteger("mappaint.fillalpha", 50))));
 
         Collection<Way> noAreaWays = new LinkedList<Way>();
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 767)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 768)
@@ -8,18 +8,19 @@
 import java.awt.Point;
 import java.awt.Rectangle;
+import java.awt.RenderingHints;
 import java.awt.Stroke;
 import java.awt.geom.GeneralPath;
-
 import java.util.Iterator;
+
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Preferences;
 import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.NavigatableComponent;
-import org.openstreetmap.josm.tools.ColorHelper;
 
 /**
@@ -64,4 +65,18 @@
 	protected boolean showOrderNumber;
 	
+	private boolean fillSelectedNode;
+
+	private boolean fillUnselectedNode;
+
+	private int selectedNodeRadius;
+
+	private int unselectedNodeRadius;
+
+	private int selectedNodeSize;
+
+	private int unselectedNodeSize;
+
+	private int defaultSegmentWidth = 2;
+
 	/**
 	 * Draw subsequent segments of same color as one Path
@@ -85,4 +100,25 @@
 		showOrderNumber = Main.pref.getBoolean("draw.segment.order_number");
 		
+		selectedNodeRadius = Main.pref.getInteger("mappaint.node.selected-size",
+		        5) / 2;
+		selectedNodeSize = selectedNodeRadius * 2;
+		unselectedNodeRadius = Main.pref.getInteger(
+		        "mappaint.node.unselected-size", 3) / 2;
+		unselectedNodeSize = unselectedNodeRadius * 2;
+
+		defaultSegmentWidth = Main.pref.getInteger(
+		        "mappaint.segment.default-width", 2);
+
+		fillSelectedNode = Main.pref.getBoolean("mappaint.node.fill-selected",
+		        true);
+		fillUnselectedNode = Main.pref.getBoolean(
+		        "mappaint.node.fill-unselected", false);
+
+		((Graphics2D)g)
+		        .setRenderingHint(
+		                RenderingHints.KEY_ANTIALIASING,
+		                Main.pref.getBoolean("mappaint.use-antialiasing", true) ? RenderingHints.VALUE_ANTIALIAS_ON
+		                        : RenderingHints.VALUE_ANTIALIAS_OFF);
+
 		// draw tagged ways first, then untagged ways. takes
 		// time to iterate through list twice, OTOH does not
@@ -121,12 +157,10 @@
 		if (n.incomplete) return;
 
-		Color color = null;
 		if (inactive)
-			color = inactiveColor;
+			drawNode(n, inactiveColor, unselectedNodeSize, unselectedNodeRadius, fillUnselectedNode);
 		else if (n.selected)
-			color = selectedColor;
+			drawNode(n, selectedColor, selectedNodeSize, selectedNodeRadius, fillSelectedNode);
 		else
-			color = nodeColor;
-		drawNode(n, color);
+			drawNode(n, nodeColor, unselectedNodeSize, unselectedNodeRadius, fillUnselectedNode);
 	}
 
@@ -235,16 +269,16 @@
 	 * @param color The color of the node.
 	 */
-	public void drawNode(Node n, Color color) {
-		Point p = nc.getPoint(n.eastNorth);
-        if ((p.x < 0) || (p.y < 0) || (p.x > nc.getWidth()) || (p.y > nc.getHeight())) return;
-
-        g.setColor(color);
-
-        if (n.tagged) {
-            g.drawRect(p.x, p.y, 0, 0);
-            g.drawRect(p.x-2, p.y-2, 4, 4);
-        } else {
-            g.drawRect(p.x-1, p.y-1, 2, 2);
-        }
+	public void drawNode(Node n, Color color, int size, int radius, boolean fill) {
+		if (size > 1) {
+			Point p = nc.getPoint(n.eastNorth);
+			if ((p.x < 0) || (p.y < 0) || (p.x > nc.getWidth())
+			        || (p.y > nc.getHeight()))
+				return;
+			g.setColor(color);
+			if (fill)
+				g.fillRect(p.x - radius, p.y - radius, size, size);
+			else
+				g.drawRect(p.x - radius, p.y - radius, size, size);
+		}
 	}
 
Index: /trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 767)
+++ /trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 768)
@@ -15,12 +15,12 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.AlignInRectangleAction;
-import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.actions.AboutAction;
 import org.openstreetmap.josm.actions.AlignInCircleAction;
 import org.openstreetmap.josm.actions.AlignInLineAction;
+import org.openstreetmap.josm.actions.AlignInRectangleAction;
 import org.openstreetmap.josm.actions.AutoScaleAction;
 import org.openstreetmap.josm.actions.CombineWayAction;
 import org.openstreetmap.josm.actions.CopyAction;
+import org.openstreetmap.josm.actions.DeleteAction;
 import org.openstreetmap.josm.actions.DownloadAction;
 import org.openstreetmap.josm.actions.DuplicateAction;
@@ -29,4 +29,5 @@
 import org.openstreetmap.josm.actions.HelpAction;
 import org.openstreetmap.josm.actions.JoinNodeWayAction;
+import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.actions.MergeNodesAction;
 import org.openstreetmap.josm.actions.NewAction;
@@ -44,10 +45,12 @@
 import org.openstreetmap.josm.actions.UnselectAllAction;
 import org.openstreetmap.josm.actions.UploadAction;
+import org.openstreetmap.josm.actions.ZoomInAction;
+import org.openstreetmap.josm.actions.ZoomOutAction;
 import org.openstreetmap.josm.actions.audio.AudioBackAction;
+import org.openstreetmap.josm.actions.audio.AudioFasterAction;
 import org.openstreetmap.josm.actions.audio.AudioFwdAction;
 import org.openstreetmap.josm.actions.audio.AudioNextAction;
 import org.openstreetmap.josm.actions.audio.AudioPlayPauseAction;
 import org.openstreetmap.josm.actions.audio.AudioPrevAction;
-import org.openstreetmap.josm.actions.audio.AudioFasterAction;
 import org.openstreetmap.josm.actions.audio.AudioSlowerAction;
 import org.openstreetmap.josm.actions.search.SearchAction;
@@ -79,4 +82,5 @@
 	public final JosmAction copy = new CopyAction();
 	public final JosmAction paste = new PasteAction();
+	public final JosmAction delete = new DeleteAction();
 	public final JosmAction pasteTags = new PasteTagsAction(copy); 
 	public final JosmAction duplicate = new DuplicateAction(); 
@@ -154,4 +158,6 @@
 		current = editMenu.add(copy);
 		current.setAccelerator(copy.shortCut);
+		current = editMenu.add(delete);
+		current.setAccelerator(delete.shortCut);
 		current = editMenu.add(paste);
 		current.setAccelerator(paste.shortCut);
@@ -180,6 +186,12 @@
         }
         viewMenu.addSeparator();
-
-        // TODO move code to an "action" like the others?
+        JosmAction a = new ZoomOutAction();
+		viewMenu.add(a).setAccelerator(a.shortCut);
+		a = new ZoomInAction();
+		viewMenu.add(a).setAccelerator(a.shortCut);
+
+		viewMenu.addSeparator();
+
+		// TODO move code to an "action" like the others?
         final JCheckBoxMenuItem wireframe = new JCheckBoxMenuItem(tr("Wireframe view"));
         wireframe.setSelected(Main.pref.getBoolean("draw.wireframe", true));     
Index: /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 767)
+++ /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 768)
@@ -110,4 +110,6 @@
 	 */
 	public Point getPoint(EastNorth p) {
+		if(null == p)
+			return new Point();
 		double x = (p.east()-center.east())/scale + getWidth()/2;
 		double y = (center.north()-p.north())/scale + getHeight()/2;
Index: /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 767)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 768)
@@ -187,12 +187,20 @@
 					}
 				});
-				fc.showOpenDialog(Main.parent);
-				File sel = fc.getSelectedFile();
-				if (!fc.getCurrentDirectory().getAbsolutePath().equals(dir))
-					Main.pref.put("markers.lastaudiodirectory", fc.getCurrentDirectory().getAbsolutePath());
-				if (sel == null)
-					return;
-				importAudio(sel);
-				Main.map.repaint();
+				fc.setMultiSelectionEnabled(true);
+				if(fc.showOpenDialog(Main.parent) == JFileChooser.APPROVE_OPTION) {
+					if (!fc.getCurrentDirectory().getAbsolutePath().equals(dir))
+						Main.pref.put("markers.lastaudiodirectory", fc
+								.getCurrentDirectory().getAbsolutePath());
+					
+					// FIXME: properly support multi-selection here. 
+					// Calling importAudio several times just creates N maker layers, which
+					// is sub-optimal.
+					File sel[] = fc.getSelectedFiles();
+					if(sel != null)
+						for (int i = 0; i < sel.length; i++) 
+							importAudio(sel[i]);
+					
+					Main.map.repaint();
+				}
 			}
 		});
