Index: applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/PTAssistantPlugin.java
===================================================================
--- applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/PTAssistantPlugin.java	(revision 32219)
+++ applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/PTAssistantPlugin.java	(revision 32221)
@@ -7,4 +7,5 @@
 import org.openstreetmap.josm.plugins.pt_assistant.validation.GapTest;
 import org.openstreetmap.josm.plugins.pt_assistant.validation.PlatformsFirstTest;
+import org.openstreetmap.josm.plugins.pt_assistant.validation.RoadTypeTest;
 
 /**
@@ -27,4 +28,5 @@
 
 		OsmValidator.addTest(PlatformsFirstTest.class);
+		OsmValidator.addTest(RoadTypeTest.class);
 		OsmValidator.addTest(GapTest.class);
 
Index: applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/utils/RouteUtils.java
===================================================================
--- applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/utils/RouteUtils.java	(revision 32219)
+++ applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/utils/RouteUtils.java	(revision 32221)
@@ -58,6 +58,8 @@
 	 * can be modeled with ways.
 	 * 
-	 * @param rm relation member to be checked
-	 * @return true if the relation member refers to a way in a public transport route, false otherwise.
+	 * @param rm
+	 *            relation member to be checked
+	 * @return true if the relation member refers to a way in a public transport
+	 *         route, false otherwise.
 	 */
 	public static boolean isPTWay(RelationMember rm) {
@@ -74,3 +76,28 @@
 	}
 
+	/**
+	 * Checks if the type of the way is suitable for buses to go on it. The
+	 * direction of the way (i.e. one-way roads) is irrelevant for this test.
+	 * 
+	 * @param way
+	 *            to be checked
+	 * @return true if the way is suitable for buses, false otherwise.
+	 */
+	public static boolean isWaySuitableForBuses(Way way) {
+		if (way.hasTag("highway", "motorway") || way.hasTag("highway", "trunk") || way.hasTag("highway", "primary")
+				|| way.hasTag("highway", "secondary") || way.hasTag("highway", "tertiary")
+				|| way.hasTag("highway", "unclassified") || way.hasTag("highway", "road")
+				|| way.hasTag("highway", "residential") || way.hasTag("highway", "service")
+				|| way.hasTag("highway", "motorway_link") || way.hasTag("highway", "trunk_link")
+				|| way.hasTag("highway", "primary_link") || way.hasTag("highway", "secondary_link")
+				|| way.hasTag("highway", "tertiary_link") || way.hasTag("highway", "living_street")
+				|| way.hasTag("highway", "bus_guideway") || way.hasTag("highway", "road")
+				|| way.hasTag("cycleway", "share_busway") || way.hasTag("cycleway", "shared_lane")) {
+			return true;
+		}
+
+		return false;
+	}
+
+
 }
