Index: trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 1929)
+++ trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 1930)
@@ -97,5 +97,5 @@
                     for(Way w : selectedWays) {
                         if (rm.member == w) {
-                            Pair<Relation,String> pair = new Pair<Relation,String>(r, rm.role == null ? "" : rm.role);
+                            Pair<Relation,String> pair = new Pair<Relation,String>(r, rm.getRole());
                             HashSet<Way> waylinks = new HashSet<Way>();
                             if (backlinks.containsKey(pair)) {
@@ -232,5 +232,5 @@
                 // note to re-add it later on.
                 if (selectedWays.contains(rm.member)) {
-                    rolesToReAdd.add(rm.role);
+                    rolesToReAdd.add(rm.getRole());
                 } else {
                     newRel.members.add(rm);
Index: trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java	(revision 1929)
+++ trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java	(revision 1930)
@@ -134,5 +134,5 @@
                     for (Node n : allNodes) {
                         if (rm.member == n) {
-                            Pair<Relation,String> pair = new Pair<Relation,String>(r, rm.role);
+                            Pair<Relation,String> pair = new Pair<Relation,String>(r, rm.getRole());
                             HashSet<Node> nodelinks = new HashSet<Node>();
                             if (backlinks.containsKey(pair)) {
@@ -282,5 +282,5 @@
                 // just keep a note to re-add it later on.
                 if (allNodes.contains(rm.member)) {
-                    rolesToReAdd.add(rm.role);
+                    rolesToReAdd.add(rm.getRole());
                 } else {
                     newRel.members.add(rm);
Index: trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 1929)
+++ trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 1930)
@@ -316,9 +316,9 @@
 
                         int j = i;
-                        boolean backwards = "backward".equals(rm.role);
+                        boolean backwards = "backward".equals(rm.getRole());
                         for(Way wayToAdd : newWays)
                         {
-                            RelationMember em = new RelationMember(rm.role, wayToAdd);
-                            if(em.role != null && em.role.length() > 0 && !("multipolygon".equals(type))) {
+                            RelationMember em = new RelationMember(rm.getRole(), wayToAdd);
+                            if(em.hasRole() && !("multipolygon".equals(type))) {
                                 warnmerole = true;
                             }
Index: trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java	(revision 1929)
+++ trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java	(revision 1930)
@@ -335,5 +335,5 @@
                             rolesToReAdd = new HashSet<String>();
                         }
-                        rolesToReAdd.add(rm.role);
+                        rolesToReAdd.add(rm.getRole());
                     }
                 }
Index: trunk/src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java	(revision 1929)
+++ trunk/src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java	(revision 1930)
@@ -48,5 +48,5 @@
         }
 
-        oldRole = relation.getMember(position).role;
+        oldRole = relation.getMember(position).getRole();
         relation.getMember(position).role = newRole;
 
Index: trunk/src/org/openstreetmap/josm/command/DeleteCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/DeleteCommand.java	(revision 1929)
+++ trunk/src/org/openstreetmap/josm/command/DeleteCommand.java	(revision 1930)
@@ -166,5 +166,5 @@
         for (RelationMember m : ref.getMembers()) {
             if (m.member == osm) {
-                role = m.role;
+                role = m.getRole();
                 break;
             }
Index: trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
===================================================================
--- trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java	(revision 1929)
+++ trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java	(revision 1930)
@@ -119,5 +119,5 @@
             for (RelationMember member : relation.getMembers()) {
                 if (!member.member.hasEqualSemanticAttributes(oldway)
-                        || member.role.length() == 0) {
+                        || !member.hasRole()) {
                     position++;
                     continue;
@@ -127,6 +127,6 @@
                 String newRole = null;
                 for (PrefixSuffixSwitcher prefixSuffixSwitcher : prefixSuffixSwitchers) {
-                    newRole = prefixSuffixSwitcher.apply(member.role);
-                    if (!newRole.equals(member.role)) {
+                    newRole = prefixSuffixSwitcher.apply(member.getRole());
+                    if (!newRole.equals(member.getRole())) {
                         found = true;
                         break;
Index: trunk/src/org/openstreetmap/josm/corrector/RoleCorrectionTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/corrector/RoleCorrectionTableModel.java	(revision 1929)
+++ trunk/src/org/openstreetmap/josm/corrector/RoleCorrectionTableModel.java	(revision 1930)
@@ -42,5 +42,5 @@
             return NAME_FORMATTER.getName(roleCorrection.relation);
         case 1:
-            return roleCorrection.member.role;
+            return roleCorrection.member.getRole();
         case 2:
             return roleCorrection.newRole;
Index: trunk/src/org/openstreetmap/josm/data/osm/RelationMember.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/RelationMember.java	(revision 1929)
+++ trunk/src/org/openstreetmap/josm/data/osm/RelationMember.java	(revision 1930)
@@ -12,4 +12,26 @@
     public String role;
     public OsmPrimitive member;
+
+    /**
+     *
+     * @return Role name or "". Never returns null
+     * @since 1930
+     */
+    public String getRole() {
+        if (role == null) {
+            return "";
+        } else {
+            return role;
+        }
+    }
+
+    /**
+     *
+     * @return True if role is set
+     * @since 1930
+     */
+    public boolean hasRole() {
+        return role != null && !"".equals(role);
+    }
 
     /**
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 1929)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 1930)
@@ -556,5 +556,5 @@
                         w.getName()), true);
                     }
-                    else if("from".equals(m.role)) {
+                    else if("from".equals(m.getRole())) {
                         if(fromWay != null)
                             r.putError(tr("More than one \"from\" way found."), true);
@@ -562,5 +562,5 @@
                             fromWay = w;
                         }
-                    } else if("to".equals(m.role)) {
+                    } else if("to".equals(m.getRole())) {
                         if(toWay != null)
                             r.putError(tr("More than one \"to\" way found."), true);
@@ -568,5 +568,5 @@
                             toWay = w;
                         }
-                    } else if("via".equals(m.role)) {
+                    } else if("via".equals(m.getRole())) {
                         if(via != null)
                             r.putError(tr("More than one \"via\" found."), true);
@@ -575,10 +575,10 @@
                     }
                     else
-                        r.putError(tr("Unknown role ''{0}''.", m.role), true);
+                        r.putError(tr("Unknown role ''{0}''.", m.getRole()), true);
                 }
                 else if(m.member instanceof Node)
                 {
                     Node n = (Node) m.member;
-                    if("via".equals(m.role))
+                    if("via".equals(m.getRole()))
                     {
                         if(via != null)
@@ -588,5 +588,5 @@
                     }
                     else
-                        r.putError(tr("Unknown role ''{0}''.", m.role), true);
+                        r.putError(tr("Unknown role ''{0}''.", m.getRole()), true);
                 }
                 else
@@ -801,13 +801,13 @@
                         w.getName()), true);
                     }
-                    else if("inner".equals(m.role))
+                    else if("inner".equals(m.getRole()))
                         inner.add(w);
-                    else if("outer".equals(m.role))
+                    else if("outer".equals(m.getRole()))
                         outer.add(w);
                     else
                     {
                         r.putError(tr("No useful role ''{0}'' for Way ''{1}''.",
-                        m.role == null ? "" : m.role, w.getName()), true);
-                        if(m.role == null || m.role.length() == 0)
+                          m.getRole(), w.getName()), true);
+                        if(!m.hasRole())
                             outer.add(w);
                         else if(r.isSelected())
Index: trunk/src/org/openstreetmap/josm/gui/conflict/relation/RelationMemberListMergeModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/relation/RelationMemberListMergeModel.java	(revision 1929)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/relation/RelationMemberListMergeModel.java	(revision 1930)
@@ -24,8 +24,5 @@
     @Override
     public boolean isEqualEntry(RelationMember e1, RelationMember e2) {
-        boolean ret =
-            (    (e1.role == null && e2.role == null)
-                    || (e1.role != null && e1.role.equals(e2.role))
-            );
+        boolean ret = e1.getRole().equals(e2.getRole());
         if (e1.member.id > 0 ) {
             ret = ret && (e1.member.id == e2.member.id);
@@ -100,5 +97,5 @@
     @Override
     protected RelationMember cloneEntryForMergedList(RelationMember entry) {
-        return new RelationMember(entry.role, entry.member);
+        return new RelationMember(entry);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/conflict/relation/RelationMemberTableCellEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/relation/RelationMemberTableCellEditor.java	(revision 1929)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/relation/RelationMemberTableCellEditor.java	(revision 1930)
@@ -15,5 +15,5 @@
 /**
  * {@see TableCellEditor} for the the role column in a table for {@see RelationMember}s.
- * 
+ *
  */
 public class RelationMemberTableCellEditor extends AbstractCellEditor implements TableCellEditor{
@@ -37,5 +37,5 @@
         RelationMember member = (RelationMember)value;
 
-        editor.setText(member.role == null ? "" : member.role);
+        editor.setText(member.getRole());
         editor.selectAll();
         return editor;
Index: trunk/src/org/openstreetmap/josm/gui/conflict/relation/RelationMemberTableCellRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/relation/RelationMemberTableCellRenderer.java	(revision 1929)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/relation/RelationMemberTableCellRenderer.java	(revision 1930)
@@ -25,5 +25,5 @@
 /**
  * This is the {@see TableCellRenderer} used in the tables of {@see RelationMemberMerger}.
- * 
+ *
  */
 public  class RelationMemberTableCellRenderer extends JLabel implements TableCellRenderer {
@@ -48,5 +48,5 @@
     /**
      * Load the image icon for an OSM primitive of type node
-     * 
+     *
      * @return the icon; null, if not found
      */
@@ -153,6 +153,6 @@
 
     protected void renderRole(RelationMember member) {
-        setText(member.role == null ? "" : member.role);
-        setToolTipText(member.role == null ? "" : member.role);
+        setText(member.getRole());
+        setToolTipText(member.getRole());
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 1929)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 1930)
@@ -535,7 +535,7 @@
                     for (RelationMember r : col) {
                         if (text == null) {
-                            text = r.role;
+                            text = r.getRole();
                         }
-                        else if (!text.equals(r.role)) {
+                        else if (!text.equals(r.getRole())) {
                             text = tr("<different>");
                             break;
@@ -595,6 +595,5 @@
                                     if (rm.member == osm)
                                     {
-                                        RelationMember mem = new RelationMember(rm.role, rm.member);
-                                        rel.members.remove(mem);
+                                        rel.members.remove(rm);
                                         break;
                                     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 1929)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 1930)
@@ -87,5 +87,5 @@
         switch (columnIndex) {
             case 0:
-                return members.get(rowIndex).role;
+                return members.get(rowIndex).getRole();
             case 1:
                 return members.get(rowIndex).member;
@@ -386,5 +386,5 @@
     /**
      * Replies the set of selected referers. Never null, but may be empty.
-     * 
+     *
      * @return the set of selected referers
      */
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/ac/AutoCompletionCache.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/ac/AutoCompletionCache.java	(revision 1929)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/ac/AutoCompletionCache.java	(revision 1930)
@@ -132,9 +132,6 @@
     protected void cacheRelationMemberRoles(Relation relation){
         for (RelationMember m: relation.getMembers()) {
-            if (m.role == null || m.role.trim().equals("")) {
-                continue;
-            }
-            if (!roleCache.contains(m.role)) {
-                roleCache.add(m.role);
+            if (m.hasRole() && !roleCache.contains(m.getRole())) {
+                roleCache.add(m.getRole());
             }
         }
Index: trunk/src/org/openstreetmap/josm/io/OsmWriter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmWriter.java	(revision 1929)
+++ trunk/src/org/openstreetmap/josm/io/OsmWriter.java	(revision 1930)
@@ -135,5 +135,5 @@
                 out.print(OsmPrimitiveType.from(em.member).getAPIName());
                 out.println("' ref='"+getUsedId(em.member)+"' role='" +
-                        XmlWriter.encode(em.role == null ? "" : em.role) + "' />");
+                        XmlWriter.encode(em.getRole()) + "' />");
             }
             addTags(e, "relation", false);
