Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.App/Runner.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.App/Runner.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.App/Runner.cs	(revision 17394)
@@ -11,5 +11,5 @@
   internal static class Runner {
     internal static void Run(string template, string config, string outputFile = @"C:\Workspace\test.txt") {
-      IAlgorithm alg = JCInstantiator.Instantiate(template, config);
+      IAlgorithm alg = JsonTemplateInstantiator.Instantiate(template, config);
   
       Task task = alg.StartAsync();
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/FileManager.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/FileManager.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/FileManager.cs	(revision 17394)
@@ -63,5 +63,5 @@
       if (openFileDialog.ShowDialog() == DialogResult.OK) {
         try {
-          var content = JCInstantiator.Instantiate(openFileDialog.FileName);
+          var content = JsonTemplateInstantiator.Instantiate(openFileDialog.FileName);
           IView view = MainFormManager.MainForm.ShowContent(content);
           if (view == null)
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/BaseConverter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/BaseConverter.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/BaseConverter.cs	(revision 17394)
@@ -11,23 +11,27 @@
   public abstract class BaseConverter : IJsonItemConverter
   {
-    public void Inject(IItem item, JsonItem data) {
-      InjectData(item, data);
+    public abstract int Priority { get; }
+    public abstract Type ConvertableType { get; }
+
+    public void Inject(IItem item, JsonItem data, IJsonItemConverter root) {
+
+      InjectData(item, data, root);
     }
 
-    public JsonItem Extract(IItem value) {
-      JsonItem data = ExtractData(value);
-      data.Name = string.IsNullOrEmpty(data.Name) ? value.ItemName : data.Name;
+    public JsonItem Extract(IItem value, IJsonItemConverter root) {
+      JsonItem data = new JsonItem() { Name = value.ItemName };
+      Populate(value, data, root);
       return data;
     }
     
-    public abstract void InjectData(IItem item, JsonItem data);
-    public abstract JsonItem ExtractData(IItem value);
+    public abstract void InjectData(IItem item, JsonItem data, IJsonItemConverter root);
+    public abstract void Populate(IItem value, JsonItem item, IJsonItemConverter root);
 
     #region Helper
     protected ValueType CastValue<ValueType>(object obj) {
       if (obj is JToken)
-        return obj.Cast<JToken>().ToObject<ValueType>();
+        return ((JToken)obj).ToObject<ValueType>();
       else if (obj is IConvertible)
-        return Convert.ChangeType(obj, typeof(ValueType)).Cast<ValueType>();
+        return (ValueType)Convert.ChangeType(obj, typeof(ValueType));
       else return (ValueType)obj;
     }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ConstrainedValueParameterConverter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ConstrainedValueParameterConverter.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ConstrainedValueParameterConverter.cs	(revision 17394)
@@ -9,5 +9,8 @@
 namespace HeuristicLab.JsonInterface {
   public class ConstrainedValueParameterConverter : ParameterBaseConverter {
-    public override void InjectData(IParameter parameter, JsonItem data) {
+    public override int Priority => 3;
+    public override Type ConvertableType => typeof(IConstrainedValueParameter<>);
+
+    public override void InjectData(IParameter parameter, JsonItem data, IJsonItemConverter root) {
       foreach(var x in GetValidValues(parameter))
         if(x.ToString() == CastValue<string>(data.Value))
@@ -17,21 +20,20 @@
         foreach(var param in data.Children) {
           if(param.Name == parameter.ActualValue.ItemName)
-            JsonItemConverter.Inject(parameter.ActualValue, param);
+            root.Inject(parameter.ActualValue, param, root);
         }
       }
     }
 
-    public override JsonItem ExtractData(IParameter value) =>
-      new JsonItem() {
-        Name = value.Name,
-        Value = value.ActualValue?.ToString(),
-        Range = GetValidValues(value).Select(x => x.ToString()),
-        Children = GetParameterizedChilds(value)
-      };
+    public override void Populate(IParameter value, JsonItem item, IJsonItemConverter root) {
+      item.AddChilds(GetParameterizedChilds(value));
+      item.Name = value.Name;
+      item.Value = value.ActualValue?.ToString();
+      item.Range = GetValidValues(value).Select(x => x.ToString());
+    }      
 
     #region Helper
     private IItem[] GetValidValues(IParameter value) {
       List<IItem> list = new List<IItem>();
-      var values = value.Cast<dynamic>().ValidValues;
+      var values = ((dynamic)value).ValidValues;
       foreach (var x in values) list.Add((IItem)x);
       return list.ToArray();
@@ -40,5 +42,5 @@
     private IList<JsonItem> GetParameterizedChilds(IParameter value) {
       List<JsonItem> list = new List<JsonItem>();
-      var values = value.Cast<dynamic>().ValidValues;
+      var values = ((dynamic)value).ValidValues;
       foreach(var x in values) {
         if (x is IParameterizedItem) {
Index: anches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/DummyConverter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/DummyConverter.cs	(revision 17393)
+++ 	(revision )
@@ -1,19 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.JsonInterface {
-  public class DummyConverter : BaseConverter {
-    public override void InjectData(IItem item, JsonItem data) {
-      // do nothing because the instance already exists and 
-      // there are no values to inject
-    }
-
-    public override JsonItem ExtractData(IItem value) => 
-      new JsonItem() { Value = value.GetType().GetPrettyName(false) };
-  }
-}
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/EnumTypeConverter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/EnumTypeConverter.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/EnumTypeConverter.cs	(revision 17394)
@@ -9,16 +9,17 @@
 namespace HeuristicLab.JsonInterface {
   public class EnumTypeConverter : BaseConverter {
-    public override void InjectData(IItem item, JsonItem data) =>
-      item.Cast<dynamic>().Value = Enum.Parse(
+    public override int Priority => 1;
+    public override Type ConvertableType => typeof(EnumValue<>);
+
+    public override void InjectData(IItem item, JsonItem data, IJsonItemConverter root) =>
+      ((dynamic)item).Value = Enum.Parse(
         item.GetType().GenericTypeArguments.First(), 
         CastValue<string>(data.Value));
 
-    public override JsonItem ExtractData(IItem value) {
-      JsonItem data = new JsonItem();
+    public override void Populate(IItem value, JsonItem item, IJsonItemConverter root) {
       object val = ((dynamic)value).Value;
       Type enumType = val.GetType();
-      data.Value = Enum.GetName(enumType, val);
-      data.Range = Enum.GetNames(enumType);
-      return data;
+      item.Value = Enum.GetName(enumType, val);
+      item.Range = Enum.GetNames(enumType);
     }
   }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/LookupParameterConverter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/LookupParameterConverter.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/LookupParameterConverter.cs	(revision 17394)
@@ -8,12 +8,14 @@
 namespace HeuristicLab.JsonInterface {
   public class LookupParameterConverter : ParameterBaseConverter {
-    public override JsonItem ExtractData(IParameter value) => 
-      new JsonItem() { 
-        Name = value.Name,
-        ActualName = value.Cast<ILookupParameter>().ActualName
-      };
+    public override int Priority => 3;
+    public override Type ConvertableType => typeof(ILookupParameter);
 
-    public override void InjectData(IParameter parameter, JsonItem data) =>
-      parameter.Cast<ILookupParameter>().ActualName = data.ActualName.Cast<string>();
+    public override void Populate(IParameter value, JsonItem item, IJsonItemConverter root) {
+      item.Name = value.Name;
+      item.ActualName = ((ILookupParameter)value).ActualName;
+    } 
+
+    public override void InjectData(IParameter parameter, JsonItem data, IJsonItemConverter root) =>
+      ((ILookupParameter)parameter).ActualName = data.ActualName as string;
   }
 }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/MultiCheckedOperatorConverter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/MultiCheckedOperatorConverter.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/MultiCheckedOperatorConverter.cs	(revision 17394)
@@ -9,12 +9,13 @@
 namespace HeuristicLab.JsonInterface {
   public class MultiCheckedOperatorConverter : ParameterizedItemConverter {
-    public override JsonItem ExtractData(IItem value) {
-      JsonItem data = base.ExtractData(value);
+    public override int Priority => 3;
+    public override Type ConvertableType => typeof(ICheckedMultiOperator<>);
 
-      if(data.Children == null)
-        data.Children = new List<JsonItem>();
-      dynamic val = value.Cast<dynamic>();
+    public override void Populate(IItem value, JsonItem item, IJsonItemConverter root) {
+      base.Populate(value, item, root);
+
+      dynamic val = value as dynamic;
       foreach (var op in val.Operators) {
-        data.Children.Add(new JsonItem() {
+        item.AddChilds(new JsonItem() {
           Name = op.Name,
           Value = val.Operators.ItemChecked(op),
@@ -22,11 +23,10 @@
         });
       }
-      return data;
     }
 
-    public override void InjectData(IItem item, JsonItem data) {
-      base.InjectData(item, data);
+    public override void InjectData(IItem item, JsonItem data, IJsonItemConverter root) {
+      base.InjectData(item, data, root);
 
-      dynamic val = item.Cast<dynamic>();
+      dynamic val = item as dynamic;
       foreach (var op in val.Operators)
         val.Operators.SetItemCheckedState(op, GetOperatorState(op.Name, data));
@@ -35,5 +35,5 @@
     private bool GetOperatorState(string name, JsonItem data) {
       foreach(var op in data.Children) {
-        if (op.Name == name && op.Value is bool) return op.Value.Cast<bool>();
+        if (op.Name == name && op.Value is bool) return (bool)op.Value;
       }
       return false;
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ParameterBaseConverter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ParameterBaseConverter.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ParameterBaseConverter.cs	(revision 17394)
@@ -8,12 +8,13 @@
 namespace HeuristicLab.JsonInterface {
   public abstract class ParameterBaseConverter : BaseConverter {
-    public override JsonItem ExtractData(IItem value) => 
-      ExtractData(value.Cast<IParameter>());
+    public override void Populate(IItem value, JsonItem item, IJsonItemConverter root) => 
+      Populate(value as IParameter, item, root);
 
-    public abstract JsonItem ExtractData(IParameter value);
+    public abstract void Populate(IParameter value, JsonItem item, IJsonItemConverter root);
 
-    public override void InjectData(IItem item, JsonItem data) => InjectData(item.Cast<IParameter>(), data);
+    public override void InjectData(IItem item, JsonItem data, IJsonItemConverter root) => 
+      InjectData(item as IParameter, data, root);
 
-    public abstract void InjectData(IParameter parameter, JsonItem data);
+    public abstract void InjectData(IParameter parameter, JsonItem data, IJsonItemConverter root);
   }
 }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ParameterizedItemConverter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ParameterizedItemConverter.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ParameterizedItemConverter.cs	(revision 17394)
@@ -8,29 +8,24 @@
 namespace HeuristicLab.JsonInterface {
   public class ParameterizedItemConverter : BaseConverter {
-    public override void InjectData(IItem item, JsonItem data) {
-      IParameterizedItem pItem = item.Cast<IParameterizedItem>();
+    public override int Priority => 2;
+    public override Type ConvertableType => typeof(IParameterizedItem);
+
+    public override void InjectData(IItem item, JsonItem data, IJsonItemConverter root) {
+      IParameterizedItem pItem = item as IParameterizedItem;
 
       if(data.Children != null) {
         foreach (var sp in data.Children)
           if (pItem.Parameters.TryGetValue(sp.Name, out IParameter param))
-            JsonItemConverter.Inject(param, sp);
+            root.Inject(param, sp, root);
       }
     }
 
-    public override JsonItem ExtractData(IItem value) {
-      JsonItem item = new JsonItem();
+    public override void Populate(IItem value, JsonItem item, IJsonItemConverter root) {
       var parameterizedItem = value as IParameterizedItem;
 
       foreach (var param in parameterizedItem.Parameters) {
-        if(!param.Hidden) {
-          JsonItem data = JsonItemConverter.Extract(param);
-          //data.Name = param.Name;
-
-          if (item.Children == null)
-            item.Children = new List<JsonItem>();
-          item.Children.Add(data);
-        }
+        if(!param.Hidden)
+          item.AddChilds(root.Extract(param, root));
       }
-      return item;
     }
   }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/RegressionProblemDataConverter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/RegressionProblemDataConverter.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/RegressionProblemDataConverter.cs	(revision 17394)
@@ -11,10 +11,8 @@
   public class RegressionProblemDataConverter : BaseConverter {
     private const BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
-    public override JsonItem ExtractData(IItem value) {
-      JsonItem item = new JsonItem() {
-        Path = value.ItemName,
-        Children = new List<JsonItem>()
-      };
-      
+    public override int Priority => 20;
+    public override Type ConvertableType => HEAL.Attic.Mapper.StaticCache.GetType(new Guid("EE612297-B1AF-42D2-BF21-AF9A2D42791C"));
+
+    public override void Populate(IItem value, JsonItem item, IJsonItemConverter root) {      
       dynamic val = (dynamic)value;
       object dataset = (object)val.Dataset;
@@ -22,32 +20,25 @@
       FieldInfo dataInfo = dataset.GetType().GetField("storableData", flags);
       // TODO: aufteilen in trainings und test daten abschnitte
-      item.Children.Add(new JsonItem() {
+      item.AddChilds(new JsonItem() {
         Name = "Dataset",
-        Value = dataInfo.GetValue(dataset),
-        Path = "Dataset"
+        Value = dataInfo.GetValue(dataset)
       });
 
       IEnumerable<StringValue> variables = (IEnumerable<StringValue>)val.InputVariables;
-      item.Children.Add(new JsonItem() {
+      item.AddChilds(new JsonItem() {
         Name = "TargetVariable",
         Value = (object)targetVariable,
-        Range = variables.Select(x => x.Value),
-        Path = "TargetVariable"
+        Range = variables.Select(x => x.Value)
       });
 
 
-      item.Children.Add(new JsonItem() {
+      item.AddChilds(new JsonItem() {
         Name = "AllowedInputVariables",
         Value = (object)val.AllowedInputVariables,
-        Range = variables.Select(x => x.Value),
-        Path = "AllowedInputVariables"
+        Range = variables.Select(x => x.Value)
       });
-
-      item.UpdatePath();
-
-      return item;
     }
 
-    public override void InjectData(IItem item, JsonItem data) {
+    public override void InjectData(IItem item, JsonItem data, IJsonItemConverter root) {
       // TODO: inject data
       throw new NotImplementedException();
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/StringValueConverter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/StringValueConverter.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/StringValueConverter.cs	(revision 17394)
@@ -9,11 +9,12 @@
 namespace HeuristicLab.JsonInterface {
   public class StringValueConverter : BaseConverter {
-    public override void InjectData(IItem item, JsonItem data) =>
-      item.Cast<StringValue>().Value = CastValue<string>(data.Value);
+    public override int Priority => 1;
+    public override Type ConvertableType => typeof(StringValue);
 
-    public override JsonItem ExtractData(IItem value) => 
-      new JsonItem() {
-        Value = value.Cast<StringValue>().Value
-      };
+    public override void InjectData(IItem item, JsonItem data, IJsonItemConverter root) =>
+      ((StringValue)item).Value = CastValue<string>(data.Value);
+
+    public override void Populate(IItem value, JsonItem item, IJsonItemConverter root) =>
+      item.Value = ((StringValue)value).Value;
   }
 }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueLookupParameterConverter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueLookupParameterConverter.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueLookupParameterConverter.cs	(revision 17394)
@@ -8,10 +8,18 @@
 namespace HeuristicLab.JsonInterface {
   public class ValueLookupParameterConverter : ParameterBaseConverter {
-    public override JsonItem ExtractData(IParameter value) {
-      IValueLookupParameter param = value.Cast<IValueLookupParameter>();
+    public override int Priority => 4;
+    public override Type ConvertableType => typeof(IValueLookupParameter);
+
+    public override void Populate(IParameter value, JsonItem item, IJsonItemConverter root) {
+      IValueLookupParameter param = value as IValueLookupParameter;
+      
+      item.Name = value.Name;
+      item.ActualName = param.ActualName;
+
       object actualValue = null;
       IEnumerable<object> actualRange = null;
       if(param.Value != null) {
-        JsonItem tmp = JsonItemConverter.Extract(param.Value);
+        JsonItem tmp = root.Extract(param.Value, root);
+        tmp.Parent = item;
         actualValue = tmp.Value;
         actualRange = tmp.Range;
@@ -19,18 +27,13 @@
         actualRange = new object[] { GetMinValue(param.DataType), GetMaxValue(param.DataType) };
       }
-
-      return new JsonItem() {
-        Name = value.Name,
-        ActualName = param.ActualName,
-        Value = actualValue,
-        Range = actualRange
-      };
+      item.Value = actualValue;
+      item.Range = actualRange;
     }
 
-    public override void InjectData(IParameter parameter, JsonItem data) {
-      IValueLookupParameter param = parameter.Cast<IValueLookupParameter>();
+    public override void InjectData(IParameter parameter, JsonItem data, IJsonItemConverter root) {
+      IValueLookupParameter param = parameter as IValueLookupParameter;
       param.ActualName = CastValue<string>(data.ActualName);
       if (param.Value != null)
-        JsonItemConverter.Inject(param.Value, data);
+        root.Inject(param.Value, data, root);
     }
   }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueParameterConverter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueParameterConverter.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueParameterConverter.cs	(revision 17394)
@@ -8,23 +8,24 @@
 namespace HeuristicLab.JsonInterface {
   public class ValueParameterConverter : ParameterBaseConverter {
+    public override int Priority => 2;
+    public override Type ConvertableType => typeof(IValueParameter);
 
-    public override void InjectData(IParameter parameter, JsonItem data) {
+    public override void InjectData(IParameter parameter, JsonItem data, IJsonItemConverter root) {
       if (parameter.ActualValue == null && data.Value != null)
         parameter.ActualValue = Instantiate(parameter.DataType);
-      JsonItemConverter.Inject(parameter.ActualValue, data);
+      root.Inject(parameter.ActualValue, data, root);
     }
 
-    public override JsonItem ExtractData(IParameter value) {
-      JsonItem data = new JsonItem() { Name = value.Name };
+    public override void Populate(IParameter value, JsonItem item, IJsonItemConverter root) {
+      item.Name = value.Name;
       if (value.ActualValue != null) {
-        JsonItem tmp = JsonItemConverter.Extract(value.ActualValue);
+        JsonItem tmp = root.Extract(value.ActualValue, root);
         if(tmp.Name == "[OverridableParamName]") {
           tmp.Name = value.Name;
-          data = tmp;
+          JsonItem.Merge(item, tmp);
         }
         else
-          data.AddParameter(tmp);
+          item.AddChilds(tmp);
       }
-      return data;
     }
   }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueRangeConverter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueRangeConverter.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueRangeConverter.cs	(revision 17394)
@@ -11,8 +11,14 @@
 namespace HeuristicLab.JsonInterface {
 
-  public class IntRangeConverter : ValueRangeConverter<IntRange, IntValue, int> { }
-  public class DoubleRangeConverter : ValueRangeConverter<DoubleRange, DoubleValue, double> {}
+  public class IntRangeConverter : ValueRangeConverter<IntRange, IntValue, int> {
+    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 class ValueRangeConverter<RangeType, T, TType> : BaseConverter 
+  public abstract class ValueRangeConverter<RangeType, T, TType> : BaseConverter 
     where RangeType : StringConvertibleValueTuple<T, T>
     where T : ValueTypeValue<TType>, IDeepCloneable, IStringConvertibleValue
@@ -21,17 +27,13 @@
     private const BindingFlags Flags = BindingFlags.NonPublic | BindingFlags.Instance;
 
-    public override JsonItem ExtractData(IItem value) {
+    public override void Populate(IItem value, JsonItem item, IJsonItemConverter root) {
       var field = value.GetType().GetField("values", Flags);
       Tuple<T,T> tuple = (Tuple<T,T>)field.GetValue(value);
-
-      return new JsonItem() {
-        Name = "[OverridableParamName]",
-        Value = new object[] { tuple.Item1.Value, tuple.Item2.Value },
-        Range = new object[] { GetMinValue(tuple.Item1.Value.GetType()), 
-                               GetMaxValue(tuple.Item2.Value.GetType()) }
-      };
+      item.Name = "[OverridableParamName]";
+      item.Value = new object[] { tuple.Item1.Value, tuple.Item2.Value };
+      item.Range = new object[] { GetMinValue(tuple.Item1.Value.GetType()), GetMaxValue(tuple.Item2.Value.GetType()) };
     }
 
-    public override void InjectData(IItem item, JsonItem data) {
+    public override void InjectData(IItem item, JsonItem data, IJsonItemConverter root) {
       object[] arr = (object[])data.Value;
       Tuple<T,T> tuple = new Tuple<T,T>(Instantiate<T>(arr[0]), Instantiate<T>(arr[1]));
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeArrayConverter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeArrayConverter.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeArrayConverter.cs	(revision 17394)
@@ -9,16 +9,36 @@
 
 namespace HeuristicLab.JsonInterface {
-  public class ValueTypeArrayConverter<ArrayType, T> : BaseConverter
+
+  public class IntArrayConverter : ValueTypeArrayConverter<IntArray, int> {
+    public override int Priority => 1;
+    public override Type ConvertableType => typeof(IntArray);
+  }
+
+  public class DoubleArrayConverter : ValueTypeArrayConverter<DoubleArray, double> {
+    public override int Priority => 1;
+    public override Type ConvertableType => typeof(DoubleArray);
+  }
+
+  public class PercentArrayConverter : ValueTypeArrayConverter<PercentArray, double> {
+    public override int Priority => 2;
+    public override Type ConvertableType => typeof(PercentArray);
+  }
+
+  public class BoolArrayConverter : ValueTypeArrayConverter<BoolArray, bool> {
+    public override int Priority => 1;
+    public override Type ConvertableType => typeof(BoolArray);
+  }
+
+  public abstract class ValueTypeArrayConverter<ArrayType, T> : BaseConverter
     where ArrayType : ValueTypeArray<T>
     where T : struct 
   {
-    public override void InjectData(IItem item, JsonItem data) => 
-      CopyArrayData(item.Cast<ArrayType>(), CastValue<T[]>(data.Value));
+    public override void InjectData(IItem item, JsonItem data, IJsonItemConverter root) => 
+      CopyArrayData(((ArrayType)item), CastValue<T[]>(data.Value));
 
-    public override JsonItem ExtractData(IItem value) => 
-      new JsonItem() {
-        Name = "[OverridableParamName]",
-        Value = value.Cast<ArrayType>().CloneAsArray()
-      };
+    public override void Populate(IItem value, JsonItem item, IJsonItemConverter root) {
+      item.Name = "[OverridableParamName]";
+      item.Value = ((ArrayType)value).CloneAsArray();
+    }
 
     #region Helper
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeMatrixConverter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeMatrixConverter.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeMatrixConverter.cs	(revision 17394)
@@ -9,16 +9,35 @@
 
 namespace HeuristicLab.JsonInterface {
-  public class ValueTypeMatrixConverter<MatrixType, T> : BaseConverter
+  public class IntMatrixConverter : ValueTypeMatrixConverter<IntMatrix, int> {
+    public override int Priority => 1;
+    public override Type ConvertableType => typeof(IntMatrix);
+  }
+
+  public class DoubleMatrixConverter : ValueTypeMatrixConverter<DoubleMatrix, double> {
+    public override int Priority => 1;
+    public override Type ConvertableType => typeof(DoubleMatrix);
+  }
+
+  public class PercentMatrixConverter : ValueTypeMatrixConverter<PercentMatrix, double> {
+    public override int Priority => 2;
+    public override Type ConvertableType => typeof(PercentMatrix);
+  }
+
+  public class BoolMatrixConverter : ValueTypeMatrixConverter<BoolMatrix, bool> {
+    public override int Priority => 1;
+    public override Type ConvertableType => typeof(BoolMatrix);
+  }
+
+  public abstract class ValueTypeMatrixConverter<MatrixType, T> : BaseConverter
     where MatrixType : ValueTypeMatrix<T> 
     where T : struct 
   {
-    public override void InjectData(IItem item, JsonItem data) => 
-      CopyMatrixData(item.Cast<MatrixType>(), data.Value);
+    public override void InjectData(IItem item, JsonItem data, IJsonItemConverter root) => 
+      CopyMatrixData(item as MatrixType, data.Value);
 
-    public override JsonItem ExtractData(IItem value) =>
-      new JsonItem() {
-        Name = "[OverridableParamName]",
-        Value = value.Cast<MatrixType>().CloneAsMatrix()
-      };
+    public override void Populate(IItem value, JsonItem item, IJsonItemConverter root) {
+      item.Name = "[OverridableParamName]";
+      item.Value = ((MatrixType)value).CloneAsMatrix();
+    }
 
     #region Helper
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeValueConverter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeValueConverter.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeValueConverter.cs	(revision 17394)
@@ -8,17 +8,42 @@
 
 namespace HeuristicLab.JsonInterface {
-  public class ValueTypeValueConverter<ValueType, T> : BaseConverter
+
+  public class IntValueConverter : ValueTypeValueConverter<IntValue, int> {
+    public override int Priority => 1;
+    public override Type ConvertableType => typeof(IntValue);
+  }
+
+  public class DoubleValueConverter : ValueTypeValueConverter<DoubleValue, double> {
+    public override int Priority => 1;
+    public override Type ConvertableType => typeof(DoubleValue);
+  }
+
+  public class PercentValueConverter : ValueTypeValueConverter<PercentValue, double> {
+    public override int Priority => 2;
+    public override Type ConvertableType => typeof(PercentValue);
+  }
+
+  public class BoolValueConverter : ValueTypeValueConverter<BoolValue, bool> {
+    public override int Priority => 1;
+    public override Type ConvertableType => typeof(BoolValue);
+  }
+
+  public class DateTimeValueConverter : ValueTypeValueConverter<DateTimeValue, DateTime> {
+    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 InjectData(IItem item, JsonItem data) =>
-      item.Cast<ValueType>().Value = CastValue<T>(data.Value);
+    public override void InjectData(IItem item, JsonItem data, IJsonItemConverter root) =>
+      ((ValueType)item).Value = CastValue<T>(data.Value);
 
-    public override JsonItem ExtractData(IItem value) => 
-      new JsonItem() {
-        Name = "[OverridableParamName]",
-        Value = value.Cast<ValueType>().Value,
-        Range = new object[] { GetMinValue(typeof(T)), GetMaxValue(typeof(T)) }
-      };
+    public override void Populate(IItem value, JsonItem item, IJsonItemConverter root) {
+      item.Name = "[OverridableParamName]";
+      item.Value = ((ValueType)value).Value;
+      item.Range = new object[] { GetMinValue(typeof(T)), GetMaxValue(typeof(T)) };
+    }
   }
 }
Index: anches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/CustomJsonWriter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/CustomJsonWriter.cs	(revision 17393)
+++ 	(revision )
@@ -1,45 +1,0 @@
-﻿using System.IO;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
-
-namespace HeuristicLab.JsonInterface {
-  /// <summary>
-  /// Custom json writer for own formatting for templates.
-  /// It collapses arrays into a single line.
-  /// </summary>
-  internal class CustomJsonWriter : JsonTextWriter {
-    private bool isRangeArray = false;
-    public override void WriteStartArray() {
-      
-      if (isRangeArray) base.Formatting = Formatting.None;
-      base.WriteStartArray();
-    }
-
-    public override void WritePropertyName(string name) {
-      base.Formatting = Formatting.Indented;
-      base.WritePropertyName(name);
-      isRangeArray = name == nameof(JsonItem.Range) || name == nameof(JsonItem.Value);
-    }
-
-    public override void WriteStartObject() {
-      base.Formatting = Formatting.Indented;
-      base.WriteStartObject();
-    }
-
-    public override void WriteEndObject() {
-      base.Formatting = Formatting.Indented;
-      base.WriteEndObject();
-    }
-
-    public CustomJsonWriter(TextWriter writer) : base(writer) { }
-
-    public static string Serialize(JToken token) {
-      JsonSerializer serializer = new JsonSerializer();
-      StringWriter sw = new StringWriter();
-      CustomJsonWriter writer = new CustomJsonWriter(sw);
-      writer.Formatting = Formatting.Indented;
-      serializer.Serialize(writer, token);
-      return sw.ToString();
-    }
-  }
-}
Index: anches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Extensions/ObjectExtensions.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Extensions/ObjectExtensions.cs	(revision 17393)
+++ 	(revision )
@@ -1,11 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HeuristicLab.JsonInterface {
-  public static class ObjectExtensions {
-    public static T Cast<T>(this object obj) => (T)obj;
-  }
-}
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/HeuristicLab.JsonInterface.csproj
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/HeuristicLab.JsonInterface.csproj	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/HeuristicLab.JsonInterface.csproj	(revision 17394)
@@ -61,14 +61,12 @@
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="Attributes\ConvertableAttribute.cs" />
     <Compile Include="Constants.cs" />
     <Compile Include="Converters\RegressionProblemDataConverter.cs" />
     <Compile Include="Converters\ValueLookupParameterConverter.cs" />
     <Compile Include="Converters\ValueRangeConverter.cs" />
-    <Compile Include="CustomJsonWriter.cs" />
-    <Compile Include="Extensions\ObjectExtensions.cs" />
+    <Compile Include="SingleLineArrayJsonWriter.cs" />
     <Compile Include="Extensions\TypeExtensions.cs" />
     <Compile Include="JCGenerator.cs" />
-    <Compile Include="JCInstantiator.cs" />
+    <Compile Include="JsonTemplateInstantiator.cs" />
     <Compile Include="Converters\ConstrainedValueParameterConverter.cs" />
     <Compile Include="Converters\ParameterBaseConverter.cs" />
@@ -76,5 +74,4 @@
     <Compile Include="Converters\ValueParameterConverter.cs" />
     <Compile Include="Converters\EnumTypeConverter.cs" />
-    <Compile Include="Converters\DummyConverter.cs" />
     <Compile Include="Converters\LookupParameterConverter.cs" />
     <Compile Include="Converters\MultiCheckedOperatorConverter.cs" />
@@ -84,4 +81,5 @@
     <Compile Include="Converters\ValueTypeMatrixConverter.cs" />
     <Compile Include="Converters\ValueTypeValueConverter.cs" />
+    <Compile Include="JsonItemConverterFactory.cs" />
     <Compile Include="Plugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
@@ -89,4 +87,5 @@
     <Compile Include="Interfaces\IJsonItemConverter.cs" />
     <Compile Include="JsonItemConverter.cs" />
+    <Compile Include="UnsupportedJsonItem.cs" />
   </ItemGroup>
   <ItemGroup>
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Interfaces/IJsonItemConverter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Interfaces/IJsonItemConverter.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Interfaces/IJsonItemConverter.cs	(revision 17394)
@@ -15,5 +15,5 @@
     /// <param name="item">The IItem which get the data injected.</param>
     /// <param name="data">The JsonItem with the saved values.</param>
-    void Inject(IItem item, JsonItem data);
+    void Inject(IItem item, JsonItem data, IJsonItemConverter root);
 
     /// <summary>
@@ -23,5 +23,8 @@
     /// <param name="value">The IItem to extract infos.</param>
     /// <returns>JsonItem with infos to reinitialise the IItem.</returns>
-    JsonItem Extract(IItem value);
+    JsonItem Extract(IItem value, IJsonItemConverter root);
+
+    Type ConvertableType { get; }
+    int Priority { get; }
   }
 }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JCGenerator.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JCGenerator.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JCGenerator.cs	(revision 17394)
@@ -35,5 +35,4 @@
       // which have parameters aswell
       AddInstantiableIItem(Constants.Algorithm, algorithm, genData);
-      //IsConvertable(algorithm, true);
       if (algorithm.Problem != null) // only when an problem exists
         AddInstantiableIItem(Constants.Problem, algorithm.Problem, genData);
@@ -42,17 +41,12 @@
       genData.Template[Constants.Parameters] = genData.JsonItems;
       // serialize template and return string
-      return CustomJsonWriter.Serialize(genData.Template);
+      return SingleLineArrayJsonWriter.Serialize(genData.Template);
     }
     
     #region Helper
-    private static bool IsConvertable(object obj, bool throwException = false) {
-      bool tmp = ConvertableAttribute.IsConvertable(obj);
-      if (throwException && tmp)
-        throw new NotSupportedException($"Type {obj.GetType().GetPrettyName(false)} is not convertable!");
-      return tmp;
-    }
 
     private static void AddInstantiableIItem(string metaDataTagName, IItem item, GenData genData) {
       JsonItem jsonItem = JsonItemConverter.Extract(item);
+      
       genData.Template[Constants.Metadata][metaDataTagName] = item.ItemName;
       PopulateJsonItems(jsonItem, genData);
@@ -62,5 +56,4 @@
     private static void PopulateJsonItems(JsonItem item, GenData genData) {
       IEnumerable<JsonItem> tmpParameter = item.Children;
-      item.Children = null;
 
       if (item.Value != null || item.Range != null) {
Index: anches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JCInstantiator.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JCInstantiator.cs	(revision 17393)
+++ 	(revision )
@@ -1,144 +1,0 @@
-﻿using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Reflection;
-using System.Text;
-using System.Threading.Tasks;
-using HEAL.Attic;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Optimization;
-using HeuristicLab.SequentialEngine;
-using Newtonsoft.Json.Linq;
-
-namespace HeuristicLab.JsonInterface {
-  /// <summary>
-  /// Static class to instantiate an IAlgorithm object with a json interface template and config.
-  /// </summary>
-  public static class JCInstantiator {
-    private struct InstData {
-      public JToken Template { get; set; }
-      public JArray Config { get; set; }
-      public IDictionary<string, JsonItem> Objects { get; set; }
-      public IDictionary<string, JsonItem> ResolvedItems { get; set; }
-    }
-
-    /// <summary>
-    /// Instantiate an IAlgorithm object with a template and config.
-    /// </summary>
-    /// <param name="templateFile">Template file (json), generated with JCGenerator.</param>
-    /// <param name="configFile">Config file (json) for the template.</param>
-    /// <returns>confugrated IAlgorithm object</returns>
-    public static IAlgorithm Instantiate(string templateFile, string configFile = "") {
-      InstData instData = new InstData() {
-        Objects = new Dictionary<string, JsonItem>(),
-        ResolvedItems = new Dictionary<string, JsonItem>()
-      };
-
-      // parse template and config files
-      instData.Template = JToken.Parse(File.ReadAllText(templateFile));
-      if(!string.IsNullOrEmpty(configFile))
-        instData.Config = JArray.Parse(File.ReadAllText(configFile));
-
-      // extract metadata information
-      string algorithmName = instData.Template[Constants.Metadata][Constants.Algorithm].ToString();
-      string problemName = instData.Template[Constants.Metadata][Constants.Problem].ToString();
-      string hLFileLocation = instData.Template[Constants.Metadata][Constants.HLFileLocation].ToString();
-
-      // deserialize hl file
-      ProtoBufSerializer serializer = new ProtoBufSerializer();
-      IAlgorithm algorithm = (IAlgorithm)serializer.Deserialize(hLFileLocation);
-
-      // collect all parameterizedItems from template
-      CollectParameterizedItems(instData);
-
-      // rebuild tree with paths
-      RebuildTree(instData);
-
-      // if config != null -> merge Template and Config 
-      if (instData.Config != null)
-        MergeTemplateWithConfig(instData);
-
-      // get algorthm data and object
-      JsonItem algorithmData = GetData(algorithmName, instData);
-
-      // get problem data and object
-      JsonItem problemData = GetData(problemName, instData);
-
-      // inject configuration
-      JsonItemConverter.Inject(algorithm, algorithmData);
-      if(algorithm.Problem != null)
-        JsonItemConverter.Inject(algorithm.Problem, problemData);
-
-      return algorithm;
-    }
-
-    #region Helper
-    private static void CollectParameterizedItems(InstData instData) {
-      foreach (JObject item in instData.Template[Constants.Parameters]) {
-        JsonItem data = JsonItem.BuildJsonItem(item);
-        instData.Objects.Add(data.Path, data);
-      }
-    }
-    
-    private static JsonItem RebuildTreeHelper(IList<JsonItem> col, string name) {
-      JsonItem target = null;
-      foreach (var val in col) {
-        if (val.Name == name)
-          target = val;
-      }
-      if (target == null) {
-        target = new JsonItem() {
-          Name = name,
-          Path = name,
-          Children = new List<JsonItem>()
-        };
-        col.Add(target);
-      }
-      return target;
-    }
-
-    // rebuilds item tree with splitting paths of each jsonitem
-    private static void RebuildTree(InstData instData) {
-      List<JsonItem> values = new List<JsonItem>();
-      foreach (var x in instData.Objects) {
-        string[] pathParts = x.Key.Split('.');
-        JsonItem target = RebuildTreeHelper(values, pathParts[0]);
-
-        for (int i = 1; i < pathParts.Length; ++i) {
-          target = RebuildTreeHelper(target.Children, pathParts[i]);
-        }
-
-        JsonItem.Merge(target, x.Value);
-      }
-      foreach(var val in values) {
-        instData.ResolvedItems.Add(val.Name, val);
-      }
-    }
-    
-    private static void MergeTemplateWithConfig(InstData instData) {
-      foreach (JObject obj in instData.Config) {
-        // build item from config object
-        JsonItem item = JsonItem.BuildJsonItem(obj);
-        // override default value
-        if (instData.Objects.TryGetValue(item.Path, out JsonItem param)) {
-          param.Value = item.Value;
-          // override ActualName (for LookupParameters)
-          if (param.ActualName != null)
-            param.ActualName = item.ActualName;
-        } else throw new InvalidDataException($"No parameter with path='{item.Path}' defined!");
-      }
-    }
-
-    private static JsonItem GetData(string key, InstData instData)
-    {
-      if (instData.ResolvedItems.TryGetValue(key, out JsonItem value))
-        return value;
-      else
-        throw new InvalidDataException($"Type of item '{key}' is not defined!");
-    }
-    #endregion
-  }
-}
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItem.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItem.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItem.cs	(revision 17394)
@@ -15,46 +15,66 @@
   /// </summary>
   public class JsonItem {
+    public class JsonItemValidator {
+      private IDictionary<int, bool> Cache = new Dictionary<int, bool>();
+      private JsonItem Root { get; set; }
+      public JsonItemValidator(JsonItem root) {
+        Root = root;
+      }
 
-    #region Private Fields
-    private string name;
-    private object value;
-    private IEnumerable<object> range;
+      public bool Validate(ref IList<JsonItem> faultyItems) {
+        faultyItems = new List<JsonItem>();
+        return ValidateHelper(Root, ref faultyItems);
+      }
+
+      private bool ValidateHelper(JsonItem item, ref IList<JsonItem> faultyItems) {
+        int hash = item.GetHashCode();
+        if (Cache.TryGetValue(hash, out bool r))
+          return r;
+
+        bool res = true;
+        if (item.Value != null && item.Range != null)
+          res = item.IsInRange();
+        if (!res) faultyItems.Add(item);
+        Cache.Add(hash, res);
+        foreach (var child in item.Children)
+          res = res && ValidateHelper(child, ref faultyItems);
+        return res;
+      }
+    }
+
+    public virtual string Name { get; set; }
+
+    public virtual string Path {
+      get {
+        JsonItem tmp = Parent;
+        StringBuilder builder = new StringBuilder(this.Name);
+        while(tmp != null) {
+          builder.Insert(0, tmp.Name + ".");
+          tmp = tmp.Parent;
+        }
+        return builder.ToString();
+      }
+    }
+
+    [JsonIgnore]
+    public virtual IList<JsonItem> Children { get; protected set; }
+
+    [JsonIgnore]
+    public virtual JsonItem Parent { get; set; }
+
+    public virtual object Value { get; set; }
+
+    public virtual IEnumerable<object> Range { get; set; }
+    
+    public virtual string ActualName { get; set; }
+
+    #region Constructors
+    public JsonItem() { }
+
+    public JsonItem(IEnumerable<JsonItem> childs) {
+      AddChilds(childs);
+    }
     #endregion
 
-    public string Name {
-      get => name;
-      set {
-        if(Name != value) {
-          string oldName = Name;
-          name = value;
-          // replace name in path if path != null
-          if (Path != null) {
-            var parts = Path.Split('.');
-            parts[Array.IndexOf(parts, oldName)] = name;
-            Path = string.Join(".", parts);
-          } else
-            Path = Name;
-          
-          UpdatePath();
-        }
-      }
-    }
-    public string Path { get; set; }
-    public IList<JsonItem> Children { get; set; }
-    public object Value {
-      get => value;
-      set {
-        this.value = value;
-        CheckConstraints();
-      }
-    }
-    public IEnumerable<object> Range {
-      get => range;
-      set {
-        range = value;
-        CheckConstraints();
-      }
-    }
-    public string ActualName { get; set; }
 
     #region Public Static Methods
@@ -62,5 +82,4 @@
       target.Name = from.Name ?? target.Name;
       target.Range = from.Range ?? target.Range;
-      target.Path = from.Path ?? target.Path;
       target.Value = from.Value ?? target.Value;
       target.ActualName = from.ActualName ?? target.ActualName;
@@ -75,32 +94,23 @@
 
     #region Public Methods
-    public void AddParameter(JsonItem item) {
+    public void AddChilds(params JsonItem[] childs) => 
+      AddChilds(childs as IEnumerable<JsonItem>);
+
+    public void AddChilds(IEnumerable<JsonItem> childs) {
       if (Children == null)
         Children = new List<JsonItem>();
-      Children.Add(item);
-      item.Path = $"{Path}.{item.Name}";
-      item.UpdatePath();
+      foreach (var child in childs) {
+        Children.Add(child);
+        child.Parent = this;
+      }
     }
 
-    public void UpdatePath() {
-      if (Children != null)
-        UpdatePathHelper(Children);
-    }
+    public virtual JsonItemValidator GetValidator() => new JsonItemValidator(this);
     #endregion
 
     #region Helper
-    private void UpdatePathHelper(IEnumerable<JsonItem> items) {
-      foreach (var item in items) {
-        item.Path = $"{Path}.{item.Name}";
-        item.UpdatePath();
-      }
-    }
 
-    private void CheckConstraints() {
-      if (Range != null && Value != null && !IsInRange())
-        throw new ArgumentOutOfRangeException(nameof(Value), $"{nameof(Value)} is not in range.");
-    }
 
-    private bool IsInRange() {
+    protected bool IsInRange() {
       bool b1 = true, b2 = true;
       if (Value is IEnumerable && !(Value is string)) {
@@ -117,5 +127,5 @@
     }
 
-    private bool IsInRangeList(object value) {
+    protected bool IsInRangeList(object value) {
       foreach (var x in Range)
         if (x.Equals(value)) return true;
@@ -123,5 +133,5 @@
     }
 
-    private bool IsInNumericRange(object value) =>
+    protected bool IsInNumericRange(object value) =>
       IsInNumericRange<ulong>(value)
       || IsInNumericRange<uint>(value)
@@ -136,5 +146,5 @@
       || (value is double && double.IsNaN((double)value));
 
-    private bool IsInNumericRange<T>(object value) where T : IComparable {
+    protected bool IsInNumericRange<T>(object value) where T : IComparable {
       object min = Range.First(), max = Range.Last();
       return
@@ -153,5 +163,4 @@
       return new JsonItem() {
         Name = obj[nameof(Name)]?.ToString(),
-        Path = obj[nameof(Path)]?.ToString(),
         Value = val,
         Range = obj[nameof(Range)]?.ToObject<object[]>(),
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItemConverter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItemConverter.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItemConverter.cs	(revision 17394)
@@ -12,59 +12,27 @@
 namespace HeuristicLab.JsonInterface {
   /// <summary>
-  /// Static class for handling json converters.
+  /// Class for handling json converters.
   /// </summary>
-  public static class JsonItemConverter {
+  public class JsonItemConverter : IJsonItemConverter {
+    
+    #region Properties
+    private IDictionary<Type, IJsonItemConverter> Converters { get; set; } 
+      = new Dictionary<Type, IJsonItemConverter>();
 
-    private struct ConverterPriorityContainer {
-      public IJsonItemConverter Converter { get; set; }
-      public int Priority { get; set; }
-    }
+    private IDictionary<int, JsonItem> Cache { get; set; }
+      = new Dictionary<int, JsonItem>();
 
-    private static IDictionary<Type, ConverterPriorityContainer> Converters { get; set; } 
-      = new Dictionary<Type, ConverterPriorityContainer>();
-    
-    /// <summary>
-    /// Register a converter for a given type and priority.
-    /// </summary>
-    /// <param name="type">The type for which the converter will be selected.</param>
-    /// <param name="converter">The implemented converter.</param>
-    /// <param name="priority">The priority for the converter selection (when multiple converter match for a given type). Higher is better.</param>
-    public static void Register(Type type, IJsonItemConverter converter, int priority) {
-      if (!Converters.ContainsKey(type))
-        Converters.Add(type, new ConverterPriorityContainer() { Converter = converter, Priority = priority });
-    }
+    public int Priority => throw new NotImplementedException();
 
-    public static void Register(string atticGuid, IJsonItemConverter converter, int priority) =>
-      Register(new Guid(atticGuid), converter, priority);
-
-    public static void Register(Guid atticGuid, IJsonItemConverter converter, int priority) {
-      if (Mapper.StaticCache.TryGetType(atticGuid, out Type type)) {
-        Register(type, converter, priority);
-      }
-    }
-
-    public static void Register<T>(IJsonItemConverter converter, int priority) => 
-      Register(typeof(T), converter, priority);
+    public Type ConvertableType => throw new NotImplementedException();
+    #endregion
 
     /// <summary>
-    /// Deregister a converter (same object has to be already registered).
-    /// </summary>
-    /// <param name="converter">Converter to deregister.</param>
-    public static void Deregister(IJsonItemConverter converter) {
-      var types = 
-        Converters
-        .Where(x => x.Value.Converter.GetHashCode() == converter.GetHashCode())
-        .Select(x => x.Key);
-      foreach (var x in types)
-        Converters.Remove(x);
-    }
-
-    /// <summary>
-    /// Get a converter for a specific type.
+    /// GetConverter a converter for a specific type.
     /// </summary>
     /// <param name="type">The type for which the converter will be selected.</param>
     /// <returns>An IJsonItemConverter object.</returns>
-    public static IJsonItemConverter Get(Type type) { 
-      IList<ConverterPriorityContainer> possibleConverters = new List<ConverterPriorityContainer>();
+    public IJsonItemConverter GetConverter(Type type) { 
+      IList<IJsonItemConverter> possibleConverters = new List<IJsonItemConverter>();
       
       foreach (var x in Converters)
@@ -73,56 +41,49 @@
 
       if(possibleConverters.Count > 0) {
-        ConverterPriorityContainer best = possibleConverters.First();
+        IJsonItemConverter best = possibleConverters.First();
         foreach (var x in possibleConverters) {
           if (x.Priority > best.Priority)
             best = x;
         }
-        return best.Converter;
+        return best;
       }
-      return new DummyConverter();
+      return null;
+    }
+    
+    public void Inject(IItem item, JsonItem data, IJsonItemConverter root) {
+      if(!Cache.ContainsKey(item.GetHashCode())) {
+        IJsonItemConverter converter = GetConverter(item.GetType());
+        if(converter != null) converter.Inject(item, data, root);
+      }
     }
 
-    internal static void Inject(IItem item, JsonItem data) =>
-      Get(item.GetType()).Inject(item, data);
+    public JsonItem Extract(IItem item, IJsonItemConverter root) {
+      int hash = item.GetHashCode();
+      if (Cache.TryGetValue(hash, out JsonItem val))
+        return val;
+      else {
+        IJsonItemConverter converter = GetConverter(item.GetType());
+        if (converter == null) return new UnsupportedJsonItem();
+        JsonItem tmp = GetConverter(item.GetType()).Extract(item, root);
+        Cache.Add(hash, tmp);
+        return tmp;
+      }
+    }
+    
+    public static void Inject(IItem item, JsonItem data) {
+      IJsonItemConverter c = JsonItemConverterFactory.Create();
+      c.Inject(item, data, c);
+    }
 
-    internal static JsonItem Extract(IItem item) => 
-      Get(item.GetType()).Extract(item);
-
+    public static JsonItem Extract(IItem item) {
+      IJsonItemConverter c = JsonItemConverterFactory.Create();
+      return c.Extract(item, c);
+    }
 
     /// <summary>
     /// Static constructor for default converter configuration.
     /// </summary>
-    static JsonItemConverter() {
-      Register<IntValue>(new ValueTypeValueConverter<IntValue, int>(), 1);
-      Register<DoubleValue>(new ValueTypeValueConverter<DoubleValue, double>(), 1);
-      Register<PercentValue>(new ValueTypeValueConverter<PercentValue, double>(), 2);
-      Register<BoolValue>(new ValueTypeValueConverter<BoolValue, bool>(), 1);
-      Register<DateTimeValue>(new ValueTypeValueConverter<DateTimeValue, DateTime>(), 1);
-      Register<StringValue>(new StringValueConverter(), 1);
-
-      Register<IntArray>(new ValueTypeArrayConverter<IntArray, int>(), 1);
-      Register<DoubleArray>(new ValueTypeArrayConverter<DoubleArray, double>(), 1);
-      Register<PercentArray>(new ValueTypeArrayConverter<PercentArray, double>(), 2);
-      Register<BoolArray>(new ValueTypeArrayConverter<BoolArray, bool>(), 1);
-
-      Register<IntMatrix>(new ValueTypeMatrixConverter<IntMatrix, int>(), 1);
-      Register<DoubleMatrix>(new ValueTypeMatrixConverter<DoubleMatrix, double>(), 1);
-      Register<PercentMatrix>(new ValueTypeMatrixConverter<PercentMatrix, double>(), 2);
-      Register<BoolMatrix>(new ValueTypeMatrixConverter<BoolMatrix, bool>(), 1);
-
-      Register<DoubleRange>(new DoubleRangeConverter(), 1);
-      Register<IntRange>(new IntRangeConverter(), 1);
-
-      Register(typeof(EnumValue<>), new EnumTypeConverter(), 1);
-      
-      Register<IValueParameter>(new ValueParameterConverter(), 2);
-      Register<IParameterizedItem>(new ParameterizedItemConverter(), 2);
-      Register<ILookupParameter>(new LookupParameterConverter(), 3);
-      Register<IValueLookupParameter>(new ValueLookupParameterConverter(), 4);
-
-      Register(typeof(IConstrainedValueParameter<>), new ConstrainedValueParameterConverter(), 3);
-      Register(typeof(ICheckedMultiOperator<>), new MultiCheckedOperatorConverter(), 3);
-      
-      Register("EE612297-B1AF-42D2-BF21-AF9A2D42791C", new RegressionProblemDataConverter(), 20);
+    internal JsonItemConverter(IDictionary<Type, IJsonItemConverter> converters) {
+      Converters = converters;
     }
   }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItemConverterFactory.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItemConverterFactory.cs	(revision 17394)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItemConverterFactory.cs	(revision 17394)
@@ -0,0 +1,25 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.JsonInterface {
+  public static class JsonItemConverterFactory {
+    private static IDictionary<Type, IJsonItemConverter> ConverterCache { get; set; }
+
+    public static JsonItemConverter Create() {
+      if (ConverterCache == null)
+        InitCache();
+      return new JsonItemConverter(ConverterCache);
+    }
+
+    private static void InitCache() {
+      ConverterCache = new Dictionary<Type, IJsonItemConverter>();
+      foreach (var converter in ApplicationManager.Manager.GetInstances<IJsonItemConverter>()) {
+        ConverterCache.Add(converter.ConvertableType, converter);
+      }
+    }
+  }
+}
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateInstantiator.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateInstantiator.cs	(revision 17394)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateInstantiator.cs	(revision 17394)
@@ -0,0 +1,123 @@
+﻿using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using HEAL.Attic;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using Newtonsoft.Json.Linq;
+
+namespace HeuristicLab.JsonInterface {
+  /// <summary>
+  /// Static class to instantiate an IAlgorithm object with a json interface template and config.
+  /// </summary>
+  public static class JsonTemplateInstantiator {
+    private struct InstData {
+      public JToken Template { get; set; }
+      public JArray Config { get; set; }
+      public IDictionary<string, JsonItem> Objects { get; set; }
+    }
+
+    /// <summary>
+    /// Instantiate an IAlgorithm object with a template and config.
+    /// </summary>
+    /// <param name="templateFile">Template file (json), generated with JCGenerator.</param>
+    /// <param name="configFile">Config file (json) for the template.</param>
+    /// <returns>confugrated IAlgorithm object</returns>
+    public static IAlgorithm Instantiate(string templateFile, string configFile = "") {
+      InstData instData = new InstData() {
+        Objects = new Dictionary<string, JsonItem>()
+      };
+
+      // parse template and config files
+      instData.Template = JToken.Parse(File.ReadAllText(templateFile));
+      if(!string.IsNullOrEmpty(configFile))
+        instData.Config = JArray.Parse(File.ReadAllText(configFile));
+
+      // extract metadata information
+      string algorithmName = instData.Template[Constants.Metadata][Constants.Algorithm].ToString();
+      string problemName = instData.Template[Constants.Metadata][Constants.Problem].ToString();
+      string hLFileLocation = instData.Template[Constants.Metadata][Constants.HLFileLocation].ToString();
+
+      // deserialize hl file
+      ProtoBufSerializer serializer = new ProtoBufSerializer();
+      IAlgorithm algorithm = (IAlgorithm)serializer.Deserialize(hLFileLocation);
+
+      // collect all parameterizedItems from template
+      CollectParameterizedItems(instData);
+      
+      // if config != null -> merge Template and Config 
+      if (instData.Config != null)
+        MergeTemplateWithConfig(instData);
+
+      // get algorthm data and object
+      JsonItem algorithmData = GetData(algorithmName, instData);
+
+      // get problem data and object
+      JsonItem problemData = GetData(problemName, instData);
+
+      // inject configuration
+      JsonItemConverter.Inject(algorithm, algorithmData);
+      if(algorithm.Problem != null)
+        JsonItemConverter.Inject(algorithm.Problem, problemData);
+
+      return algorithm;
+    }
+
+    #region Helper
+    private static void CollectParameterizedItems(InstData instData) {
+      foreach (JObject item in instData.Template[Constants.Parameters]) {
+        string[] pathParts = item.Property("Path").Value.ToString().Split('.');
+        
+        // rebuilds object tree
+        JsonItem parent = null;
+        StringBuilder partialPath = new StringBuilder();
+        for(int i = 0; i < pathParts.Length-1; ++i) {
+          partialPath.Append(pathParts[i]);
+          JsonItem tmp = null;
+          if (instData.Objects.TryGetValue(partialPath.ToString(), out JsonItem value)) {
+            tmp = value;
+          } else {
+            tmp = new JsonItem() { Name = pathParts[i] };
+            if (parent != null) parent.AddChilds(tmp);
+            instData.Objects.Add(partialPath.ToString(), tmp);
+          }
+          partialPath.Append(".");
+          parent = tmp;
+        }
+
+        JsonItem data = JsonItem.BuildJsonItem(item);
+        parent.AddChilds(data);
+        instData.Objects.Add(data.Path, data);
+      }
+    }
+    
+    private static void MergeTemplateWithConfig(InstData instData) {
+      foreach (JObject obj in instData.Config) {
+        // build item from config object
+        JsonItem item = JsonItem.BuildJsonItem(obj);
+        // override default value
+        if (instData.Objects.TryGetValue(item.Path, out JsonItem param)) {
+          param.Value = item.Value;
+          // override ActualName (for LookupParameters)
+          if (param.ActualName != null)
+            param.ActualName = item.ActualName;
+        } else throw new InvalidDataException($"No parameter with path='{item.Path}' defined!");
+      }
+    }
+
+    private static JsonItem GetData(string key, InstData instData)
+    {
+      if (instData.Objects.TryGetValue(key, out JsonItem value))
+        return value;
+      else
+        throw new InvalidDataException($"Type of item '{key}' is not defined!");
+    }
+    #endregion
+  }
+}
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/SingleLineArrayJsonWriter.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/SingleLineArrayJsonWriter.cs	(revision 17394)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/SingleLineArrayJsonWriter.cs	(revision 17394)
@@ -0,0 +1,45 @@
+﻿using System.IO;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+
+namespace HeuristicLab.JsonInterface {
+  /// <summary>
+  /// Custom json writer for own formatting for templates.
+  /// It collapses arrays into a single line.
+  /// </summary>
+  internal class SingleLineArrayJsonWriter : JsonTextWriter {
+    private bool isRangeArray = false;
+    public override void WriteStartArray() {
+      
+      if (isRangeArray) base.Formatting = Formatting.None;
+      base.WriteStartArray();
+    }
+
+    public override void WritePropertyName(string name) {
+      base.Formatting = Formatting.Indented;
+      base.WritePropertyName(name);
+      isRangeArray = name == nameof(JsonItem.Range) || name == nameof(JsonItem.Value);
+    }
+
+    public override void WriteStartObject() {
+      base.Formatting = Formatting.Indented;
+      base.WriteStartObject();
+    }
+
+    public override void WriteEndObject() {
+      base.Formatting = Formatting.Indented;
+      base.WriteEndObject();
+    }
+
+    public SingleLineArrayJsonWriter(TextWriter writer) : base(writer) { }
+
+    public static string Serialize(JToken token) {
+      JsonSerializer serializer = new JsonSerializer();
+      StringWriter sw = new StringWriter();
+      SingleLineArrayJsonWriter writer = new SingleLineArrayJsonWriter(sw);
+      writer.Formatting = Formatting.Indented;
+      serializer.Serialize(writer, token);
+      return sw.ToString();
+    }
+  }
+}
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/UnsupportedJsonItem.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/UnsupportedJsonItem.cs	(revision 17394)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/UnsupportedJsonItem.cs	(revision 17394)
@@ -0,0 +1,46 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Newtonsoft.Json;
+
+namespace HeuristicLab.JsonInterface {
+  public class UnsupportedJsonItem : JsonItem {
+    public override string Name {
+      get => throw new NotSupportedException();
+      set => throw new NotSupportedException();
+    }
+
+    public override string Path {
+      get => throw new NotSupportedException();
+    }
+
+    [JsonIgnore]
+    public override IList<JsonItem> Children {
+      get => throw new NotSupportedException();
+      protected set => throw new NotSupportedException();
+    }
+
+    [JsonIgnore]
+    public override JsonItem Parent {
+      get => throw new NotSupportedException();
+      set => throw new NotSupportedException();
+    }
+
+    public override object Value {
+      get => throw new NotSupportedException();
+      set => throw new NotSupportedException();
+    }
+
+    public override IEnumerable<object> Range {
+      get => throw new NotSupportedException();
+      set => throw new NotSupportedException();
+    }
+
+    public override string ActualName {
+      get => throw new NotSupportedException();
+      set => throw new NotSupportedException();
+    }
+  }
+}
Index: /branches/3026_IntegrationIntoSymSpace/Heuristiclab.ConfigStarter/Program.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/Heuristiclab.ConfigStarter/Program.cs	(revision 17393)
+++ /branches/3026_IntegrationIntoSymSpace/Heuristiclab.ConfigStarter/Program.cs	(revision 17394)
@@ -46,5 +46,5 @@
 
       File.WriteAllText(@"C:\Workspace\Template.json", JCGenerator.GenerateTemplate(alg));
-      JCInstantiator.Instantiate(@"C:\Workspace\Template.json");
+      JsonTemplateInstantiator.Instantiate(@"C:\Workspace\Template.json");
       /*
       List<ICommandLineArgument> arguments = new List<ICommandLineArgument>();
