Index: /trunk/sources/HeuristicLab.Core.Views/3.3/EngineView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/EngineView.cs	(revision 3259)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/EngineView.cs	(revision 3260)
@@ -103,5 +103,4 @@
       else {
         UpdateExecutionTimeTextBox();
-        logTextBox.Clear();
         Log("Engine prepared");
       }
@@ -127,5 +126,5 @@
     protected virtual void Content_ExecutionTimeChanged(object sender, EventArgs e) {
       executionTimeCounter++;
-      if ((executionTimeCounter == 100) || !Content.Running) {
+      if ((executionTimeCounter >= 100) || !Content.Running) {
         executionTimeCounter = 0;
         UpdateExecutionTimeTextBox();
Index: /trunk/sources/HeuristicLab.Core/3.3/Interfaces/IParameterizedItem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/Interfaces/IParameterizedItem.cs	(revision 3259)
+++ /trunk/sources/HeuristicLab.Core/3.3/Interfaces/IParameterizedItem.cs	(revision 3260)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Collections.Generic;
 using HeuristicLab.Collections;
 
@@ -28,4 +29,6 @@
   public interface IParameterizedItem : IItem {
     IObservableKeyedCollection<string, IParameter> Parameters { get; }
+
+    void CollectParameterValues(IDictionary<string, IItem> values);
   }
 }
Index: /trunk/sources/HeuristicLab.Core/3.3/ParameterizedNamedItem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/ParameterizedNamedItem.cs	(revision 3259)
+++ /trunk/sources/HeuristicLab.Core/3.3/ParameterizedNamedItem.cs	(revision 3260)
@@ -20,4 +20,6 @@
 #endregion
 
+using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Collections;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -82,4 +84,16 @@
       return clone;
     }
+
+    public virtual void CollectParameterValues(IDictionary<string, IItem> values) {
+      foreach (IValueParameter param in parameters.OfType<IValueParameter>()) {
+        values.Add(param.Name, param.Value != null ? (IItem)param.Value.Clone() : null);
+        if (param.Value is IParameterizedItem) {
+          Dictionary<string, IItem> children = new Dictionary<string, IItem>();
+          ((IParameterizedItem)param.Value).CollectParameterValues(children);
+          foreach (string key in children.Keys)
+            values.Add(param.Name + "." + key, children[key]);
+        }
+      }
+    }
   }
 }
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs	(revision 3259)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs	(revision 3260)
@@ -174,5 +174,5 @@
     protected virtual void Content_ExecutionTimeChanged(object sender, EventArgs e) {
       executionTimeCounter++;
-      if ((executionTimeCounter == 100) || !Content.Running) {
+      if ((executionTimeCounter >= 100) || !Content.Running) {
         executionTimeCounter = 0;
         UpdateExecutionTimeTextBox();
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.Designer.cs	(revision 3259)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.Designer.cs	(revision 3260)
@@ -52,5 +52,5 @@
       this.newAlgorithmButton = new System.Windows.Forms.Button();
       this.algorithmViewHost = new HeuristicLab.Core.Views.ViewHost();
-      this.resultsTabPage = new System.Windows.Forms.TabPage();
+      this.runsTabPage = new System.Windows.Forms.TabPage();
       this.startButton = new System.Windows.Forms.Button();
       this.stopButton = new System.Windows.Forms.Button();
@@ -62,9 +62,9 @@
       this.repetitionsLabel = new System.Windows.Forms.Label();
       this.repetitionsNumericUpDown = new System.Windows.Forms.NumericUpDown();
-      this.resultsView = new HeuristicLab.Optimization.Views.ResultCollectionView();
+      this.runsView = new HeuristicLab.Optimization.Views.RunCollectionView();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.tabControl.SuspendLayout();
       this.algorithmTabPage.SuspendLayout();
-      this.resultsTabPage.SuspendLayout();
+      this.runsTabPage.SuspendLayout();
       ((System.ComponentModel.ISupportInitialize)(this.repetitionsNumericUpDown)).BeginInit();
       this.SuspendLayout();
@@ -86,5 +86,5 @@
                   | System.Windows.Forms.AnchorStyles.Right)));
       this.tabControl.Controls.Add(this.algorithmTabPage);
-      this.tabControl.Controls.Add(this.resultsTabPage);
+      this.tabControl.Controls.Add(this.runsTabPage);
       this.tabControl.Location = new System.Drawing.Point(0, 78);
       this.tabControl.Name = "tabControl";
