Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 1794)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 1795)
@@ -45,4 +45,5 @@
 import org.openstreetmap.josm.command.AddCommand;
 import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.DataSource;
@@ -534,5 +535,5 @@
      * This function saves the user's changes. Must be invoked manually.
      */
-    private void applyChanges() {
+    protected void applyChanges() {
         if (getRelation()== null) {
             // If the user wanted to create a new relation, but hasn't added any members or
@@ -546,9 +547,28 @@
             DataSet.fireSelectionChanged(Main.ds.getSelected());
         } else if (! memberTableModel.hasSameMembersAs(getRelation()) || tagEditorModel.isDirty()) {
-            Relation clone = new Relation(getRelation());
-            tagEditorModel.applyToPrimitive(clone);
-            memberTableModel.applyToRelation(clone);
-            Main.main.undoRedo.add(new ChangeCommand(getRelation(), clone));
-            DataSet.fireSelectionChanged(Main.ds.getSelected());
+            Relation editedRelation = new Relation(getRelation());
+            tagEditorModel.applyToPrimitive(editedRelation);
+            memberTableModel.applyToRelation(editedRelation);
+            if (isDirtyRelation()) {
+                Conflict<Relation> conflict = new Conflict<Relation>(getRelation(), editedRelation);
+                getLayer().getConflicts().add(conflict);
+                JOptionPane op = new JOptionPane(
+                        tr("<html>The relation has changed outside of the editor.<br>"
+                                + "Your edit can't be applied directly, a conflict has been created instead.</html>"
+                        ),
+                        JOptionPane.WARNING_MESSAGE
+                );
+                JDialog dialog = op.createDialog(Main.pleaseWaitDlg, tr("Conflict created"));
+                dialog.setAlwaysOnTop(true);
+                dialog.setModal(true);
+                dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+                dialog.setVisible(true);
+            } else {
+                Relation clone = new Relation(getRelation());
+                tagEditorModel.applyToPrimitive(clone);
+                memberTableModel.applyToRelation(clone);
+                Main.main.undoRedo.add(new ChangeCommand(getRelation(), clone));
+                DataSet.fireSelectionChanged(Main.ds.getSelected());
+            }
         }
     }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java	(revision 1794)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java	(revision 1795)
@@ -37,8 +37,10 @@
 
     /**
-     * The relation that this editor is working on, and the clone made for
-     * editing.
+     * The relation that this editor is working on.
      */
     private Relation relation;
+
+    /** The version of the relation when editing is started. */
+    private Relation relationSnapshot;
 
     /** the data layer the relation belongs to */
@@ -100,4 +102,5 @@
         );
 
+        this.relationSnapshot = new Relation(relation);
         this.relation = relation;
         this.layer = layer;
@@ -111,3 +114,19 @@
         return layer;
     }
+
+    protected Relation getRelationSnapshot() {
+        return relationSnapshot;
+    }
+
+    /**
+     * Replies true if the currently edited relation has been changed elsewhere.
+     * 
+     * In this case a relation editor can't apply updates to the relation directly. Rather,
+     * it has to create a conflict.
+     * 
+     * @return true if the currently edited relation has been changed elsewhere.
+     */
+    protected boolean isDirtyRelation() {
+        return ! relation.hasEqualSemanticAttributes(relationSnapshot);
+    }
 }
