diff --git a/data/defaultpresets.xml b/data/defaultpresets.xml
index db9d63a..51ad2fc 100755
--- a/data/defaultpresets.xml
+++ b/data/defaultpresets.xml
@@ -78,7 +78,7 @@ check: checkbox
   value_off: the value to set when unchecked (default is 'no')
 
 role: type to specify possible roles in relations
-  key: the role name used in relation
+  key: comma separated list of role names used in relation
   text: fixed label to display
   requisite: "optional" or "required" (default is optional)
   count: how often can the role occur (if not given unlimited number is assumed)
@@ -4160,11 +4160,10 @@ are supplied, then "values" will be treated as "display_values" and translated i
             </optional>
             <roles>
                 <role key="" text="route segment" requisite="optional" type="way" />
-                <role key="forward" text="forward segment" requisite="optional" type="way" />
-                <role key="backward" text="backward segment" requisite="optional" type="way" />
+                <role key="forward,backward" text="forward/backward segment" requisite="optional" type="way" />
                 <role key="stop" text="halt point" requisite="optional" type="node" />
-                <role key="forward_stop" text="forward halt point" requisite="optional" type="node" />
-                <role key="backward_stop" text="backward halt point" requisite="optional" type="node" />
+                <role key="forward_stop,backward_stop" text="forward/backward_stop halt point" requisite="optional" type="node" />
+                <role key="north,south,east,west" text="(for North America)" requisite="optional" type="way" />
             </roles>
         </item>
         <item name="Route network" icon="presets/path.png" type="relation">
diff --git a/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java b/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java
index 7279e34..a7fc790 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java
@@ -109,6 +109,7 @@ public class RelationChecker extends Test {
                 RoleInfo ri = map.get(s);
                 if (ri == null) {
                     ri = new RoleInfo();
+                    map.put(s, ri);
                 }
                 ri.total++;
                 if (m.isRelation()) {
@@ -124,7 +125,6 @@ public class RelationChecker extends Test {
                 else if (m.isNode()) {
                     ri.nodes++;
                 }
-                map.put(s, ri);
             }
             if(map.isEmpty()) {
                 errors.add( new TestError(this, Severity.ERROR, tr("Relation is empty"),
@@ -132,36 +132,38 @@ public class RelationChecker extends Test {
             } else {
                 LinkedList<String> done = new LinkedList<String>();
                 for (TaggingPreset.Role r : allroles) {
-                    done.add(r.key);
-                    String keyname = r.key;
-                    if ("".equals(keyname)) {
-                        keyname = tr("<empty>");
-                    }
-                    RoleInfo ri = map.get(r.key);
-                    long count = (ri == null) ? 0 : ri.total;
-                    long vc = r.getValidCount(count);
-                    if (count != vc) {
-                        if (count == 0) {
-                            String s = marktr("Role {0} missing");
-                            errors.add(new TestError(this, Severity.WARNING, tr("Role verification problem"),
-                                    tr(s, keyname), MessageFormat.format(s, keyname), ROLE_MISSING, n));
+                    for (String keyname : r.key.split(",")) {
+                        keyname = keyname.trim();
+                        done.add(keyname);
+                        RoleInfo ri = map.get(keyname);
+                        if ("".equals(keyname)) {
+                            keyname = tr("<empty>");
                         }
-                        else if (vc > count) {
-                            String s = marktr("Number of {0} roles too low ({1})");
-                            errors.add(new TestError(this, Severity.WARNING, tr("Role verification problem"),
-                                    tr(s, keyname, count), MessageFormat.format(s, keyname, count), LOW_COUNT, n));
-                        } else {
-                            String s = marktr("Number of {0} roles too high ({1})");
-                            errors.add(new TestError(this, Severity.WARNING, tr("Role verification problem"),
-                                    tr(s, keyname, count), MessageFormat.format(s, keyname, count), HIGH_COUNT, n));
+                        long count = (ri == null) ? 0 : ri.total;
+                        long vc = r.getValidCount(count);
+                        if (count != vc) {
+                            if (count == 0) {
+                                String s = marktr("Role {0} missing");
+                                errors.add(new TestError(this, Severity.WARNING, tr("Role verification problem"),
+                                        tr(s, keyname), MessageFormat.format(s, keyname), ROLE_MISSING, n));
+                            }
+                            else if (vc > count) {
+                                String s = marktr("Number of {0} roles too low ({1})");
+                                errors.add(new TestError(this, Severity.WARNING, tr("Role verification problem"),
+                                        tr(s, keyname, count), MessageFormat.format(s, keyname, count), LOW_COUNT, n));
+                            } else {
+                                String s = marktr("Number of {0} roles too high ({1})");
+                                errors.add(new TestError(this, Severity.WARNING, tr("Role verification problem"),
+                                        tr(s, keyname, count), MessageFormat.format(s, keyname, count), HIGH_COUNT, n));
+                            }
+                        }
+                        if (ri != null && ((!r.types.contains(PresetType.WAY) && (r.types.contains(PresetType.CLOSEDWAY) ? ri.openways > 0 : ri.ways > 0))
+                                || (!r.types.contains(PresetType.NODE) && ri.nodes > 0) || (!r.types.contains(PresetType.RELATION) && ri.relations > 0)))
+                        {
+                            String s = marktr("Member for role {0} of wrong type");
+                            errors.add( new TestError(this, Severity.WARNING, tr("Role verification problem"),
+                                    tr(s, keyname), MessageFormat.format(s, keyname), WRONG_TYPE, n) );
                         }
-                    }
-                    if (ri != null && ((!r.types.contains(PresetType.WAY) && (r.types.contains(PresetType.CLOSEDWAY) ? ri.openways > 0 : ri.ways > 0))
-                            || (!r.types.contains(PresetType.NODE) && ri.nodes > 0) || (!r.types.contains(PresetType.RELATION) && ri.relations > 0)))
-                    {
-                        String s = marktr("Member for role {0} of wrong type");
-                        errors.add( new TestError(this, Severity.WARNING, tr("Role verification problem"),
-                                tr(s, keyname), MessageFormat.format(s, keyname), WRONG_TYPE, n) );
                     }
                 }
                 for (String key : map.keySet()) {
