Index: /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/gui/PTAssistantLayer.java
===================================================================
--- /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/gui/PTAssistantLayer.java	(revision 32783)
+++ /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/gui/PTAssistantLayer.java	(revision 32784)
@@ -50,5 +50,4 @@
 		Main.getLayerManager().addLayerChangeListener(this);
 		layer = this;
-
 	}
 	
@@ -74,5 +73,5 @@
 	
 	/**
-	 * Adds fix variants to be displayed in the pt_assistant layer
+	 * Adds the first 5 fix variants to be displayed in the pt_assistant layer
 	 * @param fixVariants
 	 */
@@ -81,15 +80,9 @@
 		for (int i = 0; i < fixVariants.size(); i++) {
 			if (i < 5) {
-				List<PTWay> fixVariant = fixVariants.get(0);
+				List<PTWay> fixVariant = fixVariants.get(i);
 				this.fixVariants.put(alphabet, fixVariant);
 				alphabet++;
 			}
 		}
-		
-//		for (List<PTWay> fixVariant: fixVariants) {
-//			
-//			this.fixVariants.put(alphabet, fixVariant);
-//			alphabet++;
-//		}
 	}
 	
Index: /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/gui/PTAssistantPaintVisitor.java
===================================================================
--- /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/gui/PTAssistantPaintVisitor.java	(revision 32783)
+++ /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/gui/PTAssistantPaintVisitor.java	(revision 32784)
@@ -405,5 +405,5 @@
 
 		int colorIndex = 0;
-		
+
 		double letterX = Main.map.mapView.getBounds().getMinX() + 20;
 		double letterY = Main.map.mapView.getBounds().getMinY() + 100;
@@ -412,11 +412,14 @@
 			if (fixVariants.get(c) != null) {
 				drawFixVariant(fixVariants.get(c), colors[colorIndex % 5]);
-				drawFixVariantLetter(fixVariants.get(c), c, colors[colorIndex%5], letterX, letterY);
+				drawFixVariantLetter(c.toString(), colors[colorIndex % 5], letterX, letterY);
 				colorIndex++;
 				letterY = letterY + 60;
 			}
 		}
-		
-		
+
+		// display the "Esc" label:
+		if (!fixVariants.isEmpty()) {
+			drawFixVariantLetter("Esc", Color.WHITE, letterX, letterY);
+		}
 	}
 
@@ -436,10 +439,36 @@
 	}
 	
-	private void drawFixVariantLetter(List<PTWay> fixVariant, Character letter, Color color, double letterX, double letterY) {
+	/**
+	 * 
+	 * @param n1
+	 * @param n2
+	 * @param color
+	 */
+	protected void drawSegmentWithParallelLines(Node n1, Node n2, Color color) {
+		if (!n1.isDrawable() || !n2.isDrawable() || !isSegmentVisible(n1, n2)) {
+				return;
+		}
+		
+		Point p1 = mv.getPoint(n1);
+		Point p2 = mv.getPoint(n2);
+
+		double t = Math.atan2((double) p2.x - p1.x, (double) p2.y - p1.y);
+		double cosT = 9 * Math.cos(t);
+		double sinT = 9 * Math.sin(t);
+
+		int[] xPoints = { (int) (p1.x + cosT), (int) (p2.x + cosT), (int) (p2.x - cosT), (int) (p1.x - cosT) };
+		int[] yPoints = { (int) (p1.y - sinT), (int) (p2.y - sinT), (int) (p2.y + sinT), (int) (p1.y + sinT) };
+		g.setColor(color);
+		g.fillPolygon(xPoints, yPoints, 4);
+		g.fillOval((int) (p1.x - 9), (int) (p1.y - 9), 18, 18);
+		g.fillOval((int) (p2.x - 9), (int) (p2.y - 9), 18, 18);
+	}
+
+	private void drawFixVariantLetter(String letter, Color color, double letterX, double letterY) {
 		g.setColor(color);
 		Font stringFont = new Font("SansSerif", Font.PLAIN, 50);
 		g.setFont(stringFont);
-		g.drawString(letter.toString(), (int) letterX, (int) letterY);
-		g.drawString(letter.toString(), (int) letterX, (int) letterY);
+		g.drawString(letter, (int) letterX, (int) letterY);
+		g.drawString(letter, (int) letterX, (int) letterY);
 	}
 
Index: /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/Checker.java
===================================================================
--- /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/Checker.java	(revision 32783)
+++ /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/Checker.java	(revision 32784)
@@ -2,11 +2,23 @@
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
+import javax.swing.SwingUtilities;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.AutoScaleAction;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.SelectCommand;
 import org.openstreetmap.josm.data.osm.Node;
+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.validation.Test;
 import org.openstreetmap.josm.data.validation.TestError;
+import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor;
+import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.plugins.pt_assistant.gui.PTAssistantLayer;
 import org.openstreetmap.josm.plugins.pt_assistant.utils.RouteUtils;
 
@@ -114,4 +126,79 @@
 		return resultList;
 	}
