Index: /trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithm.cs
===================================================================
--- /trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithm.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithm.cs	(revision 3280)
@@ -168,12 +168,12 @@
       geneticAlgorithmMainLoop.ResultsParameter.ActualName = "Results";
 
-      Initialze();
+      Initialize();
     }
     [StorableConstructor]
-    private GeneticAlgorithm(bool deserializing) : base() { }
+    private GeneticAlgorithm(bool deserializing) : base(deserializing) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
       GeneticAlgorithm clone = (GeneticAlgorithm)base.Clone(cloner);
-      clone.Initialze();
+      clone.Initialize();
       return clone;
     }
@@ -249,5 +249,5 @@
     #region Helpers
     [StorableHook(HookType.AfterDeserialization)]
-    private void Initialze() {
+    private void Initialize() {
       InitializeSelectors();
       UpdateSelectors();
Index: /trunk/sources/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearch.cs
===================================================================
--- /trunk/sources/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearch.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearch.cs	(revision 3280)
@@ -33,5 +33,5 @@
 
 namespace HeuristicLab.Algorithms.LocalSearch {
-  [Item("LocalSearch", "A local search algorithm.")]
+  [Item("Local Search", "A local search algorithm.")]
   [Creatable("Algorithms")]
   [StorableClass]
@@ -111,6 +111,4 @@
     #endregion
 
-    [StorableConstructor]
-    private LocalSearch(bool deserializing) : base() { }
     public LocalSearch()
       : base() {
@@ -147,4 +145,6 @@
       Initialize();
     }
+    [StorableConstructor]
+    private LocalSearch(bool deserializing) : base(deserializing) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
Index: /trunk/sources/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealing.cs
===================================================================
--- /trunk/sources/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealing.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealing.cs	(revision 3280)
@@ -133,6 +133,4 @@
     #endregion
 
-    [StorableConstructor]
-    private SimulatedAnnealing(bool deserializing) : base() { }
     public SimulatedAnnealing()
       : base() {
@@ -175,4 +173,6 @@
       Initialize();
     }
+    [StorableConstructor]
+    private SimulatedAnnealing(bool deserializing) : base(deserializing) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
Index: /trunk/sources/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearch.cs
===================================================================
--- /trunk/sources/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearch.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearch.cs	(revision 3280)
@@ -33,5 +33,5 @@
 
 namespace HeuristicLab.Algorithms.TabuSearch {
-  [Item("TabuSearch", "A tabu search algorithm.")]
+  [Item("Tabu Search", "A tabu search algorithm.")]
   [Creatable("Algorithms")]
   [StorableClass]
@@ -128,6 +128,4 @@
     #endregion
 
-    [StorableConstructor]
-    private TabuSearch(bool deserializing) : base() { }
     public TabuSearch()
       : base() {
@@ -169,4 +167,6 @@
       Initialize();
     }
+    [StorableConstructor]
+    private TabuSearch(bool deserializing) : base(deserializing) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
Index: /trunk/sources/HeuristicLab.Core/3.3/DeepCloneable.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/DeepCloneable.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Core/3.3/DeepCloneable.cs	(revision 3280)
@@ -29,4 +29,8 @@
   [StorableClass]
   public abstract class DeepCloneable : IDeepCloneable {
+    protected DeepCloneable() { }
+    [StorableConstructor]
+    protected DeepCloneable(bool deserializing) { }
+
     /// <summary>
     /// Creates a deep clone of this instance.
Index: /trunk/sources/HeuristicLab.Core/3.3/Engine.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/Engine.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Core/3.3/Engine.cs	(revision 3280)
@@ -49,4 +49,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
+      if (ExecutionState == ExecutionState.Started) throw new InvalidOperationException(string.Format("Clone not allowed in execution state \"{0}\".", ExecutionState));
       Engine clone = (Engine)base.Clone(cloner);
       IOperation[] contexts = executionStack.ToArray();
Index: /trunk/sources/HeuristicLab.Core/3.3/Item.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/Item.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Core/3.3/Item.cs	(revision 3280)
@@ -42,4 +42,9 @@
     }
 
+    protected Item() : base() { }
+    [StorableConstructor]
+    protected Item(bool deserializing) : base(deserializing) { }
+
+
     /// <summary>
     /// Gets the string representation of the current instance.
Index: /trunk/sources/HeuristicLab.Core/3.3/NamedItem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/NamedItem.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Core/3.3/NamedItem.cs	(revision 3280)
@@ -91,4 +91,6 @@
       else this.description = description;
     }
+    [StorableConstructor]
+    protected NamedItem(bool deserializing) : base(deserializing) { }
 
     /// <summary>
Index: /trunk/sources/HeuristicLab.Core/3.3/ParameterizedNamedItem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/ParameterizedNamedItem.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Core/3.3/ParameterizedNamedItem.cs	(revision 3280)
@@ -32,12 +32,8 @@
   [StorableClass]
   public abstract class ParameterizedNamedItem : NamedItem, IParameterizedNamedItem {
+    [Storable]
     private ParameterCollection parameters;
-    [Storable]
     protected ParameterCollection Parameters {
       get { return parameters; }
-      private set {
-        parameters = value;
-        readOnlyParameters = null;
-      }
     }
     private ReadOnlyObservableKeyedCollection<string, IParameter> readOnlyParameters;
@@ -53,5 +49,5 @@
       name = ItemName;
       description = ItemDescription;
-      Parameters = new ParameterCollection();
+      parameters = new ParameterCollection();
       readOnlyParameters = null;
     }
@@ -59,5 +55,5 @@
       : base(name) {
       description = ItemDescription;
-      Parameters = new ParameterCollection();
+      parameters = new ParameterCollection();
       readOnlyParameters = null;
     }
@@ -65,21 +61,24 @@
       : base(name) {
       description = ItemDescription;
-      Parameters = parameters;
+      this.parameters = parameters;
       readOnlyParameters = null;
     }
     protected ParameterizedNamedItem(string name, string description)
       : base(name, description) {
-      Parameters = new ParameterCollection();
+      parameters = new ParameterCollection();
       readOnlyParameters = null;
     }
     protected ParameterizedNamedItem(string name, string description, ParameterCollection parameters)
       : base(name, description) {
-      Parameters = parameters;
+      this.parameters = parameters;
       readOnlyParameters = null;
     }
+    [StorableConstructor]
+    protected ParameterizedNamedItem(bool deserializing) : base(deserializing) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
       ParameterizedNamedItem clone = (ParameterizedNamedItem)base.Clone(cloner);
-      clone.Parameters = (ParameterCollection)cloner.Clone(parameters);
+      clone.parameters = (ParameterCollection)cloner.Clone(parameters);
+      clone.readOnlyParameters = null;
       return clone;
     }
@@ -87,5 +86,5 @@
     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);
+        values.Add(param.Name, param.Value);
         if (param.Value is IParameterizedItem) {
           Dictionary<string, IItem> children = new Dictionary<string, IItem>();
Index: /trunk/sources/HeuristicLab.Core/3.3/Scope.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/Scope.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Core/3.3/Scope.cs	(revision 3280)
@@ -35,7 +35,11 @@
       get { return parent; }
       set {
-        if (parent != null) parent.SubScopes.Remove(this);
-        parent = value;
-        if ((parent != null) && !parent.SubScopes.Contains(this)) parent.SubScopes.Add(this);
+        if (parent != value) {
+          IScope oldParent = parent;
+          parent = null;
+          if (oldParent != null) oldParent.SubScopes.Remove(this);
+          parent = value;
+          if ((parent != null) && !parent.SubScopes.Contains(this)) parent.SubScopes.Add(this);
+        }
       }
     }
@@ -97,5 +101,9 @@
       clone.Description = Description;
       if (variables.Count > 0) clone.variables = (VariableCollection)cloner.Clone(variables);
-      if (subScopes.Count > 0) clone.SubScopes = (ScopeList)cloner.Clone(subScopes);
+      if (subScopes.Count > 0) {
+        clone.SubScopes = (ScopeList)cloner.Clone(subScopes);
+        foreach (IScope child in clone.SubScopes)
+          child.Parent = clone;
+      }
       return clone;
     }
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.Designer.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.Designer.cs	(revision 3280)
@@ -38,5 +38,5 @@
       if (disposing) {
         foreach (ListViewItem item in itemsListView.Items)
-          ((Run)item.Tag).ToStringChanged -= new EventHandler(Item_ToStringChanged);
+          ((IRun)item.Tag).ToStringChanged -= new EventHandler(Item_ToStringChanged);
         if (components != null) components.Dispose();
       }
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.cs	(revision 3280)
@@ -31,8 +31,8 @@
   [View("RunCollection View")]
   [Content(typeof(RunCollection), true)]
