Index: /stable/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj
===================================================================
--- /stable/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj	(revision 14132)
+++ /stable/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj	(revision 14133)
@@ -160,4 +160,10 @@
       <DependentUpon>ExperimentListView.cs</DependentUpon>
     </Compile>
+    <Compile Include="ResultParameterView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ResultParameterView.Designer.cs">
+      <DependentUpon>ResultParameterView.cs</DependentUpon>
+    </Compile>
     <Compile Include="MultiEncodingView.cs">
       <SubType>UserControl</SubType>
@@ -399,4 +405,14 @@
       <Project>{14AB8D24-25BC-400C-A846-4627AA945192}</Project>
       <Name>HeuristicLab.Optimization-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters.Views\3.3\HeuristicLab.Parameters.Views-3.3.csproj">
+      <Project>{ae5b1ce5-9862-4d6f-a700-d72cd9aea295}</Project>
+      <Name>HeuristicLab.Parameters.Views-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56f9106a-079f-4c61-92f6-86a84c2d84b7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
Index: /stable/HeuristicLab.Optimization.Views/3.3/Plugin.cs.frame
===================================================================
--- /stable/HeuristicLab.Optimization.Views/3.3/Plugin.cs.frame	(revision 14132)
+++ /stable/HeuristicLab.Optimization.Views/3.3/Plugin.cs.frame	(revision 14133)
@@ -39,4 +39,5 @@
   [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
   [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters.Views", "3.3")]
   [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
   [PluginDependency("HeuristicLab.Problems.Instances.Views", "3.3")]
Index: /stable/HeuristicLab.Optimization.Views/3.3/ResultParameterView.Designer.cs
===================================================================
--- /stable/HeuristicLab.Optimization.Views/3.3/ResultParameterView.Designer.cs	(revision 14133)
+++ /stable/HeuristicLab.Optimization.Views/3.3/ResultParameterView.Designer.cs	(revision 14133)
@@ -0,0 +1,171 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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 ResultParameterView<T> {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+    
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.resultCollectionNameTextBox = new System.Windows.Forms.TextBox();
+      this.resultCollectionNameLabel = new System.Windows.Forms.Label();
+      this.defaultValueGroupBox = new System.Windows.Forms.GroupBox();
+      this.removeDefaultValueButton = new System.Windows.Forms.Button();
+      this.setDefaultValueButton = new System.Windows.Forms.Button();
+      this.defaultValueViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.defaultValueGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // actualNameTextBox
+      // 
+      this.actualNameTextBox.Location = new System.Drawing.Point(98, 26);
+      this.actualNameTextBox.Size = new System.Drawing.Size(288, 20);
+      // 
+      // dataTypeTextBox
+      // 
+      this.dataTypeTextBox.Location = new System.Drawing.Point(98, 52);
+      this.dataTypeTextBox.Size = new System.Drawing.Size(288, 20);
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(98, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(263, 20);
+      // 
+      // resultCollectionNameTextBox
+      // 
+      this.resultCollectionNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.resultCollectionNameTextBox.Location = new System.Drawing.Point(98, 78);
+      this.resultCollectionNameTextBox.Name = "resultCollectionNameTextBox";
+      this.resultCollectionNameTextBox.Size = new System.Drawing.Size(288, 20);
+      this.resultCollectionNameTextBox.TabIndex = 6;
+      this.resultCollectionNameTextBox.Validated += new System.EventHandler(this.resultNameTextBox_Validated);
+      // 
+      // resultCollectionNameLabel
+      // 
+      this.resultCollectionNameLabel.AutoSize = true;
+      this.resultCollectionNameLabel.Location = new System.Drawing.Point(3, 81);
+      this.resultCollectionNameLabel.Name = "resultCollectionNameLabel";
+      this.resultCollectionNameLabel.Size = new System.Drawing.Size(89, 13);
+      this.resultCollectionNameLabel.TabIndex = 5;
+      this.resultCollectionNameLabel.Text = "&Result Collection:";
+      // 
+      // defaultValueGroupBox
+      // 
+      this.defaultValueGroupBox.AllowDrop = true;
+      this.defaultValueGroupBox.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.defaultValueGroupBox.Controls.Add(this.removeDefaultValueButton);
+      this.defaultValueGroupBox.Controls.Add(this.setDefaultValueButton);
+      this.defaultValueGroupBox.Controls.Add(this.defaultValueViewHost);
+      this.defaultValueGroupBox.Location = new System.Drawing.Point(0, 104);
+      this.defaultValueGroupBox.Name = "defaultValueGroupBox";
+      this.defaultValueGroupBox.Size = new System.Drawing.Size(386, 222);
+      this.defaultValueGroupBox.TabIndex = 7;
+      this.defaultValueGroupBox.TabStop = false;
+      this.defaultValueGroupBox.Text = "Default Value";
+      this.defaultValueGroupBox.DragDrop += new System.Windows.Forms.DragEventHandler(this.defaultValueGroupBox_DragDrop);
+      this.defaultValueGroupBox.DragEnter += new System.Windows.Forms.DragEventHandler(this.defaultValueGroupBox_DragEnterOver);
+      this.defaultValueGroupBox.DragOver += new System.Windows.Forms.DragEventHandler(this.defaultValueGroupBox_DragEnterOver);
+      // 
+      // removeDefaultValueButton
+      // 
+      this.removeDefaultValueButton.Location = new System.Drawing.Point(38, 19);
+      this.removeDefaultValueButton.Name = "removeDefaultValueButton";
+      this.removeDefaultValueButton.Size = new System.Drawing.Size(26, 23);
+      this.removeDefaultValueButton.TabIndex = 1;
+      this.removeDefaultValueButton.Text = "Remove";
+      this.removeDefaultValueButton.UseVisualStyleBackColor = true;
+      this.removeDefaultValueButton.Click += new System.EventHandler(this.removeDefaultValueButton_Click);
+      // 
+      // setDefaultValueButton
+      // 
+      this.setDefaultValueButton.Location = new System.Drawing.Point(6, 19);
+      this.setDefaultValueButton.Name = "setDefaultValueButton";
+      this.setDefaultValueButton.Size = new System.Drawing.Size(26, 23);
+      this.setDefaultValueButton.TabIndex = 1;
+      this.setDefaultValueButton.Text = "Set";
+      this.setDefaultValueButton.UseVisualStyleBackColor = true;
+      this.setDefaultValueButton.Click += new System.EventHandler(this.setDefaultValueButton_Click);
+      // 
+      // defaultValueViewHost
+      // 
+      this.defaultValueViewHost.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.defaultValueViewHost.Caption = "View";
+      this.defaultValueViewHost.Content = null;
+      this.defaultValueViewHost.Enabled = false;
+      this.defaultValueViewHost.Location = new System.Drawing.Point(6, 48);
+      this.defaultValueViewHost.Name = "defaultValueViewHost";
+      this.defaultValueViewHost.ReadOnly = false;
+      this.defaultValueViewHost.Size = new System.Drawing.Size(374, 168);
+      this.defaultValueViewHost.TabIndex = 0;
+      this.defaultValueViewHost.ViewsLabelVisible = true;
+      this.defaultValueViewHost.ViewType = null;
+      // 
+      // ResultParameterView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.defaultValueGroupBox);
+      this.Controls.Add(this.resultCollectionNameTextBox);
+      this.Controls.Add(this.resultCollectionNameLabel);
+      this.Name = "ResultParameterView";
+      this.Size = new System.Drawing.Size(386, 326);
+      this.Controls.SetChildIndex(this.dataTypeLabel, 0);
+      this.Controls.SetChildIndex(this.dataTypeTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.actualNameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.actualNameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.resultCollectionNameLabel, 0);
+      this.Controls.SetChildIndex(this.resultCollectionNameTextBox, 0);
+      this.Controls.SetChildIndex(this.defaultValueGroupBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.defaultValueGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.TextBox resultCollectionNameTextBox;
+    protected System.Windows.Forms.Label resultCollectionNameLabel;
+    private System.Windows.Forms.GroupBox defaultValueGroupBox;
+    private MainForm.WindowsForms.ViewHost defaultValueViewHost;
+    private System.Windows.Forms.Button removeDefaultValueButton;
+    private System.Windows.Forms.Button setDefaultValueButton;
+  }
+}
Index: /stable/HeuristicLab.Optimization.Views/3.3/ResultParameterView.cs
===================================================================
--- /stable/HeuristicLab.Optimization.Views/3.3/ResultParameterView.cs	(revision 14133)
+++ /stable/HeuristicLab.Optimization.Views/3.3/ResultParameterView.cs	(revision 14133)
@@ -0,0 +1,148 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Parameters.Views;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Optimization.Views {
+  [View("ResultParameter View")]
+  [Content(typeof(ResultParameter<>), true)]
+  [Content(typeof(IResultParameter<>), false)]
+  public partial class ResultParameterView<T> : LookupParameterView<T> where T : class, IItem {
+    protected TypeSelectorDialog typeSelectorDialog;
+
+    public new IResultParameter<T> Content {
+      get { return (IResultParameter<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ResultParameterView() {
+      InitializeComponent();
+      setDefaultValueButton.Text = string.Empty;
+      setDefaultValueButton.Image = VSImageLibrary.Edit;
+      removeDefaultValueButton.Text = string.Empty;
+      removeDefaultValueButton.Image = VSImageLibrary.Remove;
+      actualNameLabel.Text = "Result Name:";
+      dataTypeLabel.Text = "Result Type:";
+    }
+
+    /// <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 (typeSelectorDialog != null) typeSelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ResultCollectionNameChanged -= ContentOnResultCollectionNameChanged;
+      Content.DefaultValueChanged -= ContentOnDefaultValueChanged;
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ResultCollectionNameChanged += ContentOnResultCollectionNameChanged;
+      Content.DefaultValueChanged += ContentOnDefaultValueChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        resultCollectionNameTextBox.Text = "-";
+        defaultValueViewHost.Content = null;
+      } else {
+        resultCollectionNameTextBox.Text = Content.ResultCollectionName;
+        defaultValueViewHost.Content = Content.DefaultValue;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      resultCollectionNameTextBox.Enabled = Content != null;
+      resultCollectionNameTextBox.ReadOnly = ReadOnly;
+      setDefaultValueButton.Enabled = Content != null && !ReadOnly && !Locked;
+      removeDefaultValueButton.Enabled = Content != null && !ReadOnly && !Locked;
+    }
+
+    private void ContentOnDefaultValueChanged(object sender, EventArgs e) {
+      if (InvokeRequired) Invoke((Action<object, EventArgs>)ContentOnDefaultValueChanged, sender, e);
+      else defaultValueViewHost.Content = Content.DefaultValue;
+    }
+
+    private void ContentOnResultCollectionNameChanged(object sender, EventArgs e) {
+      if (InvokeRequired) Invoke((Action<object, EventArgs>)ContentOnResultCollectionNameChanged, sender, e);
+      else resultCollectionNameTextBox.Text = Content.ResultCollectionName;
+    }
+
+    private void resultNameTextBox_Validated(object sender, EventArgs e) {
+      if (InvokeRequired) Invoke((Action<object, EventArgs>)resultNameTextBox_Validated, sender, e);
+      else Content.ResultCollectionName = resultCollectionNameTextBox.Text;
+    }
+
+    private void setDefaultValueButton_Click(object sender, EventArgs e) {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Value";
+        typeSelectorDialog.TypeSelector.Configure(Content.DataType, false, true);
+      }
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          Content.DefaultValue = (T)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        } catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+    }
+
+    private void removeDefaultValueButton_Click(object sender, EventArgs e) {
+      Content.DefaultValue = null;
+    }
+
+    protected virtual void defaultValueGroupBox_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (!ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) != null) && Content.DataType.IsAssignableFrom(e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat).GetType())) {
+        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
+        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void defaultValueGroupBox_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        T value = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as T;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) value = (T)value.Clone();
+        Content.DefaultValue = value;
+      }
+    }
+  }
+}
Index: /stable/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj
===================================================================
--- /stable/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 14132)
+++ /stable/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 14133)
@@ -155,4 +155,5 @@
     <Compile Include="Interfaces\ILocalImprovementAlgorithmOperator.cs" />
     <Compile Include="Interfaces\IMultiObjectiveOperator.cs" />
