Index: trunk/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 1771)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 1772)
@@ -308,5 +308,7 @@
         Relation relation = (Relation)membershipData.getValueAt(row, 0);
         Main.main.map.relationListDialog.selectRelation(relation);
-        RelationEditor.getEditor(relation,
+        RelationEditor.getEditor(
+                Main.map.mapView.getEditLayer(),
+                relation,
                 (Collection<RelationMember>) membershipData.getValueAt(row, 1) ).setVisible(true);
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 1771)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 1772)
@@ -59,5 +59,5 @@
             if (toEdit == null)
                 return;
-            RelationEditor.getEditor(toEdit, null).setVisible(true);
+            RelationEditor.getEditor(Main.map.mapView.getEditLayer(),toEdit, null).setVisible(true);
         }
     });
@@ -94,5 +94,5 @@
             public void actionPerformed(ActionEvent e) {
                 // call relation editor with null argument to create new relation
-                RelationEditor.getEditor(null, null).setVisible(true);
+                RelationEditor.getEditor(Main.map.mapView.getEditLayer(),null, null).setVisible(true);
             }
         }), GBC.std());
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 1771)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 1772)
@@ -53,4 +53,5 @@
 import org.openstreetmap.josm.gui.dialogs.relation.ac.AutoCompletionCache;
 import org.openstreetmap.josm.gui.dialogs.relation.ac.AutoCompletionList;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.io.OsmApi;
 import org.openstreetmap.josm.io.OsmServerObjectReader;
@@ -141,8 +142,13 @@
      * @param relation relation to edit, or null to create a new one.
      */
-    public GenericRelationEditor(Relation relation, Collection<RelationMember> selectedMembers )
+    public GenericRelationEditor(OsmDataLayer layer, Relation relation, Collection<RelationMember> selectedMembers )
     {
         // Initalizes ExtendedDialog
-        super(relation, selectedMembers);
+        super(layer, relation, selectedMembers);
+        System.out.println("-- After super  constructor");
+        for (OsmPrimitive primitive : getLayer().data.allNonDeletedPrimitives()) {
+            System.out.println(OsmPrimitiveType.from(primitive) + " " + primitive.id + " incomplete=" + primitive.incomplete);
+        }
+        System.out.println("-------------");
         acCache = AutoCompletionCache.getCacheForLayer(Main.map.mapView.getEditLayer());
         acList = new AutoCompletionList();
@@ -527,5 +533,4 @@
             }
         }
-
         refreshTables();
     }
@@ -565,4 +570,29 @@
         // FIXME: Make it remember dialog size
         return new Dimension(600, 500);
+    }
+
+    /**
+     * Updates the references from members of the cloned relation (see {@see #getClone())
+     * after an update from the server.
+     *
+     */
+    protected void updateMemberReferencesInClone() {
+        DataSet ds = getLayer().data;
+        for (RelationMember member : getClone().members) {
+            if (member.member.id == 0) {
+                continue;
+            }
+            OsmPrimitive primitive = ds.getPrimitiveById(member.member.id);
+            if (primitive != null) {
+                StringBuffer sb = new StringBuffer();
+                sb.append("updating primitive:")
+                .append("type=" + OsmPrimitiveType.from(primitive))
+                .append(", id=" + primitive.id)
+                .append(", was incomplete=" + member.member.incomplete)
+                .append(", is incomplete=" + primitive.incomplete);
+                System.out.println(sb.toString());
+                member.member = primitive;
+            }
+        }
     }
 
