Index: src/org/openstreetmap/josm/Main.java
===================================================================
--- src/org/openstreetmap/josm/Main.java	(revision 202)
+++ src/org/openstreetmap/josm/Main.java	(revision 203)
@@ -160,6 +160,9 @@
 	public final void removeLayer(final Layer layer) {
 		map.mapView.removeLayer(layer);
-		if (layer instanceof OsmDataLayer)
-			ds = new DataSet();
+		if (layer instanceof OsmDataLayer) {
+			DataSet newDs = new DataSet();
+			newDs.listeners.addAll(ds.listeners);
+			ds = newDs;
+		}
 		if (map.mapView.getAllLayers().isEmpty())
 			setMapFrame(null);
Index: src/org/openstreetmap/josm/actions/AutoScaleAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 202)
+++ src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 203)
@@ -60,5 +60,5 @@
 		setCurrent(0);
 		this.mapFrame = mapFrame;
-		Main.ds.addSelectionChangedListener(new SelectionChangedListener(){
+		Main.ds.listeners.add(new SelectionChangedListener(){
 			public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
 				if (mode.equals("selection"))
Index: src/org/openstreetmap/josm/actions/SplitWayAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 202)
+++ src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 203)
@@ -98,5 +98,5 @@
 	public SplitWayAction() {
 		super(tr("Split Way"), "splitway", tr("Split a way at the selected node."), KeyEvent.VK_P, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK, true);
-		Main.ds.addSelectionChangedListener(this);
+		Main.ds.listeners.add(this);
 	}
 
@@ -230,9 +230,7 @@
 
 		// finally check if the selected way is complete.
-		for (Segment s : selectedWay.segments) {
-			if (s.incomplete) {
-				JOptionPane.showMessageDialog(Main.parent, tr("Warning: This way is incomplete. Try to download it before splitting."));
-				return;
-			}
+		if (selectedWay.isIncomplete()) {
+			JOptionPane.showMessageDialog(Main.parent, tr("Warning: This way is incomplete. Try to download it before splitting."));
+			return;
 		}
 
@@ -311,5 +309,5 @@
 				// the moveSegments method.
 				if (split) {
-					ArrayList<Segment> subSegments = new ArrayList<Segment>();
+					LinkedList<Segment> subSegments = new LinkedList<Segment>();
 					moveSegments(allSegments, subSegments, splitSeg, selectedNodes);
 					segmentSets.add(subSegments);
@@ -356,5 +354,5 @@
 			partThatContainsSegments.removeAll(selectedSegments);
 			if (!partThatContainsSegments.isEmpty()) {
-				ArrayList<Segment> contiguousSubpart = new ArrayList<Segment>();
+				LinkedList<Segment> contiguousSubpart = new LinkedList<Segment>();
 				moveSegments(partThatContainsSegments, contiguousSubpart, partThatContainsSegments.get(0), null);
 				// if partThatContainsSegments was contiguous before, it will now be empty as all segments
@@ -380,5 +378,5 @@
 
 			while (!allSegments.isEmpty()) {
-				List<Segment> subSegments = new LinkedList<Segment>();
+				LinkedList<Segment> subSegments = new LinkedList<Segment>();
 				moveSegments(allSegments, subSegments, allSegments.get(0), null);
 				segmentSets.add(subSegments);
@@ -465,7 +463,10 @@
 	 * @param stopNodes collection of nodes which should be considered end points for moving (may be null).
 	 */
-	private void moveSegments(Collection<Segment> source, Collection<Segment> destination, Segment start, Collection<Node> stopNodes) {
+	private void moveSegments(Collection<Segment> source, LinkedList<Segment> destination, Segment start, Collection<Node> stopNodes) {
 		source.remove(start);
-		destination.add(start);
+		if (destination.isEmpty() || destination.iterator().next().from.equals(start.to))
+			destination.addFirst(start);
+		else
+			destination.addLast(start);
 		Segment moveSeg = start;
 		while(moveSeg != null) {
@@ -473,5 +474,6 @@
 
 			for (Node node : new Node[] { start.from, start.to }) {
-				if (stopNodes != null && stopNodes.contains(node)) continue;
+				if (stopNodes != null && stopNodes.contains(node))
+					continue;
 				for (Segment sourceSeg : source) {
 					if (sourceSeg.from.equals(node) || sourceSeg.to.equals(node)) {
Index: src/org/openstreetmap/josm/actions/mapmode/AddWayAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/AddWayAction.java	(revision 202)
+++ src/org/openstreetmap/josm/actions/mapmode/AddWayAction.java	(revision 203)
@@ -60,6 +60,5 @@
 	public AddWayAction(MapFrame mapFrame) {
 		super(tr("Add Way"), "addway", tr("Add a new way to the data."), KeyEvent.VK_W, mapFrame, ImageProvider.getCursor("normal", "way"));
-		
-		Main.ds.addSelectionChangedListener(this);
+		Main.ds.listeners.add(this);
 	}
 
Index: src/org/openstreetmap/josm/data/conflict/Merger.java
===================================================================
--- src/org/openstreetmap/josm/data/conflict/Merger.java	(revision 202)
+++ 	(revision )
@@ -1,247 +1,0 @@
-package org.openstreetmap.josm.data.conflict;
-
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Map;
-
-import org.openstreetmap.josm.data.osm.DataSet;
-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.AddVisitor;
-import org.openstreetmap.josm.data.osm.visitor.Visitor;
-
-/**
- * Merger provides an operation, that merges one dataset into an other, creating a list
- * of merged conflicts on the way.
- * 
- * @author Immanuel.Scholz
- */
-public class Merger {
-
-	/**
-	 * The map of all conflicting primitives. Keys are elements from our dataset (given at
-	 * constructor) and values are the associated primitives from the other dataset.
-	 * 
-	 * All references of the conflicting primitives point always to objects from our dataset.
-	 * This ensures, that later one you can just call osm.copyFrom(conflicts.get(osm)) to
-	 * "resolve" the conflict.
-	 */
-	public final Map<OsmPrimitive, OsmPrimitive> conflicts = new HashMap<OsmPrimitive, OsmPrimitive>();
-
-	private final DataSet ds;
-
-	/**
-	 * Maps all resolved objects that were transferred to the own dataset. The key is 
-	 * the object from the other dataset given to merge(). The value is the object that
-	 * is the resolved one in the internal dataset. Both objects are from the same class.
-	 */
-	private Map<OsmPrimitive, OsmPrimitive> resolved = new HashMap<OsmPrimitive, OsmPrimitive>();
-
-
-	private AddVisitor adder;
-
-	/**
-	 * Hold the result of a decission between two elements. <code>MY</code> is keep my own,
-	 * THEIR<code>THEIR</code> means copy the other object over here and <code>CONFLICT</code>
-	 * means that both objects have to be looked closer at to decide it finally (there are
-	 * possible conflicts).
-	 */
-	private enum Solution {MY, THEIR, CONFLICT}
-
-	/**
-	 * @param ds The dataset that is the base to merge the other into.
-	 */
-	public Merger(DataSet ds) {
-		this.ds = ds;
-		adder = new AddVisitor(ds);
-	}
-
-	/**
-	 * This function merges the given dataset into the one given at constructor. The output
-	 * is dataset obtained at the constructor. Additional to that, a list of conflicts that
-	 * need to be resolved is created as member variable <code>conflicts</code>.
-	 * 
-	 * @param other The dataset that should be merged into the one given at construction time.
-	 */
-	public void merge(DataSet other) {
-		for (Node n : other.nodes)
-			merge(n);
-		for (Segment s : other.segments)
-			merge(s);
-		for (Way w : other.ways)
-			merge(w);
-	}
-
-
-	/**
-	 * Merge the object into the own dataset or add it as conflict.
-	 */
-	public void merge(OsmPrimitive their) {
-		// find the matching partner in my dataset
-		OsmPrimitive my;
-		if (their.id == 0)
-			my = findSimilar(their);
-		else {
-			my = find(their);
-			if (my == null)
-				my = findSimilar(their); // give it a second chance.
-		}
-		
-		// partner are found, solve both primitives
-		
-		if (my == null) {
-			// their is new? -> import their to my
-			their.visit(adder);
-			resolved.put(their, their);
-			copyReferences(their);
-			return;
-		}
-		Solution solution = solve(my, their);
-
-		switch(solution) {
-		case MY:
-			resolved.put(my, my);
-			return;
-		case THEIR:
-			resolved.put(their, my);
-			copyReferences(their);
-			my.cloneFrom(their);
-			return;
-		case CONFLICT:
-			resolved.put(their, my); // thats correct. Put all references from the own in case of conflicts
-			conflicts.put(my, their);
-			copyReferences(their);
-			return;
-		}
-
-	}
-
-	/**
-	 * Replace all references in the given primitive with those from resolved map
-	 */
-	private void copyReferences(OsmPrimitive osm) {
-		osm.visit(new Visitor() {
-			public void visit(Node n) {}
-			public void visit(Segment s) {
-				s.from = (Node)resolved.get(s.from);
-				s.to = (Node)resolved.get(s.to);
-				if (s.from == null || s.to == null)
-					throw new NullPointerException();
-            }
-			public void visit(Way w) {
-				Collection<Segment> segments = new LinkedList<Segment>(w.segments);
-				w.segments.clear();
-				for (Segment s : segments) {
-					if (!resolved.containsKey(s))
-						throw new NullPointerException();
-					w.segments.add((Segment)resolved.get(s));
-				}
-            }
-		});
-    }
-
-	/**
-	 * Decide what solution is necessary for my and their object to be solved. If both
-	 * objects are as good as each other, use my object (since it is cheaper to keep it than
-	 * change everything).
-	 *
-	 * @return Which object should be used or conflict in case of problems.
-	 */
-	private Solution solve(OsmPrimitive my, OsmPrimitive their) {
-		Date myDate = my.timestamp == null ? new Date(0) : my.timestamp;
-		Date theirDate = their.timestamp == null ? new Date(0) : their.timestamp;
-		Date baseDate = theirDate.before(myDate) ? theirDate : myDate;
-
-		if (my.id == 0 && their.id != 0)
-			return Solution.THEIR;
-		if (my.id != 0 && their.id == 0)
-			return Solution.MY;
-		if (my.id == 0 && their.id == 0)
-			return my.realEqual(their) ? Solution.MY : Solution.CONFLICT;
-
-		// from here on, none primitives is new
-
-		boolean myChanged = my.modified  || myDate.after(baseDate);
-		boolean theirChanged = their.modified  || theirDate.after(baseDate);
-		if (myChanged && theirChanged)
-			return my.realEqual(their) ? Solution.MY : Solution.CONFLICT;
-		if (theirChanged)
-			return Solution.THEIR;
-		if (my instanceof Segment && ((Segment)my).incomplete && !((Segment)their).incomplete)
-			return Solution.THEIR;
-		return Solution.MY;
-	}
-
-	/**
-	 * Try to find the object in the own dataset.
-	 * @return Either the object from the own dataset or <code>null</code> if not there.
-	 */
-	private OsmPrimitive find(OsmPrimitive osm) {
-		for (OsmPrimitive own : ds.allPrimitives())
-			if (own.equals(osm))
-				return own;
-		return null;
-	}
-
-	/**
-     * Find an primitive from our dataset that matches the given primitive by having the 
-     * same location. Do not look for the id for this.
-     * 
-     * @return For nodes, return the first node with the same location (in tolerance to the
-     * servers imprecision epsilon). For segments return for same starting/ending nodes.
-     * For ways, return if consist of exact the same segments.
-     */
-    private OsmPrimitive findSimilar(OsmPrimitive their) {
-    	final OsmPrimitive[] ret = new OsmPrimitive[1];
-    	Visitor v = new Visitor(){
-			public void visit(Node n) {
-				// go for an exact match first
-				for (Node my : ds.nodes) {
-					if (my.coor.equals(n.coor)) {
-						ret[0] = my;
-						return;
-					}
-				}
-				// second chance with epsilon
-				for (Node my : ds.nodes) {
-					if (my.coor.equalsEpsilon(n.coor)) {
-						ret[0] = my;
-						return;
-					}
-				}
-            }
-			public void visit(Segment s) {
-				for (Segment my : ds.segments) {
-					if (my.from == s.from && my.to == s.to) {
-						ret[0] = my;
-						return;
-					}
-				}
-            }
-			public void visit(Way w) {
-				for (Way my : ds.ways) {
-					boolean eq = true;
-					Iterator<Segment> myIt = my.segments.iterator();
-					Iterator<Segment> theirIt = w.segments.iterator();
-					while (myIt.hasNext() && theirIt.hasNext()) {
-						if (myIt.next() != theirIt.next()) {
-							eq = false;
-							break;
-						}
-					}
-					if (eq && !myIt.hasNext() && !theirIt.hasNext()) {
-						ret[0] = my;
-						return;
-					}
-				}
-            }
-    	};
-    	their.visit(v);
-    	return ret[0];
-    }
-}
Index: src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 202)
+++ src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 203)
@@ -5,5 +5,4 @@
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -47,5 +46,5 @@
 	 * A list of listeners to selection changed events.
 	 */
-	transient Collection<SelectionChangedListener> listeners = new LinkedList<SelectionChangedListener>();
+	transient public Collection<SelectionChangedListener> listeners = new LinkedList<SelectionChangedListener>();
 
 	/**
@@ -143,45 +142,3 @@
 			l.selectionChanged(sel);
 	}
-
-	/**
-	 * Add a listener to the selection changed listener list. If <code>null</code>
-	 * is passed, nothing happens.
-	 * @param listener The listener to add to the list.
-	 */
-	public void addSelectionChangedListener(SelectionChangedListener listener) {
-		if (listener != null)
-			listeners.add(listener);
-	}
-
-	/**
-	 * Remove a listener from the selection changed listener list.
-	 * If <code>null</code> is passed, nothing happens.
-	 * @param listener The listener to remove from the list.
-	 */
-	public void removeSelectionChangedListener(SelectionChangedListener listener) {
-		if (listener != null)
-			listeners.remove(listener);
-	}
-
-	public void addAllSelectionListener(DataSet ds) {
-		listeners.addAll(ds.listeners);
-	}
-
-	/**
-	 * Compares this and the parameter dataset and return <code>true</code> if both
-	 * contain the same data primitives (ignoring the selection)
-	 */
-	public boolean realEqual(Collection<OsmPrimitive> other) {
-		Collection<OsmPrimitive> my = allPrimitives();
-
-		if (my.size() != other.size())
-			return false;
-
-		Iterator<OsmPrimitive> it = other.iterator();
-		for (OsmPrimitive osm : my)
-			if (!osm.realEqual(it.next()))
-				return false;
-
-		return true;
-	}
 }
Index: src/org/openstreetmap/josm/data/osm/Node.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/Node.java	(revision 202)
+++ src/org/openstreetmap/josm/data/osm/Node.java	(revision 203)
@@ -43,6 +43,6 @@
 	}
 
-	@Override public boolean realEqual(OsmPrimitive osm) {
-		return osm instanceof Node ? super.realEqual(osm) && coor.equals(((Node)osm).coor) : false;
+	@Override public boolean realEqual(OsmPrimitive osm, boolean semanticOnly) {
+		return osm instanceof Node ? super.realEqual(osm, semanticOnly) && coor.equals(((Node)osm).coor) : false;
     }
 
Index: src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 202)
+++ src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 203)
@@ -166,13 +166,14 @@
 	/**
 	 * Perform an equality compare for all non-volatile fields not only for the id 
-	 * but for the whole object (for conflict resolving etc)
+	 * but for the whole object (for conflict resolving)
+	 * @param semanticOnly if <code>true</code>, modified flag and timestamp are not compared
 	 */
-	public boolean realEqual(OsmPrimitive osm) {
+	public boolean realEqual(OsmPrimitive osm, boolean semanticOnly) {
 		return
-		id == osm.id && 
-		modified == osm.modified && 
-		deleted == osm.deleted &&
-		(timestamp == null ? osm.timestamp==null : timestamp.equals(osm.timestamp)) &&
-		(keys == null ? osm.keys==null : keys.equals(osm.keys));
+			id == osm.id && 
+			(semanticOnly || (modified == osm.modified)) && 
+			deleted == osm.deleted &&
+			(semanticOnly || (timestamp == null ? osm.timestamp==null : timestamp.equals(osm.timestamp))) &&
+			(keys == null ? osm.keys==null : keys.equals(osm.keys));
 	}
 	
Index: src/org/openstreetmap/josm/data/osm/Segment.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/Segment.java	(revision 202)
+++ src/org/openstreetmap/josm/data/osm/Segment.java	(revision 203)
@@ -79,10 +79,10 @@
 	}
 
-	@Override public boolean realEqual(OsmPrimitive osm) {
+	@Override public boolean realEqual(OsmPrimitive osm, boolean semanticOnly) {
 		if (!(osm instanceof Segment))
-			return super.realEqual(osm); 
+			return super.realEqual(osm, semanticOnly); 
 		if (incomplete)
 			return ((Segment)osm).incomplete;
-		return super.realEqual(osm) && from.equals(((Segment)osm).from) && to.equals(((Segment)osm).to);
+		return super.realEqual(osm, semanticOnly) && from.equals(((Segment)osm).from) && to.equals(((Segment)osm).to);
 	}
 
Index: src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/Way.java	(revision 202)
+++ src/org/openstreetmap/josm/data/osm/Way.java	(revision 203)
@@ -43,6 +43,6 @@
     }
 
-	@Override public boolean realEqual(OsmPrimitive osm) {
-		return osm instanceof Way ? super.realEqual(osm) && segments.equals(((Way)osm).segments) : false;
+	@Override public boolean realEqual(OsmPrimitive osm, boolean semanticOnly) {
+		return osm instanceof Way ? super.realEqual(osm, semanticOnly) && segments.equals(((Way)osm).segments) : false;
     }
 
Index: src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java	(revision 202)
+++ src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java	(revision 203)
@@ -295,15 +295,25 @@
 
 	/**
-	 * @return <code>true</code>, if no merge is needed.
+	 * @return <code>true</code>, if no merge is needed or merge is performed already.
 	 */
 	private <P extends OsmPrimitive> boolean mergeAfterId(Map<P,P> merged, Collection<P> primitives, P other) {
 		for (P my : primitives) {
-			if (my.realEqual(other))
+			Date d1 = my.timestamp == null ? new Date(0) : my.timestamp;
+			Date d2 = other.timestamp == null ? new Date(0) : other.timestamp;
+			if (my.realEqual(other, false))
 				return true; // no merge needed.
+			if (my.realEqual(other, true)) {
+				// they differ in modified/timestamp combination only. Auto-resolve it.
+				if (merged != null)
+					merged.put(other, my);
+				if (d1.before(d2)) {
+					my.modified = other.modified;
+					my.timestamp = other.timestamp;
+				}
+				return true; // merge done.
+			}
 			if (my.id == other.id && my.id != 0) {
 				if (my instanceof Segment && ((Segment)my).incomplete)
 					return false; // merge always over an incomplete
-				Date d1 = my.timestamp == null ? new Date(0) : my.timestamp;
-				Date d2 = other.timestamp == null ? new Date(0) : other.timestamp;
 				if (my.modified && other.modified) {
 					conflicts.put(my, other);
Index: src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapView.java	(revision 202)
+++ src/org/openstreetmap/josm/gui/MapView.java	(revision 203)
@@ -89,5 +89,5 @@
 
 		// listend to selection changes to redraw the map
-		Main.ds.addSelectionChangedListener(new SelectionChangedListener(){
+		Main.ds.listeners.add(new SelectionChangedListener(){
 			public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
 				repaint();
@@ -119,5 +119,5 @@
 			}
 			editLayer = dataLayer;
-			dataLayer.data.addAllSelectionListener(Main.ds);
+			dataLayer.data.listeners.addAll(Main.ds.listeners);
 			Main.ds = dataLayer.data;
 			dataLayer.listenerModified.add(new ModifiedChangedListener(){
Index: src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 202)
+++ src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 203)
@@ -86,5 +86,5 @@
 		add(buttonPanel, BorderLayout.SOUTH);
 
-		Main.ds.addSelectionChangedListener(new SelectionChangedListener(){
+		Main.ds.listeners.add(new SelectionChangedListener(){
 			public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
 				displaylist.clearSelection();
Index: src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java	(revision 202)
+++ src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java	(revision 203)
@@ -143,8 +143,8 @@
 	@Override public void setVisible(boolean b) {
 		if (b) {
-			Main.ds.addSelectionChangedListener(this);
+			Main.ds.listeners.add(this);
 			selectionChanged(Main.ds.getSelected());
 		} else {
-			Main.ds.removeSelectionChangedListener(this);
+			Main.ds.listeners.remove(this);
 		}
 		super.setVisible(b);
Index: src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 202)
+++ src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 203)
@@ -328,8 +328,8 @@
 	@Override public void setVisible(boolean b) {
 		if (b) {
-			Main.ds.addSelectionChangedListener(this);
+			Main.ds.listeners.add(this);
 			selectionChanged(Main.ds.getSelected());
 		} else {
-			Main.ds.removeSelectionChangedListener(this);
+			Main.ds.listeners.remove(this);
 		}
 		super.setVisible(b);
Index: src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 202)
+++ src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 203)
@@ -89,8 +89,8 @@
 	@Override public void setVisible(boolean b) {
 		if (b) {
-			Main.ds.addSelectionChangedListener(this);
+			Main.ds.listeners.add(this);
 			selectionChanged(Main.ds.getSelected());
 		} else {
-			Main.ds.removeSelectionChangedListener(this);
+			Main.ds.listeners.remove(this);
 		}
 		super.setVisible(b);
Index: src/org/openstreetmap/josm/io/OsmServerWriter.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmServerWriter.java	(revision 202)
+++ src/org/openstreetmap/josm/io/OsmServerWriter.java	(revision 203)
@@ -74,4 +74,5 @@
 			}
 		} catch (RuntimeException e) {
+			e.printStackTrace();
 			throw new SAXException("An error occoured: "+e.getMessage());
 		}
