Index: /src/org/openstreetmap/josm/actions/UploadAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/UploadAction.java	(revision 105)
+++ /src/org/openstreetmap/josm/actions/UploadAction.java	(revision 106)
@@ -44,5 +44,5 @@
 			return;
 		}
-		
+
 		if (!Main.map.conflictDialog.conflicts.isEmpty()) {
 			JOptionPane.showMessageDialog(Main.parent,tr("There are unresolved conflicts. You have to resolve these first."));
@@ -56,4 +56,6 @@
 		final Collection<OsmPrimitive> delete = new LinkedList<OsmPrimitive>();
 		for (OsmPrimitive osm : Main.ds.allPrimitives()) {
+			if (osm.get("josm/ignore") != null)
+				continue;
 			if (osm.id == 0 && !osm.deleted)
 				add.add(osm);
Index: /src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 105)
+++ /src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 106)
@@ -79,5 +79,5 @@
 			deleteWithReferences(Main.ds.getSelected());
 		else
-			delete(Main.ds.getSelected(), false);
+			delete(Main.ds.getSelected(), false, false);
 		Main.map.repaint();
 	}
@@ -98,5 +98,5 @@
 			deleteWithReferences(Collections.singleton(sel));
 		else
-			delete(Collections.singleton(sel), true);
+			delete(Collections.singleton(sel), true, true);
 
 		Main.map.mapView.repaint();
@@ -139,5 +139,5 @@
 	 * @param msgBox Whether a message box for errors should be shown
 	 */
