Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ArrayJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ArrayJsonItem.cs	(revision 17473)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ArrayJsonItem.cs	(revision 17477)
@@ -9,6 +9,6 @@
   public abstract class ArrayJsonItem<T> : ValueJsonItem<T[]>, IArrayJsonItem {
     public virtual bool Resizable { get; set; }
-    public override void SetFromJObject(JObject jObject) {
-      base.SetFromJObject(jObject);
+    public override void SetJObject(JObject jObject) {
+      base.SetJObject(jObject);
       Resizable = (jObject[nameof(IArrayJsonItem.Resizable)]?.ToObject<bool>()).GetValueOrDefault();
     }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/DateTimeJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/DateTimeJsonItem.cs	(revision 17473)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/DateTimeJsonItem.cs	(revision 17477)
@@ -4,8 +4,27 @@
 using System.Text;
 using System.Threading.Tasks;
+using Newtonsoft.Json.Linq;
 
 namespace HeuristicLab.JsonInterface {
   public class DateTimeJsonItem : IntervalRestrictedValueJsonItem<DateTime> {
     protected override bool Validate() => Minimum.CompareTo(Value) >= 0 && Maximum.CompareTo(Value) <= 0;
+    
+    public override JObject GenerateJObject() {
+      var obj = base.GenerateJObject();
+
+      if (Minimum.CompareTo(DateTime.MinValue) == 0)
+        obj.Property("Minimum").Remove();
+
+      if (Maximum.CompareTo(DateTime.MaxValue) == 0)
+        obj.Property("Maximum").Remove();
+
+      return obj;
+    }
+
+    public override void SetJObject(JObject jObject) {
+      Minimum = DateTime.MinValue;
+      Maximum = DateTime.MaxValue;
+      base.SetJObject(jObject);
+    }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/DoubleJsonItems.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/DoubleJsonItems.cs	(revision 17473)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/DoubleJsonItems.cs	(revision 17477)
@@ -4,22 +4,82 @@
 using System.Text;
 using System.Threading.Tasks;
+using Newtonsoft.Json.Linq;
 
 namespace HeuristicLab.JsonInterface {
-  public class DoubleJsonItem : IntervalRestrictedValueJsonItem<double> { }
-  public class DoubleArrayJsonItem : IntervalRestrictedArrayJsonItem<double> { }
-  public class DoubleRangeJsonItem : RangedJsonItem<double> { }
+  public class DoubleJsonItem : IntervalRestrictedValueJsonItem<double> {
+    public override JObject GenerateJObject() {
+      var obj = base.GenerateJObject();
 
+      if (Minimum.CompareTo(double.MinValue) == 0)
+        obj.Property("Minimum").Remove();
+
+      if (Maximum.CompareTo(double.MaxValue) == 0)
+        obj.Property("Maximum").Remove();
+
+      return obj;
+    }
+
+    public override void SetJObject(JObject jObject) {
+      Minimum = double.MinValue;
+      Maximum = double.MaxValue;
+      base.SetJObject(jObject);
+    }
+  }
+  public class DoubleArrayJsonItem : IntervalRestrictedArrayJsonItem<double> {
+    public override JObject GenerateJObject() {
+      var obj = base.GenerateJObject();
+
+      if (Minimum.CompareTo(double.MinValue) == 0)
+        obj.Property("Minimum").Remove();
+
+      if (Maximum.CompareTo(double.MaxValue) == 0)
+        obj.Property("Maximum").Remove();
+
+      return obj;
+    }
+
+    public override void SetJObject(JObject jObject) {
+      Minimum = double.MinValue;
+      Maximum = double.MaxValue;
+      base.SetJObject(jObject);
+    }
+  }
+  public class DoubleRangeJsonItem : RangedJsonItem<double> {
+    public override JObject GenerateJObject() {
+      var obj = base.GenerateJObject();
+
+      if (Minimum.CompareTo(double.MinValue) == 0)
+        obj.Property("Minimum").Remove();
+
+      if (Maximum.CompareTo(double.MaxValue) == 0)
+        obj.Property("Maximum").Remove();
+
+      return obj;
+    }
+
+    public override void SetJObject(JObject jObject) {
+      Minimum = double.MinValue;
+      Maximum = double.MaxValue;
+      base.SetJObject(jObject);
+    }
+  }
   public class DoubleMatrixJsonItem : IntervalRestrictedMatrixJsonItem<double> {
-    /*
-    protected override bool IsInRange() {
-      for (int c = 0; c < Value.Length; ++c) {
-        for (int r = 0; r < Value[c].Length; ++r) {
-          if (Value[c][r] < Range.First() && Range.Last() < Value[c][r])
-            return false;
-        }
-      }
-      return true;
+    public override JObject GenerateJObject() {
+      var obj = base.GenerateJObject();
+
+      if (Minimum.CompareTo(double.MinValue) == 0)
+        obj.Property("Minimum").Remove();
+
+      if (Maximum.CompareTo(double.MaxValue) == 0)
+        obj.Property("Maximum").Remove();
+
+      return obj;
     }
-    */
+
+    public override void SetJObject(JObject jObject) {
+      Minimum = double.MinValue;
+      Maximum = double.MaxValue;
+      base.SetJObject(jObject);
+    }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntJsonItems.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntJsonItems.cs	(revision 17473)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntJsonItems.cs	(revision 17477)
@@ -4,21 +4,82 @@
 using System.Text;
 using System.Threading.Tasks;
+using Newtonsoft.Json.Linq;
 
 namespace HeuristicLab.JsonInterface {
-  public class IntJsonItem : IntervalRestrictedValueJsonItem<int> { }
-  public class IntArrayJsonItem : IntervalRestrictedArrayJsonItem<int> { }
-  public class IntRangeJsonItem : RangedJsonItem<int> { }
+  public class IntJsonItem : IntervalRestrictedValueJsonItem<int> {
+    public override JObject GenerateJObject() {
+      var obj = base.GenerateJObject();
+
+      if (Minimum.CompareTo(int.MinValue) == 0)
+        obj.Property("Minimum").Remove();
+
+      if (Maximum.CompareTo(int.MaxValue) == 0)
+        obj.Property("Maximum").Remove();
+
+      return obj;
+    }
+
+    public override void SetJObject(JObject jObject) {
+      Minimum = int.MinValue;
+      Maximum = int.MaxValue;
+      base.SetJObject(jObject);
+    }
+  }
+  public class IntArrayJsonItem : IntervalRestrictedArrayJsonItem<int> {
+    public override JObject GenerateJObject() {
+      var obj = base.GenerateJObject();
+
+      if (Minimum.CompareTo(int.MinValue) == 0)
+        obj.Property("Minimum").Remove();
+
+      if (Maximum.CompareTo(int.MaxValue) == 0)
+        obj.Property("Maximum").Remove();
+
+      return obj;
+    }
+
+    public override void SetJObject(JObject jObject) {
+      Minimum = int.MinValue;
+      Maximum = int.MaxValue;
+      base.SetJObject(jObject);
+    }
+  }
+  public class IntRangeJsonItem : RangedJsonItem<int> {
+    public override JObject GenerateJObject() {
+      var obj = base.GenerateJObject();
+
+      if (Minimum.CompareTo(int.MinValue) == 0)
+        obj.Property("Minimum").Remove();
+
+      if (Maximum.CompareTo(int.MaxValue) == 0)
+        obj.Property("Maximum").Remove();
+
+      return obj;
+    }
+
+    public override void SetJObject(JObject jObject) {
+      Minimum = int.MinValue;
+      Maximum = int.MaxValue;
+      base.SetJObject(jObject);
+    }
+  }
   public class IntMatrixJsonItem : IntervalRestrictedMatrixJsonItem<int> {
-    /*
-    protected override bool IsInRange() {
-      for (int c = 0; c < Value.Length; ++c) {
-        for (int r = 0; r < Value[c].Length; ++r) {
-          if (Value[c][r] < Range.First() && Range.Last() < Value[c][r])
-            return false;
-        }
-      }
-      return true;
+    public override JObject GenerateJObject() {
+      var obj = base.GenerateJObject();
+
+      if (Minimum.CompareTo(int.MinValue) == 0)
+        obj.Property("Minimum").Remove();
+
+      if (Maximum.CompareTo(int.MaxValue) == 0)
+        obj.Property("Maximum").Remove();
+
+      return obj;
     }
-    */
+
+    public override void SetJObject(JObject jObject) {
+      Minimum = int.MinValue;
+      Maximum = int.MaxValue;
+      base.SetJObject(jObject);
+    }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedArrayJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedArrayJsonItem.cs	(revision 17473)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedArrayJsonItem.cs	(revision 17477)
@@ -20,8 +20,13 @@
     }
 
-    public override void SetFromJObject(JObject jObject) {
-      base.SetFromJObject(jObject);
-      Minimum = jObject[nameof(IIntervalRestrictedJsonItem<T>.Minimum)].ToObject<T>();
-      Maximum = jObject[nameof(IIntervalRestrictedJsonItem<T>.Maximum)].ToObject<T>();
+    public override void SetJObject(JObject jObject) {
+      base.SetJObject(jObject);
+
+      var minProp = jObject[nameof(IIntervalRestrictedJsonItem<T>.Minimum)];
+      if (minProp != null) Minimum = minProp.ToObject<T>();
+
+
+      var maxProp = jObject[nameof(IIntervalRestrictedJsonItem<T>.Maximum)];
+      if (maxProp != null) Maximum = maxProp.ToObject<T>();
     }
   }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedMatrixJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedMatrixJsonItem.cs	(revision 17473)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedMatrixJsonItem.cs	(revision 17477)
@@ -20,8 +20,13 @@
       return true;
     }
-    public override void SetFromJObject(JObject jObject) {
-      base.SetFromJObject(jObject);
-      Minimum = jObject[nameof(IIntervalRestrictedJsonItem<T>.Minimum)].ToObject<T>();
-      Maximum = jObject[nameof(IIntervalRestrictedJsonItem<T>.Maximum)].ToObject<T>();
+    public override void SetJObject(JObject jObject) {
+      base.SetJObject(jObject);
+
+      var minProp = jObject[nameof(IIntervalRestrictedJsonItem<T>.Minimum)];
+      if (minProp != null) Minimum = minProp.ToObject<T>();
+
+
+      var maxProp = jObject[nameof(IIntervalRestrictedJsonItem<T>.Maximum)];
+      if (maxProp != null) Maximum = maxProp.ToObject<T>();
     }
   }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedValueJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedValueJsonItem.cs	(revision 17473)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedValueJsonItem.cs	(revision 17477)
@@ -14,8 +14,13 @@
     protected override bool Validate() => Minimum.CompareTo(Value) <= 0 && Maximum.CompareTo(Value) >= 0;
 
-    public override void SetFromJObject(JObject jObject) {
-      base.SetFromJObject(jObject);
-      Minimum = jObject[nameof(IIntervalRestrictedJsonItem<T>.Minimum)].ToObject<T>();
-      Maximum = jObject[nameof(IIntervalRestrictedJsonItem<T>.Maximum)].ToObject<T>();
+    public override void SetJObject(JObject jObject) {
+      base.SetJObject(jObject);
+
+      var minProp = jObject[nameof(IIntervalRestrictedJsonItem<T>.Minimum)];
+      if (minProp != null) Minimum = minProp.ToObject<T>();
+
+
+      var maxProp = jObject[nameof(IIntervalRestrictedJsonItem<T>.Maximum)];
+      if (maxProp != null) Maximum = maxProp.ToObject<T>();
     }
   }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/JsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/JsonItem.cs	(revision 17473)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/JsonItem.cs	(revision 17477)
@@ -62,9 +62,5 @@
       }
     }
-
-    //public virtual object Value { get; set; }
-
-    //public virtual IEnumerable<object> Range { get; set; }
-    
+        
     // TODO jsonIgnore dataType?
 
@@ -105,58 +101,32 @@
     public void LoosenPath() => fixedPath = "";
 
-    public virtual void SetFromJObject(JObject jObject) {
-      //Value = jObject[nameof(IJsonItem.Value)]?.ToObject<object>();
-      //Range = jObject[nameof(IJsonItem.Range)]?.ToObject<object[]>();
-    }
+    public virtual JObject GenerateJObject() =>
+      JObject.FromObject(this, new JsonSerializer() {
+        TypeNameHandling = TypeNameHandling.None,
+        NullValueHandling = NullValueHandling.Ignore,
+        ReferenceLoopHandling = ReferenceLoopHandling.Ignore
+      });
+
+    public virtual void SetJObject(JObject jObject) { }
     #endregion
 
-    #region Helper
-    /*
-     * TODO protected abstract bool Validate();
-     */
+    #region Abstract Methods
     protected abstract bool Validate();
-    /*
-    protected virtual bool IsInRange() {
-      bool b1 = true, b2 = true;
-      if (Value is IEnumerable && !(Value is string)) {
-        foreach (var x in (IEnumerable)Value) {
-          b1 = b1 ? IsInRangeList(x) : b1;
-          b2 = b2 ? IsInNumericRange(x) : b2;
+    #endregion
+
+    #region IEnumerable Support
+    public virtual IEnumerator<IJsonItem> GetEnumerator() {
+      yield return this;
+      
+      if (Children != null) {
+        foreach (var x in Children) {
+          foreach (var c in x) {
+            yield return c;
+          }
         }
-      } 
-      else {
-        b1 = IsInRangeList(Value); 
-        b2 = IsInNumericRange(Value);
-      } 
-      return b1 || b2;
+      }
     }
 
-    protected bool IsInRangeList(object value) {
-      foreach (var x in Range)
-        if (x.Equals(value)) return true;
-      return false;
-    }
-
-    protected bool IsInNumericRange(object value) =>
-      IsInNumericRange<ulong>(value)
-      || IsInNumericRange<uint>(value)
-      || IsInNumericRange<ushort>(value)
-      || IsInNumericRange<long>(value)
-      || IsInNumericRange<int>(value)
-      || IsInNumericRange<short>(value)
-      || IsInNumericRange<byte>(value)
-      || IsInNumericRange<float>(value)
-      || IsInNumericRange<double>(value)
-      || (value is float && float.IsNaN((float)value))
-      || (value is double && double.IsNaN((double)value));
-
-    protected bool IsInNumericRange<T>(object value) where T : IComparable {
-      object min = Range.First(), max = Range.Last();
-      return
-        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) &&
-        (((T)max).CompareTo(value) == 1 || ((T)max).CompareTo(value) == 0);
-    }
-    */
+    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
     #endregion
   }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/LookupJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/LookupJsonItem.cs	(revision 17473)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/LookupJsonItem.cs	(revision 17477)
@@ -10,6 +10,6 @@
     public virtual string ActualName { get; set; }
 
-    public override void SetFromJObject(JObject jObject) {
-      base.SetFromJObject(jObject);
+    public override void SetJObject(JObject jObject) {
+      base.SetJObject(jObject);
       ActualName = jObject[nameof(ILookupJsonItem.ActualName)]?.ToString();
     }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/MatrixJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/MatrixJsonItem.cs	(revision 17473)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/MatrixJsonItem.cs	(revision 17477)
@@ -23,6 +23,6 @@
     }
 
-    public override void SetFromJObject(JObject jObject) {
-      base.SetFromJObject(jObject);
+    public override void SetJObject(JObject jObject) {
+      base.SetJObject(jObject);
       RowsResizable = (jObject[nameof(IMatrixJsonItem.RowsResizable)]?.ToObject<bool>()).GetValueOrDefault();
       ColumnsResizable = (jObject[nameof(IMatrixJsonItem.ColumnsResizable)]?.ToObject<bool>()).GetValueOrDefault();
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ValueJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ValueJsonItem.cs	(revision 17473)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ValueJsonItem.cs	(revision 17477)
@@ -10,9 +10,6 @@
     public object Value { get; set; }
 
-    //public IEnumerable<object> Range { get; set; }
-
-    public override void SetFromJObject(JObject jObject) {
+    public override void SetJObject(JObject jObject) {
       Value = jObject[nameof(IValueJsonItem.Value)]?.ToObject<object>();
-      //Range = jObject[nameof(IValueJsonItem.Range)]?.ToObject<object[]>();
     }
 
@@ -24,11 +21,4 @@
       set => base.Value = value;
     }
-
-    /*
-    public new IEnumerable<T> Range {
-      get => base.Range?.Cast<T>();
-      set => base.Range = value.Cast<object>();
-    }
-    */
 
     private T ConvertObject(object obj) {
@@ -42,8 +32,7 @@
     }
 
-    public override void SetFromJObject(JObject jObject) {
+    public override void SetJObject(JObject jObject) {
       if(jObject[nameof(IValueJsonItem<T>.Value)] != null)
         Value = jObject[nameof(IValueJsonItem<T>.Value)].ToObject<T>();
-      //Range = jObject[nameof(IValueJsonItem<T>.Range)]?.ToObject<T[]>();
     }
   }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ValueLookupJsonItem.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ValueLookupJsonItem.cs	(revision 17473)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ValueLookupJsonItem.cs	(revision 17477)
@@ -5,14 +5,39 @@
 using System.Threading.Tasks;
 using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
 
 namespace HeuristicLab.JsonInterface {
   public class ValueLookupJsonItem : LookupJsonItem, IValueLookupJsonItem {
-    [JsonIgnore]
-    public IJsonItem JsonItemReference { get; set; }
+    
+    public IJsonItem ActualValue { get; set; }
 
     protected override bool Validate() {
-      if (JsonItemReference == null) return true;
+      if (ActualValue == null) return true;
       IList<IJsonItem> faultyItems = new List<IJsonItem>();
-      return JsonItemReference.GetValidator().Validate(ref faultyItems);
+      return ActualValue.GetValidator().Validate(ref faultyItems);
+    }
+
+    public override JObject GenerateJObject() {
+      var obj = base.GenerateJObject();
+      if(ActualValue != null) {
+        var actualValue = ActualValue.GenerateJObject();
+        obj.Add(nameof(IValueLookupJsonItem.ActualValue), actualValue);
+      }
+      return obj;
+    }
+
+    public override IEnumerator<IJsonItem> GetEnumerator() {
+      using (var it = base.GetEnumerator()) {
+        while(it.MoveNext()) {
+          yield return it.Current;
+        }
+      }
+      if(ActualValue != null) {
+        using (var it = ActualValue.GetEnumerator()) {
+          while (it.MoveNext()) {
+            yield return it.Current;
+          }
+        }
+      }
     }
   }
