Index: applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/access/RulesetAccessEvaluator.java
===================================================================
--- applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/access/RulesetAccessEvaluator.java	(revision 19054)
+++ applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/access/RulesetAccessEvaluator.java	(revision 19216)
@@ -16,7 +16,7 @@
  * AccessEvaluator based on a single AccessRuleset
  */
-public class RulesetAccessEvaluator<N, W, R> implements AccessEvaluator<N, W> {
+public class RulesetAccessEvaluator<N, W, R, M> implements AccessEvaluator<N, W> {
 
-	private final DataSource<N, W, R> dataSource;
+	private final DataSource<N, W, R, M> dataSource;
 	private final AccessRuleset ruleset;
 	private final AccessParameters parameters;
@@ -28,5 +28,5 @@
 	 *                    and situation to evaluate access for; != null
 	 */
-	public RulesetAccessEvaluator(DataSource<N, W, R> dataSource, AccessRuleset ruleset, AccessParameters parameters) {
+	public RulesetAccessEvaluator(DataSource<N, W, R, M> dataSource, AccessRuleset ruleset, AccessParameters parameters) {
 		assert dataSource != null && ruleset != null && parameters != null;
 
Index: applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/data/DataSource.java
===================================================================
--- applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/data/DataSource.java	(revision 19054)
+++ applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/data/DataSource.java	(revision 19216)
@@ -8,13 +8,6 @@
  * @param <R>  relation type
  */
-public interface DataSource<N, W, R> {
-
-	public static interface RelationMember {
-		/** returns the member's role. != null */
-		public String getRole();
-		/** returns the member itself. Must be instance of N, W or R, != null */
-		public Object getMember();
-	}
-
+public interface DataSource<N, W, R, M> {
+	
 	/** returns all nodes */
 	public Iterable<N> getNodes();
@@ -36,5 +29,5 @@
 
 	/** returns a relation's members */
-	public Iterable<RelationMember> getMembers(R relation);
+	public Iterable<M> getMembers(R relation);
 
 	/** returns a node's tags */
@@ -47,4 +40,19 @@
 	public TagGroup getTagsR(R relation);
 
+	/** returns a relation member's role */
+	public String getRole(M member);
+
+	/** returns a relation member's member object */
+	public Object getMember(M member);
+	
+	/** returns whether a relation member is a node */
+	public boolean isNMember(M member);
+	
+	/** returns whether a relation member is a way */
+	public boolean isWMember(M member);
+	
+	/** returns whether a relation member is a relation */
+	public boolean isRMember(M member);
+	
 	/**
 	 * adds an observer.
Index: applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/data/DataSourceObserver.java
===================================================================
--- applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/data/DataSourceObserver.java	(revision 19054)
+++ applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/data/DataSourceObserver.java	(revision 19216)
@@ -12,5 +12,5 @@
 	 * @param dataSource  observed data source that has changed; != null
 	 */
-	public void update(DataSource<?, ?, ?> dataSource);
+	public void update(DataSource<?, ?, ?, ?> dataSource);
 
 }
Index: applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/property/RoadIncline.java
===================================================================
--- applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/property/RoadIncline.java	(revision 19054)
+++ applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/property/RoadIncline.java	(revision 19216)
@@ -8,11 +8,11 @@
 public class RoadIncline implements RoadPropertyType<Float> {
 
-	public <N, W, R> Float evaluateN(N node, AccessParameters accessParameters,
-			DataSource<N,W,R> dataSource) {
+	public <N, W, R, M> Float evaluateN(N node, AccessParameters accessParameters,
+			DataSource<N,W,R,M> dataSource) {
 		return null;
 	};
 
-	public <N, W, R> Float evaluateW(W way, boolean forward, AccessParameters accessParameters,
-			DataSource<N,W,R> dataSource) {
+	public <N, W, R, M> Float evaluateW(W way, boolean forward, AccessParameters accessParameters,
+			DataSource<N,W,R,M> dataSource) {
 		assert way != null && accessParameters != null && dataSource != null;
 
Index: applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/property/RoadMaxspeed.java
===================================================================
--- applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/property/RoadMaxspeed.java	(revision 19054)
+++ applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/property/RoadMaxspeed.java	(revision 19216)
@@ -8,5 +8,5 @@
 public class RoadMaxspeed implements RoadPropertyType<Float> {
 
-	private DataSource<?, ?, ?> lastDataSource;
+	private DataSource<?, ?, ?, ?> lastDataSource;
 
 	/**
@@ -14,5 +14,5 @@
 	 * since last call to {@link #evaluate(Object, boolean, AccessParameters, DataSource)}
 	 */
-	private <N, W, R> void initializeIfNecessary(DataSource<N, W, R> dataSource) {
+	private <N, W, R, M> void initializeIfNecessary(DataSource<N, W, R, M> dataSource) {
 
 		if (dataSource != lastDataSource) {
@@ -30,6 +30,6 @@
 	}
 
-	public <N, W, R> Float evaluateN(N node, AccessParameters accessParameters,
-			DataSource<N, W, R> dataSource) {
+	public <N, W, R, M> Float evaluateN(N node, AccessParameters accessParameters,
+			DataSource<N, W, R, M> dataSource) {
 		assert node != null && accessParameters != null && dataSource != null;
 
@@ -39,6 +39,6 @@
 	}
 
-	public <N, W, R> Float evaluateW(W way, boolean forward, AccessParameters accessParameters,
-			DataSource<N, W, R> dataSource) {
+	public <N, W, R, M> Float evaluateW(W way, boolean forward, AccessParameters accessParameters,
+			DataSource<N, W, R, M> dataSource) {
 		assert way != null && accessParameters != null && dataSource != null;
 
Index: applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/property/RoadPropertyType.java
===================================================================
--- applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/property/RoadPropertyType.java	(revision 19054)
+++ applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/property/RoadPropertyType.java	(revision 19216)
@@ -26,6 +26,6 @@
 	 *                          null if property cannot be determined / does not apply
 	 */
-	public <N, W, R> V evaluateW(W way, boolean forward,
-			AccessParameters accessParameters, DataSource<N, W, R> dataSource);
+	public <N, W, R, M> V evaluateW(W way, boolean forward,
+			AccessParameters accessParameters, DataSource<N, W, R, M> dataSource);
 
 	/**
@@ -39,6 +39,6 @@
 	 *                          null if property cannot be determined / does not apply
 	 */
-	public <N, W, R> V evaluateN(N node,
-			AccessParameters accessParameters, DataSource<N, W, R> dataSource);
+	public <N, W, R, M> V evaluateN(N node,
+			AccessParameters accessParameters, DataSource<N, W, R, M> dataSource);
 
 	/**
Index: applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/property/RoadSurface.java
===================================================================
--- applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/property/RoadSurface.java	(revision 19054)
+++ applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/property/RoadSurface.java	(revision 19216)
@@ -9,11 +9,11 @@
 public class RoadSurface implements RoadPropertyType<String> {
 
-	public <N, W, R> String evaluateN(N node, AccessParameters accessParameters,
-			DataSource<N,W,R> dataSource) {
+	public <N, W, R, M> String evaluateN(N node, AccessParameters accessParameters,
+			DataSource<N,W,R,M> dataSource) {
 		return null;
 	};
 
-	public <N, W, R> String evaluateW(W way, boolean forward, AccessParameters accessParameters,
-			DataSource<N,W,R> dataSource) {
+	public <N, W, R, M> String evaluateW(W way, boolean forward, AccessParameters accessParameters,
+			DataSource<N,W,R,M> dataSource) {
 		assert way != null && accessParameters != null && dataSource != null;
 
Index: applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/property/RoadTracktype.java
===================================================================
--- applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/property/RoadTracktype.java	(revision 19054)
+++ applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/property/RoadTracktype.java	(revision 19216)
@@ -7,11 +7,11 @@
 public class RoadTracktype implements RoadPropertyType<Integer> {
 
-	public <N, W, R> Integer evaluateN(N node, AccessParameters accessParameters,
-			DataSource<N,W,R> dataSource) {
+	public <N, W, R, M> Integer evaluateN(N node, AccessParameters accessParameters,
+			DataSource<N,W,R,M> dataSource) {
 		return null;
 	};
 
-	public <N, W, R> Integer evaluateW(W way, boolean forward, AccessParameters accessParameters,
-			DataSource<N,W,R> dataSource) {
+	public <N, W, R, M> Integer evaluateW(W way, boolean forward, AccessParameters accessParameters,
+			DataSource<N,W,R,M> dataSource) {
 		assert way != null && accessParameters != null && dataSource != null;
 
Index: applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/property/RoadValueLimit.java
===================================================================
--- applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/property/RoadValueLimit.java	(revision 19054)
+++ applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/property/RoadValueLimit.java	(revision 19216)
@@ -34,12 +34,12 @@
 	}
 
-	public <N, W, R> Float evaluateW(W way, boolean forward,
-			AccessParameters accessParameters, DataSource<N, W, R> dataSource) {
+	public <N, W, R, M> Float evaluateW(W way, boolean forward,
+			AccessParameters accessParameters, DataSource<N, W, R, M> dataSource) {
 		assert way != null && accessParameters != null && dataSource != null;
 		return evaluateTags(dataSource.getTagsW(way));
 	}
 
-	public <N, W, R> Float evaluateN(N node,
-			AccessParameters accessParameters, DataSource<N, W, R> dataSource) {
+	public <N, W, R, M> Float evaluateN(N node,
+			AccessParameters accessParameters, DataSource<N, W, R, M> dataSource) {
 		assert node != null && accessParameters != null && dataSource != null;
 		return evaluateTags(dataSource.getTagsN(node));
Index: applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/transition/GenericTransitionStructure.java
===================================================================
--- applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/transition/GenericTransitionStructure.java	(revision 19054)
+++ applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/core/transition/GenericTransitionStructure.java	(revision 19216)
@@ -28,5 +28,5 @@
  * @param <R>  relation type
  */
-public class GenericTransitionStructure<N, W, R> implements TransitionStructure, DataSourceObserver {
+public class GenericTransitionStructure<N, W, R, M> implements TransitionStructure, DataSourceObserver {
 
 	private static final Collection<Segment> EMPTY_SEGMENT_LIST =
@@ -148,13 +148,9 @@
 	}
 
-	private final Class<N> nodeClass;
-	private final Class<W> wayClass;
-	private final Class<R> relationClass;
-
 	private final Set<TransitionStructureObserver> observers = new HashSet<TransitionStructureObserver>();
 
 	private final Collection<RoadPropertyType<?>> properties;
 
-	private final DataSource<N, W, R> dataSource;
+	private final DataSource<N, W, R, M> dataSource;
 
 	private AccessParameters accessParameters;
@@ -168,17 +164,11 @@
 
 	public GenericTransitionStructure(
-			Class<N> nodeClass, Class<W> wayClass, Class<R> relationClass,
 			AccessParameters accessParameters, AccessRuleset ruleset,
-			DataSource<N, W, R> dataSource,
+			DataSource<N, W, R, M> dataSource,
 			Collection<RoadPropertyType<?>> properties) {
 
-		assert nodeClass != null && wayClass != null && relationClass != null;
 		assert accessParameters != null && ruleset != null;
 		assert dataSource != null;
 		assert properties != null;
-
-		this.nodeClass = nodeClass;
-		this.wayClass = wayClass;
-		this.relationClass = relationClass;
 
 		this.dataSource = dataSource;
@@ -211,5 +201,5 @@
 			assert dataSource != null;
 
-			accessEvaluator = new RulesetAccessEvaluator<N, W, R>(
+			accessEvaluator = new RulesetAccessEvaluator<N, W, R, M>(
 					dataSource,
 					this.ruleset,
@@ -411,6 +401,4 @@
 			Map<W, List<Segment>> waySegmentMap) {
 
-		assert relationClass.isInstance(relation);
-
 		/* collect information about the relation */
 
@@ -420,25 +408,25 @@
 		Collection<W> toWays = new LinkedList<W>();
 
-		for (DataSource.RelationMember member : dataSource.getMembers(relation)) {
-
-			if ("from".equals(member.getRole())) {
-				if (fromWay != null || !wayClass.isInstance(member.getMember())) {
+		for (M member : dataSource.getMembers(relation)) {
+
+			if ("from".equals(dataSource.getRole(member))) {
+				if (fromWay != null || !dataSource.isWMember(member)) {
 					//broken restriction
 					return EMPTY_RESTRICTION_COLLECTION;
 				} else {
-					fromWay = (W)member.getMember();
-				}
-			} else if ("to".equals(member.getRole())) {
-				if (!wayClass.isInstance(member.getMember())) {
+					fromWay = (W)dataSource.getMember(member);
+				}
+			} else if ("to".equals(dataSource.getRole(member))) {
+				if (!dataSource.isWMember(member)) {
 					//broken restriction
 					return EMPTY_RESTRICTION_COLLECTION;
 				} else {
-					toWays.add((W)member.getMember());
-				}
-			} else if ("via".equals(member.getRole())) {
-				if (wayClass.isInstance(member.getMember())) {
-					viaWays.add((W)member.getMember());
-				} else if (nodeClass.isInstance(member.getMember())) {
-					viaNodes.add((N)member.getMember());
+					toWays.add((W)dataSource.getMember(member));
+				}
+			} else if ("via".equals(dataSource.getRole(member))) {
+				if (dataSource.isWMember(member)) {
+					viaWays.add((W)dataSource.getMember(member));
+				} else if (dataSource.isNMember(member)) {
+					viaNodes.add((N)dataSource.getMember(member));
 				}
 			}
@@ -683,5 +671,5 @@
 	}
 
-	public void update(DataSource<?, ?, ?> dataSource) {
+	public void update(DataSource<?, ?, ?, ?> dataSource) {
 		assert this.dataSource == dataSource;
 		updateData();
Index: applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/plugin/data/JOSMDataSource.java
===================================================================
--- applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/plugin/data/JOSMDataSource.java	(revision 19054)
+++ applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/plugin/data/JOSMDataSource.java	(revision 19216)
@@ -1,9 +1,7 @@
 package org.openstreetmap.josm.plugins.graphview.plugin.data;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
@@ -14,4 +12,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.plugins.graphview.core.data.DataSource;
@@ -25,5 +24,5 @@
  */
 
-public class JOSMDataSource implements DataSource<Node, Way, Relation> {
+public class JOSMDataSource implements DataSource<Node, Way, Relation, RelationMember> {
 
 	public double getLat(Node node) {
@@ -36,11 +35,5 @@
 
 	public Iterable<RelationMember> getMembers(Relation relation) {
-		List<RelationMember> members = new ArrayList<RelationMember>(relation.getMembersCount());
-		for (org.openstreetmap.josm.data.osm.RelationMember member : relation.getMembers()) {
-			if (!member.getMember().isDeleted() && !member.getMember().isIncomplete()) {
-				members.add(new RelationMemberImpl(member));
-			}
-		}
-		return members;
+		return relation.getMembers();
 	}
 
@@ -80,4 +73,25 @@
 		}
 	}
+	
+	public Object getMember(RelationMember member) {
+		return member.getMember();
+	}
+	
+	public String getRole(RelationMember member) {
+		return member.getRole();
+	}
+	
+	public boolean isNMember(RelationMember member) {
+		return member.getMember() instanceof Node;
+	}
+	
+	public boolean isWMember(RelationMember member) {
+		return member.getMember() instanceof Way;
+	}
+	
+	public boolean isRMember(RelationMember member) {
+		return member.getMember() instanceof Relation;
+	}
+	
 
 	private static final TagGroup EMPTY_TAG_GROUP;
@@ -175,5 +189,5 @@
 	}
 
-	public static class RelationMemberImpl implements RelationMember {
+	static class RelationMemberImpl {
 		private final String role;
 		private final Object member;
Index: applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/plugin/data/JOSMTransitionStructure.java
===================================================================
--- applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/plugin/data/JOSMTransitionStructure.java	(revision 19054)
+++ applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/plugin/data/JOSMTransitionStructure.java	(revision 19216)
@@ -5,4 +5,5 @@
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.plugins.graphview.core.access.AccessParameters;
@@ -14,5 +15,5 @@
  * transition structure that retrieves data from a {@link JOSMDataSource}
  */
-public class JOSMTransitionStructure extends GenericTransitionStructure<Node, Way, Relation> {
+public class JOSMTransitionStructure extends GenericTransitionStructure<Node, Way, Relation, RelationMember> {
 
 	private static final JOSMDataSource DATA_SOURCE = new JOSMDataSource();
@@ -21,6 +22,5 @@
 			Collection<RoadPropertyType<?>> properties) {
 
-		super(Node.class, Way.class, Relation.class,
-				accessParameters, ruleset,
+		super(accessParameters, ruleset,
 				DATA_SOURCE,
 				properties);
