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 32232)
+++ applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/PTAssistantPlugin.java	(revision 32233)
@@ -9,8 +9,10 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.validation.OsmValidator;
+import org.openstreetmap.josm.data.validation.TestError;
 import org.openstreetmap.josm.plugins.Plugin;
 import org.openstreetmap.josm.plugins.PluginInformation;
 import org.openstreetmap.josm.plugins.pt_assistant.validation.DirectionTest;
 import org.openstreetmap.josm.plugins.pt_assistant.validation.GapTest;
+import org.openstreetmap.josm.plugins.pt_assistant.validation.PTAssitantValidatorTest;
 import org.openstreetmap.josm.plugins.pt_assistant.validation.PlatformsFirstTest;
 import org.openstreetmap.josm.plugins.pt_assistant.validation.RoadTypeTest;
@@ -34,8 +36,11 @@
 		super(info);
 
-		OsmValidator.addTest(PlatformsFirstTest.class);
-		OsmValidator.addTest(RoadTypeTest.class);
-		OsmValidator.addTest(DirectionTest.class);
-		OsmValidator.addTest(GapTest.class);
+//		OsmValidator.addTest(PlatformsFirstTest.class);
+//		OsmValidator.addTest(RoadTypeTest.class);
+//		OsmValidator.addTest(DirectionTest.class);
+//		OsmValidator.addTest(GapTest.class);
+		
+		OsmValidator.addTest(PTAssitantValidatorTest.class);
+		
 
 	}
Index: applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/IncompleteMembersDownloadThread.java
===================================================================
--- applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/IncompleteMembersDownloadThread.java	(revision 32233)
+++ applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/IncompleteMembersDownloadThread.java	(revision 32233)
@@ -0,0 +1,33 @@
+package org.openstreetmap.josm.plugins.pt_assistant.actions;
+
+import java.util.ArrayList;
+
+import org.openstreetmap.josm.actions.DownloadPrimitiveAction;
+import org.openstreetmap.josm.data.osm.PrimitiveId;
+import org.openstreetmap.josm.data.osm.Relation;
+
+public class IncompleteMembersDownloadThread extends Thread {
+
+	private Relation relation;
+
+	public IncompleteMembersDownloadThread(Relation r) {
+		super();
+		relation = r;
+	}
+
+	@Override
+	public void run() {
+
+			synchronized (this) {
+
+				ArrayList<PrimitiveId> list = new ArrayList<>();
+				list.add(relation);
+				DownloadPrimitiveAction.processItems(false, list, false, true);
+
+			
+				notify();
+
+			}
+
+	}
+}
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 32232)
+++ applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/utils/RouteUtils.java	(revision 32233)
@@ -10,4 +10,5 @@
 
 import org.openstreetmap.josm.actions.DownloadPrimitiveAction;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.PrimitiveId;
@@ -161,5 +162,7 @@
 					|| (rm.isRelation() && rm.getRelation().isIncomplete())) {
 				isComplete = false;
+				
 				break;
+				
 			}
 		}
