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 33442)
+++ /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/AddStopPositionAction.java	(revision 33443)
@@ -7,6 +7,11 @@
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 
@@ -14,11 +19,19 @@
 import org.openstreetmap.josm.actions.JoinNodeWayAction;
 import org.openstreetmap.josm.actions.SplitWayAction;
+import org.openstreetmap.josm.actions.SplitWayAction.SplitWayResult;
 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.command.Command;
+import org.openstreetmap.josm.command.SequenceCommand;
 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;
+import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.WaySegment;
+import org.openstreetmap.josm.plugins.pt_assistant.data.PTStop;
+import org.openstreetmap.josm.plugins.pt_assistant.utils.RouteUtils;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -33,5 +46,5 @@
 public class AddStopPositionAction extends MapMode {
 
-    private static final String mapModeName = "Add stop position";
+    private static final String MAP_MODE_NAME = "Add stop position";
 
     private transient Set<OsmPrimitive> newHighlights = new HashSet<>();
@@ -45,7 +58,7 @@
      */
     public AddStopPositionAction() {
-        super(tr(mapModeName), "bus", tr(mapModeName),
+        super(tr(MAP_MODE_NAME), "bus", tr(MAP_MODE_NAME),
                 Shortcut.registerShortcut("mapmode:stop_position",
-                        tr("Mode: {0}", tr(mapModeName)),
+                        tr("Mode: {0}", tr(MAP_MODE_NAME)),
                         KeyEvent.VK_K, Shortcut.CTRL_SHIFT),
                 getCursor());
@@ -128,8 +141,8 @@
         } else {
             Main.main.undoRedo.add(new ChangeCommand(n, newStopPos));
-        }
-
-        DataSet ds = Main.getLayerManager().getEditLayer().data;
-        ds.setSelected(newStopPos);
+            newStopPos = n;
+        }
+
+        Main.getLayerManager().getEditLayer().data.setSelected(newStopPos);
 
         //join the node to the way only if the node is new
@@ -139,7 +152,92 @@
         }
 
-        // split the way in any case
-        SplitWayAction splitWayAction = new SplitWayAction();
-        splitWayAction.actionPerformed(null);
+        if (newStopPos.getParentWays().isEmpty())
+            return;
+
+        Way affected = newStopPos.getParentWays().get(0);
+        Map<Relation, Boolean> needPostProcess = getAffectedRelation(affected);
+
+        if (needPostProcess.isEmpty())
+            return;
+
+        SplitWayResult result = SplitWayAction.split(getLayerManager().getEditLayer(),
+                affected, Collections.singletonList(newStopPos), Collections.emptyList());
+        Main.main.undoRedo.add(result.getCommand());
+
+        List<Command> cmds = new ArrayList<>();
+        for (Entry<Relation, Boolean> route : needPostProcess.entrySet()) {
+            Relation r = new Relation(route.getKey());
+            if (route.getValue())
+                deleteFirstWay(r);
+            else
+                deleteLastWay(r);
+            cmds.add(new ChangeCommand(route.getKey(), r));
+        }
+        Main.main.undoRedo.add(new SequenceCommand("Update PT Relations", cmds));
+    }
+
+    private void deleteLastWay(Relation r) {
+        int delete = 0;
+        for (int i = r.getMembersCount() - 1; i >= 0; i--) {
+            RelationMember rm = r.getMember(i);
+            if (rm.getType() == OsmPrimitiveType.WAY &&
+                    !PTStop.isPTPlatform(rm)) {
+                delete = i;
+                break;
+            }
+        }
+        r.removeMember(delete);
+    }
+
+    private void deleteFirstWay(Relation r) {
+        int delete = 0;
+        for (int i = 0; i < r.getMembersCount(); i++) {
+            RelationMember rm = r.getMember(i);
+            if (rm.getType() == OsmPrimitiveType.WAY &&
+                    !PTStop.isPTPlatform(rm)) {
+                delete = i;
+                break;
+            }
+        }
+        r.removeMember(delete);
+    }
+
+    private Map<Relation, Boolean> getAffectedRelation(Way affected) {
+        Map<Relation, Boolean> ret = new HashMap<>();
+        for (Relation route : getPTRouteParents(affected)) {
+            if (isFirstMember(affected, route)) {
+                ret.put(route, true);
+            } else if (isLastMember(affected, route)) {
+                ret.put(route, false);
+            }
+        }
+        return ret;
+    }
+
+    private boolean isFirstMember(Way affected, Relation route) {
+        for (int i = 0; i < route.getMembersCount(); i++) {
+            RelationMember rm = route.getMember(i);
+            if (rm.getMember().equals(affected)) {
+                return true;
+            } else if (rm.getType() == OsmPrimitiveType.WAY &&
+                    !PTStop.isPTPlatform(rm)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private boolean isLastMember(Way affected, Relation route) {
+        for (int i = route.getMembersCount() - 1; i >= 0; i--) {
+            RelationMember rm = route.getMember(i);
+            if (rm.getMember().equals(affected)) {
+                return true;
+            } else if (rm.getType() == OsmPrimitiveType.WAY &&
+                    !PTStop.isPTPlatform(rm)) {
+                return false;
+            }
+        }
+
+        return true;
     }
 
@@ -149,4 +247,11 @@
         }
 
+    }
+
+    private List<Relation> getPTRouteParents(Way way) {
+        List<Relation> referrers = OsmPrimitive.getFilteredList(
+                way.getReferrers(), Relation.class);
+        referrers.removeIf(r -> !RouteUtils.isPTRoute(r));
+        return referrers;
     }
 
