Index: HeuristicLab.Analysis/3.3/QualityAnalysis/QualityDistributionAnalyzer.cs
===================================================================
--- HeuristicLab.Analysis/3.3/QualityAnalysis/QualityDistributionAnalyzer.cs	(revision 12196)
+++ HeuristicLab.Analysis/3.3/QualityAnalysis/QualityDistributionAnalyzer.cs	(working copy)
@@ -37,15 +37,12 @@
     public IScopeTreeLookupParameter<DoubleValue> QualityParameter {
       get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
     }
-    public IValueLookupParameter<ResultCollection> ResultsParameter {
-      get { return (IValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    public IResultParameter<DataTable> QualityDistributionParameter {
+      get { return (IResultParameter<DataTable>)Parameters["Quality Distribution"]; }
     }
-    private ValueParameter<StringValue> HistogramNameParameter {
-      get { return (ValueParameter<StringValue>)Parameters["HistogramName"]; }
+    public IResultParameter<DataTableHistory> QualityDistributionHistoryParameter {
+      get { return (IResultParameter<DataTableHistory>)Parameters["Quality Distribution History"]; }
     }
-    private ValueParameter<BoolValue> StoreHistoryParameter {
-      get { return (ValueParameter<BoolValue>)Parameters["StoreHistory"]; }
-    }
     public ILookupParameter<IntValue> IterationsParameter {
       get { return (ILookupParameter<IntValue>)Parameters["Iterations"]; }
     }
@@ -52,6 +49,9 @@
     public IValueLookupParameter<IntValue> MaximumIterationsParameter {
       get { return (IValueLookupParameter<IntValue>)Parameters["MaximumIterations"]; }
     }
+    private ValueParameter<BoolValue> StoreHistoryParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["StoreHistory"]; }
+    }
     #endregion
 
     public virtual bool EnabledByDefault {
@@ -58,11 +58,6 @@
       get { return true; }
     }
 
-    public string HistogramName {
-      get { return HistogramNameParameter.Value.Value; }
-      set { HistogramNameParameter.Value.Value = value; }
-    }
-
     public bool StoreHistory {
       get { return StoreHistoryParameter.Value.Value; }
       set { StoreHistoryParameter.Value.Value = value; }
@@ -76,16 +71,26 @@
     public QualityDistributionAnalyzer()
       : base() {
       Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The value which represents the quality of a solution."));
-      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The results collection where the analysis values should be stored."));
-      Parameters.Add(new FixedValueParameter<StringValue>("HistogramName", "The name of the histogram that gets injected in to the results collection.", new StringValue("Quality Distribution")));
+      Parameters.Add(new ResultParameter<DataTable>("Quality Distribution", "Shows the quality distributions in the current population."));
+      Parameters.Add(new ResultParameter<DataTableHistory>("Quality Distribution History", "Maintains the history of the quality distributions of each iteration."));
       Parameters.Add(new FixedValueParameter<BoolValue>("StoreHistory", "True if the history should be stored in addition to the current distribution", new BoolValue(false)));
       Parameters.Add(new LookupParameter<IntValue>("Iterations", "Optional: A value indicating the current iteration."));
       Parameters.Add(new ValueLookupParameter<IntValue>("MaximumIterations", "Unused", new IntValue(-1)));
 
       QualityParameter.Hidden = true;
-      ResultsParameter.Hidden = true;
       IterationsParameter.Hidden = true;
       MaximumIterationsParameter.Hidden = true;
+
+      var table = new DataTable("Population Quality Distribution", QualityDistributionParameter.Description) {
+        VisualProperties = { XAxisTitle = "Quality", YAxisTitle = "Frequency" }
+      };
+      var row = new DataRow("QualityDistribution") {
+        VisualProperties = { ChartType = DataRowVisualProperties.DataRowChartType.Histogram }
+      };
+      table.Rows.Add(row);
+      QualityDistributionParameter.DefaultValue = table;
+
+      QualityDistributionHistoryParameter.DefaultValue = new DataTableHistory();
     }
 
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -93,43 +98,22 @@
     }
 
     public override IOperation Apply() {
-      DataTable qualityDistribution = null;
-      ResultCollection results = ResultsParameter.ActualValue;
-      string description = "Shows the quality distributions in the current population.";
-      if (results.ContainsKey(HistogramName)) {
-        qualityDistribution = results[HistogramName].Value as DataTable;
-      } else {
-        qualityDistribution = new DataTable("Population Quality Distribution", description);
-        qualityDistribution.VisualProperties.XAxisTitle = QualityParameter.ActualName;
-        qualityDistribution.VisualProperties.YAxisTitle = "Frequency";
-        results.Add(new Result(HistogramName, description, qualityDistribution));
-      }
-      DataRow row;
-      if (!qualityDistribution.Rows.TryGetValue("QualityDistribution", out row)) {
-        row = new DataRow("QualityDistribution");
-        row.VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Histogram;
-        qualityDistribution.Rows.Add(row);
-      }
+      var qualityDistribution = QualityDistributionParameter.ResultValue;
+      var row = qualityDistribution.Rows.First();
+
       var qualities = QualityParameter.ActualValue;
       row.Values.Replace(qualities.Select(x => x.Value));
 
       if (StoreHistory) {
-        string historyResultName = HistogramName + " History";
-        DataTableHistory qdHistory = null;
-        if (results.ContainsKey(historyResultName)) {
-          qdHistory = results[historyResultName].Value as DataTableHistory;
-        } else {
-          qdHistory = new DataTableHistory();
-          results.Add(new Result(historyResultName, qdHistory));
-        }
-        DataTable table = (DataTable)qualityDistribution.Clone();
-        IntValue iteration = IterationsParameter.ActualValue;
+        var qdHistory = QualityDistributionHistoryParameter.ResultValue;
+        var table = (DataTable)qualityDistribution.Clone();
+        var iteration = IterationsParameter.ActualValue;
         if (iteration != null) {
-          string iterationName = IterationsParameter.ActualName;
+          var iterationName = IterationsParameter.ActualName;
           if (iterationName.EndsWith("s")) iterationName = iterationName.Remove(iterationName.Length - 1);
-          string appendix = " at " + iterationName + " " + iteration.Value.ToString();
+          var appendix = " at " + iterationName + " " + iteration.Value;
           table.Name += appendix;
-          table.Rows["QualityDistribution"].VisualProperties.DisplayName += appendix;
+          table.Rows.First().VisualProperties.DisplayName += appendix;
         }
         qdHistory.Add(table);
       }
Index: HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj
===================================================================
--- HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj	(revision 12196)
+++ HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj	(working copy)
@@ -159,6 +159,12 @@
     <Compile Include="ExperimentListView.Designer.cs">
       <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>
     </Compile>
@@ -383,6 +389,16 @@
       <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>
     <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
       <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
       <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
Index: HeuristicLab.Optimization.Views/3.3/ResultParameterView.cs
===================================================================
--- HeuristicLab.Optimization.Views/3.3/ResultParameterView.cs	(revision 0)
+++ HeuristicLab.Optimization.Views/3.3/ResultParameterView.cs	(working copy)
@@ -0,0 +1,77 @@
+#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;
+using HeuristicLab.MainForm;
+using HeuristicLab.Parameters.Views;
+
+namespace HeuristicLab.Optimization.Views {
+  [View("ResultParameter View")]
+  [Content(typeof(ResultParameter<>), true)]
+  [Content(typeof(IResultParameter<>), false)]
+  public partial class ResultParameterView<T> : LookupParameterView<ResultCollection> where T : class, IItem, new() {
+
+    public new IResultParameter<T> Content {
+      get { return (IResultParameter<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ResultParameterView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ResultNameChanged -= new EventHandler(Content_ResultNameChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ResultNameChanged += new EventHandler(Content_ResultNameChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null)
+        resultNameTextBox.Text = "-";
+      else
+        resultNameTextBox.Text = Content.ResultName;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      resultNameTextBox.Enabled = Content != null;
+      resultNameTextBox.ReadOnly = ReadOnly;
+    }
+
+    private void Content_ResultNameChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ResultNameChanged), sender, e);
+      else
+        resultNameTextBox.Text = Content.ResultName;
+    }
+
+    private void resultNameTextBox_Validated(object sender, EventArgs e) {
+      Content.ResultName = resultNameTextBox.Text;
+    }
+  }
+}
Index: HeuristicLab.Optimization.Views/3.3/ResultParameterView.Designer.cs
===================================================================
--- HeuristicLab.Optimization.Views/3.3/ResultParameterView.Designer.cs	(revision 0)
+++ HeuristicLab.Optimization.Views/3.3/ResultParameterView.Designer.cs	(working copy)
@@ -0,0 +1,140 @@
+#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
+
+namespace HeuristicLab.Optimization.Views {
+  partial class ResultParameterView<T> {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.resultNameTextBox = new System.Windows.Forms.TextBox();
+      this.resultNameLabel = new System.Windows.Forms.Label();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // dataTypeLabel
+      // 
+      this.dataTypeLabel.Location = new System.Drawing.Point(3, 55);
+      this.dataTypeLabel.TabIndex = 5;
+      // 
+      // dataTypeTextBox
+      // 
+      this.dataTypeTextBox.Location = new System.Drawing.Point(80, 52);
+      this.dataTypeTextBox.Size = new System.Drawing.Size(306, 20);
+      this.dataTypeTextBox.TabIndex = 6;
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(80, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(281, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(367, 3);
+      // 
+      // actualNameTextBox
+      // 
+      this.actualNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.actualNameTextBox.Location = new System.Drawing.Point(80, 26);
+      this.actualNameTextBox.Name = "actualNameTextBox";
+      this.actualNameTextBox.Size = new System.Drawing.Size(306, 20);
+      this.actualNameTextBox.TabIndex = 4;
+      this.actualNameTextBox.Validated += new System.EventHandler(this.actualNameTextBox_Validated);
+      // 
+      // actualNameLabel
+      // 
+      this.actualNameLabel.AutoSize = true;
+      this.actualNameLabel.Location = new System.Drawing.Point(3, 29);
+      this.actualNameLabel.Name = "actualNameLabel";
+      this.actualNameLabel.Size = new System.Drawing.Size(71, 13);
+      this.actualNameLabel.TabIndex = 3;
+      this.actualNameLabel.Text = "&Actual Name:";
+      // 
+      // resultNameTextBox
+      // 
+      this.resultNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.resultNameTextBox.Location = new System.Drawing.Point(80, 78);
+      this.resultNameTextBox.Name = "resultNameTextBox";
+      this.resultNameTextBox.Size = new System.Drawing.Size(306, 20);
+      this.resultNameTextBox.TabIndex = 6;
+      this.resultNameTextBox.Validated += new System.EventHandler(this.resultNameTextBox_Validated);
+      // 
+      // resultNameLabel
+      // 
+      this.resultNameLabel.AutoSize = true;
+      this.resultNameLabel.Location = new System.Drawing.Point(3, 81);
+      this.resultNameLabel.Name = "resultNameLabel";
+      this.resultNameLabel.Size = new System.Drawing.Size(71, 13);
+      this.resultNameLabel.TabIndex = 5;
+      this.resultNameLabel.Text = "&Result Name:";
+      // 
+      // LookupParameterView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.resultNameTextBox);
+      this.Controls.Add(this.resultNameLabel);
+      this.Name = "ResultParameterView";
+      this.Size = new System.Drawing.Size(386, 76);
+      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.resultNameLabel, 0);
+      this.Controls.SetChildIndex(this.resultNameTextBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.TextBox resultNameTextBox;
+    protected System.Windows.Forms.Label resultNameLabel;
+  }
+}
Index: HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj
===================================================================
--- HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 12196)
+++ HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(working copy)
@@ -154,6 +154,7 @@
     <Compile Include="BasicProblems\SingleObjectiveBasicProblem.cs" />
     <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" />
     <Compile Include="Interfaces\ISingleObjectiveImprovementOperator.cs" />
@@ -164,6 +165,7 @@
     <Compile Include="Interfaces\ISolutionSimilarityCalculator.cs" />
     <Compile Include="MetaOptimizers\BatchRun.cs" />
     <Compile Include="MetaOptimizers\Experiment.cs" />
+    <Compile Include="Results\ResultParameter.cs" />
     <Compile Include="RunCollectionModification\RunCollectionRunRemover.cs" />
     <Compile Include="Plugin.cs" />
     <Compile Include="RunCollectionModification\RunCollectionDiscretizer.cs" />
@@ -218,7 +220,7 @@
     <Compile Include="Interfaces\IOptimizer.cs" />
     <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" />
     <Compile Include="Interfaces\IMoveOperator.cs" />
@@ -242,11 +244,11 @@
     <Compile Include="Interfaces\IStochasticOperator.cs" />
     <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>
   <ItemGroup>
Index: HeuristicLab.Optimization/3.3/Interfaces/IResult.cs
===================================================================
--- HeuristicLab.Optimization/3.3/Interfaces/IResult.cs	(revision 12196)
+++ HeuristicLab.Optimization/3.3/Interfaces/IResult.cs	(working copy)
@@ -1,36 +0,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: HeuristicLab.Optimization/3.3/Result.cs
===================================================================
--- HeuristicLab.Optimization/3.3/Result.cs	(revision 12196)
+++ HeuristicLab.Optimization/3.3/Result.cs	(working copy)
@@ -1,157 +0,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: HeuristicLab.Optimization/3.3/ResultCollection.cs
===================================================================
--- HeuristicLab.Optimization/3.3/ResultCollection.cs	(revision 12196)
+++ HeuristicLab.Optimization/3.3/ResultCollection.cs	(working copy)
@@ -1,78 +0,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: HeuristicLab.Optimization/3.3/Results/IResult.cs
===================================================================
--- HeuristicLab.Optimization/3.3/Results/IResult.cs	(revision 0)
+++ HeuristicLab.Optimization/3.3/Results/IResult.cs	(working copy)
@@ -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: HeuristicLab.Optimization/3.3/Results/IResultParameter.cs
===================================================================
--- HeuristicLab.Optimization/3.3/Results/IResultParameter.cs	(revision 0)
+++ HeuristicLab.Optimization/3.3/Results/IResultParameter.cs	(working copy)
@@ -0,0 +1,35 @@
+#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 {
+  public interface IResultParameter : ILookupParameter {
+    string ResultName { get; set; }
+    event EventHandler ResultNameChanged;
+  }
+
+  public interface IResultParameter<T> : ILookupParameter<ResultCollection>, IResultParameter where T : class, IItem, new() {
+    T DefaultValue { get; set; }
+    T ResultValue { get; set; }
+  }
+}
Index: HeuristicLab.Optimization/3.3/Results/Result.cs
===================================================================
--- HeuristicLab.Optimization/3.3/Results/Result.cs	(revision 0)
+++ HeuristicLab.Optimization/3.3/Results/Result.cs	(working copy)
@@ -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: HeuristicLab.Optimization/3.3/Results/ResultCollection.cs
===================================================================
--- HeuristicLab.Optimization/3.3/Results/ResultCollection.cs	(revision 0)
+++ HeuristicLab.Optimization/3.3/Results/ResultCollection.cs	(working copy)
@@ -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: HeuristicLab.Optimization/3.3/Results/ResultParameter.cs
===================================================================
--- HeuristicLab.Optimization/3.3/Results/ResultParameter.cs	(revision 0)
+++ HeuristicLab.Optimization/3.3/Results/ResultParameter.cs	(working copy)
@@ -0,0 +1,139 @@
+﻿#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.Common;
+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<ResultCollection>, IResultParameter<T> where T : class, IItem, new() {
+
+    [Storable]
+    private string resultName;
+    public string ResultName {
+      get { return resultName; }
+      set {
+        if (value == null) throw new ArgumentNullException();
+        if (string.IsNullOrWhiteSpace(value)) {
+          resultName = Name;
+          OnResultNameChanged();
+        } else if (!resultName.Equals(value)) {
+          resultName = value;
+          OnResultNameChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private T defaultValue;
+    public T DefaultValue {
+      get { return defaultValue; }
+      set {
+        if (value != defaultValue) {
+          defaultValue = value;
+          OnDefaultValueChanged();
+        }
+      }
+    }
+
+    public T ResultValue {
+      get { return GetResultValue(); }
+      set { SetResultValue(value); }
+    }
+
+    [StorableConstructor]
+    private ResultParameter(bool deserializing) : base(deserializing) { }
+    private ResultParameter(ResultParameter<T> original, Cloner cloner)
+      : base(original, cloner) {
+      resultName = original.resultName;
+      defaultValue = cloner.Clone(original.defaultValue);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ResultParameter<T>(this, cloner);
+    }
+    public ResultParameter() : this("Anonymous") { }
+    public ResultParameter(string name)
+      : base(name, string.Empty, "Results") {
+      resultName = Name;
+      defaultValue = new T();
+    }
+    public ResultParameter(string name, string description) : this(name, description, new T()) { }
+    public ResultParameter(string name, string description, T defaultValue)
+      : base(name, description, "Results") {
+      if (defaultValue == null) throw new ArgumentNullException("defaultValue");
+      resultName = Name;
+      this.defaultValue = defaultValue;
+    }
+    public ResultParameter(string name, string description, string resultName) : this(name, description, new T(), resultName) { }
+    public ResultParameter(string name, string description, T defaultValue, string resultName)
+      : base(name, description, "Results") {
+      if (defaultValue == null) throw new ArgumentNullException("defaultValue");
+      this.resultName = string.IsNullOrWhiteSpace(resultName) ? Name : resultName;
+      this.defaultValue = defaultValue;
+    }
+
+    public override string ToString() {
+      if (Name.Equals(ResultName)) return Name;
+      return Name + ": " + ResultName;
+    }
+
+    private T GetResultValue() {
+      var results = ActualValue;
+      if (results == null)
+        throw new InvalidOperationException("ResultParameter (" + ResultName + "): ResultCollection " + ActualName + " not found.");
+
+      if (!results.ContainsKey(ResultName)) results.Add(new Result(ResultName, (T)DefaultValue.Clone()));
+      var resultValue = results[ResultName].Value as T;
+      if (resultValue == null)
+        throw new InvalidOperationException(string.Format("Type mismatch. Result \"{0}\" does not contain a \"{1}\".", ResultName, typeof(T).GetPrettyName()));
+
+      return resultValue;
+    }
+
+    private void SetResultValue(T value) {
+      var results = ActualValue;
+      if (results == null)
+        throw new InvalidOperationException("ResultParameter (" + ResultName + "): ResultCollection " + ActualName + " not found.");
+
+      if (!results.ContainsKey(ResultName))
+        results.Add(new Result(ResultName, value));
+      else results[ResultName].Value = value;
+    }
+
+    public event EventHandler ResultNameChanged;
+    private void OnResultNameChanged() {
+      var handler = ResultNameChanged;
+      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: HeuristicLab.Optimization/3.3/Results/IResult.cs
===================================================================
--- HeuristicLab.Optimization/3.3/Results/IResult.cs	(revision 0)
+++ HeuristicLab.Optimization/3.3/Results/IResult.cs	(working copy)
@@ -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: HeuristicLab.Optimization/3.3/Results/IResultParameter.cs
===================================================================
--- HeuristicLab.Optimization/3.3/Results/IResultParameter.cs	(revision 0)
+++ HeuristicLab.Optimization/3.3/Results/IResultParameter.cs	(working copy)
@@ -0,0 +1,35 @@
+#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 {
+  public interface IResultParameter : ILookupParameter {
+    string ResultName { get; set; }
+    event EventHandler ResultNameChanged;
+  }
+
+  public interface IResultParameter<T> : ILookupParameter<ResultCollection>, IResultParameter where T : class, IItem, new() {
+    T DefaultValue { get; set; }
+    T ResultValue { get; set; }
+  }
+}
Index: HeuristicLab.Optimization/3.3/Results/Result.cs
===================================================================
--- HeuristicLab.Optimization/3.3/Results/Result.cs	(revision 0)
+++ HeuristicLab.Optimization/3.3/Results/Result.cs	(working copy)
@@ -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: HeuristicLab.Optimization/3.3/Results/ResultCollection.cs
===================================================================
--- HeuristicLab.Optimization/3.3/Results/ResultCollection.cs	(revision 0)
+++ HeuristicLab.Optimization/3.3/Results/ResultCollection.cs	(working copy)
@@ -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: HeuristicLab.Optimization/3.3/Results/ResultParameter.cs
===================================================================
--- HeuristicLab.Optimization/3.3/Results/ResultParameter.cs	(revision 0)
+++ HeuristicLab.Optimization/3.3/Results/ResultParameter.cs	(working copy)
@@ -0,0 +1,139 @@
+﻿#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.Common;
+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<ResultCollection>, IResultParameter<T> where T : class, IItem, new() {
+
+    [Storable]
+    private string resultName;
+    public string ResultName {
+      get { return resultName; }
+      set {
+        if (value == null) throw new ArgumentNullException();
+        if (string.IsNullOrWhiteSpace(value)) {
+          resultName = Name;
+          OnResultNameChanged();
+        } else if (!resultName.Equals(value)) {
+          resultName = value;
+          OnResultNameChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private T defaultValue;
+    public T DefaultValue {
+      get { return defaultValue; }
+      set {
+        if (value != defaultValue) {
+          defaultValue = value;
+          OnDefaultValueChanged();
+        }
+      }
+    }
+
+    public T ResultValue {
+      get { return GetResultValue(); }
+      set { SetResultValue(value); }
+    }
+
+    [StorableConstructor]
+    private ResultParameter(bool deserializing) : base(deserializing) { }
+    private ResultParameter(ResultParameter<T> original, Cloner cloner)
+      : base(original, cloner) {
+      resultName = original.resultName;
+      defaultValue = cloner.Clone(original.defaultValue);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ResultParameter<T>(this, cloner);
+    }
+    public ResultParameter() : this("Anonymous") { }
+    public ResultParameter(string name)
+      : base(name, string.Empty, "Results") {
+      resultName = Name;
+      defaultValue = new T();
+    }
+    public ResultParameter(string name, string description) : this(name, description, new T()) { }
+    public ResultParameter(string name, string description, T defaultValue)
+      : base(name, description, "Results") {
+      if (defaultValue == null) throw new ArgumentNullException("defaultValue");
+      resultName = Name;
+      this.defaultValue = defaultValue;
+    }
+    public ResultParameter(string name, string description, string resultName) : this(name, description, new T(), resultName) { }
+    public ResultParameter(string name, string description, T defaultValue, string resultName)
+      : base(name, description, "Results") {
+      if (defaultValue == null) throw new ArgumentNullException("defaultValue");
+      this.resultName = string.IsNullOrWhiteSpace(resultName) ? Name : resultName;
+      this.defaultValue = defaultValue;
+    }
+
+    public override string ToString() {
+      if (Name.Equals(ResultName)) return Name;
+      return Name + ": " + ResultName;
+    }
+
+    private T GetResultValue() {
+      var results = ActualValue;
+      if (results == null)
+        throw new InvalidOperationException("ResultParameter (" + ResultName + "): ResultCollection " + ActualName + " not found.");
+
+      if (!results.ContainsKey(ResultName)) results.Add(new Result(ResultName, (T)DefaultValue.Clone()));
+      var resultValue = results[ResultName].Value as T;
+      if (resultValue == null)
+        throw new InvalidOperationException(string.Format("Type mismatch. Result \"{0}\" does not contain a \"{1}\".", ResultName, typeof(T).GetPrettyName()));
+
+      return resultValue;
+    }
+
+    private void SetResultValue(T value) {
+      var results = ActualValue;
+      if (results == null)
+        throw new InvalidOperationException("ResultParameter (" + ResultName + "): ResultCollection " + ActualName + " not found.");
+
+      if (!results.ContainsKey(ResultName))
+        results.Add(new Result(ResultName, value));
+      else results[ResultName].Value = value;
+    }
+
+    public event EventHandler ResultNameChanged;
+    private void OnResultNameChanged() {
+      var handler = ResultNameChanged;
+      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: HeuristicLab.Parameters.Views/3.3/HeuristicLab.Parameters.Views-3.3.csproj
===================================================================
--- HeuristicLab.Parameters.Views/3.3/HeuristicLab.Parameters.Views-3.3.csproj	(revision 12196)
+++ HeuristicLab.Parameters.Views/3.3/HeuristicLab.Parameters.Views-3.3.csproj	(working copy)
@@ -216,16 +216,6 @@
       <Name>HeuristicLab.MainForm-3.3</Name>
       <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>
       <Name>HeuristicLab.Parameters-3.3</Name>
