Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.App/Runner.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.App/Runner.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.App/Runner.cs	(revision 18055)
@@ -22,14 +22,14 @@
       Task task = optimizer.StartAsync();
       while (!task.IsCompleted) {
-        WriteResultsToFile(outputFile, optimizer, configuredResultItem, instantiatorResult.PostProcessors);
+        WriteResultsToFile(outputFile, optimizer, configuredResultItem, instantiatorResult.RunCollectionModifiers);
         Thread.Sleep(100);
       }
 
-      WriteResultsToFile(outputFile, optimizer, configuredResultItem, instantiatorResult.PostProcessors);
+      WriteResultsToFile(outputFile, optimizer, configuredResultItem, instantiatorResult.RunCollectionModifiers);
     }
 
-    private static void WriteResultsToFile(string file, IOptimizer optimizer, IEnumerable<IResultJsonItem> configuredResultItem, IEnumerable<IResultCollectionProcessor> postProcessors) {
+    private static void WriteResultsToFile(string file, IOptimizer optimizer, IEnumerable<IResultJsonItem> configuredResultItem, IEnumerable<IRunCollectionModifier> runCollectionModifiers) {
       if (optimizer.Runs.Count > 0) 
-        File.WriteAllText(file, FetchResults(optimizer, configuredResultItem, postProcessors));
+        File.WriteAllText(file, FetchResults(optimizer, configuredResultItem, runCollectionModifiers));
     }
       
@@ -41,8 +41,36 @@
       ResultFormatter?.Where(x => x.GetType().FullName == fullName).Last();
 
-    private static string FetchResults(IOptimizer optimizer, IEnumerable<IResultJsonItem> configuredResultItems, IEnumerable<IResultCollectionProcessor> postProcessors) {
+    private static string FetchResults(IOptimizer optimizer, IEnumerable<IResultJsonItem> configuredResultItems, IEnumerable<IRunCollectionModifier> runCollectionModifiers) {
       JArray arr = new JArray();
       IEnumerable<string> configuredResults = configuredResultItems.Select(x => x.Name);
+      
+      foreach (var processor in runCollectionModifiers)
+        processor.Modify(new List<IRun>(optimizer.Runs.ToArray()));
+      
+      foreach (var run in optimizer.Runs) {
+        JObject obj = new JObject();
+        arr.Add(obj);
+        obj.Add("Run", JToken.FromObject(run.ToString()));
+        foreach (var result in run.Results)
+          obj.Add(result.Key, result.Value.ToString());
 
+        // zip and filter the results with the ResultJsonItems
+        var filteredResults = new List<Tuple<IResultJsonItem, IItem>>();
+        foreach (var resultItem in configuredResultItems) {
+          foreach (var result in run.Results) {
+            if (resultItem.Name == result.Key) {
+              filteredResults.Add(Tuple.Create(resultItem, result.Value));
+            }
+          }
+        }
+
+        // add results to the JObject
+        foreach (var result in filteredResults) {
+          var formatter = GetResultFormatter(result.Item1.ResultFormatterType);
+          if (!obj.ContainsKey(result.Item1.Name)) // to prevent duplicates
+            obj.Add(result.Item1.Name, formatter.Format(result.Item2));
+        }
+      }
+      /*
       foreach (var run in optimizer.Runs) {
         JObject obj = new JObject();
@@ -66,11 +94,5 @@
             obj.Add(result.Item1.Name, formatter.Format(result.Item2));
         }
-
-        foreach (var processor in postProcessors)
-          processor.Apply(run.Results);
-
-        foreach(var result in run.Results)
-          obj.Add(result.Key, result.Value.ToString());
-      }
+      }*/
       return SingleLineArrayJsonWriter.Serialize(arr);
     }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.Designer.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.Designer.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.Designer.cs	(revision 18055)
@@ -1,3 +1,4 @@
 ﻿using HeuristicLab.Core;
+using HeuristicLab.Optimization;
 
 namespace HeuristicLab.JsonInterface.OptimizerIntegration {
@@ -27,4 +28,5 @@
     private void InitializeComponent() {
       this.components = new System.ComponentModel.Container();
+      HeuristicLab.Core.CheckedItemList<HeuristicLab.Optimization.IRunCollectionModifier> checkedItemList_11 = new HeuristicLab.Core.CheckedItemList<HeuristicLab.Optimization.IRunCollectionModifier>();
       this.dataGridViewTextBoxColumn1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
       this.exportButton = new System.Windows.Forms.Button();
@@ -41,4 +43,5 @@
       this.tabPage2 = new System.Windows.Forms.TabPage();
       this.tabPage3 = new System.Windows.Forms.TabPage();
+      this.postProcessorListControl = new HeuristicLab.JsonInterface.OptimizerIntegration.ResultCollectionPostProcessorControl();
       this.label1 = new System.Windows.Forms.Label();
       this.textBoxTemplateName = new System.Windows.Forms.TextBox();
@@ -58,4 +61,5 @@
       this.tabPage1.SuspendLayout();
       this.tabPage2.SuspendLayout();
+      this.tabPage3.SuspendLayout();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       ((System.ComponentModel.ISupportInitialize)(this.jsonItemBindingSource)).BeginInit();
@@ -175,9 +179,4 @@
       this.splitContainer2.SplitterDistance = 380;
       this.splitContainer2.TabIndex = 9;
-      // postProcessorListView
-      this.postProcessorListControl = new ResultCollectionPostProcessorControl();
-      this.postProcessorListControl.Content = new CheckedItemList<IResultCollectionProcessor>();
-      this.postProcessorListControl.Location = new System.Drawing.Point(0, 6);
-      this.postProcessorListControl.Dock = System.Windows.Forms.DockStyle.Fill;
       // 
       // tabControl1
@@ -224,6 +223,18 @@
       this.tabPage3.Size = new System.Drawing.Size(802, 505);
       this.tabPage3.TabIndex = 2;
-      this.tabPage3.Text = "Post Processors";
+      this.tabPage3.Text = "Result Collection Modifiers";
       this.tabPage3.UseVisualStyleBackColor = true;
+      // 
+      // postProcessorListControl
+      // 
+      this.postProcessorListControl.Caption = "View";
+      checkedItemList_11.Capacity = 0;
+      this.postProcessorListControl.Content = checkedItemList_11;
+      this.postProcessorListControl.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.postProcessorListControl.Location = new System.Drawing.Point(0, 0);
+      this.postProcessorListControl.Name = "postProcessorListControl";
+      this.postProcessorListControl.ReadOnly = false;
+      this.postProcessorListControl.Size = new System.Drawing.Size(802, 505);
+      this.postProcessorListControl.TabIndex = 0;
       // 
       // label1
@@ -282,4 +293,5 @@
       this.tabPage1.ResumeLayout(false);
       this.tabPage2.ResumeLayout(false);
+      this.tabPage3.ResumeLayout(false);
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
       ((System.ComponentModel.ISupportInitialize)(this.jsonItemBindingSource)).EndInit();
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.cs	(revision 18055)
@@ -22,5 +22,5 @@
     private IOptimizer Optimizer { get; set; }
     private IList<IJsonItemVM> VMs { get; set; }
-    private ICheckedItemList<IResultCollectionProcessor> PostProcessors { get; set; }
+    private ICheckedItemList<IRunCollectionModifier> RunCollectionModifiers { get; set; }
     #endregion
 
@@ -61,5 +61,5 @@
     public ExportJsonDialog() {
       InitializeComponent();
-      this.PostProcessors = this.postProcessorListControl.Content;
+      this.RunCollectionModifiers = this.postProcessorListControl.Content;
       this.Icon = HeuristicLab.Common.Resources.HeuristicLab.Icon;
       InitCache();
@@ -78,5 +78,5 @@
           JsonTemplateGenerator.GenerateTemplate(
             Path.Combine(FolderBrowserDialog.SelectedPath, textBoxTemplateName.Text), 
-            Optimizer, Root, PostProcessors.CheckedItems.Select(x => x.Value));
+            Optimizer, Root, RunCollectionModifiers.CheckedItems.Select(x => x.Value));
           Close();
         } catch (Exception ex) {
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ResultCollectionPostProcessorControl.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ResultCollectionPostProcessorControl.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ResultCollectionPostProcessorControl.cs	(revision 18055)
@@ -9,12 +9,13 @@
 using System.Windows.Forms;
 using HeuristicLab.Collections;
+using HeuristicLab.Optimization;
 
 namespace HeuristicLab.JsonInterface.OptimizerIntegration {
-  public partial class ResultCollectionPostProcessorControl : Core.Views.CheckedItemListView<IResultCollectionProcessor> {
+  public partial class ResultCollectionPostProcessorControl : Core.Views.CheckedItemListView<IRunCollectionModifier> {
     public ResultCollectionPostProcessorControl() {
       InitializeComponent();
     }
 
-    protected override string GroupBoxText => "Result Collection Processors";
+    protected override string GroupBoxText => "Run Collection Modifiers";
 
   }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Constants.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Constants.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Constants.cs	(revision 18055)
@@ -10,5 +10,5 @@
     internal const string Parameters = "Parameters";
     internal const string Results = "Results";
-    internal const string ResultCollectionProcessorItems = "ResultCollectionProcessors";
+    internal const string RunCollectionModifiers = "RunCollectionModifiers";
 
     internal const string Template = @"{
@@ -19,5 +19,5 @@
       '" + Parameters + @"': [],
       '" + Results + @"': [],
-      '" + ResultCollectionProcessorItems + @"': []
+      '" + RunCollectionModifiers + @"': []
     }";
   }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ItemCollectionConverter.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ItemCollectionConverter.cs	(revision 18055)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ItemCollectionConverter.cs	(revision 18055)
@@ -0,0 +1,47 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using HEAL.Attic;
+using HeuristicLab.Collections;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.JsonInterface {
+  public class ItemCollectionConverter : BaseConverter {
+    public override int Priority => 5;
+
+    public override bool CanConvertType(Type t) =>
+      t.GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IItemCollection<>));
+
+    public override IJsonItem Extract(IItem value, IJsonItemConverter root) {
+      var collection = (dynamic)value;
+      var item = new ListJsonItem();
+      IList<IJsonItem> valueItems = new List<IJsonItem>();
+
+      foreach(IItem i in collection) {
+        var tmp = root.Extract(i, root);
+        valueItems.Add(tmp);
+      }
+      if (valueItems.Count > 0) {
+        var targetType = valueItems.First().GetType();
+        item.TargetTypeGUID = StorableTypeAttribute.GetStorableTypeAttribute(targetType).Guid.ToString();
+      }
+
+      item.Value = valueItems.ToArray();
+      return item;
+    }
+
+    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) {
+      var collection = (dynamic)item;
+      var listItem = data as ListJsonItem;
+      var genericType = item.GetType().GetGenericArguments().First();
+
+      foreach (var i in listItem.Value) {
+        var tmp = Instantiate(genericType);
+        root.Inject(tmp, i, root);
+        collection.Add((dynamic)tmp);
+      }
+    }
+  }
+}
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/HeuristicLab.JsonInterface.csproj
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/HeuristicLab.JsonInterface.csproj	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/HeuristicLab.JsonInterface.csproj	(revision 18055)
@@ -66,5 +66,5 @@
     <Compile Include="Converters\BatchRunConverter.cs" />
     <Compile Include="Converters\ExperimentConverter.cs" />
-    <Compile Include="Converters\ObervableListConverter.cs" />
+    <Compile Include="Converters\ItemCollectionConverter.cs" />
     <Compile Include="Converters\RegressionProblemDataConverter.cs" />
     <Compile Include="Converters\ResultConverter.cs" />
@@ -84,5 +84,5 @@
     <Compile Include="Interfaces\IValueJsonItem.cs" />
     <Compile Include="Interfaces\IValueLookupJsonItem.cs" />
-    <Compile Include="Interfaces\IResultCollectionProcessor.cs" />
+    <Compile Include="Interfaces\IListJsonItem.cs" />
     <Compile Include="JsonItems\ArrayJsonItem.cs" />
     <Compile Include="JsonItems\BoolJsonItems.cs" />
@@ -98,4 +98,5 @@
     <Compile Include="JsonItems\IntJsonItems.cs" />
     <Compile Include="JsonItems\JsonItem.cs" />
+    <Compile Include="JsonItems\ListJsonItem.cs" />
     <Compile Include="JsonItems\LookupJsonItem.cs" />
     <Compile Include="JsonItems\MatrixJsonItem.cs" />
@@ -106,6 +107,9 @@
     <Compile Include="JsonItems\ValueJsonItem.cs" />
     <Compile Include="JsonItems\ValueLookupJsonItem.cs" />
+    <Compile Include="ResultCollectionProcessors\AbstractProcessors\RunCollectionSRSolutionFormatter.cs" />
     <Compile Include="ResultCollectionProcessors\FilterResultCollectionProcessor.cs" />
-    <Compile Include="ResultCollectionProcessors\SymRegPythonProcessor.cs" />
+    <Compile Include="ResultCollectionProcessors\RunCollectionSRSolutionGraphVizFormatter.cs" />
+    <Compile Include="ResultCollectionProcessors\RunCollectionSRSolutionLatexFormatter.cs" />
+    <Compile Include="ResultCollectionProcessors\RunCollectionSRSolutionPythonFormatter.cs" />
     <Compile Include="ResultFormatters\MatlabResultFormatter.cs" />
     <Compile Include="ResultFormatters\PythonResultFormatter.cs" />
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Interfaces/IListJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Interfaces/IListJsonItem.cs	(revision 18055)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Interfaces/IListJsonItem.cs	(revision 18055)
@@ -0,0 +1,7 @@
+﻿using System;
+
+namespace HeuristicLab.JsonInterface {
+  public interface IListJsonItem {
+    string TargetTypeGUID { get; set; }
+  }
+}
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Interfaces/IResultCollectionProcessor.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Interfaces/IResultCollectionProcessor.cs	(revision 18054)
+++ 	(revision )
@@ -1,14 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using HeuristicLab.Collections;
-using HeuristicLab.Core;
-using HeuristicLab.Optimization;
-
-namespace HeuristicLab.JsonInterface {
-  public interface IResultCollectionProcessor : IParameterizedNamedItem {
-    void Apply(IObservableDictionary<string, IItem> results);
-  }
-}
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ArrayJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ArrayJsonItem.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ArrayJsonItem.cs	(revision 18055)
@@ -1,5 +1,7 @@
 ﻿using Newtonsoft.Json.Linq;
+using HEAL.Attic;
 
 namespace HeuristicLab.JsonInterface {
+  [StorableType("1A448B57-6587-4EB4-9A0A-B05C376894C6")]
   public abstract class ArrayJsonItem<T> : ValueJsonItem<T[]>, IArrayJsonItem {
     public virtual bool Resizable { get; set; }
@@ -8,4 +10,10 @@
       Resizable = (jObject[nameof(IArrayJsonItem.Resizable)]?.ToObject<bool>()).GetValueOrDefault();
     }
+
+    public ArrayJsonItem() { }
+
+    [StorableConstructor]
+    protected ArrayJsonItem(StorableConstructorFlag _) : base(_) { }
+
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/BoolJsonItems.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/BoolJsonItems.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/BoolJsonItems.cs	(revision 18055)
@@ -1,13 +1,33 @@
-﻿namespace HeuristicLab.JsonInterface {
+﻿using HEAL.Attic;
+
+namespace HeuristicLab.JsonInterface {
+  [StorableType("01F11732-16D0-4115-82B7-1BE3A731DC14")]
   public class BoolJsonItem : ValueJsonItem<bool> {
     protected override ValidationResult Validate() => ValidationResult.Successful();
+
+    public BoolJsonItem() { }
+
+    [StorableConstructor]
+    protected BoolJsonItem(StorableConstructorFlag _) : base(_) { }
   }
 
+  [StorableType("49995C46-3B9B-49FC-952C-85645D0B565A")]
   public class BoolArrayJsonItem : ArrayJsonItem<bool> {
     protected override ValidationResult Validate() => ValidationResult.Successful();
+
+    public BoolArrayJsonItem() { }
+
+    [StorableConstructor]
+    protected BoolArrayJsonItem(StorableConstructorFlag _) : base(_) { }
   }
 
+  [StorableType("5680A943-A5C4-4310-977E-261252810766")]
   public class BoolMatrixJsonItem : MatrixJsonItem<bool> {
     protected override ValidationResult Validate() => ValidationResult.Successful();
+
+    public BoolMatrixJsonItem() { }
+
+    [StorableConstructor]
+    protected BoolMatrixJsonItem(StorableConstructorFlag _) : base(_) { }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ConcreteRestrictedArrayJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ConcreteRestrictedArrayJsonItem.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ConcreteRestrictedArrayJsonItem.cs	(revision 18055)
@@ -1,5 +1,8 @@
 ﻿using System.Collections.Generic;
 using System.Linq;
+using HEAL.Attic;
+
 namespace HeuristicLab.JsonInterface {
+  [StorableType("4333B6C0-26F7-41BA-A297-071AB50307F9")]
   public abstract class ConcreteRestrictedArrayJsonItem<T> : ArrayJsonItem<T>, IConcreteRestrictedJsonItem<T> {
     public IEnumerable<T> ConcreteRestrictedItems { get; set; }
@@ -9,7 +12,7 @@
       IList<string> errors = new List<string>();
       if (ConcreteRestrictedItems == null) return ValidationResult.Successful();
-      foreach(var x in Value) {
+      foreach (var x in Value) {
         bool tmp = false;
-        foreach(var restrictedItem in ConcreteRestrictedItems) {
+        foreach (var restrictedItem in ConcreteRestrictedItems) {
           tmp = tmp || x.Equals(restrictedItem); //if one tmp is true, it stays true (match found)
         }
@@ -19,9 +22,14 @@
         res = res && tmp; //if one tmp is false, res will set false
       }
-      if (res) 
+      if (res)
         return ValidationResult.Successful();
-      else 
+      else
         return ValidationResult.Faulty(errors);
     }
+
+    public ConcreteRestrictedArrayJsonItem() { }
+
+    [StorableConstructor]
+    protected ConcreteRestrictedArrayJsonItem(StorableConstructorFlag _) : base(_) { }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ConcreteRestrictedValueJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ConcreteRestrictedValueJsonItem.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ConcreteRestrictedValueJsonItem.cs	(revision 18055)
@@ -1,7 +1,8 @@
 ﻿using System.Collections.Generic;
 using System.Linq;
+using HEAL.Attic;
 
 namespace HeuristicLab.JsonInterface {
-
+  [StorableType("4B3B7E23-4317-4804-BB51-88ABFD58CD03")]
   public abstract class ConcreteRestrictedValueJsonItem<T> : ValueJsonItem<T>, IConcreteRestrictedJsonItem<T> {
 
@@ -16,4 +17,9 @@
         $"'{ string.Join(",", ConcreteRestrictedItems.Select(s => s.ToString()).ToArray()) }'.");
     }
+
+    public ConcreteRestrictedValueJsonItem() { }
+
+    [StorableConstructor]
+    protected ConcreteRestrictedValueJsonItem(StorableConstructorFlag _) : base(_) { }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/DateTimeJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/DateTimeJsonItem.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/DateTimeJsonItem.cs	(revision 18055)
@@ -1,8 +1,10 @@
 ﻿using System;
 using Newtonsoft.Json.Linq;
+using HEAL.Attic;
 
 namespace HeuristicLab.JsonInterface {
+  [StorableType("C700603D-50E5-448B-B785-9974463A91A8")]
   public class DateTimeJsonItem : IntervalRestrictedValueJsonItem<DateTime> {
-    
+
     public override JObject GenerateJObject() {
       var obj = base.GenerateJObject();
@@ -22,4 +24,9 @@
       base.SetJObject(jObject);
     }
+
+    public DateTimeJsonItem() { }
+
+    [StorableConstructor]
+    protected DateTimeJsonItem(StorableConstructorFlag _) : base(_) { }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/DoubleJsonItems.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/DoubleJsonItems.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/DoubleJsonItems.cs	(revision 18055)
@@ -1,5 +1,7 @@
 ﻿using Newtonsoft.Json.Linq;
+using HEAL.Attic;
 
 namespace HeuristicLab.JsonInterface {
+  [StorableType("B9B3843E-90B9-453F-AB7F-B3A4B8DF6809")]
   public class DoubleJsonItem : IntervalRestrictedValueJsonItem<double> {
     public override JObject GenerateJObject() {
@@ -20,5 +22,12 @@
       base.SetJObject(jObject);
     }
+
+    public DoubleJsonItem() { }
+
+    [StorableConstructor]
+    protected DoubleJsonItem(StorableConstructorFlag _) : base(_) { }
   }
+
+  [StorableType("D7E2BA3D-E9F7-4062-8423-182B517FA7CA")]
   public class DoubleArrayJsonItem : IntervalRestrictedArrayJsonItem<double> {
     public override JObject GenerateJObject() {
@@ -39,5 +48,12 @@
       base.SetJObject(jObject);
     }
+
+    public DoubleArrayJsonItem() { }
+
+    [StorableConstructor]
+    protected DoubleArrayJsonItem(StorableConstructorFlag _) : base(_) { }
   }
+
+  [StorableType("4ED29A62-F368-476B-B551-4283E428F7B9")]
   public class DoubleRangeJsonItem : RangedJsonItem<double> {
     public override JObject GenerateJObject() {
@@ -58,5 +74,12 @@
       base.SetJObject(jObject);
     }
+
+    public DoubleRangeJsonItem() { }
+
+    [StorableConstructor]
+    protected DoubleRangeJsonItem(StorableConstructorFlag _) : base(_) { }
   }
+
+  [StorableType("39C117DA-6274-4C1F-8CA8-A57B1A7A9C72")]
   public class DoubleMatrixJsonItem : IntervalRestrictedMatrixJsonItem<double> {
     public override JObject GenerateJObject() {
@@ -77,4 +100,9 @@
       base.SetJObject(jObject);
     }
+
+    public DoubleMatrixJsonItem() { }
+
+    [StorableConstructor]
+    protected DoubleMatrixJsonItem(StorableConstructorFlag _) : base(_) { }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/EmptyJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/EmptyJsonItem.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/EmptyJsonItem.cs	(revision 18055)
@@ -1,5 +1,13 @@
-﻿namespace HeuristicLab.JsonInterface {
+﻿using HEAL.Attic;
+
+namespace HeuristicLab.JsonInterface {
+  [StorableType("B33EA674-10D1-4184-A564-9EE7F7BFC55B")]
   public class EmptyJsonItem : JsonItem {
     protected override ValidationResult Validate() => ValidationResult.Successful();
+
+    public EmptyJsonItem() { }
+
+    [StorableConstructor]
+    protected EmptyJsonItem(StorableConstructorFlag _) : base(_) { }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/IntJsonItems.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/IntJsonItems.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/IntJsonItems.cs	(revision 18055)
@@ -1,5 +1,7 @@
 ﻿using Newtonsoft.Json.Linq;
+using HEAL.Attic;
 
 namespace HeuristicLab.JsonInterface {
+  [StorableType("4FFDAC9B-34F3-4FDB-ABD1-BB2128CE5A49")]
   public class IntJsonItem : IntervalRestrictedValueJsonItem<int> {
     public override JObject GenerateJObject() {
@@ -20,5 +22,12 @@
       base.SetJObject(jObject);
     }
+
+    public IntJsonItem() { }
+
+    [StorableConstructor]
+    protected IntJsonItem(StorableConstructorFlag _) : base(_) { }
   }
+
+  [StorableType("73E22461-6CA0-4BE1-A5FE-9EF7FFD320AD")]
   public class IntArrayJsonItem : IntervalRestrictedArrayJsonItem<int> {
     public override JObject GenerateJObject() {
@@ -39,5 +48,12 @@
       base.SetJObject(jObject);
     }
+
+    public IntArrayJsonItem() { }
+
+    [StorableConstructor]
+    protected IntArrayJsonItem(StorableConstructorFlag _) : base(_) { }
   }
+
+  [StorableType("A6FBA509-FC37-4E54-9578-5AFB764CFB89")]
   public class IntRangeJsonItem : RangedJsonItem<int> {
     public override JObject GenerateJObject() {
@@ -58,5 +74,12 @@
       base.SetJObject(jObject);
     }
+
+    public IntRangeJsonItem() { }
+
+    [StorableConstructor]
+    protected IntRangeJsonItem(StorableConstructorFlag _) : base(_) { }
   }
+
+  [StorableType("3CFF8D3E-8608-41BA-85A5-42CD4DA45685")]
   public class IntMatrixJsonItem : IntervalRestrictedMatrixJsonItem<int> {
     public override JObject GenerateJObject() {
@@ -77,4 +100,9 @@
       base.SetJObject(jObject);
     }
+
+    public IntMatrixJsonItem() { }
+
+    [StorableConstructor]
+    protected IntMatrixJsonItem(StorableConstructorFlag _) : base(_) { }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/IntervalRestrictedArrayJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/IntervalRestrictedArrayJsonItem.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/IntervalRestrictedArrayJsonItem.cs	(revision 18055)
@@ -2,8 +2,10 @@
 using System.Collections.Generic;
 using Newtonsoft.Json.Linq;
+using HEAL.Attic;
 
 namespace HeuristicLab.JsonInterface {
+  [StorableType("97466581-CCF1-45BD-B5F8-87B8660DBE13")]
   public abstract class IntervalRestrictedArrayJsonItem<T> : ArrayJsonItem<T>, IIntervalRestrictedJsonItem<T>
-    where T : IComparable {
+      where T : IComparable {
     public T Minimum { get; set; }
     public T Maximum { get; set; }
@@ -31,4 +33,9 @@
       if (maxProp != null) Maximum = maxProp.ToObject<T>();
     }
+
+    public IntervalRestrictedArrayJsonItem() { }
+
+    [StorableConstructor]
+    protected IntervalRestrictedArrayJsonItem(StorableConstructorFlag _) : base(_) { }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/IntervalRestrictedJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/IntervalRestrictedJsonItem.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/IntervalRestrictedJsonItem.cs	(revision 18055)
@@ -1,8 +1,10 @@
 ﻿using System;
 using Newtonsoft.Json.Linq;
+using HEAL.Attic;
 
 namespace HeuristicLab.JsonInterface {
+  [StorableType("4D76601B-9627-4ABD-A24B-49179D59AB11")]
   public abstract class IntervalRestrictedJsonItem<T> : JsonItem, IIntervalRestrictedJsonItem<T>
-    where T : IComparable {
+      where T : IComparable {
     public T Minimum { get; set; }
     public T Maximum { get; set; }
@@ -17,4 +19,9 @@
       if (maxProp != null) Maximum = maxProp.ToObject<T>();
     }
+
+    public IntervalRestrictedJsonItem() { }
+
+    [StorableConstructor]
+    protected IntervalRestrictedJsonItem(StorableConstructorFlag _) : base(_) { }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/IntervalRestrictedMatrixJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/IntervalRestrictedMatrixJsonItem.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/IntervalRestrictedMatrixJsonItem.cs	(revision 18055)
@@ -2,8 +2,10 @@
 using System.Collections.Generic;
 using Newtonsoft.Json.Linq;
+using HEAL.Attic;
 
 namespace HeuristicLab.JsonInterface {
+  [StorableType("4FEDB1E0-B4B7-4EAD-8D5E-B2AA13C37F40")]
   public abstract class IntervalRestrictedMatrixJsonItem<T> : MatrixJsonItem<T>, IIntervalRestrictedJsonItem<T>
-    where T : IComparable {
+      where T : IComparable {
     public T Minimum { get; set; }
     public T Maximum { get; set; }
@@ -33,4 +35,9 @@
       if (maxProp != null) Maximum = maxProp.ToObject<T>();
     }
+
+    public IntervalRestrictedMatrixJsonItem() { }
+
+    [StorableConstructor]
+    protected IntervalRestrictedMatrixJsonItem(StorableConstructorFlag _) : base(_) { }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/IntervalRestrictedValueJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/IntervalRestrictedValueJsonItem.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/IntervalRestrictedValueJsonItem.cs	(revision 18055)
@@ -1,8 +1,10 @@
 ﻿using System;
 using Newtonsoft.Json.Linq;
+using HEAL.Attic;
 
 namespace HeuristicLab.JsonInterface {
-  public abstract class IntervalRestrictedValueJsonItem<T> : ValueJsonItem<T>, IIntervalRestrictedJsonItem<T> // TODO: intervalrestriction before value?
-    where T : IComparable {
+  [StorableType("5BD32AD9-7CA2-4837-B1C3-D47D0CD83035")]
+  public abstract class IntervalRestrictedValueJsonItem<T> : ValueJsonItem<T>, IIntervalRestrictedJsonItem<T>
+      where T : IComparable {
     public T Minimum { get; set; }
     public T Maximum { get; set; }
@@ -23,4 +25,9 @@
       if (maxProp != null) Maximum = maxProp.ToObject<T>();
     }
+
+    public IntervalRestrictedValueJsonItem() { }
+
+    [StorableConstructor]
+    protected IntervalRestrictedValueJsonItem(StorableConstructorFlag _) : base(_) { }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/JsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/JsonItem.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/JsonItem.cs	(revision 18055)
@@ -6,4 +6,5 @@
 using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
+using HEAL.Attic;
 
 namespace HeuristicLab.JsonInterface {
@@ -32,4 +33,5 @@
   }
 
+  [StorableType("B1270D98-B0D9-40FB-B089-F6E70C65CD65")]
   /// <summary>
   /// Main data class for json interface.
@@ -38,5 +40,5 @@
 
     public class JsonItemValidator : IJsonItemValidator {
-      private IDictionary<int, bool> Cache = new Dictionary<int, bool>();
+      //private IDictionary<int, bool> Cache = new Dictionary<int, bool>();
       private JsonItem Root { get; set; }
       public JsonItemValidator(JsonItem root) {
@@ -47,7 +49,7 @@
         List<string> errors = new List<string>();
         bool success = true;
-        foreach(var x in Root) {
+        foreach (var x in Root) {
           JsonItem item = x as JsonItem;
-          if(item.Active) {
+          if (item.Active) {
             var res = ((JsonItem)x).Validate();
             //if one success is false -> whole validation is false
@@ -68,5 +70,5 @@
         IJsonItem tmp = Parent;
         StringBuilder builder = new StringBuilder(this.Name);
-        while(tmp != null) {
+        while (tmp != null) {
           builder.Insert(0, tmp.Name + ".");
           tmp = tmp.Parent;
@@ -86,4 +88,7 @@
 
     #region Constructors
+    [StorableConstructor]
+    protected JsonItem(StorableConstructorFlag _) { }
+
     public JsonItem() { }
 
@@ -92,7 +97,7 @@
     }
     #endregion
-    
+
     #region Public Methods
-    public void AddChildren(params IJsonItem[] childs) => 
+    public void AddChildren(params IJsonItem[] childs) =>
       AddChildren(childs as IEnumerable<IJsonItem>);
 
@@ -101,5 +106,5 @@
       if (Children == null)
         Children = new List<IJsonItem>();
-      if(Children is IList<IJsonItem> list) {
+      if (Children is IList<IJsonItem> list) {
         foreach (var child in childs) {
           list.Add(child);
@@ -131,5 +136,5 @@
     public virtual IEnumerator<IJsonItem> GetEnumerator() {
       yield return this;
-      
+
       if (Children != null) {
         foreach (var x in Children) {
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ListJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ListJsonItem.cs	(revision 18055)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ListJsonItem.cs	(revision 18055)
@@ -0,0 +1,37 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HEAL.Attic;
+using Newtonsoft.Json.Linq;
+
+namespace HeuristicLab.JsonInterface {
+  [StorableType("43E86513-0F25-4BA8-85B4-4FB50FF62FA8")]
+  public class ListJsonItem : ArrayJsonItem<IJsonItem>, IListJsonItem {
+
+    public string TargetTypeGUID { get; set; }
+
+    protected override ValidationResult Validate() {
+      var validationResults = Value.Select(x => x.GetValidator().Validate());
+      ValidationResult result = new ValidationResult(
+        validationResults.Any(x => !x.Success),
+        validationResults.SelectMany(x => x.Errors));
+      return result;
+    }
+
+    public override void SetJObject(JObject jObject) {
+      TargetTypeGUID = jObject[nameof(IListJsonItem.TargetTypeGUID)].ToString();
+      var targetType = Mapper.StaticCache.GetType(new Guid(TargetTypeGUID));
+      IList<IJsonItem> items = new List<IJsonItem>();
+      foreach (JObject obj in jObject[nameof(IValueJsonItem.Value)]) {
+        items.Add((IJsonItem)obj.ToObject(targetType));
+      }
+      Value = items.ToArray();
+      Resizable = (jObject[nameof(IArrayJsonItem.Resizable)]?.ToObject<bool>()).GetValueOrDefault();
+    }
+
+    public ListJsonItem() { }
+
+    [StorableConstructor]
+    protected ListJsonItem(StorableConstructorFlag _) : base(_) { }
+  }
+}
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/LookupJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/LookupJsonItem.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/LookupJsonItem.cs	(revision 18055)
@@ -1,5 +1,7 @@
 ﻿using Newtonsoft.Json.Linq;
+using HEAL.Attic;
 
 namespace HeuristicLab.JsonInterface {
+  [StorableType("DE16C5EB-998D-4D34-BD98-7BF0E02A56BC")]
   public class LookupJsonItem : JsonItem, ILookupJsonItem {
     public virtual string ActualName { get; set; }
@@ -11,4 +13,9 @@
 
     protected override ValidationResult Validate() => ValidationResult.Successful();
+
+    public LookupJsonItem() { }
+
+    [StorableConstructor]
+    protected LookupJsonItem(StorableConstructorFlag _) : base(_) { }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/MatrixJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/MatrixJsonItem.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/MatrixJsonItem.cs	(revision 18055)
@@ -1,6 +1,8 @@
 ﻿using System.Collections.Generic;
 using Newtonsoft.Json.Linq;
+using HEAL.Attic;
 
 namespace HeuristicLab.JsonInterface {
+  [StorableType("2DCBBBA5-B29F-4E97-A3BC-99F7C9E15759")]
   public abstract class MatrixJsonItem<T> : ValueJsonItem<T[][]>, IMatrixJsonItem {
     public virtual bool RowsResizable { get; set; }
@@ -26,4 +28,9 @@
       ColumnNames = jObject[nameof(IMatrixJsonItem.ColumnNames)]?.ToObject<IEnumerable<string>>();
     }
+
+    public MatrixJsonItem() { }
+
+    [StorableConstructor]
+    protected MatrixJsonItem(StorableConstructorFlag _) : base(_) { }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/RangedJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/RangedJsonItem.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/RangedJsonItem.cs	(revision 18055)
@@ -2,10 +2,12 @@
 using System.Collections.Generic;
 using Newtonsoft.Json.Linq;
+using HEAL.Attic;
 
 namespace HeuristicLab.JsonInterface {
+  [StorableType("856DE916-D830-43A8-9B40-37E512A177DB")]
   public abstract class RangedJsonItem<T> : IntervalRestrictedJsonItem<T>, IRangedJsonItem<T>
-    where T : IComparable {
+      where T : IComparable {
     public T MinValue { get; set; }
-    
+
     public T MaxValue { get; set; }
 
@@ -30,4 +32,9 @@
     }
 
+    public RangedJsonItem() { }
+
+    [StorableConstructor]
+    protected RangedJsonItem(StorableConstructorFlag _) : base(_) { }
+
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ResultJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ResultJsonItem.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ResultJsonItem.cs	(revision 18055)
@@ -1,6 +1,8 @@
 ﻿using System;
 using Newtonsoft.Json.Linq;
+using HEAL.Attic;
 
 namespace HeuristicLab.JsonInterface {
+  [StorableType("AA00656C-56D5-4F4E-9843-BA15636FC399")]
   public class ResultJsonItem : JsonItem, IResultJsonItem {
     public string ResultFormatterType { get; set; }
@@ -15,4 +17,9 @@
     }
 
+    public ResultJsonItem() { }
+
+    [StorableConstructor]
+    protected ResultJsonItem(StorableConstructorFlag _) : base(_) { }
+
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/StringJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/StringJsonItem.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/StringJsonItem.cs	(revision 18055)
@@ -1,4 +1,23 @@
-﻿namespace HeuristicLab.JsonInterface {
-  public class StringJsonItem : ConcreteRestrictedValueJsonItem<string> { }
-  public class StringArrayJsonItem : ConcreteRestrictedArrayJsonItem<string> { }
+﻿using HEAL.Attic;
+
+namespace HeuristicLab.JsonInterface {
+  [StorableType("81C18291-25B0-4B6C-8707-7B59125B7A93")]
+  public class StringJsonItem : ConcreteRestrictedValueJsonItem<string> {
+    public StringJsonItem() { }
+
+    [StorableConstructor]
+    protected StringJsonItem(StorableConstructorFlag _) : base(_) { }
+  }
+
+  [StorableType("6086E5FB-2DC2-4848-9388-0D957B887795")]
+  public class StringArrayJsonItem : ConcreteRestrictedArrayJsonItem<string> {
+    public StringArrayJsonItem() { }
+
+    [StorableConstructor]
+    protected StringArrayJsonItem(StorableConstructorFlag _) : base(_) { }
+  }
+  /*
+  public class StringArrayValueJsonItem : ArrayJsonItem<string> {
+    protected override ValidationResult Validate() => ValidationResult.Successful();
+  }*/
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/UnsupportedJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/UnsupportedJsonItem.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/UnsupportedJsonItem.cs	(revision 18055)
@@ -3,6 +3,8 @@
 using System.Linq;
 using Newtonsoft.Json;
+using HEAL.Attic;
 
 namespace HeuristicLab.JsonInterface {
+  [StorableType("0E2CA132-AA19-4FC7-B2FD-09572F2E0967")]
   public class UnsupportedJsonItem : JsonItem {
 
@@ -14,4 +16,9 @@
 
     protected override ValidationResult Validate() => ValidationResult.Successful();
+
+    public UnsupportedJsonItem() { }
+
+    [StorableConstructor]
+    protected UnsupportedJsonItem(StorableConstructorFlag _) : base(_) { }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ValueJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ValueJsonItem.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ValueJsonItem.cs	(revision 18055)
@@ -1,6 +1,8 @@
 ﻿using System;
 using Newtonsoft.Json.Linq;
+using HEAL.Attic;
 
 namespace HeuristicLab.JsonInterface {
+  [StorableType("29139288-7ABB-4391-926E-5975CF38141E")]
   public abstract class ValueJsonItem : JsonItem, IValueJsonItem {
     public object Value { get; set; }
@@ -10,6 +12,13 @@
     }
 
+    public ValueJsonItem() { }
+
+    [StorableConstructor]
+    protected ValueJsonItem(StorableConstructorFlag _) : base(_) {
+    }
+
   }
 
+  [StorableType("86085358-50D6-4486-9265-F6CEA8C8FA19")]
   public abstract class ValueJsonItem<T> : ValueJsonItem, IValueJsonItem<T> {
     public new T Value {
@@ -29,7 +38,12 @@
 
     public override void SetJObject(JObject jObject) {
-      if(jObject[nameof(IValueJsonItem<T>.Value)] != null)
+      if (jObject[nameof(IValueJsonItem<T>.Value)] != null)
         Value = jObject[nameof(IValueJsonItem<T>.Value)].ToObject<T>();
     }
+
+    public ValueJsonItem() { }
+
+    [StorableConstructor]
+    protected ValueJsonItem(StorableConstructorFlag _) : base(_) { }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ValueLookupJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ValueLookupJsonItem.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItems/ValueLookupJsonItem.cs	(revision 18055)
@@ -1,6 +1,8 @@
 ﻿using System.Collections.Generic;
 using Newtonsoft.Json.Linq;
+using HEAL.Attic;
 
 namespace HeuristicLab.JsonInterface {
+  [StorableType("D2521F37-3968-4FAC-AEE9-F083AA86C06C")]
   public class ValueLookupJsonItem : LookupJsonItem, IValueLookupJsonItem {
     public IJsonItem ActualValue { get; set; }
@@ -13,5 +15,5 @@
     public override JObject GenerateJObject() {
       var obj = base.GenerateJObject();
-      if(ActualValue != null) {
+      if (ActualValue != null) {
         obj.Add(nameof(IValueLookupJsonItem.ActualValue), ActualValue.Path);
       }
@@ -21,9 +23,9 @@
     public override IEnumerator<IJsonItem> GetEnumerator() {
       using (var it = base.GetEnumerator()) {
-        while(it.MoveNext()) {
+        while (it.MoveNext()) {
           yield return it.Current;
         }
       }
-      if(ActualValue != null) {
+      if (ActualValue != null) {
         using (var it = ActualValue.GetEnumerator()) {
           while (it.MoveNext()) {
@@ -33,4 +35,9 @@
       }
     }
+
+    public ValueLookupJsonItem() { }
+
+    [StorableConstructor]
+    protected ValueLookupJsonItem(StorableConstructorFlag _) : base(_) { }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateGenerator.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateGenerator.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateGenerator.cs	(revision 18055)
@@ -19,5 +19,5 @@
     /// <param name="optimizer">the optimizer object to serialize</param>
     /// <param name="rootItem">Root JsonItem for serialization, considers only active JsonItems for serialization</param>
-    public static void GenerateTemplate(string templatePath, IOptimizer optimizer, IJsonItem rootItem, IEnumerable<IResultCollectionProcessor> resultCollectionProcessors) {
+    public static void GenerateTemplate(string templatePath, IOptimizer optimizer, IJsonItem rootItem, IEnumerable<IRunCollectionModifier> runCollectionModifiers) {
       // clear all runs
       if (optimizer.ExecutionState == ExecutionState.Paused)
@@ -34,5 +34,5 @@
       JArray parameterItems = new JArray();
       JArray resultItems = new JArray();
-      JArray resultCollectionProcessorItems = new JArray();
+      JArray runCollectionModifierItems = new JArray();
       string templateName = Path.GetFileName(templatePath);
       string templateDirectory = Path.GetDirectoryName(templatePath);
@@ -60,6 +60,6 @@
       #endregion
 
-      #region ResultCollectionProcessor Serialization
-      foreach (var proc in resultCollectionProcessors) {
+      #region RunCollectionModifiers Serialization
+      foreach (var proc in runCollectionModifiers) {
         JArray rcpParameterItems = new JArray();
         var guid = StorableTypeAttribute.GetStorableTypeAttribute(proc.GetType()).Guid.ToString();
@@ -77,5 +77,5 @@
         processorObj.Add("GUID", guid);
         processorObj.Add(Constants.Parameters, rcpParameterItems);
-        resultCollectionProcessorItems.Add(processorObj);
+        runCollectionModifierItems.Add(processorObj);
       }
       #endregion
@@ -86,5 +86,5 @@
       template[Constants.Parameters] = parameterItems;
       template[Constants.Results] = resultItems;
-      template[Constants.ResultCollectionProcessorItems] = resultCollectionProcessorItems;
+      template[Constants.RunCollectionModifiers] = runCollectionModifierItems;
       #endregion
 
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateInstantiator.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateInstantiator.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateInstantiator.cs	(revision 18055)
@@ -14,16 +14,16 @@
       Optimizer = optimizer;
       ConfiguredResultItems = configuredResultItems;
-      PostProcessors = Enumerable.Empty<IResultCollectionProcessor>();
+      RunCollectionModifiers = Enumerable.Empty<IRunCollectionModifier>();
     }
 
-    public InstantiatorResult(IOptimizer optimizer, IEnumerable<IResultJsonItem> configuredResultItems, IEnumerable<IResultCollectionProcessor> postProcessors) {
+    public InstantiatorResult(IOptimizer optimizer, IEnumerable<IResultJsonItem> configuredResultItems, IEnumerable<IRunCollectionModifier> runCollectionModifiers) {
       Optimizer = optimizer;
       ConfiguredResultItems = configuredResultItems;
-      PostProcessors = postProcessors;
+      RunCollectionModifiers = runCollectionModifiers;
     }
 
     public IOptimizer Optimizer { get; }
     public IEnumerable<IResultJsonItem> ConfiguredResultItems { get; }
-    public IEnumerable<IResultCollectionProcessor> PostProcessors { get; }
+    public IEnumerable<IRunCollectionModifier> RunCollectionModifiers { get; }
   }
 
@@ -94,5 +94,5 @@
       JsonItemConverter.Inject(optimizer, rootItem);
 
-      return new InstantiatorResult(optimizer, CollectResults(), CollectResultCollectionProcessors());
+      return new InstantiatorResult(optimizer, CollectResults(), CollectRunCollectionModifiers());
     }
 
@@ -100,11 +100,11 @@
     /// Instantiates all defined (in template) ResultCollectionProcessors and injects the configured parameters.
     /// </summary>
-    private IEnumerable<IResultCollectionProcessor> CollectResultCollectionProcessors() {
-      IList<IResultCollectionProcessor> postProcessorList = new List<IResultCollectionProcessor>();
-      foreach (JObject obj in Template[Constants.ResultCollectionProcessorItems]) {
+    private IEnumerable<IRunCollectionModifier> CollectRunCollectionModifiers() {
+      IList<IRunCollectionModifier> runCollectionModifiers = new List<IRunCollectionModifier>();
+      foreach (JObject obj in Template[Constants.RunCollectionModifiers]) {
         var guid = obj["GUID"].ToString();
         var parameters = obj[Constants.Parameters];
         var type = Mapper.StaticCache.GetType(new Guid(guid));
-        var rcp = (IResultCollectionProcessor)Activator.CreateInstance(type);
+        var rcp = (IRunCollectionModifier)Activator.CreateInstance(type);
         var rcpItem = JsonItemConverter.Extract(rcp);
 
@@ -117,7 +117,7 @@
 
         JsonItemConverter.Inject(rcp, rcpItem);
-        postProcessorList.Add(rcp);
+        runCollectionModifiers.Add(rcp);
       }
-      return postProcessorList;
+      return runCollectionModifiers;
     }
 
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/ResultCollectionProcessors/AbstractProcessors/RunCollectionSRSolutionFormatter.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/ResultCollectionProcessors/AbstractProcessors/RunCollectionSRSolutionFormatter.cs	(revision 18055)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/ResultCollectionProcessors/AbstractProcessors/RunCollectionSRSolutionFormatter.cs	(revision 18055)
@@ -0,0 +1,71 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression;
+using HEAL.Attic;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Parameters;
+
+namespace HeuristicLab.JsonInterface {
+  [StorableType("806BB409-E50C-4827-ABEF-0376D65F7414")]
+  public abstract class RunCollectionSRSolutionFormatter : ParameterizedNamedItem, IRunCollectionModifier {
+
+    #region Constants
+    private const string SuffixParameterName = "Suffix";
+    #endregion
+
+    #region Parameter Properties
+    public IFixedValueParameter<StringValue> SuffixParameter =>
+      (IFixedValueParameter<StringValue>)Parameters[SuffixParameterName];
+    #endregion
+
+    #region Properties
+    public string Suffix {
+      get => SuffixParameter.Value.Value;
+      set => SuffixParameter.Value.Value = value;
+    }
+    protected abstract ISymbolicExpressionTreeStringFormatter Formatter { get; }
+    #endregion
+
+    #region Constructors & Cloning
+    [StorableConstructor]
+    protected RunCollectionSRSolutionFormatter(StorableConstructorFlag _) : base(_) { }
+    public RunCollectionSRSolutionFormatter() {
+      Parameters.Add(new FixedValueParameter<StringValue>(SuffixParameterName, "Appends a suffix to the original name.", new StringValue()));
+    }
+    public RunCollectionSRSolutionFormatter(RunCollectionSRSolutionFormatter original, Cloner cloner) : base(original, cloner) { }
+    #endregion
+
+    public void Apply(IObservableDictionary<string, IItem> results) {
+      var resultCopy = new ObservableDictionary<string, IItem>(results);
+      foreach (var kvp in resultCopy) {
+        if (kvp.Value is ISymbolicRegressionSolution sol) {
+          results.Add(
+            $"{kvp.Key} - {SuffixParameter.Value.Value}", 
+            new StringValue(Formatter.Format(sol.Model.SymbolicExpressionTree)));
+        }
+      }
+    }
+
+    public void Modify(List<IRun> runs) {
+      foreach(var run in runs) {
+        var resultCopy = new ObservableDictionary<string, IItem>(run.Results);
+        foreach (var kvp in resultCopy) {
+          if (kvp.Value is ISymbolicRegressionSolution sol) {
+            run.Results.Add(
+              $"{kvp.Key} - {SuffixParameter.Value.Value}",
+              new StringValue(Formatter.Format(sol.Model.SymbolicExpressionTree)));
+          }
+        }
+      }
+    }
+  }
+}
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/ResultCollectionProcessors/FilterResultCollectionProcessor.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/ResultCollectionProcessors/FilterResultCollectionProcessor.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/ResultCollectionProcessors/FilterResultCollectionProcessor.cs	(revision 18055)
@@ -12,9 +12,11 @@
 
 namespace HeuristicLab.JsonInterface {
+  /*
   [StorableType("4AF9EF94-2EF3-4F54-8B8D-942454CF8DDF")]
-  public class FilterResultCollectionProcessor : ParameterizedNamedItem, IResultCollectionProcessor {
+  public class FilterResultCollectionProcessor : ParameterizedNamedItem, IRunCollectionModifier {
 
     #region Constants
     private const string FilterStringParameterName = "Filters";
+    private const string Filter2StringParameterName = "Filters2";
     #endregion
 
@@ -22,4 +24,6 @@
     public IFixedValueParameter<StringValue> FilterStringParameter =>
       (IFixedValueParameter<StringValue>)Parameters[FilterStringParameterName];
+    public IFixedValueParameter<ItemList<StringValue>> Filter2StringParameter =>
+      (IFixedValueParameter<ItemList<StringValue>>)Parameters[Filter2StringParameterName];
     #endregion
 
@@ -29,4 +33,5 @@
     public FilterResultCollectionProcessor() {
       Parameters.Add(new FixedValueParameter<StringValue>(FilterStringParameterName, "", new StringValue()));
+      Parameters.Add(new FixedValueParameter<ItemList<StringValue>>(Filter2StringParameterName, "", new ItemList<StringValue>()));
     }
     public FilterResultCollectionProcessor(FilterResultCollectionProcessor original, Cloner cloner) : base(original, cloner) { }
@@ -39,11 +44,9 @@
       var filters = FilterStringParameter.Value.Value.Split(';');
       
-      
-      /*
-      foreach (var filter in FilterStringParameter.Value) {
-        if (results.ContainsKey(filter.Value))
-          results.Remove(filter.Value);
-      }*/
+      foreach (var filter in filters) {
+        if (results.ContainsKey(filter))
+          results.Remove(filter);
+      }
     }
-  }
+  }*/
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/ResultCollectionProcessors/RunCollectionSRSolutionGraphVizFormatter.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/ResultCollectionProcessors/RunCollectionSRSolutionGraphVizFormatter.cs	(revision 18055)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/ResultCollectionProcessors/RunCollectionSRSolutionGraphVizFormatter.cs	(revision 18055)
@@ -0,0 +1,25 @@
+﻿using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+
+namespace HeuristicLab.JsonInterface {
+  [Item(Name = "RunCollection SymbolicRegressionSolution GraphViz Formatter")]
+  [StorableType("55A9B87B-65AC-4160-ACA0-53FD1EBB1AB7")]
+  public class RunCollectionSRSolutionGraphVizFormatter : RunCollectionSRSolutionFormatter {
+    protected override ISymbolicExpressionTreeStringFormatter Formatter => 
+      new SymbolicDataAnalysisExpressionLatexFormatter();
+
+    #region Constructors & Cloning
+    [StorableConstructor]
+    protected RunCollectionSRSolutionGraphVizFormatter(StorableConstructorFlag _) : base(_) { }
+    public RunCollectionSRSolutionGraphVizFormatter() { Suffix = "GraphViz"; }
+    public RunCollectionSRSolutionGraphVizFormatter(RunCollectionSRSolutionGraphVizFormatter original, Cloner cloner) : base(original, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RunCollectionSRSolutionGraphVizFormatter(this, cloner);
+    }
+    #endregion
+  }
+}
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/ResultCollectionProcessors/RunCollectionSRSolutionLatexFormatter.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/ResultCollectionProcessors/RunCollectionSRSolutionLatexFormatter.cs	(revision 18055)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/ResultCollectionProcessors/RunCollectionSRSolutionLatexFormatter.cs	(revision 18055)
@@ -0,0 +1,25 @@
+﻿using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+
+namespace HeuristicLab.JsonInterface {
+  [Item(Name = "RunCollection SymbolicRegressionSolution Latex Formatter")]
+  [StorableType("89EDF59C-1CD6-4314-8504-EB3A28E6B1C3")]
+  public class RunCollectionSRSolutionLatexFormatter : RunCollectionSRSolutionFormatter {
+    protected override ISymbolicExpressionTreeStringFormatter Formatter =>
+      new SymbolicDataAnalysisExpressionLatexFormatter();
+
+    #region Constructors & Cloning
+    [StorableConstructor]
+    protected RunCollectionSRSolutionLatexFormatter(StorableConstructorFlag _) : base(_) { }
+    public RunCollectionSRSolutionLatexFormatter() { Suffix = "Latex"; }
+    public RunCollectionSRSolutionLatexFormatter(RunCollectionSRSolutionLatexFormatter original, Cloner cloner) : base(original, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RunCollectionSRSolutionLatexFormatter(this, cloner);
+    }
+    #endregion
+  }
+}
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/ResultCollectionProcessors/RunCollectionSRSolutionPythonFormatter.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/ResultCollectionProcessors/RunCollectionSRSolutionPythonFormatter.cs	(revision 18055)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/ResultCollectionProcessors/RunCollectionSRSolutionPythonFormatter.cs	(revision 18055)
@@ -0,0 +1,25 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HEAL.Attic;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.JsonInterface {
+  [Item(Name = "RunCollection SymbolicRegressionSolution Python Formatter")]
+  [StorableType("844F2887-B7A0-4BD4-89B8-F9155C65D214")]
+  public class RunCollectionSRSolutionPythonFormatter : RunCollectionSRSolutionFormatter {
+    protected override ISymbolicExpressionTreeStringFormatter Formatter =>
+      new SymbolicDataAnalysisExpressionPythonFormatter();
+
+    #region Constructors & Cloning
+    [StorableConstructor]
+    protected RunCollectionSRSolutionPythonFormatter(StorableConstructorFlag _) : base(_) { }
+    public RunCollectionSRSolutionPythonFormatter() { Suffix = "Python"; }
+    public RunCollectionSRSolutionPythonFormatter(RunCollectionSRSolutionPythonFormatter original, Cloner cloner) : base(original, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RunCollectionSRSolutionPythonFormatter(this, cloner);
+    }
+    #endregion
+  }
+}
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/ResultCollectionProcessors/SymRegPythonProcessor.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/ResultCollectionProcessors/SymRegPythonProcessor.cs	(revision 18054)
+++ 	(revision )
@@ -1,40 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using HeuristicLab.Collections;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Optimization;
-using HeuristicLab.Problems.DataAnalysis.Symbolic;
-using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression;
-using HEAL.Attic;
-using HeuristicLab.Data;
-
-namespace HeuristicLab.JsonInterface {
-  [StorableType("844F2887-B7A0-4BD4-89B8-F9155C65D214")]
-  public class SymRegPythonProcessor : ParameterizedNamedItem, IResultCollectionProcessor {
-
-    #region Constructors & Cloning
-    [StorableConstructor]
-    protected SymRegPythonProcessor(StorableConstructorFlag _) : base(_) { }
-    public SymRegPythonProcessor() { }
-    public SymRegPythonProcessor(SymRegPythonProcessor original, Cloner cloner) : base(original, cloner) { }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new SymRegPythonProcessor(this, cloner);
-    }
-    #endregion
-
-    public void Apply(IObservableDictionary<string, IItem> results) {
-      var formatter = new SymbolicDataAnalysisExpressionPythonFormatter();
-      var resultCopy = new ObservableDictionary<string, IItem>(results);
-      foreach (var kvp in resultCopy) {
-        if (kvp.Value is ISymbolicRegressionSolution sol) {
-          results.Add($"{kvp.Key} - Python" , new StringValue(formatter.Format(sol.Model.SymbolicExpressionTree)));
-        }
-      }
-    }
-  }
-}
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.Optimization/3.3/RunCollectionModification/RunCollectionValueRemover.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.Optimization/3.3/RunCollectionModification/RunCollectionValueRemover.cs	(revision 18054)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.Optimization/3.3/RunCollectionModification/RunCollectionValueRemover.cs	(revision 18055)
@@ -27,4 +27,5 @@
 using HeuristicLab.Parameters;
 using HEAL.Attic;
+using HeuristicLab.Collections;
 
 namespace HeuristicLab.Optimization {
@@ -38,7 +39,13 @@
     }
 
+    public IFixedValueParameter<BoolValue> InvertParameter {
+      get { return (IFixedValueParameter<BoolValue>)Parameters["Invert"]; }
+    }
+
     public IEnumerable<string> Values {
       get { return ValuesParameter.Value.CheckedItems.Select(v => v.Value); }
     }
+
+    public bool Invert => InvertParameter.Value.Value;
 
     #region Construction & Cloning    
@@ -49,5 +56,6 @@
     }
     public RunCollectionValueRemover() {
-      Parameters.Add(new ValueParameter<CheckedItemCollection<StringValue>>("Values", "The result or parameter values to be removed from each run."));      
+      Parameters.Add(new ValueParameter<CheckedItemCollection<StringValue>>("Values", "The result or parameter values to be removed from each run."));
+      Parameters.Add(new FixedValueParameter<BoolValue>("Invert", "Inverts the filter strategy: Blackbox <-> Whitebox (Default: Blackbox)", new BoolValue(false)));
     }
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -56,11 +64,22 @@
     #endregion    
 
-    public void Modify(List<IRun> runs) {      
+    public void Modify(List<IRun> runs) {
       foreach (var run in runs) {
-        foreach (var value in Values) {
-          run.Parameters.Remove(value);
-          run.Results.Remove(value);
-        }        
-      }      
+        if (Invert) { //Whitebox
+          var parametersCopy = new ObservableDictionary<string, IItem>(run.Parameters);
+          var resultsCopy = new ObservableDictionary<string, IItem>(run.Results);
+          foreach(var param in parametersCopy)
+            if (!Values.Any(x => x == param.Key))
+              run.Parameters.Remove(param.Key);
+          foreach (var result in resultsCopy)
+            if (!Values.Any(x => x == result.Key))
+              run.Results.Remove(result.Key);
+        } else { //Blackbox
+          foreach (var value in Values) {
+            run.Parameters.Remove(value);
+            run.Results.Remove(value);
+          }
+        }
+      }   
     }
     
