diff --git a/data/defaultpresets.xml b/data/defaultpresets.xml
index d798bac..c9b9477 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
@@ -2425,12 +2426,12 @@ Note that for a match, at least one positive and no negative is required.
             </optional>
             <roles>
                 <role key="" text="route segment" requisite="required" type="way" />
-                <role key="stop" text="stop position" requisite="optional" type="node" />
-                <role key="stop_exit_only" text="stop position (exit only)" requisite="optional" type="node" />
-                <role key="stop_entry_only" text="stop position (entry only)" requisite="optional" type="node" />
-                <role key="platform" text="platform" requisite="optional" type="node,way,closedway" />
-                <role key="platform_exit_only" text="platform (exit only)" requisite="optional" type="node,way,closedway" />
-                <role key="platform_entry_only" text="platform (entry only)" requisite="optional" type="node,way,closedway" />
+                <role key="stop" text="stop position" requisite="optional" type="node" member_expression="public_transport=stop_position" />
+                <role key="stop_exit_only" text="stop position (exit only)" requisite="optional" type="node" member_expression="public_transport=stop_position" />
+                <role key="stop_entry_only" text="stop position (entry only)" 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="platform_exit_only" text="platform (exit only)" requisite="optional" type="node,way,closedway" member_expression="public_transport=platform" />
+                <role key="platform_entry_only" text="platform (entry only)" requisite="optional" type="node,way,closedway" member_expression="public_transport=platform" />
             </roles>
         </item>
         <item name="Route master" icon="presets/path.png" type="relation">
@@ -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..183f296 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/dialogs/properties/PresetListPanel.java b/src/org/openstreetmap/josm/gui/dialogs/properties/PresetListPanel.java
index f52e70c..cebd1fe 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/properties/PresetListPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/properties/PresetListPanel.java
@@ -20,7 +20,6 @@ import javax.swing.JPanel;
 
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
-import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
 import org.openstreetmap.josm.gui.tagging.TaggingPreset;
 import org.openstreetmap.josm.gui.tagging.TaggingPreset.PresetType;
 import org.openstreetmap.josm.tools.GBC;
@@ -85,11 +84,7 @@ public class PresetListPanel extends JPanel {
             return;
         }
 