-  [Content(typeof(IObservableCollection<Run>), false)]
+  [Content(typeof(IObservableCollection<IRun>), false)]
   public partial class RunCollectionView : AsynchronousContentView {
-    public new IObservableCollection<Run> Content {
-      get { return (IObservableCollection<Run>)base.Content; }
+    public new IObservableCollection<IRun> Content {
+      get { return (IObservableCollection<IRun>)base.Content; }
       set { base.Content = value; }
     }
@@ -47,5 +47,5 @@
     }
 
-    public RunCollectionView(IObservableCollection<Run> content)
+    public RunCollectionView(IObservableCollection<IRun> content)
       : this() {
       Content = content;
@@ -53,14 +53,14 @@
 
     protected override void DeregisterContentEvents() {
-      Content.ItemsAdded -= new CollectionItemsChangedEventHandler<Run>(Content_ItemsAdded);
-      Content.ItemsRemoved -= new CollectionItemsChangedEventHandler<Run>(Content_ItemsRemoved);
-      Content.CollectionReset -= new CollectionItemsChangedEventHandler<Run>(Content_CollectionReset);
+      Content.ItemsAdded -= new CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded);
+      Content.ItemsRemoved -= new CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
+      Content.CollectionReset -= new CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
       base.DeregisterContentEvents();
     }
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
-      Content.ItemsAdded += new CollectionItemsChangedEventHandler<Run>(Content_ItemsAdded);
-      Content.ItemsRemoved += new CollectionItemsChangedEventHandler<Run>(Content_ItemsRemoved);
-      Content.CollectionReset += new CollectionItemsChangedEventHandler<Run>(Content_CollectionReset);
+      Content.ItemsAdded += new CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded);
+      Content.ItemsRemoved += new CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
+      Content.CollectionReset += new CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
     }
 
