Index: /trunk/src/org/openstreetmap/josm/data/osm/IRelationMember.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/IRelationMember.java	(revision 13677)
+++ /trunk/src/org/openstreetmap/josm/data/osm/IRelationMember.java	(revision 13677)
@@ -0,0 +1,52 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm;
+
+import java.util.Arrays;
+
+/**
+ * IRelationMember captures the common functions of {@link RelationMember} and {@link RelationMemberData}.
+ * @since 13677
+ */
+public interface IRelationMember extends PrimitiveId {
+
+    /**
+     * Returns the role of this relation member.
+     * @return Role name or "". Never returns null
+     */
+    String getRole();
+
+    /**
+     * Determines if this relation member has a role.
+     * @return True if role is set
+     */
+    default boolean hasRole() {
+        return !"".equals(getRole());
+    }
+
+    /**
+     * Determines if this relation member's role is in the given list.
+     * @param roles The roles to look after
+     * @return True if role is in the given list
+     */
+    default boolean hasRole(String... roles) {
+        return Arrays.asList(roles).contains(getRole());
+    }
+
+    /**
+     * Determines if this relation member is a node.
+     * @return True if member is node
+     */
+    boolean isNode();
+
+    /**
+     * Determines if this relation member is a way.
+     * @return True if member is way
+     */
+    boolean isWay();
+
+    /**
+     * Determines if this relation member is a relation.
+     * @return True if member is relation
+     */
+    boolean isRelation();
+}
Index: /trunk/src/org/openstreetmap/josm/data/osm/RelationMember.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/RelationMember.java	(revision 13676)
+++ /trunk/src/org/openstreetmap/josm/data/osm/RelationMember.java	(revision 13677)
@@ -2,5 +2,4 @@
 package org.openstreetmap.josm.data.osm;
 
-import java.util.Arrays;
 import java.util.Objects;
 import java.util.Optional;
@@ -9,10 +8,9 @@
 
 /**
- * A linkage class that can be used by an relation to keep a list of
- * members. Since membership may be qualified by a "role", a simple
- * list is not sufficient.
- *
+ * A linkage class that can be used by an relation to keep a list of members.
+ * Since membership may be qualified by a "role", a simple list is not sufficient.
+ * @since 343
  */
-public class RelationMember implements PrimitiveId {
+public class RelationMember implements IRelationMember {
 
     /**
@@ -26,46 +24,15 @@
     private final OsmPrimitive member;
 
-    /**
-     * Returns the role of this relation member.
-     * @return Role name or "". Never returns null
-     * @since 1930
-     */
+    @Override
     public String getRole() {
         return role;
     }
 
-    /**
-     * Determines if this relation member has a role.
-     * @return True if role is set
-     * @since 1930
-     */
-    public boolean hasRole() {
-        return !"".equals(role);
-    }
-
-    /**
-     * Determines if this relation member's role is in the given list.
-     * @param roles The roles to look after
-     * @return True if role is in the given list
-     * @since 6305
-     */
-    public boolean hasRole(String... roles) {
-        return Arrays.asList(roles).contains(role);
-    }
-
-    /**
-     * Determines if this relation member is a relation.
-     * @return True if member is relation
-     * @since 1937
-     */
+    @Override
     public boolean isRelation() {
         return member instanceof Relation;
     }
 
-    /**
-     * Determines if this relation member is a way.
-     * @return True if member is way
-     * @since 1937
-     */
+    @Override
     public boolean isWay() {
         return member instanceof Way;
@@ -73,5 +40,5 @@
 
     /**
-     *
+     * Returns type of member for icon display.
      * @return type of member for icon display
      * @since 3844
@@ -81,9 +48,5 @@
     }
 
-    /**
-     * Determines if this relation member is a node.
-     * @return True if member is node
-     * @since 1937
-     */
+    @Override
     public boolean isNode() {
         return member instanceof Node;
@@ -186,5 +149,5 @@
 
     /**
-     * PrimitiveId implementation. Returns the same value as getMemberType().getUniqueId()
+     * PrimitiveId implementation. Returns the same value as getMember().getUniqueId()
      */
     @Override
@@ -193,4 +156,7 @@
     }
 
+    /**
+     * PrimitiveId implementation. Returns the same value as getMember().isNew()
+     */
     @Override
     public boolean isNew() {
Index: /trunk/src/org/openstreetmap/josm/data/osm/RelationMemberData.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/RelationMemberData.java	(revision 13676)
+++ /trunk/src/org/openstreetmap/josm/data/osm/RelationMemberData.java	(revision 13677)
@@ -9,6 +9,7 @@
 /**
  * This is the data (role, type and id) that is stored in the database for a given relation member.
+ * @since 2284
  */
-public class RelationMemberData implements PrimitiveId, Serializable {
+public class RelationMemberData implements IRelationMember, Serializable {
 
     private static final long serialVersionUID = 381392198209333319L;
@@ -49,8 +50,5 @@
     }
 
-    /**
-     * Get member role.
-     * @return member role
-     */
+    @Override
     public String getRole() {
         return role;
@@ -65,10 +63,17 @@
     }
 
-    /**
-     * Determines if this member has a role.
-     * @return {@code true} if this member has a role
-     */
-    public boolean hasRole() {
-        return !"".equals(role);
+    @Override
+    public boolean isNode() {
+        return OsmPrimitiveType.NODE == memberType;
+    }
+
+    @Override
+    public boolean isWay() {
+        return OsmPrimitiveType.WAY == memberType;
+    }
+
+    @Override
+    public boolean isRelation() {
+        return OsmPrimitiveType.RELATION == memberType;
     }
 
