diff --git a/src/org/openstreetmap/josm/plugins/measurement/MeasurementDialog.java b/src/org/openstreetmap/josm/plugins/measurement/MeasurementDialog.java
index 18eed7b..eed7529 100644
--- a/src/org/openstreetmap/josm/plugins/measurement/MeasurementDialog.java
+++ b/src/org/openstreetmap/josm/plugins/measurement/MeasurementDialog.java
@@ -10,6 +10,7 @@ import java.awt.event.KeyEvent;
 import java.text.DecimalFormat;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Iterator;
 
 import javax.swing.AbstractAction;
 import javax.swing.JLabel;
@@ -177,24 +178,43 @@ public class MeasurementDialog extends ToggleDialog implements SelectionChangedL
             }
         } else {
             nodes = null;
+            Node areaStartNode = null;
+            double wayArea = 0.0;
             for (Way w : ways) {
-                Node lastN = null;
-                double wayArea = 0.0;
-                for (Node n: w.getNodes()) {
-                    if (lastN != null && lastN.getCoor() != null && n.getCoor() != null) {
-                        length += lastN.getCoor().greatCircleDistance(n.getCoor());
-                        //http://local.wasp.uwa.edu.au/~pbourke/geometry/polyarea/
-                        wayArea += (MeasurementLayer.calcX(n.getCoor()) * MeasurementLayer.calcY(lastN.getCoor()))
-                                 - (MeasurementLayer.calcY(n.getCoor()) * MeasurementLayer.calcX(lastN.getCoor()));
-                        segAngle = MeasurementLayer.angleBetween(lastN.getCoor(), n.getCoor());
+                Iterator<Node> nIter = w.getNodes().iterator();
+
+                if(!nIter.hasNext()) {
+                    // Empty way
+                    continue;
+                }
+
+                // First node of this way
+                Node n = nIter.next();
+                if (areaStartNode == null || n != lastNode) {
+                    // Starting new possible area (none started, or this way not joined to last way)
+                    areaStartNode = n;
+                    wayArea = 0.0;
+                }
+                lastNode = n;
+
+                // Subsequent nodes
+                while (nIter.hasNext()) {
+                    n = nIter.next();
+                    if (lastNode.getCoor() != null && n.getCoor() != null) {
+                        length += lastNode.getCoor().greatCircleDistance(n.getCoor());
+                        // http://www.mathopenref.com/coordpolygonarea2.html
+                        wayArea += (MeasurementLayer.calcX(n.getCoor()) * MeasurementLayer.calcY(lastNode.getCoor()))
+                                 - (MeasurementLayer.calcY(n.getCoor()) * MeasurementLayer.calcX(lastNode.getCoor()));
+                        segAngle = MeasurementLayer.angleBetween(lastNode.getCoor(), n.getCoor());
                     }
-                    lastN = n;
+                    lastNode = n;
+                }
+
+                // Found closed loop
+                if (lastNode != null && lastNode == areaStartNode) {
+                    area += Math.abs(wayArea / 2);
+                    areaStartNode = null;
                 }
-                if (lastN != null && lastN == w.getNodes().iterator().next())
-                    wayArea = Math.abs(wayArea / 2);
-                else
-                    wayArea = 0;
-                area += wayArea;
             }
         }
 
