Index: trunk/src/org/openstreetmap/josm/data/validation/tests/Coastlines.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/Coastlines.java	(revision 6474)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/Coastlines.java	(revision 6475)
@@ -8,4 +8,5 @@
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -218,12 +219,16 @@
     public Command fixError(TestError testError) {
         if (isFixable(testError)) {
-            Way way = (Way) testError.getPrimitives().iterator().next();
-            Way newWay = new Way(way);
-
-            List<Node> nodesCopy = newWay.getNodes();
-            Collections.reverse(nodesCopy);
-            newWay.setNodes(nodesCopy);
-
-            return new ChangeCommand(way, newWay);
+            // primitives list can be empty if all primitives have been purged
+            Iterator<? extends OsmPrimitive> it = testError.getPrimitives().iterator();
+            if (it.hasNext()) {
+                Way way = (Way) it.next();
+                Way newWay = new Way(way);
+
+                List<Node> nodesCopy = newWay.getNodes();
+                Collections.reverse(nodesCopy);
+                newWay.setNodes(nodesCopy);
+
+                return new ChangeCommand(way, newWay);
+            }
         }
         return null;
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/DuplicatedWayNodes.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/DuplicatedWayNodes.java	(revision 6474)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/DuplicatedWayNodes.java	(revision 6475)
@@ -6,8 +6,10 @@
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Iterator;
 
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.validation.Severity;
@@ -49,27 +51,34 @@
     }
 