@@ -152,14 +152,14 @@
       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;
+      // 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, 348);
+      this.runsTabPage.TabIndex = 2;
+      this.runsTabPage.Text = "Runs";
+      this.runsTabPage.UseVisualStyleBackColor = true;
       // 
       // startButton
@@ -268,15 +268,15 @@
       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)
+      // 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.resultsView.Caption = "ResultCollection";
-      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;
+      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, 336);
+      this.runsView.TabIndex = 0;
       // 
       // BatchRunView
@@ -309,5 +309,5 @@
       this.tabControl.ResumeLayout(false);
       this.algorithmTabPage.ResumeLayout(false);
-      this.resultsTabPage.ResumeLayout(false);
+      this.runsTabPage.ResumeLayout(false);
       ((System.ComponentModel.ISupportInitialize)(this.repetitionsNumericUpDown)).EndInit();
       this.ResumeLayout(false);
@@ -331,8 +331,8 @@
     private System.Windows.Forms.OpenFileDialog openFileDialog;
     private System.Windows.Forms.SaveFileDialog saveFileDialog;
-    private System.Windows.Forms.TabPage resultsTabPage;
+    private System.Windows.Forms.TabPage runsTabPage;
     private System.Windows.Forms.Label repetitionsLabel;
     private System.Windows.Forms.NumericUpDown repetitionsNumericUpDown;
-    private ResultCollectionView resultsView;
+    private RunCollectionView runsView;
 
   }
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.cs	(revision 3259)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.cs	(revision 3260)
@@ -85,5 +85,5 @@
         repetitionsNumericUpDown.Enabled = false;
         algorithmViewHost.Content = null;
-        resultsView.Content = null;
+        runsView.Content = null;
         tabControl.Enabled = false;
         startButton.Enabled = resetButton.Enabled = false;
@@ -96,5 +96,5 @@
         algorithmViewHost.ViewType = null;
         algorithmViewHost.Content = Content.Algorithm;
-        resultsView.Content = Content.Results;
+        runsView.Content = Content.Runs;
         tabControl.Enabled = true;
         startButton.Enabled = !Content.Finished;
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 3259)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj	(revision 3260)
@@ -98,4 +98,16 @@
       <DependentUpon>BatchRunView.cs</DependentUpon>
     </Compile>
