Index: /trunk/src/org/openstreetmap/josm/actions/PurgeAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/PurgeAction.java	(revision 3822)
+++ /trunk/src/org/openstreetmap/josm/actions/PurgeAction.java	(revision 3823)
@@ -34,4 +34,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.ExtendedDialog;
@@ -156,4 +157,33 @@
         }
 
+        if (Main.pref.getBoolean("purge.add_relations_with_only_incomplete_members", true)) {
+            Set<Relation> relSet = new HashSet<Relation>();
+            for (OsmPrimitive osm : toPurgeChecked) {
+                for (OsmPrimitive parent : osm.getReferrers()) {
+                    if (parent instanceof Relation
+                            && !(toPurgeChecked.contains(parent))
+                            && hasOnlyIncompleteMembers((Relation) parent, toPurgeChecked, relSet)) {
+                        relSet.add((Relation) parent);
+                    }
+                }
+            }
+
+            /**
+             * Add higher level relations (list gets extended while looping over it)
+             */
+            List<Relation> relLst = new ArrayList<Relation>(relSet);
+            for (int i=0; i<relLst.size(); ++i) {
+                for (OsmPrimitive parent : relLst.get(i).getReferrers()) {
+                    if (!(toPurgeChecked.contains(parent))
+                            && hasOnlyIncompleteMembers((Relation) parent, toPurgeChecked, relLst)) {
+                        relLst.add((Relation) parent);
+                    }
+                }
+            }
+            relSet = new HashSet<Relation>(relLst);
+            toPurgeChecked.addAll(relSet);
+            toPurgeAdditionally.addAll(relSet);
+        }
+
         boolean modified = false;
         for (OsmPrimitive osm : toPurgeChecked) {
@@ -269,3 +299,11 @@
         setEnabled(selection != null && !selection.isEmpty());
     }
+
+    private boolean hasOnlyIncompleteMembers(Relation r, Collection<OsmPrimitive> toPurge, Collection<? extends OsmPrimitive> moreToPurge) {
+        for (RelationMember m : r.getMembers()) {
+            if (!m.getMember().isIncomplete() && !toPurge.contains(m.getMember()) && !moreToPurge.contains(m.getMember()))
+                return false;
+        }
+        return true;
+    }
 }
