Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 1793)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 1794)
@@ -13,4 +13,6 @@
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
 import java.awt.event.KeyEvent;
 import java.io.IOException;
@@ -30,6 +32,9 @@
 import javax.swing.JSplitPane;
 import javax.swing.JTable;
+import javax.swing.JTextField;
 import javax.swing.KeyStroke;
 import javax.swing.ListSelectionModel;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
@@ -88,4 +93,6 @@
     private SelectionTableModel selectionTableModel;
 
+    private JTextField tfRole;
+
     /**
      * Creates a new relation editor for the given relation. The relation
@@ -506,4 +513,19 @@
         JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
         buttonPanel.add(new SideButton(new DownlaodAction()));
+        buttonPanel.add(new JLabel(tr("Role:")));
+        tfRole = new JTextField(10);
+        tfRole.addFocusListener(
+                new FocusAdapter() {
+                    @Override
+                    public void focusGained(FocusEvent e) {
+                        tfRole.selectAll();
+                    }
+                }
+        );
+        buttonPanel.add(tfRole);
+        SetRoleAction setRoleAction = new SetRoleAction();
+        memberTableModel.getSelectionModel().addListSelectionListener(setRoleAction);
+        buttonPanel.add(new SideButton(setRoleAction));
+        tfRole.getDocument().addDocumentListener(setRoleAction);
         return buttonPanel;
     }
@@ -862,4 +884,38 @@
         public void actionPerformed(ActionEvent e) {
             downloadRelationMembers();
+        }
+    }
+
+    class SetRoleAction extends AbstractAction implements ListSelectionListener, DocumentListener{
+        public SetRoleAction() {
+            putValue(SHORT_DESCRIPTION,   tr("Sets a role for the selected members"));
+            // FIXME: find better icon
+            putValue(SMALL_ICON, ImageProvider.get("ok"));
+            putValue(NAME, tr("Apply Role"));
+            refreshEnabled();
+        }
+
+        protected void refreshEnabled() {
+            setEnabled(memberTable.getSelectedRowCount() > 0 && !tfRole.getText().equals(""));
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            memberTableModel.updateRole(memberTable.getSelectedRows(), tfRole.getText());
+        }
+
+        public void valueChanged(ListSelectionEvent e) {
+            refreshEnabled();
+        }
+
+        public void changedUpdate(DocumentEvent e) {
+            refreshEnabled();
+        }
+
+        public void insertUpdate(DocumentEvent e) {
+            refreshEnabled();
+        }
+
+        public void removeUpdate(DocumentEvent e) {
+            refreshEnabled();
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 1793)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 1794)
@@ -326,3 +326,20 @@
         return count;
     }
+
+    /**
+     * updates the role of the members given by the indices in <code>idx</code>
+     * 
+     * @param idx the array of indices
+     * @param role the new role
+     */
+    public void updateRole(int [] idx, String role) {
+        if (idx == null || idx.length == 0) return;
+        for (int row: idx) {
+            members.get(row).role = role;
+        }
+        fireTableDataChanged();
+        for (int row: idx) {
+            getSelectionModel().addSelectionInterval(row, row);
+        }
+    }
 }
