Index: branches/HeuristicLab.DebugEngine/DebugEngine.cs
===================================================================
--- branches/HeuristicLab.DebugEngine/DebugEngine.cs	(revision 4827)
+++ branches/HeuristicLab.DebugEngine/DebugEngine.cs	(revision 4871)
@@ -21,8 +21,11 @@
 
 using System;
+using System.Linq;
 using System.Collections.Generic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Collections;
+using System.Threading;
 
 namespace HeuristicLab.DebugEngine {
@@ -30,22 +33,199 @@
   [StorableClass]
   [Item("Debug Engine", "Engine for debugging algorithms.")]
-  public class DebugEngine : Engine {
-    private IOperator currentOperator;
-
+  public class DebugEngine : Executable, IEngine {
+
+
+    #region Construction and Cloning
+    
     [StorableConstructor]
-    protected DebugEngine(bool deserializing) : base(deserializing) { }
-    protected DebugEngine(DebugEngine original, Cloner cloner) : base(original, cloner) { }
+    protected DebugEngine(bool deserializing) : base(deserializing) {
+      pausePending = stopPending = false;
+      timer = new System.Timers.Timer(100);
+      timer.AutoReset = true;
+      timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
+    }
+    protected DebugEngine(DebugEngine original, Cloner cloner) : base(original, cloner) {
+      if (original.ExecutionState == ExecutionState.Started) throw new InvalidOperationException(string.Format("Clone not allowed in execution state \"{0}\".", ExecutionState));
+      Log = cloner.Clone(original.Log);
+      ExecutionStack = cloner.Clone(original.ExecutionStack);
+      pausePending = original.pausePending;
+      stopPending = original.stopPending;
+      timer = new System.Timers.Timer(100);
+      timer.AutoReset = true;
+      timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
+      this.currentOperation = cloner.Clone(original.currentOperation);
+      this.currentOperator = cloner.Clone(original.currentOperator);
+    }
     public DebugEngine()
       : base() {
-    }
-
-    public new Stack<IOperation> ExecutionStack {
-      get { return base.ExecutionStack; }
-    }
-
-    public IAtomicOperation CurrentOperation { get; private set; }
+      Log = new Log();
+      ExecutionStack = new ExecutionStack();
+      pausePending = stopPending = false;
+      timer = new System.Timers.Timer(100);
+      timer.AutoReset = true;
+      timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
+    }
 
     public override IDeepCloneable Clone(Cloner cloner) {
       return new DebugEngine(this, cloner);
+    }
+
+    #endregion
+
+    #region Fields and Properties
+
+    [Storable]
+    public ILog Log { get; protected set; }
+
+    [Storable]
+    public ExecutionStack ExecutionStack { get; protected set; }
+
+    private bool pausePending, stopPending;
+    private DateTime lastUpdateTime;
+    private System.Timers.Timer timer;
+      
+    [Storable]
+    private IOperator currentOperator;
+
+    [Storable]
+    private bool ignoreNextBreakpoint;
+
+    [Storable]
+    private IOperation currentOperation;
+    public virtual IOperation CurrentOperation {
+      get { return currentOperation; }
+      private set {
+        if (value == currentOperation)
+          return;
+        currentOperation = value;
+        OnOperationChanged(value);
+      }
+    }
+
+    public virtual IAtomicOperation CurrentAtomicOperation {
+      get { return CurrentOperation as IAtomicOperation; }
+    }
+
+    public virtual IExecutionContext CurrentExecutionContext {
+      get { return CurrentOperation as IExecutionContext;  }
+    }
+
+    #endregion
+
+    #region Events
+
+    public event EventHandler<OperationChangedEventArgs> CurrentOperationChanged;
+
+    protected virtual void OnOperationChanged(IOperation newOperation) {
+      EventHandler<OperationChangedEventArgs> handler = CurrentOperationChanged;
+      if (handler != null) {
+        handler(this, new OperationChangedEventArgs(newOperation));
+      }
+    }
+
+    #endregion
+
+    #region Std Methods
+    public sealed override void Prepare() {
+      base.Prepare();
+      ExecutionStack.Clear();
+      ignoreNextBreakpoint = false;
+      CurrentOperation = null;
+      OnPrepared();
+    }
+    public void Prepare(IOperation initialOperation) {
+      base.Prepare();
+      ExecutionStack.Clear();
+      if (initialOperation != null)
+        ExecutionStack.Add(initialOperation);
+      ignoreNextBreakpoint = false;
+      CurrentOperation = null;
+      OnPrepared();
+    }
+    protected override void OnPrepared() {
+      Log.LogMessage("Engine prepared");
+      base.OnPrepared();
+    }
+
+    public virtual void Step() {
+      OnStarted();
+      lastUpdateTime = DateTime.Now;
+      ignoreNextBreakpoint = true;
+      timer.Start();
+      ProcessNextOperation();      
+      timer.Stop();
+      ExecutionTime += DateTime.Now - lastUpdateTime;
+      ignoreNextBreakpoint = false;
+      OnPaused();
+    }
+
+    public override void Start() {
+      base.Start();
+      CurrentOperation = null;
+      ThreadPool.QueueUserWorkItem(new WaitCallback(Run), null);
+    }
+    
+    protected override void OnStarted() {
+      Log.LogMessage("Engine started");
+      base.OnStarted();
+    }
+
+    public override void Pause() {
+      base.Pause();
+      pausePending = true;
+      if (currentOperator != null) currentOperator.Abort();
+    }
+
+    protected override void OnPaused() {
+      Log.LogMessage("Engine paused");
+      base.OnPaused();
+    }
+
+    public override void Stop() {
+      CurrentOperation = null;
+      base.Stop();
+      stopPending = true;
+      if (currentOperator != null) currentOperator.Abort();
+      ignoreNextBreakpoint = false;
+      if (ExecutionState == ExecutionState.Paused) OnStopped();
+    }
+    
+    protected override void OnStopped() {
+      Log.LogMessage("Engine stopped");
+      base.OnStopped();
+    }
+
+    protected override void OnExceptionOccurred(Exception exception) {
+      Log.LogException(exception);
+      base.OnExceptionOccurred(exception);
+    }
+
+    private void Run(object state) {
+      OnStarted();
+      pausePending = stopPending = false;
+
+      lastUpdateTime = DateTime.Now;
+      timer.Start();
+      while (!pausePending && !stopPending && CanContinue) {
+        ProcessNextOperation();
+      }
+      timer.Stop();
+      ExecutionTime += DateTime.Now - lastUpdateTime;
+
+      if (pausePending) OnPaused();
+      else OnStopped();
+    }
+
+    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
+      DateTime now = DateTime.Now;
+      ExecutionTime += now - lastUpdateTime;
+      lastUpdateTime = now;
+    }
+    #endregion
+
+    #region Methods
+
+    public virtual bool CanContinue {
+      get { return CurrentOperation != null || ExecutionStack.Count > 0; }
     }
 
@@ -57,59 +237,66 @@
     /// is pushed on the stack again.<br/>
     /// If the execution was successful <see cref="EngineBase.OnOperationExecuted"/> is called.</remarks>
-    protected override void ProcessNextOperation() {
-      currentOperator = null;
-      IOperation next = ExecutionStack.Pop();
-      OperationCollection coll = next as OperationCollection;
-      while (coll != null) {
-        Log.LogMessage("Expanding OperationCollection");
-        for (int i = coll.Count - 1; i >= 0; i--) {
-          ExecutionStack.Push(coll[i]);
+    protected virtual void ProcessNextOperation() {
+      try {
+        IAtomicOperation atomicOperation = CurrentOperation as IAtomicOperation;
+        OperationCollection operations = CurrentOperation as OperationCollection;
+        if (atomicOperation != null && operations != null)
+          throw new InvalidOperationException("Current operation is both atomic and an operation collection");
+
+        if (atomicOperation != null) {
+          Log.LogMessage(string.Format("Performing atomic operation {0}", Name(atomicOperation)));
+          PerformAtomicOperation(atomicOperation);
+        } else if (operations != null) {
+          Log.LogMessage("Expanding operation collection");
+          ExpandOperationCollection(operations);
+        } else if (ExecutionStack.Count > 0) {
+          Log.LogMessage("Poping execution stack");
+          CurrentOperation = ExecutionStack.Last();
+          ExecutionStack.RemoveAt(ExecutionStack.Count - 1);
+        } else {
+          Log.LogMessage("Nothing to do");
         }
-        next = ExecutionStack.Count > 0 ? ExecutionStack.Pop() : null;
-        coll = next as OperationCollection;
-      }
-      IAtomicOperation operation = next as IAtomicOperation;
+      } catch (Exception x) {
+        OnExceptionOccurred(x);
+      }
+    }
+
+    protected virtual void PerformAtomicOperation(IAtomicOperation operation) {
       if (operation != null) {
-        Log.LogMessage("Preparing IAtomicOperation");
+        if (operation.Operator.Breakpoint) {
+          if (ignoreNextBreakpoint) {
+            ignoreNextBreakpoint = false;
+          } else {
+            ignoreNextBreakpoint = true;
+            Log.LogMessage(string.Format("Breaking before: {0}", Name(operation)));
+            Pause();
+            return;
+          }
+        }
         try {
           currentOperator = operation.Operator;
-          CurrentOperation = operation;
-          if (operation.Operator.Breakpoint) {
-            Log.LogMessage(string.Format("Breakpoint: Before {0}", operation.Operator.Name != string.Empty ? operation.Operator.Name : operation.Operator.ItemName));
-            Pause();
+          IOperation successor = operation.Operator.Execute((IExecutionContext)operation);
+          CurrentOperation = null;
+          currentOperator = null;
+          if (successor != null) {
+            ExecutionStack.Add(successor);
           }
-          Log.LogMessage("Executing IAtomicOperation");
-          ExecutionStack.Push(operation.Operator.Execute((IExecutionContext)operation));
         } catch (Exception ex) {
           OnExceptionOccurred(new OperatorExecutionException(operation.Operator, ex));
           Pause();
         }
-      } else {
-        Log.LogMessage("Nothing to do");
-        CurrentOperation = null;
-      }
-    }
-
-    public override void Pause() {
-      base.Pause();
-      if (currentOperator != null) currentOperator.Abort();
-    }
-    public override void Stop() {
-      base.Stop();
-      if (currentOperator != null) currentOperator.Abort();
-    }
-
-    public virtual void Step() {
-      OnStarted();
-      var lastUpdateTime = DateTime.Now;
-      if (ExecutionStack.Count > 0) {
-        while (ExecutionStack.Count > 0 && ExecutionStack.Peek() == null)
-          ExecutionStack.Pop();
-        if (ExecutionStack.Count > 0)
-          ProcessNextOperation();
-      }
-      ExecutionTime += DateTime.Now - lastUpdateTime;
-      OnPaused();
-    }
+      }
+    }
+
+    protected virtual void ExpandOperationCollection(OperationCollection operations) {
+      ExecutionStack.AddRange(operations.Reverse());
+      CurrentOperation = null;
+    }
+
+    protected virtual string Name(IAtomicOperation operation) {
+      return string.IsNullOrEmpty(operation.Operator.Name) ? operation.Operator.ItemName : operation.Operator.Name;
+    }
+
+    #endregion
   }
 }
