Index: src/org/openstreetmap/josm/Main.java
===================================================================
--- src/org/openstreetmap/josm/Main.java	(revision 99)
+++ src/org/openstreetmap/josm/Main.java	(revision 100)
@@ -98,5 +98,8 @@
 						Main.main.editLayer().listenerCommands.add(redoUndoListener);
 				}
-				public void layerRemoved(final Layer oldLayer) {}
+				public void layerRemoved(final Layer oldLayer) {
+					if (oldLayer instanceof OsmDataLayer)
+						Main.main.editLayer().listenerCommands.add(redoUndoListener);
+				}
 			});
 			if (map.mapView.editLayer != null)
@@ -110,14 +113,9 @@
 	 */
 	public final void removeLayer(final Layer layer) {
-		final Collection<Layer> allLayers = map.mapView.getAllLayers();
-		if (allLayers.size() == 1 && allLayers.iterator().next() == layer) {
-			Main.map.setVisible(false);
+		map.mapView.removeLayer(layer);
+		if (layer instanceof OsmDataLayer)
+			ds = new DataSet();
+		if (map.mapView.getAllLayers().isEmpty())
 			setMapFrame(null);
-			ds = new DataSet();
-		} else {
-			map.mapView.removeLayer(layer);
-			if (layer instanceof OsmDataLayer)
-				ds = new DataSet();
-		}
 	}
 	public Main() {
Index: src/org/openstreetmap/josm/actions/DownloadAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 99)
+++ src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 100)
@@ -10,4 +10,6 @@
 import java.awt.event.KeyEvent;
 import java.awt.event.KeyListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
 import java.io.IOException;
 import java.util.Collection;
@@ -17,4 +19,5 @@
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
+import javax.swing.JDialog;
 import javax.swing.JLabel;
 import javax.swing.JOptionPane;
@@ -283,7 +286,17 @@
 		Bookmark b;
 		do {
-			int r = JOptionPane.showConfirmDialog(Main.parent, dlg, "Choose an area", 
-					JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
-			if (r != JOptionPane.OK_OPTION)
+			final JOptionPane pane = new JOptionPane(dlg, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
+			final JDialog panedlg = pane.createDialog(Main.parent, "Choose an area");
+			bookmarks.addMouseListener(new MouseAdapter(){
+				@Override public void mouseClicked(MouseEvent e) {
+	                if (e.getClickCount() >= 2) {
+	    				pane.setValue(JOptionPane.OK_OPTION);
+	    				panedlg.setVisible(false);
+	                }
+                }
+			});
+			panedlg.setVisible(true);
+			Object answer = pane.getValue();
+			if (answer == null || answer == JOptionPane.UNINITIALIZED_VALUE || (answer instanceof Integer && (Integer)answer != JOptionPane.OK_OPTION))
 				return;
 			b = readBookmark();
Index: src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java	(revision 99)
+++ src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java	(revision 100)
@@ -114,5 +114,5 @@
 			}
 
-			c = new SequenceCommand(cmds);
+			c = new SequenceCommand("Add Node into Segment", cmds);
 		}
 		Main.main.editLayer().add(c);
Index: src/org/openstreetmap/josm/actions/mapmode/AddWayAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/AddWayAction.java	(revision 99)
+++ src/org/openstreetmap/josm/actions/mapmode/AddWayAction.java	(revision 100)
@@ -88,4 +88,10 @@
 				way = w;
 				Main.ds.setSelected(way);
+				for (Segment seg : way.segments) {
+					if (seg.incomplete) {
+						JOptionPane.showMessageDialog(Main.parent, "Warning: This way is incomplete. Try to download it, before adding segments.");
+						return;
+					}
+				}
 				return;
 			}
@@ -128,6 +134,14 @@
 			return null;
 
-		if (selection.size() == 1 && selection.iterator().next() instanceof Way)
-			return (Way)selection.iterator().next();
+		if (selection.size() == 1 && selection.iterator().next() instanceof Way) {
+			Way way = (Way)selection.iterator().next();
+			for (Segment seg : way.segments) {
+				if (seg.incomplete) {
+					JOptionPane.showMessageDialog(Main.parent, "Warning: This way is incomplete. Try to download it, before adding segments.");
+					break;
+				}
+			}
+			return way;
+		}
 
 		HashSet<Segment> segmentSet = new HashSet<Segment>();
@@ -220,7 +234,5 @@
 		Way w = new Way();
 		w.segments.addAll(sortedSegments);
-
-		if (way != null)
-			Main.main.editLayer().add(new AddCommand(way));
+		Main.main.editLayer().add(new AddCommand(w));
 		return w;
 	}
Index: src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 99)
+++ src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 100)
@@ -4,13 +4,22 @@
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.Map.Entry;
 
 import javax.swing.JOptionPane;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.DeleteCommand;
+import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Segment;
+import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.visitor.CollectBackReferencesVisitor;
 import org.openstreetmap.josm.gui.MapFrame;
@@ -115,4 +124,7 @@
 	 * inform the user and do not delete.
 	 * 
+	 * If deleting a node which is part of exactly two segments, and both segments
+	 * have no conflicting keys, join them and remove the node.
+	 * 
 	 * @param selection The objects to delete.
 	 * @param msgBox Whether a message box for errors should be shown