@@ -77,10 +77,10 @@
         Caption += " (" + Content.GetType().Name + ")";
         itemsListView.Enabled = true;
-        foreach (Run item in Content)
+        foreach (IRun item in Content)
           AddListViewItem(CreateListViewItem(item));
       }
     }
 
-    protected virtual ListViewItem CreateListViewItem(Run item) {
+    protected virtual ListViewItem CreateListViewItem(IRun item) {
       if (!itemsListView.SmallImageList.Images.ContainsKey(item.GetType().FullName))
         itemsListView.SmallImageList.Images.Add(item.GetType().FullName, item.ItemImage);
@@ -95,8 +95,8 @@
     protected virtual void AddListViewItem(ListViewItem listViewItem) {
       itemsListView.Items.Add(listViewItem);
-      ((Run)listViewItem.Tag).ToStringChanged += new EventHandler(Item_ToStringChanged);
+      ((IRun)listViewItem.Tag).ToStringChanged += new EventHandler(Item_ToStringChanged);
     }
     protected virtual void RemoveListViewItem(ListViewItem listViewItem) {
-      ((Run)listViewItem.Tag).ToStringChanged -= new EventHandler(Item_ToStringChanged);
+      ((IRun)listViewItem.Tag).ToStringChanged -= new EventHandler(Item_ToStringChanged);
       listViewItem.Remove();
     }
@@ -106,7 +106,7 @@
       }
     }
-    protected virtual IEnumerable<ListViewItem> GetListViewItemsForItem(Run item) {
+    protected virtual IEnumerable<ListViewItem> GetListViewItemsForItem(IRun item) {
       foreach (ListViewItem listViewItem in itemsListView.Items) {
-        if (((Run)listViewItem.Tag) == item)
+        if (((IRun)listViewItem.Tag) == item)
           yield return listViewItem;
       }
@@ -117,5 +117,5 @@
       removeButton.Enabled = itemsListView.SelectedItems.Count > 0 && !Content.IsReadOnly;
       if (itemsListView.SelectedItems.Count == 1) {
-        Run item = (Run)itemsListView.SelectedItems[0].Tag;
+        IRun item = (IRun)itemsListView.SelectedItems[0].Tag;
         detailsGroupBox.Enabled = true;
         viewHost.ViewType = null;
@@ -134,5 +134,5 @@
         if ((itemsListView.SelectedItems.Count > 0) && !Content.IsReadOnly) {
           foreach (ListViewItem item in itemsListView.SelectedItems)
-            Content.Remove((Run)item.Tag);
+            Content.Remove((IRun)item.Tag);
         }
       }
@@ -140,5 +140,5 @@
     protected virtual void itemsListView_DoubleClick(object sender, EventArgs e) {
       if (itemsListView.SelectedItems.Count == 1) {
-        Run item = (Run)itemsListView.SelectedItems[0].Tag;
+        IRun item = (IRun)itemsListView.SelectedItems[0].Tag;
         IView view = MainFormManager.CreateDefaultView(item);
         if (view != null) view.Show();
@@ -147,5 +147,5 @@
     protected virtual void itemsListView_ItemDrag(object sender, ItemDragEventArgs e) {
       ListViewItem listViewItem = (ListViewItem)e.Item;
-      Run item = (Run)listViewItem.Tag;
+      IRun item = (IRun)listViewItem.Tag;
       DataObject data = new DataObject();
       data.SetData("Type", item.GetType());
@@ -162,5 +162,5 @@
       e.Effect = DragDropEffects.None;
       Type type = e.Data.GetData("Type") as Type;
-      if ((!Content.IsReadOnly) && (type != null) && (typeof(Run).IsAssignableFrom(type))) {
+      if ((!Content.IsReadOnly) && (type != null) && (typeof(IRun).IsAssignableFrom(type))) {
         if ((e.KeyState & 8) == 8) e.Effect = DragDropEffects.Copy;  // CTRL key
         else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
@@ -172,6 +172,6 @@
     protected virtual void itemsListView_DragDrop(object sender, DragEventArgs e) {
       if (e.Effect != DragDropEffects.None) {
-        Run item = e.Data.GetData("Value") as Run;
-        if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) item = (Run)item.Clone();
+        IRun item = e.Data.GetData("Value") as IRun;
+        if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) item = (IRun)item.Clone();
         Content.Add(item);
       }
@@ -183,5 +183,5 @@
       if (itemsListView.SelectedItems.Count > 0) {
         foreach (ListViewItem item in itemsListView.SelectedItems)
-          Content.Remove((Run)item.Tag);
+          Content.Remove((IRun)item.Tag);
         itemsListView.SelectedItems.Clear();
       }
@@ -190,16 +190,16 @@
 
     #region Content Events
-    protected virtual void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<Run> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<Run>(Content_ItemsAdded), sender, e);
+    protected virtual void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IRun> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded), sender, e);
       else
-        foreach (Run item in e.Items)
+        foreach (IRun item in e.Items)
           AddListViewItem(CreateListViewItem(item));
     }
-    protected virtual void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<Run> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<Run>(Content_ItemsRemoved), sender, e);
+    protected virtual void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IRun> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved), sender, e);
       else {
-        foreach (Run item in e.Items) {
+        foreach (IRun item in e.Items) {
           foreach (ListViewItem listViewItem in GetListViewItemsForItem(item)) {
             RemoveListViewItem(listViewItem);
@@ -209,9 +209,9 @@
       }
     }
-    protected virtual void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<Run> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<Run>(Content_CollectionReset), sender, e);
+    protected virtual void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset), sender, e);
       else {
-        foreach (Run item in e.OldItems) {
+        foreach (IRun item in e.OldItems) {
           foreach (ListViewItem listViewItem in GetListViewItemsForItem(item)) {
             RemoveListViewItem(listViewItem);
@@ -219,5 +219,5 @@
           }
         }
-        foreach (Run item in e.Items)
+        foreach (IRun item in e.Items)
           AddListViewItem(CreateListViewItem(item));
       }
@@ -230,5 +230,5 @@
         Invoke(new EventHandler(Item_ToStringChanged), sender, e);
       else {
-        Run item = (Run)sender;
+        IRun item = (IRun)sender;
         foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
           UpdateListViewItem(listViewItem);
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunView.Designer.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunView.Designer.cs	(revision 3280)
@@ -46,6 +46,6 @@
     private void InitializeComponent() {
       this.components = new System.ComponentModel.Container();
-      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);
+      System.Windows.Forms.ListViewGroup listViewGroup1 = new System.Windows.Forms.ListViewGroup("Results", System.Windows.Forms.HorizontalAlignment.Left);
+      System.Windows.Forms.ListViewGroup listViewGroup2 = new System.Windows.Forms.ListViewGroup("Parameters", System.Windows.Forms.HorizontalAlignment.Left);
       this.parametersResultsGroupBox = new System.Windows.Forms.GroupBox();
       this.splitContainer = new System.Windows.Forms.SplitContainer();
@@ -113,8 +113,8 @@
             this.valueColumnHeader});
       this.listView.FullRowSelect = true;
