Index: trunk/sources/HeuristicLab.Common.Resources/3.2/HeuristicLab.Common.Resources-3.2.csproj
===================================================================
--- trunk/sources/HeuristicLab.Common.Resources/3.2/HeuristicLab.Common.Resources-3.2.csproj	(revision 2686)
+++ trunk/sources/HeuristicLab.Common.Resources/3.2/HeuristicLab.Common.Resources-3.2.csproj	(revision 2687)
@@ -309,4 +309,7 @@
     <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Undo.png" />
   </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Windows.png" />
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
Index: trunk/sources/HeuristicLab.Common.Resources/3.2/VS2008ImageLibrary.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Common.Resources/3.2/VS2008ImageLibrary.Designer.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Common.Resources/3.2/VS2008ImageLibrary.Designer.cs	(revision 2687)
@@ -452,4 +452,11 @@
             }
         }
+        
+        public static System.Drawing.Bitmap Windows {
+            get {
+                object obj = ResourceManager.GetObject("Windows", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
     }
 }
Index: trunk/sources/HeuristicLab.Common.Resources/3.2/VS2008ImageLibrary.resx
===================================================================
--- trunk/sources/HeuristicLab.Common.Resources/3.2/VS2008ImageLibrary.resx	(revision 2686)
+++ trunk/sources/HeuristicLab.Common.Resources/3.2/VS2008ImageLibrary.resx	(revision 2687)
@@ -287,3 +287,6 @@
     <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_ValueType.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="Windows" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Windows.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
 </root>
Index: trunk/sources/HeuristicLab.Core.Views/3.3/EngineView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/EngineView.Designer.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/EngineView.Designer.cs	(revision 2687)
@@ -48,5 +48,4 @@
       this.executionTimeTextBox = new System.Windows.Forms.TextBox();
       this.executionTimeLabel = new System.Windows.Forms.Label();
-      this.splitContainer = new System.Windows.Forms.SplitContainer();
       this.operatorGraphView = new HeuristicLab.Core.Views.OperatorGraphView();
       this.scopeView = new HeuristicLab.Core.Views.ScopeView();
@@ -55,7 +54,10 @@
       this.startButton = new System.Windows.Forms.Button();
       this.toolTip = new System.Windows.Forms.ToolTip(this.components);
-      this.splitContainer.Panel1.SuspendLayout();
-      this.splitContainer.Panel2.SuspendLayout();
-      this.splitContainer.SuspendLayout();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.operatorGraphTabPage = new System.Windows.Forms.TabPage();
+      this.globalScopeTabPage = new System.Windows.Forms.TabPage();
+      this.tabControl.SuspendLayout();
+      this.operatorGraphTabPage.SuspendLayout();
+      this.globalScopeTabPage.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -63,9 +65,9 @@
       // 
       this.executionTimeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-      this.executionTimeTextBox.Location = new System.Drawing.Point(655, 620);
+      this.executionTimeTextBox.Location = new System.Drawing.Point(661, 620);
       this.executionTimeTextBox.Name = "executionTimeTextBox";
       this.executionTimeTextBox.ReadOnly = true;
       this.executionTimeTextBox.Size = new System.Drawing.Size(141, 20);
-      this.executionTimeTextBox.TabIndex = 4;
+      this.executionTimeTextBox.TabIndex = 5;
       // 
       // executionTimeLabel
@@ -73,28 +75,9 @@
       this.executionTimeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
       this.executionTimeLabel.AutoSize = true;
-      this.executionTimeLabel.Location = new System.Drawing.Point(566, 623);
+      this.executionTimeLabel.Location = new System.Drawing.Point(572, 623);
       this.executionTimeLabel.Name = "executionTimeLabel";
       this.executionTimeLabel.Size = new System.Drawing.Size(83, 13);
-      this.executionTimeLabel.TabIndex = 3;
+      this.executionTimeLabel.TabIndex = 4;
       this.executionTimeLabel.Text = "&Execution Time:";
-      // 
-      // splitContainer
-      // 
-      this.splitContainer.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.splitContainer.Location = new System.Drawing.Point(0, 0);
-      this.splitContainer.Name = "splitContainer";
-      // 
-      // splitContainer.Panel1
-      // 
-      this.splitContainer.Panel1.Controls.Add(this.operatorGraphView);
-      // 
-      // splitContainer.Panel2
-      // 
-      this.splitContainer.Panel2.Controls.Add(this.scopeView);
-      this.splitContainer.Size = new System.Drawing.Size(802, 611);
-      this.splitContainer.SplitterDistance = 401;
-      this.splitContainer.TabIndex = 0;
       // 
       // operatorGraphView
@@ -105,9 +88,9 @@
       this.operatorGraphView.Caption = "Operator Graph";
       this.operatorGraphView.Item = null;
-      this.operatorGraphView.Location = new System.Drawing.Point(3, 3);
+      this.operatorGraphView.Location = new System.Drawing.Point(6, 6);
       this.operatorGraphView.Name = "operatorGraphView";
       this.operatorGraphView.Object = null;
       this.operatorGraphView.OperatorGraph = null;
-      this.operatorGraphView.Size = new System.Drawing.Size(395, 605);
+      this.operatorGraphView.Size = new System.Drawing.Size(782, 573);
       this.operatorGraphView.TabIndex = 0;
       // 
@@ -119,9 +102,9 @@
       this.scopeView.Caption = "Scope";
       this.scopeView.Item = null;
-      this.scopeView.Location = new System.Drawing.Point(3, 3);
+      this.scopeView.Location = new System.Drawing.Point(6, 6);
       this.scopeView.Name = "scopeView";
       this.scopeView.Object = null;
       this.scopeView.Scope = null;
-      this.scopeView.Size = new System.Drawing.Size(391, 605);
+      this.scopeView.Size = new System.Drawing.Size(782, 573);
       this.scopeView.TabIndex = 0;
       // 
@@ -130,8 +113,8 @@
       this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
       this.resetButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Restart;
-      this.resetButton.Location = new System.Drawing.Point(63, 617);
+      this.resetButton.Location = new System.Drawing.Point(58, 617);
       this.resetButton.Name = "resetButton";
       this.resetButton.Size = new System.Drawing.Size(23, 23);
-      this.resetButton.TabIndex = 2;
+      this.resetButton.TabIndex = 3;
       this.toolTip.SetToolTip(this.resetButton, "Reset Engine");
       this.resetButton.UseVisualStyleBackColor = true;
@@ -143,8 +126,8 @@
       this.stopButton.Enabled = false;
       this.stopButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Stop;
-      this.stopButton.Location = new System.Drawing.Point(34, 617);
+      this.stopButton.Location = new System.Drawing.Point(29, 617);
       this.stopButton.Name = "stopButton";
       this.stopButton.Size = new System.Drawing.Size(23, 23);
-      this.stopButton.TabIndex = 1;
+      this.stopButton.TabIndex = 2;
       this.toolTip.SetToolTip(this.stopButton, "Stop Engine");
       this.stopButton.UseVisualStyleBackColor = true;
@@ -155,27 +138,62 @@
       this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
       this.startButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Play;
-      this.startButton.Location = new System.Drawing.Point(5, 617);
+      this.startButton.Location = new System.Drawing.Point(0, 617);
       this.startButton.Name = "startButton";
       this.startButton.Size = new System.Drawing.Size(23, 23);
-      this.startButton.TabIndex = 0;
+      this.startButton.TabIndex = 1;
       this.toolTip.SetToolTip(this.startButton, "Start Engine");
       this.startButton.UseVisualStyleBackColor = true;
       this.startButton.Click += new System.EventHandler(this.startButton_Click);
       // 
+      // tabControl
+      // 
+      this.tabControl.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.tabControl.Controls.Add(this.operatorGraphTabPage);
+      this.tabControl.Controls.Add(this.globalScopeTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 0);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(802, 611);
+      this.tabControl.TabIndex = 0;
+      // 
+      // operatorGraphTabPage
+      // 
+      this.operatorGraphTabPage.Controls.Add(this.operatorGraphView);
+      this.operatorGraphTabPage.Location = new System.Drawing.Point(4, 22);
+      this.operatorGraphTabPage.Name = "operatorGraphTabPage";
+      this.operatorGraphTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.operatorGraphTabPage.Size = new System.Drawing.Size(794, 585);
+      this.operatorGraphTabPage.TabIndex = 0;
+      this.operatorGraphTabPage.Text = "Operator Graph";
+      this.operatorGraphTabPage.UseVisualStyleBackColor = true;
+      // 
+      // globalScopeTabPage
+      // 
+      this.globalScopeTabPage.Controls.Add(this.scopeView);
+      this.globalScopeTabPage.Location = new System.Drawing.Point(4, 22);
+      this.globalScopeTabPage.Name = "globalScopeTabPage";
+      this.globalScopeTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.globalScopeTabPage.Size = new System.Drawing.Size(794, 585);
+      this.globalScopeTabPage.TabIndex = 1;
+      this.globalScopeTabPage.Text = "Global Scope";
+      this.globalScopeTabPage.UseVisualStyleBackColor = true;
+      // 
       // EngineView
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
       this.Controls.Add(this.executionTimeTextBox);
       this.Controls.Add(this.stopButton);
       this.Controls.Add(this.executionTimeLabel);
-      this.Controls.Add(this.splitContainer);
       this.Controls.Add(this.resetButton);
       this.Controls.Add(this.startButton);
       this.Name = "EngineView";
       this.Size = new System.Drawing.Size(802, 640);
-      this.splitContainer.Panel1.ResumeLayout(false);
-      this.splitContainer.Panel2.ResumeLayout(false);
-      this.splitContainer.ResumeLayout(false);
+      this.tabControl.ResumeLayout(false);
+      this.operatorGraphTabPage.ResumeLayout(false);
+      this.globalScopeTabPage.ResumeLayout(false);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -187,5 +205,4 @@
     protected System.Windows.Forms.TextBox executionTimeTextBox;
     protected System.Windows.Forms.Label executionTimeLabel;
-    protected System.Windows.Forms.SplitContainer splitContainer;
     protected System.Windows.Forms.Button resetButton;
     protected System.Windows.Forms.Button stopButton;
@@ -194,4 +211,7 @@
     protected HeuristicLab.Core.Views.ScopeView scopeView;
     protected System.Windows.Forms.ToolTip toolTip;
+    protected System.Windows.Forms.TabControl tabControl;
+    protected System.Windows.Forms.TabPage operatorGraphTabPage;
+    protected System.Windows.Forms.TabPage globalScopeTabPage;
 
   }
