Index: applications/editors/josm/plugins/relcontext/src/relcontext/RelContextDialog.java
===================================================================
--- applications/editors/josm/plugins/relcontext/src/relcontext/RelContextDialog.java	(revision 25671)
+++ applications/editors/josm/plugins/relcontext/src/relcontext/RelContextDialog.java	(revision 25672)
@@ -1,9 +1,16 @@
 package relcontext;
 
+import java.awt.event.ActionEvent;
+import java.awt.event.ComponentEvent;
+import java.awt.event.FocusEvent;
 import java.beans.PropertyChangeEvent;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.awt.BorderLayout;
+import java.awt.Dimension;
 import java.awt.FlowLayout;
+import java.awt.GridBagLayout;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.FocusAdapter;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
@@ -26,5 +33,11 @@
 import java.util.*;
 import javax.swing.*;
+import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.event.DatasetEventManager;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingComboBox;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionListItem;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
+import org.openstreetmap.josm.tools.GBC;
 import relcontext.actions.*;
 
@@ -38,6 +51,9 @@
     private final DefaultListModel relationsData;
     private ChosenRelation chosenRelation;
-    private JPanel topLine;
+    private JPanel chosenRelationPanel;
     private ChosenRelationPopupMenu popupMenu;
+    private JLabel crRoleIndicator;
+    private AutoCompletingComboBox roleBox;
+    private String lastSelectedRole;
 
     public RelContextDialog() {
@@ -74,8 +90,28 @@
         rcPanel.add(new JScrollPane(relationsList), BorderLayout.CENTER);
 
+        chosenRelationPanel = new JPanel(new BorderLayout());
+
+        // [^] roles [new role][V][Apply]
+        final JPanel rolePanel = new JPanel(new GridBagLayout());
+        final JButton toggleRolePanelButtonTop = new JButton(new TogglePanelAction(rolePanel));
+        final JButton toggleRolePanelButtonIn = new JButton(new TogglePanelAction(rolePanel));
+        rolePanel.add(toggleRolePanelButtonIn, GBC.std());
+        crRoleIndicator = new JLabel();
+        rolePanel.add(crRoleIndicator, GBC.std().insets(5, 0, 5, 0));
+
+        // autocompleting role chooser
+        roleBox = new AutoCompletingComboBox();
+        final Action applyNewRoleAction = new ApplyNewRoleAction();
+//        roleBox.getEditor().addActionListener(applyNewRoleAction);
+        roleBox.setEditable(false);
+        rolePanel.add(roleBox, GBC.std().fill(GBC.HORIZONTAL));
+        rolePanel.add(new JButton(applyNewRoleAction), GBC.eol());
+        rolePanel.setVisible(false);
+
         // [±][X] relation U [AZ][Down][Edit]
-        topLine = new JPanel(new BorderLayout());
+        JPanel topLine = new JPanel(new BorderLayout());
         JPanel topLeftButtons = new JPanel(new FlowLayout(FlowLayout.LEFT));
         topLeftButtons.add(new JButton(new AddRemoveMemberAction(chosenRelation)));
+        topLeftButtons.add(toggleRolePanelButtonTop);
         topLeftButtons.add(new JButton(new ClearChosenRelationAction(chosenRelation)));
         topLine.add(topLeftButtons, BorderLayout.WEST);
@@ -92,5 +128,20 @@
         topRightButtons.add(new JButton(new EditChosenRelationAction(chosenRelation)));
         topLine.add(topRightButtons, BorderLayout.EAST);
-        rcPanel.add(topLine, BorderLayout.NORTH);
+
+        chosenRelationPanel.add(topLine, BorderLayout.CENTER);
+        chosenRelationPanel.add(rolePanel, BorderLayout.SOUTH);
+        rcPanel.add(chosenRelationPanel, BorderLayout.NORTH);
+
+        rolePanel.addComponentListener(new ComponentAdapter() {
+            @Override
+            public void componentHidden( ComponentEvent e ) {
+                toggleRolePanelButtonTop.setVisible(true);
+            }
+
+            @Override
+            public void componentShown( ComponentEvent e ) {
+                toggleRolePanelButtonTop.setVisible(false);
+            }
+        });
 
         sortAndFixAction.addPropertyChangeListener(new PropertyChangeListener() {
@@ -107,5 +158,5 @@
         });
         downloadButton.setVisible(false);
-        topLine.setVisible(false);
+        chosenRelationPanel.setVisible(false);
 
         // [+][Multi] [X]Adm [X]Tags [X]1
@@ -139,9 +190,31 @@
 
     public void chosenRelationChanged( Relation oldRelation, Relation newRelation ) {
-        if( topLine != null )
-            topLine.setVisible(newRelation != null);
+        if( chosenRelationPanel != null )
+            chosenRelationPanel.setVisible(newRelation != null);
         if( oldRelation != newRelation && Main.main.getCurrentDataSet() != null )
             selectionChanged(Main.main.getCurrentDataSet().getSelected());
+        updateRoleIndicator();
+        updateRoleAutoCompletionList();
         // ?
+    }
+
+    private void updateRoleIndicator() {
+        if( crRoleIndicator == null )
+            return;
+        String role = "";
+        if( chosenRelation != null && chosenRelation.get() != null && Main.main.getCurrentDataSet() != null && !Main.main.getCurrentDataSet().selectionEmpty() ) {
+            Collection<OsmPrimitive> selected = Main.main.getCurrentDataSet().getSelected();
+            for( RelationMember m : chosenRelation.get().getMembers() ) {
+                if( selected.contains(m.getMember()) ) {
+                    if( role.length() == 0 && m.getRole() != null )
+                        role = m.getRole();
+                    else if( !role.equals(m.getRole()) ) {
+                        role = tr("<different>");
+                        break;
+                    }
+                }
+            }
+        }
+        crRoleIndicator.setText(role);
     }
 
@@ -149,4 +222,5 @@
         if( !isVisible() || relationsData == null )
             return;
+        updateRoleIndicator();
         // repopulate relations table
         relationsData.clear();
@@ -177,4 +251,32 @@
     }
 
