Index: src/org/openstreetmap/josm/actions/DownloadIncompleteAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/DownloadIncompleteAction.java	(revision 135)
+++ src/org/openstreetmap/josm/actions/DownloadIncompleteAction.java	(revision 137)
@@ -44,5 +44,5 @@
 
 		private DownloadTask(Collection<OsmPrimitive> toDownload) {
-			super(trn("Downloading {0} segments", "Downloading {0} segment", toDownload.size(), toDownload.size()));
+			super(trn("Downloading {0} segment", "Downloading {0} segments", toDownload.size(), toDownload.size()));
 			reader = new ObjectListDownloader(toDownload);
 			reader.setProgressInformation(currentAction, progress);
Index: src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java	(revision 135)
+++ src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java	(revision 137)
@@ -133,4 +133,5 @@
 		}
 		Main.main.editLayer().add(c);
+		Main.ds.setSelected(n);
 		Main.map.mapView.repaint();
 	}
Index: src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 135)
+++ src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 137)
@@ -11,4 +11,5 @@
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.Map.Entry;
 
@@ -134,4 +135,6 @@
 	 * If deleting a node which is part of exactly two segments, and both segments
 	 * have no conflicting keys, join them and remove the node.
+	 * If the two segments are part of the same way, remove the deleted segment
+	 * from the way.
 	 * 
 	 * @param selection The objects to delete.
@@ -181,7 +184,4 @@
 			seg2 = s;
 		}
-		for (Way w : Main.ds.ways)
-			if (!w.deleted && (w.segments.contains(seg1) || w.segments.contains(seg2)))
-				return tr("Used in a way.");
 		if (seg1.from == seg2.from || seg1.to == seg2.to)
 			return tr("Wrong direction of segments.");
@@ -189,4 +189,13 @@
 			if (seg2.keySet().contains(e.getKey()) && !seg2.get(e.getKey()).equals(e.getValue()))
 				return tr("Conflicting keys");
+		ArrayList<Way> ways = new ArrayList<Way>(2);
+		for (Way w : Main.ds.ways) {
+			if (w.deleted)
+				continue;
+			if ((w.segments.contains(seg1) && !w.segments.contains(seg2)) || (w.segments.contains(seg2) && !w.segments.contains(seg1)))
+				return tr("Segments are part of different ways.");
+			if (w.segments.contains(seg1) && w.segments.contains(seg2))
+				ways.add(w);
+		}
 		Segment s = new Segment(seg1);
 		s.to = seg2.to;
@@ -195,8 +204,13 @@
 		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(tr("Delete Node"), Arrays.asList(cmds)));
+		Collection<Command> cmds = new LinkedList<Command>();
+		for (Way w : ways) {
+			Way copy = new Way(w);
+			copy.segments.remove(seg2);
+			cmds.add(new ChangeCommand(w, copy));
+		}
+		cmds.add(new ChangeCommand(seg1, s));
+		cmds.add(new DeleteCommand(Arrays.asList(new OsmPrimitive[]{n, seg2})));
+		Main.main.editLayer().add(new SequenceCommand(tr("Delete Node"), cmds));
 		return null;
     }
Index: src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- src/org/openstreetmap/josm/data/Preferences.java	(revision 135)
+++ src/org/openstreetmap/josm/data/Preferences.java	(revision 137)
@@ -47,4 +47,7 @@
 	}
 