Index: branches/HeuristicLab.DebugEngine/DebugEngineView.Designer.cs
===================================================================
--- branches/HeuristicLab.DebugEngine/DebugEngineView.Designer.cs	(revision 4827)
+++ branches/HeuristicLab.DebugEngine/DebugEngineView.Designer.cs	(revision 4871)
@@ -49,19 +49,18 @@
       this.label1 = new System.Windows.Forms.Label();
       this.executionTimeTextBox = new System.Windows.Forms.TextBox();
+      this.executionStackView = new HeuristicLab.DebugEngine.ExecutionStackView();
       this.logView = new HeuristicLab.Core.Views.LogView();
       this.splitContainer1 = new System.Windows.Forms.SplitContainer();
-      this.executionStackTreeView = new System.Windows.Forms.TreeView();
-      this.label2 = new System.Windows.Forms.Label();
       this.splitContainer2 = new System.Windows.Forms.SplitContainer();
+      this.splitContainer3 = new System.Windows.Forms.SplitContainer();
+      this.parameterCollectionView = new HeuristicLab.Core.Views.ParameterCollectionView();
+      this.label3 = new System.Windows.Forms.Label();
+      this.scopeTreeView = new System.Windows.Forms.TreeView();
       this.label4 = new System.Windows.Forms.Label();
       this.operationTextBox = new System.Windows.Forms.TextBox();
