anchor.diff:                          be_Left:    fStreet.X := fStreet.X - 1;
                           be_Center:  ;
                           be_Right:   fStreet.X := fStreet.X + 1;
  -                        else        exit; //All street tiles are blocked by busy units. Do not exit the house, just wait
  +                        be_None:    Exit; //All street tiles are blocked by busy units. Do not exit the house, just wait
                         end;
   
  -                      //If there's an idling unit, wait till it goes away
  -                      if (fTerrain.Land[fStreet.Y,fStreet.X].IsUnit <> nil) then
  +                      //If we have pushed an idling unit, wait till it goes away
  +                      //Wait until our push request is dealt with before we move out
  +                      if (fPushedUnit <> nil) then
                         begin
  -                        fWaitingForPush := true;
  -                        fHasStarted := true;
  -                        exit; //Wait until our push request is dealt with before we move out
  -                      end;
  -
  -                      WalkOut; //All checks done so we can walk out now
  +                        fWaitingForPush := True;
  +                        fHasStarted := True;
  +                        Exit;
  +                      end
  +                      else
  +                        WalkOut; //Otherwise we can walk out now
                       end;
       end;
  -    if fStreet.X = fDoor.X then //We are walking straight
  -      IncDoorway;
  -
  -    fHasStarted := true;
  +
  +    fHasStarted := True;
     end;
   
   
     if fWaitingForPush then
     begin
       U := fTerrain.Land[fStreet.Y,fStreet.X].IsUnit;
  -    if (U = nil) then
  +    if (U = nil) then //Unit has walked away
       begin
  -      fWaitingForPush := false;
  +      fWaitingForPush := False;
  +      fPushedUnit.ReleaseUnitPointer;
  +      fPushedUnit := nil;
         WalkOut;
  -      if fStreet.X = fDoor.X then //We are walking straight
  -        IncDoorway;
       end
       else
  -      //Make sure they are still moving out of the way (it could be a different unit now)
  -      if (U.GetUnitAction is TUnitActionWalkTo) and TUnitActionWalkTo(U.GetUnitAction).HasBeenPushed then
  -        exit //Wait until our push request is dealt with before we move out
  -      else
  +    begin //There's still some unit - we can't go outside
  +      if (U <> fPushedUnit) then //The unit has switched places with another one, so we must start again
         begin
  -        fHasStarted := false; //This unit switched places with another or gave up, so we must start again
  -        fWaitingForPush := false;
  -        exit;
  +        fHasStarted := False;
  +        fWaitingForPush := False;
  +        fPushedUnit.ReleaseUnitPointer;
  +        fPushedUnit := nil;
         end;
  +      Exit;
  +    end;
     end;
   
     //IsExchanging can be updated while we have completed less than 20% of the move. If it is changed after that
  
positive.code:     if LinkUnit <> nil then
        TKMUnitWarrior(fUnit).OrderLinkTo(LinkUnit);
    end;
  end;
  
  
  
negative.code:   fUnit.Direction := KMGetDirection(fDoor, fStreet);
    fUnit.UpdateNextPosition(fStreet);
    fTerrain.UnitAdd(fUnit.NextPosition, fUnit); //Unit was not occupying tile while inside
  
    if (fUnit.GetHome <> nil)
    and (fUnit.GetHome.HouseType = ht_Barracks) //Unit home is barracks
    and (fUnit.GetHome = fHouse) then //And is the house we are walking from
  