Index: trunk/sources/HeuristicLab.Core.Views/3.3/ScopeListView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/ScopeListView.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/ScopeListView.cs	(revision 2687)
@@ -12,6 +12,6 @@
 namespace HeuristicLab.Core.Views {
   [Content(typeof(ScopeList), true)]
-  [Content(typeof(IObservableList<Scope>), true)]
-  public partial class ScopeListView : ItemListView<Scope> {
+  [Content(typeof(IObservableList<IScope>), true)]
+  public partial class ScopeListView : ItemListView<IScope> {
     /// <summary>
     /// Initializes a new instance of <see cref="VariablesScopeView"/> with caption "Variables Scope View".
@@ -28,5 +28,5 @@
     /// <remarks>Calls <see cref="VariablesScopeView()"/>.</remarks>
     /// <param name="scope">The scope whose variables should be represented visually.</param>
-    public ScopeListView(IObservableList<Scope> scopeList)
+    public ScopeListView(IObservableList<IScope> scopeList)
       : this() {
       ItemList = scopeList;
Index: trunk/sources/HeuristicLab.Core.Views/3.3/ScopeView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/ScopeView.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/ScopeView.cs	(revision 2687)
@@ -38,6 +38,6 @@
   [Content(typeof(Scope), true)]
   public sealed partial class ScopeView : ItemView {
-    private Dictionary<Scope, TreeNode> scopeNodeTable;
-    private Dictionary<ScopeList, Scope> subScopesScopeTable;
+    private Dictionary<IScope, TreeNode> scopeNodeTable;
+    private Dictionary<ScopeList, IScope> subScopesScopeTable;
 
     /// <summary>
@@ -46,6 +46,6 @@
     /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
     /// No own data storage present.</remarks>
-    public Scope Scope {
-      get { return (Scope)Item; }
+    public IScope Scope {
+      get { return (IScope)Item; }
       set { base.Item = value; }
     }
@@ -58,6 +58,6 @@
       InitializeComponent();
       Caption = "Scope";
-      scopeNodeTable = new Dictionary<Scope, TreeNode>();
-      subScopesScopeTable = new Dictionary<ScopeList, Scope>();
+      scopeNodeTable = new Dictionary<IScope, TreeNode>();
+      subScopesScopeTable = new Dictionary<ScopeList, IScope>();
 
     }
@@ -67,5 +67,5 @@
     /// <remarks>Calls <see cref="ScopeView()"/>.</remarks>
     /// <param name="scope">The scope to represent visually.</param>
-    public ScopeView(Scope scope)
+    public ScopeView(IScope scope)
       : this() {
       Scope = scope;
@@ -94,5 +94,5 @@
     }
 
-    private TreeNode CreateTreeNode(Scope scope) {
+    private TreeNode CreateTreeNode(IScope scope) {
       TreeNode node = new TreeNode();
       node.Text = scope.Name;
@@ -101,9 +101,9 @@
       scopeNodeTable.Add(scope, node);
       scope.NameChanged += new EventHandler(Scope_NameChanged);
-      scope.SubScopes.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_ItemsAdded);
-      scope.SubScopes.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_ItemsRemoved);
-      scope.SubScopes.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_ItemsReplaced);
-      scope.SubScopes.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_ItemsMoved);
-      scope.SubScopes.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_CollectionReset);
+      scope.SubScopes.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsAdded);
+      scope.SubScopes.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsRemoved);
+      scope.SubScopes.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsReplaced);
+      scope.SubScopes.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsMoved);
+      scope.SubScopes.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_CollectionReset);
       subScopesScopeTable.Add(scope.SubScopes, scope);
       if (scope.SubScopes.Count > 0)