-      this.label3 = new System.Windows.Forms.Label();
-      this.scopeTreeView = new System.Windows.Forms.TreeView();
       this.stepButton = new System.Windows.Forms.Button();
       this.updateButton = new System.Windows.Forms.Button();
       this.toolTip = new System.Windows.Forms.ToolTip(this.components);
       this.parentButton = new System.Windows.Forms.Button();
-      this.splitContainer3 = new System.Windows.Forms.SplitContainer();
-      this.parameterCollectionView = new HeuristicLab.Core.Views.ParameterCollectionView();
       this.splitContainer1.Panel1.SuspendLayout();
       this.splitContainer1.Panel2.SuspendLayout();
@@ -94,4 +93,15 @@
       this.executionTimeTextBox.TabIndex = 1;
       // 
+      // executionStackView
+      // 
+      this.executionStackView.Caption = "Execution Stack View";
+      this.executionStackView.Content = null;
+      this.executionStackView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.executionStackView.Location = new System.Drawing.Point(0, 0);
+      this.executionStackView.Name = "executionStackView";
+      this.executionStackView.ReadOnly = false;
+      this.executionStackView.Size = new System.Drawing.Size(433, 262);
+      this.executionStackView.TabIndex = 0;
+      // 
       // logView
       // 
@@ -114,6 +124,5 @@
       // splitContainer1.Panel1
       // 
-      this.splitContainer1.Panel1.Controls.Add(this.executionStackTreeView);
-      this.splitContainer1.Panel1.Controls.Add(this.label2);
+      this.splitContainer1.Panel1.Controls.Add(this.executionStackView);
       // 
       // splitContainer1.Panel2
@@ -123,25 +132,4 @@
       this.splitContainer1.SplitterDistance = 262;
       this.splitContainer1.TabIndex = 3;
-      // 
-      // executionStackTreeView
-      // 
-      this.executionStackTreeView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.executionStackTreeView.Location = new System.Drawing.Point(3, 16);
-      this.executionStackTreeView.Name = "executionStackTreeView";
-      this.executionStackTreeView.ShowNodeToolTips = true;
-      this.executionStackTreeView.Size = new System.Drawing.Size(427, 243);
-      this.executionStackTreeView.TabIndex = 2;
-      this.executionStackTreeView.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.executionStackTreeView_NodeMouseDoubleClick);
-      // 
-      // label2
-      // 
-      this.label2.AutoSize = true;
-      this.label2.Location = new System.Drawing.Point(3, 0);
-      this.label2.Name = "label2";
-      this.label2.Size = new System.Drawing.Size(85, 13);
-      this.label2.TabIndex = 1;
-      this.label2.Text = "Execution Stack";
       // 
       // splitContainer2
@@ -166,20 +154,35 @@
       this.splitContainer2.TabIndex = 0;
       // 