+	
+	/**
+	 * 
+	 * @param testError
+	 * @return
+	 */
+	protected static Command fixErrorByZooming(TestError testError) {
+
+		if (testError.getCode() != PTAssistantValidatorTest.ERROR_CODE_STOP_BY_STOP) {
+			return null;
+		}
+
+		Collection<? extends OsmPrimitive> primitives = testError.getPrimitives();
+		Relation originalRelation = (Relation) primitives.iterator().next();
+		ArrayList<OsmPrimitive> primitivesToZoom = new ArrayList<>();
+		for (Object primitiveToZoom : testError.getHighlighted()) {
+			primitivesToZoom.add((OsmPrimitive) primitiveToZoom);
+		}
+
+		SelectCommand command = new SelectCommand(primitivesToZoom);
+
+		List<OsmDataLayer> listOfLayers = Main.getLayerManager().getLayersOfType(OsmDataLayer.class);
+		for (OsmDataLayer osmDataLayer : listOfLayers) {
+			if (osmDataLayer.data == originalRelation.getDataSet()) {
+
+				final OsmDataLayer layerParameter = osmDataLayer;
+				final Relation relationParameter = originalRelation;
+				final Collection<OsmPrimitive> zoomParameter = primitivesToZoom;
+
+				if (SwingUtilities.isEventDispatchThread()) {
+
+					showRelationEditorAndZoom(layerParameter, relationParameter, zoomParameter);
+
+				} else {
+
+					SwingUtilities.invokeLater(new Runnable() {
+						@Override
+						public void run() {
+
+							showRelationEditorAndZoom(layerParameter, relationParameter, zoomParameter);
+
+						}
+					});
+
+				}
+
+				return command;
+			}
+		}
+
+		return null;
+
+	}
+
+	private static void showRelationEditorAndZoom(OsmDataLayer layer, Relation r, Collection<OsmPrimitive> primitives) {
+
+		// zoom to problem:
+		AutoScaleAction.zoomTo(primitives);
+
+		// put stop-related members to the front and edit roles if necessary:
+		List<RelationMember> sortedRelationMembers = listStopMembers(r);
+		sortedRelationMembers.addAll(listNotStopMembers(r));
+		r.setMembers(sortedRelationMembers);
+
+		// create editor:
+		GenericRelationEditor editor = (GenericRelationEditor) RelationEditor.getEditor(layer, r,
+				r.getMembersFor(primitives));
+
+		// open editor:
+		editor.setVisible(true);
+
+		// make the current relation purple in the pt_assistant layer:
+		PTAssistantLayer.getLayer().repaint(r);
+
+	}
 
 }
Index: /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/SegmentChecker.java
===================================================================
--- /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/SegmentChecker.java	(revision 32783)
+++ /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/SegmentChecker.java	(revision 32784)
@@ -3,5 +3,6 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.lang.reflect.InvocationTargetException;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -9,5 +10,4 @@
 import java.util.List;
 
-import javax.swing.JOptionPane;
 import javax.swing.SwingUtilities;
 
@@ -16,9 +16,7 @@
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.Command;
-import org.openstreetmap.josm.command.SelectCommand;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
@@ -27,7 +25,5 @@
 import org.openstreetmap.josm.data.validation.Test;
 import org.openstreetmap.josm.data.validation.TestError;
-import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor;
-import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.plugins.pt_assistant.data.PTRouteDataManager;
 import org.openstreetmap.josm.plugins.pt_assistant.data.PTRouteSegment;
