Index: /trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithm.cs
===================================================================
--- /trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithm.cs	(revision 3274)
+++ /trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithm.cs	(revision 3275)
@@ -179,6 +179,6 @@
     }
 
-    public override void Prepare(bool clearResults) {
-      if (Problem != null) base.Prepare(clearResults);
+    public override void Prepare() {
+      if (Problem != null) base.Prepare();
     }
 
Index: /trunk/sources/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearch.cs
===================================================================
--- /trunk/sources/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearch.cs	(revision 3274)
+++ /trunk/sources/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearch.cs	(revision 3275)
@@ -154,7 +154,7 @@
     }
 
-    public override void Prepare(bool clearResults) {
+    public override void Prepare() {
       if (Problem != null && MoveGenerator != null && MoveMaker != null && MoveEvaluator != null)
-        base.Prepare(clearResults);
+        base.Prepare();
     }
 
Index: /trunk/sources/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealing.cs
===================================================================
--- /trunk/sources/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealing.cs	(revision 3274)
+++ /trunk/sources/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealing.cs	(revision 3275)
@@ -182,7 +182,7 @@
     }
 
-    public override void Prepare(bool clearResults) {
+    public override void Prepare() {
       if (Problem != null && MoveGenerator != null && MoveMaker != null && MoveEvaluator != null)
-        base.Prepare(clearResults);
+        base.Prepare();
     }
 
Index: /trunk/sources/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearch.cs
===================================================================
--- /trunk/sources/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearch.cs	(revision 3274)
+++ /trunk/sources/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearch.cs	(revision 3275)
@@ -176,8 +176,8 @@
     }
 
-    public override void Prepare(bool clearResults) {
+    public override void Prepare() {
       if (Problem != null && MoveGenerator != null && MoveMaker != null && MoveEvaluator != null &&
           TabuMoveEvaluator != null && TabuMoveMaker != null)
-        base.Prepare(clearResults);
+        base.Prepare();
     }
 
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.Designer.cs	(revision 3274)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.Designer.cs	(revision 3275)
@@ -64,4 +64,6 @@
       this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
       this.stopButton = new System.Windows.Forms.Button();
+      this.runsTabPage = new System.Windows.Forms.TabPage();
+      this.runsView = new HeuristicLab.Optimization.Views.RunCollectionView();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.tabControl.SuspendLayout();
@@ -69,4 +71,5 @@
       this.problemTabPage.SuspendLayout();
       this.resultsTabPage.SuspendLayout();
+      this.runsTabPage.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -89,4 +92,5 @@
       this.tabControl.Controls.Add(this.problemTabPage);
       this.tabControl.Controls.Add(this.resultsTabPage);
+      this.tabControl.Controls.Add(this.runsTabPage);
       this.tabControl.Location = new System.Drawing.Point(0, 52);
       this.tabControl.Name = "tabControl";
@@ -281,4 +285,27 @@
       this.stopButton.UseVisualStyleBackColor = true;
       this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
+      // 
+      // runsTabPage
+      // 
+      this.runsTabPage.Controls.Add(this.runsView);
+      this.runsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.runsTabPage.Name = "runsTabPage";
+      this.runsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.runsTabPage.Size = new System.Drawing.Size(671, 374);
+      this.runsTabPage.TabIndex = 3;
+      this.runsTabPage.Text = "Runs";
+      this.runsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // runsView
+      // 
+      this.runsView.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.runsView.Caption = "RunCollection";
+      this.runsView.Content = null;
+      this.runsView.Location = new System.Drawing.Point(6, 6);
+      this.runsView.Name = "runsView";
+      this.runsView.Size = new System.Drawing.Size(659, 362);
+      this.runsView.TabIndex = 0;
       // 
       // AlgorithmView
@@ -311,4 +338,5 @@
       this.problemTabPage.ResumeLayout(false);
       this.resultsTabPage.ResumeLayout(false);
+      this.runsTabPage.ResumeLayout(false);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -336,4 +364,6 @@
     protected HeuristicLab.Optimization.Views.ResultCollectionView resultsView;
     protected System.Windows.Forms.Button stopButton;
+    protected System.Windows.Forms.TabPage runsTabPage;
+    protected RunCollectionView runsView;
 
   }
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs	(revision 3274)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs	(revision 3275)
@@ -96,4 +96,5 @@
         problemViewHost.Content = null;
         resultsView.Content = null;