-      listViewGroup1.Header = "Parameters";
-      listViewGroup1.Name = "parametersGroup";
-      listViewGroup2.Header = "Results";
-      listViewGroup2.Name = "resultsGroup";
+      listViewGroup1.Header = "Results";
+      listViewGroup1.Name = "resultsGroup";
+      listViewGroup2.Header = "Parameters";
+      listViewGroup2.Name = "parametersGroup";
       this.listView.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {
             listViewGroup1,
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunView.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunView.cs	(revision 3280)
@@ -31,5 +31,5 @@
   /// </summary>
   [View("Run View")]
-  [Content(typeof(Run), true)]
+  [Content(typeof(IRun), true)]
   public sealed partial class RunView : NamedItemView {
     /// <summary>
@@ -38,6 +38,6 @@
     /// <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; }
+    public new IRun Content {
+      get { return (IRun)base.Content; }
       set { base.Content = value; }
     }
@@ -55,5 +55,5 @@
     /// <remarks>Calls <see cref="VariableView()"/>.</remarks>
     /// <param name="variable">The variable to represent visually.</param>
-    public RunView(Run content)
+    public RunView(IRun content)
       : this() {
       Content = content;
@@ -76,5 +76,5 @@
     private void FillListView() {
       if (!listView.SmallImageList.Images.ContainsKey("Default"))
-        listView.SmallImageList.Images.Add("Default", HeuristicLab.Common.Resources.VS2008ImageLibrary.Class);
+        listView.SmallImageList.Images.Add("Default", HeuristicLab.Common.Resources.VS2008ImageLibrary.Nothing);
 
       listView.Items.Clear();
Index: /trunk/sources/HeuristicLab.Optimization/3.3/Algorithm.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/Algorithm.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/Algorithm.cs	(revision 3280)
@@ -64,14 +64,6 @@
     }
 
+    [Storable]
     private IProblem problem;
-    [Storable]
-    private IProblem ProblemPersistence {
-      get { return problem; }
-      set {
-        if (problem != null) DeregisterProblemEvents();
-        problem = value;
-        if (problem != null) RegisterProblemEvents();
-      }
-    }
     public IProblem Problem {
       get { return problem; }
@@ -91,4 +83,7 @@
 
     [Storable]
+    protected int runsCounter;
+
+    [Storable]
     private RunCollection runs;
     public RunCollection Runs {
@@ -100,4 +95,5 @@
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
+      runsCounter = 0;
       runs = new RunCollection();
     }
@@ -106,4 +102,5 @@
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
+      runsCounter = 0;
       runs = new RunCollection();
     }
@@ -112,4 +109,5 @@
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
+      runsCounter = 0;
       runs = new RunCollection();
     }
@@ -118,4 +116,5 @@
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
+      runsCounter = 0;
       runs = new RunCollection();
     }
@@ -124,13 +123,33 @@
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
-      runs = new RunCollection();
+      runsCounter = 0;
+      runs = new RunCollection();
+    }
+    internal Algorithm(Algorithm algorithm, Cloner cloner)
+      : base(algorithm.Name, algorithm.Description, (ParameterCollection)cloner.Clone(algorithm.Parameters)) {
+      executionState = algorithm.executionState;
+      executionTime = algorithm.executionTime;
+      problem = (IProblem)cloner.Clone(algorithm.problem);
+      runsCounter = algorithm.runsCounter;
+      runs = (RunCollection)cloner.Clone(algorithm.runs);
+      Initialize();
+    }
+    [StorableConstructor]
+    protected Algorithm(bool deserializing) : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      if (problem != null) RegisterProblemEvents();
     }
 
     public override IDeepCloneable Clone(Cloner cloner) {
+      if (ExecutionState == ExecutionState.Started) throw new InvalidOperationException(string.Format("Clone not allowed in execution state \"{0}\".", ExecutionState));
       Algorithm clone = (Algorithm)base.Clone(cloner);
       clone.executionState = executionState;
       clone.executionTime = executionTime;
-      clone.Problem = (IProblem)cloner.Clone(problem);
+      clone.problem = (IProblem)cloner.Clone(problem);
+      clone.runsCounter = runsCounter;
       clone.runs = (RunCollection)cloner.Clone(runs);
+      clone.Initialize();
       return clone;
     }