+    <Compile Include="RunCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="RunCollectionView.Designer.cs">
+      <DependentUpon>RunCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="RunView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="RunView.Designer.cs">
+      <DependentUpon>RunView.cs</DependentUpon>
+    </Compile>
     <Compile Include="UserDefinedAlgorithmView.cs">
       <SubType>UserControl</SubType>
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.Designer.cs	(revision 3260)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.Designer.cs	(revision 3260)
@@ -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 RunCollectionView {
+    /// <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/RunCollectionView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.cs	(revision 3260)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.cs	(revision 3260)
@@ -0,0 +1,52 @@
+﻿#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.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Optimization.Views {
+  [View("RunCollection View")]
+  [Content(typeof(RunCollection), true)]
+  public partial class RunCollectionView : ItemCollectionView<Run> {
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariablesScopeView"/> with caption "Variables Scope View".
+    /// </summary>
+    public RunCollectionView() {
+      InitializeComponent();
+      Caption = "RunCollection";
+      itemsGroupBox.Text = "Runs";
+    }
+    /// <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 RunCollectionView(RunCollection content)
+      : this() {
+      Content = content;
+    }
+
+    protected override Run CreateItem() {
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunView.Designer.cs	(revision 3260)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunView.Designer.cs	(revision 3260)
@@ -0,0 +1,199 @@
+#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 RunView {
+    /// <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() {
+      System.Windows.Forms.ListViewGroup listViewGroup1 = new System.Windows.Forms.ListViewGroup("Parameters", System.Windows.Forms.HorizontalAlignment.Left);
+      System.Windows.Forms.ListViewGroup listViewGroup2 = new System.Windows.Forms.ListViewGroup("Results", System.Windows.Forms.HorizontalAlignment.Left);
+      this.parametersResultsGroupBox = new System.Windows.Forms.GroupBox();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.viewHost = new HeuristicLab.Core.Views.ViewHost();
+      this.listView = new System.Windows.Forms.ListView();
+      this.nameColumnHeader = new System.Windows.Forms.ColumnHeader();
+      this.valueColumnHeader = new System.Windows.Forms.ColumnHeader();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.parametersResultsGroupBox.SuspendLayout();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.detailsGroupBox.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(423, 20);
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Size = new System.Drawing.Size(423, 20);
+      // 
+      // parametersResultsGroupBox
+      // 
+      this.parametersResultsGroupBox.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.parametersResultsGroupBox.Controls.Add(this.splitContainer);
+      this.parametersResultsGroupBox.Location = new System.Drawing.Point(0, 52);
+      this.parametersResultsGroupBox.Name = "parametersResultsGroupBox";
+      this.parametersResultsGroupBox.Size = new System.Drawing.Size(495, 299);
+      this.parametersResultsGroupBox.TabIndex = 4;
+      this.parametersResultsGroupBox.TabStop = false;
+      this.parametersResultsGroupBox.Text = "Parameters && Results";
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.listView);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.detailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(489, 280);
+      this.splitContainer.SplitterDistance = 177;
+      this.splitContainer.TabIndex = 0;
+      // 
+      // detailsGroupBox
+      // 
+      this.detailsGroupBox.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.detailsGroupBox.Controls.Add(this.viewHost);
+      this.detailsGroupBox.Location = new System.Drawing.Point(3, 3);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(302, 274);
+      this.detailsGroupBox.TabIndex = 0;
+      this.detailsGroupBox.TabStop = false;
+      this.detailsGroupBox.Text = "Details";
+      // 
+      // viewHost
+      // 
+      this.viewHost.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.viewHost.Content = null;
+      this.viewHost.Location = new System.Drawing.Point(6, 19);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.Size = new System.Drawing.Size(290, 249);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewType = null;
+      // 
+      // listView
+      // 
+      this.listView.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.listView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.nameColumnHeader,
+            this.valueColumnHeader});
+      this.listView.FullRowSelect = true;
+      listViewGroup1.Header = "Parameters";
+      listViewGroup1.Name = "parametersGroup";
+      listViewGroup2.Header = "Results";
+      listViewGroup2.Name = "resultsGroup";
+      this.listView.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {
+            listViewGroup1,
+            listViewGroup2});
+      this.listView.HideSelection = false;
+      this.listView.Location = new System.Drawing.Point(3, 3);
+      this.listView.MultiSelect = false;
+      this.listView.Name = "listView";
+      this.listView.ShowItemToolTips = true;
+      this.listView.Size = new System.Drawing.Size(171, 274);
+      this.listView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.listView.TabIndex = 0;
+      this.listView.UseCompatibleStateImageBehavior = false;
+      this.listView.View = System.Windows.Forms.View.Details;
+      this.listView.SelectedIndexChanged += new System.EventHandler(this.listView_SelectedIndexChanged);
+      // 
+      // nameColumnHeader
+      // 
+      this.nameColumnHeader.Text = "Name";
+      // 
+      // valueColumnHeader
+      // 
+      this.valueColumnHeader.Text = "Value";
+      // 
+      // RunView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.parametersResultsGroupBox);
+      this.Name = "RunView";
+      this.Size = new System.Drawing.Size(495, 351);
+      this.Controls.SetChildIndex(this.parametersResultsGroupBox, 0);
+      this.Controls.SetChildIndex(this.descriptionLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.parametersResultsGroupBox.ResumeLayout(false);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.detailsGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox parametersResultsGroupBox;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.GroupBox detailsGroupBox;
+    private System.Windows.Forms.ListView listView;
+    private System.Windows.Forms.ColumnHeader nameColumnHeader;
+    private System.Windows.Forms.ColumnHeader valueColumnHeader;
+    private HeuristicLab.Core.Views.ViewHost viewHost;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunView.cs	(revision 3260)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunView.cs	(revision 3260)
@@ -0,0 +1,109 @@
+#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.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Optimization.Views {
+  /// <summary>
+  /// The visual representation of a <see cref="Variable"/>.
+  /// </summary>
+  [View("Run View")]
+  [Content(typeof(Run), true)]
+  public sealed partial class RunView : 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 Run Content {
+      get { return (Run)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableView"/> with caption "Variable".
+    /// </summary>
+    public RunView() {
+      InitializeComponent();
+      Caption = "Run";
+    }
+    /// <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 RunView(Run content)
+      : this() {
+      Content = content;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      FillListView();
+      viewHost.ViewType = null;
+      viewHost.Content = null;
+      if (Content == null) {
+        Caption = "Run";
+        parametersResultsGroupBox.Enabled = false;
+      } else {
+        Caption = Content.Name + " (" + Content.GetType().Name + ")";
+        parametersResultsGroupBox.Enabled = true;
+      }
+    }
+
+    private void FillListView() {
+      listView.Items.Clear();
+      if (Content != null) {
+        foreach (string key in Content.Parameters.Keys) {
+          IItem value = Content.Parameters[key];
+          ListViewItem item = new ListViewItem(new string[] { key, value != null ? value.ToString() : "-" });
+          item.Tag = value;
+          item.Group = listView.Groups["parametersGroup"];
+          listView.Items.Add(item);
+        }
+        foreach (string key in Content.Results.Keys) {
+          IItem value = Content.Results[key];
+          ListViewItem item = new ListViewItem(new string[] { key, value != null ? value.ToString() : "-" });
+          item.Tag = value;
+          item.Group = listView.Groups["resultsGroup"];
+          listView.Items.Add(item);
+        }
+        if (listView.Items.Count > 0) {
+          for (int i = 0; i < listView.Columns.Count; i++)
+            listView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+        }
+      }
+    }
+
+    private void listView_SelectedIndexChanged(object sender, EventArgs e) {
+      if (listView.SelectedItems.Count == 1) {
+        viewHost.ViewType = null;
+        viewHost.Content = listView.SelectedItems[0].Tag;
+      } else {
+        viewHost.Content = null;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Optimization/3.3/Algorithm.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/Algorithm.cs	(revision 3259)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/Algorithm.cs	(revision 3260)
@@ -21,6 +21,6 @@
 
 using System;
+using System.Collections.Generic;
 using System.Drawing;
-using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -120,4 +120,13 @@
     }
 
+    public override void CollectParameterValues(IDictionary<string, IItem> values) {
+      base.CollectParameterValues(values);
+      Problem.CollectParameterValues(values);
+    }
+    public virtual void CollectResultValues(IDictionary<string, IItem> values) {
+      foreach (IResult result in Results)
+        values.Add(result.Name, result.Value != null ? (IItem)result.Value.Clone() : null);
+    }
+
     #region Events
     public event EventHandler ProblemChanged;
Index: /trunk/sources/HeuristicLab.Optimization/3.3/BatchRun.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/BatchRun.cs	(revision 3259)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/BatchRun.cs	(revision 3260)
@@ -22,5 +22,4 @@
 using System;
 using System.Drawing;
-using HeuristicLab.Collections;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -74,7 +73,7 @@
 
     [Storable]
-    private ResultCollection results;
-    public ResultCollection Results {
-      get { return results; }
+    private RunCollection runs;
+    public RunCollection Runs {
+      get { return runs; }
     }
 
@@ -103,5 +102,5 @@
 
     public bool Finished {
-      get { return ((Algorithm == null) || (Algorithm.Finished && (results.Count >= repetitions))); }
+      get { return ((Algorithm == null) || (Algorithm.Finished && (runs.Count >= repetitions))); }
     }
 
@@ -111,15 +110,15 @@
       : base() {
       repetitions = 10;
-      results = new ResultCollection();
+      runs = new RunCollection();
       executionTime = TimeSpan.Zero;
     }
     public BatchRun(string name) : base(name) {
       repetitions = 10;
-      results = new ResultCollection();
+      runs = new RunCollection();
       executionTime = TimeSpan.Zero;
     }
     public BatchRun(string name, string description) : base(name, description) {
       repetitions = 10;
-      results = new ResultCollection();
+      runs = new RunCollection();
       executionTime = TimeSpan.Zero;
     }
@@ -129,5 +128,5 @@
       clone.Algorithm = (IAlgorithm)cloner.Clone(algorithm);
       clone.repetitions = repetitions;
-      clone.results = (ResultCollection)cloner.Clone(results);
+      clone.runs = (RunCollection)cloner.Clone(runs);
       clone.executionTime = executionTime;
       clone.running = running;
@@ -137,5 +136,6 @@
 
     public void Prepare() {
-      results.Clear();
+      executionTime = TimeSpan.Zero;
+      runs.Clear();
       if (Algorithm != null) Algorithm.Prepare();
       OnPrepared();
@@ -196,5 +196,4 @@
 
     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);
@@ -202,12 +201,8 @@
 
     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(new Result("Run " + DateTime.Now.ToString(), Algorithm.Results));
-    }
     private void Algorithm_RunningChanged(object sender, EventArgs e) {
       if (Algorithm.Running) {
@@ -215,10 +210,11 @@
         OnStarted();
       } else {
-        if (!canceled && (results.Count < repetitions)) {
+        if (!canceled) {
           ExecutionTime += Algorithm.ExecutionTime;
+          runs.Add(new Run("Run " + Algorithm.ExecutionTime.ToString(), Algorithm));
           Algorithm.Prepare();
-          Algorithm.Start();
+          if (runs.Count < repetitions) Algorithm.Start();
+          else OnStopped();
         } else {
-          if (Algorithm.Finished) ExecutionTime += Algorithm.ExecutionTime;
           OnStopped();
         }
Index: /trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs	(revision 3259)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs	(revision 3260)
@@ -216,10 +216,10 @@
       Engine.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(Engine_ExceptionOccurred);
       Engine.ExecutionTimeChanged += new EventHandler(Engine_ExecutionTimeChanged);
-      Engine.Stopped += new EventHandler(Engine_Stopped);
+      Engine.RunningChanged += new EventHandler(Engine_RunningChanged);
     }
     private void DeregisterEngineEvents() {
       Engine.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(Engine_ExceptionOccurred);
       Engine.ExecutionTimeChanged -= new EventHandler(Engine_ExecutionTimeChanged);
-      Engine.Stopped -= new EventHandler(Engine_Stopped);
+      Engine.RunningChanged -= new EventHandler(Engine_RunningChanged);
     }
 
@@ -230,6 +230,6 @@
       OnExecutionTimeChanged();
     }
-    private void Engine_Stopped(object sender, EventArgs e) {
-      OnStopped();
+    private void Engine_RunningChanged(object sender, EventArgs e) {
+      if (!Engine.Running) OnStopped();
     }
   }
Index: /trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 3259)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 3260)
@@ -87,4 +87,6 @@
     <Compile Include="Algorithm.cs" />
     <Compile Include="BatchRun.cs" />
+    <Compile Include="RunCollection.cs" />
+    <Compile Include="Run.cs" />
     <Compile Include="Interfaces\IMultiObjectiveSolutionsVisualizer.cs" />
     <Compile Include="Interfaces\IResult.cs" />
Index: /trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IAlgorithm.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IAlgorithm.cs	(revision 3259)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IAlgorithm.cs	(revision 3260)
@@ -21,5 +21,5 @@
 
 using System;
-using HeuristicLab.Collections;
+using System.Collections.Generic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -41,4 +41,6 @@
     void Stop();
 
+    void CollectResultValues(IDictionary<string, IItem> values);
+
     event EventHandler ProblemChanged;
     event EventHandler ExecutionTimeChanged;
Index: /trunk/sources/HeuristicLab.Optimization/3.3/Run.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/Run.cs	(revision 3260)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/Run.cs	(revision 3260)
@@ -0,0 +1,91 @@
+#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 HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// Represents the parameters and results of an algorithm run.
+  /// </summary>
+  [Item("Run", "The parameters and results of an algorithm run.")]
+  [StorableClass]
+  public sealed class Run : NamedItem {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public override bool CanChangeDescription {
+      get { return false; }
+    }
+
+    [Storable]
+    private Dictionary<string, IItem> parameters;
+    public IDictionary<string, IItem> Parameters {
+      get { return parameters; }
+    }
+    [Storable]
+    private Dictionary<string, IItem> results;
+    public IDictionary<string, IItem> Results {
+      get { return results; }
+    }
+
+    public Run()
+      : base("Anonymous") {
+      parameters = new Dictionary<string, IItem>();
+      results = new Dictionary<string, IItem>();
+    }
+    public Run(string name)
+      : base(name) {
+      parameters = new Dictionary<string, IItem>();
+      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);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      Run clone = new Run(Name, Description);
+      cloner.RegisterClonedObject(this, clone);
+      foreach (string key in parameters.Keys)
+        clone.parameters.Add(key, (IItem)cloner.Clone(parameters[key]));
+      foreach (string key in results.Keys)
+        clone.results.Add(key, (IItem)cloner.Clone(results[key]));
+      return clone;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 3260)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 3260)
@@ -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("RunCollection", "Represents a collection of runs.")]
+  public sealed class RunCollection : ItemCollection<Run> {
+    public RunCollection() : base() { }
+    public RunCollection(int capacity) : base(capacity) { }
+    public RunCollection(IEnumerable<Run> collection) : base(collection) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      RunCollection clone = new RunCollection(this.Select(x => (Run)cloner.Clone(x)));
+      cloner.RegisterClonedObject(this, clone);
+      return clone;
+    }
+  }
+}
