diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java b/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
index 2e0bc2a..e87d5c2 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
@@ -31,6 +31,7 @@ import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
 import javax.swing.InputMap;
 import javax.swing.JButton;
+import javax.swing.JCheckBox;
 import javax.swing.JComponent;
 import javax.swing.JLabel;
 import javax.swing.JMenu;
@@ -65,6 +66,7 @@ import org.openstreetmap.josm.gui.dialogs.relation.actions.AddSelectedAtEndActio
 import org.openstreetmap.josm.gui.dialogs.relation.actions.AddSelectedAtStartAction;
 import org.openstreetmap.josm.gui.dialogs.relation.actions.AddSelectedBeforeSelection;
 import org.openstreetmap.josm.gui.dialogs.relation.actions.ApplyAction;
+import org.openstreetmap.josm.gui.dialogs.relation.actions.AutoUpdateAction;
 import org.openstreetmap.josm.gui.dialogs.relation.actions.CancelAction;
 import org.openstreetmap.josm.gui.dialogs.relation.actions.CopyMembersAction;
 import org.openstreetmap.josm.gui.dialogs.relation.actions.DeleteCurrentRelationAction;
@@ -130,15 +132,23 @@ public class GenericRelationEditor extends RelationEditor  {
     /**
      * Action for performing the {@link RefreshAction}
      */
-    private RefreshAction refreshAction;
+    public RefreshAction refreshAction;
     /**
      * Action for performing the {@link ApplyAction}
      */
-    private ApplyAction applyAction;
+    public ApplyAction applyAction;
+    /**
+     * Action for performing the {@link AutoUpdateAction}
+     */
+    public AutoUpdateAction autoUpdateAction;
     /**
      * Action for performing the {@link CancelAction}
      */
     private CancelAction cancelAction;
+    /**
+     * Flag used by some actions telling that change event comes from here
+     */
+    public boolean saving;
 
     /**
      * Creates a new relation editor for the given relation. The relation will be saved if the user
@@ -291,6 +301,21 @@ public class GenericRelationEditor extends RelationEditor  {
     }
 
     /**
+     * Check if automatic update is enabled.
+     * @return true if automatic update is enabled
+     */
+    public boolean isAutoUpdate() {
+        return autoUpdateAction.enabled();
+    }
+
+    /**
+     * Disable automatic update.
+     */
+    public void disableAutoUpdate() {
+        autoUpdateAction.disable();
+    }
+
+    /**
      * Creates the toolbar
      *
      * @return the toolbar
@@ -306,6 +331,7 @@ public class GenericRelationEditor extends RelationEditor  {
         DeleteCurrentRelationAction deleteAction = new DeleteCurrentRelationAction(getLayer(), this);
         addPropertyChangeListener(deleteAction);
         tb.add(deleteAction);
+        tb.add(new JCheckBox(autoUpdateAction = new AutoUpdateAction(this)));
         return tb;
     }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/ApplyAction.java b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/ApplyAction.java
index d2c5a34..5aca055 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/ApplyAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/ApplyAction.java
@@ -50,9 +50,15 @@ public class ApplyAction extends SavingAction implements PropertyChangeListener,
     }
 
     @Override
-    protected void updateEnabledState() {
-        setEnabled(isEditorDirty());
-    }
+    public void updateEnabledState() {
+        if (getEditor().saving) return;
+        boolean enable = isEditorDirty();
+        if (enable && getEditor().isAutoUpdate()) {
+            actionPerformed(null);
+        } else {
+            setEnabled(enable);
+        }
+     }
 
     @Override
     public void propertyChange(PropertyChangeEvent evt) {
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/RefreshAction.java b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/RefreshAction.java
index 9abdce4..d36016c 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/RefreshAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/RefreshAction.java
@@ -64,19 +64,27 @@ public class RefreshAction extends SavingAction implements CommandQueueListener
             }
             return;
         }
-        if (isEditorDirty() && confirmDiscardDirtyData() != 0)
+        if (isEditorDirty() && confirmDiscardDirtyData() != 0) {
+            getEditor().disableAutoUpdate();
             return;
+        }
         editor.reloadDataFromRelation();
     }
 
     @Override
     public void updateEnabledState() {
+        if (getEditor().saving) return;
         Relation relation = editor.getRelation();
         Relation snapshot = editor.getRelationSnapshot();
-        setEnabled(snapshot != null && (
+        boolean enable = snapshot != null && (
             !relation.hasEqualTechnicalAttributes(snapshot) ||
             !relation.hasEqualSemanticAttributes(snapshot)
-        ));
+        );
+        if (enable && getEditor().isAutoUpdate()) {
+            actionPerformed(null);
+        } else {
+            setEnabled(enable);
+        }
     }
 
     protected int confirmDiscardDirtyData() {
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/SavingAction.java b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/SavingAction.java
index d7371ec..ac06935 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/SavingAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/SavingAction.java
@@ -20,6 +20,7 @@ import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec;
+import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor;
 import org.openstreetmap.josm.gui.dialogs.relation.MemberTable;
 import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
 import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
@@ -165,6 +166,15 @@ abstract class SavingAction extends AbstractRelationEditorAction {
     }
 
     protected boolean applyChanges() {
+        GenericRelationEditor editor = getEditor();
+        editor.saving = true;
+        boolean ret = doApplyChanges();
+        editor.saving = false;
+        if (!ret) editor.disableAutoUpdate();
+        return ret;
+    }
+
+    protected boolean doApplyChanges() {
         if (editor.getRelation() == null) {
             applyNewRelation(tagModel);
         } else if (isEditorDirty()) {
@@ -196,4 +206,8 @@ abstract class SavingAction extends AbstractRelationEditorAction {
         Relation snapshot = editor.getRelationSnapshot();
         return (snapshot != null && !memberTableModel.hasSameMembersAs(snapshot)) || tagModel.isDirty();
     }
+
+    protected GenericRelationEditor getEditor() {
+        return (GenericRelationEditor) editor;
+    }
 }