+        runsView.Content = null;
         tabControl.Enabled = false;
         startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
@@ -106,4 +107,5 @@
         problemViewHost.Content = Content.Problem;
         resultsView.Content = Content.Results.AsReadOnly();
+        runsView.Content = Content.Runs;
         tabControl.Enabled = true;
         EnableDisableButtons();
@@ -144,5 +146,4 @@
         newProblemButton.Enabled = openProblemButton.Enabled = saveProblemButton.Enabled = Content.ExecutionState != ExecutionState.Started;
         problemViewHost.Enabled = Content.ExecutionState != ExecutionState.Started;
-        resultsView.Enabled = Content.ExecutionState != ExecutionState.Started;
         EnableDisableButtons();
       }
@@ -237,6 +238,6 @@
     }
     protected virtual void resetButton_Click(object sender, EventArgs e) {
-      if (Content.Results.Count > 0) {
-        if (MessageBox.Show(this, "Clear all results of this run?", "Clear All Results?", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes)
+      if (Content.Runs.Count > 0) {
+        if (MessageBox.Show(this, "Clear all runs executed so far?", "Clear All Runs?", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
           Content.Prepare(true);
         else
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/ExperimentView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/ExperimentView.Designer.cs	(revision 3274)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/ExperimentView.Designer.cs	(revision 3275)
@@ -47,4 +47,5 @@
       this.tabControl = new System.Windows.Forms.TabControl();
       this.optimizersTabPage = new System.Windows.Forms.TabPage();
+      this.optimizerListView = new HeuristicLab.Optimization.Views.OptimizerListView();
       this.startButton = new System.Windows.Forms.Button();
       this.stopButton = new System.Windows.Forms.Button();
@@ -53,8 +54,10 @@
       this.executionTimeTextBox = new System.Windows.Forms.TextBox();
       this.pauseButton = new System.Windows.Forms.Button();
-      this.optimizerListView = new HeuristicLab.Optimization.Views.OptimizerListView();
+      this.runsTabPage = new System.Windows.Forms.TabPage();
+      this.runsView = new HeuristicLab.Optimization.Views.RunCollectionView();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.tabControl.SuspendLayout();
       this.optimizersTabPage.SuspendLayout();
+      this.runsTabPage.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -75,4 +78,5 @@
                   | System.Windows.Forms.AnchorStyles.Right)));
       this.tabControl.Controls.Add(this.optimizersTabPage);
+      this.tabControl.Controls.Add(this.runsTabPage);
       this.tabControl.Location = new System.Drawing.Point(0, 52);
       this.tabControl.Name = "tabControl";
@@ -91,4 +95,16 @@
       this.optimizersTabPage.Text = "Optimizers";
       this.optimizersTabPage.UseVisualStyleBackColor = true;
+      // 
+      // optimizerListView
+      // 
+      this.optimizerListView.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.optimizerListView.Caption = "OptimizerList";
+      this.optimizerListView.Content = null;
+      this.optimizerListView.Location = new System.Drawing.Point(6, 6);
+      this.optimizerListView.Name = "optimizerListView";
+      this.optimizerListView.Size = new System.Drawing.Size(659, 362);
+      this.optimizerListView.TabIndex = 0;
       // 
       // startButton
@@ -159,15 +175,26 @@
       this.pauseButton.Click += new System.EventHandler(this.pauseButton_Click);
       // 
-      // optimizerListView
-      // 
-      this.optimizerListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+      // runsTabPage
+      // 
+      this.runsTabPage.Controls.Add(this.runsView);
+      this.runsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.runsTabPage.Name = "runsTabPage";
+      this.runsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.runsTabPage.Size = new System.Drawing.Size(671, 374);
+      this.runsTabPage.TabIndex = 2;
+      this.runsTabPage.Text = "Runs";
+      this.runsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // runsView
+      // 
+      this.runsView.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.optimizerListView.Caption = "OptimizerList";
-      this.optimizerListView.Content = null;
-      this.optimizerListView.Location = new System.Drawing.Point(6, 6);
-      this.optimizerListView.Name = "optimizerListView";
-      this.optimizerListView.Size = new System.Drawing.Size(659, 362);
-      this.optimizerListView.TabIndex = 0;
+      this.runsView.Caption = "RunCollection";
+      this.runsView.Content = null;
+      this.runsView.Location = new System.Drawing.Point(6, 6);
+      this.runsView.Name = "runsView";
+      this.runsView.Size = new System.Drawing.Size(659, 362);
+      this.runsView.TabIndex = 0;
       // 
       // ExperimentView
@@ -198,4 +225,5 @@
       this.tabControl.ResumeLayout(false);
       this.optimizersTabPage.ResumeLayout(false);
+      this.runsTabPage.ResumeLayout(false);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -213,4 +241,6 @@
     private System.Windows.Forms.Button pauseButton;
     private OptimizerListView optimizerListView;
+    private System.Windows.Forms.TabPage runsTabPage;
+    private RunCollectionView runsView;
 
   }
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/ExperimentView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/ExperimentView.cs	(revision 3274)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/ExperimentView.cs	(revision 3275)
@@ -71,4 +71,5 @@
       if (Content == null) {
         optimizerListView.Content = null;
+        runsView.Content = null;
         tabControl.Enabled = false;
         startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
@@ -77,4 +78,5 @@
       } else {
         optimizerListView.Content = Content.Optimizers;
+        runsView.Content = Content.Runs;
         tabControl.Enabled = true;
         EnableDisableButtons();
@@ -125,8 +127,12 @@
     }
     private void resetButton_Click(object sender, EventArgs e) {
-      if (MessageBox.Show(this, "Clear all runs executed so far?", "Clear All Runs?", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
-        Content.Prepare(true);
-      else
-        Content.Prepare(false);
+      if (Content.Runs.Count > 0) {
+        if (MessageBox.Show(this, "Clear all runs executed so far?", "Clear All Runs?", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
+          Content.Prepare(true);
+        else
+          Content.Prepare(false);
+      } else {
+        Content.Prepare();
+      }
     }
     #endregion
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/UserDefinedAlgorithmView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/UserDefinedAlgorithmView.Designer.cs	(revision 3274)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/UserDefinedAlgorithmView.Designer.cs	(revision 3275)
@@ -76,4 +76,5 @@
       this.tabControl.Controls.SetChildIndex(this.globalScopeTabPage, 0);
       this.tabControl.Controls.SetChildIndex(this.operatorGraphTabPage, 0);
+      this.tabControl.Controls.SetChildIndex(this.runsTabPage, 0);
       this.tabControl.Controls.SetChildIndex(this.resultsTabPage, 0);
       this.tabControl.Controls.SetChildIndex(this.engineTabPage, 0);
Index: /trunk/sources/HeuristicLab.Optimization/3.3/Algorithm.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/Algorithm.cs	(revision 3274)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/Algorithm.cs	(revision 3275)
@@ -90,8 +90,15 @@
     public abstract ResultCollection Results { get; }
 
+    [Storable]
+    private RunCollection runs;
+    public RunCollection Runs {
+      get { return runs; }
+    }
+
     protected Algorithm()
       : base() {
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
+      runs = new RunCollection();
     }
     protected Algorithm(string name)
@@ -99,4 +106,5 @@
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
+      runs = new RunCollection();
     }
     protected Algorithm(string name, ParameterCollection parameters)
@@ -104,4 +112,5 @@
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
+      runs = new RunCollection();
     }
     protected Algorithm(string name, string description)
@@ -109,4 +118,5 @@
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
+      runs = new RunCollection();
     }
     protected Algorithm(string name, string description, ParameterCollection parameters)
@@ -114,4 +124,5 @@
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
+      runs = new RunCollection();
     }
 
@@ -121,14 +132,17 @@
       clone.executionTime = executionTime;
       clone.Problem = (IProblem)cloner.Clone(problem);
+      clone.runs = (RunCollection)cloner.Clone(runs);
       return clone;
     }
 
-    public void Prepare() {
-      Prepare(true);
-    }
-    public virtual void Prepare(bool clearResults) {
+    public virtual void Prepare() {
       if ((ExecutionState != ExecutionState.Prepared) && (ExecutionState != ExecutionState.Paused) && (ExecutionState != ExecutionState.Stopped))
         throw new InvalidOperationException(string.Format("Prepare not allowed in execution state \"{0}\".", ExecutionState));
-      ExecutionTime = TimeSpan.Zero;
+    }
+    public void Prepare(bool clearRuns) {
+      if ((ExecutionState != ExecutionState.Prepared) && (ExecutionState != ExecutionState.Paused) && (ExecutionState != ExecutionState.Stopped))
+        throw new InvalidOperationException(string.Format("Prepare not allowed in execution state \"{0}\".", ExecutionState));
+      if (clearRuns) runs.Clear();
+      Prepare();
     }
     public virtual void Start() {
@@ -172,4 +186,5 @@
     public event EventHandler Prepared;
     protected virtual void OnPrepared() {
+      ExecutionTime = TimeSpan.Zero;
       ExecutionState = ExecutionState.Prepared;
       EventHandler handler = Prepared;
@@ -190,4 +205,8 @@
     public event EventHandler Stopped;
     protected virtual void OnStopped() {
+      Run run = new Run("Run (" + ExecutionTime.ToString() + ")");
+      CollectParameterValues(run.Parameters);
+      CollectResultValues(run.Results);
+      runs.Add(run);
       ExecutionState = ExecutionState.Stopped;
       EventHandler handler = Stopped;
Index: /trunk/sources/HeuristicLab.Optimization/3.3/BatchRun.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/BatchRun.cs	(revision 3274)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/BatchRun.cs	(revision 3275)
@@ -25,4 +25,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Collections;
 
 namespace HeuristicLab.Optimization {
@@ -83,5 +84,5 @@
           if (algorithm != null) RegisterAlgorithmEvents();
           OnAlgorithmChanged();
-          Prepare();
+          Prepare(true);
         }
       }
@@ -97,5 +98,5 @@
           OnRepetitionsChanged();
           if ((runs.Count < repetitions) && (Algorithm != null) && (Algorithm.ExecutionState == ExecutionState.Stopped))
-            Prepare(false);
+            Prepare();
         }
       }
@@ -145,15 +146,15 @@
 
     public void Prepare() {
-      Prepare(true);
-    }
-    public void Prepare(bool clearResults) {
+      Prepare(false);
+    }
+    public void Prepare(bool clearRuns) {
       if ((ExecutionState != ExecutionState.Prepared) && (ExecutionState != ExecutionState.Paused) && (ExecutionState != ExecutionState.Stopped))
         throw new InvalidOperationException(string.Format("Prepare not allowed in execution state \"{0}\".", ExecutionState));
       if (Algorithm != null) {
-        if (clearResults) {
+        if (clearRuns) {
           ExecutionTime = TimeSpan.Zero;
           runs.Clear();
         }
-        Algorithm.Prepare();
+        Algorithm.Prepare(clearRuns);
       }
     }
@@ -233,4 +234,7 @@
       algorithm.Started += new EventHandler(Algorithm_Started);
       algorithm.Stopped += new EventHandler(Algorithm_Stopped);
+      algorithm.Runs.CollectionReset += new CollectionItemsChangedEventHandler<Run>(Algorithm_Runs_CollectionReset);
+      algorithm.Runs.ItemsAdded += new CollectionItemsChangedEventHandler<Run>(Algorithm_Runs_ItemsAdded);
+      algorithm.Runs.ItemsRemoved += new CollectionItemsChangedEventHandler<Run>(Algorithm_Runs_ItemsRemoved);
     }
     private void DeregisterAlgorithmEvents() {
@@ -241,6 +245,8 @@
       algorithm.Started -= new EventHandler(Algorithm_Started);
       algorithm.Stopped -= new EventHandler(Algorithm_Stopped);
-    }
-
+      algorithm.Runs.CollectionReset -= new CollectionItemsChangedEventHandler<Run>(Algorithm_Runs_CollectionReset);
+      algorithm.Runs.ItemsAdded -= new CollectionItemsChangedEventHandler<Run>(Algorithm_Runs_ItemsAdded);
+      algorithm.Runs.ItemsRemoved -= new CollectionItemsChangedEventHandler<Run>(Algorithm_Runs_ItemsRemoved);
+    }
     private void Algorithm_ExceptionOccurred(object sender, EventArgs<Exception> e) {
       OnExceptionOccurred(e.Value);
@@ -261,5 +267,4 @@
     private void Algorithm_Stopped(object sender, EventArgs e) {
       ExecutionTime += Algorithm.ExecutionTime;
-      runs.Add(new Run("Run " + Algorithm.ExecutionTime.ToString(), Algorithm));
       OnStopped();
 
@@ -269,4 +274,14 @@
       }
     }
+    private void Algorithm_Runs_CollectionReset(object sender, CollectionItemsChangedEventArgs<Run> e) {
+      Runs.RemoveRange(e.OldItems);
+      Runs.AddRange(e.Items);
+    }
+    private void Algorithm_Runs_ItemsAdded(object sender, CollectionItemsChangedEventArgs<Run> e) {
+      Runs.AddRange(e.Items);
+    }
+    private void Algorithm_Runs_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<Run> e) {
+      Runs.RemoveRange(e.Items);
+    }
     #endregion
   }
