Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/BaseConverter.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/BaseConverter.cs	(revision 17408)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/BaseConverter.cs	(revision 17410)
@@ -34,6 +34,11 @@
       TypeCode typeCode = Type.GetTypeCode(t);
 
+
       if (t.IsEqualTo(typeof(PercentValue)))
         return 1.0d;
+
+      if(t == typeof(IntValue)) {
+        return int.MaxValue;
+      }
 
       switch (typeCode) {
@@ -59,4 +64,8 @@
         return 0.0d;
 
+      if (t == typeof(IntValue)) {
+        return int.MinValue;
+      }
+
       switch (typeCode) {
         case TypeCode.Int16: return short.MinValue;
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ConstrainedValueParameterConverter.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ConstrainedValueParameterConverter.cs	(revision 17408)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ConstrainedValueParameterConverter.cs	(revision 17410)
@@ -13,11 +13,12 @@
 
     public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) {
+      StringJsonItem cdata = data as StringJsonItem;
       IParameter parameter = item as IParameter;
       foreach (var x in GetValidValues(parameter))
-        if(x.ToString() == CastValue<string>(data.Value))
+        if(x.ToString() == CastValue<string>(cdata.Value))
           parameter.ActualValue = x;
 
-      if (parameter.ActualValue is IParameterizedItem && data.Children != null) {
-        foreach(var param in data.Children) {
+      if (parameter.ActualValue is IParameterizedItem && cdata.Children != null) {
+        foreach(var param in cdata.Children) {
           if(param.Name == parameter.ActualValue.ItemName)
             root.Inject(parameter.ActualValue, param, root);
@@ -29,5 +30,5 @@
       IParameter parameter = value as IParameter;
 
-      IJsonItem item = new JsonItem() {
+      IJsonItem item = new StringJsonItem() {
         Name = parameter.Name,
         Value = parameter.ActualValue?.ToString(),
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/EnumTypeConverter.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/EnumTypeConverter.cs	(revision 17408)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/EnumTypeConverter.cs	(revision 17410)
@@ -15,10 +15,10 @@
       ((dynamic)item).Value = Enum.Parse(
         item.GetType().GenericTypeArguments.First(), 
-        CastValue<string>(data.Value));
+        ((StringJsonItem)data).Value);
     
     public override IJsonItem Extract(IItem value, IJsonItemConverter root) {
       object val = ((dynamic)value).Value;
       Type enumType = val.GetType();
-      return new JsonItem() { 
+      return new StringJsonItem() { 
         Name = value.ItemName,
         Value = Enum.GetName(enumType, val),
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/MultiCheckedOperatorConverter.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/MultiCheckedOperatorConverter.cs	(revision 17408)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/MultiCheckedOperatorConverter.cs	(revision 17410)
@@ -24,8 +24,8 @@
       dynamic val = value as dynamic;
       foreach (var op in val.Operators) {
-        item.AddChilds(new JsonItem() {
+        item.AddChilds(new BoolJsonItem() {
           Name = op.Name,
           Value = val.Operators.ItemChecked(op),
-          Range = new object[] { false, true }
+          Range = new bool[] { false, true }
         });
       }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ParameterizedItemConverter.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ParameterizedItemConverter.cs	(revision 17408)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ParameterizedItemConverter.cs	(revision 17410)
@@ -16,5 +16,5 @@
       if(data.Children != null) {
         foreach (var sp in data.Children)
-          if (pItem.Parameters.TryGetValue(sp.Name, out IParameter param))
+          if (pItem.Parameters.TryGetValue(sp.Name, out IParameter param) && param != null)
             root.Inject(param, sp, root);
       }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/StringValueConverter.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/StringValueConverter.cs	(revision 17408)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/StringValueConverter.cs	(revision 17410)
@@ -13,8 +13,8 @@
 
     public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) =>
-      ((StringValue)item).Value = CastValue<string>(data.Value);
+      ((StringValue)item).Value = ((StringJsonItem)data).Value;
 
     public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
-      new JsonItem() {
+      new StringJsonItem() {
         Name = value.ItemName,
         Value = ((StringValue)value).Value
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueParameterConverter.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueParameterConverter.cs	(revision 17408)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueParameterConverter.cs	(revision 17410)
@@ -31,5 +31,6 @@
           if (tmp.Name == "[OverridableParamName]") {
             tmp.Name = parameter.Name;
-            JsonItem.Merge(item as JsonItem, tmp as JsonItem);
+            item = tmp;
+            //JsonItem.Merge(item as JsonItem, tmp as JsonItem);
           } else
             item.AddChilds(tmp);
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueRangeConverter.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueRangeConverter.cs	(revision 17408)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueRangeConverter.cs	(revision 17410)
@@ -11,37 +11,44 @@
 namespace HeuristicLab.JsonInterface {
 
-  public class IntRangeConverter : ValueRangeConverter<IntRange, IntValue, int> {
+  public class IntRangeConverter : BaseConverter {
     public override int Priority => 1;
     public override Type ConvertableType => typeof(IntRange);
-  }
-  public class DoubleRangeConverter : ValueRangeConverter<DoubleRange, DoubleValue, double> {
-    public override int Priority => 1;
-    public override Type ConvertableType => typeof(DoubleRange);
-  }
-
-  public abstract class ValueRangeConverter<RangeType, T, TType> : BaseConverter 
-    where RangeType : StringConvertibleValueTuple<T, T>
-    where T : ValueTypeValue<TType>, IDeepCloneable, IStringConvertibleValue
-    where TType : struct {
-
-    private const BindingFlags Flags = BindingFlags.NonPublic | BindingFlags.Instance;
 
     public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) {
-      object[] arr = (object[])data.Value;
-      Tuple<T,T> tuple = new Tuple<T,T>(Instantiate<T>(arr[0]), Instantiate<T>(arr[1]));
-      var field = item.GetType().GetField("values", Flags);
-      field.SetValue(tuple, item);
+      IntRange range = item as IntRange;
+      IntArrayJsonItem cdata = data as IntArrayJsonItem;
+      range.Start = cdata.Value[0];
+      range.End = cdata.Value[1];
     }
 
     public override IJsonItem Extract(IItem value, IJsonItemConverter root) {
-      var field = value.GetType().GetField("values", Flags);
-      Tuple<T, T> tuple = (Tuple<T, T>)field.GetValue(value);
-      return new JsonItem() {
+      IntRange range = value as IntRange;
+      return new IntArrayJsonItem() {
         Name = "[OverridableParamName]",
-        Value = new object[] { tuple.Item1.Value, tuple.Item2.Value },
-        Range = new object[] { GetMinValue(typeof(TType)), GetMaxValue(typeof(TType)) }
+        Value = new int[] { range.Start, range.End },
+        Range = new int[] { int.MinValue, int.MaxValue }
       };
     }
-      
+  }
+
+  public class DoubleRangeConverter : BaseConverter {
+    public override int Priority => 1;
+    public override Type ConvertableType => typeof(DoubleRange);
+
+    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) {
+      DoubleRange range = item as DoubleRange;
+      DoubleArrayJsonItem cdata = data as DoubleArrayJsonItem;
+      range.Start = cdata.Value[0];
+      range.End = cdata.Value[1];
+    }
+
+    public override IJsonItem Extract(IItem value, IJsonItemConverter root) {
+      DoubleRange range = value as DoubleRange;
+      return new DoubleArrayJsonItem() {
+        Name = "[OverridableParamName]",
+        Value = new double[] { range.Start, range.End },
+        Range = new double[] { double.MinValue, double.MaxValue }
+      };
+    }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeValueConverter.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeValueConverter.cs	(revision 17408)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeValueConverter.cs	(revision 17410)
@@ -9,41 +9,76 @@
 namespace HeuristicLab.JsonInterface {
 
-  public class IntValueConverter : ValueTypeValueConverter<IntValue, int> {
+  public class IntValueConverter : BaseConverter {
     public override int Priority => 1;
     public override Type ConvertableType => typeof(IntValue);
+
+    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) =>
+      ((IntValue)item).Value = ((IntJsonItem)data).Value;
+
+    public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
+      new IntJsonItem() {
+        Name = "[OverridableParamName]",
+        Value = ((IntValue)value).Value,
+        Range = new int[] { int.MinValue, int.MaxValue }
+      };
   }
 
-  public class DoubleValueConverter : ValueTypeValueConverter<DoubleValue, double> {
+  public class DoubleValueConverter : BaseConverter {
     public override int Priority => 1;
     public override Type ConvertableType => typeof(DoubleValue);
+
+    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) =>
+      ((DoubleValue)item).Value = ((DoubleJsonItem)data).Value;
+
+    public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
+      new DoubleJsonItem() {
+        Name = "[OverridableParamName]",
+        Value = ((DoubleValue)value).Value,
+        Range = new double[] { double.MinValue, double.MaxValue }
+      };
   }
 
-  public class PercentValueConverter : ValueTypeValueConverter<PercentValue, double> {
+  public class PercentValueConverter : BaseConverter {
     public override int Priority => 2;
     public override Type ConvertableType => typeof(PercentValue);
+
+    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) =>
+      ((PercentValue)item).Value = ((DoubleJsonItem)data).Value;
+
+    public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
+      new DoubleJsonItem() {
+        Name = "[OverridableParamName]",
+        Value = ((PercentValue)value).Value,
+        Range = new double[] { double.MinValue, double.MaxValue }
+      };
   }
 
-  public class BoolValueConverter : ValueTypeValueConverter<BoolValue, bool> {
+  public class BoolValueConverter : BaseConverter {
     public override int Priority => 1;
     public override Type ConvertableType => typeof(BoolValue);
+
+    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) =>
+      ((BoolValue)item).Value = ((BoolJsonItem)data).Value;
+
+    public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
+      new BoolJsonItem() {
+        Name = "[OverridableParamName]",
+        Value = ((BoolValue)value).Value,
+        Range = new bool[] { false, true }
+      };
   }
 
-  public class DateTimeValueConverter : ValueTypeValueConverter<DateTimeValue, DateTime> {
+  public class DateTimeValueConverter : BaseConverter {
     public override int Priority => 1;
     public override Type ConvertableType => typeof(DateTimeValue);
-  }
-
-  public abstract class ValueTypeValueConverter<ValueType, T> : BaseConverter
-    where ValueType : ValueTypeValue<T>
-    where T : struct {
 
     public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) =>
-      ((ValueType)item).Value = CastValue<T>(data.Value);
+      ((DateTimeValue)item).Value = ((DateTimeJsonItem)data).Value;
 
     public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
-      new JsonItem() {
+      new DateTimeJsonItem() {
         Name = "[OverridableParamName]",
-        Value = ((ValueType)value).Value,
-        Range = new object[] { GetMinValue(typeof(T)), GetMaxValue(typeof(T)) }
+        Value = ((DateTimeValue)value).Value,
+        Range = new DateTime[] { DateTime.MinValue, DateTime.MaxValue }
       };
   }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/HeuristicLab.JsonInterface.csproj
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/HeuristicLab.JsonInterface.csproj	(revision 17408)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/HeuristicLab.JsonInterface.csproj	(revision 17410)
@@ -68,5 +68,7 @@
     <Compile Include="Interfaces\IJsonItem.cs" />
     <Compile Include="Interfaces\IJsonItemValidator.cs" />
+    <Compile Include="Models\GenericJsonItem.cs" />
     <Compile Include="Models\JsonItem.cs" />
+    <Compile Include="Models\JsonItems.cs" />
     <Compile Include="Models\ResultItem.cs" />
     <Compile Include="Models\UnsupportedJsonItem.cs" />
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JCGenerator.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JCGenerator.cs	(revision 17408)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JCGenerator.cs	(revision 17410)
@@ -15,5 +15,5 @@
   /// </summary>
   public class JCGenerator {
-    private JObject Template { get; set; }
+    private JObject Template { get; set; } = JObject.Parse(Constants.Template);
     private JArray JArrayItems { get; set; }
     private IList<IJsonItem> JsonItems { get; set; }
@@ -24,4 +24,5 @@
       // data container
       JArrayItems = new JArray();
+      JArray ResultItems = new JArray();
       JsonItems = new List<IJsonItem>();
 
@@ -35,5 +36,14 @@
       AddIItem(optimizer);
       // save the JArray with JsonItems (= IParameterizedItems)
+
+      JArrayItems = new JArray();
+      foreach (var item in JsonItems) {
+        if (item is ResultItem)
+          ResultItems.Add(Serialize(item));
+        else
+          JArrayItems.Add(Serialize(item));
+      }
       Template[Constants.Parameters] = JArrayItems;
+      Template[Constants.ActivatedResults] = ResultItems;
       // serialize template and return string
       return SingleLineArrayJsonWriter.Serialize(Template);
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItemConverter.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItemConverter.cs	(revision 17408)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItemConverter.cs	(revision 17410)
@@ -52,5 +52,5 @@
     
     public void Inject(IItem item, IJsonItem data, IJsonItemConverter root) {
-      if(!Cache.ContainsKey(item.GetHashCode())) {
+      if(item != null && !Cache.ContainsKey(item.GetHashCode())) {
         IJsonItemConverter converter = GetConverter(item.GetType());
         if(converter != null) converter.Inject(item, data, root);
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateInstantiator.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateInstantiator.cs	(revision 17408)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateInstantiator.cs	(revision 17410)
@@ -22,4 +22,5 @@
       public JArray Config { get; set; }
       public IDictionary<string, IJsonItem> Objects { get; set; }
+      public IOptimizer Optimizer { get; set; }
     }
 
@@ -47,4 +48,5 @@
       ProtoBufSerializer serializer = new ProtoBufSerializer();
       IOptimizer optimizer = (IOptimizer)serializer.Deserialize(hLFileLocation);
+      instData.Optimizer = optimizer;
 
       // collect all parameterizedItems from template
@@ -65,5 +67,40 @@
 
     #region Helper
+
+    private static object GetValueFromJObject(JObject obj) {
+      object val = obj[nameof(IJsonItem.Value)]?.ToObject<object>();
+      if (val is JContainer jContainer) // for resolving array values
+        val = jContainer.ToObject<object[]>();
+
+      return val;
+    }
+
     private static void CollectParameterizedItems(InstData instData) {
+      //JCGenerator generator = new JCGenerator();
+      //IEnumerable<IJsonItem> items = generator.FetchJsonItems(instData.Optimizer);
+      IJsonItem root = JsonItemConverter.Extract(instData.Optimizer);
+      instData.Objects.Add(root.Path, root);
+
+      foreach (JObject obj in instData.Template[Constants.Parameters]) {
+        string[] pathParts = obj.Property("Path").Value.ToString().Split('.');
+        IJsonItem tmp = root;
+        IJsonItem old = null;
+        for(int i = 1; i < pathParts.Length; ++i) {
+          foreach(var c in tmp.Children) {
+            if (c.Name == pathParts[i])
+              tmp = c;
+          }
+          if (old == tmp)
+            throw new Exception($"Invalid path '{string.Join(".", pathParts)}'");
+          else old = tmp;
+        }
+        tmp.Value = GetValueFromJObject(obj);
+        tmp.Range = obj[nameof(IJsonItem.Range)]?.ToObject<object[]>();
+        tmp.ActualName = obj[nameof(IJsonItem.ActualName)]?.ToString();
+        instData.Objects.Add(tmp.Path, tmp);
+      }
+
+
+      /*
       foreach (JObject item in instData.Template[Constants.Parameters]) {
         string[] pathParts = item.Property("Path").Value.ToString().Split('.');
@@ -89,5 +126,5 @@
         parent.AddChilds(data);
         instData.Objects.Add(data.Path, data);
-      }
+      }*/
     }
     
@@ -95,12 +132,13 @@
       foreach (JObject obj in instData.Config) {
         // build item from config object
-        IJsonItem item = JsonItem.BuildJsonItem(obj);
+        //IJsonItem item = JsonItem.BuildJsonItem(obj);
+        string path = obj.Property("Path").Value.ToString();
         // override default value
-        if (instData.Objects.TryGetValue(item.Path, out IJsonItem param)) {
-          param.Value = item.Value;
+        if (instData.Objects.TryGetValue(path, out IJsonItem param)) {
+          param.Value = GetValueFromJObject(obj);
           // override ActualName (for LookupParameters)
           if (param.ActualName != null)
-            param.ActualName = item.ActualName;
-        } else throw new InvalidDataException($"No parameter with path='{item.Path}' defined!");
+            param.ActualName = obj[nameof(IJsonItem.ActualName)]?.ToString();
+        } else throw new InvalidDataException($"No parameter with path='{path}' defined!");
       }
     }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/GenericJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/GenericJsonItem.cs	(revision 17410)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/GenericJsonItem.cs	(revision 17410)
@@ -0,0 +1,22 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.JsonInterface {
+
+  public class JsonItem<T> : JsonItem<T,T> { }
+
+  public class JsonItem<V,R> : JsonItem {
+    public new V Value {
+      get => (V)Convert.ChangeType(base.Value, typeof(V));
+      set => base.Value = value;
+    }
+
+    public new IEnumerable<R> Range {
+      get => base.Range.Cast<R>();
+      set => base.Range = value.Cast<object>();
+    }
+  }
+}
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/JsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/JsonItem.cs	(revision 17408)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/JsonItem.cs	(revision 17410)
@@ -152,19 +152,4 @@
     }
     #endregion
-
-    #region BuildJsonItemMethods
-    public static IJsonItem BuildJsonItem(JObject obj) {
-      object val = obj[nameof(Value)]?.ToObject<object>();
-      if (val is JContainer jContainer) // for resolving array values
-        val = jContainer.ToObject<object[]>();
-        
-      return new JsonItem() {
-        Name = obj[nameof(Name)]?.ToString(),
-        Value = val,
-        Range = obj[nameof(Range)]?.ToObject<object[]>(),
-        ActualName = obj[nameof(ActualName)]?.ToString()
-      };
-    }
-    #endregion
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/JsonItems.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/JsonItems.cs	(revision 17410)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/JsonItems.cs	(revision 17410)
@@ -0,0 +1,19 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.JsonInterface {
+  public class IntJsonItem : JsonItem<int> {}
+  public class IntArrayJsonItem: JsonItem<int[], int> {}
+
+  public class DoubleJsonItem: JsonItem<double> {}
+  public class DoubleArrayJsonItem: JsonItem<double[], double> {}
+
+  public class BoolJsonItem: JsonItem<bool> {}
+
+  public class StringJsonItem: JsonItem<string> {}
+
+  public class DateTimeJsonItem: JsonItem<DateTime> {}
+}
