Index: /branches/GeneralizedQAP/HeuristicLab.Optimization.Views/3.3/IOptimizerView.Designer.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Optimization.Views/3.3/IOptimizerView.Designer.cs	(revision 15602)
+++ /branches/GeneralizedQAP/HeuristicLab.Optimization.Views/3.3/IOptimizerView.Designer.cs	(revision 15603)
@@ -45,4 +45,5 @@
     /// </summary>
     private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
       System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(IOptimizerView));
       this.startButton = new System.Windows.Forms.Button();
@@ -52,4 +53,5 @@
       this.stopButton = new System.Windows.Forms.Button();
       this.resetButton = new System.Windows.Forms.Button();
+      this.executionTimer = new System.Windows.Forms.Timer(this.components);
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.SuspendLayout();
@@ -132,4 +134,9 @@
       this.resetButton.Click += new System.EventHandler(this.resetButton_Click);
       // 
+      // executionTimer
+      // 
+      this.executionTimer.Interval = 200;
+      this.executionTimer.Tick += new System.EventHandler(this.executionTimer_Tick);
+      //
       // IOptimizerView
       // 
@@ -166,4 +173,5 @@
     protected System.Windows.Forms.Button pauseButton;
     protected System.Windows.Forms.Button stopButton;
+    protected System.Windows.Forms.Timer executionTimer;
     protected System.Windows.Forms.Button resetButton;
 
Index: /branches/GeneralizedQAP/HeuristicLab.Optimization.Views/3.3/IOptimizerView.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Optimization.Views/3.3/IOptimizerView.cs	(revision 15602)
+++ /branches/GeneralizedQAP/HeuristicLab.Optimization.Views/3.3/IOptimizerView.cs	(revision 15603)
@@ -44,5 +44,4 @@
       Content.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred);
       Content.ExecutionStateChanged -= new EventHandler(Content_ExecutionStateChanged);
-      Content.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
       Content.Prepared -= new EventHandler(Content_Prepared);
       Content.Started -= new EventHandler(Content_Started);
@@ -55,5 +54,4 @@
       Content.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred);
       Content.ExecutionStateChanged += new EventHandler(Content_ExecutionStateChanged);
-      Content.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
       Content.Prepared += new EventHandler(Content_Prepared);
       Content.Started += new EventHandler(Content_Started);
@@ -64,10 +62,8 @@
     protected override void OnContentChanged() {
       base.OnContentChanged();
-      if (Content == null) {
-        executionTimeTextBox.Text = "-";
-      } else {
+      if (Content != null) {
         Locked = ReadOnly = Content.ExecutionState == ExecutionState.Started;
-        executionTimeTextBox.Text = Content.ExecutionTime.ToString();
       }
+      UpdateExecutionTime();
     }
 
@@ -90,4 +86,5 @@
       else {
         nameTextBox.Enabled = infoLabel.Enabled = true;
+        UpdateExecutionTime();
         ReadOnly = Locked = false;
         SetEnabledStateOfExecutableButtons();
@@ -98,4 +95,5 @@
         Invoke(new EventHandler(Content_Started), sender, e);
       else {
+        executionTimer.Start();
         nameTextBox.Enabled = infoLabel.Enabled = false;
         ReadOnly = Locked = true;
@@ -107,4 +105,6 @@
         Invoke(new EventHandler(Content_Paused), sender, e);
       else {
+        executionTimer.Stop();
+        UpdateExecutionTime();
         nameTextBox.Enabled = infoLabel.Enabled = true;
         ReadOnly = Locked = false;
@@ -116,4 +116,6 @@
         Invoke(new EventHandler(Content_Stopped), sender, e);
       else {
+        executionTimer.Stop();
+        UpdateExecutionTime();
         nameTextBox.Enabled = infoLabel.Enabled = true;
         ReadOnly = Locked = false;
@@ -121,15 +123,12 @@
       }
     }
-    protected virtual void Content_ExecutionTimeChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_ExecutionTimeChanged), sender, e);
-      else
-        executionTimeTextBox.Text = Content == null ? "-" : Content.ExecutionTime.ToString();
-    }
     protected virtual void Content_ExceptionOccurred(object sender, EventArgs<Exception> e) {
       if (InvokeRequired)
         Invoke(new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred), sender, e);