+    private static final Map<String, String[]> possibleRoles = new HashMap<String, String[]>();
+    {
+        possibleRoles.put("boundary", new String[] {"admin_centre", "label", "subarea"});
+        possibleRoles.put("route", new String[] {"forward", "backward", "stop", "platform"});
+    }
+
+    private void updateRoleAutoCompletionList() {
+        List<String> items = new ArrayList<String>();
+        items.add("");
+        if( chosenRelation != null && chosenRelation.get() != null ) {
+            if( chosenRelation.isMultipolygon() ) {
+                items.add("outer");
+                items.add("inner");
+            }
+            if( chosenRelation.get().get("type") != null ) {
+                String[] values = possibleRoles.get(chosenRelation.get().get("type"));
+                if( values != null )
+                    for( String value : values )
+                        items.add(value);
+            }
+        } else if( roleBox.getSelectedItem() != null ) {
+            lastSelectedRole = ((AutoCompletionListItem)roleBox.getSelectedItem()).getValue();
+        }
+        roleBox.setPossibleItems(items);
+        if( lastSelectedRole != null && items.contains(lastSelectedRole) )
+            roleBox.setSelectedItem(lastSelectedRole);
+    }
+
     private class ChosenRelationMouseAdapter extends MouseAdapter {
         @Override
@@ -208,3 +310,46 @@
         }
     }
+
+    private class TogglePanelAction extends AbstractAction {
+        private JComponent component;
+
+        public TogglePanelAction( JPanel panel ) {
+            super("R");
+            this.component = panel;
+        }
+
+        public void actionPerformed( ActionEvent e ) {
+            component.setVisible(!component.isVisible());
+        }
+    }
+
+    private class ApplyNewRoleAction extends AbstractAction {
+        public ApplyNewRoleAction() {
+            super("OK");
+        }
+
+        public void actionPerformed( ActionEvent e ) {
+            Object selectedItem = roleBox == null ? null : roleBox.getSelectedItem();
+            if( selectedItem != null && chosenRelation != null && chosenRelation.get() != null && Main.main.getCurrentDataSet() != null && !Main.main.getCurrentDataSet().selectionEmpty() ) {
+//                String role = roleBox.getEditor().getItem().toString().trim();
+                if( selectedItem instanceof AutoCompletionListItem )
+                    selectedItem = ((AutoCompletionListItem)selectedItem).getValue();
+                String role = selectedItem.toString().trim();
+                Collection<OsmPrimitive> selected = Main.main.getCurrentDataSet().getSelected();
+                Relation r = new Relation(chosenRelation.get());
+                boolean fixed = false;
+                for( int i = 0; i < r.getMembersCount(); i++ ) {
+                    RelationMember m = r.getMember(i);
+                    if( selected.contains(m.getMember()) ) {
+                        if( !role.equals(m.getRole()) ) {
+                            r.setMember(i, new RelationMember(role, m.getMember()));
+                            fixed = true;
+                        }
+                    }
+                }
+                if( fixed )
+                    Main.main.undoRedo.add(new ChangeCommand(chosenRelation.get(), r));
+            }
+        }
+    }
 }
