Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeArrayConverter.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeArrayConverter.cs	(revision 17410)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeArrayConverter.cs	(revision 17417)
@@ -10,46 +10,90 @@
 namespace HeuristicLab.JsonInterface {
 
-  public class IntArrayConverter : ValueTypeArrayConverter<IntArray, int> {
+  public class IntArrayConverter : BaseConverter {
     public override int Priority => 1;
     public override Type ConvertableType => typeof(IntArray);
+
+    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) {
+      IntArray arr = item as IntArray;
+      int[] d = CastValue<int[]>(data);
+      bool resizeTmp = arr.Resizable;
+      arr.Resizable = true;
+      arr.Length = d.Length;
+      for (int i = 0; i < d.Length; ++i)
+        arr[i] = d[i];
+      arr.Resizable = resizeTmp;
+    }
+
+    public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
+      new IntArrayJsonItem() {
+        Name = "[OverridableParamName]",
+        Value = ((IntArray)value).CloneAsArray()
+      };
   }
 
-  public class DoubleArrayConverter : ValueTypeArrayConverter<DoubleArray, double> {
+  public class DoubleArrayConverter : BaseConverter {
     public override int Priority => 1;
     public override Type ConvertableType => typeof(DoubleArray);
+
+    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) {
+      DoubleArray arr = item as DoubleArray;
+      double[] d = CastValue<double[]>(data);
+      bool resizeTmp = arr.Resizable;
+      arr.Resizable = true;
+      arr.Length = d.Length;
+      for (int i = 0; i < d.Length; ++i)
+        arr[i] = d[i];
+      arr.Resizable = resizeTmp;
+    }
+
+    public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
+      new DoubleArrayJsonItem() {
+        Name = "[OverridableParamName]",
+        Value = ((DoubleArray)value).CloneAsArray()
+      };
   }
 
-  public class PercentArrayConverter : ValueTypeArrayConverter<PercentArray, double> {
+  public class PercentArrayConverter : BaseConverter {
     public override int Priority => 2;
     public override Type ConvertableType => typeof(PercentArray);
+
+    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) {
+      PercentArray arr = item as PercentArray;
+      double[] d = CastValue<double[]>(data);
+      bool resizeTmp = arr.Resizable;
+      arr.Resizable = true;
+      arr.Length = d.Length;
+      for (int i = 0; i < d.Length; ++i)
+        arr[i] = d[i];
+      arr.Resizable = resizeTmp;
+    }
+
+    public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
+      new DoubleArrayJsonItem() {
+        Name = "[OverridableParamName]",
+        Value = ((PercentArray)value).CloneAsArray()
+      };
   }
 
-  public class BoolArrayConverter : ValueTypeArrayConverter<BoolArray, bool> {
+  public class BoolArrayConverter : BaseConverter {
     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 Inject(IItem item, IJsonItem data, IJsonItemConverter root) => 
-      CopyArrayData(((ArrayType)item), CastValue<T[]>(data.Value));
+    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) {
+      BoolArray arr = item as BoolArray;
+      bool[] d = CastValue<bool[]>(data);
+      bool resizeTmp = arr.Resizable;
+      arr.Resizable = true;
+      arr.Length = d.Length;
+      for(int i = 0; i < d.Length; ++i)
+        arr[i] = d[i];
+      arr.Resizable = resizeTmp;
+    }
 
     public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
-      new JsonItem() {
+      new BoolArrayJsonItem() {
         Name = "[OverridableParamName]",
-        Value = ((ArrayType)value).CloneAsArray()
+        Value = ((BoolArray)value).CloneAsArray()
       };
-
-    #region Helper
-    private void CopyArrayData(ArrayType array, T[] data) {
-      var colInfo = array.GetType().GetProperty("Length");
-      colInfo.SetValue(array, data.Length);
-      for (int i = 0; i < data.Length; ++i) {
-        array[i] = data[i];
-      }
-    }
-    #endregion
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeMatrixConverter.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeMatrixConverter.cs	(revision 17410)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeMatrixConverter.cs	(revision 17417)
@@ -12,4 +12,15 @@
     public override int Priority => 1;
     public override Type ConvertableType => typeof(IntMatrix);
+    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) {
+      IntMatrix mat = item as IntMatrix;
+      IntMatrixJsonItem d = data as IntMatrixJsonItem;
+      CopyMatrixData(mat, d.Value);
+    }
+
+    public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
+      new IntMatrixJsonItem() {
+        Name = "[OverridableParamName]",
+        Value = Transform((IntMatrix)value)
+      };
   }
 
@@ -17,4 +28,16 @@
     public override int Priority => 1;
     public override Type ConvertableType => typeof(DoubleMatrix);
+
+    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) {
+      DoubleMatrix mat = item as DoubleMatrix;
+      DoubleMatrixJsonItem d = data as DoubleMatrixJsonItem;
+      CopyMatrixData(mat, d.Value);
+    }
+
+    public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
+      new DoubleMatrixJsonItem() {
+        Name = "[OverridableParamName]",
+        Value = Transform((DoubleMatrix)value)
+      };
   }
 