@@ -124,5 +136,11 @@
 			osm.visit(v);
 			if (!selection.containsAll(v.data)) {
-				if (msgBox) {
+				if (osm instanceof Node) {
+					String reason = deleteNodeAndJoinSegment((Node)osm);
+					if (reason != null && msgBox) {
+						JOptionPane.showMessageDialog(Main.parent, "Cannot delete node. "+reason);
+						return;
+					}
+				} else if (msgBox) {
 					JOptionPane.showMessageDialog(Main.parent, "This object is in use.");
 					return;
@@ -136,3 +154,42 @@
 			Main.main.editLayer().add(new DeleteCommand(del));
 	}
+
+	private String deleteNodeAndJoinSegment(Node n) {
+		ArrayList<Segment> segs = new ArrayList<Segment>(2);
+		for (Segment s : Main.ds.segments) {
+			if (!s.deleted && (s.from == n || s.to == n)) {
+				if (segs.size() > 1)
+					return "Used by more than two segments.";
+				segs.add(s);
+			}
+		}
+		if (segs.size() != 2)
+			return "Used by only one segment.";
+		Segment seg1 = segs.get(0);
+		Segment seg2 = segs.get(1);
+		if (seg1.from == seg2.to) {
+			Segment s = seg1;
+			seg1 = seg2;
+			seg2 = s;
+		}
+		for (Way w : Main.ds.ways)
+			if (!w.deleted && (w.segments.contains(seg1) || w.segments.contains(seg2)))
+				return "Used in a way.";
+		if (seg1.from == seg2.from || seg1.to == seg2.to)
+			return "Wrong direction of segments.";
+		for (Entry<String, String> e : seg1.entrySet())
+			if (seg2.keySet().contains(e.getKey()) && !seg2.get(e.getKey()).equals(e.getValue()))
+				return "Conflicting keys";
+		Segment s = new Segment(seg1);
+		s.to = seg2.to;
+		if (s.keys == null)
+			s.keys = seg2.keys;
+		else if (seg2.keys != null)
+			s.keys.putAll(seg2.keys);
+		Command[] cmds = new Command[]{
+			new ChangeCommand(seg1, s), 
+			new DeleteCommand(Arrays.asList(new OsmPrimitive[]{n, seg2}))};
+		Main.main.editLayer().add(new SequenceCommand("Delete Node", Arrays.asList(cmds)));
+		return null;
+    }
 }
Index: src/org/openstreetmap/josm/command/SequenceCommand.java
===================================================================
--- src/org/openstreetmap/josm/command/SequenceCommand.java	(revision 99)
+++ src/org/openstreetmap/josm/command/SequenceCommand.java	(revision 100)
@@ -19,4 +19,5 @@
 	 */
 	private Command[] sequence;
+	private final String name;
 
 	/**
@@ -24,5 +25,6 @@
 	 * @param sequenz The sequenz that should be executed.
 	 */
-	public SequenceCommand(Collection<Command> sequenz) {
+	public SequenceCommand(String name, Collection<Command> sequenz) {
+		this.name = name;
 		this.sequence = new Command[sequenz.size()];
 		this.sequence = sequenz.toArray(this.sequence);
@@ -45,5 +47,5 @@
 
 	@Override public MutableTreeNode description() {
-		DefaultMutableTreeNode root = new DefaultMutableTreeNode("Sequence");
+		DefaultMutableTreeNode root = new DefaultMutableTreeNode("Sequence: "+name);
 		for (Command c : sequence)
 			root.add(c.description());
Index: src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- src/org/openstreetmap/josm/data/Preferences.java	(revision 99)
+++ src/org/openstreetmap/josm/data/Preferences.java	(revision 100)
@@ -128,4 +128,5 @@
 		properties.put("projection", "org.openstreetmap.josm.data.projection.Epsg4326");
 		properties.put("osm-server.url", "http://www.openstreetmap.org/api");
+		properties.put("color.background", ColorHelper.color2html(Color.black));
 		properties.put("color.node", ColorHelper.color2html(Color.red));
 		properties.put("color.segment", ColorHelper.color2html(SimplePaintVisitor.darkgreen));
@@ -134,4 +135,5 @@
 		properties.put("color.selected", ColorHelper.color2html(Color.white));
 		properties.put("color.gps point", ColorHelper.color2html(Color.gray));
+		properties.put("color.conflict", ColorHelper.color2html(Color.gray));
 		save();
 	}
Index: src/org/openstreetmap/josm/data/osm/Node.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/Node.java	(revision 99)
+++ src/org/openstreetmap/josm/data/osm/Node.java	(revision 100)
@@ -48,5 +48,5 @@
 
 	public int compareTo(OsmPrimitive o) {
-	    return o instanceof Node ? Long.valueOf(id).compareTo(o.id) : -1;
+	    return o instanceof Node ? Long.valueOf(id).compareTo(o.id) : 1;
     }
 }
Index: src/org/openstreetmap/josm/data/osm/Segment.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/Segment.java	(revision 99)
+++ src/org/openstreetmap/josm/data/osm/Segment.java	(revision 100)
@@ -88,5 +88,5 @@
 
 	public int compareTo(OsmPrimitive o) {
-		return o instanceof Segment ? Long.valueOf(id).compareTo(o.id) : (o instanceof Node ? 1 : -1);
+		return o instanceof Segment ? Long.valueOf(id).compareTo(o.id) : (o instanceof Node ? -1 : 1);
 	}
 }
Index: src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/Way.java	(revision 99)
+++ src/org/openstreetmap/josm/data/osm/Way.java	(revision 100)
@@ -48,5 +48,5 @@
 
 	public int compareTo(OsmPrimitive o) {
-	    return o instanceof Way ? Long.valueOf(id).compareTo(o.id) : 1;
+	    return o instanceof Way ? Long.valueOf(id).compareTo(o.id) : -1;
     }
 }
Index: src/org/openstreetmap/josm/data/osm/visitor/CollectBackReferencesVisitor.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/CollectBackReferencesVisitor.java	(revision 99)
+++ src/org/openstreetmap/josm/data/osm/visitor/CollectBackReferencesVisitor.java	(revision 100)
@@ -21,5 +21,5 @@
 
 	private final DataSet ds;
