Index: /trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java	(revision 9386)
+++ /trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java	(revision 9387)
@@ -37,4 +37,5 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.gui.DefaultNameFormatter;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MapView;
@@ -78,4 +79,14 @@
     @Override
     public void actionPerformed(ActionEvent e) {
+        try {
+            unglue(e);
+        } catch (UserCancelException ignore) {
+            Main.debug(ignore.getMessage());
+        } finally {
+            cleanup();
+        }
+    }
+
+    protected void unglue(ActionEvent e) throws UserCancelException {
 
         Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
@@ -84,8 +95,5 @@
         int errorTime = Notification.TIME_DEFAULT;
         if (checkSelectionOneNodeAtMostOneWay(selection)) {
-            if (!checkAndConfirmOutlyingUnglue()) {
-                // FIXME: Leaving action without clearing selectedNode, selectedWay, selectedNodes
-                return;
-            }
+            checkAndConfirmOutlyingUnglue();
             int count = 0;
             for (Way w : OsmPrimitive.getFilteredList(selectedNode.getReferrers(), Way.class)) {
@@ -115,8 +123,5 @@
             }
         } else if (checkSelectionOneWayAnyNodes(selection)) {
-            if (!checkAndConfirmOutlyingUnglue()) {
-                // FIXME: Leaving action without clearing selectedNode, selectedWay, selectedNodes
-                return;
-            }
+            checkAndConfirmOutlyingUnglue();
             Set<Node> tmpNodes = new HashSet<>();
             for (Node n : selectedNodes) {
@@ -167,5 +172,7 @@
                     .show();
         }
-
+    }
+
+    private void cleanup() {
         selectedNode = null;
         selectedWay = null;
@@ -535,6 +542,8 @@
                 cmds.add(new ChangeCommand(w, modifyWay(selectedNode, w, cmds, newNodes)));
             }
+            notifyWayPartOfRelation(parentWays);
         } else {
             cmds.add(new ChangeCommand(selectedWay, modifyWay(selectedNode, selectedWay, cmds, newNodes)));
+            notifyWayPartOfRelation(Collections.singleton(selectedWay));
         }
 
@@ -599,4 +608,5 @@
         }
         cmds.add(new ChangeNodesCommand(way, newNodes));
+        notifyWayPartOfRelation(Collections.singleton(way));
         try {
             final PropertiesMembershipDialog dialog = PropertiesMembershipDialog.showIfNecessary(Collections.singleton(selectedNode), false);
@@ -637,4 +647,5 @@
         }
         cmds.add(new ChangeCommand(selectedWay, tmpWay)); // only one changeCommand for a way, else garbage will happen
+        notifyWayPartOfRelation(Collections.singleton(selectedWay));
 
         Main.main.undoRedo.add(new SequenceCommand(
@@ -658,5 +669,5 @@
     }
 
-    protected boolean checkAndConfirmOutlyingUnglue() {
+    protected void checkAndConfirmOutlyingUnglue() throws UserCancelException {
         List<OsmPrimitive> primitives = new ArrayList<>(2 + (selectedNodes == null ? 0 : selectedNodes.size()));
         if (selectedNodes != null)
@@ -664,5 +675,5 @@
         if (selectedNode != null)
             primitives.add(selectedNode);
-        return Command.checkAndConfirmOutlyingOperation("unglue",
+        final boolean ok = Command.checkAndConfirmOutlyingOperation("unglue",
                 tr("Unglue confirmation"),
                 tr("You are about to unglue nodes outside of the area you have downloaded."
@@ -676,4 +687,23 @@
                         + "<br>" + "Do you really want to unglue?"),
                 primitives, null);
+        if (!ok) {
+            throw new UserCancelException();
+        }
+    }
+
+    protected void notifyWayPartOfRelation(final Iterable<Way> ways) {
+        final Set<String> affectedRelations = new HashSet<>();
+        for (Way way : ways) {
+            for (OsmPrimitive ref : way.getReferrers()) {
+                if (ref instanceof Relation && ref.isUsable()) {
+                    affectedRelations.add((ref.getDisplayName(DefaultNameFormatter.getInstance())));
+                }
+            }
+        }
+        final String msg1 = trn("Unglueing affected {0} relation: {1}", "Unglueing affected {0} relations: {1}",
+                affectedRelations.size(), affectedRelations.size(), Utils.joinAsHtmlUnorderedList(affectedRelations));
+        final String msg2 = trn("Ensure that the relation has not been broken!", "Ensure that the relations have not been broken!",
+                affectedRelations.size());
+        new Notification("<html>" + msg1 + msg2).setIcon(JOptionPane.WARNING_MESSAGE).show();
     }
 }
