diff --git a/data/defaultpresets.xml b/data/defaultpresets.xml
index d798bac..a8d6251 100755
--- a/data/defaultpresets.xml
+++ b/data/defaultpresets.xml
@@ -88,6 +88,7 @@ role: type to specify possible roles in relations
   requisite: optional/required (default is "optional")
   count: how often can the role occur (if not given unlimited number is assumed)
   type: the data types - way,node,relation,closedway (separated by comma)
+  member_expression: an expression (cf. search dialog) for objects of this role
 
  presets: For external files <presets> should have following attributes:
    author: the author of the preset
@@ -2446,7 +2447,7 @@ Note that for a match, at least one positive and no negative is required.
                 <combo key="colour" text="Color (HTML name or hexadecimal code)" values_context="color" values="black,brown,green,red,blue,gray,white,#CD853F" />
             </optional>
             <roles>
-                <role key="" text="route variant/direction (at least 2)" requisite="required" type="relation"/> <!-- FIXME: at least 2 members are required -->
+                <role key="" text="route variant/direction (at least 2)" requisite="required" type="relation" member_expression="type=route"/> <!-- FIXME: at least 2 members are required -->
             </roles>
         </item>
         <item name="Stop Area" type="relation" icon="presets/interpolation.png">
@@ -2463,9 +2464,9 @@ Note that for a match, at least one positive and no negative is required.
                 <text key="network" text="Network"/>
             </optional>
             <roles>
-                <role key="stop" text="Stop Position" requisite="optional" type="node"/>
-                <role key="platform" text="Platform" requisite="optional" type="node,way,closedway"/>
-                <role key="" text="Station or amenities" requisite="optional" type="node,way,closedway"/>
+                <role key="stop" text="Stop Position" requisite="optional" type="node" member_expression="public_transport=stop_position"/>
+                <role key="platform" text="Platform" requisite="optional" type="node,way,closedway" member_expression="public_transport=platform"/>
+                <role key="" text="Station or amenities" requisite="optional" type="node,way,closedway" member_expression="amenity|public_transport=station"/>
             </roles>
         </item>
         <separator/>
@@ -5905,8 +5906,8 @@ Note that for a match, at least one positive and no negative is required.
             <key key="type" value="associatedStreet" />
             <text key="name" text="Street name" />
             <roles>
-                <role key="street" text="street" requisite="required" type="way" />
-                <role key="house" text="house" requisite="required" type="node,way,closedway,relation" />
+                <role key="street" text="street" requisite="required" type="way" member_expression="highway &quot;addr:street&quot;" />
+                <role key="house" text="house" requisite="required" type="node,way,closedway,relation" member_expression="&quot;addr:housenumber&quot;" />
             </roles>
         </item>
         <item name="Street" type="relation">
@@ -5962,9 +5963,9 @@ Note that for a match, at least one positive and no negative is required.
                 <text key="wikipedia" text="Wikipedia" />
             </optional>
             <roles>
-                <role key="" text="waterways (no riverbank)" requisite="optional" type="way" />
-                <role key="main_stream" text="waterways (no riverbank)" requisite="optional" type="way" />
-                <role key="side_stream" text="branch waterways (no riverbank)" requisite="optional" type="way" />
+                <role key="" text="waterways (no riverbank)" requisite="optional" type="way" member_expression="waterway -waterway:riverbank" />
+                <role key="main_stream" text="waterways (no riverbank)" requisite="optional" type="way" member_expression="waterway -waterway:riverbank" />
+                <role key="side_stream" text="branch waterways (no riverbank)" requisite="optional" type="way" member_expression="waterway -waterway:riverbank"/>
                 <role key="spring" text="spring of waterway" requisite="optional" type="node" />
             </roles>
         </item>
diff --git a/data/tagging-preset.xsd b/data/tagging-preset.xsd
index 72f84e4..6473e28 100644
--- a/data/tagging-preset.xsd
+++ b/data/tagging-preset.xsd
@@ -231,6 +231,7 @@
 		<attribute name="requisite" type="tns:role_requisite" />
 		<attribute name="type" type="string" />
 		<attribute name="count" type="integer" />
+        <attribute name="member_expression" type="string" />
 	</complexType>
 
 	<simpleType name="role_requisite">
diff --git a/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java b/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
index a68b4c6..c3435de 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
@@ -1093,6 +1093,7 @@ public class TaggingPreset extends AbstractAction implements MapView.LayerChange
         public String text;
         public String text_context;
         public String locale_text;
+        public Match memberExpression;
 
         public boolean required = false;
         public long count = 0;
@@ -1108,6 +1109,14 @@ public class TaggingPreset extends AbstractAction implements MapView.LayerChange
                 throw new SAXException(tr("Unknown requisite: {0}", str));
         }
 
+        public void setMember_expression(String member_expression) throws SAXException {
+            try {
+                this.memberExpression = SearchCompiler.compile(member_expression, true, true);
+            } catch (SearchCompiler.ParseError ex) {
+                throw new SAXException(tr("Illegal member expression: {0}", ex.getMessage()), ex);
+            }
+        }
+
         /* return either argument, the highest possible value or the lowest
            allowed value */
         public long getValidCount(long c)
@@ -1571,6 +1580,21 @@ public class TaggingPreset extends AbstractAction implements MapView.LayerChange
         return false;
     }
 
+    public String suggestRoleForOsmPrimitive(OsmPrimitive osm) {
+        final List<Role> roles = new ArrayList<Role>();
+        for (Item i : data) {
+            if (i instanceof Roles) {
+                roles.addAll(((Roles) i).roles);
+            }
+        }
+        for (Role i : roles) {
+            if (i.memberExpression != null && i.memberExpression.match(osm)) {
+                return i.key;
+            }
+        }
+        return null;
+    }
+
     public void actionPerformed(ActionEvent e) {
         if (Main.main == null) return;
         if (Main.main.getCurrentDataSet() == null) return;
@@ -1589,8 +1613,9 @@ public class TaggingPreset extends AbstractAction implements MapView.LayerChange
             for(Tag t : getChangedTags()) {
                 r.put(t.getKey(), t.getValue());
             }
-            for(OsmPrimitive osm : Main.main.getCurrentDataSet().getSelected()) {
-                RelationMember rm = new RelationMember("", osm);
+            for (OsmPrimitive osm : Main.main.getCurrentDataSet().getSelected()) {
+                String role = suggestRoleForOsmPrimitive(osm);
+                RelationMember rm = new RelationMember(role == null ? "" : role, osm);
                 r.addMember(rm);
                 members.add(rm);
             }
