Index: /trunk/src/org/openstreetmap/josm/data/osm/FilterMatcher.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/FilterMatcher.java	(revision 5441)
+++ /trunk/src/org/openstreetmap/josm/data/osm/FilterMatcher.java	(revision 5442)
@@ -11,4 +11,5 @@
 import org.openstreetmap.josm.actions.search.SearchCompiler.Not;
 import org.openstreetmap.josm.actions.search.SearchCompiler.ParseError;
+import org.openstreetmap.josm.tools.SubclassFilteredCollection;
 
 /**
@@ -42,4 +43,5 @@
  * way without its nodes cannot be edited properly.
  *
+ * Multipolygons and (untagged) member ways are handled in a similar way.
  */
 public class FilterMatcher {
@@ -183,4 +185,24 @@
     }
 
+    private boolean allParentMultipolygonsFiltered(OsmPrimitive primitive, boolean hidden) {
+        boolean isExplicit = false;
+        for (Relation r : new SubclassFilteredCollection<OsmPrimitive, Relation>(
+                primitive.getReferrers(), OsmPrimitive.multipolygonPredicate)) {
+            if (!isFiltered(r, hidden))
+                return false;
+            isExplicit |= isFilterExplicit(r, hidden);
+        }
+        return isExplicit;
+    }
+
+    private boolean oneParentMultipolygonNotFiltered(OsmPrimitive primitive, boolean hidden) {
+        for (Relation r : new SubclassFilteredCollection<OsmPrimitive, Relation>(
+                primitive.getReferrers(), OsmPrimitive.multipolygonPredicate)) {
+            if (!isFiltered(r, hidden))
+                return true;
+        }
+        return false;
+    }
+
     private FilterType test(List<FilterInfo> filters, OsmPrimitive primitive, boolean hidden) {
 
@@ -209,23 +231,40 @@
 
         if (primitive instanceof Node) {
-            // Technically not hidden by any filter, but we hide it anyway, if
-            // it is untagged and all parent ways are hidden.
-            if (!filtered) {
+            if (filtered) {
+                // If there is a parent way, that is not hidden, we  show the
+                // node anyway, unless there is no non-inverted filter that
+                // applies to the node directly.
+                if (explicitlyFiltered)
+                    return FilterType.PASSIV;
+                else {
+                    if (oneParentWayNotFiltered(primitive, hidden))
+                        return FilterType.NOT_FILTERED;
+                    else
+                        return FilterType.PASSIV;
+                }
+            } else {
                 if (!primitive.isTagged() && allParentWaysFiltered(primitive, hidden))
+                    // Technically not hidden by any filter, but we hide it anyway, if
+                    // it is untagged and all parent ways are hidden.
                     return FilterType.PASSIV;
                 else
                     return FilterType.NOT_FILTERED;
             }
-            // At this point, selected == true, so the node is hidden.
-            // However, if there is a parent way, that is not hidden, we ignore
-            // this and show the node anyway, unless there is no non-inverted
-            // filter that applies to the node directly.
-            if (!explicitlyFiltered) {
-                if (!oneParentWayNotFiltered(primitive, hidden))
-                    return FilterType.PASSIV;
+        } else if (primitive instanceof Way) {
+            if (filtered) {
+                if (explicitlyFiltered)
+                    return FilterType.EXPLICIT;
+                else {
+                    if (oneParentMultipolygonNotFiltered(primitive, hidden))
+                        return FilterType.NOT_FILTERED;
+                    else
+                        return FilterType.PASSIV;
+                }
+            } else {
+                if (!primitive.isTagged() && allParentMultipolygonsFiltered(primitive, hidden))
+                    return FilterType.EXPLICIT;
                 else
                     return FilterType.NOT_FILTERED;
             }
-            return FilterType.PASSIV;
         } else {
             if (filtered)
Index: /trunk/src/org/openstreetmap/josm/data/osm/FilterWorker.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/FilterWorker.java	(revision 5441)
+++ /trunk/src/org/openstreetmap/josm/data/osm/FilterWorker.java	(revision 5442)
@@ -44,5 +44,5 @@
                 if (disabledType != FilterType.NOT_FILTERED) {
                     changed |= primitive.setDisabledState(false);
-                    primitive.setDisabledType(hiddenType == FilterType.EXPLICIT);
+                    primitive.setDisabledType(disabledType == FilterType.EXPLICIT);
                 } else {
                     changed |= primitive.unsetDisabledState();
Index: /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 5441)
+++ /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 5442)
@@ -214,4 +214,10 @@
         @Override public boolean evaluate(OsmPrimitive primitive) {
             return primitive.getClass() == Relation.class;
+        }
+    };
+
+    public static final Predicate<OsmPrimitive> multipolygonPredicate = new Predicate<OsmPrimitive>() {
+        @Override public boolean evaluate(OsmPrimitive primitive) {
+            return primitive.getClass() == Relation.class && ((Relation) primitive).isMultipolygon();
         }
     };