@@ -143,5 +162,8 @@
       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();
+      if (clearRuns) {
+        runsCounter = 0;
+        runs.Clear();
+      }
       Prepare();
     }
@@ -165,5 +187,5 @@
     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);
+        values.Add(result.Name, result.Value);
     }
 
@@ -205,9 +227,7 @@
     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;
+      runsCounter++;
+      runs.Add(new Run(string.Format("{0} Run {1} ({2})", Name, runsCounter, ExecutionTime), this));
       EventHandler handler = Stopped;
       if (handler != null) handler(this, EventArgs.Empty);
Index: /trunk/sources/HeuristicLab.Optimization/3.3/BatchRun.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/BatchRun.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/BatchRun.cs	(revision 3280)
@@ -66,14 +66,6 @@
     }
 
+    [Storable]
     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; }
@@ -113,4 +105,6 @@
     public BatchRun()
       : base() {
+      name = ItemName;
+      description = ItemDescription;
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
@@ -119,5 +113,7 @@
       stopPending = false;
     }
-    public BatchRun(string name) : base(name) {
+    public BatchRun(string name)
+      : base(name) {
+      description = ItemDescription;
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
@@ -126,5 +122,6 @@
       stopPending = false;
     }
-    public BatchRun(string name, string description) : base(name, description) {
+    public BatchRun(string name, string description)
+      : base(name, description) {
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
@@ -133,13 +130,25 @@
       stopPending = false;
     }
+    [StorableConstructor]
+    private BatchRun(bool deserializing)
+      : base(deserializing) {
+      stopPending = false;
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      if (algorithm != null) RegisterAlgorithmEvents();
+    }
 
     public override IDeepCloneable Clone(Cloner cloner) {
+      if (ExecutionState == ExecutionState.Started) throw new InvalidOperationException(string.Format("Clone not allowed in execution state \"{0}\".", ExecutionState));
       BatchRun clone = (BatchRun)base.Clone(cloner);
       clone.executionState = executionState;
       clone.executionTime = executionTime;
-      clone.Algorithm = (IAlgorithm)cloner.Clone(algorithm);
+      clone.algorithm = (IAlgorithm)cloner.Clone(algorithm);
       clone.repetitions = repetitions;
       clone.runs = (RunCollection)cloner.Clone(runs);
       clone.stopPending = stopPending;
+      clone.Initialize();
       return clone;
     }
@@ -234,7 +243,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);
+      algorithm.Runs.CollectionReset += new CollectionItemsChangedEventHandler<IRun>(Algorithm_Runs_CollectionReset);
+      algorithm.Runs.ItemsAdded += new CollectionItemsChangedEventHandler<IRun>(Algorithm_Runs_ItemsAdded);
+      algorithm.Runs.ItemsRemoved += new CollectionItemsChangedEventHandler<IRun>(Algorithm_Runs_ItemsRemoved);
     }
     private void DeregisterAlgorithmEvents() {
@@ -245,7 +254,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);
+      algorithm.Runs.CollectionReset -= new CollectionItemsChangedEventHandler<IRun>(Algorithm_Runs_CollectionReset);
+      algorithm.Runs.ItemsAdded -= new CollectionItemsChangedEventHandler<IRun>(Algorithm_Runs_ItemsAdded);
+      algorithm.Runs.ItemsRemoved -= new CollectionItemsChangedEventHandler<IRun>(Algorithm_Runs_ItemsRemoved);
     }
     private void Algorithm_ExceptionOccurred(object sender, EventArgs<Exception> e) {
@@ -277,12 +286,12 @@
       }
     }
-    private void Algorithm_Runs_CollectionReset(object sender, CollectionItemsChangedEventArgs<Run> e) {
+    private void Algorithm_Runs_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) {
       Runs.RemoveRange(e.OldItems);
       Runs.AddRange(e.Items);
     }
-    private void Algorithm_Runs_ItemsAdded(object sender, CollectionItemsChangedEventArgs<Run> e) {
+    private void Algorithm_Runs_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IRun> e) {
       Runs.AddRange(e.Items);
     }