@@ -116,13 +116,13 @@
         RemoveTreeNode(child);
 
-      Scope scope = node.Tag as Scope;
+      IScope scope = node.Tag as IScope;
       if (scope != null) {
         scopeNodeTable.Remove(scope);
         scope.NameChanged -= new EventHandler(Scope_NameChanged);
-        scope.SubScopes.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_ItemsAdded);
-        scope.SubScopes.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_ItemsRemoved);
-        scope.SubScopes.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_ItemsReplaced);
-        scope.SubScopes.ItemsMoved -= new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_ItemsMoved);
-        scope.SubScopes.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_CollectionReset);
+        scope.SubScopes.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsAdded);
+        scope.SubScopes.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsRemoved);
+        scope.SubScopes.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsReplaced);
+        scope.SubScopes.ItemsMoved -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsMoved);
+        scope.SubScopes.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_CollectionReset);
         subScopesScopeTable.Remove(scope.SubScopes);
       }
@@ -132,6 +132,6 @@
     private void scopesTreeView_MouseDown(object sender, MouseEventArgs e) {
       TreeNode node = scopesTreeView.GetNodeAt(e.X, e.Y);
-      if ((node != null) && (node.Tag is Scope)) {
-        variableCollectionView.NamedItemCollection = ((Scope)node.Tag).Variables;
+      if ((node != null) && (node.Tag is IScope)) {
+        variableCollectionView.NamedItemCollection = ((IScope)node.Tag).Variables;
         variableCollectionView.Enabled = true;
       } else {
@@ -143,5 +143,5 @@
     private void scopesTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e) {
       TreeNode node = e.Node;
-      Scope scope = (Scope)node.Tag;
+      IScope scope = (IScope)node.Tag;
 
       node.Nodes.Clear();
@@ -151,5 +151,5 @@
     private void scopesTreeView_AfterCollapse(object sender, System.Windows.Forms.TreeViewEventArgs e) {
       TreeNode node = e.Node;
-      Scope scope = (Scope)node.Tag;
+      IScope scope = (IScope)node.Tag;
 
       if (node.Nodes.Count > 0) {
@@ -162,5 +162,5 @@
     private void scopesTreeView_ItemDrag(object sender, ItemDragEventArgs e) {
       TreeNode node = (TreeNode)e.Item;
-      Scope scope = node.Tag as Scope;
+      IScope scope = node.Tag as IScope;
       if (scope != null) {
         DataObject data = new DataObject();
@@ -177,5 +177,5 @@
         Invoke(new EventHandler(Scope_NameChanged), sender, e);
       else {
-        Scope scope = (Scope)sender;
+        IScope scope = (IScope)sender;
         scopeNodeTable[scope].Text = scope.Name;
       }
@@ -184,12 +184,12 @@
 
     #region SubScopes Events
-    private void SubScopes_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<Scope>> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_ItemsAdded), sender, e);
-      else {
-        Scope parentScope = subScopesScopeTable[(ScopeList)sender];
-        TreeNode parentNode = scopeNodeTable[parentScope];
-        if (parentNode.IsExpanded) {
-          foreach (IndexedItem<Scope> item in e.Items) {
+    private void SubScopes_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsAdded), sender, e);
+      else {
+        IScope parentScope = subScopesScopeTable[(ScopeList)sender];
+        TreeNode parentNode = scopeNodeTable[parentScope];
+        if (parentNode.IsExpanded) {
+          foreach (IndexedItem<IScope> item in e.Items) {
             TreeNode node = CreateTreeNode(item.Value);
             parentNode.Nodes.Insert(item.Index, node);
@@ -200,12 +200,12 @@
       }
     }
-    private void SubScopes_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<Scope>> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_ItemsRemoved), sender, e);
-      else {
-        Scope parentScope = subScopesScopeTable[(ScopeList)sender];
-        TreeNode parentNode = scopeNodeTable[parentScope];
-        if (parentNode.IsExpanded) {
-          foreach (IndexedItem<Scope> item in e.Items) {
+    private void SubScopes_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsRemoved), sender, e);
+      else {
+        IScope parentScope = subScopesScopeTable[(ScopeList)sender];
+        TreeNode parentNode = scopeNodeTable[parentScope];
+        if (parentNode.IsExpanded) {
+          foreach (IndexedItem<IScope> item in e.Items) {
             TreeNode node = scopeNodeTable[item.Value];
             RemoveTreeNode(node);
@@ -217,12 +217,12 @@
       }
     }
-    private void SubScopes_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<Scope>> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_ItemsReplaced), sender, e);
-      else {
-        Scope parentScope = subScopesScopeTable[(ScopeList)sender];
-        TreeNode parentNode = scopeNodeTable[parentScope];
-        if (parentNode.IsExpanded) {
-          foreach (IndexedItem<Scope> item in e.Items) {
+    private void SubScopes_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsReplaced), sender, e);
+      else {
+        IScope parentScope = subScopesScopeTable[(ScopeList)sender];
+        TreeNode parentNode = scopeNodeTable[parentScope];
+        if (parentNode.IsExpanded) {
+          foreach (IndexedItem<IScope> item in e.Items) {
             TreeNode node = parentNode.Nodes[item.Index];
             RemoveTreeNode(node);
@@ -234,22 +234,22 @@
       }
     }
-    private void SubScopes_ItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<Scope>> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_ItemsMoved), sender, e);
-      else {
-        Scope parentScope = subScopesScopeTable[(ScopeList)sender];
-        TreeNode parentNode = scopeNodeTable[parentScope];
-        if (parentNode.IsExpanded) {
-          parentNode.Nodes.Clear();
-          foreach (IndexedItem<Scope> item in e.Items)
+    private void SubScopes_ItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsMoved), sender, e);
+      else {
+        IScope parentScope = subScopesScopeTable[(ScopeList)sender];
+        TreeNode parentNode = scopeNodeTable[parentScope];
+        if (parentNode.IsExpanded) {
+          parentNode.Nodes.Clear();
+          foreach (IndexedItem<IScope> item in e.Items)
             parentNode.Nodes.Insert(item.Index, scopeNodeTable[item.Value]);
         }
       }
     }
-    private void SubScopes_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<Scope>> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_CollectionReset), sender, e);
-      else {
-        Scope parentScope = subScopesScopeTable[(ScopeList)sender];
+    private void SubScopes_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_CollectionReset), sender, e);
+      else {
+        IScope parentScope = subScopesScopeTable[(ScopeList)sender];
         TreeNode parentNode = scopeNodeTable[parentScope];
         if (parentNode.IsExpanded) {
@@ -257,5 +257,5 @@
             RemoveTreeNode(node);
           parentNode.Nodes.Clear();
-          foreach (IndexedItem<Scope> item in e.Items) {
+          foreach (IndexedItem<IScope> item in e.Items) {
             TreeNode node = CreateTreeNode(item.Value);
             parentNode.Nodes.Insert(item.Index, node);
Index: trunk/sources/HeuristicLab.Core.Views/3.3/VariableCollectionView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/VariableCollectionView.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/VariableCollectionView.cs	(revision 2687)
@@ -12,6 +12,6 @@
 namespace HeuristicLab.Core.Views {
   [Content(typeof(VariableCollection), true)]
-  [Content(typeof(IObservableKeyedCollection<string, Variable>), true)]
-  public partial class VariableCollectionView : NamedItemCollectionView<Variable> {
+  [Content(typeof(IObservableKeyedCollection<string, IVariable>), true)]
+  public partial class VariableCollectionView : NamedItemCollectionView<IVariable> {
     /// <summary>
     /// Initializes a new instance of <see cref="VariablesScopeView"/> with caption "Variables Scope View".
@@ -28,8 +28,14 @@
     /// <remarks>Calls <see cref="VariablesScopeView()"/>.</remarks>
     /// <param name="scope">The scope whose variables should be represented visually.</param>
-    public VariableCollectionView(IObservableKeyedCollection<string, Variable> variableCollection)
+    public VariableCollectionView(IObservableKeyedCollection<string, IVariable> variableCollection)
       : this() {
       NamedItemCollection = variableCollection;
     }
+
+    protected override IVariable CreateItem() {
+      IVariable item = new Variable();
+      item.Name = GetUniqueName(item.Name);
+      return item;
+    }
   }
 }
Index: trunk/sources/HeuristicLab.Core.Views/3.3/VariableView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/VariableView.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/VariableView.cs	(revision 2687)
@@ -65,5 +65,5 @@
 
     /// <summary>
-    /// Removes the eventhandlers from the underlying <see cref="IVariable"/>.
+    /// Removes the eventhandlers from the underlying <see cref="Variable"/>.
     /// </summary>
     /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
@@ -74,5 +74,5 @@
 
     /// <summary>
-    /// Adds eventhandlers to the underlying <see cref="IVariable"/>.
+    /// Adds eventhandlers to the underlying <see cref="Variable"/>.
     /// </summary>
     /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
Index: trunk/sources/HeuristicLab.Core.Views/3.3/ViewHost.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/ViewHost.Designer.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/ViewHost.Designer.cs	(revision 2687)
@@ -45,8 +45,9 @@
     /// </summary>
     private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
       this.viewPanel = new System.Windows.Forms.Panel();
       this.messageLabel = new System.Windows.Forms.Label();
-      this.viewLabel = new System.Windows.Forms.Label();
-      this.viewComboBox = new System.Windows.Forms.ComboBox();
+      this.viewsLabel = new System.Windows.Forms.Label();
+      this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
       this.SuspendLayout();
       // 
@@ -56,7 +57,7 @@
                   | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
-      this.viewPanel.Location = new System.Drawing.Point(0, 27);
+      this.viewPanel.Location = new System.Drawing.Point(0, 0);
       this.viewPanel.Name = "viewPanel";
-      this.viewPanel.Size = new System.Drawing.Size(227, 157);
+      this.viewPanel.Size = new System.Drawing.Size(205, 184);
       this.viewPanel.TabIndex = 2;
       // 
@@ -71,24 +72,21 @@
       this.messageLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
       // 
-      // viewLabel
+      // viewsLabel
       // 
-      this.viewLabel.AutoSize = true;
-      this.viewLabel.Location = new System.Drawing.Point(3, 3);
-      this.viewLabel.Name = "viewLabel";
-      this.viewLabel.Size = new System.Drawing.Size(33, 13);
-      this.viewLabel.TabIndex = 0;
-      this.viewLabel.Text = "&View:";
+      this.viewsLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.viewsLabel.ContextMenuStrip = this.contextMenuStrip;
+      this.viewsLabel.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Windows;
+      this.viewsLabel.Location = new System.Drawing.Point(211, 0);
+      this.viewsLabel.Name = "viewsLabel";
+      this.viewsLabel.Size = new System.Drawing.Size(16, 16);
+      this.viewsLabel.TabIndex = 0;
       // 
-      // viewComboBox
+      // contextMenuStrip
       // 
-      this.viewComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.viewComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-      this.viewComboBox.FormattingEnabled = true;
-      this.viewComboBox.Location = new System.Drawing.Point(42, 0);
-      this.viewComboBox.Name = "viewComboBox";
-      this.viewComboBox.Size = new System.Drawing.Size(185, 21);
-      this.viewComboBox.TabIndex = 1;
-      this.viewComboBox.SelectedIndexChanged += new System.EventHandler(this.viewComboBox_SelectedIndexChanged);
+      this.contextMenuStrip.Name = "contextMenuStrip";
+      this.contextMenuStrip.ShowCheckMargin = true;
+      this.contextMenuStrip.ShowImageMargin = false;
+      this.contextMenuStrip.Size = new System.Drawing.Size(61, 4);
+      this.contextMenuStrip.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.contextMenuStrip_ItemClicked);
       // 
       // ViewHost
@@ -96,12 +94,10 @@
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.viewComboBox);
-      this.Controls.Add(this.viewLabel);
       this.Controls.Add(this.viewPanel);
+      this.Controls.Add(this.viewsLabel);
       this.Controls.Add(this.messageLabel);
       this.Name = "ViewHost";
       this.Size = new System.Drawing.Size(227, 184);
       this.ResumeLayout(false);
-      this.PerformLayout();
 
     }
@@ -110,7 +106,7 @@
 
     protected System.Windows.Forms.Panel viewPanel;
-    protected System.Windows.Forms.Label viewLabel;
-    protected System.Windows.Forms.ComboBox viewComboBox;
+    protected System.Windows.Forms.Label viewsLabel;
     protected System.Windows.Forms.Label messageLabel;
+    protected System.Windows.Forms.ContextMenuStrip contextMenuStrip;
 
   }
Index: trunk/sources/HeuristicLab.Core.Views/3.3/ViewHost.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/ViewHost.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/ViewHost.cs	(revision 2687)
@@ -32,4 +32,6 @@
 namespace HeuristicLab.Core.Views { 
   public partial class ViewHost : UserControl {
+    private Dictionary<Type, ToolStripMenuItem> typeMenuItemTable;
+
     private object obj;
     public object Object {
@@ -44,4 +46,5 @@
 
     public ViewHost() {
+      typeMenuItemTable = new Dictionary<Type, ToolStripMenuItem>();
       InitializeComponent();
       Initialize();
@@ -49,8 +52,9 @@
 
     protected virtual void Initialize() {
-      viewLabel.Visible = false;
-      viewComboBox.Items.Clear();
-      viewComboBox.Enabled = false;
-      viewComboBox.Visible = false;
+      viewsLabel.Enabled = false;
+      viewsLabel.Visible = false;
+      typeMenuItemTable.Clear();
+      contextMenuStrip.Items.Clear();
+      contextMenuStrip.Enabled = false;
       messageLabel.Visible = false;
       if (viewPanel.Controls.Count > 0) viewPanel.Controls[0].Dispose();
@@ -63,12 +67,18 @@
                         orderby t.Name ascending
                         select t;
-        foreach (Type viewType in viewTypes)
-          viewComboBox.Items.Add(viewType);
-        if (viewComboBox.Items.Count == 0) {
+        foreach (Type viewType in viewTypes) {
+          ToolStripMenuItem item = new ToolStripMenuItem(viewType.Name);
+          item.Name = viewType.FullName;
+          item.ToolTipText = viewType.FullName;
+          item.Tag = viewType;
+          contextMenuStrip.Items.Add(item);
+          typeMenuItemTable.Add(viewType, item);
+        }
+        if (contextMenuStrip.Items.Count == 0) {
           messageLabel.Visible = true;
         } else {
-          viewLabel.Visible = true;
-          viewComboBox.Enabled = true;
-          viewComboBox.Visible = true;
+          viewsLabel.Enabled = true;
+          viewsLabel.Visible = true;
+          contextMenuStrip.Enabled = true;
           messageLabel.Visible = false;
         }
@@ -81,18 +91,25 @@
           viewPanel.Enabled = true;
           viewPanel.Visible = true;
-          viewComboBox.SelectedItem = view.GetType();
+          typeMenuItemTable[view.GetType()].Checked = true;
+          typeMenuItemTable[view.GetType()].Enabled = false;
         }
       }
     }
 
-    protected virtual void viewComboBox_SelectedIndexChanged(object sender, EventArgs e) {
-      if (viewComboBox.SelectedItem != viewPanel.Tag) {
-        if (viewPanel.Controls.Count > 0) viewPanel.Controls[0].Dispose();
-        viewPanel.Controls.Clear();
-        Control view = (Control)MainFormManager.CreateView((Type)viewComboBox.SelectedItem, Object);
-        viewPanel.Controls.Add(view);
-        viewPanel.Tag = view;
-        view.Dock = DockStyle.Fill;
+    protected void contextMenuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {
+      Type viewType = (Type)e.ClickedItem.Tag;
+      foreach (ToolStripMenuItem item in typeMenuItemTable.Values) {
+        item.Checked = false;
+        item.Enabled = true;
       }
+      typeMenuItemTable[viewType].Checked = true;
+      typeMenuItemTable[viewType].Enabled = false;
+
+      if (viewPanel.Controls.Count > 0) viewPanel.Controls[0].Dispose();
+      viewPanel.Controls.Clear();
+      Control view = (Control)MainFormManager.CreateView(viewType, Object);
+      viewPanel.Controls.Add(view);
+      viewPanel.Tag = view;
+      view.Dock = DockStyle.Fill;
     }
   }
Index: trunk/sources/HeuristicLab.Core/3.3/Engine.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Engine.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Core/3.3/Engine.cs	(revision 2687)
@@ -71,5 +71,5 @@
     /// Gets the current global scope.
     /// </summary>
-    public Scope GlobalScope {
+    public IScope GlobalScope {
       get { return globalScope; }
     }
@@ -167,5 +167,5 @@
       canceled = false;
       running = false;
-      GlobalScope.Clear();
+      globalScope.Clear();
       ExecutionTime = new TimeSpan();
       executionStack.Clear();
Index: trunk/sources/HeuristicLab.Core/3.3/ExecutionContext.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ExecutionContext.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Core/3.3/ExecutionContext.cs	(revision 2687)
@@ -40,6 +40,6 @@
 
     [Storable]
-    private Scope scope;
-    public Scope Scope {
+    private IScope scope;
+    public IScope Scope {
       get { return scope; }
     }
@@ -50,5 +50,5 @@
       scope = null;
     }
-    public ExecutionContext(ExecutionContext parent, IOperator op, Scope scope) {
+    public ExecutionContext(ExecutionContext parent, IOperator op, IScope scope) {
       if ((op == null) || (scope == null)) throw new ArgumentNullException();
       this.parent = parent;
@@ -62,5 +62,5 @@
       clone.parent = (ExecutionContext)cloner.Clone(parent);
       clone.op = (IOperator)cloner.Clone(op);
-      clone.scope = (Scope)cloner.Clone(scope);
+      clone.scope = (IScope)cloner.Clone(scope);
       return clone;
     }
Index: trunk/sources/HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj	(revision 2686)
+++ trunk/sources/HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj	(revision 2687)
@@ -106,4 +106,6 @@
     <Compile Include="Engine.cs" />
     <Compile Include="Interfaces\IOperatorParameter.cs" />
+    <Compile Include="Interfaces\IScope.cs" />
+    <Compile Include="Interfaces\IVariable.cs" />
     <Compile Include="Item.cs" />
     <Compile Include="ItemParameter.cs" />
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IEngine.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IEngine.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IEngine.cs	(revision 2687)
@@ -39,5 +39,5 @@
     /// Gets the global scope of the current instance.
     /// </summary>
-    Scope GlobalScope { get; }
+    IScope GlobalScope { get; }
 
     /// <summary>
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IParameter.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IParameter.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IParameter.cs	(revision 2687)
@@ -31,5 +31,4 @@
 
     IItem GetValue(ExecutionContext context);
-    IItem GetValue(ExecutionContext context, bool throwOnError);
   }
 }
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IScope.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IScope.cs	(revision 2687)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IScope.cs	(revision 2687)
@@ -0,0 +1,38 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Collections;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Hierarchical container of variables (and of subscopes).
+  /// </summary>
+  public interface IScope : INamedItem {
+    IScope Parent { get; set; }
+    VariableCollection Variables { get; }
+    ScopeList SubScopes { get; }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IVariable.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IVariable.cs	(revision 2687)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IVariable.cs	(revision 2687)
@@ -0,0 +1,39 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Represents a variable which has a name and holds an IItem.
+  /// </summary>
+  public interface IVariable : INamedItem {
+    IItem Value { get; set; }
+
+    /// <inheritdoc/>
+    event EventHandler ValueChanged;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ItemCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ItemCollection.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Core/3.3/ItemCollection.cs	(revision 2687)
@@ -87,5 +87,4 @@
       foreach (T item in items)
         if (item != null) item.Changed += new ChangedEventHandler(Item_Changed);
-      IEnumerable<IEngine> i = (IEnumerable<IEngine>)items;
       base.OnItemsAdded(items);
     }
Index: trunk/sources/HeuristicLab.Core/3.3/ItemParameter.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ItemParameter.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Core/3.3/ItemParameter.cs	(revision 2687)
@@ -84,24 +84,23 @@
 
     public override IItem GetValue(ExecutionContext context) {
-      return GetValue(context, true);
-    }
-    public override IItem GetValue(ExecutionContext context, bool throwOnError) {
-      if (Value != null) return Value;
-
-      ExecutionContext current, child;
-      IParameter parameter = null;
-      child = context;
-      current = context.Parent;
-      while ((current != null) && (parameter == null)) {
-        current.Operator.Parameters.TryGetValue(ActualName, out parameter);
-        child = current;
+      ItemParameter param = this;
+      ExecutionContext current = context;
+      string actualName = null;
+      while (param != null) {
+        if (param.Value != null) return param.Value;
+        actualName = param.ActualName;
         current = current.Parent;
+        while ((current != null) && !current.Operator.Parameters.ContainsKey(actualName))
+          current = current.Parent;
+        if (current != null)
+          param = (ItemParameter)current.Operator.Parameters[actualName];
+        else
+          param = null;
       }
 
-      if (parameter != null) return parameter.GetValue(child, throwOnError);
-      else {
-        Variable variable = context.Scope.Lookup(ActualName, true, throwOnError);
-        return variable == null ? null : variable.Value;
-      }
+      IScope scope = context.Scope;
+      while ((scope != null) && !scope.Variables.ContainsKey(actualName))
+        scope = scope.Parent;
+      return scope != null ? scope.Variables[actualName].Value : null;
     }
 
@@ -157,8 +156,5 @@
 
     public new T GetValue(ExecutionContext context) {
-      return GetValue(context, true);
-    }
-    public new T GetValue(ExecutionContext context, bool throwOnError) {
-      return (T)base.GetValue(context, throwOnError);
+      return (T)base.GetValue(context);
     }
   }
Index: trunk/sources/HeuristicLab.Core/3.3/Parameter.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Parameter.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Core/3.3/Parameter.cs	(revision 2687)
@@ -57,5 +57,4 @@
 
     public abstract IItem GetValue(ExecutionContext context);
-    public abstract IItem GetValue(ExecutionContext context, bool throwOnError);
 
     public override IDeepCloneable Clone(Cloner cloner) {
Index: trunk/sources/HeuristicLab.Core/3.3/Scope.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Scope.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Core/3.3/Scope.cs	(revision 2687)
@@ -33,7 +33,15 @@
   [Item("Scope", "A scope which contains variables and sub-scopes.")]
   [Creatable("Test")]
-  public class Scope : NamedItem {
+  public sealed class Scope : NamedItem, IScope {
     [Storable]
-    private Scope parent;
+    private IScope parent;
+    public IScope Parent {
+      get { return parent; }
+      set {
+        if (parent != null) parent.SubScopes.Remove(this);
+        parent = value;
+        if ((parent != null) && !parent.SubScopes.Contains(this)) parent.SubScopes.Add(this);
+      }
+    }
 
     private VariableCollection variables;
@@ -79,26 +87,4 @@
     }
 
-    public Variable Lookup(string name, bool recursive) {
-      return Lookup(name, recursive, true);
-    }
-    public Variable Lookup(string name, bool recursive, bool throwOnError) {
-      Variable variable;
-
-      if (this.variables.TryGetValue(name, out variable)) {
-        return variable;
-      } else if (recursive) {
-        Scope scope = this.parent;
-        while (scope != null) {
-          if (scope.variables.TryGetValue(name, out variable))
-            return variable;
-          scope = scope.parent;
-        }
-      }
-      if (throwOnError)
-        throw new ArgumentException("Variable " + name + " not found");
-      else
-        return null;
-    }
-
     /// <inheritdoc/>
     public void Clear() {
@@ -109,6 +95,9 @@
     /// <inheritdoc/>
     public override IDeepCloneable Clone(Cloner cloner) {
-      Scope clone = (Scope)base.Clone(cloner);
-      clone.parent = (Scope)cloner.Clone(parent);
+      Scope clone = new Scope();
+      cloner.RegisterClonedObject(this, clone);
+      clone.name = name;
+      clone.description = description;
+      clone.parent = (IScope)cloner.Clone(parent);
       clone.Variables = (VariableCollection)cloner.Clone(variables);
       clone.SubScopes = (ScopeList)cloner.Clone(subScopes);
@@ -119,8 +108,8 @@
     private void RegisterSubScopesEvents() {
       if (subScopes != null) {
-        subScopes.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_ItemsAdded);
-        subScopes.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_ItemsRemoved);
-        subScopes.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_ItemsReplaced);
-        subScopes.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_CollectionReset);
+        subScopes.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsAdded);
+        subScopes.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsRemoved);
+        subScopes.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsReplaced);
+        subScopes.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_CollectionReset);
         subScopes.Changed += new ChangedEventHandler(SubScopes_Changed);
       }
@@ -128,30 +117,30 @@
     private void DeregisterSubScopesEvents() {
       if (subScopes != null) {
-        subScopes.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_ItemsAdded);
-        subScopes.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_ItemsRemoved);
-        subScopes.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_ItemsReplaced);
-        subScopes.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<Scope>>(SubScopes_CollectionReset);
+        subScopes.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsAdded);
+        subScopes.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsRemoved);
+        subScopes.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsReplaced);
+        subScopes.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_CollectionReset);
         subScopes.Changed -= new ChangedEventHandler(SubScopes_Changed);
       }
     }