+    <Compile Include="Results\IResultParameter.cs" />
     <Compile Include="Interfaces\ISingleObjectiveOperator.cs" />
     <Compile Include="Interfaces\ISingleObjectivePathRelinker.cs" />
@@ -168,4 +169,5 @@
     <Compile Include="MetaOptimizers\Experiment.cs" />
     <Compile Include="MetaOptimizers\TimeLimitRun.cs" />
+    <Compile Include="Results\ResultParameter.cs" />
     <Compile Include="RunCollectionModification\RunCollectionRunRemover.cs" />
     <Compile Include="Plugin.cs" />
@@ -229,5 +231,5 @@
     <Compile Include="RunCollection.cs" />
     <Compile Include="Run.cs" />
-    <Compile Include="Interfaces\IResult.cs" />
+    <Compile Include="Results\IResult.cs" />
     <Compile Include="Interfaces\IDiscreteDoubleValueModifier.cs" />
     <Compile Include="Interfaces\IExhaustiveMoveGenerator.cs" />
@@ -253,9 +255,9 @@
     <Compile Include="Interfaces\ITabuChecker.cs" />
     <Compile Include="Interfaces\ITabuMaker.cs" />
-    <Compile Include="Result.cs" />
+    <Compile Include="Results\Result.cs" />
     <Compile Include="Algorithms\UserDefinedAlgorithm.cs" />
     <Compile Include="Algorithms\EngineAlgorithm.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="ResultCollection.cs" />