-    private void Algorithm_Runs_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<Run> e) {
+    private void Algorithm_Runs_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IRun> e) {
       Runs.RemoveRange(e.Items);
     }
Index: /trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs	(revision 3280)
@@ -34,14 +34,6 @@
   [StorableClass]
   public abstract class EngineAlgorithm : Algorithm {
+    [Storable]
     private OperatorGraph operatorGraph;
-    [Storable]
-    private OperatorGraph OperatorGraphPersistence {
-      get { return operatorGraph; }
-      set {
-        if (operatorGraph != null) operatorGraph.InitialOperatorChanged -= new EventHandler(OperatorGraph_InitialOperatorChanged);
-        operatorGraph = value;
-        if (operatorGraph != null) operatorGraph.InitialOperatorChanged += new EventHandler(OperatorGraph_InitialOperatorChanged);
-      }
-    }
     protected OperatorGraph OperatorGraph {
       get { return operatorGraph; }
@@ -49,7 +41,7 @@
         if (value == null) throw new ArgumentNullException();
         if (value != operatorGraph) {
-          if (operatorGraph != null) operatorGraph.InitialOperatorChanged -= new EventHandler(OperatorGraph_InitialOperatorChanged);
+          operatorGraph.InitialOperatorChanged -= new EventHandler(OperatorGraph_InitialOperatorChanged);
           operatorGraph = value;
-          if (operatorGraph != null) operatorGraph.InitialOperatorChanged += new EventHandler(OperatorGraph_InitialOperatorChanged);
+          operatorGraph.InitialOperatorChanged += new EventHandler(OperatorGraph_InitialOperatorChanged);
           OnOperatorGraphChanged();
           Prepare();
@@ -64,14 +56,6 @@
     }
 
+    [Storable]
     private IEngine engine;
-    [Storable]
-    private IEngine EnginePersistence {
-      get { return engine; }
-      set {
-        if (engine != null) DeregisterEngineEvents();
-        engine = value;
-        if (engine != null) RegisterEngineEvents();
-      }
-    }
     public IEngine Engine {
       get { return engine; }
@@ -97,6 +81,6 @@
       globalScope = new Scope("Global Scope");
       globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
-      OperatorGraph = new OperatorGraph();
-      InitializeEngine();
+      operatorGraph = new OperatorGraph();
+      Initialize();
     }
     protected EngineAlgorithm(string name)
@@ -104,6 +88,6 @@
       globalScope = new Scope("Global Scope");
       globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
-      OperatorGraph = new OperatorGraph();
-      InitializeEngine();
+      operatorGraph = new OperatorGraph();
+      Initialize();
     }
     protected EngineAlgorithm(string name, ParameterCollection parameters)
@@ -111,6 +95,6 @@
       globalScope = new Scope("Global Scope");
       globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
-      OperatorGraph = new OperatorGraph();
-      InitializeEngine();
+      operatorGraph = new OperatorGraph();
+      Initialize();
     }
     protected EngineAlgorithm(string name, string description)
@@ -118,6 +102,6 @@
       globalScope = new Scope("Global Scope");
       globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
-      OperatorGraph = new OperatorGraph();
-      InitializeEngine();
+      operatorGraph = new OperatorGraph();
+      Initialize();
     }
     protected EngineAlgorithm(string name, string description, ParameterCollection parameters)
@@ -125,15 +109,27 @@
       globalScope = new Scope("Global Scope");
       globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
-      OperatorGraph = new OperatorGraph();
-      InitializeEngine();
-    }
-
-    private void InitializeEngine() {
-      if (ApplicationManager.Manager != null) {
+      operatorGraph = new OperatorGraph();
+      Initialize();
+    }
+    internal EngineAlgorithm(EngineAlgorithm algorithm, Cloner cloner)
+      : base(algorithm, cloner) {
+      globalScope = (IScope)cloner.Clone(algorithm.globalScope);
+      operatorGraph = (OperatorGraph)cloner.Clone(algorithm.operatorGraph);
+      engine = (IEngine)cloner.Clone(algorithm.engine);
+      Initialize();
+    }
+    [StorableConstructor]
+    protected EngineAlgorithm(bool deserializing) : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      operatorGraph.InitialOperatorChanged += new EventHandler(OperatorGraph_InitialOperatorChanged);
+      if ((engine == null) && (ApplicationManager.Manager != null)) {
         var types = ApplicationManager.Manager.GetTypes(typeof(IEngine));
         Type t = types.FirstOrDefault(x => x.Name.Equals("SequentialEngine"));
         if (t == null) t = types.FirstOrDefault();
-        if (t != null) Engine = (IEngine)Activator.CreateInstance(t);
-      }
+        if (t != null) engine = (IEngine)Activator.CreateInstance(t);
+      }
+      if (engine != null) RegisterEngineEvents();
     }
 
@@ -141,18 +137,12 @@
       EngineAlgorithm clone = (EngineAlgorithm)base.Clone(cloner);
       clone.globalScope = (IScope)cloner.Clone(globalScope);