Index: applications/editors/josm/plugins/relcontext/src/relcontext/actions/CreateRelationAction.java
===================================================================
--- applications/editors/josm/plugins/relcontext/src/relcontext/actions/CreateRelationAction.java	(revision 25671)
+++ applications/editors/josm/plugins/relcontext/src/relcontext/actions/CreateRelationAction.java	(revision 25672)
@@ -1,9 +1,19 @@
 package relcontext.actions;
 
+import java.awt.Dialog.ModalityType;
+import java.awt.GridBagLayout;
 import java.util.Collection;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import static org.openstreetmap.josm.tools.I18n.tr;
 import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Arrays;
 import java.util.LinkedList;
+import java.util.List;
+import javax.swing.Box;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
@@ -12,4 +22,6 @@
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingComboBox;
+import org.openstreetmap.josm.tools.GBC;
 import relcontext.ChosenRelation;
 
@@ -35,14 +47,13 @@
 
     public void actionPerformed( ActionEvent e ) {
-        // todo: ask user for relation type
-        String type = "";
+        String type = askForType();
+        if( type == null )
+            return;
 
         Relation rel = new Relation();
-        if( type != null && type.length() > 0 ) {
+        if( type.length() > 0 )
             rel.put("type", type);
-        }
-        for( OsmPrimitive selected : getCurrentDataSet().getSelected() ) {
+        for( OsmPrimitive selected : getCurrentDataSet().getSelected() )
             rel.addMember(new RelationMember("", selected));
-        }
 
         Main.main.undoRedo.add(new AddCommand(rel));
@@ -66,3 +77,47 @@
         setEnabled(selection != null && !selection.isEmpty());
     }
+
+    private static final List<String> RELATION_TYPES = Arrays.asList(new String[] {
+        "multipolygon", "boundary", "route"
+    });
+
+    private String askForType() {
+        JPanel panel = new JPanel(new GridBagLayout());
+        panel.add(new JLabel(tr("Choose type for the new relation:")), GBC.eol().insets(0, 0, 0, 5));
+
+        final AutoCompletingComboBox keys = new AutoCompletingComboBox();
+        keys.setPossibleItems(RELATION_TYPES);
+        keys.setEditable(true);
+
+        panel.add(new JLabel(tr("Type")), GBC.std());
+        panel.add(Box.createHorizontalStrut(10), GBC.std());
+        panel.add(keys, GBC.eol().fill(GBC.HORIZONTAL));
+
+        final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION) {
+            @Override
+            public void selectInitialValue() {
+                keys.requestFocusInWindow();
+                keys.getEditor().selectAll();
+            }
+        };
+        final JDialog dlg = optionPane.createDialog(Main.parent, tr("Create relation"));
+        dlg.setModalityType(ModalityType.DOCUMENT_MODAL);
+
+        keys.getEditor().addActionListener(new ActionListener() {
+            public void actionPerformed( ActionEvent e ) {
+                dlg.setVisible(false);
+                optionPane.setValue(JOptionPane.OK_OPTION);
+            }
+        });
+
+        dlg.setVisible(true);
+
+        Object answer = optionPane.getValue();
+        if( answer == null || answer == JOptionPane.UNINITIALIZED_VALUE
+                || (answer instanceof Integer && (Integer)answer != JOptionPane.OK_OPTION) ) {
+            return null;
+        }
+
+        return keys.getEditor().getItem().toString().trim();
+    }
 }