-      else
+      else {
+        executionTimer.Stop();
+        UpdateExecutionTime();
         ErrorHandling.ShowErrorDialog(this, e.Value);
+      }
     }
     #endregion
@@ -147,4 +146,11 @@
     protected virtual void resetButton_Click(object sender, EventArgs e) {
       Content.Prepare(false);
+    }
+    private void executionTimer_Tick(object sender, EventArgs e) {
+      UpdateExecutionTime();
+    }
+
+    private void UpdateExecutionTime() {
+      executionTimeTextBox.Text = (Content == null ? "-" : Content.ExecutionTime.ToString());
     }
     #endregion
Index: /branches/GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/Algorithm.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/Algorithm.cs	(revision 15602)
+++ /branches/GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/Algorithm.cs	(revision 15603)
@@ -64,14 +64,6 @@
       }
     }
-
-    [Storable]
-    private TimeSpan executionTime;
-    public TimeSpan ExecutionTime {
-      get { return executionTime; }
-      protected set {
-        executionTime = value;
-        OnExecutionTimeChanged();
-      }
-    }
+    
+    public abstract TimeSpan ExecutionTime { get; }
 
     public virtual Type ProblemType {
@@ -133,5 +125,4 @@
       : base() {
       executionState = ExecutionState.Stopped;
-      executionTime = TimeSpan.Zero;
       storeAlgorithmInEachRun = false;
       runsCounter = 0;
@@ -141,5 +132,4 @@
       : base(name) {
       executionState = ExecutionState.Stopped;
-      executionTime = TimeSpan.Zero;
       storeAlgorithmInEachRun = false;
       runsCounter = 0;
@@ -149,5 +139,4 @@
       : base(name, parameters) {
       executionState = ExecutionState.Stopped;
-      executionTime = TimeSpan.Zero;
       storeAlgorithmInEachRun = false;
       runsCounter = 0;
@@ -157,5 +146,4 @@
       : base(name, description) {
       executionState = ExecutionState.Stopped;
-      executionTime = TimeSpan.Zero;
       storeAlgorithmInEachRun = false;
       runsCounter = 0;
@@ -165,5 +153,4 @@
       : base(name, description, parameters) {
       executionState = ExecutionState.Stopped;
-      executionTime = TimeSpan.Zero;
       storeAlgorithmInEachRun = false;
       runsCounter = 0;
@@ -181,5 +168,4 @@
       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;
@@ -259,9 +245,4 @@
       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() {
@@ -276,5 +257,4 @@
     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();
@@ -347,4 +327,7 @@
     }
     #endregion
+
+    [Obsolete("Deprecate, does nothing, needs to be removed from IExecutable")]
+    public event EventHandler ExecutionTimeChanged;
   }
 }
Index: /branches/GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/BasicAlgorithm.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/BasicAlgorithm.cs	(revision 15602)
+++ /branches/GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/BasicAlgorithm.cs	(revision 15603)
@@ -21,5 +21,4 @@
 
 using System;
-using System.Linq;
 using System.Threading;
 using HeuristicLab.Common;
@@ -32,5 +31,5 @@
 
     private bool pausePending;
-    private DateTime lastUpdateTime;
+    private bool executionTimeActive;
 
     public string Filename { get; set; }
@@ -52,4 +51,11 @@
     }
 
+    [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) { }
@@ -58,11 +64,14 @@
       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();
@@ -73,4 +82,6 @@
 
     public override void Start(CancellationToken cancellationToken) {
+      startDate = DateTime.UtcNow;
+      executionTimeActive = true;
       base.Start(cancellationToken);
       CancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
@@ -117,20 +128,8 @@
     private void Run(object state) {
       CancellationToken cancellationToken = (CancellationToken)state;
-      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;
-      }
+      if (!initialized)
+        Initialize(cancellationToken);
+      initialized = true;
+      Run(cancellationToken);
     }
 
@@ -138,15 +137,17 @@
     protected abstract void Run(CancellationToken cancellationToken);
 
-    #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;
+    protected override void OnPaused() {
+      executionTime += DateTime.UtcNow - startDate;
+      executionTimeActive = false;
+      base.OnPaused();
     }
-    #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/GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/EngineAlgorithm.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/EngineAlgorithm.cs	(revision 15602)
+++ /branches/GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/EngineAlgorithm.cs	(revision 15603)
@@ -71,4 +71,8 @@
     }
 
+    public override TimeSpan ExecutionTime {
+      get { return engine.ExecutionTime; }
+    }
+
     public override ResultCollection Results {
       get {
@@ -195,5 +199,4 @@
     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);
@@ -203,5 +206,4 @@
     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);
@@ -211,7 +213,4 @@
     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/GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/HeuristicOptimizationAlgorithm.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/HeuristicOptimizationAlgorithm.cs	(revision 15602)
+++ /branches/GeneralizedQAP/HeuristicLab.Optimization/3.3/Algorithms/HeuristicOptimizationAlgorithm.cs	(revision 15603)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Threading;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -37,13 +38,43 @@
     }
 
-    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) { }
+    [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;
+    }
 
     [StorableConstructor]
     protected HeuristicOptimizationAlgorithm(bool deserializing) : base(deserializing) { }
