Index: /trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 1936)
+++ /trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 1937)
@@ -94,7 +94,7 @@
             }
             for (RelationMember rm : r.getMembers()) {
-                if (rm.member instanceof Way) {
+                if (rm.isWay()) {
                     for(Way w : selectedWays) {
-                        if (rm.member == w) {
+                        if (rm.getMember() == w) {
                             Pair<Relation,String> pair = new Pair<Relation,String>(r, rm.getRole());
                             HashSet<Way> waylinks = new HashSet<Way>();
@@ -231,5 +231,5 @@
                 // Don't copy the member if it to one of our ways, just keep a
                 // note to re-add it later on.
-                if (selectedWays.contains(rm.member)) {
+                if (selectedWays.contains(rm.getMember())) {
                     rolesToReAdd.add(rm.getRole());
                 } else {
Index: /trunk/src/org/openstreetmap/josm/actions/CopyAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/CopyAction.java	(revision 1936)
+++ /trunk/src/org/openstreetmap/josm/actions/CopyAction.java	(revision 1937)
@@ -97,9 +97,8 @@
                 List<RelationMember> members = new ArrayList<RelationMember>();
                 for (RelationMember m : e.getMembers()) {
-                    if (! map.containsKey(m.member)) {
-                        m.member.visit(this);
+                    if (! map.containsKey(m.getMember())) {
+                        m.getMember().visit(this);
                     }
-                    RelationMember mnew = new RelationMember(m);
-                    mnew.member = map.get(m.member);
+                    RelationMember mnew = new RelationMember(m.getRole(), map.get(m.getMember()));
                     members.add(mnew);
                 }
Index: /trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java	(revision 1936)
+++ /trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java	(revision 1937)
@@ -131,7 +131,7 @@
             }
             for (RelationMember rm : r.getMembers()) {
-                if (rm.member instanceof Node) {
+                if (rm.isNode()) {
                     for (Node n : allNodes) {
-                        if (rm.member == n) {
+                        if (rm.getMember() == n) {
                             Pair<Relation,String> pair = new Pair<Relation,String>(r, rm.getRole());
                             HashSet<Node> nodelinks = new HashSet<Node>();
@@ -281,5 +281,5 @@
                 // Don't copy the member if it points to one of our nodes,
                 // just keep a note to re-add it later on.
-                if (allNodes.contains(rm.member)) {
+                if (allNodes.contains(rm.getMember())) {
                     rolesToReAdd.add(rm.getRole());
                 } else {
Index: /trunk/src/org/openstreetmap/josm/command/DeleteCommand.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/command/DeleteCommand.java	(revision 1936)
+++ /trunk/src/org/openstreetmap/josm/command/DeleteCommand.java	(revision 1937)
@@ -165,5 +165,5 @@
         String role = new String();
         for (RelationMember m : ref.getMembers()) {
-            if (m.member == osm) {
+            if (m.getMember() == osm) {
                 role = m.getRole();
                 break;
Index: /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 1936)
+++ /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 1937)
@@ -404,5 +404,5 @@
             while(it.hasNext()) {
                 RelationMember member = it.next();
-                if (member.member.equals(primitive)) {
+                if (member.getMember().equals(primitive)) {
                     it.remove();
                 }
Index: /trunk/src/org/openstreetmap/josm/data/osm/RelationMember.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/RelationMember.java	(revision 1936)
+++ /trunk/src/org/openstreetmap/josm/data/osm/RelationMember.java	(revision 1937)
@@ -34,4 +34,68 @@
         return role != null && !"".equals(role);
     }
+
+    /**
+     *
+     * @return True if member is relation
+     * @since 1937
+     */
+    public boolean isRelation() {
+        return member instanceof Relation;
+    }
+
+    /**
+    *
+    * @return True if member is way
+    * @since 1937
+    */
+    public boolean isWay() {
+        return member instanceof Way;
+    }
+
+    /**
+    *
+    * @return True if member is node
+    * @since 1937
+    */
+    public boolean isNode() {
+        return member instanceof Node;
+    }
+
+    /**
+     *
+     * @return Member as relation
+     * @since 1937
+     */
+    public Relation getRelation() {
+        return (Relation)member;
+    }
+
+    /**
+    *
+    * @return Member as way
+    * @since 1937
+    */
+    public Way getWay() {
+        return (Way)member;
+    }
+
+    /**
+    *
+    * @return Member as node
+    * @since 1937
+    */
+    public Node getNode() {
+        return (Node)member;
+    }
+
+    /**
+    *
+    * @return Member
+    * @since 1937
+    */
+    public OsmPrimitive getMember() {
+        return member;
+    }
+
 
     /**
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/AllNodesVisitor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/AllNodesVisitor.java	(revision 1936)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/AllNodesVisitor.java	(revision 1937)
@@ -44,5 +44,5 @@
     public void visit(Relation e) {
         for (RelationMember m : e.getMembers())
-            if (m.member instanceof Node) visit((Node)m.member);
+            if (m.isNode()) visit(m.getNode());
     }
     /**
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/BoundingXYVisitor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/BoundingXYVisitor.java	(revision 1936)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/BoundingXYVisitor.java	(revision 1937)
@@ -34,6 +34,6 @@
         // only use direct members
         for (RelationMember m : e.getMembers()) {
-            if (!(m.member instanceof Relation)) {
-                m.member.visit(this);
+            if (!m.isRelation()) {
+                m.getMember().visit(this);
             }
         }
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/CollectBackReferencesVisitor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/CollectBackReferencesVisitor.java	(revision 1936)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/CollectBackReferencesVisitor.java	(revision 1937)
@@ -74,5 +74,5 @@
             if (r.incomplete || r.deleted) continue;
             for (RelationMember m : r.getMembers()) {
-                if (m.member == p) {
+                if (m.getMember() == p) {
                     if (!data.contains(r)) {
                         data.add(r);
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 1936)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 1937)
@@ -487,8 +487,7 @@
             for (RelationMember m : r.getMembers())
             {
-                if (m.member != null && !m.member.incomplete && !m.member.deleted
-                && m.member instanceof Node)
-                {
-                    drawSelectedMember(m.member, styles != null ? getPrimitiveStyle(m.member) : null, true, true);
+                if (m.isNode() && !m.getMember().incomplete && !m.getMember().deleted)
+                {
+                    drawSelectedMember(m.getMember(), styles != null ? getPrimitiveStyle(m.getMember()) : null, true, true);
                 }
             }
@@ -509,8 +508,7 @@
             for (RelationMember m : r.getMembers())
             {
-                if (m.member != null && !m.member.incomplete && !m.member.deleted
-                && m.member instanceof Way) /* nodes drawn on second call */
-                {
-                    drawSelectedMember(m.member, styles != null ? getPrimitiveStyle(m.member)
+                if (m.isWay() && !m.getMember().incomplete && !m.getMember().deleted) /* nodes drawn on second call */
+                {
+                    drawSelectedMember(m.getMember(), styles != null ? getPrimitiveStyle(m.getMember())
                     : null, true, true);
                 }
@@ -537,10 +535,11 @@
             //    System.out.println("member " + m.member + " selected " + r.selected);
 
-            if(m.member == null)
+            if(m.getMember() == null)
+                // TODO Nullable member will not be allowed after RelationMember.member is encalupsed
                 r.putError(tr("Empty member in relation."), true);
-            else if(m.member.deleted)
+            else if(m.getMember().deleted)
                 r.putError(tr("Deleted member ''{0}'' in relation.",
-                m.member.getName()), true);
-            else if(m.member.incomplete)
+                m.getMember().getName()), true);
+            else if(m.getMember().incomplete)
             {
                 return;
@@ -548,7 +547,7 @@
             else
             {
-                if(m.member instanceof Way)
-                {
-                    Way w = (Way) m.member;
+                if(m.isWay())
+                {
+                    Way w = m.getWay();
                     if(w.getNodesCount() < 2)
                     {
@@ -577,7 +576,7 @@
                         r.putError(tr("Unknown role ''{0}''.", m.getRole()), true);
                 }
-                else if(m.member instanceof Node)
-                {
-                    Node n = (Node) m.member;
+                else if(m.isNode())
+                {
+                    Node n = m.getNode();
                     if("via".equals(m.getRole()))
                     {
@@ -591,5 +590,5 @@
                 }
                 else
-                    r.putError(tr("Unknown member type for ''{0}''.", m.member.getName()), true);
+                    r.putError(tr("Unknown member type for ''{0}''.", m.getMember().getName()), true);
             }
         }
@@ -784,16 +783,17 @@
         for (RelationMember m : r.getMembers())
         {
-            if(m.member == null)
+            if(m.getMember() == null)
+                //TODO Remove useless nullcheck when RelationMember.member is encalupsed
                 r.putError(tr("Empty member in relation."), true);
-            else if(m.member.deleted)
+            else if(m.getMember().deleted)
                 r.putError(tr("Deleted member ''{0}'' in relation.",
-                m.member.getName()), true);
-            else if(m.member.incomplete)
+                m.getMember().getName()), true);
+            else if(m.getMember().incomplete)
                 incomplete = true;
             else
             {
-                if(m.member instanceof Way)
-                {
-                    Way w = (Way) m.member;
+                if(m.isWay())
+                {
+                    Way w = m.getWay();
                     if(w.getNodesCount() < 2)
                     {
@@ -812,6 +812,6 @@
                             outer.add(w);
                         else if(r.isSelected())
-                            drawSelectedMember(m.member, styles != null
-                            ? getPrimitiveStyle(m.member) : null, true, true);
+                            drawSelectedMember(m.getMember(), styles != null
+                            ? getPrimitiveStyle(m.getMember()) : null, true, true);
                     }
                 }
@@ -819,5 +819,5 @@
                 {
                     r.putError(tr("Non-Way ''{0}'' in multipolygon.",
-                    m.member.getName()), true);
+                    m.getMember().getName()), true);
                 }
             }
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java	(revision 1936)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java	(revision 1937)
@@ -92,6 +92,5 @@
         clone.members.clear();
         for (RelationMember member: r.getMembers()) {
-            RelationMember cloneMember = new RelationMember(member);
-            cloneMember.member = mappedPrimitives.get(member.member);
+            RelationMember cloneMember = new RelationMember(member.getRole(), mappedPrimitives.get(member.getMember()));
             clone.members.add(cloneMember);
         }
@@ -190,11 +189,11 @@
         rememberRelationPartial(r);
         for (RelationMember member: r.getMembers()) {
-            if (isAlreadyRemembered(member.member)) {
+            if (isAlreadyRemembered(member.getMember())) {
                 // referred primitive already remembered
                 //
                 continue;
             }
-            if (member.member instanceof Node) {
-                Node node = (Node)member.member;
+            if (member.isNode()) {
+                Node node = member.getNode();
                 if (isInSelectionBase(node)) {
                     rememberNode(node);
@@ -204,6 +203,6 @@
                     rememberNodeIncomplete(node);
                 }
-            } else if (member.member instanceof Way) {
-                Way way = (Way)member.member;
+            } else if (member.isWay()) {
+                Way way = member.getWay();
                 if (isInSelectionBase(way)) {
                     way.visit(this);
@@ -213,7 +212,7 @@
                     rememberWayIncomplete(way);
                 }
-            } else if (member.member instanceof Relation) {
-                Relation relation = (Relation)member.member;
-                if (isInSelectionBase(member.member)) {
+            } else if (member.isRelation()) {
+                Relation relation = member.getRelation();
+                if (isInSelectionBase(member.getMember())) {
                     relation.visit(this);
                 } else if (isNew(relation)) {
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java	(revision 1936)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java	(revision 1937)
@@ -193,11 +193,10 @@
         LinkedList<RelationMember> newMembers = new LinkedList<RelationMember>();
         for (RelationMember myMember : r.getMembers()) {
-            OsmPrimitive mergedMember = merged.get(myMember.member);
+            OsmPrimitive mergedMember = merged.get(myMember.getMember());
             if (mergedMember == null) {
                 newMembers.add(myMember);
             } else {
                 if (! mergedMember.deleted) {
-                    RelationMember newMember = new RelationMember(myMember);
-                    newMember.member = mergedMember;
+                    RelationMember newMember = new RelationMember(myMember.getRole(), mergedMember);
                     newMembers.add(newMember);
                 }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 1936)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 1937)
@@ -191,5 +191,5 @@
             public void visit(Relation e) {
                 for (RelationMember em : e.getMembers()) {
-                    em.member.visit(this);
+                    em.getMember().visit(this);
                 }
             }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/ChildRelationBrowser.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/ChildRelationBrowser.java	(revision 1936)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/ChildRelationBrowser.java	(revision 1937)
@@ -366,6 +366,6 @@
             downloadedRelationIds.add(parent.id);
             for (RelationMember member: parent.getMembers()) {
-                if (member.member instanceof Relation) {
-                    Relation child = (Relation)member.member;
+                if (member.isRelation()) {
+                    Relation child = member.getRelation();
                     if (!downloadedRelationIds.contains(child)) {
                         relationsToDownload.push(child);
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 1936)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 1937)
@@ -55,5 +55,4 @@
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.ConflictAddCommand;
-import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -933,5 +932,5 @@
      * Selects  members in the relation editor which refer to primitives in the current
      * selection of the context layer.
-     * 
+     *
      */
     class SelectedMembersForSelectionAction extends AbstractAction implements TableModelListener {
@@ -967,5 +966,5 @@
      * Selects primitives in the layer this editor belongs to. The selected primitives are
      * equal to the set of primitives the currently selected relation members refer to.
-     * 
+     *
      */
     class SelectPrimitivesForSelectedMembersAction extends AbstractAction implements ListSelectionListener {
@@ -1480,5 +1479,5 @@
             Collection<OsmPrimitive> selection = getLayer().data.getSelected();
             for (RelationMember member: r.getMembers()) {
-                if (selection.contains(member.member)) {
+                if (selection.contains(member.getMember())) {
                     members.add(member);
                 }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 1936)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 1937)
@@ -89,5 +89,5 @@
                 return members.get(rowIndex).getRole();
             case 1:
-                return members.get(rowIndex).member;
+                return members.get(rowIndex).getMember();
             case 2:
                 return linked(rowIndex);
@@ -109,5 +109,5 @@
 
     public OsmPrimitive getReferredPrimitive(int idx) {
-        return members.get(idx).member;
+        return members.get(idx).getMember();
     }
 
@@ -198,8 +198,8 @@
     public void updateMemberReferences(DataSet ds) {
         for (RelationMember member : members) {
-            if (member.member.id == 0) {
+            if (member.getMember().id == 0) {
                 continue;
             }
-            OsmPrimitive primitive = ds.getPrimitiveById(member.member.id);
+            OsmPrimitive primitive = ds.getPrimitiveById(member.getMember().id);
             if (primitive != null) {
                 member.member = primitive;
@@ -215,5 +215,5 @@
         while (it.hasNext()) {
             RelationMember member = it.next();
-            if (primitives.contains(member.member)) {
+            if (primitives.contains(member.getMember())) {
                 it.remove();
             }
@@ -240,5 +240,5 @@
     public boolean hasIncompleteMembers() {
         for (RelationMember member : members) {
-            if (member.member.incomplete)
+            if (member.getMember().incomplete)
                 return true;
         }
@@ -333,5 +333,5 @@
         int count = 0;
         for (RelationMember member : members) {
-            if (member.member.equals(primitive)) {
+            if (member.getMember().equals(primitive)) {
                 count++;
             }
@@ -379,5 +379,5 @@
         HashSet<OsmPrimitive> ret = new HashSet<OsmPrimitive>();
         for (RelationMember m: getSelectedMembers()) {
-            ret.add(m.member);
+            ret.add(m.getMember());
         }
         return ret;
@@ -393,6 +393,6 @@
         if (referenceSet == null) return null;
         for (RelationMember m: members) {
-            if (referenceSet.contains(m.member)) {
-                ret.add(m.member);
+            if (referenceSet.contains(m.getMember())) {
+                ret.add(m.getMember());
             }
         }
@@ -466,7 +466,7 @@
             return false;
         RelationMember member = members.get(index);
-        if (!(member.member instanceof Relation))
+        if (!member.isRelation())
             return false;
-        Relation r = (Relation) member.member;
+        Relation r = member.getRelation();
         return !r.incomplete;
     }
@@ -486,5 +486,5 @@
         HashSet<OsmPrimitive> referrers = new HashSet<OsmPrimitive>();
         for(RelationMember member : members) {
-            referrers.add(member.member);
+            referrers.add(member.getMember());
         }
         Iterator<OsmPrimitive> it = primitives.iterator();
@@ -509,5 +509,5 @@
         for (int i=0; i< members.size();i++) {
             RelationMember m = members.get(i);
-            if (primitives.contains(m.member)) {
+            if (primitives.contains(m.getMember())) {
                 this.getSelectionModel().addSelectionInterval(i,i);
             }
@@ -541,8 +541,8 @@
         Node    result = null;
 
-        if (element.member instanceof Way) {
-            Way w = (Way) element.member;
-            if (linked_element.member instanceof Way) {
-                Way x = (Way) linked_element.member;
+        if (element.isWay()) {
+            Way w = element.getWay();
+            if (linked_element.isWay()) {
+                Way x = linked_element.getWay();
                 if ((w.firstNode() == x.firstNode()) || (w.firstNode() == x.lastNode())) {
                     result = w.lastNode();
@@ -550,6 +550,6 @@
                     result = w.firstNode();
                 }
-            } else if (linked_element.member instanceof Node) {
-                Node m = (Node) linked_element.member;
+            } else if (linked_element.isNode()) {
+                Node m = linked_element.getNode();
                 if (w.firstNode() == m) {
                     result = w.lastNode();
@@ -558,6 +558,6 @@
                 }
             }
-        } else if (element.member instanceof Node) {
-            Node n = (Node) element.member;
+        } else if (element.isNode()) {
+            Node n = element.getNode();
             result = n;
         }
@@ -609,6 +609,6 @@
                     // only one element in segment, so try to link against each linkable node of element
                     RelationMember m = members.get(segment.getFirst());
-                    if (m.member instanceof Way) {
-                        Way w = (Way) m.member;
+                    if (m.isWay()) {
+                        Way w = m.getWay();
                         endSearchNode = w.lastNode();
                         if (w.lastNode() != w.firstNode())
@@ -616,6 +616,6 @@
                             startSearchNode = w.firstNode();
                         }
-                    } else if (m.member instanceof Node) {
-                        Node n = (Node) m.member;
+                    } else if (m.isNode()) {
+                        Node n = m.getNode();
                         endSearchNode = n;
                     }
@@ -687,9 +687,9 @@
         Way way2 = null;
 
-        if (m1.member instanceof Way) {
-            way1 = (Way) m1.member;
-        }
-        if (m2.member instanceof Way) {
-            way2 = (Way) m2.member;
+        if (m1.isWay()) {
+            way1 = m1.getWay();
+        }
+        if (m2.isWay()) {
+            way2 = m2.getWay();
         }
         if ((way1 != null) && (way2 != null)) {
