Index: trunk/sources/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearchMainLoop.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearchMainLoop.cs	(revision 3225)
+++ trunk/sources/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearchMainLoop.cs	(revision 3226)
@@ -24,4 +24,5 @@
 using HeuristicLab.Data;
 using HeuristicLab.Operators;
+using HeuristicLab.Optimization.Operators;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
Index: trunk/sources/HeuristicLab.Core/3.3/Engine.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Engine.cs	(revision 3225)
+++ trunk/sources/HeuristicLab.Core/3.3/Engine.cs	(revision 3226)
@@ -75,4 +75,10 @@
     public bool Running {
       get { return running; }
+      private set {
+        if (running != value) {
+          running = value;
+          OnRunningChanged();
+        }
+      }
     }
 
@@ -126,6 +132,4 @@
 
     public void Prepare(IOperation initialOperation) {
-      Canceled = false;
-      running = false;
       ExecutionTime = new TimeSpan();
       executionStack.Clear();
@@ -138,5 +142,5 @@
     /// of class <see cref="ThreadPool"/>.</remarks>
     public void Start() {
-      running = true;
+      Running = true;
       Canceled = false;
       ThreadPool.QueueUserWorkItem(new WaitCallback(Run), null);
@@ -146,5 +150,5 @@
     /// of class <see cref="ThreadPool"/>.</remarks>
     public void Step() {
-      running = true;
+      Running = true;
       Canceled = false;
       ThreadPool.QueueUserWorkItem(new WaitCallback(RunStep), null);
@@ -167,5 +171,4 @@
       }
       ExecutionTime += DateTime.Now - start;
-      running = false;
       OnStopped();
     }
@@ -176,5 +179,4 @@
         ProcessNextOperator();
       ExecutionTime += DateTime.Now - start;
-      running = false;
       OnStopped();
     }
@@ -197,4 +199,15 @@
     }
     /// <summary>
+    /// Occurs when the running flag changed.
+    /// </summary>
+    public event EventHandler RunningChanged;
+    /// <summary>
+    /// Fires a new <c>RunningChanged</c> event.
+    /// </summary>
+    protected virtual void OnRunningChanged() {
+      if (RunningChanged != null)
+        RunningChanged(this, EventArgs.Empty);
+    }
+    /// <summary>
     /// Occurs when the execution is prepared for a new run.
     /// </summary>
@@ -228,4 +241,6 @@
       if (Stopped != null)
         Stopped(this, EventArgs.Empty);
+      Canceled = false;
+      Running = false;
     }
     protected virtual void OnCanceledChanged() { }
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IEngine.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IEngine.cs	(revision 3225)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IEngine.cs	(revision 3226)
@@ -66,4 +66,8 @@
     event EventHandler ExecutionTimeChanged;
     /// <summary>
+    /// Occurs when the running flag was changed.
+    /// </summary>
+    event EventHandler RunningChanged;
+    /// <summary>
     /// Occurs when the engine is prepared for a new run.
     /// </summary>
Index: trunk/sources/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj	(revision 3225)
+++ trunk/sources/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj	(revision 3226)
@@ -91,5 +91,4 @@
     <Compile Include="Assigner.cs" />
     <Compile Include="AlgorithmOperator.cs" />
-    <Compile Include="ResultsCollector.cs" />
     <Compile Include="MultipleCallsOperator.cs" />
     <Compile Include="Operator.cs" />
