Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/Component.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/Component.cs	(revision 17271)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/Component.cs	(revision 17275)
@@ -6,54 +6,39 @@
 using HeuristicLab.Core;
 using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
 
-namespace HeuristicLab.Manufacture {   
-  /*
-  public class ParameterData { //Blueprint, Component,  ?
+namespace HeuristicLab.Manufacture {
+  public class Component {
+    private IList<object> range;
+    private object defaultValue;
+
     public string Name { get; set; }
     public string Type { get; set; }
-    public IList<ParameterData> FreeParameters { get; set; }
-    public IList<ParameterData> StaticParameters { get; set; }
+    public object Default {
+      get => defaultValue; 
+      set {
+        defaultValue = value;
+        if(Range != null && value != null && !FulfillConstraints())
+          throw new ArgumentOutOfRangeException("Default", "Default is not in range.");
+      } 
+    }
+    public string Path { get; set; }
 
-  }*/
-
-  public class Component {
-    public string Name { get; set; }
-    public string Type { get; set; }
-    public object Default { get; set; }
-    public string Path { get; set; }
-    public IList<object> Range { get; set; }
+    public IList<object> Range { 
+      get => range; 
+      set {
+        range = value;
+        if (Default != null && value != null && !FulfillConstraints())
+          throw new ArgumentOutOfRangeException("Default", "Default is not in range.");
+      } 
+    }
 
     public IList<Component> Parameters { get; set; }
     public IList<Component> Operators { get; set; }
-
-    [JsonIgnore]
-    public Component this[string index] {
-      get {
-        if (Parameters == null) return null;
-        foreach (var p in Parameters)
-          if (p.Name == index) return p;
-        return null;
-      }
-      set {
-        if (Parameters == null) 
-          Parameters = new List<Component>();
-        Component data = this[index];
-        if (data != null && CheckConstraints(value))
-          Merge(data, value);
-        else
-          Parameters.Add(value);
-      }
-    }
-
-    public override bool Equals(object obj) {
-      if (!(obj is Component)) 
-        return false;
-      else 
-        return obj.Cast<Component>().Name == this.Name;
-    }
-
-    public override int GetHashCode() {
-      return Name.GetHashCode();
-    }
+    
+    public override bool Equals(object obj) => 
+      (obj is Component ? (obj.Cast<Component>().Name == this.Name) : false);
+      
+    public override int GetHashCode() => Name.GetHashCode();
 
     [JsonIgnore]
@@ -62,6 +47,5 @@
     [JsonIgnore]
     public Component Reference { get; set; }
-
-    #region Helper
+    
     public static void Merge(Component target, Component from) {
       target.Name = from.Name ?? target.Name;
@@ -73,13 +57,22 @@
       target.Parameters = from.Parameters ?? target.Parameters;
       target.ParameterizedItems = from.ParameterizedItems ?? target.ParameterizedItems;
+      target.Operators = from.Operators ?? target.Operators;
     }
 
-    private bool CheckConstraints(Component data) => 
+    public bool FulfillConstraints() => FulfillConstraints(this);
+
+    public static bool FulfillConstraints(Component data) =>
       data.Range != null && data.Default != null && (
       IsInRangeList(data.Range, data.Default) ||
       IsInNumericRange<long>(data.Default, data.Range[0], data.Range[1]) ||
+      IsInNumericRange<int>(data.Default, data.Range[0], data.Range[1]) ||
+      IsInNumericRange<short>(data.Default, data.Range[0], data.Range[1]) ||
+      IsInNumericRange<byte>(data.Default, data.Range[0], data.Range[1]) ||
+      IsInNumericRange<float>(data.Default, data.Range[0], data.Range[1]) ||
       IsInNumericRange<double>(data.Default, data.Range[0], data.Range[1]));
 
-    private bool IsInRangeList(IEnumerable<object> list, object value) {
+    #region Helper
+
+    private static bool IsInRangeList(IEnumerable<object> list, object value) {
       foreach (var x in list)
         if (x.Equals(value)) return true;
@@ -87,5 +80,5 @@
     }
 
-    private bool IsInNumericRange<T>(object value, object min, object max) where T : IComparable =>
+    private static bool IsInNumericRange<T>(object value, object min, object max) where T : IComparable =>
       (value != null && min != null && max != null && value is T && min is T && max is T &&
         (((T)min).CompareTo(value) == -1 || ((T)min).CompareTo(value) == 0) &&
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/HeuristicLab.Manufacture.csproj
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/HeuristicLab.Manufacture.csproj	(revision 17271)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/HeuristicLab.Manufacture.csproj	(revision 17275)
@@ -73,5 +73,4 @@
     <Compile Include="Interfaces\ITypeTransformer.cs" />
     <Compile Include="Transformer.cs" />
-    <Compile Include="Util.cs" />
   </ItemGroup>
   <ItemGroup>
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/JCGenerator.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/JCGenerator.cs	(revision 17271)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/JCGenerator.cs	(revision 17275)
@@ -19,6 +19,8 @@
     private Stack<Formatting> formattings = new Stack<Formatting>();
     private int lvl = 0;
+    private bool isRangeArray = false;
     public override void WriteStartArray() {
       base.WriteStartArray();
+      /*
       if(lvl > ArrayFlatterLvl) {
         formattings.Push(base.Formatting);
@@ -26,11 +28,24 @@
       }
       lvl++;
+      */
+      if(isRangeArray) base.Formatting = Formatting.None;
     }
 
     public override void WriteEndArray() {
       base.WriteEndArray();
+      /*
       lvl--;
       if (lvl > ArrayFlatterLvl)
         base.Formatting = formattings.Pop();
+      */
+      if(isRangeArray) {
+        base.Formatting = Formatting.Indented;
+        isRangeArray = false;
+      }
+    }
+
+    public override void WritePropertyName(string name) {
+      base.WritePropertyName(name);
+      isRangeArray = name == "Range";
     }
 
@@ -54,8 +69,8 @@
         'Problem':''
       },
-      'Objects': []
+      'Objects': [],
+      'Types': {}
     }");
 
-    
     private Dictionary<string, string> TypeList = new Dictionary<string, string>();
     
@@ -69,12 +84,36 @@
       
       foreach(var item in items.Distinct()) {
-        JToken token = JObject.FromObject(item, Settings());
-        token["StaticParameters"] = token["Parameters"];
-        token["FreeParameters"] = token["Parameters"];
-        token.Cast<JObject>().Property("Parameters")?.Remove();
-        RefactorFreeParameters(token, freeParameters);
-        RefactorStaticParameters(token);
-        if(token["StaticParameters"].HasValues || token["FreeParameters"].HasValues)
+        JObject token = JObject.FromObject(item, Settings());
+        //token["StaticParameters"] = token["Parameters"];
+        //token["FreeParameters"] = token["Parameters"];
+
+        foreach (JObject x in token["Parameters"]) {
+          x.Property("Parameters")?.Remove();
+          x.Property("Type")?.Remove();
+        }
+        TypeList.Add(item.Name, item.Type);
+        RefactorParameters(token);
+        /*
+        foreach (JObject x in token["StaticParameters"]) {
+          x.Property("Parameters")?.Remove();
+          x.Property("Type")?.Remove();
+        }
+        foreach (JObject x in token["FreeParameters"]) {
+          x.Property("Parameters")?.Remove();
+          x.Property("Type")?.Remove();
+        }
+        */
+        //token.Cast<JObject>().Property("Parameters")?.Remove();
+        token.Property("Default")?.Remove();
+        token.Property("Type")?.Remove();
+
+        //RefactorFreeParameters(token, freeParameters);
+        //RefactorStaticParameters(token);
+        if (/*token["StaticParameters"].HasValues || token["FreeParameters"].HasValues ||*/ token["Parameters"].HasValues || (token["Operators"]?.HasValues ?? false))
           jsonItems.Add(token);
+
+        if(!token["Parameters"].HasValues) {
+          token.Property("Parameters")?.Remove();
+        }
       }
 
@@ -82,4 +121,5 @@
       template["Metadata"]["Problem"] = problem.Name;
       template["Objects"] = jsonItems;
+      template["Types"] = JObject.FromObject(TypeList);
 
       return CustomWriter.Serialize(template);
@@ -121,4 +161,13 @@
     }
 
+    private void RefactorParameters(JToken token) {
+      IList<JObject> objToRemove = new List<JObject>();
+      TransformNodes(x => {
+        var p = x.ToObject<Component>();
+        if (p.Default == null) objToRemove.Add(x);
+      }, token["Parameters"]);
+      foreach (var x in objToRemove) x.Remove();
+    }
+
     private JsonSerializer Settings() => new JsonSerializer() {
       TypeNameHandling = TypeNameHandling.None,
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/JCInstantiator.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/JCInstantiator.cs	(revision 17271)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/JCInstantiator.cs	(revision 17275)
@@ -13,12 +13,12 @@
 
 namespace HeuristicLab.Manufacture {
-
-  
   public class JCInstantiator {
 
     private JToken Config { get; set; }
+    private Dictionary<string, string> TypeList = new Dictionary<string, string>();
 
     public IAlgorithm Instantiate(string configFile) {
       Config = JToken.Parse(File.ReadAllText(configFile));
+      TypeList = Config["Types"].ToObject<Dictionary<string, string>>();
 
       Component algorithmData = GetData(Config["Metadata"]["Algorithm"].ToString());
@@ -37,14 +37,8 @@
     }
 
-    /*
-     * resolve references
-     */
-
     private void ResolveReferences(Component data) {
-      foreach (var p in data.Parameters) {
-        if (p.Default is string && p.Reference == null) {
+      foreach (var p in data.Parameters)
+        if (p.Default is string && p.Reference == null)
           p.Reference = GetData(p.Default.Cast<string>());
-        }
-      }
     }
 
@@ -53,5 +47,5 @@
       foreach(JObject item in Config["Objects"])
       {
-        Component data = BuildDataFromJObject(item);
+        Component data = item.ToObject<Component>();// Component.Build(item);
         if (data.Name == key) return data;
       }
@@ -59,34 +53,50 @@
     }
 
-    private Component BuildDataFromJObject(JObject obj) {
-      Component data = new Component() {
-        Name = obj["Name"]?.ToString(),
-        Default = obj["Default"]?.ToObject<object>(),
-        Range = obj["Range"]?.ToObject<object[]>(),
-        Type = obj["Type"]?.ToObject<string>()
+    private T CreateObject<T>(Component data) {
+      if (TypeList.TryGetValue(data.Name, out string typeName)) {
+        Type type = Type.GetType(typeName);
+        return (T)Activator.CreateInstance(type);
+      } else throw new TypeLoadException($"Cannot find AssemblyQualifiedName for {data.Name}.");
+    }
+
+    private Component BuildComponent(JObject obj) =>
+      new Component() {
+        Name = obj[nameof(Component.Name)]?.ToString(),
+        Default = obj[nameof(Component.Default)]?.ToObject<object>(),
+        Range = obj[nameof(Component.Range)]?.ToObject<object[]>(),
+        Type = obj[nameof(Component.Type)]?.ToObject<string>(),
+        Parameters = PopulateParameters(obj),
+        Operators = PopulateOperators(obj)
       };
 
-      if(obj["StaticParameters"] != null)
-        foreach (JObject sp in obj["StaticParameters"])
-          data[sp["Name"].ToString()] = BuildDataFromJObject(sp);
+    private IList<Component> PopulateParameters(JObject obj) {
+      IList<Component> list = new List<Component>();
+      if (obj["StaticParameters"] != null)
+        foreach (JObject param in obj["StaticParameters"])
+          list.Add(BuildComponent(param));
 
-      if (obj["FreeParameters"] != null)
-        foreach (JObject sp in obj["FreeParameters"])
-          data[sp["Name"].ToString()] = BuildDataFromJObject(sp);
-
-      if (obj["Operators"] != null) {
-        data.Operators = new List<Component>();
-        foreach (JObject sp in obj["Operators"])
-          data.Operators.Add(BuildDataFromJObject(sp));
+      if (obj["FreeParameters"] != null) {
+        foreach (JObject param in obj["FreeParameters"]) {
+          Component tmp = BuildComponent(param);
+          Component comp = null;
+          foreach (var p in list)
+            if (p.Name == tmp.Name) comp = p;
+          if (comp != null) 
+            Component.Merge(comp, tmp);
+          else list.Add(tmp);
+        }
       }
-
-      return data;
+      return list;
     }
 
-    private T CreateObject<T>(Component data) {
-      Type type = Type.GetType(data.Type);
-      return (T)Activator.CreateInstance(type);
+    private IList<Component> PopulateOperators(JObject obj) {
+      IList<Component> list = new List<Component>();
+      if (obj[nameof(Operators)] != null)
+        foreach (JObject sp in obj[nameof(Operators)]) {
+          Component tmp = BuildComponent(sp);
+          list.Add(tmp);
+        }
+      return list;
     }
-
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/ParameterTransformer/ParameterizedItemTransformer.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/ParameterTransformer/ParameterizedItemTransformer.cs	(revision 17271)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/ParameterTransformer/ParameterizedItemTransformer.cs	(revision 17275)
@@ -13,7 +13,9 @@
       IParameterizedItem pItem = item.Cast<IParameterizedItem>();
 
-      foreach (var sp in data.Parameters)
-        if (pItem.Parameters.TryGetValue(sp.Name, out IParameter param))
-          Transformer.Inject(param, sp);
+      if(data.Parameters != null) {
+        foreach (var sp in data.Parameters)
+          if (pItem.Parameters.TryGetValue(sp.Name, out IParameter param))
+            Transformer.Inject(param, sp);
+      }
     }
 
@@ -25,4 +27,5 @@
       obj.Type = value.GetType().AssemblyQualifiedName;
       obj.ParameterizedItems = list;
+      obj.Parameters = new List<Component>();
       list.Add(obj);
 
@@ -30,5 +33,5 @@
         if (!param.Hidden) {
           Component data = Transformer.Extract(param);
-          obj[data.Name] = data;
+          obj.Parameters.Add(data);
           if(data.ParameterizedItems != null)
             list.AddRange(data.ParameterizedItems);
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/Program.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/Program.cs	(revision 17271)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/Program.cs	(revision 17275)
@@ -35,5 +35,5 @@
 
       JCGenerator gen = new JCGenerator();
-      //File.WriteAllText(@"C:\Workspace\TemplateProto10.json", gen.GenerateTemplate(alg, tsp));
+      File.WriteAllText(@"C:\Workspace\TemplateProto10.json", gen.GenerateTemplate(alg, tsp));
       
       JCInstantiator configurator = new JCInstantiator();
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/TypeTransformer/BaseTransformer.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/TypeTransformer/BaseTransformer.cs	(revision 17271)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/TypeTransformer/BaseTransformer.cs	(revision 17275)
@@ -16,5 +16,10 @@
     }
 
-    public void Inject(IItem item, Component data) => InjectData(item, data);
+    public void Inject(IItem item, Component data) {
+      if(data.Reference != null) {
+        Component.Merge(data, data.Reference);
+      }
+      InjectData(item, data);
+    }
 
     public abstract void InjectData(IItem item, Component data);
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/TypeTransformer/MultiCheckedOperatorTransformer.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/TypeTransformer/MultiCheckedOperatorTransformer.cs	(revision 17271)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/TypeTransformer/MultiCheckedOperatorTransformer.cs	(revision 17275)
@@ -10,4 +10,5 @@
     public override Component ExtractData(IItem value) {
       Component data = base.ExtractData(value);
+      data.Default = value.GetType().Name;
 
       data.Operators = new List<Component>();
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/Util.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/Util.cs	(revision 17271)
+++ 	(revision )
@@ -1,25 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Manufacture {
-  public class Util {
-    public static bool IsTypeOf(object obj, Type t) {
-      if (obj == null || t == null) return false;
-      Type objType = obj.GetType();
-      if (t.IsInterface && t.IsGenericType)
-        return (objType == t || objType.IsAssignableFrom(t) || objType.GetInterfaces().Where(i => i.IsGenericType).Any(i => i.GetGenericTypeDefinition() == t));
-      if (t.IsGenericType) {
-        Type baseType = objType;
-        while (baseType != typeof(object)) {
-          if (baseType.IsGenericType && baseType.GetGenericTypeDefinition() == t) return true;
-          baseType = baseType.BaseType;
-        }
-      }
-      return objType == t;
-    }
-  }
-}
