Index: branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/Algorithm.cs
===================================================================
--- branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/Algorithm.cs	(revision 15719)
+++ branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/Algorithm.cs	(revision 15721)
@@ -64,6 +64,14 @@
       }
     }
-    
-    public abstract TimeSpan ExecutionTime { get; }
+
+    [Storable]
+    private TimeSpan executionTime;
+    public TimeSpan ExecutionTime {
+      get { return executionTime; }
+      protected set {
+        executionTime = value;
+        OnExecutionTimeChanged();
+      }
+    }
 
     public virtual Type ProblemType {
@@ -125,4 +133,5 @@
       : base() {
       executionState = ExecutionState.Stopped;
+      executionTime = TimeSpan.Zero;
       storeAlgorithmInEachRun = false;
       runsCounter = 0;
@@ -132,4 +141,5 @@
       : base(name) {
       executionState = ExecutionState.Stopped;
+      executionTime = TimeSpan.Zero;
       storeAlgorithmInEachRun = false;
       runsCounter = 0;
@@ -139,4 +149,5 @@
       : base(name, parameters) {
       executionState = ExecutionState.Stopped;
+      executionTime = TimeSpan.Zero;
       storeAlgorithmInEachRun = false;
       runsCounter = 0;
@@ -146,4 +157,5 @@
       : base(name, description) {
       executionState = ExecutionState.Stopped;
+      executionTime = TimeSpan.Zero;
       storeAlgorithmInEachRun = false;
       runsCounter = 0;
@@ -153,4 +165,5 @@
       : base(name, description, parameters) {
       executionState = ExecutionState.Stopped;
+      executionTime = TimeSpan.Zero;
       storeAlgorithmInEachRun = false;
       runsCounter = 0;
@@ -168,4 +181,5 @@
       if (ExecutionState == ExecutionState.Started) throw new InvalidOperationException(string.Format("Clone not allowed in execution state \"{0}\".", ExecutionState));
       executionState = original.executionState;
+      executionTime = original.executionTime;
       problem = cloner.Clone(original.problem);
       storeAlgorithmInEachRun = original.storeAlgorithmInEachRun;
@@ -246,4 +260,9 @@
       if (handler != null) handler(this, EventArgs.Empty);
     }
+    public event EventHandler ExecutionTimeChanged;
+    protected virtual void OnExecutionTimeChanged() {
+      EventHandler handler = ExecutionTimeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
     public event EventHandler ProblemChanged;
     protected virtual void OnProblemChanged() {
@@ -258,4 +277,5 @@
     public event EventHandler Prepared;
     protected virtual void OnPrepared() {
+      ExecutionTime = TimeSpan.Zero;
       foreach (IStatefulItem statefulObject in this.GetObjectGraphObjects(new HashSet<object>() { Runs }).OfType<IStatefulItem>()) {
         statefulObject.InitializeState();
@@ -328,7 +348,4 @@
     }
     #endregion
-
-    [Obsolete("Deprecate, does nothing, needs to be removed from IExecutable")]
-    public event EventHandler ExecutionTimeChanged;
   }
 }
Index: branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/BasicAlgorithm.cs
===================================================================
--- branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/BasicAlgorithm.cs	(revision 15719)
+++ branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/BasicAlgorithm.cs	(revision 15721)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Linq;
 using System.Threading;
 using HeuristicLab.Common;
@@ -31,5 +32,5 @@
 
     private bool pausePending;
-    private bool executionTimeActive;
+    private DateTime lastUpdateTime;
 
     public string Filename { get; set; }
@@ -51,11 +52,4 @@
     }
 
-    [Storable]
-    private TimeSpan executionTime;
-    private DateTime startDate;
-    public override TimeSpan ExecutionTime {
-      get { return executionTime + (executionTimeActive ? DateTime.UtcNow - startDate : TimeSpan.Zero); }
-    }
-
     [StorableConstructor]
     protected BasicAlgorithm(bool deserializing) : base(deserializing) { }
@@ -64,14 +58,11 @@
       results = cloner.Clone(original.Results);
       initialized = original.initialized;
-      executionTime = original.executionTime;
     }
     protected BasicAlgorithm()
       : base() {
       results = new ResultCollection();
-      executionTime = TimeSpan.Zero;
     }
 
     public override void Prepare() {
-      executionTime = TimeSpan.Zero;
       if (Problem == null) return;
       base.Prepare();
@@ -82,6 +73,4 @@
 
     public override void Start(CancellationToken cancellationToken) {
-      startDate = DateTime.UtcNow;
-      executionTimeActive = true;
       base.Start(cancellationToken);
       CancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
@@ -125,8 +114,20 @@
     private void Run(object state) {
       CancellationToken cancellationToken = (CancellationToken)state;
-      if (!initialized)
-        Initialize(cancellationToken);
-      initialized = true;
-      Run(cancellationToken);
+      lastUpdateTime = DateTime.UtcNow;
+      System.Timers.Timer timer = new System.Timers.Timer(250);
+      timer.AutoReset = true;
+      timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
+      timer.Start();
+      try {
+        if (!initialized)
+          Initialize(cancellationToken);
+        initialized = true;
+        Run(cancellationToken);
+      }
+      finally {
+        timer.Elapsed -= new System.Timers.ElapsedEventHandler(timer_Elapsed);
+        timer.Stop();
+        ExecutionTime += DateTime.UtcNow - lastUpdateTime;
+      }
     }
 
@@ -134,17 +135,15 @@
     protected abstract void Run(CancellationToken cancellationToken);
 
-    protected override void OnPaused() {
-      executionTime += DateTime.UtcNow - startDate;
-      executionTimeActive = false;
-      base.OnPaused();
+    #region Events
+    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
+      System.Timers.Timer timer = (System.Timers.Timer)sender;
+      timer.Enabled = false;
+      DateTime now = DateTime.UtcNow;
+      ExecutionTime += now - lastUpdateTime;
+      lastUpdateTime = now;
+      timer.Enabled = true;
     }
+    #endregion
 
-    protected override void OnStopped() {
-      if (executionTimeActive) { // don't do if going from pause to stop
-        executionTime += DateTime.UtcNow - startDate;
-        executionTimeActive = false;
-      }
-      base.OnStopped();
-    }
   }
 }
Index: branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/EngineAlgorithm.cs
===================================================================
--- branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/EngineAlgorithm.cs	(revision 15719)
+++ branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/EngineAlgorithm.cs	(revision 15721)
@@ -71,8 +71,4 @@
     }
 
-    public override TimeSpan ExecutionTime {
-      get { return engine.ExecutionTime; }
-    }
-
     public override ResultCollection Results {
       get {
@@ -200,4 +196,5 @@
     private void RegisterEngineEvents() {
       Engine.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(Engine_ExceptionOccurred);
+      Engine.ExecutionTimeChanged += new EventHandler(Engine_ExecutionTimeChanged);
       Engine.Paused += new EventHandler(Engine_Paused);
       Engine.Prepared += new EventHandler(Engine_Prepared);
@@ -207,4 +204,5 @@
     private void DeregisterEngineEvents() {
       Engine.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(Engine_ExceptionOccurred);
+      Engine.ExecutionTimeChanged -= new EventHandler(Engine_ExecutionTimeChanged);
       Engine.Paused -= new EventHandler(Engine_Paused);
       Engine.Prepared -= new EventHandler(Engine_Prepared);
@@ -214,4 +212,7 @@
     private void Engine_ExceptionOccurred(object sender, EventArgs<Exception> e) {
       OnExceptionOccurred(e.Value);
+    }
+    private void Engine_ExecutionTimeChanged(object sender, EventArgs e) {
+      ExecutionTime = Engine.ExecutionTime;
     }
     private void Engine_Paused(object sender, EventArgs e) {
Index: branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/HeuristicOptimizationAlgorithm.cs
===================================================================
--- branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/HeuristicOptimizationAlgorithm.cs	(revision 15719)
+++ branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/HeuristicOptimizationAlgorithm.cs	(revision 15721)
@@ -21,5 +21,4 @@
 
 using System;
-using System.Threading;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -38,43 +37,13 @@
     }
 
-    [Storable]
-    private TimeSpan executionTime;
-    private DateTime startDate;
-    public override TimeSpan ExecutionTime {
-      get { return executionTime + (ExecutionState == ExecutionState.Started ? DateTime.UtcNow - startDate : TimeSpan.Zero); }
-    }
-
-    protected HeuristicOptimizationAlgorithm() : base() {
-      executionTime = TimeSpan.Zero;
-    }
-    protected HeuristicOptimizationAlgorithm(string name) : base(name) {
-      executionTime = TimeSpan.Zero;
-    }
-    protected HeuristicOptimizationAlgorithm(string name, ParameterCollection parameters) : base(name, parameters) {
-      executionTime = TimeSpan.Zero;
-    }
-    protected HeuristicOptimizationAlgorithm(string name, string description) : base(name, description) {
-      executionTime = TimeSpan.Zero;
-    }
-    protected HeuristicOptimizationAlgorithm(string name, string description, ParameterCollection parameters) : base(name, description, parameters) {
-      executionTime = TimeSpan.Zero;
-    }
+    protected HeuristicOptimizationAlgorithm() : base() { }
+    protected HeuristicOptimizationAlgorithm(string name) : base(name) { }
+    protected HeuristicOptimizationAlgorithm(string name, ParameterCollection parameters) : base(name, parameters) { }
+    protected HeuristicOptimizationAlgorithm(string name, string description) : base(name, description) { }
+    protected HeuristicOptimizationAlgorithm(string name, string description, ParameterCollection parameters) : base(name, description, parameters) { }
 
     [StorableConstructor]
     protected HeuristicOptimizationAlgorithm(bool deserializing) : base(deserializing) { }
-    protected HeuristicOptimizationAlgorithm(HeuristicOptimizationAlgorithm original, Cloner cloner)
-      : base(original, cloner) {
-      executionTime = original.executionTime;
-    }
-
-    public override void Prepare() {
-      executionTime = TimeSpan.Zero;
-      base.Prepare();
-    }
-
-    public override void Start(CancellationToken cancellationToken) {
-      startDate = DateTime.UtcNow;
-      base.Start(cancellationToken);
-    }
+    protected HeuristicOptimizationAlgorithm(HeuristicOptimizationAlgorithm original, Cloner cloner) : base(original, cloner) { }
 
     #region Events
@@ -93,18 +62,4 @@
     protected virtual void Problem_EvaluatorChanged(object sender, EventArgs e) { }
     #endregion
-
-    protected override void OnPaused() {
-      var elapsed = DateTime.UtcNow - startDate;
-      executionTime += elapsed;
-      base.OnPaused();
-    }
-
-    protected override void OnStopped() {
-      if (ExecutionState == ExecutionState.Started) {
-        var elapsed = DateTime.UtcNow - startDate;
-        executionTime += elapsed;
-      }
-      base.OnStopped();
-    }
   }
 }
Index: branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/MetaOptimizers/BatchRun.cs
===================================================================
--- branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/MetaOptimizers/BatchRun.cs	(revision 15719)
+++ branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/MetaOptimizers/BatchRun.cs	(revision 15721)
@@ -68,10 +68,22 @@
       }
     }
-    
+
     [Storable]
     private TimeSpan executionTime;
     public TimeSpan ExecutionTime {
-      get { return executionTime + (Optimizer?.ExecutionTime ?? TimeSpan.Zero); }
-    }
+      get {
+        if ((Optimizer != null) && (Optimizer.ExecutionState != ExecutionState.Stopped))
+          return executionTime + Optimizer.ExecutionTime;
+        else
+          return executionTime;
+      }
+      private set {
+        executionTime = value;
+        OnExecutionTimeChanged();
+      }
+    }
+
+    [Storable]
+    private TimeSpan runsExecutionTime;
 
     [Storable]
@@ -162,4 +174,5 @@
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
+      runsExecutionTime = TimeSpan.Zero;
       repetitions = 10;
       repetitionsCounter = 0;
@@ -171,4 +184,5 @@
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
+      runsExecutionTime = TimeSpan.Zero;
       repetitions = 10;
       repetitionsCounter = 0;
@@ -179,4 +193,5 @@
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
+      runsExecutionTime = TimeSpan.Zero;
       repetitions = 10;
       repetitionsCounter = 0;
@@ -194,4 +209,5 @@
       executionState = original.executionState;
       executionTime = original.executionTime;
+      runsExecutionTime = original.runsExecutionTime;
       optimizer = cloner.Clone(original.optimizer);
       repetitions = original.repetitions;
@@ -218,5 +234,5 @@
         throw new InvalidOperationException(string.Format("Prepare not allowed in execution state \"{0}\".", ExecutionState));
       if (Optimizer != null) {
-        executionTime = TimeSpan.Zero;
+        ExecutionTime = TimeSpan.Zero;
         RepetitionsCounter = 0;
         if (clearRuns) runs.Clear();
@@ -282,6 +298,9 @@
       if (handler != null) handler(this, EventArgs.Empty);
     }
-    [Obsolete("Deprecated needs to be removed")]
     public event EventHandler ExecutionTimeChanged;
+    private void OnExecutionTimeChanged() {
+      EventHandler handler = ExecutionTimeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
     public event EventHandler OptimizerChanged;
     private void OnOptimizerChanged() {
@@ -335,4 +354,5 @@
     private void RegisterOptimizerEvents() {
       optimizer.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(Optimizer_ExceptionOccurred);
+      optimizer.ExecutionTimeChanged += new EventHandler(Optimizer_ExecutionTimeChanged);
       optimizer.Paused += new EventHandler(Optimizer_Paused);
       optimizer.Prepared += new EventHandler(Optimizer_Prepared);
@@ -345,4 +365,5 @@
     private void DeregisterOptimizerEvents() {
       optimizer.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(Optimizer_ExceptionOccurred);
+      optimizer.ExecutionTimeChanged -= new EventHandler(Optimizer_ExecutionTimeChanged);
       optimizer.Paused -= new EventHandler(Optimizer_Paused);
       optimizer.Prepared -= new EventHandler(Optimizer_Prepared);
@@ -356,4 +377,7 @@
       OnExceptionOccurred(e.Value);
     }
+    private void Optimizer_ExecutionTimeChanged(object sender, EventArgs e) {
+      OnExecutionTimeChanged();
+    }
     private void Optimizer_Paused(object sender, EventArgs e) {
       if (ExecutionState == ExecutionState.Started) {
@@ -363,4 +387,6 @@
     private void Optimizer_Prepared(object sender, EventArgs e) {
       if (batchRunAction == BatchRunAction.Prepare || ExecutionState == ExecutionState.Stopped) {
+        ExecutionTime = TimeSpan.Zero;
+        runsExecutionTime = TimeSpan.Zero;
         RepetitionsCounter = 0;
         OnPrepared();
@@ -373,4 +399,6 @@
     private void Optimizer_Stopped(object sender, EventArgs e) {
       RepetitionsCounter++;
+      ExecutionTime += runsExecutionTime;
+      runsExecutionTime = TimeSpan.Zero;
 
       if (batchRunAction == BatchRunAction.Stop) OnStopped();
@@ -407,23 +435,26 @@
     private void Runs_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) {
       if (Optimizer != null) Optimizer.Runs.RemoveRange(e.OldItems);
-      executionTime += SumExecutionTimes(e.OldItems);
-      executionTime += SumExecutionTimes(e.Items);
+      foreach (IRun run in e.Items) {
+        IItem item;
+        run.Results.TryGetValue("Execution Time", out item);
+        TimeSpanValue executionTime = item as TimeSpanValue;
+        if (executionTime != null) ExecutionTime += executionTime.Value;
+      }
     }
     private void Runs_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IRun> e) {
-      executionTime += SumExecutionTimes(e.Items);
+      foreach (IRun run in e.Items) {
+        IItem item;
+        run.Results.TryGetValue("Execution Time", out item);
+        TimeSpanValue executionTime = item as TimeSpanValue;
+        if (executionTime != null) {
+          if (Optimizer.ExecutionState == ExecutionState.Started)
+            runsExecutionTime += executionTime.Value;
+          else
+            ExecutionTime += executionTime.Value;
+        }
+      }
     }
     private void Runs_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IRun> e) {
       if (Optimizer != null) Optimizer.Runs.RemoveRange(e.Items);
-      executionTime -= SumExecutionTimes(e.Items);
-    }
-    private TimeSpan SumExecutionTimes(IEnumerable<IRun> runs) {
-      var sum = TimeSpan.Zero;
-      foreach (IRun run in runs) {
-        IItem item;
-        run.Results.TryGetValue("Execution Time", out item);
-        TimeSpanValue exTime = item as TimeSpanValue;
-        if (exTime != null) sum += exTime.Value;
-      }
-      return sum;
     }
     #endregion
Index: branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/MetaOptimizers/Experiment.cs
===================================================================
--- branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/MetaOptimizers/Experiment.cs	(revision 15719)
+++ branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/MetaOptimizers/Experiment.cs	(revision 15721)
@@ -70,5 +70,9 @@
     private TimeSpan executionTime;
     public TimeSpan ExecutionTime {
-      get { return executionTime + Optimizers.Aggregate(TimeSpan.Zero, (a, x) => a + x.ExecutionTime); }
+      get { return executionTime; }
+      private set {
+        executionTime = value;
+        OnExecutionTimeChanged();
+      }
     }
 
@@ -278,6 +282,9 @@
       if (handler != null) handler(this, EventArgs.Empty);
     }
-    [Obsolete("deprecated needs to be removed")]
     public event EventHandler ExecutionTimeChanged;
+    private void OnExecutionTimeChanged() {
+      EventHandler handler = ExecutionTimeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
     public event EventHandler Prepared;
     private void OnPrepared() {
@@ -362,4 +369,5 @@
     private void RegisterOptimizerEvents(IOptimizer optimizer) {
       optimizer.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(optimizer_ExceptionOccurred);
+      optimizer.ExecutionTimeChanged += new EventHandler(optimizer_ExecutionTimeChanged);
       optimizer.Paused += new EventHandler(optimizer_Paused);
       optimizer.Prepared += new EventHandler(optimizer_Prepared);
@@ -372,4 +380,5 @@
     private void DeregisterOptimizerEvents(IOptimizer optimizer) {
       optimizer.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(optimizer_ExceptionOccurred);
+      optimizer.ExecutionTimeChanged -= new EventHandler(optimizer_ExecutionTimeChanged);
       optimizer.Paused -= new EventHandler(optimizer_Paused);
       optimizer.Prepared -= new EventHandler(optimizer_Prepared);
@@ -386,4 +395,14 @@
       lock (locker)
         OnExceptionOccurred(e.Value);
+    }
+    private void optimizer_ExecutionTimeChanged(object sender, EventArgs e) {
+      // only wait for maximally 100ms to acquire lock, otherwise return and don't update the execution time 
+      var success = Monitor.TryEnter(locker, 100);
+      if (!success) return;
+      try {
+        ExecutionTime = Optimizers.Aggregate(TimeSpan.Zero, (t, o) => t + o.ExecutionTime);
+      } finally {
+        Monitor.Exit(locker);
+      }
     }
     private void optimizer_Paused(object sender, EventArgs e) {
Index: branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/MetaOptimizers/TimeLimitRun.cs
===================================================================
--- branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/MetaOptimizers/TimeLimitRun.cs	(revision 15719)
+++ branches/1614_GeneralizedQAP/HeuristicLab.Optimization/3.3/MetaOptimizers/TimeLimitRun.cs	(revision 15721)
@@ -214,7 +214,4 @@
 
     private void Initialize() {
-      timer = new System.Timers.Timer();
-      timer.Interval = 50;
-      timer.Elapsed += Timer_Elapsed;
       if (algorithm != null) RegisterAlgorithmEvents();
       snapshotTimes.ItemsAdded += snapshotTimes_Changed;
@@ -258,20 +255,4 @@
     }
 
-    private System.Timers.Timer timer;
-
-    private void Timer_Elapsed(object sender, EventArgs e) {
-      if (Algorithm.ExecutionState == ExecutionState.Started) {
-        if (snapshotTimesIndex < SnapshotTimes.Count && ExecutionTime >= SnapshotTimes[snapshotTimesIndex]
-          && !pausedForSnapshot) {
-          pausedForSnapshot = true;
-          Algorithm.Pause();
-        }
-        if (ExecutionTime >= MaximumExecutionTime && !pausedForTermination) {
-          pausedForTermination = true;
-          if (!pausedForSnapshot) Algorithm.Pause();
-        }
-      }
-    }
-
     #region Events
     protected override void OnNameChanged() {
@@ -292,6 +273,9 @@
       if (handler != null) handler(this, EventArgs.Empty);
     }
-    [Obsolete("Deprecated needs to be removed")]
     public event EventHandler ExecutionTimeChanged;
+    private void OnExecutionTimeChanged() {
+      var handler = ExecutionTimeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
     public event EventHandler Prepared;
     private void OnPrepared() {
@@ -301,5 +285,4 @@
     public event EventHandler Started;
     private void OnStarted() {
-      timer.Start();
       var handler = Started;
       if (handler != null) handler(this, EventArgs.Empty);
@@ -307,5 +290,4 @@
     public event EventHandler Paused;
     private void OnPaused() {
-      timer.Stop();
       var handler = Paused;
       if (handler != null) handler(this, EventArgs.Empty);
@@ -313,5 +295,4 @@
     public event EventHandler Stopped;
     private void OnStopped() {
-      timer.Stop();
       var handler = Stopped;
       if (handler != null) handler(this, EventArgs.Empty);
@@ -327,4 +308,5 @@
     private void RegisterAlgorithmEvents() {
       algorithm.ExceptionOccurred += Algorithm_ExceptionOccurred;
+      algorithm.ExecutionTimeChanged += Algorithm_ExecutionTimeChanged;
       algorithm.ExecutionStateChanged += Algorithm_ExecutionStateChanged;
       algorithm.Paused += Algorithm_Paused;
@@ -335,4 +317,5 @@
     private void DeregisterAlgorithmEvents() {
       algorithm.ExceptionOccurred -= Algorithm_ExceptionOccurred;
+      algorithm.ExecutionTimeChanged -= Algorithm_ExecutionTimeChanged;
       algorithm.ExecutionStateChanged -= Algorithm_ExecutionStateChanged;
       algorithm.Paused -= Algorithm_Paused;
@@ -343,4 +326,16 @@
     private void Algorithm_ExceptionOccurred(object sender, EventArgs<Exception> e) {
       OnExceptionOccurred(e.Value);
+    }
+    private void Algorithm_ExecutionTimeChanged(object sender, EventArgs e) {
+      if (snapshotTimesIndex < SnapshotTimes.Count && ExecutionTime >= SnapshotTimes[snapshotTimesIndex]
+        && !pausedForSnapshot) {
+        pausedForSnapshot = true;
+        Algorithm.Pause();
+      }
+      if (ExecutionTime >= MaximumExecutionTime && !pausedForTermination) {
+        pausedForTermination = true;
+        if (!pausedForSnapshot) Algorithm.Pause();
+      }
+      OnExecutionTimeChanged();
     }
     private void Algorithm_ExecutionStateChanged(object sender, EventArgs e) {