Index: applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/GapTest.java
===================================================================
--- applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/GapTest.java	(revision 32219)
+++ applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/GapTest.java	(revision 32221)
@@ -177,5 +177,5 @@
 					final List<RelationMember> ways = new ArrayList<>();
 					for (RelationMember member : members) {
-						if (member.hasRole("") && OsmPrimitiveType.WAY.equals(member.getType())) {
+						if (member.hasRole("") && OsmPrimitiveType.WAY.equals(member.getType())) { // FIXME
 							ways.add(member);
 						} else { // stops (and if the relation has anything
Index: applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/RoadTypeTest.java
===================================================================
--- applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/RoadTypeTest.java	(revision 32221)
+++ applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/RoadTypeTest.java	(revision 32221)
@@ -0,0 +1,145 @@
+package org.openstreetmap.josm.plugins.pt_assistant.validation;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.SequenceCommand;
+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.data.validation.Severity;
+import org.openstreetmap.josm.data.validation.Test;
+import org.openstreetmap.josm.data.validation.TestError;
+import org.openstreetmap.josm.plugins.pt_assistant.utils.RouteUtils;
+
+public class RoadTypeTest extends Test {
+
+	public static final int ERROR_CODE_ROAD_TYPE = 3721;
+
+	public RoadTypeTest() {
+		super(tr("Road Type Test"),
+				tr("Checks if the course of the route relation is compatible with the type of the road it passes on."));
+	}
+
+	@Override
+	public void visit(Relation r) {
+
+		if (RouteUtils.isTwoDirectionRoute(r)) {
+
+			List<RelationMember> members = r.getMembers();
+
+			for (RelationMember rm : members) {
+				if (RouteUtils.isPTWay(rm)) {
+
+					Way way = rm.getWay();
+					// at this point, the relation has already been checked to
+					// be a route of public_transport:version 2
+					boolean isCorrectRoadType = true;
+					if (r.hasTag("route", "bus") || r.hasTag("route", "share_taxi")) {
+						if (!RouteUtils.isWaySuitableForBuses(way)) {
+							isCorrectRoadType = false;
+						}
+					} else if (r.hasTag("route", "trolleybus")) {
+						if (!(RouteUtils.isWaySuitableForBuses(way) && way.hasTag("trolley_wire", "yes"))) {
+							isCorrectRoadType = false;
+						}
+					} else if (r.hasTag("route", "tram")) {
+						if (!r.hasTag("railway", "tram")) {
+							isCorrectRoadType = false;
+						}
+					} else if (r.hasTag("route", "subway")) {
+						if (!r.hasTag("railway", "subway")) {
+							isCorrectRoadType = false;
+						}
+					} else if (r.hasTag("route", "light_rail")) {
+						if (!r.hasTag("raiilway", "subway")) {
+							isCorrectRoadType = false;
+						}
+					} else if (r.hasTag("route", "light_rail")) {
+						if (!r.hasTag("railway", "light_rail")) {
+							isCorrectRoadType = false;
+						}
+					} else if (r.hasTag("route", "train")) {
+						if (!r.hasTag("railway", "train")) {
+							isCorrectRoadType = false;
+						}
+					}
+
+					if (!isCorrectRoadType) {
+						List<OsmPrimitive> primitiveList = new ArrayList<>(2);
+						primitiveList.add(0, r);
+						primitiveList.add(1, way);
+						
+						errors.add(new TestError(this, Severity.WARNING,
+								tr("PT: Route type does not match the type of the road it passes on"),
+								ERROR_CODE_ROAD_TYPE, primitiveList));
+					}
+
+				}
+			}
+		}
+	}
+
+	@Override
+	public Command fixError(TestError testError) {
+
+		List<Command> commands = new ArrayList<>(50);
+
+		if (testError.getTester().getClass().equals(GapTest.class) && testError.isFixable()) {
+			List<OsmPrimitive> primitiveList = (List<OsmPrimitive>) testError.getPrimitives();
+			Relation originalRelation = (Relation) primitiveList.get(0);
+			Way wayToRemove = (Way) primitiveList.get(1);
+			
+			Relation modifiedRelation = new Relation(originalRelation);
+			List<RelationMember> modifiedRelationMembers = new ArrayList<>(originalRelation.getMembersCount()-1);
+			
+			// copy stop-related members first, public transport ways last:
+			for (RelationMember rm: originalRelation.getMembers()) {
+				if (RouteUtils.isPTStop(rm)) {
+					modifiedRelationMembers.add(rm);
+				} 
+			}
+			
+			for (RelationMember rm: originalRelation.getMembers()) {
+				if (RouteUtils.isPTWay(rm)) {
+					Way wayToCheck = rm.getWay();
+					if (wayToCheck != wayToRemove) {
+						modifiedRelationMembers.add(rm);
+					}
+				}
+			}
+			
+			modifiedRelation.setMembers(modifiedRelationMembers);
+			
+			ChangeCommand changeCommand = new ChangeCommand(originalRelation, modifiedRelation);
+			commands.add(changeCommand);
+			
+		}
+		
+		if (commands.isEmpty()) {
+			return null;
+		}
+
+		if (commands.size() == 1) {
+			return commands.get(0);
+		}
+
+		return new SequenceCommand(tr("Remove way from route if it does not match the route type"), commands);	}
+
+	/**
+	 * Checks if the test error is fixable
+	 */
+	@Override
+	public boolean isFixable(TestError testError) {
+		if (testError.getCode() == ERROR_CODE_ROAD_TYPE) {
+			return true;
+		}
+		return false; 
+	}
+
+}