Index: /trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs	(revision 3274)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs	(revision 3275)
@@ -157,13 +157,8 @@
     }
 
-    public override void Prepare(bool clearResults) {
-      base.Prepare(clearResults);
-
-      ResultCollection results = Results;
+    public override void Prepare() {
+      base.Prepare();
       globalScope.Clear();
-      if (clearResults)
-        globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
-      else
-        globalScope.Variables.Add(new Variable("Results", results));
+      globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
 
       if (engine != null) {
Index: /trunk/sources/HeuristicLab.Optimization/3.3/Experiment.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/Experiment.cs	(revision 3274)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/Experiment.cs	(revision 3275)
@@ -77,4 +77,10 @@
     }
 
+    [Storable]
+    private RunCollection runs;
+    public RunCollection Runs {
+      get { return runs; }
+    }
+
     private bool stopPending;
 
@@ -84,4 +90,5 @@
       executionTime = TimeSpan.Zero;
       Optimizers = new OptimizerList();
+      runs = new RunCollection();
       stopPending = false;
     }
@@ -90,4 +97,5 @@
       executionTime = TimeSpan.Zero;
       Optimizers = new OptimizerList();
+      runs = new RunCollection();
       stopPending = false;
     }
@@ -96,4 +104,5 @@
       executionTime = TimeSpan.Zero;
       Optimizers = new OptimizerList();