Index: trunk/sources/HeuristicLab.Operators/3.3/ResultsCollector.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/ResultsCollector.cs	(revision 3225)
+++ 	(revision )
@@ -1,58 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 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 HeuristicLab.Core;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Operators {
-  /// <summary>
-  /// An operator which collects the actual values of parameters and adds them to a collection of variables.
-  /// </summary>
-  [Item("ResultsCollector", "An operator which collects the actual values of parameters and adds them to a collection of variables.")]
-  [StorableClass]
-  public class ResultsCollector : ValuesCollector {
-    public ValueLookupParameter<VariableCollection> ResultsParameter {
-      get { return (ValueLookupParameter<VariableCollection>)Parameters["Results"]; }
-    }
-
-    public ResultsCollector()
-      : base() {
-      Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The variable collection where the collected values should be stored."));
-    }
-
-    public override IOperation Apply() {
-      VariableCollection results = ResultsParameter.ActualValue;
-      IVariable var;
-      foreach (IParameter param in CollectedValues) {
-        IItem value = param.ActualValue;
-        if (value != null) {
-          results.TryGetValue(param.Name, out var);
-          if (var != null)
-            var.Value = value;
-          else
-            results.Add(new Variable(param.Name, param.Description, value));
-        }
-      }
-      return base.Apply();
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Optimization.Operators/3.3/HeuristicLab.Optimization.Operators-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Operators/3.3/HeuristicLab.Optimization.Operators-3.3.csproj	(revision 3225)
+++ trunk/sources/HeuristicLab.Optimization.Operators/3.3/HeuristicLab.Optimization.Operators-3.3.csproj	(revision 3226)
@@ -82,4 +82,5 @@
   <ItemGroup>
     <Compile Include="ProbabilisticQualityComparator.cs" />
+    <Compile Include="ResultsCollector.cs" />
     <Compile Include="SquareRootDiscreteDoubleValueModifier.cs" />
     <Compile Include="DiscreteDoubleValueModifier.cs" />
Index: trunk/sources/HeuristicLab.Optimization.Operators/3.3/ResultsCollector.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Operators/3.3/ResultsCollector.cs	(revision 3226)
+++ trunk/sources/HeuristicLab.Optimization.Operators/3.3/ResultsCollector.cs	(revision 3226)
@@ -0,0 +1,59 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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 HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization.Operators {
+  /// <summary>
+  /// An operator which collects the actual values of parameters and adds them to a collection of results.
+  /// </summary>
+  [Item("ResultsCollector", "An operator which collects the actual values of parameters and adds them to a collection of results.")]
+  [StorableClass]
+  public class ResultsCollector : ValuesCollector {
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+
+    public ResultsCollector()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the collected values should be stored."));
+    }
+
+    public override IOperation Apply() {
+      ResultCollection results = ResultsParameter.ActualValue;
+      IResult result;
+      foreach (IParameter param in CollectedValues) {
+        IItem value = param.ActualValue;
+        if (value != null) {
+          results.TryGetValue(param.Name, out result);
+          if (result != null)
+            result.Value = value;
+          else
+            results.Add(new Result(param.Name, param.Description, value));
+        }
+      }
+      return base.Apply();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.Designer.cs	(revision 3225)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.Designer.cs	(revision 3226)
@@ -55,5 +55,5 @@
       this.problemViewHost = new HeuristicLab.Core.Views.ViewHost();
       this.resultsTabPage = new System.Windows.Forms.TabPage();
-      this.resultsView = new HeuristicLab.Core.Views.VariableCollectionView();
+      this.resultsView = new HeuristicLab.Optimization.Views.ResultCollectionView();
       this.startButton = new System.Windows.Forms.Button();
       this.stopButton = new System.Windows.Forms.Button();
@@ -192,5 +192,5 @@
                   | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
-      this.resultsView.Caption = "VariableCollection";
+      this.resultsView.Caption = "ResultsCollection";
       this.resultsView.Content = null;
       this.resultsView.Location = new System.Drawing.Point(6, 6);
@@ -319,5 +319,5 @@
     protected System.Windows.Forms.SaveFileDialog saveFileDialog;
     protected System.Windows.Forms.TabPage resultsTabPage;
-    protected HeuristicLab.Core.Views.VariableCollectionView resultsView;
+    protected HeuristicLab.Optimization.Views.ResultCollectionView resultsView;
 
   }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs	(revision 3225)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs	(revision 3226)
@@ -108,5 +108,5 @@
         problemViewHost.ViewType = null;
         problemViewHost.Content = Content.Problem;
-        resultsView.Content = Content.Results;
+        resultsView.Content = Content.Results.AsReadOnly();
         tabControl.Enabled = true;
         startButton.Enabled = !Content.Finished;
@@ -127,5 +127,5 @@
         Invoke(new EventHandler(Content_Prepared), sender, e);
       else {
-        resultsView.Content = Content.Results;
+        resultsView.Content = Content.Results.AsReadOnly();
         startButton.Enabled = !Content.Finished;
         UpdateExecutionTimeTextBox();
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.Designer.cs	(revision 3226)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.Designer.cs	(revision 3226)
@@ -0,0 +1,339 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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
+
+namespace HeuristicLab.Optimization.Views {
+  partial class BatchRunView {
+    /// <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) {
+        if (algorithmTypeSelectorDialog != null) algorithmTypeSelectorDialog.Dispose();
+        if (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.tabControl = new System.Windows.Forms.TabControl();
+      this.algorithmTabPage = new System.Windows.Forms.TabPage();
+      this.saveAlgorithmButton = new System.Windows.Forms.Button();
+      this.openAlgorithmButton = new System.Windows.Forms.Button();
+      this.newAlgorithmButton = new System.Windows.Forms.Button();
+      this.algorithmViewHost = new HeuristicLab.Core.Views.ViewHost();
+      this.resultsTabPage = new System.Windows.Forms.TabPage();
+      this.startButton = new System.Windows.Forms.Button();
+      this.stopButton = new System.Windows.Forms.Button();
+      this.resetButton = new System.Windows.Forms.Button();
+      this.executionTimeLabel = new System.Windows.Forms.Label();
+      this.executionTimeTextBox = new System.Windows.Forms.TextBox();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
+      this.repetitionsLabel = new System.Windows.Forms.Label();
+      this.repetitionsNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.resultsView = new HeuristicLab.Optimization.Views.ResultCollectionListView();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.tabControl.SuspendLayout();
+      this.algorithmTabPage.SuspendLayout();
+      this.resultsTabPage.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.repetitionsNumericUpDown)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(607, 20);
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Size = new System.Drawing.Size(607, 20);
+      // 
+      // 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.algorithmTabPage);
+      this.tabControl.Controls.Add(this.resultsTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 78);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(679, 374);
+      this.tabControl.TabIndex = 6;
+      // 
+      // algorithmTabPage
+      // 
+      this.algorithmTabPage.Controls.Add(this.saveAlgorithmButton);
+      this.algorithmTabPage.Controls.Add(this.openAlgorithmButton);
+      this.algorithmTabPage.Controls.Add(this.newAlgorithmButton);
+      this.algorithmTabPage.Controls.Add(this.algorithmViewHost);
+      this.algorithmTabPage.Location = new System.Drawing.Point(4, 22);
+      this.algorithmTabPage.Name = "algorithmTabPage";
+      this.algorithmTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.algorithmTabPage.Size = new System.Drawing.Size(671, 348);
+      this.algorithmTabPage.TabIndex = 1;
+      this.algorithmTabPage.Text = "Algorithm";
+      this.algorithmTabPage.UseVisualStyleBackColor = true;
+      // 
+      // saveAlgorithmButton
+      // 
+      this.saveAlgorithmButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Save;
+      this.saveAlgorithmButton.Location = new System.Drawing.Point(66, 6);
+      this.saveAlgorithmButton.Name = "saveAlgorithmButton";
+      this.saveAlgorithmButton.Size = new System.Drawing.Size(24, 24);
+      this.saveAlgorithmButton.TabIndex = 2;
+      this.toolTip.SetToolTip(this.saveAlgorithmButton, "Save Problem");
+      this.saveAlgorithmButton.UseVisualStyleBackColor = true;
+      this.saveAlgorithmButton.Click += new System.EventHandler(this.saveAlgorithmButton_Click);
+      // 
+      // openAlgorithmButton
+      // 
+      this.openAlgorithmButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Open;
+      this.openAlgorithmButton.Location = new System.Drawing.Point(36, 6);
+      this.openAlgorithmButton.Name = "openAlgorithmButton";
+      this.openAlgorithmButton.Size = new System.Drawing.Size(24, 24);
+      this.openAlgorithmButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.openAlgorithmButton, "Open Problem");
+      this.openAlgorithmButton.UseVisualStyleBackColor = true;
+      this.openAlgorithmButton.Click += new System.EventHandler(this.openAlgorithmButton_Click);
+      // 
+      // newAlgorithmButton
+      // 
+      this.newAlgorithmButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.NewDocument;
+      this.newAlgorithmButton.Location = new System.Drawing.Point(6, 6);
+      this.newAlgorithmButton.Name = "newAlgorithmButton";
+      this.newAlgorithmButton.Size = new System.Drawing.Size(24, 24);
+      this.newAlgorithmButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.newAlgorithmButton, "New Problem");
+      this.newAlgorithmButton.UseVisualStyleBackColor = true;
+      this.newAlgorithmButton.Click += new System.EventHandler(this.newAlgorithmButton_Click);
+      // 
+      // algorithmViewHost
+      // 
+      this.algorithmViewHost.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.algorithmViewHost.Content = null;
+      this.algorithmViewHost.Location = new System.Drawing.Point(6, 36);
+      this.algorithmViewHost.Name = "algorithmViewHost";
+      this.algorithmViewHost.Size = new System.Drawing.Size(659, 306);
+      this.algorithmViewHost.TabIndex = 3;
+      this.algorithmViewHost.ViewType = null;
+      // 
+      // resultsTabPage
+      // 
+      this.resultsTabPage.Controls.Add(this.resultsView);
+      this.resultsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.resultsTabPage.Name = "resultsTabPage";
+      this.resultsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.resultsTabPage.Size = new System.Drawing.Size(671, 348);
+      this.resultsTabPage.TabIndex = 2;
+      this.resultsTabPage.Text = "Results";
+      this.resultsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // startButton
+      // 
+      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(0, 458);
+      this.startButton.Name = "startButton";
+      this.startButton.Size = new System.Drawing.Size(24, 24);
+      this.startButton.TabIndex = 7;
+      this.toolTip.SetToolTip(this.startButton, "Start/Resume Algorithm");
+      this.startButton.UseVisualStyleBackColor = true;
+      this.startButton.Click += new System.EventHandler(this.startButton_Click);
+      // 
+      // stopButton
+      // 
+      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.stopButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Pause;
+      this.stopButton.Location = new System.Drawing.Point(30, 458);
+      this.stopButton.Name = "stopButton";
+      this.stopButton.Size = new System.Drawing.Size(24, 24);
+      this.stopButton.TabIndex = 8;
+      this.toolTip.SetToolTip(this.stopButton, "Pause Algorithm");
+      this.stopButton.UseVisualStyleBackColor = true;
+      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
+      // 
+      // resetButton
+      // 
+      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(60, 458);
+      this.resetButton.Name = "resetButton";
+      this.resetButton.Size = new System.Drawing.Size(24, 24);
+      this.resetButton.TabIndex = 9;
+      this.toolTip.SetToolTip(this.resetButton, "Reset Algorithm");
+      this.resetButton.UseVisualStyleBackColor = true;
+      this.resetButton.Click += new System.EventHandler(this.resetButton_Click);
+      // 
+      // executionTimeLabel
+      // 
+      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(453, 465);
+      this.executionTimeLabel.Name = "executionTimeLabel";
+      this.executionTimeLabel.Size = new System.Drawing.Size(83, 13);
+      this.executionTimeLabel.TabIndex = 10;
+      this.executionTimeLabel.Text = "&Execution Time:";
+      // 
+      // executionTimeTextBox
+      // 
+      this.executionTimeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.executionTimeTextBox.Location = new System.Drawing.Point(542, 462);
+      this.executionTimeTextBox.Name = "executionTimeTextBox";
+      this.executionTimeTextBox.ReadOnly = true;
+      this.executionTimeTextBox.Size = new System.Drawing.Size(137, 20);
+      this.executionTimeTextBox.TabIndex = 11;
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.DefaultExt = "hl";
+      this.openFileDialog.FileName = "Algorithm";
+      this.openFileDialog.Filter = "HeuristicLab Files|*.hl|All Files|*.*";
+      this.openFileDialog.Title = "Open Algorithm";
+      // 
+      // saveFileDialog
+      // 
+      this.saveFileDialog.DefaultExt = "hl";
+      this.saveFileDialog.FileName = "Algorithm";
+      this.saveFileDialog.Filter = "Uncompressed HeuristicLab Files|*.hl|HeuristicLab Files|*.hl|All Files|*.*";
+      this.saveFileDialog.FilterIndex = 2;
+      this.saveFileDialog.Title = "Save Algorithm";
+      // 
+      // repetitionsLabel
+      // 
+      this.repetitionsLabel.AutoSize = true;
+      this.repetitionsLabel.Location = new System.Drawing.Point(3, 54);
+      this.repetitionsLabel.Name = "repetitionsLabel";
+      this.repetitionsLabel.Size = new System.Drawing.Size(63, 13);
+      this.repetitionsLabel.TabIndex = 4;
+      this.repetitionsLabel.Text = "&Repetitions:";
+      // 
+      // repetitionsNumericUpDown
+      // 
+      this.repetitionsNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.repetitionsNumericUpDown.Location = new System.Drawing.Point(72, 52);
+      this.repetitionsNumericUpDown.Maximum = new decimal(new int[] {
+            1000000,
+            0,
+            0,
+            0});
+      this.repetitionsNumericUpDown.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.repetitionsNumericUpDown.Name = "repetitionsNumericUpDown";
+      this.repetitionsNumericUpDown.Size = new System.Drawing.Size(607, 20);
+      this.repetitionsNumericUpDown.TabIndex = 5;
+      this.repetitionsNumericUpDown.ThousandsSeparator = true;
+      this.repetitionsNumericUpDown.Value = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.repetitionsNumericUpDown.ValueChanged += new System.EventHandler(this.repetitionsNumericUpDown_ValueChanged);
+      // 
+      // resultsView
+      // 
+      this.resultsView.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.resultsView.Caption = "ResultCollectionList";
+      this.resultsView.Content = null;
+      this.resultsView.Location = new System.Drawing.Point(6, 6);
+      this.resultsView.Name = "resultsView";
+      this.resultsView.Size = new System.Drawing.Size(659, 336);
+      this.resultsView.TabIndex = 0;
+      // 
+      // BatchRunView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Controls.Add(this.startButton);
+      this.Controls.Add(this.stopButton);
+      this.Controls.Add(this.executionTimeTextBox);
+      this.Controls.Add(this.executionTimeLabel);
+      this.Controls.Add(this.resetButton);
+      this.Controls.Add(this.repetitionsNumericUpDown);
+      this.Controls.Add(this.repetitionsLabel);
+      this.Name = "BatchRunView";
+      this.Size = new System.Drawing.Size(679, 482);
+      this.Controls.SetChildIndex(this.repetitionsLabel, 0);
+      this.Controls.SetChildIndex(this.repetitionsNumericUpDown, 0);
+      this.Controls.SetChildIndex(this.resetButton, 0);
+      this.Controls.SetChildIndex(this.executionTimeLabel, 0);
+      this.Controls.SetChildIndex(this.executionTimeTextBox, 0);
+      this.Controls.SetChildIndex(this.stopButton, 0);
+      this.Controls.SetChildIndex(this.startButton, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.tabControl.ResumeLayout(false);
+      this.algorithmTabPage.ResumeLayout(false);
+      this.resultsTabPage.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.repetitionsNumericUpDown)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage algorithmTabPage;
+    private HeuristicLab.Core.Views.ViewHost algorithmViewHost;
+    private System.Windows.Forms.Button newAlgorithmButton;
+    private System.Windows.Forms.Button saveAlgorithmButton;
+    private System.Windows.Forms.Button openAlgorithmButton;
+    private System.Windows.Forms.Button startButton;
+    private System.Windows.Forms.Button stopButton;
+    private System.Windows.Forms.Button resetButton;
+    private System.Windows.Forms.Label executionTimeLabel;
+    private System.Windows.Forms.TextBox executionTimeTextBox;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+    private System.Windows.Forms.SaveFileDialog saveFileDialog;
+    private System.Windows.Forms.TabPage resultsTabPage;
+    private System.Windows.Forms.Label repetitionsLabel;
+    private System.Windows.Forms.NumericUpDown repetitionsNumericUpDown;
+    private ResultCollectionListView resultsView;
+
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.cs	(revision 3226)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.cs	(revision 3226)
@@ -0,0 +1,261 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Persistence.Default.Xml;
+
+namespace HeuristicLab.Optimization.Views {
+  /// <summary>
+  /// The base class for visual representations of items.
+  /// </summary>
+  [View("BatchRun View")]
+  [Content(typeof(BatchRun), true)]
+  public sealed partial class BatchRunView : NamedItemView {
+    private TypeSelectorDialog algorithmTypeSelectorDialog;
+
+    public new BatchRun Content {
+      get { return (BatchRun)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemBaseView"/>.
+    /// </summary>
+    public BatchRunView() {
+      InitializeComponent();
+    }
+    /// <summary>
+    /// Intializes a new instance of <see cref="ItemBaseView"/> with the given <paramref name="item"/>.
+    /// </summary>
+    /// <param name="item">The item that should be displayed.</param>
+    public BatchRunView(BatchRun content)
+      : this() {
+      Content = content;
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred);
+      Content.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
+      Content.Prepared -= new EventHandler(Content_Prepared);
+      Content.AlgorithmChanged -= new EventHandler(Content_AlgorithmChanged);
+      Content.Started -= new EventHandler(Content_Started);
+      Content.Stopped -= new EventHandler(Content_Stopped);
+      Content.RepetitionsChanged -= new EventHandler(Content_RepetitionsChanged);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred);
+      Content.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
+      Content.Prepared += new EventHandler(Content_Prepared);
+      Content.AlgorithmChanged += new EventHandler(Content_AlgorithmChanged);
+      Content.Started += new EventHandler(Content_Started);
+      Content.Stopped += new EventHandler(Content_Stopped);
+      Content.RepetitionsChanged += new EventHandler(Content_RepetitionsChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      stopButton.Enabled = false;
+      if (Content == null) {
+        repetitionsNumericUpDown.Value = 1;
+        repetitionsNumericUpDown.Enabled = false;
+        algorithmViewHost.Content = null;
+        resultsView.Content = null;
+        tabControl.Enabled = false;
+        startButton.Enabled = resetButton.Enabled = false;
+        executionTimeTextBox.Text = "-";
+        executionTimeTextBox.Enabled = false;
+      } else {
+        repetitionsNumericUpDown.Value = Content.Repetitions;
+        repetitionsNumericUpDown.Enabled = true;
+        saveAlgorithmButton.Enabled = Content.Algorithm != null;
+        algorithmViewHost.ViewType = null;
+        algorithmViewHost.Content = Content.Algorithm;
+        resultsView.Content = Content.Results;
+        tabControl.Enabled = true;
+        startButton.Enabled = !Content.Finished;
+        resetButton.Enabled = true;
+        UpdateExecutionTimeTextBox();
+        executionTimeTextBox.Enabled = true;
+      }
+    }
+
+    protected override void OnClosed(FormClosedEventArgs e) {
+      if (Content != null) Content.Stop();
+      base.OnClosed(e);
+    }
+
+    #region Content Events
+    private void Content_AlgorithmChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_AlgorithmChanged), sender, e);
+      else {
+        algorithmViewHost.ViewType = null;
+        algorithmViewHost.Content = Content.Algorithm;
+        saveAlgorithmButton.Enabled = Content.Algorithm != null;
+      }
+    }
+    private void Content_Prepared(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Prepared), sender, e);
+      else {
+        startButton.Enabled = !Content.Finished;
+        UpdateExecutionTimeTextBox();
+      }
+    }
+    private void Content_Started(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Started), sender, e);
+      else {
+        SaveEnabled = false;
+        repetitionsNumericUpDown.Enabled = false;
+        newAlgorithmButton.Enabled = openAlgorithmButton.Enabled = saveAlgorithmButton.Enabled = false;
+        startButton.Enabled = false;
+        stopButton.Enabled = true;
+        resetButton.Enabled = false;
+        UpdateExecutionTimeTextBox();
+      }
+    }
+    private void Content_Stopped(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Stopped), sender, e);
+      else {
+        SaveEnabled = true;
+        repetitionsNumericUpDown.Enabled = true;
+        newAlgorithmButton.Enabled = openAlgorithmButton.Enabled = saveAlgorithmButton.Enabled = true;
+        startButton.Enabled = !Content.Finished;
+        stopButton.Enabled = false;
+        resetButton.Enabled = true;
+        UpdateExecutionTimeTextBox();
+      }
+    }
+    private void Content_ExecutionTimeChanged(object sender, EventArgs e) {
+      UpdateExecutionTimeTextBox();
+    }
+    private void Content_ExceptionOccurred(object sender, EventArgs<Exception> e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred), sender, e);
+      else
+        Auxiliary.ShowErrorMessageBox(e.Value);
+    }
+    private void Content_RepetitionsChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_RepetitionsChanged), sender, e);
+      else {
+        repetitionsNumericUpDown.Value = Content.Repetitions;
+        startButton.Enabled = !Content.Finished;
+      }
+    }
+    #endregion
+
+    #region Control events
+    private void repetitionsNumericUpDown_ValueChanged(object sender, EventArgs e) {
+      Content.Repetitions = (int)repetitionsNumericUpDown.Value;
+    }
+    private void newAlgorithmButton_Click(object sender, EventArgs e) {
+      if (algorithmTypeSelectorDialog == null) {
+        algorithmTypeSelectorDialog = new TypeSelectorDialog();
+        algorithmTypeSelectorDialog.Caption = "Select Algorithm";
+        algorithmTypeSelectorDialog.TypeSelector.Configure(typeof(IAlgorithm), false, false);
+      }
+      if (algorithmTypeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        Content.Algorithm = (IAlgorithm)algorithmTypeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+      }
+    }
+    private void openAlgorithmButton_Click(object sender, EventArgs e) {
+      openFileDialog.Title = "Open Algorithm";
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        this.Cursor = Cursors.AppStarting;
+        newAlgorithmButton.Enabled = openAlgorithmButton.Enabled = saveAlgorithmButton.Enabled = false;
+        algorithmViewHost.Enabled = false;
+
+        var call = new Func<string, object>(XmlParser.Deserialize);
+        call.BeginInvoke(openFileDialog.FileName, delegate(IAsyncResult a) {
+          IAlgorithm algorithm = null;
+          try {
+            algorithm = call.EndInvoke(a) as IAlgorithm;
+          } catch (Exception ex) {
+            Auxiliary.ShowErrorMessageBox(ex);
+          }
+          Invoke(new Action(delegate() {
+            if (algorithm == null)
+              MessageBox.Show(this, "The selected file does not contain an algorithm.", "Invalid File", MessageBoxButtons.OK, MessageBoxIcon.Error);
+            else
+              Content.Algorithm = algorithm;
+            algorithmViewHost.Enabled = true;
+            newAlgorithmButton.Enabled = openAlgorithmButton.Enabled = saveAlgorithmButton.Enabled = true;
+            this.Cursor = Cursors.Default;
+          }));
+        }, null);
+      }
+    }
+    private void saveAlgorithmButton_Click(object sender, EventArgs e) {
+      saveFileDialog.Title = "Save Algorithm";
+      if (saveFileDialog.ShowDialog(this) == DialogResult.OK) {
+        this.Cursor = Cursors.AppStarting;
+        newAlgorithmButton.Enabled = openAlgorithmButton.Enabled = saveAlgorithmButton.Enabled = false;
+        algorithmViewHost.Enabled = false;
+
+        var call = new Action<IAlgorithm, string, int>(XmlGenerator.Serialize);
+        int compression = 9;
+        if (saveFileDialog.FilterIndex == 1) compression = 0;
+        call.BeginInvoke(Content.Algorithm, saveFileDialog.FileName, compression, delegate(IAsyncResult a) {
+          try {
+            call.EndInvoke(a);
+          }
+          catch (Exception ex) {
+            Auxiliary.ShowErrorMessageBox(ex);
+          }
+          Invoke(new Action(delegate() {
+            algorithmViewHost.Enabled = true;
+            newAlgorithmButton.Enabled = openAlgorithmButton.Enabled = saveAlgorithmButton.Enabled = true;
+            this.Cursor = Cursors.Default;
+          }));
+        }, null);
+      }
+    }
+    private void startButton_Click(object sender, EventArgs e) {
+      Content.Start();
+    }
+    private void stopButton_Click(object sender, EventArgs e) {
+      Content.Stop();
+    }
+    private void resetButton_Click(object sender, EventArgs e) {
+      Content.Prepare();
+    }
+    #endregion
+
+    #region Helpers
+    private void UpdateExecutionTimeTextBox() {
+      if (InvokeRequired)
+        Invoke(new Action(UpdateExecutionTimeTextBox));
+      else
+        executionTimeTextBox.Text = Content.ExecutionTime.ToString();
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj	(revision 3225)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj	(revision 3226)
@@ -92,4 +92,16 @@
       <DependentUpon>AlgorithmView.cs</DependentUpon>
     </Compile>
+    <Compile Include="BatchRunView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="BatchRunView.Designer.cs">
+      <DependentUpon>BatchRunView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ResultCollectionListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ResultCollectionListView.Designer.cs">
+      <DependentUpon>ResultCollectionListView.cs</DependentUpon>
+    </Compile>
     <Compile Include="UserDefinedAlgorithmView.cs">
       <SubType>UserControl</SubType>
@@ -112,4 +124,16 @@
     </Compile>
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ResultCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ResultCollectionView.Designer.cs">
+      <DependentUpon>ResultCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ResultView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ResultView.Designer.cs">
+      <DependentUpon>ResultView.cs</DependentUpon>
+    </Compile>
   </ItemGroup>
   <ItemGroup>
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/ResultCollectionListView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/ResultCollectionListView.Designer.cs	(revision 3226)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/ResultCollectionListView.Designer.cs	(revision 3226)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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
+
+namespace HeuristicLab.Optimization.Views {
+  partial class ResultCollectionListView {
+    /// <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) {
+        if (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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/ResultCollectionListView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/ResultCollectionListView.cs	(revision 3226)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/ResultCollectionListView.cs	(revision 3226)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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 HeuristicLab.Collections;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Optimization.Views {
+  [View("ResultCollectionList View")]
+  [Content(typeof(ResultCollectionList), true)]
+  public partial class ResultCollectionListView : ItemListView<ResultCollection> {
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariablesScopeView"/> with caption "Variables Scope View".
+    /// </summary>
+    public ResultCollectionListView() {
+      InitializeComponent();
+      Caption = "ResultCollectionList";
+      itemsGroupBox.Text = "Results";
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariablesScopeView"/> with 
+    /// the given <paramref name="scope"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="VariablesScopeView()"/>.</remarks>
+    /// <param name="scope">The scope whose variables should be represented visually.</param>
+    public ResultCollectionListView(ResultCollectionList content)
+      : this() {
+      Content = content;
+    }
+
+    protected override ResultCollection CreateItem() {
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/ResultCollectionView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/ResultCollectionView.Designer.cs	(revision 3226)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/ResultCollectionView.Designer.cs	(revision 3226)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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
+
+namespace HeuristicLab.Optimization.Views {
+  partial class ResultCollectionView {
+    /// <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) {
+        if (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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/ResultCollectionView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/ResultCollectionView.cs	(revision 3226)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/ResultCollectionView.cs	(revision 3226)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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 HeuristicLab.Collections;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Optimization.Views {
+  [View("ResultCollection View")]
+  [Content(typeof(ResultCollection), true)]
+  [Content(typeof(IObservableKeyedCollection<string, IResult>), false)]
+  public partial class ResultCollectionView : NamedItemCollectionView<IResult> {
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariablesScopeView"/> with caption "Variables Scope View".
+    /// </summary>
+    public ResultCollectionView() {
+      InitializeComponent();
+      Caption = "ResultCollection";
+      itemsGroupBox.Text = "Results";
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariablesScopeView"/> with 
+    /// the given <paramref name="scope"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="VariablesScopeView()"/>.</remarks>
+    /// <param name="scope">The scope whose variables should be represented visually.</param>
+    public ResultCollectionView(IObservableKeyedCollection<string, IResult> content)
+      : this() {
+      Content = content;
+    }
+
+    protected override IResult CreateItem() {
+      IResult item = new Result();
+      item.Name = GetUniqueName(item.Name);
+      return item;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/ResultView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/ResultView.Designer.cs	(revision 3226)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/ResultView.Designer.cs	(revision 3226)
@@ -0,0 +1,153 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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
+
+namespace HeuristicLab.Optimization.Views {
+  partial class ResultView {
+    /// <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) {
+        if (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.dataTypeLabel = new System.Windows.Forms.Label();
+      this.dataTypeTextBox = new System.Windows.Forms.TextBox();
+      this.valueGroupBox = new System.Windows.Forms.GroupBox();
+      this.valuePanel = new System.Windows.Forms.Panel();
+      this.viewHost = new HeuristicLab.Core.Views.ViewHost();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.valueGroupBox.SuspendLayout();
+      this.valuePanel.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(287, 20);
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Size = new System.Drawing.Size(287, 20);
+      // 
+      // dataTypeLabel
+      // 
+      this.dataTypeLabel.AutoSize = true;
+      this.dataTypeLabel.Location = new System.Drawing.Point(3, 55);
+      this.dataTypeLabel.Name = "dataTypeLabel";
+      this.dataTypeLabel.Size = new System.Drawing.Size(60, 13);
+      this.dataTypeLabel.TabIndex = 4;
+      this.dataTypeLabel.Text = "Data &Type:";
+      // 
+      // dataTypeTextBox
+      // 
+      this.dataTypeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTypeTextBox.Location = new System.Drawing.Point(72, 52);
+      this.dataTypeTextBox.Name = "dataTypeTextBox";
+      this.dataTypeTextBox.ReadOnly = true;
+      this.dataTypeTextBox.Size = new System.Drawing.Size(287, 20);
+      this.dataTypeTextBox.TabIndex = 5;
+      // 
+      // valueGroupBox
+      // 
+      this.valueGroupBox.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.valueGroupBox.Controls.Add(this.valuePanel);
+      this.valueGroupBox.Location = new System.Drawing.Point(0, 78);
+      this.valueGroupBox.Name = "valueGroupBox";
+      this.valueGroupBox.Size = new System.Drawing.Size(359, 196);
+      this.valueGroupBox.TabIndex = 7;
+      this.valueGroupBox.TabStop = false;
+      this.valueGroupBox.Text = "Value";
+      // 
+      // valuePanel
+      // 
+      this.valuePanel.AllowDrop = true;
+      this.valuePanel.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.valuePanel.Controls.Add(this.viewHost);
+      this.valuePanel.Location = new System.Drawing.Point(6, 19);
+      this.valuePanel.Name = "valuePanel";
+      this.valuePanel.Size = new System.Drawing.Size(347, 171);
+      this.valuePanel.TabIndex = 2;
+      // 
+      // viewHost
+      // 
+      this.viewHost.Content = null;
+      this.viewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.viewHost.Location = new System.Drawing.Point(0, 0);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.Size = new System.Drawing.Size(347, 171);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewType = null;
+      // 
+      // ResultView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.valueGroupBox);
+      this.Controls.Add(this.dataTypeLabel);
+      this.Controls.Add(this.dataTypeTextBox);
+      this.Name = "ResultView";
+      this.Size = new System.Drawing.Size(359, 274);
+      this.Controls.SetChildIndex(this.descriptionLabel, 0);
+      this.Controls.SetChildIndex(this.dataTypeTextBox, 0);
+      this.Controls.SetChildIndex(this.dataTypeLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.valueGroupBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.valueGroupBox.ResumeLayout(false);
+      this.valuePanel.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label dataTypeLabel;
+    private System.Windows.Forms.TextBox dataTypeTextBox;
+    private System.Windows.Forms.GroupBox valueGroupBox;
+    private HeuristicLab.Core.Views.ViewHost viewHost;
+    private System.Windows.Forms.Panel valuePanel;
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/ResultView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/ResultView.cs	(revision 3226)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/ResultView.cs	(revision 3226)
@@ -0,0 +1,108 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Optimization.Views {
+  /// <summary>
+  /// The visual representation of a <see cref="Variable"/>.
+  /// </summary>
+  [View("Result View")]
+  [Content(typeof(Result), true)]
+  [Content(typeof(IResult), false)]
+  public sealed partial class ResultView : NamedItemView {
+    /// <summary>
+    /// Gets or sets the variable to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public new IResult Content {
+      get { return (IResult)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableView"/> with caption "Variable".
+    /// </summary>
+    public ResultView() {
+      InitializeComponent();
+      Caption = "Result";
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableView"/> with the given <paramref name="variable"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="VariableView()"/>.</remarks>
+    /// <param name="variable">The variable to represent visually.</param>
+    public ResultView(IResult content)
+      : this() {
+      Content = content;
+    }
+
+    /// <summary>
+    /// Removes the eventhandlers from the underlying <see cref="Variable"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void DeregisterContentEvents() {
+      Content.ValueChanged -= new EventHandler(Content_ValueChanged);
+      base.DeregisterContentEvents();
+    }
+
+    /// <summary>
+    /// Adds eventhandlers to the underlying <see cref="Variable"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ValueChanged += new EventHandler(Content_ValueChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        Caption = "Result";
+        dataTypeTextBox.Text = "-";
+        dataTypeTextBox.Enabled = false;
+        valueGroupBox.Enabled = false;
+        viewHost.Content = null;
+      } else {
+        Caption = Content.Name + " (" + Content.GetType().Name + ")";
+        dataTypeTextBox.Text = Content.DataType.GetPrettyName();
+        dataTypeTextBox.Enabled = true;
+        valueGroupBox.Enabled = true;
+        viewHost.ViewType = null;
+        viewHost.Content = Content.Value;
+      }
+    }
+
+    private void Content_ValueChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ValueChanged), sender, e);
+      else {
+        viewHost.ViewType = null;
+        viewHost.Content = Content.Value;
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/Algorithm.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Algorithm.cs	(revision 3225)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Algorithm.cs	(revision 3226)
@@ -66,5 +66,5 @@
     }
 
-    public abstract IObservableKeyedCollection<string, IVariable> Results { get; }
+    public abstract ResultCollection Results { get; }
 
     public abstract TimeSpan ExecutionTime { get; }
@@ -73,4 +73,10 @@
     public bool Running {
       get { return running; }
+      protected set {
+        if (running != value) {
+          running = value;
+          OnRunningChanged();
+        }
+      }
     }
 
@@ -98,15 +104,13 @@
       clone.Problem = (IProblem)cloner.Clone(problem);
       clone.running = running;
-      clone.Canceled = canceled;
+      clone.canceled = canceled;
       return clone;
     }
 
     public void Prepare() {
-      running = false;
-      Canceled = false;
       OnPrepared();
     }
     public void Start() {
-      running = true;
+      Running = true;
       Canceled = false;
       OnStarted();
@@ -127,4 +131,9 @@
         ExecutionTimeChanged(this, EventArgs.Empty);
     }
+    public event EventHandler RunningChanged;
+    protected virtual void OnRunningChanged() {
+      if (RunningChanged != null)
+        RunningChanged(this, EventArgs.Empty);
+    }
     public event EventHandler Prepared;
     protected virtual void OnPrepared() {
@@ -141,4 +150,6 @@
       if (Stopped != null)
         Stopped(this, EventArgs.Empty);
+      Canceled = false;
+      Running = false;
     }
     protected virtual void OnCanceledChanged() { }
Index: trunk/sources/HeuristicLab.Optimization/3.3/BatchRun.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/BatchRun.cs	(revision 3226)
+++ trunk/sources/HeuristicLab.Optimization/3.3/BatchRun.cs	(revision 3226)
@@ -0,0 +1,232 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Drawing;
+using HeuristicLab.Collections;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// A run in which an algorithm is executed a given number of times.
+  /// </summary>
+  [Item("Batch Run", "A run in which an algorithm is executed a given number of times.")]
+  [Creatable("Testing & Analysis")]
+  [StorableClass]
+  public sealed class BatchRun : NamedItem {
+    public override Image ItemImage {
+      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Event; }
+    }
+
+    private IAlgorithm algorithm;
+    [Storable]
+    private IAlgorithm AlgorithmPersistence {
+      get { return algorithm; }
+      set {
+        if (algorithm != null) DeregisterAlgorithmEvents();
+        algorithm = value;
+        if (algorithm != null) RegisterAlgorithmEvents();
+      }
+    }
+    public IAlgorithm Algorithm {
+      get { return algorithm; }
+      set {
+        if (algorithm != value) {
+          if (algorithm != null) DeregisterAlgorithmEvents();
+          algorithm = value;
+          if (algorithm != null) RegisterAlgorithmEvents();
+          OnAlgorithmChanged();
+          Prepare();
+        }
+      }
+    }
+
+    [Storable]
+    private int repetitions;
+    public int Repetitions {
+      get { return repetitions; }
+      set {
+        if (repetitions != value) {
+          repetitions = value;
+          OnRepetitionsChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private ResultCollectionList results;
+    public ResultCollectionList Results {
+      get { return results; }
+    }
+
+    [Storable]
+    private TimeSpan executionTime;
+    public TimeSpan ExecutionTime {
+      get { return executionTime; }
+      private set {
+        if (executionTime != value) {
+          executionTime = value;
+          OnExecutionTimeChanged();
+        }
+      }
+    }
+
+    private bool running;
+    public bool Running {
+      get { return running; }
+      private set {
+        if (running != value) {
+          running = value;
+          OnRunningChanged();
+        }
+      }
+    }
+
+    public bool Finished {
+      get { return ((Algorithm == null) || (Algorithm.Finished && (results.Count >= repetitions))); }
+    }
+
+    private bool canceled;
+
+    public BatchRun()
+      : base() {
+      repetitions = 10;
+      results = new ResultCollectionList();
+      executionTime = TimeSpan.Zero;
+    }
+    public BatchRun(string name) : base(name) {
+      repetitions = 10;
+      results = new ResultCollectionList();
+      executionTime = TimeSpan.Zero;
+    }
+    public BatchRun(string name, string description) : base(name, description) {
+      repetitions = 10;
+      results = new ResultCollectionList();
+      executionTime = TimeSpan.Zero;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      BatchRun clone = (BatchRun)base.Clone(cloner);
+      clone.Algorithm = (IAlgorithm)cloner.Clone(algorithm);
+      clone.repetitions = repetitions;
+      clone.results = (ResultCollectionList)cloner.Clone(results);
+      clone.executionTime = executionTime;
+      clone.running = running;
+      clone.canceled = canceled;
+      return clone;
+    }
+
+    public void Prepare() {
+      results.Clear();
+      if (Algorithm != null) Algorithm.Prepare();
+      OnPrepared();
+    }
+    public void Start() {
+      if (Algorithm != null) Algorithm.Start();
+    }
+    public void Stop() {
+      if (Algorithm != null) {
+        canceled = true;
+        Algorithm.Stop();
+      }
+    }
+
+    #region Events
+    public event EventHandler AlgorithmChanged;
+    private void OnAlgorithmChanged() {
+      if (AlgorithmChanged != null)
+        AlgorithmChanged(this, EventArgs.Empty);
+    }
+    public event EventHandler RepetitionsChanged;
+    private void OnRepetitionsChanged() {
+      if (RepetitionsChanged != null)
+        RepetitionsChanged(this, EventArgs.Empty);
+    }
+    public event EventHandler ExecutionTimeChanged;
+    private void OnExecutionTimeChanged() {
+      if (ExecutionTimeChanged != null)
+        ExecutionTimeChanged(this, EventArgs.Empty);
+    }
+    public event EventHandler RunningChanged;
+    private void OnRunningChanged() {
+      if (RunningChanged != null)
+        RunningChanged(this, EventArgs.Empty);
+    }
+    public event EventHandler Prepared;
+    private void OnPrepared() {
+      if (Prepared != null)
+        Prepared(this, EventArgs.Empty);
+    }
+    public event EventHandler Started;
+    private void OnStarted() {
+      if (Started != null)
+        Started(this, EventArgs.Empty);
+    }
+    public event EventHandler Stopped;
+    private void OnStopped() {
+      if (Stopped != null)
+        Stopped(this, EventArgs.Empty);
+      canceled = false;
+      Running = false;
+    }
+    public event EventHandler<HeuristicLab.Common.EventArgs<Exception>> ExceptionOccurred;
+    private void OnExceptionOccurred(Exception exception) {
+      if (ExceptionOccurred != null)
+        ExceptionOccurred(this, new HeuristicLab.Common.EventArgs<Exception>(exception));
+    }
+
+    private void DeregisterAlgorithmEvents() {
+      algorithm.Prepared -= new EventHandler(Algorithm_Prepared);
+      algorithm.RunningChanged -= new EventHandler(Algorithm_RunningChanged);
+      algorithm.ExceptionOccurred -= new EventHandler<HeuristicLab.Common.EventArgs<Exception>>(Algorithm_ExceptionOccurred);
+    }
+
+    private void RegisterAlgorithmEvents() {
+      algorithm.Prepared += new EventHandler(Algorithm_Prepared);
+      algorithm.RunningChanged += new EventHandler(Algorithm_RunningChanged);
+      algorithm.ExceptionOccurred += new EventHandler<HeuristicLab.Common.EventArgs<Exception>>(Algorithm_ExceptionOccurred);
+    }
+
+    private void Algorithm_Prepared(object sender, EventArgs e) {
+      results.Add(Algorithm.Results);
+    }
+    private void Algorithm_RunningChanged(object sender, EventArgs e) {
+      if (Algorithm.Running) {
+        Running = true;
+        OnStarted();
+      } else {
+        if (!canceled && (results.Count < repetitions)) {
+          ExecutionTime += Algorithm.ExecutionTime;
+          Algorithm.Prepare();
+          Algorithm.Start();
+        } else {
+          if (Algorithm.Finished) ExecutionTime += Algorithm.ExecutionTime;
+          OnStopped();
+        }
+      }
+    }
+    private void Algorithm_ExceptionOccurred(object sender, HeuristicLab.Common.EventArgs<Exception> e) {
+      OnExceptionOccurred(e.Value);
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs	(revision 3225)
+++ trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs	(revision 3226)
@@ -88,10 +88,7 @@
     }
 
-    private ReadOnlyObservableKeyedCollection<string, IVariable> readOnlyResults;
-    public override IObservableKeyedCollection<string, IVariable> Results {
+    public override ResultCollection Results {
       get {
-        if (readOnlyResults == null)
-          readOnlyResults = ((VariableCollection)globalScope.Variables["Results"].Value).AsReadOnly();
-        return readOnlyResults;
+        return (ResultCollection)globalScope.Variables["Results"].Value;
       }
     }
@@ -114,5 +111,5 @@
       : base() {
       globalScope = new Scope("Global Scope");
-      globalScope.Variables.Add(new Variable("Results", new VariableCollection()));
+      globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
       OperatorGraph = new OperatorGraph();
       InitializeEngine();
@@ -121,5 +118,5 @@
       : base(name) {
       globalScope = new Scope("Global Scope");
-      globalScope.Variables.Add(new Variable("Results", new VariableCollection()));
+      globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
       OperatorGraph = new OperatorGraph();
       InitializeEngine();
@@ -128,5 +125,5 @@
       : base(name, parameters) {
       globalScope = new Scope("Global Scope");
-      globalScope.Variables.Add(new Variable("Results", new VariableCollection()));
+      globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
       OperatorGraph = new OperatorGraph();
       InitializeEngine();
@@ -135,5 +132,5 @@
       : base(name, description) {
       globalScope = new Scope("Global Scope");
-      globalScope.Variables.Add(new Variable("Results", new VariableCollection()));
+      globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
       OperatorGraph = new OperatorGraph();
       InitializeEngine();
@@ -142,5 +139,5 @@
       : base(name, description, parameters) {
       globalScope = new Scope("Global Scope");
-      globalScope.Variables.Add(new Variable("Results", new VariableCollection()));
+      globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
       OperatorGraph = new OperatorGraph();
       InitializeEngine();
@@ -181,6 +178,5 @@
     protected override void OnPrepared() {
       globalScope.Clear();
-      globalScope.Variables.Add(new Variable("Results", new VariableCollection()));
-      readOnlyResults = null;
+      globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
 
       if (engine != null) {
Index: trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 3225)
+++ trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 3226)
@@ -86,5 +86,8 @@
     <None Include="HeuristicLabOptimizationPlugin.cs.frame" />
     <Compile Include="Algorithm.cs" />
+    <Compile Include="BatchRun.cs" />
+    <Compile Include="ResultCollectionList.cs" />
     <Compile Include="Interfaces\IMultiObjectiveSolutionsVisualizer.cs" />
+    <Compile Include="Interfaces\IResult.cs" />
     <Compile Include="Interfaces\ISingleObjectiveSolutionsVisualizer.cs" />
     <Compile Include="Interfaces\ISolutionsVisualizer.cs" />
@@ -114,4 +117,5 @@
     <Compile Include="Interfaces\ITabuMoveEvaluator.cs" />
     <Compile Include="Interfaces\ITabuMoveMaker.cs" />
+    <Compile Include="Result.cs" />
     <Compile Include="TabuMoveMaker.cs" />
     <Compile Include="UserDefinedAlgorithm.cs" />
@@ -119,4 +123,5 @@
     <Compile Include="HeuristicLabOptimizationPlugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ResultCollection.cs" />
   </ItemGroup>
   <ItemGroup>
Index: trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IAlgorithm.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IAlgorithm.cs	(revision 3225)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IAlgorithm.cs	(revision 3226)
@@ -32,5 +32,5 @@
     Type ProblemType { get; }
     IProblem Problem { get; set; }
-    IObservableKeyedCollection<string, IVariable> Results { get; }
+    ResultCollection Results { get; }
     TimeSpan ExecutionTime { get; }
     bool Running { get; }
@@ -43,4 +43,5 @@
     event EventHandler ProblemChanged;
     event EventHandler ExecutionTimeChanged;
+    event EventHandler RunningChanged;
     event EventHandler Prepared;
     event EventHandler Started;
Index: trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IResult.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IResult.cs	(revision 3226)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IResult.cs	(revision 3226)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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 HeuristicLab.Core;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// Represents a result which has a name and a data type and holds an IItem.
+  /// </summary>
+  public interface IResult : INamedItem {
+    Type DataType { get; }
+    IItem Value { get; set; }
+
+    /// <inheritdoc/>
+    event EventHandler ValueChanged;
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/Result.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Result.cs	(revision 3226)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Result.cs	(revision 3226)
@@ -0,0 +1,117 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// Represents a result which has a name and a data type and holds an IItem.
+  /// </summary>
+  [Item("Result", "A result which has a name and a data type and holds an IItem.")]
+  [StorableClass]
+  public sealed class Result : NamedItem, IResult {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public override bool CanChangeDescription {
+      get { return false; }
+    }
+
+    [Storable]
+    private Type dataType;
+    public Type DataType {
+      get { return dataType; }
+    }
+
+    private IItem value;
+    [Storable]
+    public IItem Value {
+      get { return value; }
+      set {
+        if (this.value != value) {
+          if ((value != null) && (!dataType.IsInstanceOfType(value)))
+            throw new ArgumentException(
+              string.Format("Type mismatch. Value is not a \"{0}\".",
+                            dataType.GetPrettyName())
+            );
+
+          if (this.value != null) this.value.ToStringChanged -= new EventHandler(Value_ToStringChanged);
+          this.value = value;
+          if (this.value != null) this.value.ToStringChanged += new EventHandler(Value_ToStringChanged);
+          OnValueChanged();
+        }
+      }
+    }
+
+    public Result()
+      : base("Anonymous") {
+      this.dataType = typeof(IItem);
+      this.value = null;
+    }
+    public Result(string name, Type dataType)
+      : base(name) {
+      this.dataType = dataType;
+      this.value = null;
+    }
+    public Result(string name, string description, Type dataType)
+      : base(name, description) {
+      this.dataType = dataType;
+      this.value = null;
+    }
+    public Result(string name, IItem value)
+      : base(name) {
+      this.dataType = value == null ? typeof(IItem) : value.GetType();
+      this.value = value;
+      if (this.value != null) this.value.ToStringChanged += new EventHandler(Value_ToStringChanged);
+    }
+    public Result(string name, string description, IItem value)
+      : base(name, description) {
+      this.dataType = value == null ? typeof(IItem) : value.GetType();
+      this.value = value;
+      if (this.value != null) this.value.ToStringChanged += new EventHandler(Value_ToStringChanged);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      Result clone = new Result(Name, Description, (IItem)cloner.Clone(value));
+      cloner.RegisterClonedObject(this, clone);
+      clone.dataType = dataType;
+      return clone;
+    }
+
+    public override string ToString() {
+      return string.Format("{0}: {1} ({2})", Name, Value == null ? "null" : Value.ToString(), DataType.GetPrettyName());
+    }
+
+    public event EventHandler ValueChanged;
+    private void OnValueChanged() {
+      if (ValueChanged != null)
+        ValueChanged(this, EventArgs.Empty);
+      OnToStringChanged();
+    }
+
+    private void Value_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/ResultCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/ResultCollection.cs	(revision 3226)
+++ trunk/sources/HeuristicLab.Optimization/3.3/ResultCollection.cs	(revision 3226)
@@ -0,0 +1,41 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [StorableClass]
+  [Item("ResultCollection", "Represents a collection of results.")]
+  public sealed class ResultCollection : NamedItemCollection<IResult> {
+    public ResultCollection() : base() { }
+    public ResultCollection(int capacity) : base(capacity) { }
+    public ResultCollection(IEnumerable<IResult> collection) : base(collection) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      ResultCollection clone = new ResultCollection(this.Select(x => (IResult)cloner.Clone(x)));
+      cloner.RegisterClonedObject(this, clone);
+      return clone;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/ResultCollectionList.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/ResultCollectionList.cs	(revision 3226)
+++ trunk/sources/HeuristicLab.Optimization/3.3/ResultCollectionList.cs	(revision 3226)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [StorableClass]
+  [Item("ResultCollectionList", "Represents list of result collections.")]
+  public sealed class ResultCollectionList : ItemList<ResultCollection> {
+    public ResultCollectionList() : base() { }
+    public ResultCollectionList(int capacity) : base(capacity) { }
+    public ResultCollectionList(IEnumerable<ResultCollection> collection) : base(collection) { }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimizer/3.3/HeuristicLab.Optimizer-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Optimizer/3.3/HeuristicLab.Optimizer-3.3.csproj	(revision 3225)
+++ trunk/sources/HeuristicLab.Optimizer/3.3/HeuristicLab.Optimizer-3.3.csproj	(revision 3226)
@@ -137,7 +137,4 @@
     <None Include="app.config" />
     <EmbeddedResource Include="Documents\FirstSteps.rtf" />
-    <EmbeddedResource Include="Documents\GA_TSP.hl" />
-    <EmbeddedResource Include="Documents\LS_OneMax.hl" />
-    <EmbeddedResource Include="Documents\SA_Rastrigin.hl" />
     <None Include="HeuristicLab.snk" />
     <None Include="Properties\AssemblyInfo.frame" />
@@ -178,4 +175,5 @@
   </ItemGroup>
   <ItemGroup>
+    <EmbeddedResource Include="Documents\GA_TSP.hl" />
     <EmbeddedResource Include="Properties\Resources.resx">
       <Generator>ResXFileCodeGenerator</Generator>
Index: trunk/sources/HeuristicLab.SequentialEngine/3.3/SequentialEngine.cs
===================================================================
--- trunk/sources/HeuristicLab.SequentialEngine/3.3/SequentialEngine.cs	(revision 3225)
+++ trunk/sources/HeuristicLab.SequentialEngine/3.3/SequentialEngine.cs	(revision 3226)
@@ -60,6 +60,6 @@
         catch (Exception ex) {
           ExecutionStack.Push(operation);
+          OnExceptionOccurred(ex);
           Stop();
-          OnExceptionOccurred(ex);
         }
         if (operation.Operator.Breakpoint)
