Index: trunk/src/org/openstreetmap/josm/command/SplitWayCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/SplitWayCommand.java	(revision 15417)
+++ trunk/src/org/openstreetmap/josm/command/SplitWayCommand.java	(revision 15418)
@@ -19,5 +19,4 @@
 import java.util.Set;
 import java.util.function.Consumer;
-import java.util.stream.Collectors;
 
 import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
@@ -468,14 +467,14 @@
     }
 
-    static List<OsmPrimitive> findVias(Relation r, String type) {
+    static List<? extends OsmPrimitive> findVias(Relation r, String type) {
         if (type != null) {
             switch (type) {
             case "connectivity":
             case "restriction":
-                return findRelationMembers(r, "via");
+                return r.findRelationMembers("via");
             case "destination_sign":
                 // Prefer intersection over sign, see #12347
-                List<OsmPrimitive> intersections = findRelationMembers(r, "intersection");
-                return intersections.isEmpty() ? findRelationMembers(r, "sign") : intersections;
+                List<? extends OsmPrimitive> intersections = r.findRelationMembers("intersection");
+                return intersections.isEmpty() ? r.findRelationMembers("sign") : intersections;
             default:
                 break;
@@ -483,9 +482,4 @@
         }
         return Collections.emptyList();
-    }
-
-    static List<OsmPrimitive> findRelationMembers(Relation r, String role) {
-        return r.getMembers().stream().filter(rmv -> role.equals(rmv.getRole()))
-                .map(RelationMember::getMember).collect(Collectors.toList());
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 15417)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 15418)
@@ -23,4 +23,5 @@
 import java.util.function.Function;
 import java.util.function.Predicate;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -214,9 +215,7 @@
             for (Relation r : relations) {
                 Relation newRelation = (Relation) primMap.get(r);
-                List<RelationMember> newMembers = new ArrayList<>();
-                for (RelationMember rm : r.getMembers()) {
-                    newMembers.add(new RelationMember(rm.getRole(), primMap.get(rm.getMember())));
-                }
-                newRelation.setMembers(newMembers);
+                newRelation.setMembers(r.getMembers().stream()
+                        .map(rm -> new RelationMember(rm.getRole(), primMap.get(rm.getMember())))
+                        .collect(Collectors.toList()));
             }
             for (DataSource source : copyFrom.dataSources) {
Index: trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java	(revision 15417)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java	(revision 15418)
@@ -274,6 +274,5 @@
                 throw new IllegalStateException(tr("Missing merge target of type {0} with id {1}",
                         sourceMember.getType(), sourceMember.getUniqueId()));
-            RelationMember newMember = new RelationMember(sourceMember.getRole(), targetMember);
-            newMembers.add(newMember);
+            newMembers.add(new RelationMember(sourceMember.getRole(), targetMember));
             if (targetMember.isDeleted() && !conflicts.hasConflictForMy(targetMember)) {
                 addConflict(new Conflict<>(targetMember, sourceMember.getMember(), true));
Index: trunk/src/org/openstreetmap/josm/data/osm/IRelation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/IRelation.java	(revision 15417)
+++ trunk/src/org/openstreetmap/josm/data/osm/IRelation.java	(revision 15418)
@@ -6,4 +6,5 @@
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.openstreetmap.josm.tools.Utils;
@@ -124,3 +125,14 @@
         return ret;
     }
+
+    /**
+     * Returns a list of relation members having the specified role.
+     * @param role role
+     * @return a list of relation members having the specified role
+     * @since 15418
+     */
+    default List<? extends IPrimitive> findRelationMembers(String role) {
+        return getMembers().stream().filter(rmv -> role.equals(rmv.getRole()))
+                .map(IRelationMember::getMember).collect(Collectors.toList());
+    }
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 15417)
+++ trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 15418)
@@ -543,3 +543,10 @@
         return Stream.of(members).map(RelationMember::getRole).filter(role -> !role.isEmpty()).collect(Collectors.toSet());
     }
+
+    @Override
+    public List<? extends OsmPrimitive> findRelationMembers(String role) {
+        return IRelation.super.findRelationMembers(role).stream()
+                .filter(m -> m instanceof OsmPrimitive)
+                .map(m -> (OsmPrimitive) m).collect(Collectors.toList());
+    }
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java	(revision 15417)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java	(revision 15418)
@@ -6,4 +6,5 @@
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -100,10 +101,7 @@
         }
 
-        List<RelationMemberData> newMembers = new ArrayList<>();
-        for (RelationMember member: r.getMembers()) {
-            newMembers.add(new RelationMemberData(member.getRole(), mappedPrimitives.get(member.getMember())));
-
-        }
-        clone.setMembers(newMembers);
+        clone.setMembers(r.getMembers().stream()
+                .map(m -> new RelationMemberData(m.getRole(), mappedPrimitives.get(m.getMember())))
+                .collect(Collectors.toList()));
     }
 
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java	(revision 15417)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java	(revision 15418)
@@ -5,4 +5,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.EnumSet;
@@ -10,4 +11,5 @@
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -317,24 +319,18 @@
         // verify unwanted members
         for (String key : map.keySet()) {
-            boolean found = false;
-            for (Role r: allroles.keySet()) {
-                if (r.isRole(key)) {
-                    found = true;
-                    break;
-                }
-            }
-
-            if (!found) {
+            if (allroles.keySet().stream().noneMatch(role -> role.isRole(key))) {
                 String templates = allroles.keySet().stream().map(r -> r.key).collect(Collectors.joining("/"));
+                List<OsmPrimitive> primitives = new ArrayList<>(n.findRelationMembers(key));
+                primitives.add(0, n);
 
                 if (!key.isEmpty()) {
                     errors.add(TestError.builder(this, Severity.WARNING, ROLE_UNKNOWN)
                             .message(ROLE_VERIF_PROBLEM_MSG, marktr("Role ''{0}'' is not in templates ''{1}''"), key, templates)
-                            .primitives(n)
+                            .primitives(primitives)
                             .build());
                 } else {
                     errors.add(TestError.builder(this, Severity.WARNING, ROLE_EMPTY)
                             .message(ROLE_VERIF_PROBLEM_MSG, marktr("Empty role found when expecting one of ''{0}''"), templates)
-                            .primitives(n)
+                            .primitives(primitives)
                             .build());
                 }
Index: trunk/src/org/openstreetmap/josm/gui/datatransfer/RelationMemberTransferable.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/datatransfer/RelationMemberTransferable.java	(revision 15417)
+++ trunk/src/org/openstreetmap/josm/gui/datatransfer/RelationMemberTransferable.java	(revision 15418)
@@ -11,4 +11,5 @@
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.stream.Collectors;
 
 import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
@@ -51,9 +52,7 @@
          */
         public static Data getData(Collection<RelationMember> members) {
-            final Collection<RelationMemberData> r = new ArrayList<>(members.size());
-            for (RelationMember member : members) {
-                r.add(new RelationMemberData(member.getRole(), member.getType(), member.getUniqueId()));
-            }
-            return new Data(r);
+            return new Data(members.stream()
+                    .map(m -> new RelationMemberData(m.getRole(), m.getType(), m.getUniqueId()))
+                    .collect(Collectors.toList()));
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorter.java	(revision 15417)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorter.java	(revision 15418)
@@ -66,5 +66,5 @@
         @Override
         public boolean acceptsMember(List<RelationMember> relationMembers, RelationMember m) {
-            return "address".equals(m.getRole()) || "house".equals(m.getRole());
+            return m.hasRole("address", "house");
         }
 