-    private void SubScopes_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<Scope>> e) {
-      foreach (IndexedItem<Scope> item in e.Items)
-        item.Value.parent = this;
+    private void SubScopes_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
+      foreach (IndexedItem<IScope> item in e.Items)
+        item.Value.Parent = this;
     }
-    private void SubScopes_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<Scope>> e) {
-      foreach (IndexedItem<Scope> item in e.Items)
-        item.Value.parent = null;
+    private void SubScopes_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
+      foreach (IndexedItem<IScope> item in e.Items)
+        item.Value.Parent = null;
     }
-    private void SubScopes_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<Scope>> e) {
-      foreach (IndexedItem<Scope> oldItem in e.OldItems)
-        oldItem.Value.parent = null;
-      foreach (IndexedItem<Scope> item in e.Items)
-        item.Value.parent = this;
+    private void SubScopes_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
+      foreach (IndexedItem<IScope> oldItem in e.OldItems)
+        oldItem.Value.Parent = null;
+      foreach (IndexedItem<IScope> item in e.Items)
+        item.Value.Parent = this;
     }
-    private void SubScopes_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<Scope>> e) {
-      foreach (IndexedItem<Scope> oldItem in e.OldItems)
-        oldItem.Value.parent = null;
-      foreach (IndexedItem<Scope> item in e.Items)
-        item.Value.parent = this;
+    private void SubScopes_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
+      foreach (IndexedItem<IScope> oldItem in e.OldItems)
+        oldItem.Value.Parent = null;
+      foreach (IndexedItem<IScope> item in e.Items)
+        item.Value.Parent = this;
     }
     private void SubScopes_Changed(object sender, ChangedEventArgs e) {
Index: trunk/sources/HeuristicLab.Core/3.3/ScopeList.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ScopeList.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Core/3.3/ScopeList.cs	(revision 2687)
@@ -34,8 +34,8 @@
   [Item("ScopeList", "Represents a list of scopes.")]
   [Creatable("Test")]
-  public class ScopeList : ItemList<Scope> {
+  public class ScopeList : ItemList<IScope> {
     public ScopeList() : base() { }
     public ScopeList(int capacity) : base(capacity) { }
-    public ScopeList(IEnumerable<Scope> collection) : base(collection) { }
+    public ScopeList(IEnumerable<IScope> collection) : base(collection) { }
   }
 }
Index: trunk/sources/HeuristicLab.Core/3.3/Variable.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Variable.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Core/3.3/Variable.cs	(revision 2687)
@@ -33,5 +33,5 @@
   [Item("Variable", "A variable which has a name and holds an IItem.")]
   [Creatable("Test")]
-  public sealed class Variable : NamedItem {
+  public sealed class Variable : NamedItem, IVariable {
     private IItem value;
     /// <inheritdoc/>
@@ -67,9 +67,4 @@
       : base(name) {
       Value = value;
-    }
-
-    /// <inheritdoc cref="IVariable.GetValue&lt;T&gt;"/>
-    public T GetValue<T>() where T : class, IItem {
-      return (T)Value;
     }
 
Index: trunk/sources/HeuristicLab.Core/3.3/VariableCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/VariableCollection.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Core/3.3/VariableCollection.cs	(revision 2687)
@@ -33,5 +33,5 @@
   [Item("VariableCollection", "Represents a collection of variables.")]
   [Creatable("Test")]
-  public class VariableCollection : NamedItemCollection<Variable>, IItem {
+  public class VariableCollection : NamedItemCollection<IVariable>, IItem {
     public virtual string ItemName {
       get { return ItemAttribute.GetName(this.GetType()); }
@@ -46,5 +46,5 @@
     public VariableCollection() : base() { }
     public VariableCollection(int capacity) : base(capacity) { }
-    public VariableCollection(IEnumerable<Variable> collection) : base(collection) { }
+    public VariableCollection(IEnumerable<IVariable> collection) : base(collection) { }
 
     public override string ToString() {
Index: trunk/sources/HeuristicLab.Operators/3.3/StandardOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/StandardOperator.cs	(revision 2686)
+++ trunk/sources/HeuristicLab.Operators/3.3/StandardOperator.cs	(revision 2687)
@@ -45,5 +45,5 @@
 
     public override ExecutionContextCollection Apply(ExecutionContext context) {
-      IOperator successor = Successor.GetValue(context, false);
+      IOperator successor = Successor.GetValue(context);
       if (successor != null)
         return new ExecutionContextCollection(new ExecutionContext(context.Parent, successor, context.Scope));