-	
+
 	/**
 	 * The result list of primitives stored here.
@@ -35,14 +35,14 @@
 		this.ds = ds;
 	}
-	
+
 	public void visit(Node n) {
-		for (Way t : ds.ways) {
-			if (t.deleted)
+		for (Way w : ds.ways) {
+			if (w.deleted)
 				continue;
-			for (Segment ls : t.segments) {
+			for (Segment ls : w.segments) {
 				if (ls.incomplete)
 					continue;
 				if (ls.from == n || ls.to == n) {
-					data.add(t);
+					data.add(w);
 					break;
 				}
Index: src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java	(revision 99)
+++ src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java	(revision 100)
@@ -9,7 +9,7 @@
 
 import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.Segment;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Segment;
 import org.openstreetmap.josm.data.osm.Way;
 
@@ -116,4 +116,26 @@
 	}
 
+	private <T extends OsmPrimitive> void cloneFromExceptIncomplete(T myOsm, T otherOsm) {
+		if (!(myOsm instanceof Way))
+			myOsm.cloneFrom(otherOsm);
+		else {
+			Way my = (Way)myOsm;
+			Way other = (Way)otherOsm;
+			HashMap<Long, Segment> copy = new HashMap<Long, Segment>();
+			for (Segment s : my.segments)
+				copy.put(s.id, s);
+			my.cloneFrom(other);
+			my.segments.clear();
+			for (Segment s : other.segments) {
+				Segment myS = copy.get(s.id);
+				if (s.incomplete && myS != null && !myS.incomplete) {
+					mergedSegments.put(s, myS);
+					my.segments.add(myS);
+				} else
+					my.segments.add(s);
+			}
+		}
+    }
+
 	/**
 	 * Merge the way if id matches or if all segments matches and the
@@ -144,6 +166,16 @@
 			}
 			if (!same) {
+				HashMap<Long, Segment> copy = new HashMap<Long, Segment>();
+				for (Segment s : my.segments)
+					copy.put(s.id, s);
 				my.segments.clear();
-				my.segments.addAll(other.segments);
+				for (Segment s : other.segments) {
+					Segment myS = copy.get(s.id);
+					if (s.incomplete && myS != null && !myS.incomplete) {
+						mergedSegments.put(s, myS);
+						my.segments.add(myS);
+					} else
+						my.segments.add(s);
+				}
 				my.modified = other.modified;
 			}
@@ -273,5 +305,5 @@
 				} else if (!my.modified && !other.modified) {
 					if (d1.before(d2)) {
-						my.cloneFrom(other);
+						cloneFromExceptIncomplete(my, other);
 						if (merged != null)
 							merged.put(other, my);
@@ -283,5 +315,5 @@
 							merged.put(other, my);
 					} else {
-						my.cloneFrom(other);
+						cloneFromExceptIncomplete(my, other);
 						if (merged != null)
 							merged.put(other, my);
Index: src/org/openstreetmap/josm/data/osm/visitor/NameVisitor.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/NameVisitor.java	(revision 99)
+++ src/org/openstreetmap/josm/data/osm/visitor/NameVisitor.java	(revision 100)
@@ -43,5 +43,5 @@
 		if (name == null) {
 			if (ls.incomplete)
-				name = ls.id == 0 ? "new" : ""+ls.id;
+				name = ls.id == 0 ? "new" : ""+ls.id+" (unknown)";
 			else
 				name = (ls.id==0?"":ls.id+" ")+"("+ls.from.coor.lat()+","+ls.from.coor.lon()+") -> ("+ls.to.coor.lat()+","+ls.to.coor.lon()+")";
@@ -71,4 +71,5 @@
 		if (name == null) {
 			AllNodesVisitor.getAllNodes(w.segments);
+			boolean incomplete = false;
 			Set<Node> nodes = new HashSet<Node>();
 			for (Segment ls : w.segments) {
@@ -76,7 +77,10 @@
 					nodes.add(ls.from);
 					nodes.add(ls.to);
-				}
+				} else
+					incomplete = true;
 			}
-			name = "("+nodes.size()+" nodes)";
+			name = nodes.size()+" nodes";
+			if (incomplete)
+				name += " (incomplete)";
 		}
 		icon = ImageProvider.get("data", "way");
Index: src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 99)
+++ src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 100)
@@ -116,6 +116,8 @@
 	public static Color getPreferencesColor(String colName, Color def) {
 		String colStr = Main.pref.get("color."+colName);
-		if (colStr.equals(""))
+		if (colStr.equals("")) {
+			Main.pref.put("color."+colName, ColorHelper.color2html(def));
 			return def;
+		}
 		return ColorHelper.html2color(colStr);
 	}
Index: src/org/openstreetmap/josm/gui/MapMover.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapMover.java	(revision 99)
+++ src/org/openstreetmap/josm/gui/MapMover.java	(revision 100)
@@ -32,4 +32,5 @@
 	private Cursor oldCursor;
 
+	private boolean movementInPlace = false;
 	
 	/**
@@ -84,4 +85,7 @@
 	 */
 	private void startMovement(MouseEvent e) {
+		if (movementInPlace)
+			return;
+		movementInPlace = true;
 		mousePosMove = nc.getEastNorth(e.getX(), e.getY());
 		oldCursor = nc.getCursor();
@@ -93,4 +97,7 @@
 	 */
 	private void endMovement() {
+		if (!movementInPlace)
+			return;
+		movementInPlace = false;
 		if (oldCursor != null)
 			nc.setCursor(oldCursor);
Index: src/org/openstreetmap/josm/gui/MapStatus.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapStatus.java	(revision 99)
+++ src/org/openstreetmap/josm/gui/MapStatus.java	(revision 100)
@@ -12,6 +12,4 @@
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseMotionListener;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
 import java.util.Collection;
 import java.util.ConcurrentModificationException;
@@ -79,8 +77,10 @@
 		 */
 		private Popup popup;
-		/**
-		 * Signals the collector to shut down on next event.
-		 */
-		boolean exitCollector = false;
+		
+		private MapFrame parent;
+		
+		public Collector(MapFrame parent) {
+			this.parent = parent;
+		}
 		
 		/**
@@ -95,6 +95,6 @@
 					ms.mousePos = mouseState.mousePos;
 				}
-				if (exitCollector)
-					return;
+				if (parent != Main.map)
+					return; // exit, if new parent.
 				if ((ms.modifiers & MouseEvent.CTRL_DOWN_MASK) != 0 || ms.mousePos == null)
 					continue; // freeze display when holding down ctrl
@@ -218,5 +218,5 @@
 		
 		// The background thread
-		final Collector collector = new Collector();
+		final Collector collector = new Collector(mapFrame);
 		new Thread(collector).start();
 		
@@ -233,16 +233,4 @@
 			}
 		}, AWTEvent.KEY_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK);
-		
-		// listen for shutdowns to cancel the background thread
-		mapFrame.addPropertyChangeListener("visible", new PropertyChangeListener(){
-			public void propertyChange(PropertyChangeEvent evt) {
-				if (evt.getNewValue() == Boolean.FALSE) {
-					collector.exitCollector = true;
-					synchronized (collector) {
-						collector.notify();
-					}
-				}
-			}
-		});
 	}
 }
Index: src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapView.java	(revision 99)
+++ src/org/openstreetmap/josm/gui/MapView.java	(revision 100)
@@ -28,4 +28,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
+import org.openstreetmap.josm.data.osm.visitor.SimplePaintVisitor;
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -85,13 +86,13 @@
 	
 	private final class Scaler extends JSlider implements PropertyChangeListener, ChangeListener {
-		boolean hovered = false;
+		boolean clicked = false;
 		public Scaler() {
 			super(0, 20);
 			addMouseListener(new MouseAdapter(){
-				@Override public void mouseEntered(MouseEvent e) {
-	                hovered = true;
+				@Override public void mousePressed(MouseEvent e) {
+	                clicked = true;
                 }
-				@Override public void mouseExited(MouseEvent e) {
-	                hovered = false;
+				@Override public void mouseReleased(MouseEvent e) {
+	                clicked = false;
                 }
 			});
@@ -104,5 +105,5 @@
         }
 		public void stateChanged(ChangeEvent e) {
-			if (!hovered)
+			if (!clicked)
 				return;
 			EastNorth pos = world;
@@ -206,5 +207,5 @@
 	 */
 	@Override public void paint(Graphics g) {
-		g.setColor(Color.BLACK);
+		g.setColor(SimplePaintVisitor.getPreferencesColor("background", Color.BLACK));
 		g.fillRect(0, 0, getWidth(), getHeight());
 
Index: src/org/openstreetmap/josm/gui/PreferenceDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/PreferenceDialog.java	(revision 99)
+++ src/org/openstreetmap/josm/gui/PreferenceDialog.java	(revision 100)
@@ -315,7 +315,7 @@
 		warning.setFont(warning.getFont().deriveFont(Font.ITALIC));
 		con.add(warning, GBC.eop().fill(GBC.HORIZONTAL));
-		con.add(new JLabel("WMS server base url (everything except bbox-parameter)"), GBC.eol());
-		con.add(wmsServerBaseUrl, GBC.eop().fill(GBC.HORIZONTAL));
-		con.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.VERTICAL));
+		//con.add(new JLabel("WMS server base url (everything except bbox-parameter)"), GBC.eol());
+		//con.add(wmsServerBaseUrl, GBC.eop().fill(GBC.HORIZONTAL));
+		//con.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.VERTICAL));
 		con.add(new JLabel("CSV import specification (empty: read from first line in data)"), GBC.eol());
 		con.add(csvImportString, GBC.eop().fill(GBC.HORIZONTAL));
Index: src/org/openstreetmap/josm/gui/SelectionManager.java
===================================================================
--- src/org/openstreetmap/josm/gui/SelectionManager.java	(revision 99)
+++ src/org/openstreetmap/josm/gui/SelectionManager.java	(revision 100)
@@ -123,5 +123,5 @@
 	 * @param eventSource The emitter of the mouse events.
 	 */
-	public void register(Component eventSource) {
+	public void register(NavigatableComponent eventSource) {
 		eventSource.addMouseListener(this);
 		eventSource.addMouseMotionListener(this);
@@ -134,4 +134,12 @@
 				mousePosStart = null;
 				mousePos = null;
+            }
+        });
+        eventSource.addPropertyChangeListener("scale", new PropertyChangeListener(){
+			public void propertyChange(PropertyChangeEvent evt) {
+				if (mousePosStart != null) {
+					paintRect();
+					mousePos = mousePosStart = null;
+				}
             }
         });