-    protected HeuristicOptimizationAlgorithm(HeuristicOptimizationAlgorithm original, Cloner cloner) : base(original, cloner) { }
+    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);
+    }
 
     #region Events
@@ -62,4 +93,18 @@
     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/GeneralizedQAP/HeuristicLab.Optimization/3.3/MetaOptimizers/BatchRun.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Optimization/3.3/MetaOptimizers/BatchRun.cs	(revision 15602)
+++ /branches/GeneralizedQAP/HeuristicLab.Optimization/3.3/MetaOptimizers/BatchRun.cs	(revision 15603)
@@ -68,22 +68,10 @@
       }
     }
-
+    
     [Storable]
     private TimeSpan executionTime;
     public TimeSpan ExecutionTime {
-      get {
-        if ((Optimizer != null) && (Optimizer.ExecutionState != ExecutionState.Stopped))
-          return executionTime + Optimizer.ExecutionTime;
-        else
-          return executionTime;
-      }
-      private set {
-        executionTime = value;
-        OnExecutionTimeChanged();
-      }
-    }
-
-    [Storable]
-    private TimeSpan runsExecutionTime;
+      get { return executionTime + (Optimizer?.ExecutionTime ?? TimeSpan.Zero); }
+    }
 
     [Storable]
@@ -174,5 +162,4 @@
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
-      runsExecutionTime = TimeSpan.Zero;
       repetitions = 10;
       repetitionsCounter = 0;
@@ -184,5 +171,4 @@
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
-      runsExecutionTime = TimeSpan.Zero;
       repetitions = 10;
       repetitionsCounter = 0;
@@ -193,5 +179,4 @@
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
-      runsExecutionTime = TimeSpan.Zero;
       repetitions = 10;
       repetitionsCounter = 0;
@@ -209,5 +194,4 @@
       executionState = original.executionState;
       executionTime = original.executionTime;
-      runsExecutionTime = original.runsExecutionTime;
       optimizer = cloner.Clone(original.optimizer);
       repetitions = original.repetitions;
@@ -234,5 +218,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();
@@ -297,9 +281,6 @@
       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() {
@@ -353,5 +334,4 @@
     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);
@@ -364,5 +344,4 @@
     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);
@@ -376,7 +355,4 @@
       OnExceptionOccurred(e.Value);
     }
-    private void Optimizer_ExecutionTimeChanged(object sender, EventArgs e) {
-      OnExecutionTimeChanged();
-    }
     private void Optimizer_Paused(object sender, EventArgs e) {
       if (ExecutionState == ExecutionState.Started) {
@@ -386,6 +362,4 @@
     private void Optimizer_Prepared(object sender, EventArgs e) {
       if (batchRunAction == BatchRunAction.Prepare || ExecutionState == ExecutionState.Stopped) {
-        ExecutionTime = TimeSpan.Zero;
-        runsExecutionTime = TimeSpan.Zero;
         RepetitionsCounter = 0;
         OnPrepared();
@@ -398,6 +372,4 @@
     private void Optimizer_Stopped(object sender, EventArgs e) {
       RepetitionsCounter++;
-      ExecutionTime += runsExecutionTime;
-      runsExecutionTime = TimeSpan.Zero;
 
       if (batchRunAction == BatchRunAction.Stop) OnStopped();
@@ -434,26 +406,23 @@
     private void Runs_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) {
       if (Optimizer != null) Optimizer.Runs.RemoveRange(e.OldItems);
-      foreach (IRun run in e.Items) {
+      executionTime += SumExecutionTimes(e.OldItems);
+      executionTime += SumExecutionTimes(e.Items);
+    }
+    private void Runs_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IRun> e) {
+      executionTime += SumExecutionTimes(e.Items);
+    }
+    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 executionTime = item as TimeSpanValue;
-        if (executionTime != null) ExecutionTime += executionTime.Value;
-      }
-    }
-    private void Runs_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IRun> e) {
-      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);
+        TimeSpanValue exTime = item as TimeSpanValue;
+        if (exTime != null) sum += exTime.Value;
+      }
+      return sum;
     }
     #endregion