@@ -800,6 +830,7 @@
             @Override
             protected void finish() {
+                if (cancelled) return;
+                updateMemberReferencesInClone();
                 refreshTables();
-                if (cancelled) return;
                 if (lastException == null) return;
                 showLastException();
@@ -815,18 +846,23 @@
                     DataSet dataSet = reader.parseOsm();
                     if (dataSet != null) {
-                        final MergeVisitor visitor = new MergeVisitor(Main.main.map.mapView.getEditLayer()
-                                .data, dataSet);
+                        for (OsmPrimitive primitive : getLayer().data.allNonDeletedPrimitives()) {
+                            System.out.println(OsmPrimitiveType.from(primitive) + " " + primitive.id + " incomplete=" + primitive.incomplete);
+                        }
+                        System.out.println("-------------");
+                        final MergeVisitor visitor = new MergeVisitor(getLayer().data, dataSet);
                         visitor.merge();
+                        for (OsmPrimitive primitive : getLayer().data.allNonDeletedPrimitives()) {
+                            System.out.println(OsmPrimitiveType.from(primitive) + " " + primitive.id + " incomplete=" + primitive.incomplete);
+                        }
 
                         // copy the merged layer's data source info
                         for (DataSource src : dataSet.dataSources) {
-                            Main.map.mapView.getEditLayer().data.dataSources.add(src);
-                        }
-                        Main.map.mapView.getEditLayer().fireDataChange();
+                            getLayer().data.dataSources.add(src);
+                        }
+                        getLayer().fireDataChange();
 
                         if (visitor.getConflicts().isEmpty())
                             return;
-                        final ConflictDialog dlg = Main.map.conflictDialog;
-                        dlg.getConflicts().add(visitor.getConflicts());
+                        getLayer().getConflicts().add(visitor.getConflicts());
                         JOptionPane op = new JOptionPane(
                                 tr("There were {0} conflicts during import.",
@@ -835,5 +871,5 @@
                         );
                         JDialog dialog = op.createDialog(Main.pleaseWaitDlg, tr("Conflicts in data"));
-                        dialog.setAlwaysOnTop(true); //<-- this line
+                        dialog.setAlwaysOnTop(true);
                         dialog.setModal(true);
                         dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java	(revision 1771)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java	(revision 1772)
@@ -5,6 +5,11 @@
 import java.awt.event.WindowEvent;
 import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map.Entry;
 
 import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 
 /**
@@ -12,23 +17,70 @@
  *
  */
-public class RelationDialogManager extends WindowAdapter {
+public class RelationDialogManager extends WindowAdapter implements LayerChangeListener {
+    static private class DialogContext {
+        public Relation relation;
+        public OsmDataLayer layer;
 
-    private HashMap<Relation, RelationEditor> openDialogs;
+        public DialogContext(OsmDataLayer layer, Relation relation) {
+            this.layer = layer;
+            this.relation = relation;
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + ((layer == null) ? 0 : layer.hashCode());
+            result = prime * result + ((relation == null) ? 0 : relation.hashCode());
+            return result;
+        }
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (obj == null)
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+            DialogContext other = (DialogContext) obj;
+            if (layer == null) {
+                if (other.layer != null)
+                    return false;
+            } else if (!layer.equals(other.layer))
+                return false;
+            if (relation == null) {
+                if (other.relation != null)
+                    return false;
+            } else if (!relation.equals(other.relation))
+                return false;
+            return true;
+        }
+
+        public boolean matchesLayer(OsmDataLayer layer) {
+            if (layer == null) return false;
+            return this.layer.equals(layer);
+        }
+    }
+
+    private HashMap<DialogContext, RelationEditor> openDialogs;
 
     public RelationDialogManager(){
-        openDialogs = new HashMap<Relation, RelationEditor>();
+        openDialogs = new HashMap<DialogContext, RelationEditor>();
     }
 
-    public void register(Relation relation, RelationEditor editor) {
-        openDialogs.put(relation, editor);
+    public void register(OsmDataLayer layer, Relation relation, RelationEditor editor) {
+        DialogContext context = new DialogContext(layer, relation);
+        openDialogs.put(context, editor);
         editor.addWindowListener(this);
     }
 
-    public boolean isOpenInEditor(Relation relation) {
-        return openDialogs.keySet().contains(relation);
+    public boolean isOpenInEditor(OsmDataLayer layer, Relation relation) {
+        DialogContext context = new DialogContext(layer, relation);
+        return openDialogs.keySet().contains(context);
     }
 
-    public RelationEditor getEditorForRelation(Relation relation) {
-        return openDialogs.get(relation);
+    public RelationEditor getEditorForRelation(OsmDataLayer layer, Relation relation) {
+        DialogContext context = new DialogContext(layer, relation);
+        return openDialogs.get(context);
     }
 
@@ -36,14 +88,39 @@
     public void windowClosed(WindowEvent e) {
         RelationEditor editor = ((RelationEditor)e.getWindow());
-        Relation editedRelation = null;
-        for (Relation r : openDialogs.keySet()) {
-            if (openDialogs.get(r).equals(editor)) {
-                editedRelation = r;
+        DialogContext context = null;
+        for (DialogContext c : openDialogs.keySet()) {
+            if (openDialogs.get(c).equals(editor)) {
+                context = c;
                 break;
             }
         }
-        if (editedRelation != null) {
-            openDialogs.remove(editedRelation);
+        if (context != null) {
+            openDialogs.remove(context);
         }
     }
+
+    public void layerRemoved(Layer oldLayer) {
+        if (oldLayer == null || ! (oldLayer instanceof OsmDataLayer))
+            return;
+        OsmDataLayer dataLayer = (OsmDataLayer)oldLayer;
+
+        Iterator<Entry<DialogContext,RelationEditor>> it = openDialogs.entrySet().iterator();
+        while(it.hasNext()) {
+            Entry<DialogContext,RelationEditor> entry = it.next();
+            if (entry.getKey().matchesLayer(dataLayer)) {
+                RelationEditor editor = entry.getValue();
+                it.remove();
+                editor.setVisible(false);
+                editor.dispose();
+            }
+        }
+    }
+
+    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+        // do nothing
+    }
+
+    public void layerAdded(Layer newLayer) {
+        // do nothing
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java	(revision 1771)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java	(revision 1772)
@@ -10,7 +10,11 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
 public abstract class RelationEditor extends ExtendedDialog {
@@ -27,4 +31,5 @@
         if (relationDialogManager == null) {
             relationDialogManager = new RelationDialogManager();
+            Layer.listeners.add(relationDialogManager);
         }
         return relationDialogManager;
@@ -39,4 +44,7 @@
     private Relation relation;
     private Relation clone;
+
+    /** the data layer the relation belongs to */
+    private OsmDataLayer layer;
 
     /**
@@ -58,5 +66,5 @@
      * @return an instance of RelationEditor suitable for editing that kind of relation
      */
-    public static RelationEditor getEditor(Relation r, Collection<RelationMember> selectedMembers) {
+    public static RelationEditor getEditor(OsmDataLayer layer, Relation r, Collection<RelationMember> selectedMembers) {
         for (Class<RelationEditor> e : editors) {
             try {
@@ -65,5 +73,5 @@
                 if (canEdit) {
                     Constructor<RelationEditor> con = e.getConstructor(Relation.class, Collection.class);
-                    RelationEditor editor = con.newInstance(r, selectedMembers);
+                    RelationEditor editor = con.newInstance(layer, r, selectedMembers);
                     return editor;
                 }
@@ -72,28 +80,35 @@
             }
         }
-        if (getRelationDialogManager().isOpenInEditor(r))
-            return getRelationDialogManager().getEditorForRelation(r);
+        if (getRelationDialogManager().isOpenInEditor(layer, r))
+            return getRelationDialogManager().getEditorForRelation(layer, r);
         else {
-            RelationEditor editor = new GenericRelationEditor(r, selectedMembers);
-            getRelationDialogManager().register(r, editor);
+            RelationEditor editor = new GenericRelationEditor(layer, r, selectedMembers);
+            getRelationDialogManager().register(layer, r, editor);
             return editor;
         }
     }
 
-    protected RelationEditor(Relation relation, Collection<RelationMember> selectedMembers)
+    protected RelationEditor(OsmDataLayer layer, Relation relation, Collection<RelationMember> selectedMembers)
     {
         // Initalizes ExtendedDialog
         super(Main.parent,
                 relation == null
-                ? tr("Create new relation")
+                ? tr("Create new relation in layer ''{0}''", layer.getName())
                         : (relation.id == 0
-                                ? tr ("Edit new relation")
-                                        : tr("Edit relation #{0}", relation.id)
+                                ? tr ("Edit new relation in layer ''{0}''", layer.getName())
+                                        : tr("Edit relation #{0} in layer ''{1}''", relation.id, layer.getName())
                         ),
                         new String[] { tr("Apply Changes"), tr("Cancel")},
                         false
         );
+        System.out.println("-- in super  constructor");
+        for (OsmPrimitive primitive : layer.data.allNonDeletedPrimitives()) {
+            System.out.println(OsmPrimitiveType.from(primitive) + " " + primitive.id + " incomplete=" + primitive.incomplete);
+        }
+        System.out.println("-------------");
+
 
         this.relation = relation;
+        this.layer = layer;
 
         if (relation == null) {
@@ -113,3 +128,7 @@
         return clone;
     }
+
+    protected OsmDataLayer getLayer() {
+        return layer;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/layer/Layer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/Layer.java	(revision 1771)
+++ trunk/src/org/openstreetmap/josm/gui/layer/Layer.java	(revision 1772)
@@ -123,3 +123,13 @@
     public File getAssociatedFile() { return associatedFile; }
     public void setAssociatedFile(File file) { associatedFile = file; }
+
+
+    /**
+     * Replies the name of the layer
+     * 
+     * @return the name of the layer
+     */
+    public String getName() {
+        return name;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/io/BoundingBoxDownloader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/BoundingBoxDownloader.java	(revision 1771)
+++ trunk/src/org/openstreetmap/josm/io/BoundingBoxDownloader.java	(revision 1772)
@@ -101,5 +101,5 @@
                 return null;
             Main.pleaseWaitDlg.currentAction.setText(tr("Downloading OSM data..."));
-            final DataSet data = OsmReader.parseDataSet(in, null, Main.pleaseWaitDlg);
+            final DataSet data = OsmReader.parseDataSet(in,Main.pleaseWaitDlg);
             in.close();
             activeConnection = null;
Index: trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java	(revision 1771)
+++ trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java	(revision 1772)
@@ -319,5 +319,5 @@
         Main.pleaseWaitDlg.currentAction.setText(tr("Downloading OSM data..."));
         try {
-            final OsmReader osm = OsmReader.parseDataSetOsm(in, outputDataSet, Main.pleaseWaitDlg);
+            final OsmReader osm = OsmReader.parseDataSetOsm(in, Main.pleaseWaitDlg);
             skippedWayIds.addAll(osm.getSkippedWayIds());
             merge(osm.getDs());
@@ -345,5 +345,5 @@
         Main.pleaseWaitDlg.currentAction.setText(tr("Downloading OSM data..."));
         try {
-            final OsmReader osm = OsmReader.parseDataSetOsm(in, null, Main.pleaseWaitDlg);
+            final OsmReader osm = OsmReader.parseDataSetOsm(in,Main.pleaseWaitDlg);
             skippedWayIds.addAll(osm.getSkippedWayIds());
             merge(osm.getDs());
Index: trunk/src/org/openstreetmap/josm/io/OsmImporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmImporter.java	(revision 1771)
+++ trunk/src/org/openstreetmap/josm/io/OsmImporter.java	(revision 1772)
@@ -46,5 +46,5 @@
 
     protected void importData(InputStream in, File associatedFile) throws SAXException, IOException {
-        OsmReader osm = OsmReader.parseDataSetOsm(in, null, Main.pleaseWaitDlg);
+        OsmReader osm = OsmReader.parseDataSetOsm(in,Main.pleaseWaitDlg);
         DataSet dataSet = osm.getDs();
         OsmDataLayer layer = new OsmDataLayer(dataSet, associatedFile.getName(), associatedFile);
@@ -55,6 +55,7 @@
             String notes = osm.getParseNotes();
             int j = 0;
-            for (int i = 0; i < 5; i++)
+            for (int i = 0; i < 5; i++) {
                 j = notes.indexOf('\n', j + 1);
+            }
             j = j >= 0 ? j : notes.length();
             JOptionPane.showMessageDialog(Main.parent, notes.substring(0, j));
Index: trunk/src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 1771)
+++ trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 1772)
@@ -52,10 +52,4 @@
 
     /**
-     * This is used as (readonly) source for finding missing references when not transferred in the
-     * file.
-     */
-    private DataSet references;
-
-    /**
      * The dataset to add parsed objects to.
      */
@@ -88,4 +82,13 @@
     private Map<Long, Node> nodes = new HashMap<Long, Node>();
 
+
+    /**
+     * constructor (for private use only)
+     * 
+     * @see #parseDataSet(InputStream, DataSet, PleaseWaitDialog)
+     * @see #parseDataSetOsm(InputStream, DataSet, PleaseWaitDialog)
+     */
+    private OsmReader() {
+    }
 
     private static class OsmPrimitiveData {
@@ -342,11 +345,4 @@
         if (n != null)
             return n;
-        for (Node node : references.nodes)
-            if (node.id == id)
-                return node;
-        // TODO: This has to be changed to support multiple layers.
-        for (Node node : Main.ds.nodes)
-            if (node.id == id)
-                return new Node(node);
         return null;
     }
@@ -382,5 +378,6 @@
     /**
      * Return the Way object with the given id, or null if it doesn't
-     * exist yet. This method only looks at ways stored in the data set.
+     * exist yet. This method only looks at ways stored in the already parsed
+     * ways.
      *
      * @param id
@@ -388,7 +385,7 @@
      */
     private Way findWay(long id) {
-        for (Way wy : Main.ds.ways)
-            if (wy.id == id)
-                return wy;
+        for (Way way : ds.ways)
+            if (way.id == id)
+                return way;
         return null;
     }
@@ -396,5 +393,6 @@
     /**
      * Return the Relation object with the given id, or null if it doesn't
-     * exist yet. This method only looks at relations stored in the data set.
+     * exist yet. This method only looks at relations in the already parsed
+     * relations.
      *
      * @param id
@@ -403,7 +401,4 @@
     private Relation findRelation(long id) {
         for (Relation e : ds.relations)
-            if (e.id == id)
-                return e;
-        for (Relation e : Main.ds.relations)
             if (e.id == id)
                 return e;
@@ -476,11 +471,10 @@
      *  element found there is returned.
      */
-    public static DataSet parseDataSet(InputStream source, DataSet ref, PleaseWaitDialog pleaseWaitDlg) throws SAXException, IOException {
-        return parseDataSetOsm(source, ref, pleaseWaitDlg).ds;
-    }
-
-    public static OsmReader parseDataSetOsm(InputStream source, DataSet ref, PleaseWaitDialog pleaseWaitDlg) throws SAXException, IOException {
+    public static DataSet parseDataSet(InputStream source, PleaseWaitDialog pleaseWaitDlg) throws SAXException, IOException {
+        return parseDataSetOsm(source, pleaseWaitDlg).ds;
+    }
+
+    public static OsmReader parseDataSetOsm(InputStream source,PleaseWaitDialog pleaseWaitDlg) throws SAXException, IOException {
         OsmReader osm = new OsmReader();
-        osm.references = ref == null ? new DataSet() : ref;
 
         // phase 1: Parse nodes and read in raw ways
Index: trunk/src/org/openstreetmap/josm/io/OsmServerLocationReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmServerLocationReader.java	(revision 1771)
+++ trunk/src/org/openstreetmap/josm/io/OsmServerLocationReader.java	(revision 1772)
@@ -32,5 +32,5 @@
                 return null;
             Main.pleaseWaitDlg.currentAction.setText(tr("Downloading OSM data..."));
-            final DataSet data = OsmReader.parseDataSet(in, null, Main.pleaseWaitDlg);
+            final DataSet data = OsmReader.parseDataSet(in, Main.pleaseWaitDlg);
             in.close();
             activeConnection = null;
Index: trunk/src/org/openstreetmap/josm/io/OsmServerObjectReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmServerObjectReader.java	(revision 1771)
+++ trunk/src/org/openstreetmap/josm/io/OsmServerObjectReader.java	(revision 1772)
@@ -48,5 +48,5 @@
                 return null;
             Main.pleaseWaitDlg.currentAction.setText(tr("Downloading OSM data..."));
-            final OsmReader osm = OsmReader.parseDataSetOsm(in, null, Main.pleaseWaitDlg);
+            final OsmReader osm = OsmReader.parseDataSetOsm(in,Main.pleaseWaitDlg);
             final DataSet data = osm.getDs();
 