-      // label4
-      // 
-      this.label4.AutoSize = true;
-      this.label4.Location = new System.Drawing.Point(3, 6);
-      this.label4.Name = "label4";
-      this.label4.Size = new System.Drawing.Size(56, 13);
-      this.label4.TabIndex = 3;
-      this.label4.Text = "Operation:";
-      // 
-      // operationTextBox
-      // 
-      this.operationTextBox.Location = new System.Drawing.Point(65, 3);
-      this.operationTextBox.Name = "operationTextBox";
-      this.operationTextBox.ReadOnly = true;
-      this.operationTextBox.Size = new System.Drawing.Size(267, 20);
-      this.operationTextBox.TabIndex = 2;
+      // splitContainer3
+      // 
+      this.splitContainer3.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitContainer3.Location = new System.Drawing.Point(3, 29);
+      this.splitContainer3.Name = "splitContainer3";
+      this.splitContainer3.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer3.Panel1
+      // 
+      this.splitContainer3.Panel1.Controls.Add(this.parameterCollectionView);
+      // 
+      // splitContainer3.Panel2
+      // 
+      this.splitContainer3.Panel2.Controls.Add(this.label3);
+      this.splitContainer3.Panel2.Controls.Add(this.scopeTreeView);
+      this.splitContainer3.Size = new System.Drawing.Size(423, 471);
+      this.splitContainer3.SplitterDistance = 235;
+      this.splitContainer3.TabIndex = 4;
+      // 
+      // parameterCollectionView
+      // 
+      this.parameterCollectionView.Caption = "ParameterCollection View";
+      this.parameterCollectionView.Content = null;
+      this.parameterCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.parameterCollectionView.Location = new System.Drawing.Point(0, 0);
+      this.parameterCollectionView.Name = "parameterCollectionView";
+      this.parameterCollectionView.ReadOnly = false;
+      this.parameterCollectionView.Size = new System.Drawing.Size(423, 235);
+      this.parameterCollectionView.TabIndex = 0;
       // 
       // label3
@@ -204,4 +207,21 @@
       this.scopeTreeView.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.scopeTreeView_NodeMouseDoubleClick);
       // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(3, 6);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(56, 13);
+      this.label4.TabIndex = 3;
+      this.label4.Text = "Operation:";
+      // 
+      // operationTextBox
+      // 
+      this.operationTextBox.Location = new System.Drawing.Point(65, 3);
+      this.operationTextBox.Name = "operationTextBox";
+      this.operationTextBox.ReadOnly = true;
+      this.operationTextBox.Size = new System.Drawing.Size(267, 20);
+      this.operationTextBox.TabIndex = 2;
+      // 
       // stepButton
       // 
@@ -239,36 +259,4 @@
       this.parentButton.UseVisualStyleBackColor = true;
       this.parentButton.Click += new System.EventHandler(this.parentButton_Click);
-      // 
-      // splitContainer3
-      // 
-      this.splitContainer3.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.splitContainer3.Location = new System.Drawing.Point(3, 29);
-      this.splitContainer3.Name = "splitContainer3";
-      this.splitContainer3.Orientation = System.Windows.Forms.Orientation.Horizontal;
-      // 
-      // splitContainer3.Panel1
-      // 
-      this.splitContainer3.Panel1.Controls.Add(this.parameterCollectionView);
-      // 
-      // splitContainer3.Panel2
-      // 
-      this.splitContainer3.Panel2.Controls.Add(this.label3);
-      this.splitContainer3.Panel2.Controls.Add(this.scopeTreeView);
-      this.splitContainer3.Size = new System.Drawing.Size(423, 471);
-      this.splitContainer3.SplitterDistance = 235;
-      this.splitContainer3.TabIndex = 4;
-      // 
-      // parameterCollectionView
-      // 
-      this.parameterCollectionView.Caption = "ParameterCollection View";
-      this.parameterCollectionView.Content = null;
-      this.parameterCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.parameterCollectionView.Location = new System.Drawing.Point(0, 0);
-      this.parameterCollectionView.Name = "parameterCollectionView";
-      this.parameterCollectionView.ReadOnly = false;
-      this.parameterCollectionView.Size = new System.Drawing.Size(423, 235);
-      this.parameterCollectionView.TabIndex = 0;
       // 
       // DebugEngineView
@@ -284,5 +272,4 @@
       this.Size = new System.Drawing.Size(872, 538);
       this.splitContainer1.Panel1.ResumeLayout(false);
-      this.splitContainer1.Panel1.PerformLayout();
       this.splitContainer1.Panel2.ResumeLayout(false);
       this.splitContainer1.ResumeLayout(false);
@@ -307,8 +294,6 @@
     private System.Windows.Forms.SplitContainer splitContainer1;
     private System.Windows.Forms.SplitContainer splitContainer2;
-    private System.Windows.Forms.Label label2;
     private System.Windows.Forms.Label label3;
     private System.Windows.Forms.TreeView scopeTreeView;
-    private System.Windows.Forms.TreeView executionStackTreeView;
     private System.Windows.Forms.Button stepButton;
     private System.Windows.Forms.Button updateButton;
@@ -319,4 +304,5 @@
     private System.Windows.Forms.SplitContainer splitContainer3;
     private Core.Views.ParameterCollectionView parameterCollectionView;