Index: /branches/GeneralizedQAP/HeuristicLab.Optimization/3.3/MetaOptimizers/Experiment.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Optimization/3.3/MetaOptimizers/Experiment.cs	(revision 15602)
+++ /branches/GeneralizedQAP/HeuristicLab.Optimization/3.3/MetaOptimizers/Experiment.cs	(revision 15603)
@@ -70,9 +70,5 @@
     private TimeSpan executionTime;
     public TimeSpan ExecutionTime {
-      get { return executionTime; }
-      private set {
-        executionTime = value;
-        OnExecutionTimeChanged();
-      }
+      get { return executionTime + Optimizers.Aggregate(TimeSpan.Zero, (a, x) => a + x.ExecutionTime); }
     }
 
@@ -249,9 +245,6 @@
       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() {
@@ -334,5 +327,4 @@
     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);
@@ -345,5 +337,4 @@
     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);
@@ -360,14 +351,4 @@
       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/GeneralizedQAP/HeuristicLab.Optimization/3.3/MetaOptimizers/TimeLimitRun.cs
===================================================================
--- /branches/GeneralizedQAP/HeuristicLab.Optimization/3.3/MetaOptimizers/TimeLimitRun.cs	(revision 15602)
+++ /branches/GeneralizedQAP/HeuristicLab.Optimization/3.3/MetaOptimizers/TimeLimitRun.cs	(revision 15603)
@@ -214,4 +214,7 @@
 
     private void Initialize() {
+      timer = new System.Timers.Timer();
+      timer.Interval = 50;
+      timer.Elapsed += Timer_Elapsed;
       if (algorithm != null) RegisterAlgorithmEvents();
       snapshotTimes.ItemsAdded += snapshotTimes_Changed;
@@ -255,4 +258,20 @@
     }
 
+    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() {
@@ -273,9 +292,6 @@
       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() {
@@ -285,4 +301,5 @@
     public event EventHandler Started;
     private void OnStarted() {
+      timer.Start();
       var handler = Started;
       if (handler != null) handler(this, EventArgs.Empty);
@@ -290,4 +307,5 @@
     public event EventHandler Paused;
     private void OnPaused() {
+      timer.Stop();
       var handler = Paused;
       if (handler != null) handler(this, EventArgs.Empty);
@@ -295,4 +313,5 @@
     public event EventHandler Stopped;
     private void OnStopped() {
+      timer.Stop();
       var handler = Stopped;
       if (handler != null) handler(this, EventArgs.Empty);
@@ -308,5 +327,4 @@
     private void RegisterAlgorithmEvents() {
       algorithm.ExceptionOccurred += Algorithm_ExceptionOccurred;
-      algorithm.ExecutionTimeChanged += Algorithm_ExecutionTimeChanged;
       algorithm.ExecutionStateChanged += Algorithm_ExecutionStateChanged;
       algorithm.Paused += Algorithm_Paused;
@@ -317,5 +335,4 @@
     private void DeregisterAlgorithmEvents() {
       algorithm.ExceptionOccurred -= Algorithm_ExceptionOccurred;
-      algorithm.ExecutionTimeChanged -= Algorithm_ExecutionTimeChanged;
       algorithm.ExecutionStateChanged -= Algorithm_ExecutionStateChanged;
       algorithm.Paused -= Algorithm_Paused;
@@ -326,16 +343,4 @@
     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) {