@@ -35,5 +31,4 @@
 import org.openstreetmap.josm.plugins.pt_assistant.data.PTWay;
 import org.openstreetmap.josm.plugins.pt_assistant.gui.PTAssistantLayer;
-import org.openstreetmap.josm.plugins.pt_assistant.utils.RouteUtils;
 import org.openstreetmap.josm.plugins.pt_assistant.utils.StopToWayAssigner;
 
@@ -535,4 +530,5 @@
 
 	/**
+	 * Finds the next ways for the route stop-by-stop parsing procedure
 	 * 
 	 * @param way
@@ -693,4 +689,8 @@
 	protected static Command fixError(TestError testError) {
 
+		// if fix options for another route are displayed in the pt_assistant
+		// layer, clear them:
+		((PTAssistantValidatorTest) testError.getTester()).clearFixVariants();
+
 		PTRouteSegment wrongSegment = wrongSegments.get(testError);
 
@@ -706,192 +706,24 @@
 		if (!correctSegmentsForThisError.isEmpty()) {
 
-			List<PTWay> fix = null;
-
 			if (correctSegmentsForThisError.size() > 1) {
-				fix = displayCorrectSegmentVariants(correctSegmentsForThisError, testError);
-				if (fix == null) {
-					return null;
-				}
-			} else {
-				fix = correctSegmentsForThisError.get(0).getPTWays();
-				final Collection<OsmPrimitive> waysToZoom = new ArrayList<>();
-				for (Object highlightedPrimitive: testError.getHighlighted()) {
-					waysToZoom.add((OsmPrimitive)highlightedPrimitive);
-				}
-				if (SwingUtilities.isEventDispatchThread()) {
-					AutoScaleAction.zoomTo(waysToZoom);
-				} else {
-					SwingUtilities.invokeLater(new Runnable() {
-						@Override
-						public void run() {
-							AutoScaleAction.zoomTo(waysToZoom);
-						}
-					});
-				}
-				synchronized(SegmentChecker.class) {
-					try {
-						SegmentChecker.class.wait(2000);
-					} catch (InterruptedException e) {
-						// TODO Auto-generated catch block
-						e.printStackTrace();
-					}
-				}
-			}
-
-			Relation originalRelation = (Relation) testError.getPrimitives().iterator().next();
-			Relation modifiedRelation = new Relation(originalRelation);
-			List<RelationMember> originalRelationMembers = originalRelation.getMembers();
-			List<RelationMember> modifiedRelationMembers = new ArrayList<>();
-
-			// copy stops first:
-			for (RelationMember rm : originalRelationMembers) {
-				if (RouteUtils.isPTStop(rm)) {
-					if (rm.getRole().equals("stop_position")) {
-						if (rm.getType().equals(OsmPrimitiveType.NODE)) {
-							RelationMember newMember = new RelationMember("stop", rm.getNode());
-							modifiedRelationMembers.add(newMember);
-						} else { // if it is a way:
-							RelationMember newMember = new RelationMember("stop", rm.getWay());
-							modifiedRelationMembers.add(newMember);
-						}
-					} else {
-						// if the relation member does not have the role
-						// "stop_position":
-						modifiedRelationMembers.add(rm);
-					}
-				}
-			}
-
-			// copy PTWays next:
-			List<RelationMember> waysOfOriginalRelation = new ArrayList<>();
-			for (RelationMember rm : originalRelation.getMembers()) {
-				if (RouteUtils.isPTWay(rm)) {
-					waysOfOriginalRelation.add(rm);
-				}
-			}
-
-			for (int i = 0; i < waysOfOriginalRelation.size(); i++) {
-				if (waysOfOriginalRelation.get(i).getWay() == wrongSegment.getPTWays().get(0).getWays().get(0)) {
-					for (PTWay ptway : fix) {
-						if (ptway.getRole().equals("forward") || ptway.getRole().equals("backward")) {
-							modifiedRelationMembers.add(new RelationMember("", ptway.getMember()));
-						} else {
-							modifiedRelationMembers.add(ptway);
-						}
-					}
-					i = i + wrongSegment.getPTWays().size() - 1;
-				} else {
-					if (waysOfOriginalRelation.get(i).getRole().equals("forward")
-							|| waysOfOriginalRelation.get(i).getRole().equals("backward")) {
-						modifiedRelationMembers.add(new RelationMember("", waysOfOriginalRelation.get(i).getMember()));
-					} else {
-						modifiedRelationMembers.add(waysOfOriginalRelation.get(i));
-					}
-				}
-			}
-
-			modifiedRelation.setMembers(modifiedRelationMembers);
-			// TODO: change the data model too
-			wrongSegments.remove(testError);
-			ChangeCommand changeCommand = new ChangeCommand(originalRelation, modifiedRelation);
-			return changeCommand;
+				List<List<PTWay>> fixVariants = new ArrayList<>();
+				for (PTRouteSegment segment : correctSegmentsForThisError) {
+					fixVariants.add(segment.getPTWays());
+				}
+				displayFixVariants(fixVariants, testError);
+				return null;
+			}
+
+			return carryOutSingleFix(testError, correctSegmentsForThisError.get(0).getPTWays());
 
 		} else if (!wrongSegment.getFixVariants().isEmpty()) {
-
-			List<PTWay> fix = null;
-
+			// 2) try to fix using the sorting and removal of existing ways
+			// of the wrong segment:
 			if (wrongSegment.getFixVariants().size() > 1) {
-				fix = displayFixVariants(wrongSegment.getFixVariants(), testError);
-				if (fix == null) {
-					return null;
-				}
-			} else {
-				fix = wrongSegment.getFixVariants().get(0);
-				final Collection<OsmPrimitive> waysToZoom = new ArrayList<>();
-				for (Object highlightedPrimitive: testError.getHighlighted()) {
-					waysToZoom.add((OsmPrimitive)highlightedPrimitive);
-				}
-				if (SwingUtilities.isEventDispatchThread()) {
-					AutoScaleAction.zoomTo(waysToZoom);
-				} else {
-					SwingUtilities.invokeLater(new Runnable() {
-						@Override
-						public void run() {
-							AutoScaleAction.zoomTo(waysToZoom);
-						}
-					});
-				}
-				synchronized(SegmentChecker.class) {
-					try {
-						SegmentChecker.class.wait(2000);
-					} catch (InterruptedException e) {
-						// TODO Auto-generated catch block
-						e.printStackTrace();
-					}
-				}
-			}
-
-			// 2) try to fix by using the sort & remove method:
-			// TODO: ask user if the change should be undertaken
-			Relation originalRelation = (Relation) testError.getPrimitives().iterator().next();
-			Relation modifiedRelation = new Relation(originalRelation);
-			List<RelationMember> originalRelationMembers = originalRelation.getMembers();
-			List<RelationMember> modifiedRelationMembers = new ArrayList<>();
-
-			// copy stops first:
-			for (RelationMember rm : originalRelationMembers) {
-				if (RouteUtils.isPTStop(rm)) {
-					if (rm.getRole().equals("stop_position")) {
-						if (rm.getType().equals(OsmPrimitiveType.NODE)) {
-							RelationMember newMember = new RelationMember("stop", rm.getNode());
-							modifiedRelationMembers.add(newMember);
-						} else { // if it is a way:
-							RelationMember newMember = new RelationMember("stop", rm.getWay());
-							modifiedRelationMembers.add(newMember);
-						}
-					} else {
-						// if the relation member does not have the role
-						// "stop_position":
-						modifiedRelationMembers.add(rm);
-					}
-				}
-			}
-
-			// copy PTWays next:
-			List<RelationMember> waysOfOriginalRelation = new ArrayList<>();
-			for (RelationMember rm : originalRelation.getMembers()) {
-				if (RouteUtils.isPTWay(rm)) {
-					waysOfOriginalRelation.add(rm);
-				}
-			}
-
-			for (int i = 0; i < waysOfOriginalRelation.size(); i++) {
-				if (waysOfOriginalRelation.get(i).getWay() == wrongSegment.getPTWays().get(0).getWays().get(0)) {
-					for (PTWay ptway : fix) {
-						if (ptway.getRole().equals("forward") || ptway.getRole().equals("backward")) {
-							modifiedRelationMembers.add(new RelationMember("", ptway.getMember()));
-						} else {
-							modifiedRelationMembers.add(ptway);
-						}
-					}
-					i = i + wrongSegment.getPTWays().size() - 1;
-				} else {
-					if (waysOfOriginalRelation.get(i).getRole().equals("forward")
-							|| waysOfOriginalRelation.get(i).getRole().equals("backward")) {
-						modifiedRelationMembers.add(new RelationMember("", waysOfOriginalRelation.get(i).getMember()));
-					} else {
-						modifiedRelationMembers.add(waysOfOriginalRelation.get(i));
-					}
-				}
-			}
-
-			modifiedRelation.setMembers(modifiedRelationMembers);
-			// TODO: change the data model too
-			wrongSegments.remove(testError);
-			wrongSegment.setPTWays(wrongSegment.getFixVariants().get(0));
-			addCorrectSegment(wrongSegment);
-			ChangeCommand changeCommand = new ChangeCommand(originalRelation, modifiedRelation);
-			return changeCommand;
-
+				displayFixVariants(wrongSegment.getFixVariants(), testError);
+				return null;
+			}
+
+			return carryOutSingleFix(testError, wrongSegment.getFixVariants().get(0));
 		}
 
@@ -902,23 +734,14 @@
 
 	/**
-	 * 
-	 * @param segments
-	 */
-	private static List<PTWay> displayCorrectSegmentVariants(List<PTRouteSegment> segments, TestError testError) {
-		List<List<PTWay>> fixVariantList = new ArrayList<>();
-		for (PTRouteSegment segment : segments) {
-			fixVariantList.add(segment.getPTWays());
-		}
-		return displayFixVariants(fixVariantList, testError);
-	}
-
-	/**
+	 * This is largely a copy of the displayFixVariants() method, adapted for
+	 * use with the key listener
 	 * 
 	 * @param fixVariants
-	 */
-	private static List<PTWay> displayFixVariants(List<List<PTWay>> fixVariants, TestError testError) {
+	 * @param testError
+	 */
+	private static void displayFixVariants(List<List<PTWay>> fixVariants, TestError testError) {
 		// find the letters of the fix variants:
 		char alphabet = 'A';
-		List<Character> allowedCharacters = new ArrayList<>();
+		final List<Character> allowedCharacters = new ArrayList<>();
 		for (int i = 0; i < fixVariants.size(); i++) {
 			allowedCharacters.add(alphabet);
@@ -928,11 +751,6 @@
 		// zoom to problem:
 		final Collection<OsmPrimitive> waysToZoom = new ArrayList<>();
-//		for (List<PTWay> fix : fixVariants) {
-//			for (PTWay ptway : fix) {
-//				waysToZoom.addAll(ptway.getWays());
-//			}
-//		}
-		for (Object highlightedPrimitive: testError.getHighlighted()) {
-			waysToZoom.add((OsmPrimitive)highlightedPrimitive);
+		for (Object highlightedPrimitive : testError.getHighlighted()) {
+			waysToZoom.add((OsmPrimitive) highlightedPrimitive);
 		}
 		if (SwingUtilities.isEventDispatchThread()) {
@@ -948,135 +766,152 @@
 
 		// display the fix variants:
-		PTAssistantValidatorTest test = (PTAssistantValidatorTest) testError.getTester();
+		final PTAssistantValidatorTest test = (PTAssistantValidatorTest) testError.getTester();
 		test.addFixVariants(fixVariants);
 		PTAssistantLayer.getLayer().repaint((Relation) testError.getPrimitives().iterator().next());
 
-		// get user input:
-		Character userInput = getUserInput(allowedCharacters);
-		if (userInput == null) {
-			test.clearFixVariants();
-			return null;
-		}
-		List<PTWay> selectedFix = test.getFixVariant(userInput);
-		test.clearFixVariants();
-		return selectedFix;
-	}
-
-	/**
-	 * Asks user to choose the fix variant and returns the choice
-	 * 
-	 * @param allowedCharacters
-	 * @return
-	 */
-	private static Character getUserInput(List<Character> allowedCharacters) {
-		final String[] userInput = { "" };
-
-		while (userInput[0] == null || userInput[0].length() != 1 || userInput[0].equals("")
-				|| !allowedCharacters.contains(userInput[0].toUpperCase().toCharArray()[0])) {
-			if (SwingUtilities.isEventDispatchThread()) {
-
-				userInput[0] = JOptionPane.showInputDialog("Enter a letter to select the fix variant: ");
-
+		// prepare the variables for the key listener:
+		final TestError testErrorParameter = testError;
+
+		// add the key listener:
+		Main.map.mapView.requestFocus();
+		Main.map.mapView.addKeyListener(new KeyListener() {
+
+			@Override
+			public void keyTyped(KeyEvent e) {
+				// TODO Auto-generated method stub
+			}
+
+			@Override
+			public void keyPressed(KeyEvent e) {
+				Character typedKey = e.getKeyChar();
+				Character typedKeyUpperCase = typedKey.toString().toUpperCase().toCharArray()[0];
+				if (allowedCharacters.contains(typedKeyUpperCase)) {
+					Main.map.mapView.removeKeyListener(this);
+					List<PTWay> selectedFix = test.getFixVariant(typedKeyUpperCase);
+					test.clearFixVariants();
+					carryOutSelectedFix(testErrorParameter, selectedFix);
+				}
+				if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
+					Main.map.mapView.removeKeyListener(this);
+					test.clearFixVariants();
+				}
+			}
+
+			@Override
+			public void keyReleased(KeyEvent e) {
+				// TODO Auto-generated method stub
+			}
+		});
+
+		// display the notification:
+		if (SwingUtilities.isEventDispatchThread()) {
+			Notification notification = new Notification(
+					tr("Type letter to select the fix variant or press Escape for no fix"));
+			notification.show();
+		} else {
+			SwingUtilities.invokeLater(new Runnable() {
+				@Override
+				public void run() {
+					Notification notification = new Notification(
+							tr("Type letter to select the fix variant or press Escape for no fix"));
+					notification.show();
+				}
+			});
+		}
+	}
+
+	/**
+	 * Carries out the fix (i.e. modifies the route) after the user has picked
+	 * the fix from several fix variants.
+	 * 
+	 * @param testError
+	 *            test error to be fixed
+	 * @param fix
+	 *            the fix variant to be adopted
+	 */
+	private static void carryOutSelectedFix(TestError testError, List<PTWay> fix) {
+		Relation route = (Relation) testError.getPrimitives().iterator().next();
+		route.setMembers(getModifiedRelationMembers(testError, fix));
+		PTRouteSegment wrongSegment = wrongSegments.get(testError);
+		wrongSegments.remove(testError);
+		wrongSegment.setPTWays(wrongSegment.getFixVariants().get(0));
+		addCorrectSegment(wrongSegment);
+	}
+
+	/**
+	 * Carries out the fix (i.e. modifies the route) when there is only one fix
+	 * variant.
+	 * 
+	 * @param testError
+	 * @param fix
+	 */
+	private static Command carryOutSingleFix(TestError testError, List<PTWay> fix) {
+		// Zoom to the problematic ways:
+		final Collection<OsmPrimitive> waysToZoom = new ArrayList<>();
+		for (Object highlightedPrimitive : testError.getHighlighted()) {
+			waysToZoom.add((OsmPrimitive) highlightedPrimitive);
+		}
+		if (SwingUtilities.isEventDispatchThread()) {
+			AutoScaleAction.zoomTo(waysToZoom);
+		} else {
+			SwingUtilities.invokeLater(new Runnable() {
+				@Override
+				public void run() {
+					AutoScaleAction.zoomTo(waysToZoom);
+				}
+			});
+		}
+
+		// wait:
+		synchronized (SegmentChecker.class) {
+			try {
+				SegmentChecker.class.wait(1500);
+			} catch (InterruptedException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+		}
+
+		// modify the route:
+		Relation originalRelation = (Relation) testError.getPrimitives().iterator().next();
+		Relation modifiedRelation = new Relation(originalRelation);
+		modifiedRelation.setMembers(getModifiedRelationMembers(testError, fix));
+		wrongSegments.remove(testError);
+		return new ChangeCommand(originalRelation, modifiedRelation);
+
+	}
+
+	/**
+	 * Returns a list of the modified relation members. This list can be used by
+	 * the calling method (relation.setMemers()) to modify the modify the route
+	 * relation. The route relation is not modified by this method. The lists of
+	 * wrong and correct segments are not updated.
+	 * 
+	 * @param testError
+	 *            test error to be fixed
+	 * @param fix
+	 *            the fix variant to be adopted
+	 * @return List of modified relation members to be applied to the route
+	 *         relation
+	 */
+	private static List<RelationMember> getModifiedRelationMembers(TestError testError, List<PTWay> fix) {
+		PTRouteSegment wrongSegment = wrongSegments.get(testError);
+		Relation originalRelation = (Relation) testError.getPrimitives().iterator().next();
+
+		// copy stops first:
+		List<RelationMember> modifiedRelationMembers = listStopMembers(originalRelation);
+
+		// copy PTWays last:
+		List<RelationMember> waysOfOriginalRelation = listNotStopMembers(originalRelation);
+		for (int i = 0; i < waysOfOriginalRelation.size(); i++) {
+			if (waysOfOriginalRelation.get(i).getWay() == wrongSegment.getPTWays().get(0).getWays().get(0)) {
+				modifiedRelationMembers.addAll(fix);
+				i = i + wrongSegment.getPTWays().size() - 1;
 			} else {
-
-				try {
-					SwingUtilities.invokeAndWait(new Runnable() {
-						@Override
-						public void run() {
-
-							userInput[0] = JOptionPane.showInputDialog("Enter a letter to select the fix variant: ");
-
-						}
-					});
-				} catch (InvocationTargetException | InterruptedException e1) {
-					break;
-				}
-
-			}
-			if (userInput[0] == null) {
-				break;
-			}
-		}
-
-		if (userInput[0] == null) {
-			return null;
-		}
-		return userInput[0].toCharArray()[0];
-
-	}
-
-	/**
-	 * 
-	 * @param testError
-	 * @return
-	 */
-	protected static Command fixErrorByZooming(TestError testError) {
-
-		if (testError.getCode() != PTAssistantValidatorTest.ERROR_CODE_STOP_BY_STOP) {
-			return null;
-		}
-
-		Collection<? extends OsmPrimitive> primitives = testError.getPrimitives();
-		Relation originalRelation = (Relation) primitives.iterator().next();
-		ArrayList<OsmPrimitive> primitivesToZoom = new ArrayList<>();
-		for (Object primitiveToZoom : testError.getHighlighted()) {
-			primitivesToZoom.add((OsmPrimitive) primitiveToZoom);
-		}
-
-		SelectCommand command = new SelectCommand(primitivesToZoom);
-
-		List<OsmDataLayer> listOfLayers = Main.getLayerManager().getLayersOfType(OsmDataLayer.class);
-		for (OsmDataLayer osmDataLayer : listOfLayers) {
-			if (osmDataLayer.data == originalRelation.getDataSet()) {
-
-				final OsmDataLayer layerParameter = osmDataLayer;
-				final Relation relationParameter = originalRelation;
-				final Collection<OsmPrimitive> zoomParameter = primitivesToZoom;
-
-				if (SwingUtilities.isEventDispatchThread()) {
-
-					showRelationEditorAndZoom(layerParameter, relationParameter, zoomParameter);
-
-				} else {
-
-					SwingUtilities.invokeLater(new Runnable() {
-						@Override
-						public void run() {
-
-							showRelationEditorAndZoom(layerParameter, relationParameter, zoomParameter);
-
-						}
-					});
-
-				}
-
-				return command;
-			}
-		}
-
-		return null;
-
-	}
-
-	private static void showRelationEditorAndZoom(OsmDataLayer layer, Relation r, Collection<OsmPrimitive> primitives) {
-
-		// zoom to problem:
-		AutoScaleAction.zoomTo(primitives);
-
-		// put stop-related members to the front and edit roles if necessary:
-		List<RelationMember> sortedRelationMembers = listStopMembers(r);
-		sortedRelationMembers.addAll(listNotStopMembers(r));
-		r.setMembers(sortedRelationMembers);
-
-		// create editor:
-		GenericRelationEditor editor = (GenericRelationEditor) RelationEditor.getEditor(layer, r,
-				r.getMembersFor(primitives));
-
-		// open editor:
-		editor.setVisible(true);
-
-		// make the current relation purple in the pt_assistant layer:
-		PTAssistantLayer.getLayer().repaint(r);
-
+				modifiedRelationMembers.add(waysOfOriginalRelation.get(i));
+			}
+		}
+
+		return modifiedRelationMembers;
 	}
 
Index: /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/WayChecker.java
===================================================================
--- /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/WayChecker.java	(revision 32783)
+++ /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/WayChecker.java	(revision 32784)
@@ -9,11 +9,6 @@
 import java.util.Set;
 
-import javax.swing.SwingUtilities;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.AutoScaleAction;
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.Command;
-import org.openstreetmap.josm.command.SelectCommand;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -25,8 +20,4 @@
 import org.openstreetmap.josm.data.validation.Test;
 import org.openstreetmap.josm.data.validation.TestError;
-import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor;
-import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.plugins.pt_assistant.gui.PTAssistantLayer;
 import org.openstreetmap.josm.plugins.pt_assistant.utils.RouteUtils;
 
@@ -230,5 +221,5 @@
 
 	/**
-	 * Checks if the current way touches its neighbouring was correctly
+	 * Checks if the current way touches its neighboring ways correctly
 	 * 
 	 * @param prev
@@ -451,73 +442,3 @@
 	}
 
-	protected static Command fixErrorByZooming(TestError testError) {
-
-		if (testError.getCode() != PTAssistantValidatorTest.ERROR_CODE_DIRECTION) {
-			return null;
-		}
-
-		Collection<? extends OsmPrimitive> primitives = testError.getPrimitives();
-		Relation originalRelation = (Relation) primitives.iterator().next();
-		ArrayList<OsmPrimitive> primitivesToZoom = new ArrayList<>();
-		for (Object primitiveToZoom : testError.getHighlighted()) {
-			primitivesToZoom.add((OsmPrimitive) primitiveToZoom);
-		}
-
-		SelectCommand command = new SelectCommand(primitivesToZoom);
-
-		List<OsmDataLayer> listOfLayers = Main.getLayerManager().getLayersOfType(OsmDataLayer.class);
-		for (OsmDataLayer osmDataLayer : listOfLayers) {
-			if (osmDataLayer.data == originalRelation.getDataSet()) {
-
-				final OsmDataLayer layerParameter = osmDataLayer;
-				final Relation relationParameter = originalRelation;
-				final Collection<OsmPrimitive> zoomParameter = primitivesToZoom;
-
-				if (SwingUtilities.isEventDispatchThread()) {
-
-					showRelationEditorAndZoom(layerParameter, relationParameter, zoomParameter);
-
-				} else {
-
-					SwingUtilities.invokeLater(new Runnable() {
-						@Override
-						public void run() {
-
-							showRelationEditorAndZoom(layerParameter, relationParameter, zoomParameter);
-
-						}
-					});
-
-				}
-
-				return command;
-			}
-		}
-
-		return null;
-
-	}
-
-	private static void showRelationEditorAndZoom(OsmDataLayer layer, Relation r, Collection<OsmPrimitive> primitives) {
-
-		// zoom to problem:
-		AutoScaleAction.zoomTo(primitives);
-
-		// put stop-related members to the front and edit roles if necessary:
-		List<RelationMember> sortedRelationMembers = listStopMembers(r);
-		sortedRelationMembers.addAll(listNotStopMembers(r));
-		r.setMembers(sortedRelationMembers);
-
-		// create editor:
-		GenericRelationEditor editor = (GenericRelationEditor) RelationEditor.getEditor(layer, r,
-				r.getMembersFor(primitives));
-
-		// open editor:
-		editor.setVisible(true);
-
-		// make the current relation purple in the pt_assistant layer:
-		PTAssistantLayer.getLayer().repaint(r);
-
-	}
-
 }
Index: /applications/editors/josm/plugins/pt_assistant/test/unit/org/openstreetmap/josm/plugins/pt_assistant/validation/SegmentCheckerTest.java
===================================================================
--- /applications/editors/josm/plugins/pt_assistant/test/unit/org/openstreetmap/josm/plugins/pt_assistant/validation/SegmentCheckerTest.java	(revision 32783)
+++ /applications/editors/josm/plugins/pt_assistant/test/unit/org/openstreetmap/josm/plugins/pt_assistant/validation/SegmentCheckerTest.java	(revision 32784)
@@ -33,5 +33,5 @@
 		SegmentChecker segmentChecker = new SegmentChecker(route, test);
 		segmentChecker.performStopByStopTest();
-		assertEquals(SegmentChecker.getCorrectSegmentCount(), 29);
+		assertEquals(SegmentChecker.getCorrectSegmentCount(), 27);
 		assertEquals(segmentChecker.getErrors().size(), 0);
 		
