Index: trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java	(revision 11037)
+++ trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java	(revision 11038)
@@ -335,5 +335,5 @@
             }
         }
-        ways.removeAll(rel.getMemberPrimitives());
+        ways.removeAll(rel.getMemberPrimitivesList());
         for (final Way way : ways) {
             rel.addMember(new RelationMember(role, way));
Index: trunk/src/org/openstreetmap/josm/actions/relation/SelectMembersAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/SelectMembersAction.java	(revision 11037)
+++ trunk/src/org/openstreetmap/josm/actions/relation/SelectMembersAction.java	(revision 11038)
@@ -40,5 +40,5 @@
         Set<OsmPrimitive> members = new HashSet<>();
         for (Relation r: relations) {
-            members.addAll(r.getMemberPrimitives());
+            members.addAll(r.getMemberPrimitivesList());
         }
         if (add) {
Index: trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 11037)
+++ trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 11038)
@@ -10,4 +10,5 @@
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.openstreetmap.josm.Main;
@@ -72,8 +73,17 @@
     }
 
+    /**
+     * Returns the relation member at the specified index.
+     * @param index the index of the relation member
+     * @return relation member at the specified index
+     */
     public RelationMember getMember(int index) {
         return members[index];
     }
 
+    /**
+     * Adds the specified relation member at the last position.
+     * @param member the member to add
+     */
     public void addMember(RelationMember member) {
         boolean locked = writeLock();
@@ -88,4 +98,9 @@
     }
 
+    /**
+     * Adds the specified relation member at the specified index.
+     * @param member the member to add
+     * @param index the index at which the specified element is to be inserted
+     */
     public void addMember(int index, RelationMember member) {
         boolean locked = writeLock();
@@ -383,20 +398,24 @@
      * @return the set of  {@link OsmPrimitive}s referred to by at least one
      * member of this relation
+     * @see #getMemberPrimitivesList()
      */
     public Set<OsmPrimitive> getMemberPrimitives() {
-        Set<OsmPrimitive> ret = new HashSet<>();
-        RelationMember[] members = this.members;
-        for (RelationMember m: members) {
-            if (m.getMember() != null) {
-                ret.add(m.getMember());
-            }
-        }
-        return ret;
-    }
-
+        return getMembers().stream().map(RelationMember::getMember).collect(Collectors.toSet());
+    }
+
+    /**
+     * Returns the {@link OsmPrimitive}s of the specified type referred to by at least one member of this relation.
+     * @param tClass the type of the primitive
+     * @param <T> the type of the primitive
+     * @return the primitives
+     */
     public <T extends OsmPrimitive> Collection<T> getMemberPrimitives(Class<T> tClass) {
-        return Utils.filteredCollection(getMemberPrimitives(), tClass);
-    }
-
+        return Utils.filteredCollection(getMemberPrimitivesList(), tClass);
+    }
+
+    /**
+     * Returns an unmodifiable list of the {@link OsmPrimitive}s referred to by at least one member of this relation.
+     * @return an unmodifiable list of the primitives
+     */
     public List<OsmPrimitive> getMemberPrimitivesList() {
         return Utils.transform(getMembers(), RelationMember::getMember);
@@ -549,5 +568,5 @@
     protected void keysChangedImpl(Map<String, String> originalKeys) {
         super.keysChangedImpl(originalKeys);
-        for (OsmPrimitive member : getMemberPrimitives()) {
+        for (OsmPrimitive member : getMemberPrimitivesList()) {
             member.clearCachedStyle();
         }
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/MultipolygonCache.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/MultipolygonCache.java	(revision 11037)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/MultipolygonCache.java	(revision 11038)
@@ -224,5 +224,5 @@
         }
         // Erase style cache for polygon members
-        for (OsmPrimitive member : r.getMemberPrimitives()) {
+        for (OsmPrimitive member : r.getMemberPrimitivesList()) {
             member.clearCachedStyle();
         }
Index: trunk/src/org/openstreetmap/josm/gui/datatransfer/data/PrimitiveTransferData.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/datatransfer/data/PrimitiveTransferData.java	(revision 11037)
+++ trunk/src/org/openstreetmap/josm/gui/datatransfer/data/PrimitiveTransferData.java	(revision 11038)
@@ -19,4 +19,5 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
+import org.openstreetmap.josm.tools.CompositeList;
 
 /**
@@ -40,5 +41,5 @@
                 return ((Way) primitive).getNodes();
             } else if (primitive instanceof Relation) {
-                return ((Relation) primitive).getMemberPrimitives();
+                return ((Relation) primitive).getMemberPrimitivesList();
             } else {
                 return Collections.emptyList();
@@ -102,8 +103,5 @@
      */
     public Collection<PrimitiveData> getAll() {
-        ArrayList<PrimitiveData> list = new ArrayList<>();
-        list.addAll(direct);
-        list.addAll(referenced);
-        return list;
+        return new CompositeList<>(direct, referenced);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java	(revision 11037)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java	(revision 11038)
@@ -10,4 +10,5 @@
 import java.util.function.IntFunction;
 import java.util.function.IntSupplier;
+import java.util.Set;
 import java.util.regex.PatternSyntaxException;
 
@@ -315,8 +316,9 @@
                     final Relation multipolygon = multipolygons.iterator().next();
                     if (multipolygon == null) throw new NoSuchElementException();
+                    final Set<OsmPrimitive> members = multipolygon.getMemberPrimitives();
                     containsFinder = new ContainsFinder(new Environment(multipolygon)) {
                         @Override
                         public boolean isPrimitiveUsable(OsmPrimitive p) {
-                            return super.isPrimitiveUsable(p) && !multipolygon.getMemberPrimitives().contains(p);
+                            return super.isPrimitiveUsable(p) && !members.contains(p);
                         }
                     };
Index: trunk/src/org/openstreetmap/josm/gui/util/HighlightHelper.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/HighlightHelper.java	(revision 11037)
+++ trunk/src/org/openstreetmap/josm/gui/util/HighlightHelper.java	(revision 11038)
@@ -88,5 +88,5 @@
             seenRelations.add(r);
             boolean needRepaint = false;
-            for (OsmPrimitive m : r.getMemberPrimitives()) {
+            for (OsmPrimitive m : r.getMemberPrimitivesList()) {
                 if (!(m instanceof Relation) || !seenRelations.contains(m)) {
                     needRepaint |= setHighlight(m, flag, seenRelations);