+	synchronized final public boolean hasKey(final String key) {
+		return properties.containsKey(key);
+	}
 	synchronized final public String get(final String key) {
 		if (!properties.containsKey(key))
Index: src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java	(revision 135)
+++ src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java	(revision 137)
@@ -24,4 +24,5 @@
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Date;
 import java.util.LinkedList;
@@ -67,5 +68,5 @@
 public class GeoImageLayer extends Layer {
 
-	private static final class ImageEntry {
+	private static final class ImageEntry implements Comparable<ImageEntry> {
 		File image;
 		Date time;
@@ -73,4 +74,7 @@
 		EastNorth pos;
 		Icon icon;
+		public int compareTo(ImageEntry image) {
+			return time.compareTo(image.time);
+		}		
 	}
 
@@ -89,6 +93,5 @@
 			LinkedList<TimedPoint> gps = new LinkedList<TimedPoint>();
 
-			// check the gps layer for time loops (and process it on the way)
-			Date last = null;
+			// Extract dates and locations from GPS input
 			for (Collection<GpsPoint> c : gpsLayer.data) {
 				for (GpsPoint p : c) {
@@ -102,7 +105,4 @@
                     }
 					gps.add(new TimedPoint(d, p.eastNorth));
-					if (last != null && last.after(d))
-						throw new IOException(tr("Time loop in gps data."));
-					last = d;
 				}
 			}
@@ -168,5 +168,5 @@
 	}
 
-	private static final class TimedPoint {
+	private static final class TimedPoint implements Comparable<TimedPoint> {
 		Date time;
 		EastNorth pos;
@@ -175,4 +175,7 @@
 			this.pos = pos;
 		}
+		public int compareTo(TimedPoint point) {
+			return time.compareTo(point.time);
+		}
 	}
 
@@ -185,4 +188,6 @@
 	private GeoImageLayer(final ArrayList<ImageEntry> data, LinkedList<TimedPoint> gps) {
 		super(tr("Geotagged Images"));
+		Collections.sort(data);
+		Collections.sort(gps);					
 		this.data = data;
 		this.gps = gps;
Index: src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java	(revision 135)
+++ src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java	(revision 137)
@@ -15,4 +15,6 @@
 
 import javax.swing.AbstractAction;
+import javax.swing.Box;
+import javax.swing.ButtonGroup;
 import javax.swing.Icon;
 import javax.swing.JColorChooser;
@@ -20,4 +22,5 @@
 import javax.swing.JMenuItem;
 import javax.swing.JOptionPane;
+import javax.swing.JRadioButton;
 import javax.swing.JSeparator;
 import javax.swing.filechooser.FileFilter;
@@ -115,4 +118,7 @@
 		boolean force = Main.pref.getBoolean("draw.rawgps.lines.force");
 		boolean lines = Main.pref.getBoolean("draw.rawgps.lines");
+		String linesKey = "draw.rawgps.lines.layer "+name;
+		if (Main.pref.hasKey(linesKey))
+			lines = Main.pref.getBoolean(linesKey);
 		boolean large = Main.pref.getBoolean("draw.rawgps.large");
 		for (Collection<GpsPoint> c : data) {
@@ -167,4 +173,33 @@
 
 	@Override public Component[] getMenuEntries() {
+		JMenuItem line = new JMenuItem(tr("Customize line drawing"), ImageProvider.get("mapmode/addsegment"));
+		line.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent e) {
+				JRadioButton[] r = new JRadioButton[3];
+				r[0] = new JRadioButton(tr("Use global settings."));
+				r[1] = new JRadioButton(tr("Draw lines between points for this layer."));
+				r[2] = new JRadioButton(tr("Do not draw lines between points for this layer."));
+				ButtonGroup group = new ButtonGroup();
+				Box panel = Box.createVerticalBox();
+				for (JRadioButton b : r) {
+					group.add(b);
+					panel.add(b);
+				}
+				String propName = "draw.rawgps.lines.layer "+name;
+				if (Main.pref.hasKey(propName))
+					group.setSelected(r[Main.pref.getBoolean(propName) ? 1:2].getModel(), true);
+				else
+					group.setSelected(r[0].getModel(), true);
+				int answer = JOptionPane.showConfirmDialog(Main.parent, panel, tr("Select line drawing options"), JOptionPane.OK_CANCEL_OPTION);
+				if (answer == JOptionPane.CANCEL_OPTION)
+					return;
+				if (group.getSelection() == r[0].getModel())
+					Main.pref.put(propName, null);
+				else
+					Main.pref.put(propName, group.getSelection() == r[1].getModel());
+				Main.map.repaint();
+			}
+		});
+
 		JMenuItem color = new JMenuItem(tr("Customize Color"), ImageProvider.get("colorchooser"));
 		color.addActionListener(new ActionListener(){
@@ -228,4 +263,5 @@
 				new JMenuItem(new GpxExportAction(this)),
 				color,
+				line,
 				tagimage,
 				new JMenuItem(new ConvertToDataLayerAction()),