Index: src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java	(revision 99)
+++ src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java	(revision 100)
@@ -36,5 +36,8 @@
 					Main.main.editLayer().listenerCommands.add(CommandStackDialog.this);
 			}
-			public void layerRemoved(Layer oldLayer) {}
+			public void layerRemoved(Layer oldLayer) {
+				if (oldLayer instanceof OsmDataLayer)
+					Main.main.editLayer().listenerCommands.remove(CommandStackDialog.this);
+			}
 		});
 		if (mapFrame.mapView.editLayer != null)
@@ -69,4 +72,6 @@
 
 	private void buildList() {
+		if (Main.map == null || Main.map.mapView == null || Main.map.mapView.editLayer == null)
+			return;
 		Collection<Command> commands = Main.main.editLayer().commands;
 		DefaultMutableTreeNode root = new DefaultMutableTreeNode();
@@ -74,4 +79,5 @@
 			root.add(c.description());
 		treeModel.setRoot(root);
+		tree.scrollRowToVisible(treeModel.getChildCount(root)-1);
 	}
 
Index: src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 99)
+++ src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 100)
@@ -140,5 +140,5 @@
 	 */
 	public void paintConflicts(final Graphics g, final NavigatableComponent nc) {
-		Color preferencesColor = SimplePaintVisitor.getPreferencesColor("conflict", Color.GRAY);
+		Color preferencesColor = SimplePaintVisitor.getPreferencesColor("conflict", Color.gray);
 		if (preferencesColor.equals(Color.BLACK))
 			return;
Index: src/org/openstreetmap/josm/gui/dialogs/LayerList.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/LayerList.java	(revision 99)
+++ src/org/openstreetmap/josm/gui/dialogs/LayerList.java	(revision 100)
@@ -145,4 +145,6 @@
 		layers.addListSelectionListener(new ListSelectionListener(){
 			public void valueChanged(ListSelectionEvent e) {
+				if (layers.getModel().getSize() == 0)
+					return;
 				if (layers.getSelectedIndex() == -1)
 					layers.setSelectedIndex(e.getFirstIndex());
Index: src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 99)
+++ src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 100)
@@ -11,9 +11,6 @@
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-import java.awt.event.WindowEvent;
-import java.awt.event.WindowFocusListener;
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
 import java.util.TreeMap;
@@ -93,13 +90,11 @@
 		p.add(combo, BorderLayout.CENTER);
 
-		final JOptionPane optionPane = new JOptionPane(p, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
+		final JOptionPane optionPane = new JOptionPane(p, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION){
+			@Override public void selectInitialValue() {
+				combo.requestFocusInWindow();
+				combo.getEditor().selectAll();
+			}
+		};
 		final JDialog dlg = optionPane.createDialog(Main.parent, "Change values?");
-		dlg.addWindowFocusListener(new WindowFocusListener(){
-			public void windowGainedFocus(WindowEvent e) {
-				combo.requestFocusInWindow();
-			}
-			public void windowLostFocus(WindowEvent e) {
-			}
-		});
 		combo.getEditor().addActionListener(new ActionListener(){
 			public void actionPerformed(ActionEvent e) {
@@ -130,5 +125,5 @@
 			PropertiesDialog.this.repaint(); // repaint is enough 
 	}
-	
+
 	/**
 	 * Open the add selection dialog and add a new key/value to the table (and to the
@@ -137,32 +132,30 @@
 	void add() {
 		Collection<OsmPrimitive> sel = Main.ds.getSelected();
-		
+
 		JPanel p = new JPanel(new BorderLayout());
 		p.add(new JLabel("<html>This will change "+sel.size()+" object"+(sel.size()==1?"":"s")+".<br><br>"+
 		"Please select a key"), BorderLayout.NORTH);
-		Vector<String> allKeys = new Vector<String>();
+		TreeSet<String> allKeys = new TreeSet<String>();
 		for (OsmPrimitive osm : Main.ds.allNonDeletedPrimitives())
 			allKeys.addAll(osm.keySet());
-		for (Iterator<String> it = allKeys.iterator(); it.hasNext();) {
-			String s = it.next();
-			for (int i = 0; i < data.getRowCount(); ++i) {
-				if (s.equals(data.getValueAt(i, 0))) {
-					it.remove();
-					break;
-				}
-			}
-		}
-		JComboBox keys = new JComboBox(allKeys);
+		for (int i = 0; i < data.getRowCount(); ++i)
+			allKeys.remove(data.getValueAt(i, 0));
+		final JComboBox keys = new JComboBox(new Vector<String>(allKeys));
 		keys.setEditable(true);
 		p.add(keys, BorderLayout.CENTER);
-		
+
 		JPanel p2 = new JPanel(new BorderLayout());
 		p.add(p2, BorderLayout.SOUTH);
 		p2.add(new JLabel("Please select a value"), BorderLayout.NORTH);
-		JTextField values = new JTextField();
+		final JTextField values = new JTextField();
 		p2.add(values, BorderLayout.CENTER);
-		int answer = JOptionPane.showConfirmDialog(Main.parent, p, 
-				"Change values?", JOptionPane.OK_CANCEL_OPTION); 
-		if (answer != JOptionPane.OK_OPTION)
+		JOptionPane pane = new JOptionPane(p, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION){
+			@Override public void selectInitialValue() {
+				keys.requestFocusInWindow();
+				keys.getEditor().selectAll();
+			}
+		};
+		pane.createDialog(Main.parent, "Change values?").setVisible(true);
+		if (!Integer.valueOf(JOptionPane.OK_OPTION).equals(pane.getValue()))
 			return;
 		String key = keys.getEditor().getItem().toString();
@@ -184,5 +177,5 @@
 		selectionChanged(sel); // update table
 	}
-	
+
 	/**
 	 * The property data.
@@ -200,5 +193,5 @@
 	 */
 	private final JTable propertyTable = new JTable(data);
-	
+
 	/**
 	 * Create a new PropertiesDialog
@@ -208,5 +201,5 @@
 
 		setPreferredSize(new Dimension(320,150));
-		
+
 		data.setColumnIdentifiers(new String[]{"Key", "Value"});
 		propertyTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
@@ -228,10 +221,10 @@
 			}
 		});
-		//propertyTable.addMouseListener(new DblClickWatch());
-
+		DblClickWatch dblClickWatch = new DblClickWatch();
+		propertyTable.addMouseListener(dblClickWatch);
 		JScrollPane scrollPane = new JScrollPane(propertyTable);
-		scrollPane.addMouseListener(new DblClickWatch());
+		scrollPane.addMouseListener(dblClickWatch);
 		add(scrollPane, BorderLayout.CENTER);
-		
+
 		JPanel buttonPanel = new JPanel(new GridLayout(1,3));
 		ActionListener buttonAction = new ActionListener(){
@@ -258,5 +251,5 @@
 		add(buttonPanel, BorderLayout.SOUTH);
 	}
-	
+
 	private JButton createButton(String name, String tooltip, int mnemonic, ActionListener actionListener) {
 		JButton b = new JButton(name, ImageProvider.get("dialogs", name.toLowerCase()));
@@ -284,5 +277,5 @@
 			propertyTable.getCellEditor().cancelCellEditing();
 		data.setRowCount(0);
-		
+
 		Map<String, Integer> valueCount = new HashMap<String, Integer>();
 		TreeMap<String, Collection<String>> props = new TreeMap<String, Collection<String>>();
Index: src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java	(revision 99)
+++ src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java	(revision 100)
@@ -5,5 +5,4 @@
 import java.awt.Component;
 import java.awt.Cursor;
-import java.awt.Dimension;
 import java.awt.Graphics;
 import java.awt.GridBagLayout;
@@ -24,5 +23,4 @@
 import java.util.Date;
 import java.util.LinkedList;
-import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -82,11 +80,11 @@
 		private final RawGpsLayer gpsLayer;
 		public Loader(Collection<File> files, RawGpsLayer gpsLayer) {
-	        super("Images");
-	        this.files = files;
+			super("Images");
+			this.files = files;
 			this.gpsLayer = gpsLayer;
-        }
+		}
 		@Override protected void realRun() throws SAXException, JDOMException, IOException {
 			currentAction.setText("Read GPS...");
-			layer = new GeoImageLayer();
+			LinkedList<TimedPoint> gps = new LinkedList<TimedPoint>();
 
 			// check the gps layer for time loops (and process it on the way)
@@ -102,5 +100,5 @@
 							throw new IOException("Cannot read time from point "+p.latlon.lat()+","+p.latlon.lon());
 						Date d = dateFormat.parse(m.group(1)+" "+m.group(2));
-						layer.gps.add(new TimedPoint(d, p.eastNorth));
+						gps.add(new TimedPoint(d, p.eastNorth));
 						if (last != null && last.after(d))
 							throw new IOException("Time loop in gps data.");
@@ -112,11 +110,11 @@
 			}
 
-			if (layer.gps.isEmpty()) {
-				layer.data = new ArrayList<ImageEntry>();
+			if (gps.isEmpty()) {
+				errorMessage = "No images with readable timestamps found.";
 				return;
 			}
 
 			// read the image files
-			layer.data = new ArrayList<ImageEntry>(files.size());
+			ArrayList<ImageEntry> data = new ArrayList<ImageEntry>(files.size());
 			int i = 0;
 			progress.setMaximum(files.size());
@@ -134,8 +132,9 @@
 				e.icon = loadScaledImage(f, 16);
 
-				layer.data.add(e);
-			}
+				data.add(e);
+			}
+			layer = new GeoImageLayer(data, gps);
 			layer.calculatePosition();
-        }
+		}
 		@Override protected void finish() {
 			if (layer != null)
@@ -144,8 +143,8 @@
 		@Override protected void cancel() {cancelled = true;}
 	}
-	
-	public List<ImageEntry> data;
+
+	public ArrayList<ImageEntry> data;
 	private LinkedList<TimedPoint> gps = new LinkedList<TimedPoint>();
-	
+
 	/**
 	 * The delta added to all timestamps in files from the camera 
@@ -156,4 +155,5 @@
 	private boolean mousePressed = false;
 	private static final SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
+	private MouseAdapter mouseAdapter;
 
 	public static final class GpsTimeIncorrect extends Exception {
@@ -180,8 +180,10 @@
 		loader.pleaseWaitDlg.setVisible(true);
 	}
-	
-	private GeoImageLayer() {
+
+	private GeoImageLayer(final ArrayList<ImageEntry> data, LinkedList<TimedPoint> gps) {
 		super("Geotagged Images");
-		Main.map.mapView.addMouseListener(new MouseAdapter(){
+		this.data = data;
+		this.gps = gps;
+		mouseAdapter = new MouseAdapter(){
 			@Override public void mousePressed(MouseEvent e) {
 				if (e.getButton() != MouseEvent.BUTTON1)
@@ -190,5 +192,5 @@
 				if (visible)
 					Main.map.mapView.repaint();
-            }
+			}
 			@Override public void mouseReleased(MouseEvent ev) {
 				if (ev.getButton() != MouseEvent.BUTTON1)
@@ -197,5 +199,6 @@
 				if (!visible)
 					return;
-				for (ImageEntry e : data) {
+				for (int i = data.size(); i > 0; --i) {
+					ImageEntry e = data.get(i-1);
 					if (e.pos == null)
 						continue;
@@ -208,14 +211,16 @@
 				}
 				Main.map.mapView.repaint();
-            }
-		});
+			}
+		};
+		Main.map.mapView.addMouseListener(mouseAdapter);
 	}
 
 	private void showImage(final ImageEntry e) {
 		final JPanel p = new JPanel(new BorderLayout());
-		final JScrollPane scroll = new JScrollPane(new JLabel(new ImageIcon(e.image.getPath())));
-		scroll.setPreferredSize(new Dimension(800,600));
+		final JScrollPane scroll = new JScrollPane(new JLabel(loadScaledImage(e.image, 580)));
+		//scroll.setPreferredSize(new Dimension(800,600));
+		final JViewport vp = scroll.getViewport();
 		p.add(scroll, BorderLayout.CENTER);
-		
+
 		final JToggleButton scale = new JToggleButton(ImageProvider.get("misc", "rectangle"));
 		JPanel p2 = new JPanel();
@@ -224,15 +229,15 @@
 		scale.addActionListener(new ActionListener(){
 			public void actionPerformed(ActionEvent ev) {
-				JViewport vp = scroll.getViewport();
 				p.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
 				if (scale.getModel().isSelected())
-					vp.setView(new JLabel(loadScaledImage(e.image, Math.max(vp.getWidth(), vp.getHeight()))));
+					((JLabel)vp.getView()).setIcon(loadScaledImage(e.image, Math.max(vp.getWidth(), vp.getHeight())));
 				else
-					vp.setView(new JLabel(new ImageIcon(e.image.getPath())));
+					((JLabel)vp.getView()).setIcon(new ImageIcon(e.image.getPath()));
 				p.setCursor(Cursor.getDefaultCursor());
-            }
+			}
 		});
+		scale.setSelected(true);
 		JOptionPane.showMessageDialog(Main.parent, p, e.image+" ("+e.coor.lat()+","+e.coor.lon()+")", JOptionPane.PLAIN_MESSAGE);
-    }
+	}
 
 	@Override public Icon getIcon() {
@@ -246,8 +251,8 @@
 		p.add(new JLabel("GPS start: "+dateFormat.format(gps.getFirst().time)), GBC.eol());
 		p.add(new JLabel("GPS end: "+dateFormat.format(gps.getLast().time)), GBC.eop());
-		
+
 		p.add(new JLabel("current delta: "+(delta/1000.0)+"s"), GBC.eol());
 		p.add(new JLabel("timezone difference: "+(gpstimezone>0?"+":"")+(gpstimezone/1000/60/60)), GBC.eop());
-		
+
 		JList img = new JList(data.toArray());
 		img.setCellRenderer(new DefaultListCellRenderer(){
@@ -291,7 +296,12 @@
 				Rectangle r = new Rectangle(p.x-e.icon.getIconWidth()/2, p.y-e.icon.getIconHeight()/2, e.icon.getIconWidth(), e.icon.getIconHeight());
 				e.icon.paintIcon(mv, g, r.x, r.y);
-				Border b = BorderFactory.createBevelBorder(!clickedFound && mousePressed && r.contains(mv.getMousePosition()) ? BevelBorder.LOWERED : BevelBorder.RAISED);
-				Insets i = b.getBorderInsets(mv);
-				r.grow((i.top+i.bottom)/2, (i.left+i.right)/2);
+				Border b = null;
+				if (!clickedFound && mousePressed && r.contains(mv.getMousePosition())) {
+					b = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
+					clickedFound = true;
+				} else
+					b = BorderFactory.createBevelBorder(BevelBorder.RAISED);
+				Insets inset = b.getBorderInsets(mv);
+				r.grow((inset.top+inset.bottom)/2, (inset.left+inset.right)/2);
 				b.paintBorder(mv, g, r.x, r.y, r.width, r.height);
 			}
@@ -402,3 +412,7 @@
 		return new ImageIcon(img.getScaledInstance(w, h, Image.SCALE_SMOOTH));
 	}
+
+	@Override public void layerRemoved() {
+		Main.map.mapView.removeMouseListener(mouseAdapter);
+    }
 }
Index: src/org/openstreetmap/josm/gui/layer/Layer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/Layer.java	(revision 99)
+++ src/org/openstreetmap/josm/gui/layer/Layer.java	(revision 100)
@@ -83,3 +83,8 @@
 	
 	abstract public void addMenuEntries(JPopupMenu menu);
+	
+	/**
+	 * Called, when the layer is removed from the list. (See it as an destructor)
+	 */
+	public void layerRemoved() {}
 }
Index: src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 99)
+++ src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 100)
@@ -76,6 +76,4 @@
 	}
 
-	private static Icon icon;
-
 	/**
 	 * The data behind this layer.
@@ -107,5 +105,4 @@
 	public final LinkedList<ModifiedChangedListener> listenerModified = new LinkedList<ModifiedChangedListener>();
 	public final LinkedList<CommandQueueListener> listenerCommands = new LinkedList<CommandQueueListener>();
-
 
 	/**
@@ -123,7 +120,5 @@
 	 */
 	@Override public Icon getIcon() {
-		if (icon == null)
-			icon = ImageProvider.get("layer", "osmdata");
-		return icon;
+		return ImageProvider.get("layer", "osmdata");
 	}
 
@@ -202,5 +197,5 @@
 		redoCommands.push(c);
 		//TODO: Replace with listener scheme
-			setModified(uploadedModified);
+		setModified(uploadedModified);
 		Main.ds.clearSelection();
 		fireCommandsChanged();
@@ -255,7 +250,7 @@
 
 	public void fireCommandsChanged() {
-	    for (final CommandQueueListener l : listenerCommands)
+		for (final CommandQueueListener l : listenerCommands)
 			l.commandChanged(commands.size(), redoCommands.size());
-    }
+	}
 
 	/**
Index: src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java	(revision 99)
+++ src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java	(revision 100)
@@ -35,8 +35,6 @@
  * @author imi
  */