-        for (TaggingPreset t : TaggingPresetPreference.taggingPresets) {
-            if (!t.matches(types, tags, true)) {
-                continue;
-            }
-
+        for (TaggingPreset t : TaggingPreset.getMatchingPresets(types, tags, true)) {
             JLabel lbl = new JLabel(t.getName() + " …");
             lbl.setIcon((Icon) t.getValue(Action.SMALL_ICON));
             lbl.addMouseListener(new PresetLabelML(lbl, t, presetHandler));
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java b/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
index abba54b..5205c52 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
@@ -61,6 +61,7 @@ import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.MainMenu;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec;
+import org.openstreetmap.josm.gui.dialogs.properties.PresetListPanel;
 import org.openstreetmap.josm.gui.dialogs.properties.PresetListPanel.PresetHandler;
 import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
 import org.openstreetmap.josm.gui.help.HelpUtil;
@@ -114,15 +115,7 @@ public class GenericRelationEditor extends RelationEditor  {
         setRememberWindowGeometry(getClass().getName() + ".geometry",
                 WindowGeometry.centerInWindow(Main.parent, new Dimension(700, 650)));
 
-        // init the various models
-        //
-        memberTableModel = new MemberTableModel(getLayer());
-        memberTableModel.register();
-        selectionTableModel = new SelectionTableModel(getLayer());
-        selectionTableModel.register();
-        referrerModel = new ReferringRelationsBrowserModel(relation);
-
-        tagEditorPanel = new TagEditorPanel(new PresetHandler() {
+        final PresetHandler presetHandler = new PresetHandler() {
 
             @Override
             public void updateTags(List<Tag> tags) {
@@ -135,7 +128,17 @@ public class GenericRelationEditor extends RelationEditor  {
                 tagEditorPanel.getModel().applyToPrimitive(relation);
                 return Collections.<OsmPrimitive>singletonList(relation);
             }
-        });
+        };
+
+        // init the various models
+        //
+        memberTableModel = new MemberTableModel(getLayer(), presetHandler);
+        memberTableModel.register();
+        selectionTableModel = new SelectionTableModel(getLayer());
+        selectionTableModel.register();
+        referrerModel = new ReferringRelationsBrowserModel(relation);
+
+        tagEditorPanel = new TagEditorPanel(presetHandler);
 
         // populate the models
         //
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
index 8908626..2b37958 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
@@ -12,6 +12,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -45,8 +46,10 @@ import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
 import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
 import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
+import org.openstreetmap.josm.gui.dialogs.properties.PresetListPanel;
 import org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.tagging.TaggingPreset;
 import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTableModel;
 
 public class MemberTableModel extends AbstractTableModel implements TableModelListener, SelectionChangedListener, DataSetListener, OsmPrimitivesTableModel {
@@ -58,8 +61,9 @@ public class MemberTableModel extends AbstractTableModel implements TableModelLi
     private List<WayConnectionType> connectionType = null;
 
     private DefaultListSelectionModel listSelectionModel;
-    private CopyOnWriteArrayList<IMemberModelListener> listeners;
-    private OsmDataLayer layer;
+    private final CopyOnWriteArrayList<IMemberModelListener> listeners;
+    private final OsmDataLayer layer;
+    private final PresetListPanel.PresetHandler presetHandler;
 
     private final int UNCONNECTED = Integer.MIN_VALUE;
     
@@ -72,10 +76,11 @@ public class MemberTableModel extends AbstractTableModel implements TableModelLi
     /**
      * constructor
      */
-    public MemberTableModel(OsmDataLayer layer) {
+    public MemberTableModel(OsmDataLayer layer, PresetListPanel.PresetHandler presetHandler) {
         members = new ArrayList<RelationMember>();
         listeners = new CopyOnWriteArrayList<IMemberModelListener>();
         this.layer = layer;
+        this.presetHandler = presetHandler;
         addTableModelListener(this);
     }
 
@@ -394,11 +399,13 @@ public class MemberTableModel extends AbstractTableModel implements TableModelLi
     }
 
     private void addMembersAtIndex(List<? extends OsmPrimitive> primitives, int index) {
+        final Collection<TaggingPreset> presets = TaggingPreset.getMatchingPresets(EnumSet.of(TaggingPreset.PresetType.RELATION), presetHandler.getSelection().iterator().next().getKeys(), false);
         if (primitives == null)
             return;
         int idx = index;
         for (OsmPrimitive primitive : primitives) {
-            RelationMember member = new RelationMember("", primitive);
+            final String role = presets.isEmpty() ? null : presets.iterator().next().suggestRoleForOsmPrimitive(primitive);
+            RelationMember member = new RelationMember(role == null ? "" : role, primitive);
             members.add(idx++, member);
         }
         fireTableDataChanged();
diff --git a/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java b/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
index a68b4c6..cb971f7 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
@@ -66,6 +66,7 @@ import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.preferences.SourceEntry;
+import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
 import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference.PresetPrefHelper;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionItemPritority;
@@ -75,6 +76,7 @@ import org.openstreetmap.josm.gui.widgets.JosmComboBox;
 import org.openstreetmap.josm.io.MirroredInputStream;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Predicate;
 import org.openstreetmap.josm.tools.UrlLabel;
 import org.openstreetmap.josm.tools.Utils;
 import org.openstreetmap.josm.tools.XmlObjectParser;
@@ -1093,6 +1095,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 +1111,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 +1582,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 +1615,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);
             }
@@ -1772,4 +1799,13 @@ public class TaggingPreset extends AbstractAction implements MapView.LayerChange
         }
         return atLeastOnePositiveMatch;
     }
+
+    public static Collection<TaggingPreset> getMatchingPresets(final Collection<PresetType> t, final Map<String, String> tags, final boolean onlyShowable) {
+        return Utils.filter(TaggingPresetPreference.taggingPresets, new Predicate<TaggingPreset>() {
+            @Override
+            public boolean evaluate(TaggingPreset object) {
+                return object.matches(t, tags, onlyShowable);
+            }
+        });
+    }
 }
