Index: trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java	(revision 2483)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java	(revision 2484)
@@ -39,5 +39,4 @@
      */
     private Set<Long> childrenToMerge;
-
     private Set<OsmPrimitive> deletedObjectsToUnlink;
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2483)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2484)
@@ -602,4 +602,22 @@
         }
 
+        public void addRelations(Collection<? extends OsmPrimitive> addedPrimitives) {
+            if (addedPrimitives == null || addedPrimitives.isEmpty()) return;
+            boolean added = false;
+            for (OsmPrimitive p: addedPrimitives) {
+                if (! (p instanceof Relation)) {
+                    continue;
+                }
+                if (relations.contains(p)) {
+                    continue;
+                }
+                relations.add((Relation)p);
+                added = true;
+            }
+            if (added) {
+                fireIntervalAdded(this, 0, getSize());
+            }
+        }
+
         public Object getElementAt(int index) {
             if (relations == null) return null;
@@ -681,5 +699,5 @@
 
     public void primtivesAdded(Collection<? extends OsmPrimitive> added) {
-        updateList();
+        model.addRelations(added);
     }
 
@@ -689,10 +707,12 @@
 
     public void relationMembersChanged(Relation r) {
-        updateList();
+        // trigger a repaint of the relation list
+        displaylist.repaint();
     }
 
     public void tagsChanged(OsmPrimitive prim) {
         if (prim instanceof Relation) {
-            updateList();
+            // trigger a repaint of the relation list
+            displaylist.repaint();
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 2483)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 2484)
@@ -56,6 +56,4 @@
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.DataSetMerger;
-import org.openstreetmap.josm.data.osm.DataSource;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
@@ -1379,5 +1377,4 @@
     public static class DownloadTask extends PleaseWaitRunnable {
         private boolean cancelled;
-        private int conflictsCount;
         private Exception lastException;
         private List<Relation> relations;
@@ -1386,9 +1383,5 @@
 
         public DownloadTask(List<Relation> relations, OsmDataLayer curLayer, MemberTableModel memberTableModel, Dialog parent) {
-            super(tr("Download relation members"), new PleaseWaitProgressMonitor(parent), false /*
-             * don't
-             * ignore
-             * exception
-             */);
+            super(tr("Download relation members"), new PleaseWaitProgressMonitor(parent), false /* don't ignore exception */);
             this.relations = relations;
             this.curLayer = curLayer;
@@ -1397,9 +1390,5 @@
 
         public DownloadTask(List<Relation> relations, OsmDataLayer curLayer, MemberTableModel memberTableModel) {
-            super(tr("Download relation members"), new PleaseWaitProgressMonitor(), false /*
-             * don't
-             * ignore
-             * exception
-             */);
+            super(tr("Download relation members"), new PleaseWaitProgressMonitor(), false /* don't ignore exception */);
             this.relations = relations;
             this.curLayer = curLayer;
@@ -1424,13 +1413,4 @@
                 ExceptionDialogUtil.explainException(lastException);
             }
-
-            if (conflictsCount > 0) {
-                JOptionPane.showMessageDialog(
-                        Main.parent,
-                        tr("There were {0} conflicts during import.", conflictsCount),
-                        tr("Warning"),
-                        JOptionPane.WARNING_MESSAGE
-                );
-            }
         }
 
@@ -1438,37 +1418,25 @@
         protected void realRun() throws SAXException, IOException, OsmTransferException {
             try {
-                boolean changed = false;
                 for (Relation relation : relations) {
                     progressMonitor.indeterminateSubTask("");
                     OsmServerObjectReader reader = new OsmServerObjectReader(relation.getId(), OsmPrimitiveType.RELATION,
                             true);
-                    DataSet dataSet = reader.parseOsm(progressMonitor
+                    final DataSet dataSet = reader.parseOsm(progressMonitor
                             .createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
-                    if (dataSet != null) {
-                        changed = true;
-                        final DataSetMerger visitor = new DataSetMerger(curLayer.data, dataSet);
-                        visitor.merge();
-
-                        // copy the merged layer's data source info
-                        for (DataSource src : dataSet.dataSources) {
-                            curLayer.data.dataSources.add(src);
-                        }
-                        if (!visitor.getConflicts().isEmpty()) {
-                            curLayer.getConflicts().add(visitor.getConflicts());
-                            conflictsCount = visitor.getConflicts().size();
-                        }
-                    }
-                }
-                // FIXME: this is necessary because there are dialogs listening
-                // for DataChangeEvents which manipulate Swing components on this
-                // thread.
-                //
-                if (changed) {
-                    SwingUtilities.invokeLater(new Runnable() {
-                        public void run() {
-                            curLayer.fireDataChange();
-                            curLayer.onPostDownloadFromServer();
-                        }
-                    });
+                    if (dataSet == null)
+                        return;
+                    // has to run on the EDT because mergeFrom may trigger events
+                    // which update the UI
+                    //
+                    SwingUtilities.invokeAndWait(
+                            new Runnable() {
+                                public void run() {
+                                    curLayer.mergeFrom(dataSet);
+                                    curLayer.fireDataChange();
+                                    curLayer.onPostDownloadFromServer();
+                                }
+                            }
+                    );
+
                 }
             } catch (Exception e) {
Index: trunk/src/org/openstreetmap/josm/io/OsmServerObjectReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmServerObjectReader.java	(revision 2483)
+++ trunk/src/org/openstreetmap/josm/io/OsmServerObjectReader.java	(revision 2484)
@@ -34,5 +34,5 @@
         InputStream in = null;
         try {
-            progressMonitor.subTask(tr("Downloading OSM data..."));
+            progressMonitor.indeterminateSubTask(tr("Downloading OSM data..."));
             StringBuffer sb = new StringBuffer();
             sb.append(type.getAPIName());