+    private HeuristicLab.DebugEngine.ExecutionStackView executionStackView;
 
   }
Index: branches/HeuristicLab.DebugEngine/DebugEngineView.cs
===================================================================
--- branches/HeuristicLab.DebugEngine/DebugEngineView.cs	(revision 4827)
+++ branches/HeuristicLab.DebugEngine/DebugEngineView.cs	(revision 4871)
@@ -30,10 +30,14 @@
 using HeuristicLab.Persistence.Auxiliary;
 namespace HeuristicLab.DebugEngine {
+
   /// <summary>
-  /// Base class for editors of engines.
+  /// Engine espcially for debugging
   /// </summary>
   [View("DebugEngine View")]
   [Content(typeof(DebugEngine), true)]
   public partial class DebugEngineView : ItemView {
+
+    #region Basics
+
     /// <summary>
     /// Gets or sets the current engine.
@@ -46,5 +50,5 @@
 
     /// <summary>
-    /// Initializes a new instance of <see cref="EngineBaseEditor"/>.
+    /// Initializes a new instance of <see cref="DebugEngineView"/>.
     /// </summary>
     public DebugEngineView() {
@@ -60,4 +64,5 @@
     /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
     protected override void DeregisterContentEvents() {
+      Content.CurrentOperationChanged -= new EventHandler<OperationChangedEventArgs>(Content_CurrentOperationChanged);
       Content.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
       Content.ExecutionStateChanged -= new EventHandler(Content_ExecutionStateChanged);
@@ -73,4 +78,5 @@
       Content.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
       Content.ExecutionStateChanged += new EventHandler(Content_ExecutionStateChanged);
+      Content.CurrentOperationChanged += new EventHandler<OperationChangedEventArgs>(Content_CurrentOperationChanged);
     }
 
@@ -84,7 +90,9 @@
         logView.Content = null;
         executionTimeTextBox.Text = "-";
+        executionStackView.Content = null;
       } else {
         logView.Content = Content.Log;
         executionTimeTextBox.Text = Content.ExecutionTime.ToString();
+        executionStackView.Content = Content.ExecutionStack;
       }
     }
@@ -101,4 +109,6 @@
     }
 
+    #endregion
+
     protected virtual void Content_ExecutionTimeChanged(object sender, EventArgs e) {
       if (InvokeRequired)
@@ -109,19 +119,21 @@
 
     void Content_ExecutionStateChanged(object sender, EventArgs e) {
-      switch (Content.ExecutionState) {
-        case ExecutionState.Paused:
-        case ExecutionState.Stopped:
-        case ExecutionState.Prepared:
-          UpdateView(); break;
-      }
-    }
-
-    protected virtual void UpdateView() {
-      if (InvokeRequired) {
-        Invoke(new Action(UpdateView));
-      } else {
-        UpdateExecutionStack();
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ExecutionStateChanged), sender, e);
+      else {
+        switch (Content.ExecutionState) {
+          case ExecutionState.Started: executionStackView.SuspendUpdate(); break;
+          default: executionStackView.ResumeUpdate(); break;
+        }
+      }
+    }
+
+    #region Current Operation
+
+    void Content_CurrentOperationChanged(object sender, OperationChangedEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler<OperationChangedEventArgs>(Content_CurrentOperationChanged), sender, e);
+      else
         SetOperation(Content.CurrentOperation);
-      }
     }
 
@@ -133,5 +145,5 @@
       if (atomicOperation != null && atomicOperation.Operator != null) {
         operationTextBox.Text = string.Format("Atomic {0}", atomicOperation.Operator.Name);
-        toolTip.SetToolTip(operationTextBox, TypeName(atomicOperation.Operator));
+        toolTip.SetToolTip(operationTextBox, Utils.TypeName(atomicOperation.Operator));
       }
       OperationCollection operationCollection = operation as OperationCollection;
@@ -152,14 +164,4 @@
     }
 
-    private void UpdateExecutionStack() {
-      executionStackTreeView.BeginUpdate();
-      executionStackTreeView.Nodes.Clear();
-      AddOperations(executionStackTreeView.Nodes, Content.ExecutionStack.ToArray());
-      executionStackTreeView.ExpandAll();
-      if (executionStackTreeView.Nodes.Count > 0)
-        executionStackTreeView.TopNode = executionStackTreeView.Nodes[0];
-      executionStackTreeView.EndUpdate();
-    }
-
     private void UpdateScope(IScope scope) {
       scopeTreeView.BeginUpdate();
@@ -174,38 +176,7 @@
     }
 