+      runs = new RunCollection();
       stopPending = false;
     }
@@ -104,4 +113,5 @@
       clone.executionTime = executionTime;
       clone.Optimizers = (OptimizerList)cloner.Clone(optimizers);
+      clone.runs = (RunCollection)cloner.Clone(runs);
       clone.stopPending = stopPending;
       return clone;
@@ -109,12 +119,13 @@
 
     public void Prepare() {
-      Prepare(true);
-    }
-    public void Prepare(bool clearResults) {
+      Prepare(false);
+    }
+    public void Prepare(bool clearRuns) {
       if ((ExecutionState != ExecutionState.Prepared) && (ExecutionState != ExecutionState.Paused) && (ExecutionState != ExecutionState.Stopped))
         throw new InvalidOperationException(string.Format("Prepare not allowed in execution state \"{0}\".", ExecutionState));
       if (Optimizers.Count > 0) {
+        if (clearRuns) runs.Clear();
         foreach (IOptimizer optimizer in Optimizers.Where(x => x.ExecutionState != ExecutionState.Started))
-          optimizer.Prepare(clearResults);
+          optimizer.Prepare(clearRuns);
       }
     }
@@ -233,6 +244,8 @@
       optimizer.Started += new EventHandler(optimizer_Started);
       optimizer.Stopped += new EventHandler(optimizer_Stopped);
