anchor.diff:        Exit;
       end;
       //We should try to make a new route if we're blocked by a locked opponent, or if we were blocked in the past (to clear fDestBlocked)
  -    if fDestBlocked or fOpponent.Action.Locked then
  +    if fDestBlocked or aOpponent.Action.Locked then
       begin
         newNodeList := TKMPointList.Create;
         //Make a new route avoiding tiles with busy units
  
positive.code: 
    //Do not initiate exchanges if we are in DestBlocked mode, as we are zero priority and other units will
    if not fDestBlocked
    and (((HighestInteractionCount >= EXCHANGE_TIMEOUT) and (fInteractionStatus <> kisPushed)) or //When pushed this timeout/counter is different
       (fInteractionStatus = kisPushed)) then //If we get pushed then always try exchanging (if we are here then there is no free tile)
    begin //Try to exchange with the other unit if they are willing
  
      //We must alert the opponent to our presence because it looks bad when you exchange places
      //with the enemy instead of fighting them.
      //CheckAlliance is for optimisation since pushing allies doesn't matter
      if (fOpponent is TKMUnitWarrior)
      and (gHands.CheckAlliance(fOpponent.Owner, fUnit.Owner) = atEnemy)
      and TKMUnitWarrior(fOpponent).CheckForEnemy then
        Exit;
  
      //If Unit on the way is walking somewhere and not exchanging with someone else
      if (fOpponent.Action is TKMUnitActionWalkTo)
      and (not TKMUnitActionWalkTo(fOpponent.Action).fDoExchange)
      //Unit not yet arrived on tile, wait till it does, otherwise there might be 2 units on one tile
      and (not TKMUnitActionWalkTo(fOpponent.Action).fDoesWalking)
      //Diagonal vertex must not be in use
      and ((not KMStepIsDiag(fUnit.Position,NodeList[NodePos+1])) or (not gTerrain.HasVertexUnit(KMGetDiagVertex(fUnit.Position,NodeList[NodePos+1])))) then
        //Check that our tile is walkable for the opponent! (we could be a worker on a building site)
        if (TKMUnitActionWalkTo(fOpponent.Action).GetEffectivePassability in gTerrain.Land[fUnit.Position.Y,fUnit.Position.X].Passability) then
        begin
          //Check unit's future position is where we are now and exchange (use NodeList rather than direction as it's not always right)
          if TKMUnitActionWalkTo(fOpponent.Action).GetNextNextPosition(opponentNextNextPos) then
          begin
            if KMSamePoint(opponentNextNextPos, fUnit.Position) then
            begin
              //Graphically both units are walking side-by-side, but logically they simply walk through each-other.
              TKMUnitActionWalkTo(fOpponent.Action).PerformExchange(KMPOINT_ZERO); //Request unforced exchange
  
              Explanation := 'Unit in the way is walking in the opposite direction. Performing an exchange';
              ExplanationLogAdd;
  
negative.code:   highestInteractionCount: integer;
  begin
    Result := True; //false = interaction yet unsolved, stay and wait.
    if not DO_UNIT_INTERACTION then Exit;
  
    //If there's a unit using this vertex to walk diagonally then we must wait, they will be finished after this step
    if KMStepIsDiag(fUnit.Position,NodeList[NodePos+1]) and
  