-    private string TypeName(object obj) {
-      if (obj == null)
-        return "null";
-      return TypeNameParser.Parse(obj.GetType().ToString()).GetTypeNameInCode(true);
-    }
-
-    private void AddOperations(TreeNodeCollection nodes, IEnumerable<IOperation> operations) {
-      foreach (IOperation op in operations) {
-        if (op is IAtomicOperation) {
-          IAtomicOperation atom = op as IAtomicOperation;
-          TreeNode node = nodes.Add(atom.Operator.Name);
-          node.Tag = atom;
-          node.ToolTipText = TypeName(atom);
-          node.ImageKey = "AtomicOperation";
-          if (atom.Operator.Breakpoint)
-            node.ForeColor = Color.Red;
-          foreach (var param in atom.Operator.Parameters) {
-            string typeName = "null";
-            TreeNode paramNode = node.Nodes.Add(string.Format("Param {0} = {1}", param.Name, GetApproximateValue(param, ref typeName)));
-            paramNode.Tag = param;
-            paramNode.ToolTipText = string.Format("{0} = {1}", TypeName(param), typeName);
-            paramNode.ImageKey = "Parameter";
-          }
-        } else if (op is OperationCollection) {
-          OperationCollection ops = op as OperationCollection;
-          TreeNode node = executionStackTreeView.Nodes.Add(string.Format("{0} Operations", ops.Count));
-          node.Tag = op;
-          node.ToolTipText = TypeName(ops);
-          node.ImageKey = "OperationCollection";
-          AddOperations(node.Nodes, ops);
-        }
-      }
-    }
-
+   
+
+    /*
     private string GetApproximateValue(IParameter param, ref string typeName) {
       string valueString = "<none>";
@@ -229,8 +200,9 @@
       return valueString;
     }
+     */
 
     private void AddScope(TreeNodeCollection nodes, IScope scope) {
       TreeNode node = nodes.Add(scope.Name);
-      if (Content.CurrentOperation != null && Content.CurrentOperation.Scope == scope) {
+      if (Content.CurrentAtomicOperation != null && Content.CurrentAtomicOperation.Scope == scope) {
         node.ForeColor = Color.Red;
         node.BackColor = Color.LightGray;
@@ -239,8 +211,18 @@
         TreeNode varNode = node.Nodes.Add(string.Format("{0}={1}", var.Name, var.Value.ToString()));
         varNode.Tag = var.Value;
-        varNode.ToolTipText = TypeName(var.Value);
+        varNode.ToolTipText = Utils.TypeName(var.Value);
       }
       foreach (var subScope in scope.SubScopes) {
         AddScope(node.Nodes, subScope);
+      }
+    }
+
+    #endregion
+
+    protected virtual void UpdateView() {
+      if (InvokeRequired) {
+        Invoke(new Action(UpdateView));
+      } else {
+        SetOperation(Content.CurrentOperation);
       }
     }
@@ -249,22 +231,4 @@
       Content.Step();
       UpdateView();
-    }
-
-    private void executionStackTreeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) {
-      if (e.Node != null) {
-        IAtomicOperation op = e.Node.Tag as IAtomicOperation;
-        if (op != null) {
-          op.Operator.Breakpoint = !op.Operator.Breakpoint;
-          if (op.Operator.Breakpoint) {
-            e.Node.ForeColor = Color.Red;
-          } else {
-            e.Node.ForeColor = Color.Black;
-          }
-          executionStackTreeView.SelectedNode = null;
-        }
-        IParameter param = e.Node.Tag as IParameter;
-        if (param != null)
-          MainFormManager.MainForm.ShowContent(param);
-      }
     }
 
Index: branches/HeuristicLab.DebugEngine/DebugEngineView.resx
===================================================================
--- branches/HeuristicLab.DebugEngine/DebugEngineView.resx	(revision 4827)
+++ branches/HeuristicLab.DebugEngine/DebugEngineView.resx	(revision 4871)
@@ -122,6 +122,6 @@
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALEAAA
-        CxABrSO9dQAAARBJREFUOE9j+P//PwM6Tuh5woxNHJsYhmaQIqABMkDMRIwhWA0onPX8f/zkt0rEGILV
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALDgAA
+        Cw4BQL7hQQAAARBJREFUOE9j+P//PwM6Tuh5woxNHJsYhmaQIqABMkDMRIwhWA0onPX8f/zkt0rEGILV
         gNyZz/4ndN/7HzfhtQYh72A1IGPK0//z9v/+H9Rw8zXQAFt8huAKg/+z9/3637n173+30sv/gQbY4zIE
         qwGRXY/+T9n263/J0r//E6b//W+TexanIVgNCGx++L917XuwZuOSL/+lo6/9N45c9t+h6Gw8ukuwGuBR
@@ -137,16 +137,16 @@
     <value>
         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
-        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
+        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
 </value>
   </data>
@@ -154,10 +154,10 @@
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALEQAA
-        CxEBf2RfkQAAAN5JREFUOE9j/P//PwNFAGQALuxeeskYnzzYclwKVH3nSpXNefEfaEgEPkOwGgDTPG/f
-        3/+GYYv+G8ds8MVlCIYByJrz5/7475R35L9WwAKchqAYgKy5dd2//5E9n/57lF38b5+1/7+G31yshqAY
-        APJz8cyn/0F07Yr//+Mm//nvX3/vv2bI6v9Aw/+reE4D+gQ10LGGAcgAkAtgBqj7L8LQCDMIpwGTt//9
-        nzvvL9gFqt6zSDcAFAMVSwfSgGWHf1PmApABoCgEYWX3SaSHAUgTMiY6JRLKPESlA1IMAQAvnrIcTgHP
-        egAAAABJRU5ErkJggg==
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALDwAA
+        Cw8BkvkDpQAAANpJREFUOE9j+P//PwMlGK9m99JLxoQMx2mAqu9cqbI5L/4DDYnAZwhWA2Ca5+37+98w
+        bNF/45gNvrgMwTAAWXP+3B//nfKO/NcKWIDTEBQDkDW3rvv3P7Ln03+Psov/7bP2/9fwm4vVEBQDQH4u
+        nvn0P4iuXfH/f9zkP//96+/91wxZ/R9o+H8Vz2lAn6DGGtYwABkAcgHMAHX/RRgaYQbhNGDy9r//c+f9
+        BbtA1XsW6QaAYqBi6UAasOzwb8pcADIAFIUgrOw+ifQwAGlCxkSnREKZh6h0QIohAFsI3u6Zj7KhAAAA
+        AElFTkSuQmCC
 </value>
   </data>