-      clone.Engine = (IEngine)cloner.Clone(engine);
-      clone.OperatorGraph = (OperatorGraph)cloner.Clone(operatorGraph);
+      clone.engine = (IEngine)cloner.Clone(engine);
+      clone.operatorGraph = (OperatorGraph)cloner.Clone(operatorGraph);
+      clone.Initialize();
       return clone;
     }
 
     public UserDefinedAlgorithm CreateUserDefinedAlgorithm() {
-      UserDefinedAlgorithm algorithm = new UserDefinedAlgorithm(Name, Description);
-      Cloner cloner = new Cloner();
-      foreach (IParameter param in Parameters)
-        algorithm.Parameters.Add((IParameter)cloner.Clone(param));
-      algorithm.Problem = (IProblem)cloner.Clone(Problem);
-      algorithm.Engine = (IEngine)cloner.Clone(engine);
-      algorithm.OperatorGraph = (OperatorGraph)cloner.Clone(operatorGraph);
-      return algorithm;
+      return new UserDefinedAlgorithm(this, new Cloner());
     }
 
Index: /trunk/sources/HeuristicLab.Optimization/3.3/Experiment.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/Experiment.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/Experiment.cs	(revision 3280)
@@ -62,17 +62,8 @@
     }
 
+    [Storable]
     private OptimizerList optimizers;
-    [Storable]
     public OptimizerList Optimizers {
       get { return optimizers; }
-      private set {
-        if (optimizers != value) {
-          if (optimizers != null) DeregisterOptimizersEvents();
-          optimizers = value;
-          if (optimizers != null) RegisterOptimizersEvents();
-          foreach (IOptimizer optimizer in optimizers)
-            RegisterOptimizerEvents(optimizer);
-        }
-      }
     }
 
@@ -87,32 +78,54 @@
     public Experiment()
       : base() {
+      name = ItemName;
+      description = ItemDescription;
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
-      Optimizers = new OptimizerList();
+      optimizers = new OptimizerList();
       runs = new RunCollection();
       stopPending = false;
-    }
-    public Experiment(string name) : base(name) {
+      Initialize();
+    }
+    public Experiment(string name)
+      : base(name) {
+      description = ItemDescription;
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
-      Optimizers = new OptimizerList();
+      optimizers = new OptimizerList();
       runs = new RunCollection();
       stopPending = false;
-    }
-    public Experiment(string name, string description) : base(name, description) {
+      Initialize();
+    }
+    public Experiment(string name, string description)
+      : base(name, description) {
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
-      Optimizers = new OptimizerList();
+      optimizers = new OptimizerList();
       runs = new RunCollection();
       stopPending = false;
+      Initialize();
+    }
+    [StorableConstructor]
+    private Experiment(bool deserializing)
+      : base(deserializing) {
+      stopPending = false;
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      RegisterOptimizersEvents();
+      foreach (IOptimizer optimizer in optimizers)
+        RegisterOptimizerEvents(optimizer);
     }
 
     public override IDeepCloneable Clone(Cloner cloner) {
+      if (ExecutionState == ExecutionState.Started) throw new InvalidOperationException(string.Format("Clone not allowed in execution state \"{0}\".", ExecutionState));
       Experiment clone = (Experiment)base.Clone(cloner);
       clone.executionState = executionState;
       clone.executionTime = executionTime;
-      clone.Optimizers = (OptimizerList)cloner.Clone(optimizers);
+      clone.optimizers = (OptimizerList)cloner.Clone(optimizers);
       clone.runs = (RunCollection)cloner.Clone(runs);
       clone.stopPending = stopPending;
+      clone.Initialize();
       return clone;
     }
@@ -244,7 +257,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);
+      optimizer.Runs.CollectionReset += new CollectionItemsChangedEventHandler<IRun>(optimizer_Runs_CollectionReset);
+      optimizer.Runs.ItemsAdded += new CollectionItemsChangedEventHandler<IRun>(optimizer_Runs_ItemsAdded);
+      optimizer.Runs.ItemsRemoved += new CollectionItemsChangedEventHandler<IRun>(optimizer_Runs_ItemsRemoved);
     }
     private void DeregisterOptimizerEvents(IOptimizer optimizer) {
@@ -255,7 +268,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);
+      optimizer.Runs.CollectionReset -= new CollectionItemsChangedEventHandler<IRun>(optimizer_Runs_CollectionReset);
+      optimizer.Runs.ItemsAdded -= new CollectionItemsChangedEventHandler<IRun>(optimizer_Runs_ItemsAdded);
+      optimizer.Runs.ItemsRemoved -= new CollectionItemsChangedEventHandler<IRun>(optimizer_Runs_ItemsRemoved);
     }
     private void optimizer_ExceptionOccurred(object sender, EventArgs<Exception> e) {
@@ -287,12 +300,12 @@
       }
     }
-    private void optimizer_Runs_CollectionReset(object sender, CollectionItemsChangedEventArgs<Run> e) {
+    private void optimizer_Runs_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) {
       Runs.RemoveRange(e.OldItems);
       Runs.AddRange(e.Items);
     }
-    private void optimizer_Runs_ItemsAdded(object sender, CollectionItemsChangedEventArgs<Run> e) {
+    private void optimizer_Runs_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IRun> e) {
       Runs.AddRange(e.Items);
     }