@@ -22,4 +45,16 @@
     public override int Priority => 2;
     public override Type ConvertableType => typeof(PercentMatrix);
+
+    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) {
+      PercentMatrix mat = item as PercentMatrix;
+      DoubleMatrixJsonItem d = data as DoubleMatrixJsonItem;
+      CopyMatrixData(mat, d.Value);
+    }
+
+    public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
+      new DoubleMatrixJsonItem() {
+        Name = "[OverridableParamName]",
+        Value = Transform((PercentMatrix)value)
+      };
   }
 
@@ -27,4 +62,16 @@
     public override int Priority => 1;
     public override Type ConvertableType => typeof(BoolMatrix);
+
+    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) {
+      BoolMatrix mat = item as BoolMatrix;
+      BoolMatrixJsonItem d = data as BoolMatrixJsonItem;
+      CopyMatrixData(mat, d.Value);
+    }
+
+    public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
+      new BoolMatrixJsonItem() {
+        Name = "[OverridableParamName]",
+        Value = Transform((BoolMatrix)value)
+      };
   }
 
@@ -33,32 +80,30 @@
     where T : struct 
   {
-    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) => 
-      CopyMatrixData(item as MatrixType, data.Value);
+    #region Helper
+    protected void CopyMatrixData(MatrixType matrix, T[][] data) {
+      var rows = data.Length;
+      var cols = data.Length > 0 ? data[0].Length : 0;
 
-    public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
-      new JsonItem() {
-        Name = "[OverridableParamName]",
-        Value = ((MatrixType)value).CloneAsMatrix()
+      var rowInfo = matrix.GetType().GetProperty("Rows");
+      rowInfo.SetValue(matrix, rows);
+      var colInfo = matrix.GetType().GetProperty("Columns");
+      colInfo.SetValue(matrix, cols);
 
-      };
-
-    #region Helper
-    private void CopyMatrixData(MatrixType matrix, object data) {
-      if (data is Array arr) {
-        var rows = arr.Length;
-        var cols = arr.Length > 0 && arr.GetValue(0) is JArray jarr ? jarr.Count : 0;
-
-        var rowInfo = matrix.GetType().GetProperty("Rows");
-        rowInfo.SetValue(matrix, rows);
-        var colInfo = matrix.GetType().GetProperty("Columns");
-        colInfo.SetValue(matrix, cols);
-
-        for (int x = 0; x < rows; ++x) {
-          jarr = (JArray)arr.GetValue(x);
-          for (int y = 0; y < cols; ++y) {
-            matrix[x, y] = jarr[y].ToObject<T>();
-          }
+      for (int x = 0; x < rows; ++x) {
+        for (int y = 0; y < cols; ++y) {
+          matrix[x, y] = data[x][y];
         }
       }
+    }
+
+    protected T[][] Transform(MatrixType matrix) {
+      T[][] m = new T[matrix.Rows][];
+      for (int r = 0; r < matrix.Rows; ++r) {
+        m[r] = new T[matrix.Columns];
+        for (int c = 0; c < matrix.Columns; ++c) {
+          m[r][c] = matrix[r, c];
+        }
+      }
+      return m;
     }
     #endregion