Index: branches/HeuristicLab.DebugEngine/ExecutionStack.cs
===================================================================
--- branches/HeuristicLab.DebugEngine/ExecutionStack.cs	(revision 4871)
+++ branches/HeuristicLab.DebugEngine/ExecutionStack.cs	(revision 4871)
@@ -0,0 +1,31 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DebugEngine {
+
+  public class ExecutionStack : ObservableList<IOperation>, IContent, IDeepCloneable {
+
+    public ExecutionStack() : base() { }
+    public ExecutionStack(int capacity) : base(capacity) { }
+    public ExecutionStack(IEnumerable<IOperation> collection) : base(collection) { }
+
+    [StorableConstructor]
+    protected ExecutionStack(bool deserializing) : base(deserializing) { }
+    protected ExecutionStack(ExecutionStack original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+      AddRange(original.Select(op => cloner.Clone(op)));
+    }
+    public object Clone() {
+      return Clone(new Cloner());
+    }
+    public virtual IDeepCloneable Clone(Cloner cloner) {
+      return new ExecutionStack(this, cloner);
+    }
+  }
+}
Index: branches/HeuristicLab.DebugEngine/ExecutionStackView.Designer.cs
===================================================================
--- branches/HeuristicLab.DebugEngine/ExecutionStackView.Designer.cs	(revision 4871)
+++ branches/HeuristicLab.DebugEngine/ExecutionStackView.Designer.cs	(revision 4871)
@@ -0,0 +1,68 @@
+﻿namespace HeuristicLab.DebugEngine {
+  partial class ExecutionStackView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.treeView = new System.Windows.Forms.TreeView();
+      this.groupBox = new System.Windows.Forms.GroupBox();
+      this.groupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // treeView
+      // 
+      this.treeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.treeView.Location = new System.Drawing.Point(3, 16);
+      this.treeView.Name = "treeView";
+      this.treeView.Size = new System.Drawing.Size(303, 261);
+      this.treeView.TabIndex = 0;
+      this.treeView.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView_NodeMouseDoubleClick);
+      // 
+      // groupBox
+      // 
+      this.groupBox.Controls.Add(this.treeView);
+      this.groupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.groupBox.Location = new System.Drawing.Point(0, 0);
+      this.groupBox.Name = "groupBox";
+      this.groupBox.Size = new System.Drawing.Size(309, 280);
+      this.groupBox.TabIndex = 1;
+      this.groupBox.TabStop = false;
+      this.groupBox.Text = "Execution Stack";
+      // 
+      // ExecutionStackView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.groupBox);
+      this.Name = "ExecutionStackView";
+      this.Size = new System.Drawing.Size(309, 280);
+      this.groupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TreeView treeView;
+    private System.Windows.Forms.GroupBox groupBox;
+  }
+}
Index: branches/HeuristicLab.DebugEngine/ExecutionStackView.cs
===================================================================
--- branches/HeuristicLab.DebugEngine/ExecutionStackView.cs	(revision 4871)
+++ branches/HeuristicLab.DebugEngine/ExecutionStackView.cs	(revision 4871)
@@ -0,0 +1,145 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.Core;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.DebugEngine {
+
+  [View("Execution Stack View")]
+  [Content(typeof(ExecutionStack), IsDefaultView = true)]
+  public partial class ExecutionStackView : AsynchronousContentView {
+    public new ExecutionStack Content {
+      get { return (ExecutionStack)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ExecutionStackView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.CollectionReset -= Content_Changed;
+      Content.ItemsAdded -= Content_Changed;
+      Content.ItemsRemoved -= Content_Changed;
+      Content.ItemsMoved -= Content_Changed;
+      Content.ItemsReplaced -= Content_Changed;
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.CollectionReset += Content_Changed;
+      Content.ItemsAdded += Content_Changed;
+      Content.ItemsRemoved += Content_Changed;
+      Content.ItemsMoved += Content_Changed;
+      Content.ItemsReplaced += Content_Changed;
+    }
+
+    #region Event Handlers (Content)
+    void Content_Changed(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOperation>> e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler<CollectionItemsChangedEventArgs<IndexedItem<IOperation>>>(Content_Changed), sender, e);
+      else
+        UpdateExecutionStack();
+    }
+    
+
+    private void UpdateExecutionStack() {
+      if (!suspended) {
+        treeView.BeginUpdate();
+        treeView.Nodes.Clear();
+        int totalNodes = AddStackOperations(treeView.Nodes, ((IEnumerable<IOperation>)Content).Reverse());
+        if (treeView.Nodes.Count > 0)
+          treeView.TopNode = treeView.Nodes[0];
+        treeView.EndUpdate();
+        groupBox.Text = string.Format("Execution Stack ({0})", totalNodes);
+      } else {
+        groupBox.Text = string.Format("Execution Stack ({0})", CountOperations(Content));
+      }
+    }
+
+    private int CountOperations(IEnumerable<IOperation> operations) {
+      int count = 0;
+      foreach (IOperation op in operations) {
+        count++;
+        OperationCollection ops = op as OperationCollection;
+        if (ops != null)
+          count += CountOperations(ops);
+      }
+      return count;
+    }
+
+    private int AddStackOperations(TreeNodeCollection nodes, IEnumerable<IOperation> operations) {
+      int count = 0;
+      foreach (IOperation op in operations) {
+        if (op is IAtomicOperation) {
+          IAtomicOperation atom = op as IAtomicOperation;
+          TreeNode node = nodes.Add(atom.Operator.Name);
+          node.Tag = atom;
+          node.ToolTipText = Utils.TypeName(atom.Operator);
+          node.ImageKey = "AtomicOperation";
+          if (atom.Operator.Breakpoint)
+            node.ForeColor = Color.Red;
+          count++;
+        } else if (op is OperationCollection) {
+          OperationCollection ops = op as OperationCollection;
+          TreeNode node = treeView.Nodes.Add(
+            string.Format("{0} Operation{1}", ops.Count, ops.Count == 1 ? string.Empty : "s"));
+          node.Tag = op;
+          node.ToolTipText = Utils.TypeName(ops);
+          node.ImageKey = "OperationCollection";
+          count += AddStackOperations(node.Nodes, ops);
+        }
+      }
+      return count;
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        treeView.Nodes.Clear();
+      } else {
+        UpdateExecutionStack();
+      }
+    }
+
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+    }
+
+    
+
+    #region Event Handlers (child controls)
+    private void treeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) {
+      if (e.Node != null) {
+        IAtomicOperation op = e.Node.Tag as IAtomicOperation;
+        if (op != null)
+          MainFormManager.MainForm.ShowContent(op.Operator);
+      }
+    }
+    #endregion
+
+    #region Suspension
+    private bool suspended = false;
+    public virtual void SuspendUpdate() {
+      suspended = true;
+      treeView.Nodes.Clear();
+    }
+
+    public virtual void ResumeUpdate() {
+      suspended = false;
+      UpdateExecutionStack();
+    }
+    #endregion
+  }
+}
Index: branches/HeuristicLab.DebugEngine/ExecutionStackView.resx
===================================================================
--- branches/HeuristicLab.DebugEngine/ExecutionStackView.resx	(revision 4871)
+++ branches/HeuristicLab.DebugEngine/ExecutionStackView.resx	(revision 4871)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: branches/HeuristicLab.DebugEngine/HeuristicLab.DebugEngine.csproj
===================================================================
--- branches/HeuristicLab.DebugEngine/HeuristicLab.DebugEngine.csproj	(revision 4827)
+++ branches/HeuristicLab.DebugEngine/HeuristicLab.DebugEngine.csproj	(revision 4871)
@@ -125,9 +125,21 @@
       <DependentUpon>DebugEngineView.cs</DependentUpon>
     </Compile>