+    <Compile Include="Results\ResultCollection.cs" />
     <Compile Include="Problems\UserDefinedProblem.cs" />
   </ItemGroup>
Index: able/HeuristicLab.Optimization/3.3/Interfaces/IResult.cs
===================================================================
--- /stable/HeuristicLab.Optimization/3.3/Interfaces/IResult.cs	(revision 14132)
+++ 	(revision )
@@ -1,36 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Optimization {
-  /// <summary>
-  /// Represents a result which has a name and a data type and holds an IItem.
-  /// </summary>
-  public interface IResult : INamedItem {
-    Type DataType { get; }
-    IItem Value { get; set; }
-
-    /// <inheritdoc/>
-    event EventHandler ValueChanged;
-  }
-}
Index: able/HeuristicLab.Optimization/3.3/Result.cs
===================================================================
--- /stable/HeuristicLab.Optimization/3.3/Result.cs	(revision 14132)
+++ 	(revision )
@@ -1,157 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Drawing;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Optimization {
-  /// <summary>
-  /// Represents a result which has a name and a data type and holds an IItem.
-  /// </summary>
-  [Item("Result", "A result which has a name and a data type and holds an IItem.")]
-  [StorableClass]
-  public sealed class Result : NamedItem, IResult, IStorableContent {
-    public string Filename { get; set; }
-
-    public override Image ItemImage {
-      get {
-        if (value != null) return value.ItemImage;
-        else return base.ItemImage;
-      }
-    }
-
-    public override bool CanChangeName {
-      get { return false; }
-    }
-    public override bool CanChangeDescription {
-      get { return false; }
-    }
-
-    [Storable]
-    private Type dataType;
-    public Type DataType {
-      get { return dataType; }
-    }
-
-    [Storable]
-    private IItem value;
-    public IItem Value {
-      get { return value; }
-      set {
-        if (this.value != value) {
-          if ((value != null) && (!dataType.IsInstanceOfType(value)))
-            throw new ArgumentException(
-              string.Format("Type mismatch. Value is not a \"{0}\".",
-                            dataType.GetPrettyName())
-            );
-
-          DeregisterValueEvents();
-          this.value = value;
-          RegisterValueEvents();
-          OnValueChanged();
-        }
-      }
-    }
-
-    [StorableConstructor]
-    private Result(bool deserializing) : base(deserializing) { }
-    private Result(Result original, Cloner cloner)
-      : base(original, cloner) {
-      dataType = original.dataType;
-      value = cloner.Clone(original.value);
-      Initialize();
-    }
-    public Result()
-      : base("Anonymous") {
-      this.dataType = typeof(IItem);
-      this.value = null;
-    }
-    public Result(string name, Type dataType)
-      : base(name) {
-      this.dataType = dataType;
-      this.value = null;
-    }
-    public Result(string name, string description, Type dataType)
-      : base(name, description) {
-      this.dataType = dataType;
-      this.value = null;
-    }
-    public Result(string name, IItem value)
-      : base(name) {
-      this.dataType = value == null ? typeof(IItem) : value.GetType();
-      this.value = value;
-      Initialize();
-    }
-    public Result(string name, string description, IItem value)
-      : base(name, description) {
-      this.dataType = value == null ? typeof(IItem) : value.GetType();
-      this.value = value;
-      Initialize();
-    }
-
-    [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserialization() {
-      Initialize();
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new Result(this, cloner);
-    }
-
-    private void Initialize() {
-      RegisterValueEvents();
-    }
-
-    public override string ToString() {
-      return string.Format("{0}: {1}", Name, Value == null ? "null" : Value.ToString());
-    }
-
-    public event EventHandler ValueChanged;
-    private void OnValueChanged() {
-      var handler = ValueChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-      OnItemImageChanged();
-      OnToStringChanged();
-    }
-
-    private void RegisterValueEvents() {
-      if (value != null) {
-        value.ItemImageChanged += new EventHandler(Value_ItemImageChanged);
-        value.ToStringChanged += new EventHandler(Value_ToStringChanged);
-      }
-    }
-    private void DeregisterValueEvents() {
-      if (value != null) {
-        value.ItemImageChanged -= new EventHandler(Value_ItemImageChanged);
-        value.ToStringChanged -= new EventHandler(Value_ToStringChanged);
-      }
-    }
-    private void Value_ItemImageChanged(object sender, EventArgs e) {
-      OnItemImageChanged();
-    }
-    private void Value_ToStringChanged(object sender, EventArgs e) {
-      OnToStringChanged();
-    }
-  }
-}
Index: able/HeuristicLab.Optimization/3.3/ResultCollection.cs
===================================================================
--- /stable/HeuristicLab.Optimization/3.3/ResultCollection.cs	(revision 14132)
+++ 	(revision )
@@ -1,78 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2015 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.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Optimization {
-  [StorableClass]
-  [Item("ResultCollection", "Represents a collection of results.")]
-  public class ResultCollection : NamedItemCollection<IResult> {
-    public ResultCollection() : base() { }
-    public ResultCollection(int capacity) : base(capacity) { }
-    public ResultCollection(IEnumerable<IResult> collection) : base(collection) { }
-    [StorableConstructor]
-    protected ResultCollection(bool deserializing) : base(deserializing) { }
-    protected ResultCollection(ResultCollection original, Cloner cloner)
-      : base(original, cloner) {
-    }
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new ResultCollection(this, cloner);
-    }
-
-    public static new System.Drawing.Image StaticItemImage {
-      get { return HeuristicLab.Common.Resources.VSImageLibrary.Object; }
-    }
-
-    public virtual void CollectResultValues(IDictionary<string, IItem> values) {
-      CollectResultValues(values, string.Empty);
-    }
-
-    public virtual void CollectResultValues(IDictionary<string, IItem> values, string rootPath) {
-      foreach (IResult result in this) {
-        var children = GetCollectedResults(result);
-        string path = string.Empty;
-        if (!string.IsNullOrWhiteSpace(rootPath))
-          path = rootPath + ".";
-        foreach (var c in children) {
-          if (string.IsNullOrEmpty(c.Key))
-            values.Add(path + result.Name, c.Value);
-          else values.Add(path + result.Name + "." + c.Key, c.Value);
-        }
-      }
-    }
-
-    protected virtual IEnumerable<KeyValuePair<string, IItem>> GetCollectedResults(IResult result) {
-      if (result.Value == null) yield break;
-      yield return new KeyValuePair<string, IItem>(string.Empty, result.Value);
-
-      var resultCollection = result.Value as ResultCollection;
-      if (resultCollection != null) {
-        var children = new Dictionary<string, IItem>();
-        resultCollection.CollectResultValues(children);
-        foreach (var child in children) yield return child;
-      }
-    }
-
-  }
-}
Index: /stable/HeuristicLab.Optimization/3.3/Results/IResult.cs
===================================================================
--- /stable/HeuristicLab.Optimization/3.3/Results/IResult.cs	(revision 14133)
+++ /stable/HeuristicLab.Optimization/3.3/Results/IResult.cs	(revision 14133)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// Represents a result which has a name and a data type and holds an IItem.
+  /// </summary>
+  public interface IResult : INamedItem {
+    Type DataType { get; }
+    IItem Value { get; set; }
+
+    /// <inheritdoc/>
+    event EventHandler ValueChanged;
+  }
+}
Index: /stable/HeuristicLab.Optimization/3.3/Results/IResultParameter.cs
===================================================================
--- /stable/HeuristicLab.Optimization/3.3/Results/IResultParameter.cs	(revision 14133)
+++ /stable/HeuristicLab.Optimization/3.3/Results/IResultParameter.cs	(revision 14133)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Optimization {
+  public interface IResultParameter : ILookupParameter {
+    string ResultCollectionName { get; set; }
+    event EventHandler ResultCollectionNameChanged;
+  }
+
+  public interface IResultParameter<T> : ILookupParameter<T>, IResultParameter where T : class, IItem {
+    T DefaultValue { get; set; }
+    event EventHandler DefaultValueChanged;
+  }
+}
Index: /stable/HeuristicLab.Optimization/3.3/Results/Result.cs
===================================================================
--- /stable/HeuristicLab.Optimization/3.3/Results/Result.cs	(revision 14133)
+++ /stable/HeuristicLab.Optimization/3.3/Results/Result.cs	(revision 14133)
@@ -0,0 +1,157 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// Represents a result which has a name and a data type and holds an IItem.
+  /// </summary>
+  [Item("Result", "A result which has a name and a data type and holds an IItem.")]
+  [StorableClass]
+  public sealed class Result : NamedItem, IResult, IStorableContent {
+    public string Filename { get; set; }
+
+    public override Image ItemImage {
+      get {
+        if (value != null) return value.ItemImage;
+        else return base.ItemImage;
+      }
+    }
+
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public override bool CanChangeDescription {
+      get { return false; }
+    }
+
+    [Storable]
+    private Type dataType;
+    public Type DataType {
+      get { return dataType; }
+    }
+
+    [Storable]
+    private IItem value;
+    public IItem Value {
+      get { return value; }
+      set {
+        if (this.value != value) {
+          if ((value != null) && (!dataType.IsInstanceOfType(value)))
+            throw new ArgumentException(
+              string.Format("Type mismatch. Value is not a \"{0}\".",
+                            dataType.GetPrettyName())
+            );
+
+          DeregisterValueEvents();
+          this.value = value;
+          RegisterValueEvents();
+          OnValueChanged();
+        }
+      }
+    }
+
+    [StorableConstructor]
+    private Result(bool deserializing) : base(deserializing) { }
+    private Result(Result original, Cloner cloner)
+      : base(original, cloner) {
+      dataType = original.dataType;
+      value = cloner.Clone(original.value);
+      Initialize();
+    }
+    public Result()
+      : base("Anonymous") {
+      this.dataType = typeof(IItem);
+      this.value = null;
+    }
+    public Result(string name, Type dataType)
+      : base(name) {
+      this.dataType = dataType;
+      this.value = null;
+    }
+    public Result(string name, string description, Type dataType)
+      : base(name, description) {
+      this.dataType = dataType;
+      this.value = null;
+    }
+    public Result(string name, IItem value)
+      : base(name) {
+      this.dataType = value == null ? typeof(IItem) : value.GetType();
+      this.value = value;
+      Initialize();
+    }
+    public Result(string name, string description, IItem value)
+      : base(name, description) {
+      this.dataType = value == null ? typeof(IItem) : value.GetType();
+      this.value = value;
+      Initialize();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Result(this, cloner);
+    }
+
+    private void Initialize() {
+      RegisterValueEvents();
+    }
+
+    public override string ToString() {
+      return string.Format("{0}: {1}", Name, Value == null ? "null" : Value.ToString());
+    }
+
+    public event EventHandler ValueChanged;
+    private void OnValueChanged() {
+      var handler = ValueChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+      OnItemImageChanged();
+      OnToStringChanged();
+    }
+
+    private void RegisterValueEvents() {
+      if (value != null) {
+        value.ItemImageChanged += new EventHandler(Value_ItemImageChanged);
+        value.ToStringChanged += new EventHandler(Value_ToStringChanged);
+      }
+    }
+    private void DeregisterValueEvents() {
+      if (value != null) {
+        value.ItemImageChanged -= new EventHandler(Value_ItemImageChanged);
+        value.ToStringChanged -= new EventHandler(Value_ToStringChanged);
+      }
+    }
+    private void Value_ItemImageChanged(object sender, EventArgs e) {
+      OnItemImageChanged();
+    }
+    private void Value_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+  }
+}
Index: /stable/HeuristicLab.Optimization/3.3/Results/ResultCollection.cs
===================================================================
--- /stable/HeuristicLab.Optimization/3.3/Results/ResultCollection.cs	(revision 14133)
+++ /stable/HeuristicLab.Optimization/3.3/Results/ResultCollection.cs	(revision 14133)
@@ -0,0 +1,78 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [StorableClass]
+  [Item("ResultCollection", "Represents a collection of results.")]
+  public class ResultCollection : NamedItemCollection<IResult> {
+    public ResultCollection() : base() { }
+    public ResultCollection(int capacity) : base(capacity) { }
+    public ResultCollection(IEnumerable<IResult> collection) : base(collection) { }
+    [StorableConstructor]
+    protected ResultCollection(bool deserializing) : base(deserializing) { }
+    protected ResultCollection(ResultCollection original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ResultCollection(this, cloner);
+    }
+
+    public static new System.Drawing.Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Object; }
+    }
+
+    public virtual void CollectResultValues(IDictionary<string, IItem> values) {
+      CollectResultValues(values, string.Empty);
+    }
+
+    public virtual void CollectResultValues(IDictionary<string, IItem> values, string rootPath) {
+      foreach (IResult result in this) {
+        var children = GetCollectedResults(result);
+        string path = string.Empty;
+        if (!string.IsNullOrWhiteSpace(rootPath))
+          path = rootPath + ".";
+        foreach (var c in children) {
+          if (string.IsNullOrEmpty(c.Key))
+            values.Add(path + result.Name, c.Value);
+          else values.Add(path + result.Name + "." + c.Key, c.Value);
+        }
+      }
+    }
+
+    protected virtual IEnumerable<KeyValuePair<string, IItem>> GetCollectedResults(IResult result) {
+      if (result.Value == null) yield break;
+      yield return new KeyValuePair<string, IItem>(string.Empty, result.Value);
+
+      var resultCollection = result.Value as ResultCollection;
+      if (resultCollection != null) {
+        var children = new Dictionary<string, IItem>();
+        resultCollection.CollectResultValues(children);
+        foreach (var child in children) yield return child;
+      }
+    }
+
+  }
+}
Index: /stable/HeuristicLab.Optimization/3.3/Results/ResultParameter.cs
===================================================================
--- /stable/HeuristicLab.Optimization/3.3/Results/ResultParameter.cs	(revision 14133)
+++ /stable/HeuristicLab.Optimization/3.3/Results/ResultParameter.cs	(revision 14133)
@@ -0,0 +1,152 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [Item("ResultParameter", "A parameter whose value is written to a result collection.")]
+  [StorableClass]
+  public sealed class ResultParameter<T> : LookupParameter<T>, IResultParameter<T> where T : class, IItem {
+    public override Image ItemImage { get { return VSImageLibrary.Exception; } }
+    public override bool CanChangeDescription { get { return true; } }
+
+    [Storable]
+    private string resultCollectionName;
+    public string ResultCollectionName {
+      get { return resultCollectionName; }
+      set {
+        if (value == null) throw new ArgumentNullException();
+        if (string.IsNullOrWhiteSpace(value)) throw new ArgumentNullException();
+        else if (!resultCollectionName.Equals(value)) {
+          resultCollectionName = value;
+          OnResultCollectionNameChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private T defaultValue;
+    public T DefaultValue {
+      get { return defaultValue; }
+      set {
+        if (value != defaultValue) {
+          defaultValue = value;
+          OnDefaultValueChanged();
+        }
+      }
+    }
+
+    [StorableConstructor]
+    private ResultParameter(bool deserializing) : base(deserializing) { }
+    private ResultParameter(ResultParameter<T> original, Cloner cloner)
+      : base(original, cloner) {
+      resultCollectionName = original.resultCollectionName;
+      defaultValue = cloner.Clone(original.defaultValue);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ResultParameter<T>(this, cloner);
+    }
+    public ResultParameter() : this("Anonymous", string.Empty, "Results") { }
+    public ResultParameter(string name, string description) : this(name, description, "Results") { }
+
+    public ResultParameter(string name, string description, string resultCollectionName)
+      : base(name, description, string.Empty) {
+      if (string.IsNullOrEmpty(resultCollectionName)) throw new ArgumentException("resultCollectionName");
+      this.resultCollectionName = resultCollectionName;
+      Hidden = false;
+    }
+    public ResultParameter(string name, string description, string resultCollectionName, T defaultValue)
+      : base(name, description, string.Empty) {
+      if (string.IsNullOrEmpty(resultCollectionName)) throw new ArgumentException("resultCollectionName");
+      if (defaultValue == null) throw new ArgumentNullException("defaultValue");
+      this.resultCollectionName = resultCollectionName;
+      this.defaultValue = defaultValue;
+      Hidden = false;
+    }
+
+    protected override IItem GetActualValue() {
+      ResultCollection results;
+      if (CachedActualValue != null) {
+        results = CachedActualValue as ResultCollection;
+        if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection not found.");
+      } else {
+        var tmp = ResultCollectionName;
+        // verifyType has to be disabled, because the ResultCollection may not be identical to the generic type of the parameter
+        results = GetValue(ExecutionContext, ref tmp) as ResultCollection;
+        if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection with name " + tmp + " not found.");
+        CachedActualValue = results;
+      }
+
+      IResult result;
+      if (!results.TryGetValue(ActualName, out result)) {
+        if (DefaultValue == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): Result not found and no default value specified.");
+        result = ItemDescription == Description ? new Result(ActualName, (T)DefaultValue.Clone()) : new Result(ActualName, Description, (T)DefaultValue.Clone());
+        results.Add(result);
+      }
+
+      var resultValue = result.Value as T;
+      if (resultValue == null)
+        throw new InvalidOperationException(string.Format("Type mismatch. Result \"{0}\" does not contain a \"{1}\".", ActualName, typeof(T).GetPrettyName()));
+
+      return resultValue;
+    }
+
+    protected override void SetActualValue(IItem value) {
+      ResultCollection results;
+      if (CachedActualValue != null) {
+        results = CachedActualValue as ResultCollection;
+        if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection not found.");
+      } else {
+        var tmp = ResultCollectionName;
+        results = GetValue(ExecutionContext, ref tmp) as ResultCollection;
+        if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection with name " + tmp + " not found.");
+        CachedActualValue = results;
+      }
+
+      IResult result;
+      if (!results.TryGetValue(ActualName, out result)) {
+        result = ItemDescription == Description ? new Result(ActualName, value) : new Result(ActualName, Description, value);
+        results.Add(result);
+      } else result.Value = value;
+    }
+
+
+    public event EventHandler ResultCollectionNameChanged;
+    private void OnResultCollectionNameChanged() {
+      var handler = ResultCollectionNameChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+      OnToStringChanged();
+    }
+
+    public event EventHandler DefaultValueChanged;
+    private void OnDefaultValueChanged() {
+      EventHandler handler = DefaultValueChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+      OnItemImageChanged();
+    }
+  }
+}
Index: /stable/HeuristicLab.Parameters.Views/3.3/HeuristicLab.Parameters.Views-3.3.csproj
===================================================================
--- /stable/HeuristicLab.Parameters.Views/3.3/HeuristicLab.Parameters.Views-3.3.csproj	(revision 14132)
+++ /stable/HeuristicLab.Parameters.Views/3.3/HeuristicLab.Parameters.Views-3.3.csproj	(revision 14133)
@@ -217,14 +217,4 @@
       <Private>False</Private>
     </ProjectReference>
-    <ProjectReference Include="..\..\HeuristicLab.Optimization.Views\3.3\HeuristicLab.Optimization.Views-3.3.csproj">
-      <Project>{662B4B15-8F4D-4AE5-B3EB-D91C215F5AF2}</Project>
-      <Name>HeuristicLab.Optimization.Views-3.3</Name>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
-      <Project>{14AB8D24-25BC-400C-A846-4627AA945192}</Project>
-      <Name>HeuristicLab.Optimization-3.3</Name>
-      <Private>False</Private>
-    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
       <Project>{56F9106A-079F-4C61-92F6-86A84C2D84B7}</Project>
Index: /stable/HeuristicLab.Parameters/3.3/LookupParameter.cs
===================================================================
--- /stable/HeuristicLab.Parameters/3.3/LookupParameter.cs	(revision 14132)
+++ /stable/HeuristicLab.Parameters/3.3/LookupParameter.cs	(revision 14133)
@@ -50,6 +50,6 @@
     public string TranslatedName {
       get {
-        string translatedName;
-        GetValueParameterAndTranslateName(out translatedName);
+        string translatedName = Name;
+        GetValueParameterAndTranslateName(ExecutionContext, ref translatedName);
         return translatedName;
       }
@@ -61,6 +61,7 @@
 
     private Lazy<ThreadLocal<IItem>> cachedActualValues;
-    private IItem CachedActualValue {
+    protected IItem CachedActualValue {
       get { return cachedActualValues.Value.Value; }
+      set { cachedActualValues.Value.Value = value; }
     }
 
@@ -128,18 +129,22 @@
     }
 
-    private IValueParameter GetValueParameterAndTranslateName(out string actualName) {
+    protected static IValueParameter GetValueParameterAndTranslateName(IExecutionContext executionContext, ref string translatedName) {
       IValueParameter valueParam;
       ILookupParameter lookupParam;
-      IExecutionContext currentExecutionContext = ExecutionContext;
-
-      actualName = Name;
+      IExecutionContext currentExecutionContext = executionContext;
+
       while (currentExecutionContext != null) {
-        valueParam = currentExecutionContext.Parameters[actualName] as IValueParameter;
-        lookupParam = currentExecutionContext.Parameters[actualName] as ILookupParameter;
+        IParameter param = null;
+        while (currentExecutionContext != null && !currentExecutionContext.Parameters.TryGetValue(translatedName, out param))
+          currentExecutionContext = currentExecutionContext.Parent;
+        if (currentExecutionContext == null) break;
+
+        valueParam = param as IValueParameter;
+        lookupParam = param as ILookupParameter;
 
         if ((valueParam == null) && (lookupParam == null))
           throw new InvalidOperationException(
             string.Format("Parameter look-up chain broken. Parameter \"{0}\" is not an \"{1}\" or an \"{2}\".",
-                          actualName, typeof(IValueParameter).GetPrettyName(), typeof(ILookupParameter).GetPrettyName())
+                          translatedName, typeof(IValueParameter).GetPrettyName(), typeof(ILookupParameter).GetPrettyName())
           );
 
@@ -148,39 +153,42 @@
           else if (lookupParam == null) return valueParam;
         }
-        if (lookupParam != null) actualName = lookupParam.ActualName;
+        translatedName = lookupParam.ActualName;
 
         currentExecutionContext = currentExecutionContext.Parent;
-        while ((currentExecutionContext != null) && !currentExecutionContext.Parameters.ContainsKey(actualName))
-          currentExecutionContext = currentExecutionContext.Parent;
       }
       return null;
     }
-    private IVariable LookupVariable(string name) {
-      IScope scope = ExecutionContext.Scope;
-      while ((scope != null) && !scope.Variables.ContainsKey(name))
+    protected static IVariable LookupVariable(IScope scope, string name) {
+      IVariable variable = null;
+      while (scope != null && !scope.Variables.TryGetValue(name, out variable))
         scope = scope.Parent;
-      return scope != null ? scope.Variables[name] : null;
-    }
+      return scope != null ? variable : null;
+    }
+
     protected override IItem GetActualValue() {
       if (CachedActualValue != null) return CachedActualValue;
-      string name;
+
+      string translatedName = Name;
+      var value = GetValue(ExecutionContext, ref translatedName);
+      if (value != null && !(value is T))
+        throw new InvalidOperationException(
+          string.Format("Type mismatch. Variable \"{0}\" does not contain a \"{1}\".",
+                        translatedName,
+                        typeof(T).GetPrettyName())
+        );
+      CachedActualValue = value;
+      return value;
+    }
+
+    protected static IItem GetValue(IExecutionContext executionContext, ref string name) {
       // try to get value from context stack
-      IValueParameter param = GetValueParameterAndTranslateName(out name);
+      IValueParameter param = GetValueParameterAndTranslateName(executionContext, ref name);
       if (param != null) return param.Value;
 
       // try to get variable from scope
-      IVariable var = LookupVariable(name);
-      if (var != null) {
-        if (!(var.Value is T))
-          throw new InvalidOperationException(
-            string.Format("Type mismatch. Variable \"{0}\" does not contain a \"{1}\".",
-                          name,
-                          typeof(T).GetPrettyName())
-          );
-        cachedActualValues.Value.Value = var.Value;
-        return var.Value;
-      }
-      return null;
-    }
+      IVariable var = LookupVariable(executionContext.Scope, name);
+      return var != null ? var.Value : null;
+    }
+
     protected override void SetActualValue(IItem value) {
       if (!(value is T))
@@ -189,9 +197,13 @@
                         typeof(T).GetPrettyName())
         );
-      cachedActualValues.Value.Value = value;
-
+      CachedActualValue = value;
+
+      string translatedName = Name;
+      SetValue(ExecutionContext, ref translatedName, value);
+    }
+
+    protected static void SetValue(IExecutionContext executionContext, ref string name, IItem value) {
       // try to set value in context stack
-      string name;
-      IValueParameter param = GetValueParameterAndTranslateName(out name);
+      IValueParameter param = GetValueParameterAndTranslateName(executionContext, ref name);
       if (param != null) {
         param.Value = value;
@@ -200,5 +212,5 @@
 
       // try to set value in scope
-      IVariable var = LookupVariable(name);
+      IVariable var = LookupVariable(executionContext.Scope, name);
       if (var != null) {
         var.Value = value;
@@ -207,5 +219,5 @@
 
       // create new variable
-      ExecutionContext.Scope.Variables.Add(new Variable(name, value));
+      executionContext.Scope.Variables.Add(new Variable(name, value));
     }
 