-    @Override public Command fixError(TestError testError) {
-        Way w = (Way) testError.getPrimitives().iterator().next();
-        Way wnew = new Way(w);
-        wnew.setNodes(null);
-        Node lastN = null;
-        for (Node n : w.getNodes()) {
-            if (lastN == null) {
-                wnew.addNode(n);
-            } else if (n == lastN) {
-                // Skip this node
-            } else {
-                wnew.addNode(n);
+    @Override
+    public Command fixError(TestError testError) {
+        // primitives list can be empty if all primitives have been purged
+        Iterator<? extends OsmPrimitive> it = testError.getPrimitives().iterator();
+        if (it.hasNext()) {
+            Way w = (Way) it.next();
+            Way wnew = new Way(w);
+            wnew.setNodes(null);
+            Node lastN = null;
+            for (Node n : w.getNodes()) {
+                if (lastN == null) {
+                    wnew.addNode(n);
+                } else if (n == lastN) {
+                    // Skip this node
+                } else {
+                    wnew.addNode(n);
+                }
+                lastN = n;
             }
-            lastN = n;
+            if (wnew.getNodesCount() < 2)
+                // Empty way, delete
+                return deletePrimitivesIfNeeded(Collections.singleton(w));
+            else
+                return new ChangeCommand(w, wnew);
         }
-        if (wnew.getNodesCount() < 2)
-            // Empty way, delete
-            return deletePrimitivesIfNeeded(Collections.singleton(w));
-        else
-            return new ChangeCommand(w, wnew);
+        return null;
     }
 
-    @Override public boolean isFixable(TestError testError) {
+    @Override
+    public boolean isFixable(TestError testError) {
         return testError.getTester() instanceof DuplicatedWayNodes;
     }
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/Highways.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/Highways.java	(revision 6474)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/Highways.java	(revision 6475)
@@ -8,4 +8,5 @@
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -30,12 +31,12 @@
     protected static final int WRONG_ROUNDABOUT_HIGHWAY = 2701;
     protected static final int MISSING_PEDESTRIAN_CROSSING = 2702;
-    
+
     /**
      * Classified highways in order of importance
      */
     protected static final List<String> CLASSIFIED_HIGHWAYS = Arrays.asList(
-            "motorway",  "motorway_link", 
-            "trunk",     "trunk_link", 
-            "primary",   "primary_link", 
+            "motorway",  "motorway_link",
+            "trunk",     "trunk_link",
+            "primary",   "primary_link",
             "secondary", "secondary_link",
             "tertiary",  "tertiary_link",
@@ -50,5 +51,5 @@
     int cyclistWays = 0;
     int carsWays = 0;
-    
+
     /**
      * Constructs a new {@code Highways} test.
@@ -61,13 +62,13 @@
 
         public final String correctValue;
-        
+
         public WrongRoundaboutHighway(Way w, String key) {
-            super(Highways.this, Severity.WARNING, 
-                    tr("Incorrect roundabout (highway: {0} instead of {1})", w.get("highway"), key), 
+            super(Highways.this, Severity.WARNING,
+                    tr("Incorrect roundabout (highway: {0} instead of {1})", w.get("highway"), key),
                     WRONG_ROUNDABOUT_HIGHWAY, w);
             this.correctValue = key;
         }
     }
-    
+
     @Override
     public void visit(Node n) {
@@ -116,5 +117,5 @@
         }
     }
-    
+
     private void testMissingPedestrianCrossing(Node n) {
         leftByPedestrians = false;
@@ -124,5 +125,5 @@
         cyclistWays = 0;
         carsWays = 0;
-        
+
         for (Way w : OsmPrimitive.getFilteredList(n.getReferrers(), Way.class)) {
             String highway = w.get("highway");
@@ -172,5 +173,5 @@
         }
     }
-    
+
     @Override
     public boolean isFixable(TestError testError) {
@@ -181,6 +182,10 @@
     public Command fixError(TestError testError) {
         if (testError instanceof WrongRoundaboutHighway) {
-            return new ChangePropertyCommand(testError.getPrimitives().iterator().next(), 
-                    "highway", ((WrongRoundaboutHighway) testError).correctValue);
+            // primitives list can be empty if all primitives have been purged
+            Iterator<? extends OsmPrimitive> it = testError.getPrimitives().iterator();
+            if (it.hasNext()) {
+                return new ChangePropertyCommand(it.next(),
+                        "highway", ((WrongRoundaboutHighway) testError).correctValue);
+            }
         }
         return null;
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java	(revision 6474)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java	(revision 6475)
@@ -8,4 +8,5 @@
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -31,7 +32,7 @@
  */
 public class PowerLines extends Test {
-    
+
     protected static final int POWER_LINES = 2501;
-    
+
     /** Values for {@code power} key interpreted as power lines */
     public static final Collection<String> POWER_LINE_TAGS = Arrays.asList("line", "minor_line");
@@ -42,7 +43,7 @@
     /** Values for {@code power} key interpreted as allowed power items */
     public static final Collection<String> POWER_ALLOWED_TAGS = Arrays.asList("switch", "transformer", "busbar", "generator");
-    
+
     private final Map<Way, String> towerPoleTagMap = new HashMap<Way, String>();
-    
+
     private final List<PowerLineError> potentialErrors = new ArrayList<PowerLineError>();
 
@@ -55,5 +56,5 @@
         super(tr("Power lines"), tr("Checks for nodes in power lines that do not have a power=tower/pole tag."));
     }
-    
+
     @Override
     public void visit(Way w) {
@@ -86,5 +87,5 @@
         }
     }
-    
+
     @Override
     public void visit(Relation r) {
@@ -92,10 +93,11 @@
             powerStations.add(r);
         }
-    }    
+    }
 
     @Override
     public void endTest() {
         for (PowerLineError e : potentialErrors) {
-            if (!isInPowerStation(e.getNode())) {
+            Node n = e.getNode();
+            if (n != null && !isInPowerStation(n)) {
                 errors.add(e);
             }
@@ -103,5 +105,5 @@
         super.endTest();
     }
-    
+
     protected final boolean isInPowerStation(Node n) {
         for (OsmPrimitive station : powerStations) {
@@ -129,7 +131,10 @@
     public Command fixError(TestError testError) {
         if (testError instanceof PowerLineError && isFixable(testError)) {
-            return new ChangePropertyCommand(
-                    testError.getPrimitives().iterator().next(), 
-                    "power", towerPoleTagMap.get(((PowerLineError)testError).line));
+            // primitives list can be empty if all primitives have been purged
+            Iterator<? extends OsmPrimitive> it = testError.getPrimitives().iterator();
+            if (it.hasNext()) {
+                return new ChangePropertyCommand(it.next(),
+                        "power", towerPoleTagMap.get(((PowerLineError)testError).line));
+            }
         }
         return null;
@@ -140,5 +145,5 @@
         return testError instanceof PowerLineError && towerPoleTagMap.containsKey(((PowerLineError)testError).line);
     }
-    
+
     /**
      * Determines if the specified way denotes a power line.
@@ -167,5 +172,5 @@
         return isPowerIn(n, POWER_TOWER_TAGS);
     }
-    
+
     /**
      * Determines if the specified node denotes a power infrastructure allowed on a power line.
@@ -176,5 +181,5 @@
         return isPowerIn(n, POWER_ALLOWED_TAGS);
     }
-    
+
     /**
      * Helper function to check if power tags is a certain value.
@@ -187,14 +192,16 @@
         return v != null && values != null && values.contains(v);
     }
-    
+
     protected class PowerLineError extends TestError {
         private final Way line;
         public PowerLineError(Node n, Way line) {
-            super(PowerLines.this, Severity.WARNING, 
+            super(PowerLines.this, Severity.WARNING,
                     tr("Missing power tower/pole within power line"), POWER_LINES, n);
             this.line = line;
         }
         public final Node getNode() {
-            return (Node) getPrimitives().iterator().next();
+            // primitives list can be empty if all primitives have been purged
+            Iterator<? extends OsmPrimitive> it = getPrimitives().iterator();
+            return it.hasNext() ? (Node) it.next() : null;
         }
     }