+    <Compile Include="ExecutionStack.cs" />
+    <Compile Include="ExecutionStackView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ExecutionStackView.Designer.cs">
+      <DependentUpon>ExecutionStackView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OperationChangedEventArgs.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Utils.cs" />
   </ItemGroup>
   <ItemGroup>
     <EmbeddedResource Include="DebugEngineView.resx">
       <DependentUpon>DebugEngineView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ExecutionStackView.resx">
+      <DependentUpon>ExecutionStackView.cs</DependentUpon>
     </EmbeddedResource>
   </ItemGroup>
Index: branches/HeuristicLab.DebugEngine/OperationChangedEventArgs.cs
===================================================================
--- branches/HeuristicLab.DebugEngine/OperationChangedEventArgs.cs	(revision 4871)
+++ branches/HeuristicLab.DebugEngine/OperationChangedEventArgs.cs	(revision 4871)
@@ -0,0 +1,14 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.DebugEngine {
+  public class OperationChangedEventArgs : EventArgs {
+    public IOperation NewOperation { get; protected set; }
+    public OperationChangedEventArgs(IOperation newOperation) {
+      NewOperation = newOperation;
+    }
+  }
+}
Index: branches/HeuristicLab.DebugEngine/Utils.cs
===================================================================
--- branches/HeuristicLab.DebugEngine/Utils.cs	(revision 4871)
+++ branches/HeuristicLab.DebugEngine/Utils.cs	(revision 4871)
@@ -0,0 +1,15 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Persistence.Auxiliary;
+
+namespace HeuristicLab.DebugEngine {
+  public static class Utils {
+    public static string TypeName(object obj) {
+      if (obj == null)
+        return "null";
+      return TypeNameParser.Parse(obj.GetType().ToString()).GetTypeNameInCode(true);
+    }
+  }
+}
