Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 17171)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 17172)
@@ -51,4 +51,6 @@
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.data.UndoRedoHandler;
+import org.openstreetmap.josm.data.UndoRedoHandler.CommandQueueListener;
 import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -115,5 +117,5 @@
  * @since 343
  */
-public class GenericRelationEditor extends RelationEditor {
+public class GenericRelationEditor extends RelationEditor implements CommandQueueListener {
     /** the tag table and its model */
     private final TagEditorPanel tagEditorPanel;
@@ -310,4 +312,5 @@
         memberTableModel.setSelectedMembers(selectedMembers);
         HelpUtil.setHelpContext(getRootPane(), ht("/Dialog/RelationEditor"));
+        UndoRedoHandler.getInstance().addCommandQueueListener(this);
     }
 
@@ -836,4 +839,6 @@
     public void dispose() {
         refreshAction.destroy();
+        UndoRedoHandler.getInstance().removeCommandQueueListener(this);
+        setRelation(null);
         super.dispose();
     }
@@ -1015,3 +1020,13 @@
 
     }
+
+    @Override
+    public void commandChanged(int queueSize, int redoSize) {
+        Relation r = getRelation();
+        if (r != null && r.getDataSet() == null) {
+            // see #19915
+            setRelation(null);
+            applyAction.updateEnabledState();
+        }
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java	(revision 17171)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java	(revision 17172)
@@ -158,5 +158,4 @@
     public void dispose() {
         layer.setRecentRelation(relation);
-        setRelation(null);
         super.dispose();
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/ApplyAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/ApplyAction.java	(revision 17171)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/ApplyAction.java	(revision 17172)
@@ -35,5 +35,5 @@
 
     @Override
-    protected void updateEnabledState() {
+    public void updateEnabledState() {
         setEnabled(isEditorDirty());
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/RefreshAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/RefreshAction.java	(revision 17171)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/RefreshAction.java	(revision 17172)
@@ -68,7 +68,15 @@
     @Override
     public void updateEnabledState() {
-        Relation snapshot = editorAccess.getEditor().getRelationSnapshot();
-        setEnabled((!getMemberTableModel().hasSameMembersAs(snapshot) || getTagModel().isDirty())
-                && !(snapshot == null && getTagModel().getTags().isEmpty()));
+        Relation snapshot = getEditor().getRelationSnapshot();
+        Relation relation = getEditor().getRelation();
+        if (relation != null && relation.getDataSet() == null)
+            relation = null; // see #19915
+        if (relation != null && snapshot != null && snapshot.getDataSet() == null) {
+            // relation was changed outside of the editor
+            // either it was modified or deleted or changed by an undo
+            setEnabled(!snapshot.hasEqualSemanticAttributes(relation));
+            return;
+        }
+        setEnabled(false);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/SavingAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/SavingAction.java	(revision 17171)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/SavingAction.java	(revision 17172)
@@ -178,5 +178,6 @@
     protected boolean isEditorDirty() {
         Relation snapshot = editorAccess.getEditor().getRelationSnapshot();
-        return (snapshot != null && !getMemberTableModel().hasSameMembersAs(snapshot)) || getTagModel().isDirty();
+        return (snapshot != null && !getMemberTableModel().hasSameMembersAs(snapshot)) || getTagModel().isDirty()
+                || getEditor().getRelation() == null || getEditor().getRelation().getDataSet() == null;
     }
 }