-    }
-
+      optimizer.Runs.CollectionReset += new CollectionItemsChangedEventHandler<Run>(optimizer_Runs_CollectionReset);
+      optimizer.Runs.ItemsAdded += new CollectionItemsChangedEventHandler<Run>(optimizer_Runs_ItemsAdded);
+      optimizer.Runs.ItemsRemoved += new CollectionItemsChangedEventHandler<Run>(optimizer_Runs_ItemsRemoved);
+    }
     private void DeregisterOptimizerEvents(IOptimizer optimizer) {
       optimizer.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(optimizer_ExceptionOccurred);
@@ -242,4 +255,7 @@
       optimizer.Started -= new EventHandler(optimizer_Started);
       optimizer.Stopped -= new EventHandler(optimizer_Stopped);
+      optimizer.Runs.CollectionReset -= new CollectionItemsChangedEventHandler<Run>(optimizer_Runs_CollectionReset);
+      optimizer.Runs.ItemsAdded -= new CollectionItemsChangedEventHandler<Run>(optimizer_Runs_ItemsAdded);
+      optimizer.Runs.ItemsRemoved -= new CollectionItemsChangedEventHandler<Run>(optimizer_Runs_ItemsRemoved);
     }
     private void optimizer_ExceptionOccurred(object sender, EventArgs<Exception> e) {
@@ -275,4 +291,14 @@
       }
     }