-	private void delete(Collection<OsmPrimitive> selection, boolean msgBox) {
+	private void delete(Collection<OsmPrimitive> selection, boolean msgBox, boolean joinIfPossible) {
 		Collection<OsmPrimitive> del = new HashSet<OsmPrimitive>();
 		for (OsmPrimitive osm : selection) {
@@ -145,5 +145,5 @@
 			osm.visit(v);
 			if (!selection.containsAll(v.data)) {
-				if (osm instanceof Node) {
+				if (osm instanceof Node && joinIfPossible) {
 					String reason = deleteNodeAndJoinSegment((Node)osm);
 					if (reason != null && msgBox) {
Index: /src/org/openstreetmap/josm/command/ChangePropertyCommand.java
===================================================================
--- /src/org/openstreetmap/josm/command/ChangePropertyCommand.java	(revision 105)
+++ /src/org/openstreetmap/josm/command/ChangePropertyCommand.java	(revision 106)
@@ -64,11 +64,11 @@
 
 	@Override public MutableTreeNode description() {
-		String text = value == null ? tr( "Remove '{0}' for",key) : tr("Set {0}={1} for",key,value);
+		String text = value == null ? tr( "Remove \"{0}\" for", key) : tr("Set {0}={1} for",key,value);
 		if (objects.size() == 1) {
 			NameVisitor v = new NameVisitor();
 			objects.iterator().next().visit(v);
-			text += v.className+" "+v.name;
+			text += " "+v.className+" "+v.name;
 		} else
-			text += trn("{0} object","{0} objects",objects.size(),objects.size());
+			text += objects.size()+trn("object","objects",objects.size());
 		DefaultMutableTreeNode root = new DefaultMutableTreeNode(new JLabel(text, ImageProvider.get("data", "key"), JLabel.HORIZONTAL));
 		if (objects.size() == 1)
Index: /src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java
===================================================================
--- /src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java	(revision 105)
+++ /src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java	(revision 106)
@@ -26,6 +26,4 @@
 import java.util.Date;
 import java.util.LinkedList;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import javax.swing.BorderFactory;
@@ -93,23 +91,19 @@
 			// check the gps layer for time loops (and process it on the way)
 			Date last = null;
-			Pattern reg = Pattern.compile("(\\d\\d/\\d\\d/\\d{4}).(\\d\\d:\\d\\d:\\d\\d)");
-			try {
-				for (Collection<GpsPoint> c : gpsLayer.data) {
-					for (GpsPoint p : c) {
-						if (p.time == null)
-							throw new IOException(tr("No time for point {0},{1}",p.latlon.lat(),p.latlon.lon()));
-						Matcher m = reg.matcher(p.time);
-						if (!m.matches())
-							throw new IOException(tr("Cannot read time from point {0},{1}",p.latlon.lat(),p.latlon.lon()));
-						Date d = DateParser.parse(m.group(1)+" "+m.group(2));
-						gps.add(new TimedPoint(d, p.eastNorth));
-						if (last != null && last.after(d))
-							throw new IOException(tr("Time loop in gps data."));
-						last = d;
-					}
+			for (Collection<GpsPoint> c : gpsLayer.data) {
+				for (GpsPoint p : c) {
+					if (p.time == null)
+						throw new IOException(tr("No time for point {0},{1}",p.latlon.lat(),p.latlon.lon()));
+					Date d = null;
+                    try {
+                        d = DateParser.parse(p.time);
+                    } catch (ParseException e) {
+                    	throw new IOException(tr("Cannot read time \"{0}\" from point {1} x {2}",p.time,p.latlon.lat(),p.latlon.lon()));
+                    }
+					gps.add(new TimedPoint(d, p.eastNorth));
+					if (last != null && last.after(d))
+						throw new IOException(tr("Time loop in gps data."));
+					last = d;
 				}
-			} catch (ParseException e) {
-				e.printStackTrace();
-				throw new IOException(tr("Incorrect date information"));
 			}
 
Index: /src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- /src/org/openstreetmap/josm/io/OsmReader.java	(revision 105)
+++ /src/org/openstreetmap/josm/io/OsmReader.java	(revision 106)
@@ -186,6 +186,8 @@
 			for (long id : e.getValue()) {
 				Segment s = segments.get(id);
-				if (s == null)
+				if (s == null) {
 					s = new Segment(id); // incomplete line segment
+					adder.visit(s);
+				}
 				w.segments.add(s);
 			}
Index: /src/org/openstreetmap/josm/io/RawGpsReader.java
===================================================================
--- /src/org/openstreetmap/josm/io/RawGpsReader.java	(revision 105)
+++ /src/org/openstreetmap/josm/io/RawGpsReader.java	(revision 106)
@@ -8,4 +8,5 @@
 import java.util.Collection;
 import java.util.LinkedList;
+import java.util.Stack;
 
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -31,5 +32,6 @@
 		public Collection<Collection<GpsPoint>> data = new LinkedList<Collection<GpsPoint>>();
 		private LatLon currentLatLon;
-		private String currentTime;
+		private String currentTime = null;
+		private Stack<String> tags = new Stack<String>();
 
 		@Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
@@ -47,12 +49,19 @@
 	                throw new SAXException(e);
                 }
-			} else if (qName.equals("time")) {
-				currentTime = "";
 			}
+			tags.push(qName);
 		}
 
 		@Override public void characters(char[] ch, int start, int length) {
-			if (currentTime != null && currentTime.equals(""))
-				currentTime = new String(ch, start, length);
+			if (tags.peek().equals("time")) {
+				String time = tags.pop();
+				if (tags.empty() || (!tags.peek().equals("wpt") && !tags.peek().equals("trkpt"))) {
+					tags.push(time);
+					return;
+				}
+				String ct = new String(ch, start, length);
+				currentTime += ct;
+				tags.push(time);
+			}
 		}
 
@@ -62,4 +71,8 @@
 			} else if (qName.equals("trkseg") || qName.equals("trk") || qName.equals("gpx"))
 				newTrack();
+			
+			if (!qName.equals("time"))
+				currentTime = "";
+			tags.pop();
         }
 
Index: /src/org/openstreetmap/josm/test/MergeVisitorTest.java
===================================================================
--- /src/org/openstreetmap/josm/test/MergeVisitorTest.java	(revision 105)
+++ /src/org/openstreetmap/josm/test/MergeVisitorTest.java	(revision 106)
@@ -170,6 +170,22 @@
 		Segment s2 = new Segment(s1);
 		s1.incomplete = true;
+		s2.timestamp = new Date();
 		v.visit(s2);
 		assertTrue(s1.realEqual(s2));
+	}
+	/**
+	 * Incomplete segments should extend existing ways.
+	 */
+	public void testImportIncompleteExtendWays() throws Exception {
+		Segment s1 = DataSetTestCaseHelper.createSegment(ds, dsNode, dsNode);
+		Way w = DataSetTestCaseHelper.createWay(ds, new Segment[]{s1});
+		s1.id = 1;
+		Segment s2 = new Segment(s1);
+		s1.incomplete = true;
+		v.visit(s2);
+		v.fixReferences();
+		assertEquals(1, w.segments.size());
+		assertEquals(s2, w.segments.get(0));
+		assertFalse(s2.incomplete);
 	}
 
Index: /src/org/openstreetmap/josm/tools/DateParser.java
===================================================================
--- /src/org/openstreetmap/josm/tools/DateParser.java	(revision 105)
+++ /src/org/openstreetmap/josm/tools/DateParser.java	(revision 106)
@@ -15,9 +15,12 @@
 
 	private static final String[] formats = {
+		"yyyy-MM-dd'T'HH:mm:ss'Z'",
 		"yyyy-MM-dd'T'HH:mm:ssZ",
 		"yyyy-MM-dd'T'HH:mm:ss.SSSZ",
+		"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
 		"yyyy-MM-dd HH:mm:ss",
 		"MM/dd/yyyy HH:mm:ss",
 		"MM/dd/yyyy'T'HH:mm:ss.SSSZ",
+		"MM/dd/yyyy'T'HH:mm:ss.SSS'Z'",
 		"MM/dd/yyyy'T'HH:mm:ss.SSS",
 		"MM/dd/yyyy'T'HH:mm:ssZ",
