Index: /applications/editors/josm/plugins/measurement/src/org/openstreetmap/josm/plugins/measurement/MeasurementDialog.java
===================================================================
--- /applications/editors/josm/plugins/measurement/src/org/openstreetmap/josm/plugins/measurement/MeasurementDialog.java	(revision 35046)
+++ /applications/editors/josm/plugins/measurement/src/org/openstreetmap/josm/plugins/measurement/MeasurementDialog.java	(revision 35047)
@@ -11,4 +11,5 @@
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Objects;
 
 import javax.swing.AbstractAction;
@@ -22,4 +23,5 @@
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
@@ -37,5 +39,11 @@
 import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
 import org.openstreetmap.josm.gui.help.HelpUtil;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.tools.Geometry;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -47,5 +55,5 @@
  * @author ramack
  */
-public class MeasurementDialog extends ToggleDialog implements DataSelectionListener, DataSetListener, SoMChangeListener {
+public class MeasurementDialog extends ToggleDialog implements DataSelectionListener, DataSetListener, SoMChangeListener, LayerChangeListener {
     private static final long serialVersionUID = 4708541586297950021L;
 
@@ -82,4 +90,5 @@
     private DataSet ds;
 
+    private Collection<Relation> relations;
     private Collection<Way> ways;
     private Collection<Node> nodes;
@@ -143,4 +152,5 @@
         }));
 
+        MainApplication.getLayerManager().addLayerChangeListener(this);
         SelectionEventManager.getInstance().addSelectionListener(this);
         SystemOfMeasurement.addSoMChangeListener(this);
@@ -185,12 +195,21 @@
         if (ways.isEmpty()) {
             nodes = new SubclassFilteredCollection<>(selection, Node.class::isInstance);
-            for (Node n : nodes) {
-                if (n.getCoor() != null) {
-                    if (lastNode == null) {
-                        lastNode = n;
-                    } else {
-                        length += lastNode.getCoor().greatCircleDistance(n.getCoor());
-                        segAngle = MeasurementLayer.angleBetween(lastNode.getCoor(), n.getCoor());
-                        lastNode = n;
+            if (nodes.isEmpty()) {
+                relations = new SubclassFilteredCollection<>(selection, Relation.class::isInstance);
+                for (Relation r : relations) {
+                    if (r.isMultipolygon()) {
+                        area += Geometry.multipolygonArea(r);
+                    }
+                }
+            } else {
+                for (Node n : nodes) {
+                    if (n.getCoor() != null) {
+                        if (lastNode == null) {
+                            lastNode = n;
+                        } else {
+                            length += lastNode.getCoor().greatCircleDistance(n.getCoor());
+                            segAngle = MeasurementLayer.angleBetween(lastNode.getCoor(), n.getCoor());
+                            lastNode = n;
+                        }
                     }
                 }
@@ -264,19 +283,34 @@
         SystemOfMeasurement.removeSoMChangeListener(this);
         SelectionEventManager.getInstance().removeSelectionListener(this);
+        MainApplication.getLayerManager().removeLayerChangeListener(this);
+        clear();
+    }
+
+    private void clear() {
         if (ds != null) {
             ds.removeDataSetListener(this);
             ds = null;
         }
-    }
-
-    private boolean waysContain(Node n) {
-        if (ways != null) {
-            for (Way w : ways) {
-                if (w.containsNode(n)) {
-                    return true;
-                }
-            }
-        }
-        return false;
+        clear(relations);
+        clear(ways);
+        clear(nodes);
+    }
+
+    private static void clear(Collection<?> collection) {
+        if (collection != null) {
+            collection.clear();
+        }
+    }
+
+    private boolean parentsContain(Way w) {
+        return w.getReferrers().stream()
+                .anyMatch(ref -> ref instanceof Relation && relations != null && relations.contains(ref));
+    }
+
+    private boolean parentsContain(Node n) {
+        return n.getReferrers().stream()
+                .anyMatch(ref
+                        -> (ref instanceof Way && ((ways != null && ways.contains(ref)) || parentsContain((Way) ref)))
+                        || (ref instanceof Relation && relations != null && relations.contains(ref)));
     }
 
@@ -284,5 +318,5 @@
         Node n = event.getNode();
         // Refresh selection if a node belonging to a selected member has moved (example: scale action)
-        if ((nodes != null && nodes.contains(n)) || waysContain(n)) {
+        if ((nodes != null && nodes.contains(n)) || parentsContain(n)) {
             refresh(event.getDataset().getSelected());
         }
@@ -290,5 +324,12 @@
 
     @Override public void wayNodesChanged(WayNodesChangedEvent event) {
-        if (ways.contains(event.getChangedWay())) {
+        Way w = event.getChangedWay();
+        if ((ways != null && ways.contains(w)) || parentsContain(w)) {
+            refresh(event.getDataset().getSelected());
+        }
+    }
+
+    @Override public void relationMembersChanged(RelationMembersChangedEvent event) {
+        if (relations != null && relations.contains(event.getRelation())) {
             refresh(event.getDataset().getSelected());
         }
@@ -298,5 +339,4 @@
     @Override public void primitivesRemoved(PrimitivesRemovedEvent event) {}
     @Override public void tagsChanged(TagsChangedEvent event) {}
-    @Override public void relationMembersChanged(RelationMembersChangedEvent event) {}
     @Override public void otherDatasetChange(AbstractDatasetChangedEvent event) {}
     @Override public void dataChanged(DataChangedEvent event) {}
@@ -310,3 +350,13 @@
         }
     }
+
+    @Override public void layerOrderChanged(LayerOrderChangeEvent e) {}
+    @Override public void layerAdded(LayerAddEvent e) {}
+
+    @Override
+    public void layerRemoving(LayerRemoveEvent e) {
+        if (e.getRemovedLayer() instanceof OsmDataLayer && Objects.equals(ds, ((OsmDataLayer) e.getRemovedLayer()).getDataSet())) {
+            clear();
+        }
+    }
 }
