public override string ToString() => "Mount";
     }
 
-    internal sealed class MountExecutor(
+    internal sealed class MountEvaluator(
         GameFunctions gameFunctions,
         ICondition condition,
         TerritoryData territoryData,
         IClientState clientState,
-        ILogger<MountTask> logger) : TaskExecutor<MountTask>
+        ILogger<MountEvaluator> logger)
     {
-        private bool _mountTriggered;
-        private DateTime _retryAt = DateTime.MinValue;
-
-        public unsafe MountResult EvaluateMountState(bool dryRun)
+        public unsafe MountResult EvaluateMountState(MountTask task, bool dryRun, ref DateTime retryAt)
         {
             if (condition[ConditionFlag.Mounted])
                 return MountResult.DontMount;
 
             LogLevel logLevel = dryRun ? LogLevel.None : LogLevel.Information;
 
-            if (!territoryData.CanUseMount(Task.TerritoryId))
+            if (!territoryData.CanUseMount(task.TerritoryId))
             {
-                logger.Log(logLevel, "Can't use mount in current territory {Id}", Task.TerritoryId);
+                logger.Log(logLevel, "Can't use mount in current territory {Id}", task.TerritoryId);
                 return MountResult.DontMount;
             }
 
                 return MountResult.DontMount;
             }
 
-            if (Task.MountIf == EMountIf.AwayFromPosition)
+            if (task.MountIf == EMountIf.AwayFromPosition)
             {
                 Vector3 playerPosition = clientState.LocalPlayer?.Position ?? Vector3.Zero;
-                float distance = System.Numerics.Vector3.Distance(playerPosition, Task.Position.GetValueOrDefault());
-                if (Task.TerritoryId == clientState.TerritoryType && distance < 30f && !Conditions.Instance()->Diving)
+                float distance = System.Numerics.Vector3.Distance(playerPosition, task.Position.GetValueOrDefault());
+                if (task.TerritoryId == clientState.TerritoryType && distance < 30f && !Conditions.Instance()->Diving)
                 {
                     logger.Log(logLevel, "Not using mount, as we're close to the target");
                     return MountResult.DontMount;
 
                 logger.Log(logLevel,
                     "Want to use mount if away from destination ({Distance} yalms), trying (in territory {Id})...",
-                    distance, Task.TerritoryId);
+                    distance, task.TerritoryId);
             }
             else
-                logger.Log(logLevel, "Want to use mount, trying (in territory {Id})...", Task.TerritoryId);
+                logger.Log(logLevel, "Want to use mount, trying (in territory {Id})...", task.TerritoryId);
 
             if (!condition[ConditionFlag.InCombat])
             {
                 if (dryRun)
-                    _retryAt = DateTime.Now.AddSeconds(0.5);
+                    retryAt = DateTime.Now.AddSeconds(0.5);
                 return MountResult.Mount;
             }
             else
                 return MountResult.WhenOutOfCombat;
         }
+    }
+
+    internal sealed class MountExecutor(
+        GameFunctions gameFunctions,
+        ICondition condition,
+        MountEvaluator mountEvaluator,
+        ILogger<MountExecutor> logger) : TaskExecutor<MountTask>
+    {
+        private bool _mountTriggered;
+        private DateTime _retryAt = DateTime.MinValue;
 
         protected override bool Start()
         {
             _mountTriggered = false;
-            return EvaluateMountState(false) == MountResult.Mount;
+            return mountEvaluator.EvaluateMountState(Task, false, ref _retryAt) == MountResult.Mount;
         }
 
         public override ETaskResult Update()
 
     private readonly ILogger<MoveExecutor> _logger;
     private readonly IClientState _clientState;
     private readonly ICondition _condition;
+    private readonly Mount.MountEvaluator _mountEvaluator;
     private readonly IServiceProvider _serviceProvider;
 
     private Action? _startAction;
         IClientState clientState,
         ICondition condition,
         IDataManager dataManager,
+        Mount.MountEvaluator mountEvaluator,
         IServiceProvider serviceProvider)
     {
         _movementController = movementController;
         _clientState = clientState;
         _condition = condition;
         _serviceProvider = serviceProvider;
+        _mountEvaluator = mountEvaluator;
         _cannotExecuteAtThisTime = dataManager.GetString<LogMessage>(579, x => x.Text)!;
     }
 
                         ? Mount.EMountIf.Always
                         : Mount.EMountIf.AwayFromPosition;
                 var mountTask = new Mount.MountTask(Task.TerritoryId, mountIf, _destination);
+                DateTime retryAt = DateTime.Now;
                 _mountDuringMovement = (_serviceProvider.GetRequiredService<Mount.MountExecutor>(), mountTask);
-                if (_mountDuringMovement.Value.Executor.EvaluateMountState(true) != Mount.MountResult.DontMount)
+                if (_mountEvaluator.EvaluateMountState(mountTask, true, ref retryAt) != Mount.MountResult.DontMount)
                     _mountDuringMovement.Value.Executor.Start(mountTask);
                 else
                     _mountDuringMovement = null;
 
             return ETaskResult.StillRunning;
         }
-        else if (_mountDuringMovement is { Executor: { } mountDuringMoveExecutor })
+        else if (_mountDuringMovement is { Executor: { } mountDuringMoveExecutor, Task: {} mountTask })
         {
             if (mountDuringMoveExecutor.Update() == ETaskResult.TaskComplete)
             {
                 return null;
             }
 
-            if (mountDuringMoveExecutor.EvaluateMountState(true) == Mount.MountResult.DontMount)
+            DateTime retryAt = DateTime.Now;
+            if (_mountEvaluator.EvaluateMountState(mountTask, true, ref retryAt) == Mount.MountResult.DontMount)
             {
                 _logger.LogInformation("MountDuringMovement implicitly complete (shouldn't mount anymore)");
                 _mountDuringMovement = null;
 
     public override bool WasInterrupted()
     {
+        DateTime retryAt = DateTime.Now;
         if (Task.Fly && _condition[ConditionFlag.InCombat] && !_condition[ConditionFlag.Mounted] &&
-            _mountBeforeMovement is { Executor: {} mountExecutor } &&
-            mountExecutor.EvaluateMountState(true) == Mount.MountResult.WhenOutOfCombat)
+            _mountBeforeMovement is { Task: {} mountTask } &&
+            _mountEvaluator.EvaluateMountState(mountTask, true, ref retryAt) == Mount.MountResult.WhenOutOfCombat)
         {
             return true;
         }