+    private void optimizer_Runs_CollectionReset(object sender, CollectionItemsChangedEventArgs<Run> e) {
+      Runs.RemoveRange(e.OldItems);
+      Runs.AddRange(e.Items);
+    }
+    private void optimizer_Runs_ItemsAdded(object sender, CollectionItemsChangedEventArgs<Run> e) {
+      Runs.AddRange(e.Items);
+    }
+    private void optimizer_Runs_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<Run> e) {
+      Runs.RemoveRange(e.Items);
+    }
     #endregion
   }
Index: /trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IOptimizer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IOptimizer.cs	(revision 3274)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IOptimizer.cs	(revision 3275)
@@ -26,6 +26,8 @@
   /// Interface to represent optimizers such as algorithms, batch runs, or experiments.
   /// </summary>
-  public interface IOptimizer : IExecutable {
-    void Prepare(bool clearResults);
+  public interface IOptimizer : INamedItem, IExecutable {
+    RunCollection Runs { get; }
+
+    void Prepare(bool clearRuns);
   }
 }
Index: /trunk/sources/HeuristicLab.Optimization/3.3/Run.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/Run.cs	(revision 3274)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/Run.cs	(revision 3275)
@@ -59,22 +59,8 @@
       results = new Dictionary<string, IItem>();
     }
-    public Run(string name, IAlgorithm algorithm)
-      : base(name) {
-      parameters = new Dictionary<string, IItem>();
-      results = new Dictionary<string, IItem>();
-      algorithm.CollectParameterValues(parameters);
-      algorithm.CollectResultValues(results);
-    }
     public Run(string name, string description)
       : base(name, description) {
       parameters = new Dictionary<string, IItem>();
       results = new Dictionary<string, IItem>();
-    }
-    public Run(string name, string description, IAlgorithm algorithm)
-      : base(name, description) {
-      parameters = new Dictionary<string, IItem>();
-      results = new Dictionary<string, IItem>();
-      algorithm.CollectParameterValues(parameters);
-      algorithm.CollectResultValues(results);
     }
 
