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 33190)
+++ /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/PTAssistantPlugin.java	(revision 33191)
@@ -7,4 +7,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.validation.OsmValidator;
+import org.openstreetmap.josm.gui.IconToggleButton;
 import org.openstreetmap.josm.gui.MainMenu;
 import org.openstreetmap.josm.gui.MapFrame;
@@ -32,7 +33,4 @@
     private static PTRouteSegment lastFix;
 
-    /* item of the Tools menu for adding stop_positions */
-    private JMenuItem addStopPositionMenu;
-
     /* item of the Tools menu for repeating the last fix */
     private static JMenuItem repeatLastFixMenu;
@@ -50,9 +48,6 @@
         OsmValidator.addTest(PTAssistantValidatorTest.class);
 
-        AddStopPositionAction addStopPositionAction = new AddStopPositionAction();
-        addStopPositionMenu = MainMenu.add(Main.main.menu.toolsMenu, addStopPositionAction, false);
         RepeatLastFixAction repeatLastFixAction = new RepeatLastFixAction();
         repeatLastFixMenu = MainMenu.add(Main.main.menu.toolsMenu, repeatLastFixAction, false);
-
     }
 
@@ -63,8 +58,7 @@
     public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) {
         if (oldFrame == null && newFrame != null) {
-            addStopPositionMenu.setEnabled(true);
             repeatLastFixMenu.setEnabled(false);
+            Main.map.addMapMode(new IconToggleButton(new AddStopPositionAction(Main.map)));
         } else if (oldFrame != null && newFrame == null) {
-            addStopPositionMenu.setEnabled(false);
             repeatLastFixMenu.setEnabled(false);
         }
Index: /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/AddStopPositionAction.java
===================================================================
--- /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/AddStopPositionAction.java	(revision 33190)
+++ /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/AddStopPositionAction.java	(revision 33191)
@@ -1,93 +1,171 @@
-// License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins.pt_assistant.actions;
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.event.ActionEvent;
+import java.awt.Cursor;
 import java.awt.event.KeyEvent;
-import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JoinNodeWayAction;
-import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.actions.SplitWayAction;
-import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.actions.mapmode.MapMode;
+import org.openstreetmap.josm.command.AddCommand;
+import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.WaySegment;
+import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
 
-/**
- * Action to add stop position and split the relevant way
- *
- * @author darya
- *
+/*
+ * The AddStopPositionAction is a mapmode that allows users to add
+ * new stop_positions or to convert already existing nodes.
  */
-public class AddStopPositionAction extends JosmAction {
+@SuppressWarnings("serial")
+public class AddStopPositionAction extends MapMode {
 
-    /**
-     *
-     */
-    private static final long serialVersionUID = -5140181388906670207L;
+	private transient Set<OsmPrimitive> newHighlights = new HashSet<>();
+	private transient Set<OsmPrimitive> oldHighlights = new HashSet<>();
 
-    public AddStopPositionAction() {
-        super(tr("Add stop position"), new ImageProvider("presets/transport", "bus.svg"), tr("Add stop position"),
-                Shortcut.registerShortcut("Add stop position", tr("Add stop position"), KeyEvent.VK_T, Shortcut.NONE),
-                false, "addStopPosition", false);
+    private final Cursor cursorJoinNode;
+    private final Cursor cursorJoinWay;
 
+	public AddStopPositionAction(MapFrame mapFrame) {
+		super(tr("Add stop position"),
+				"bus",
+				tr("Add stop position"),
+				Shortcut.registerShortcut("mapmode:stop_position",
+                        tr("Mode: {0}", tr("Add stop position")),
+                        KeyEvent.VK_T, Shortcut.DIRECT),
+				mapFrame,
+				getCursor());
+
+		cursorJoinNode = ImageProvider.getCursor("crosshair", "joinnode");
+        cursorJoinWay = ImageProvider.getCursor("crosshair", "joinway");
+	}
+
+    private static Cursor getCursor() {
+        try {
+            return ImageProvider.getCursor("crosshair", "bus");
+        } catch (Exception e) {
+            Main.error(e);
+        }
+        return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR);
     }
 
-    /**
-     * Actions that add the new node, set tags and update the map frame.
-     */
     @Override
-    public void actionPerformed(ActionEvent e) {
+    public void enterMode() {
+        super.enterMode();
+        Main.map.mapView.addMouseListener(this);
+        Main.map.mapView.addMouseMotionListener(this);
+    }
 
-        if (!isEnabled() || !Main.isDisplayingMapView()) {
-            return;
+    @Override
+    public void exitMode() {
+        super.exitMode();
+        Main.map.mapView.removeMouseListener(this);
+        Main.map.mapView.removeMouseMotionListener(this);
+    }
+
+    @Override
+    public void mouseMoved (MouseEvent e) {
+
+    	//while the mouse is moving, surroundings are checked
+    	//if anything is found, it will be highlighted.
+    	//priority is given to nodes
+    	Cursor newCurs = getCursor();
+
+    	Node n = Main.map.mapView.getNearestNode(e.getPoint(), OsmPrimitive::isUsable);
+    	if(n != null) {
+    		newHighlights.add(n);
+    		newCurs = cursorJoinNode;
+    	} else {
+    		List<WaySegment> wss =
+    				Main.map.mapView.getNearestWaySegments(e.getPoint(), OsmPrimitive::isSelectable);
+
+    		if(wss.size() > 0) {
+	    		for(WaySegment ws : wss) {
+	    			newHighlights.add(ws.way);
+	    		}
+	    		newCurs = cursorJoinWay;
+    		}
+		}
+
+    	Main.map.mapView.setCursor(newCurs);
+    	updateHighlights();
+    }
+
+    @Override
+    public void mouseClicked (MouseEvent e) {
+
+    	Boolean newNode = false;
+    	Node newStopPos;
+
+    	//check if the user as selected an existing node, or a new one
+    	Node n = Main.map.mapView.getNearestNode(e.getPoint(), OsmPrimitive::isUsable);
+        if (n == null) {
+        	newNode = true;
+        	newStopPos = new Node(Main.map.mapView.getLatLon(e.getX(), e.getY()));
+        } else {
+        	newStopPos = new Node(n);
+            clearNodeTags(newStopPos);
         }
 
-        final ActionEvent actionEventParameter = e;
+        //add the tags of the stop position
+    	newStopPos.put("bus", "yes");
+    	newStopPos.put("public_transport", "stop_position");
 
-        Main.map.mapView.addMouseListener(new MouseAdapter() {
+    	if(newNode) {
+    		Main.main.undoRedo.add(new AddCommand(newStopPos));
+    	} else {
+    		Main.main.undoRedo.add(new ChangeCommand(n, newStopPos));
+    	}
 
-            LatLon clickPosition;
+    	DataSet ds = Main.getLayerManager().getEditLayer().data;
+    	ds.setSelected(newStopPos);
 
-            @Override
-            public void mouseClicked(MouseEvent e) {
+    	//join the node to the way only if the node is new
+    	if(newNode) {
+	        JoinNodeWayAction joinNodeWayAction = JoinNodeWayAction.createJoinNodeToWayAction();
+	        joinNodeWayAction.actionPerformed(null);
+    	}
 
-                if (clickPosition == null) {
-                    clickPosition = Main.map.mapView.getLatLon(e.getX(), e.getY());
+        // split the way in any case
+        SplitWayAction splitWayAction = new SplitWayAction();
+        splitWayAction.actionPerformed(null);
+    }
 
-                    Layer activeLayer = Main.getLayerManager().getActiveLayer();
+    private void clearNodeTags(Node newStopPos) {
+		for(String key : newStopPos.keySet()) {
+			newStopPos.put(key, null);
+		}
 
-                    if (activeLayer instanceof OsmDataLayer) {
-                        OsmDataLayer osmDataLayer = (OsmDataLayer) activeLayer;
-                        Node newNode = new Node(clickPosition);
-                        newNode.put("bus", "yes");
-                        newNode.put("public_transport", "stop_position");
-                        osmDataLayer.data.addPrimitive(newNode);
-                        osmDataLayer.data.setSelected(newNode);
-                        Main.map.mapView.repaint();
+	}
 
-                        // make the stop position node part of the way:
-                        JoinNodeWayAction joinNodeWayAction = JoinNodeWayAction.createJoinNodeToWayAction();
-                        joinNodeWayAction.actionPerformed(actionEventParameter);
+	//turn off what has been highlighted on last mouse move and highlight what has to be highlighted now
+    private void updateHighlights()
+    {
+    	if(oldHighlights.size() > 0 || newHighlights.size() > 0) {
 
-                        // split the way:
-                        SplitWayAction splitWayAction = new SplitWayAction();
-                        splitWayAction.actionPerformed(actionEventParameter);
+    		for(OsmPrimitive osm : oldHighlights) {
+        		osm.setHighlighted(false);
+        	}
 
-                    }
+        	for(OsmPrimitive osm : newHighlights) {
+        		osm.setHighlighted(true);
+        	}
 
-                    Main.map.mapView.removeMouseListener(this);
-                    Main.map.mapView.removeMouseMotionListener(this);
+    		Main.getLayerManager().getEditLayer().invalidate();
 
-                }
-            }
-        });
-
+        	oldHighlights.clear();
+        	oldHighlights.addAll(newHighlights);
+        	newHighlights.clear();
+    	}
     }
 
