Index: trunk/src/org/openstreetmap/josm/data/osm/PrimitiveData.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/PrimitiveData.java	(revision 2403)
+++ trunk/src/org/openstreetmap/josm/data/osm/PrimitiveData.java	(revision 2404)
@@ -40,5 +40,5 @@
     private final Map<String, String> keys = new HashMap<String, String>();
     private boolean modified;
-    private boolean visible;
+    private boolean visible = true;
     private boolean deleted;
     private long id;
Index: trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 2403)
+++ trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 2404)
@@ -3,8 +3,6 @@
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
@@ -160,64 +158,10 @@
         RelationData relationData = (RelationData) data;
 
-        // TODO Make this faster
-
-        Node nodeMarker = new Node();
-        Way wayMarker = new Way();
-        Relation relationMarker = new Relation();
-        Map<Long, Node> nodes = new HashMap<Long, Node>();
-        Map<Long, Way> ways = new HashMap<Long, Way>();
-        Map<Long, Relation> relations = new HashMap<Long, Relation>();
-
-        for (RelationMemberData member : relationData.getMembers()) {
-            switch (member.getMemberType()) {
-            case NODE:
-                nodes.put(member.getMemberId(), nodeMarker);
-                break;
-            case WAY:
-                ways.put(member.getMemberId(), wayMarker);
-                break;
-            case RELATION:
-                relations.put(member.getMemberId(), relationMarker);
-                break;
-            }
-        }
-
-        for (Node node : dataSet.getNodes()) {
-            if (nodes.get(node.getUniqueId()) == nodeMarker) {
-                nodes.put(node.getUniqueId(), node);
-            }
-        }
-        for (Way way : dataSet.getWays()) {
-            if (ways.get(way.getUniqueId()) == wayMarker) {
-                ways.put(way.getUniqueId(), way);
-            }
-        }
-        for (Relation relation : dataSet.getRelations()) {
-            if (relations.get(relation.getUniqueId()) == relationMarker) {
-                relations.put(relation.getUniqueId(), relation);
-            }
-        }
-
         List<RelationMember> newMembers = new ArrayList<RelationMember>();
         for (RelationMemberData member : relationData.getMembers()) {
-            OsmPrimitive foundMember = null;
-            switch (member.getMemberType()) {
-            case NODE:
-                foundMember = nodes.get(member.getMemberId());
-                if (foundMember == nodeMarker)
-                    throw new AssertionError("Data consistency problem - relation with missing member detected");
-                break;
-            case WAY:
-                foundMember = ways.get(member.getMemberId());
-                if (foundMember == wayMarker)
-                    throw new AssertionError("Data consistency problem - relation with missing member detected");
-                break;
-            case RELATION:
-                foundMember = relations.get(member.getMemberId());
-                if (foundMember == relationMarker)
-                    throw new AssertionError("Data consistency problem - relation with missing member detected");
-                break;
-            }
-            newMembers.add(new RelationMember(member.getRole(), foundMember));
+            OsmPrimitive primitive = dataSet.getPrimitiveById(member);
+            if (primitive == null)
+                throw new AssertionError("Data consistency problem - relation with missing member detected");
+            newMembers.add(new RelationMember(member.getRole(), primitive));
         }
         setMembers(newMembers);
Index: trunk/src/org/openstreetmap/josm/data/osm/RelationMemberData.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/RelationMemberData.java	(revision 2403)
+++ trunk/src/org/openstreetmap/josm/data/osm/RelationMemberData.java	(revision 2404)
@@ -9,11 +9,11 @@
 
     public RelationMemberData(String role, OsmPrimitiveType type, long id) {
-        this.role = role;
+        this.role = role == null?"":role;
         this.memberType = type;
         this.memberId = id;
     }
 
-    public RelationMemberData(String role, OsmPrimitive primitive) {
-        this(role, OsmPrimitiveType.from(primitive), primitive.getUniqueId());
+    public RelationMemberData(String role, PrimitiveId primitive) {
+        this(role, primitive.getType(), primitive.getUniqueId());
     }
 
@@ -26,4 +26,8 @@
     public OsmPrimitiveType getMemberType() {
         return memberType;
+    }
+
+    public boolean hasRole() {
+        return !"".equals(role);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 2403)
+++ trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 2404)
@@ -7,7 +7,5 @@
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 import org.openstreetmap.josm.data.osm.visitor.Visitor;
@@ -179,21 +177,9 @@
         WayData wayData = (WayData) data;
 
-        // TODO We should have some lookup by id mechanism in future to speed this up
-        Node marker = new Node(0);
-        Map<Long, Node> foundNodes = new HashMap<Long, Node>();
-        for (Long nodeId : wayData.getNodes()) {
-            foundNodes.put(nodeId, marker);
-        }
-        for (Node node : dataSet.getNodes()) {
-            if (foundNodes.get(node.getUniqueId()) == marker) {
-                foundNodes.put(node.getUniqueId(), node);
-            }
-        }
-
         List<Node> newNodes = new ArrayList<Node>(wayData.getNodes().size());
         for (Long nodeId : wayData.getNodes()) {
-            Node node = foundNodes.get(nodeId);
-            if (node != marker) {
-                newNodes.add(foundNodes.get(nodeId));
+            Node node = (Node)dataSet.getPrimitiveById(nodeId, OsmPrimitiveType.NODE);
+            if (node != null) {
+                newNodes.add(node);
             } else
                 throw new AssertionError("Data consistency problem - way with missing node detected");