-public class RawGpsLayer extends Layer {
+public class RawGpsLayer extends Layer implements PreferenceChangedListener {
 
-	private static Icon icon;
-	
 	public static class GpsPoint {
 		public final LatLon latlon;
@@ -58,10 +56,5 @@
 		super(name);
 		this.data = data;
-		Main.pref.listener.add(new PreferenceChangedListener(){
-        	public void preferenceChanged(String key, String newValue) {
-        		if (Main.map != null && (key.equals("drawRawGpsLines") || key.equals("forceRawGpsLines")))
-        			Main.map.repaint();
-        	}
-        });
+		Main.pref.listener.add(this);
 	}
 
@@ -70,7 +63,5 @@
 	 */
 	@Override public Icon getIcon() {
-		if (icon == null)
-			icon = ImageProvider.get("layer", "rawgps");
-		return icon;
+		return ImageProvider.get("layer", "rawgps");
 	}
 
@@ -86,9 +77,9 @@
 		Point old = null;
 		for (Collection<GpsPoint> c : data) {
-			if (!Main.pref.getBoolean("forceRawGpsLines"))
+			if (!Main.pref.getBoolean("draw.rawgps.lines.force"))
 				old = null;
 			for (GpsPoint p : c) {
 				Point screen = mv.getPoint(p.eastNorth);
-				if (Main.pref.getBoolean("drawRawGpsLines") && old != null)
+				if (Main.pref.getBoolean("draw.rawgps.lines") && old != null)
 					g.drawLine(old.x, old.y, screen.x, screen.y);
 				else
@@ -196,3 +187,12 @@
 		menu.add(new LayerListPopup.InfoAction(this));
     }
+
+	public void preferenceChanged(String key, String newValue) {
+		if (Main.map != null && (key.equals("draw.rawgps.lines") || key.equals("draw.rawgps.lines.force")))
+			Main.map.repaint();
+	}
+
+	@Override public void layerRemoved() {
+		Main.pref.listener.remove(this);
+    }
 }
Index: src/org/openstreetmap/josm/io/GpxReader.java
===================================================================
--- src/org/openstreetmap/josm/io/GpxReader.java	(revision 99)
+++ src/org/openstreetmap/josm/io/GpxReader.java	(revision 100)
@@ -1,5 +1,4 @@
 package org.openstreetmap.josm.io;
 
-import static org.openstreetmap.josm.io.GpxWriter.GPX;
 import static org.openstreetmap.josm.io.GpxWriter.JOSM;
 import static org.openstreetmap.josm.io.GpxWriter.OSM;
@@ -12,10 +11,11 @@
 import org.jdom.Element;
 import org.jdom.JDOMException;
+import org.jdom.Namespace;
 import org.jdom.input.SAXBuilder;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.Segment;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Segment;
 import org.openstreetmap.josm.data.osm.Way;
 
@@ -43,4 +43,6 @@
 	private boolean mergeNodes = false;
 
+	private Namespace gpx;
+	
 	/**
 	 * Construct a parser from a specific data source.
@@ -50,5 +52,5 @@
 		this.source = source;
 	}
-	
+
 	/**
 	 * Read the input stream and return a DataSet from the stream.
@@ -58,4 +60,5 @@
 			final SAXBuilder builder = new SAXBuilder();
 			Element root = builder.build(source).getRootElement();
+			gpx = root.getNamespace();
 			mergeNodes = !root.getAdditionalNamespaces().contains(JOSM);
 			return parseDataSet(root);
@@ -75,7 +78,7 @@
 	private Node parseWaypoint(Element e) {
 		Node data = new Node(new LatLon(
-			Double.parseDouble(e.getAttributeValue("lat")),
-			Double.parseDouble(e.getAttributeValue("lon"))));
-		
+				Double.parseDouble(e.getAttributeValue("lat")),
+				Double.parseDouble(e.getAttributeValue("lon"))));
+
 		for (Object o : e.getChildren()) {
 			Element child = (Element)o;
@@ -99,5 +102,5 @@
 		DataSet data = new DataSet();
 		// read waypoints not contained in ways or areas
-		for (Object o : e.getChildren("wpt", GPX)) {
+		for (Object o : e.getChildren("wpt", gpx)) {
 			Node node = parseWaypoint((Element)o);
 			addNode(data, node);
@@ -105,5 +108,5 @@
 
 		// read ways (and segments)
-		for (Object wayElement : e.getChildren("trk", GPX))
+		for (Object wayElement : e.getChildren("trk", gpx))
 			parseWay((Element)wayElement, data);
 
@@ -112,5 +115,5 @@
 			if (osm.id < 0)
 				osm.id = 0;
-		
+
 		// clean up the data a bit (remove broken stuff)
 		// remove segments with from==to
@@ -157,5 +160,5 @@
 			if (child.getName().equals("trkseg")) {
 				Node start = null;
-				for (Object w : child.getChildren("trkpt", GPX)) {
+				for (Object w : child.getChildren("trkpt", gpx)) {
 					Node node = addNode(ds, parseWaypoint((Element)w));
 					if (start == null)
@@ -163,5 +166,5 @@
 					else {
 						Segment segment = new Segment(start, node);
-						parseKeyValueExtensions(segment, child.getChild("extensions", GPX));
+						parseKeyValueExtensions(segment, child.getChild("extensions", gpx));
 						segment = (Segment)getNewIfSeenBefore(segment);
 						way.segments.add(segment);
@@ -201,5 +204,5 @@
 		return node;
 	}
-	
+
 
 	/**
Index: src/org/openstreetmap/josm/io/GpxWriter.java
===================================================================
--- src/org/openstreetmap/josm/io/GpxWriter.java	(revision 99)
+++ src/org/openstreetmap/josm/io/GpxWriter.java	(revision 100)
@@ -112,11 +112,11 @@
 
 		// ways
-		for (Way t : ds.ways) {
-			if (t.deleted && t.id == 0)
+		for (Way w : ds.ways) {
+			if (w.deleted && w.id == 0)
 				continue;
 			Element tElem = new Element("trk", GPX);
 			HashMap<String, String> keys = null;
-			if (t.keys != null) {
-				keys = new HashMap<String, String>(t.keys);
+			if (w.keys != null) {
+				keys = new HashMap<String, String>(w.keys);
 				addAndRemovePropertyTag("name", tElem, keys);
 				addAndRemovePropertyTag("cmt", tElem, keys);
@@ -127,8 +127,10 @@
 				addAndRemovePropertyTag("type", tElem, keys);
 			}
-			addPropertyExtensions(tElem, keys, t);
+			addPropertyExtensions(tElem, keys, w);
 
 			// segments
-			for (Segment ls : t.segments) {
+			for (Segment ls : w.segments) {
+				if (ls.incomplete)
+					continue;
 				tElem.getChildren().add(parseSegment(ls));
 				unrefNodes.remove(ls.from);
@@ -379,4 +381,6 @@
 			Segment oldLs = null;
 			for (Segment ls : w.segments) {
+				if (ls.incomplete)
+					continue;
 				// end old segemnt, if no longer match a chain
 				if (oldLs != null && !oldLs.to.coor.equals(ls.from.coor)) {
@@ -407,5 +411,5 @@
 		Collection<Segment> segments = new LinkedList<Segment>();
 		for (OsmPrimitive osm : all)
-			if (osm instanceof Segment)
+			if (osm instanceof Segment && !((Segment)osm).incomplete)
 				segments.add((Segment)osm);
 		if (!segments.isEmpty()) {
@@ -424,7 +428,7 @@
 		
 		// finally add the remaining nodes
-		for (OsmPrimitive osm : all) {
-			outputNode((Node)osm, true);
-		}
+		for (OsmPrimitive osm : all)
+			if (osm instanceof Node)
+				outputNode((Node)osm, true);
 		
 		out.println("</gpx>");
Index: src/org/openstreetmap/josm/io/OsmServerWriter.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmServerWriter.java	(revision 99)
+++ src/org/openstreetmap/josm/io/OsmServerWriter.java	(revision 100)
@@ -68,5 +68,5 @@
 					return;
 				osm.visit(v);
-				currentAction.setText("Upload "+v.className+" "+osm.id+"...");
+				currentAction.setText("Upload "+v.className+" "+v.name+" ("+osm.id+")...");
 				osm.visit(this);
 				progress.setValue(progress.getValue()+1);
@@ -184,8 +184,9 @@
 			throw new RuntimeException("Unknown host: "+e.getMessage(), e);
 		} catch (Exception e) {
+			if (cancel)
+				return; // assume cancel
 			if (e instanceof RuntimeException)
 				throw (RuntimeException)e;
-			if (!cancel)
-				throw new RuntimeException(e.getMessage(), e);
+			throw new RuntimeException(e.getMessage(), e);
 		}
 	}
Index: src/org/openstreetmap/josm/test/MergeVisitorTest.java
===================================================================
--- src/org/openstreetmap/josm/test/MergeVisitorTest.java	(revision 99)
+++ src/org/openstreetmap/josm/test/MergeVisitorTest.java	(revision 100)
@@ -10,4 +10,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Segment;
+import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.visitor.MergeVisitor;
 import org.openstreetmap.josm.test.framework.Bug;
@@ -178,4 +179,24 @@
 
 
+	public void testCloneWayNotIncomplete() {
+		DataSet ds = new DataSet();
+		Node[] n = createNodes(ds, 2);
+		Segment s = DataSetTestCaseHelper.createSegment(ds, n[0], n[1]);
+		Way w = DataSetTestCaseHelper.createWay(ds, s);
+		MergeVisitor v = new MergeVisitor(ds);
+		v.visit(n[0]);
+		v.visit(n[1]);
+		v.visit(s);
+		v.visit(w);
+		Way w2 = new Way(w);
+		w2.timestamp = new Date();
+		Segment s2 = new Segment(s);
+		s2.incomplete = true;
+		w2.segments.clear();
+		w2.segments.add(s2);
+		v.visit(w2);
+		assertSame("Do not import incomplete segments when merging ways.", s, w.segments.iterator().next());
+	}
+	
 	/**
 	 * Create that amount of nodes and add them to the dataset. The id will be 1,2,3,4...