-    private void optimizer_Runs_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<Run> e) {
+    private void optimizer_Runs_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IRun> e) {
       Runs.RemoveRange(e.Items);
     }
Index: /trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 3279)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 3280)
@@ -87,4 +87,5 @@
     <Compile Include="Algorithm.cs" />
     <Compile Include="BatchRun.cs" />
+    <Compile Include="Interfaces\IRun.cs" />
     <Compile Include="OptimizerList.cs" />
     <Compile Include="Experiment.cs" />
Index: /trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IRun.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IRun.cs	(revision 3280)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IRun.cs	(revision 3280)
@@ -0,0 +1,34 @@
+#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;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// Represents the parameters and results of an algorithm run.
+  /// </summary>
+  public interface IRun : INamedItem {
+    IAlgorithm Algorithm { get; }
+    IDictionary<string, IItem> Parameters { get; }
+    IDictionary<string, IItem> Results { get; }
+  }
+}
Index: /trunk/sources/HeuristicLab.Optimization/3.3/Run.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/Run.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/Run.cs	(revision 3280)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using HeuristicLab.Core;
@@ -30,12 +31,10 @@
   [Item("Run", "The parameters and results of an algorithm run.")]
   [StorableClass]
-  public sealed class Run : NamedItem {
-    public override bool CanChangeName {
-      get { return false; }
+  public sealed class Run : NamedItem, IRun {
+    [Storable]
+    private IAlgorithm algorithm;
+    public IAlgorithm Algorithm {
+      get { return algorithm; }
     }
-    public override bool CanChangeDescription {
-      get { return false; }
-    }
-
     [Storable]
     private Dictionary<string, IItem> parameters;
@@ -50,22 +49,41 @@
 
     public Run()
-      : base("Anonymous") {
+      : base() {
+      name = ItemName;
+      description = ItemDescription;
+      algorithm = null;
       parameters = new Dictionary<string, IItem>();
       results = new Dictionary<string, IItem>();
     }
-    public Run(string name)
+    public Run(IAlgorithm algorithm)
+      : base() {
+      if (algorithm == null) throw new ArgumentNullException();
+      name = algorithm.Name + " Run (" + algorithm.ExecutionTime.ToString() + ")";
+      description = ItemDescription;
+      Initialize((IAlgorithm)algorithm.Clone());
+    }
+    public Run(string name, IAlgorithm algorithm)
       : base(name) {
+      if (algorithm == null) throw new ArgumentNullException();
+      description = ItemDescription;
+      Initialize((IAlgorithm)algorithm.Clone());
+    }
+    public Run(string name, string description, IAlgorithm algorithm)
+      : base(name, description) {
+      if (algorithm == null) throw new ArgumentNullException();
+      Initialize((IAlgorithm)algorithm.Clone());
+    }
+
+    private void Initialize(IAlgorithm algorithm) {
+      this.algorithm = algorithm;
       parameters = new Dictionary<string, IItem>();
       results = new Dictionary<string, IItem>();
-    }
-    public Run(string name, string description)
-      : base(name, description) {
-      parameters = new Dictionary<string, IItem>();
-      results = new Dictionary<string, IItem>();
+      this.algorithm.CollectParameterValues(parameters);
+      this.algorithm.CollectResultValues(results);
     }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      Run clone = new Run(Name, Description);
-      cloner.RegisterClonedObject(this, clone);
+      Run clone = (Run)base.Clone(cloner);
+      clone.algorithm = (IAlgorithm)cloner.Clone(algorithm);
       foreach (string key in parameters.Keys)
         clone.parameters.Add(key, (IItem)cloner.Clone(parameters[key]));
Index: /trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 3280)
@@ -28,11 +28,11 @@
   [StorableClass]
   [Item("RunCollection", "Represents a collection of runs.")]
-  public class RunCollection : ItemCollection<Run> {
+  public class RunCollection : ItemCollection<IRun> {
     public RunCollection() : base() { }
     public RunCollection(int capacity) : base(capacity) { }
-    public RunCollection(IEnumerable<Run> collection) : base(collection) { }
+    public RunCollection(IEnumerable<IRun> collection) : base(collection) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      RunCollection clone = new RunCollection(this.Select(x => (Run)cloner.Clone(x)));
+      RunCollection clone = new RunCollection(this.Select(x => (IRun)cloner.Clone(x)));
       cloner.RegisterClonedObject(this, clone);
       return clone;
Index: /trunk/sources/HeuristicLab.Optimization/3.3/UserDefinedAlgorithm.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/UserDefinedAlgorithm.cs	(revision 3279)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/UserDefinedAlgorithm.cs	(revision 3280)
@@ -52,4 +52,7 @@
     public UserDefinedAlgorithm(string name) : base(name) { }
     public UserDefinedAlgorithm(string name, string description) : base(name, description) { }
+    internal UserDefinedAlgorithm(EngineAlgorithm algorithm, Cloner cloner) : base(algorithm, cloner) { }
+    [StorableConstructor]
+    private UserDefinedAlgorithm(bool deserializing) : base(deserializing) { }
 
     public event EventHandler OperatorGraphChanged;