@@ -193,7 +196,24 @@
 			// if the user does want to fetch:
 			if (userInput == 0 || askToFetch == ASK_TO_FETCH.DONT_ASK_AND_FETCH) {
-				List<PrimitiveId> list = new ArrayList<>(1);
-				list.add(r);
-				DownloadPrimitiveAction.processItems(false, list, false, true);
+//				List<PrimitiveId> list = new ArrayList<>(1);
+//				list.add(r);
+				List<PrimitiveId> list = new ArrayList<>();
+				for (OsmPrimitive primitive: r.getIncompleteMembers()) {
+					list.add(primitive);
+				}
+				
+				Thread t = new Thread (new IncompleteMembersDownloader(list));
+				t.run();
+				try {
+					t.join();
+				} catch (InterruptedException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+
+				
+				
+//				DownloadPrimitiveAction.processItems(false, list, false, true);
+				JOptionPane.showMessageDialog(null, "download expected to be finished");
 				isComplete = true;
 				lastRelationToFetch = r;
@@ -233,4 +253,7 @@
 //		return "don't ask and don't fetch";
 //	}
+	
 
 }
+
+
Index: applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/PTAssitantValidatorTest.java
===================================================================
--- applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/PTAssitantValidatorTest.java	(revision 32233)
+++ applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/PTAssitantValidatorTest.java	(revision 32233)
@@ -0,0 +1,125 @@
+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 javax.swing.JCheckBox;
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.OsmUtils;
+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.gui.dialogs.relation.sort.WayConnectionType;
+import org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionTypeCalculator;
+import org.openstreetmap.josm.plugins.pt_assistant.actions.IncompleteMembersDownloadThread;
+import org.openstreetmap.josm.plugins.pt_assistant.utils.RouteUtils;
+
+public class PTAssitantValidatorTest extends Test {
+
+	public static final int ERROR_CODE_DIRECTION = 3731;
+
+	public PTAssitantValidatorTest() {
+		 super(tr("Public Transport Assistant tests"),
+		 tr("Check if route relations are compatible with public transport version 2"));
+	}
+
+	@Override
+	public void visit(Relation r) {
+
+		if (!RouteUtils.isTwoDirectionRoute(r)) {
+			return;
+		}
+
+		if (r.hasIncompleteMembers()) {
+			 String message = tr("The relation (id=" + r.getId()
+			 + ") has incomplete members.\nThey need to be downloaded to proceed with validation of this relation.\nDo you want to download incomplete members?");
+			 JCheckBox checkbox = new JCheckBox(tr("Remember my choice and don't ask me again in this session"));
+			 Object[] params = { message, checkbox }; 
+			 String[] options = { tr("Yes"), tr("No") };
+			 int userInput = JOptionPane.showOptionDialog(null, params,
+			 tr("Fetch Request"), JOptionPane.YES_NO_OPTION,
+			 JOptionPane.QUESTION_MESSAGE, null, options, 0);
+
+			if (userInput == 0) {
+
+				Thread t = new IncompleteMembersDownloadThread(r);
+				t.start();
+				synchronized (t) {
+					try {
+						t.wait();
+					} catch (InterruptedException e) {
+						return;
+					}
+				}
+
+
+			}
+
+		}
+
+		List<RelationMember> waysToCheck = new ArrayList<>();
+
+		for (RelationMember rm : r.getMembers()) {
+			if (RouteUtils.isPTWay(rm) && rm.getType().equals(OsmPrimitiveType.WAY)) {
+				waysToCheck.add(rm);
+			}
+		}
+
+		if (waysToCheck.isEmpty()) {
+			return;
+		}
+
+		WayConnectionTypeCalculator connectionTypeCalculator = new WayConnectionTypeCalculator();
+		final List<WayConnectionType> links = connectionTypeCalculator.updateLinks(waysToCheck);
+
+		for (int i = 0; i < links.size(); i++) {
+			if ((OsmUtils.isTrue(waysToCheck.get(i).getWay().get("oneway"))
+					&& links.get(i).direction.equals(WayConnectionType.Direction.BACKWARD))
+					|| (OsmUtils.isReversed(waysToCheck.get(i).getWay().get("oneway"))
+							&& links.get(i).direction.equals(WayConnectionType.Direction.FORWARD))) {
+
+				// At this point, the PTWay is going against the oneway
+				// direction. Check if this road allows buses to disregard
+				// the oneway restriction:
+
+				if (!waysToCheck.get(i).getWay().hasTag("busway", "lane")
+						&& !waysToCheck.get(i).getWay().hasTag("oneway:bus", "no")
+						&& !waysToCheck.get(i).getWay().hasTag("busway", "opposite_lane")
+						&& !waysToCheck.get(i).getWay().hasTag("oneway:psv", "no")
+						&& !waysToCheck.get(i).getWay().hasTag("trolley_wire", "backward")) {
+					List<Relation> primitives = new ArrayList<>(1);
+					primitives.add(r);
+					List<Way> highlighted = new ArrayList<>(1);
+					highlighted.add(waysToCheck.get(i).getWay());
+					errors.add(new TestError(this, Severity.WARNING,
+							tr("PT: Route passes a oneway road in wrong direction"), ERROR_CODE_DIRECTION, primitives,
+							highlighted));
+					return;
+				}
+
+			}
+		}
+	}
+
+	/**
+	 * Checks if the test error is fixable
+	 */
+	@Override
+	public boolean isFixable(TestError testError) {
+		return false;
+	}
+
+	@Override
+	public Command fixError(TestError testError) {
+		return null;
+	}
+
+}
