Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/HeuristicLab.JsonInterface.OptimizerIntegration.csproj
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/HeuristicLab.JsonInterface.OptimizerIntegration.csproj	(revision 17430)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/HeuristicLab.JsonInterface.OptimizerIntegration.csproj	(revision 17431)
@@ -97,4 +97,5 @@
     <Compile Include="ViewModels\ArrayValueVM.cs" />
     <Compile Include="ViewModels\JsonItemVMBase.cs" />
+    <Compile Include="ViewModels\MatrixValueVM.cs" />
     <Compile Include="ViewModels\RangedValueBaseVM.cs" />
     <Compile Include="ViewModels\RangeVM.cs" />
@@ -108,9 +109,9 @@
     </Compile>
     <Compile Include="FileManager.cs" />
-    <Compile Include="Views\JsonItemArrayValueControl.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Views\JsonItemArrayValueControl.Designer.cs">
-      <DependentUpon>JsonItemArrayValueControl.cs</DependentUpon>
+    <Compile Include="Views\JsonItemMultiValueControl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\JsonItemMultiValueControl.Designer.cs">
+      <DependentUpon>JsonItemMultiValueControl.cs</DependentUpon>
     </Compile>
     <Compile Include="Views\JsonItemBoolControl.cs">
@@ -199,6 +200,6 @@
       <DependentUpon>ExportJsonDialog.cs</DependentUpon>
     </EmbeddedResource>
-    <EmbeddedResource Include="Views\JsonItemArrayValueControl.resx">
-      <DependentUpon>JsonItemArrayValueControl.cs</DependentUpon>
+    <EmbeddedResource Include="Views\JsonItemMultiValueControl.resx">
+      <DependentUpon>JsonItemMultiValueControl.cs</DependentUpon>
     </EmbeddedResource>
     <EmbeddedResource Include="Views\JsonItemBoolControl.resx">
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Shared/JsonItemBaseControl.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Shared/JsonItemBaseControl.cs	(revision 17430)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Shared/JsonItemBaseControl.cs	(revision 17431)
@@ -21,5 +21,6 @@
       VM = vm;
 
-      checkBoxActive.DataBindings.Add("Checked", VM, nameof(JsonItemVMBase.Selected));
+      checkBoxActive.DataBindings.Add("Checked", VM, nameof(JsonItemVMBase.Selected),
+        false, DataSourceUpdateMode.OnPropertyChanged);
       textBoxName.DataBindings.Add("Text", VM, nameof(JsonItemVMBase.Name));
       textBoxActualName.DataBindings.Add("Text", VM, nameof(JsonItemVMBase.ActualName));
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/ArrayValueVM.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/ArrayValueVM.cs	(revision 17430)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/ArrayValueVM.cs	(revision 17431)
@@ -16,12 +16,11 @@
 
     public override JsonItemBaseControl GetControl() => new JsonItemDoubleArrayValueControl(this);
-
-    protected override void OnItemChanged() {
-      IList<IndexedArrayValueVM> list = new List<IndexedArrayValueVM>();
-      var arr = ((DoubleArrayJsonItem)Item).Value;
-      for(int i = 0; i < arr.Length; ++i) {
-        list.Add(new IndexedArrayValueVM(arr, i));
+    
+    public override double[] Value {
+      get => ((DoubleArrayJsonItem)Item).Value;
+      set {
+        ((DoubleArrayJsonItem)Item).Value = value;
+        OnPropertyChange(this, nameof(Value));
       }
-      Value = list.ToArray();
     }
   }
@@ -35,51 +34,32 @@
 
     public override JsonItemBaseControl GetControl() => new JsonItemIntArrayValueControl(this);
-
-    protected override void OnItemChanged() {
-      IList<IndexedArrayValueVM> list = new List<IndexedArrayValueVM>();
-      var arr = ((IntArrayJsonItem)Item).Value;
-      for (int i = 0; i < arr.Length; ++i) {
-        list.Add(new IndexedArrayValueVM(arr, i));
+    
+    public override int[] Value {
+      get => ((IntArrayJsonItem)Item).Value;
+      set {
+        ((IntArrayJsonItem)Item).Value = value;
+        OnPropertyChange(this, nameof(Value));
       }
-      Value = list.ToArray();
     }
   }
 
   public abstract class ArrayValueVM<T> : RangedValueBaseVM<T> {
-
-    public class IndexedArrayValueVM : INotifyPropertyChanged {
-      private T[] arr;
-      private int index;
-
-      public IndexedArrayValueVM(T[] arr, int index) {
-        this.arr = arr;
-        this.index = index;
-      }
-
-      public T Value {
-        get => arr[index];
-        set {
-          arr[index] = value;
-          PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Value)));
-        }
-      }
-
-      public event PropertyChangedEventHandler PropertyChanged;
+    
+    public ArrayValueVM() {
+      //base.ItemChanged += OnItemChanged;
     }
 
-    public ArrayValueVM() {
-      base.ItemChanged += OnItemChanged;
+    public void SetIndexValue(object obj, int index) {
+      T[] tmp = Value;
+      if(index >= tmp.Length) { // increasing array
+        T[] newArr = new T[index+1];
+        Array.Copy(tmp, 0, newArr, 0, tmp.Length);
+        tmp = newArr;
+      }
+      tmp[index] = (T)Convert.ChangeType(obj, typeof(T));
+      Value = tmp;
     }
 
-    protected abstract void OnItemChanged();
-
-    IndexedArrayValueVM[] vms;
-    public IndexedArrayValueVM[] Value {
-      get => vms; 
-      set {
-        vms = value;
-        OnPropertyChange(this, nameof(Value));
-      } 
-    }
+    public abstract T[] Value { get; set; }
   }
 }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/JsonItemVMBase.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/JsonItemVMBase.cs	(revision 17430)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/JsonItemVMBase.cs	(revision 17431)
@@ -2,7 +2,9 @@
 using System.Collections.Generic;
 using System.ComponentModel;
+using System.Drawing;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using System.Windows.Forms;
 
 namespace HeuristicLab.JsonInterface.OptimizerIntegration {
@@ -19,4 +21,7 @@
       }
     }
+
+    public TreeNode TreeNode { get; set; }
+    public TreeView TreeView { get; set; }
 
     protected void OnPropertyChange(object sender, string propertyName) {
@@ -37,4 +42,8 @@
       set {
         selected = value;
+        if(TreeNode != null)
+          TreeNode.ForeColor = (selected ? Color.Black : Color.Red);
+        if (TreeView != null)
+          TreeView.Refresh();
         OnPropertyChange(this, nameof(Selected));
       }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/MatrixValueVM.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/MatrixValueVM.cs	(revision 17431)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/MatrixValueVM.cs	(revision 17431)
@@ -0,0 +1,55 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.JsonInterface.OptimizerIntegration {
+
+  public class DoubleMatrixValueVM : MatrixValueVM<double> {
+    public override Type JsonItemType => typeof(DoubleMatrixJsonItem);
+    public override JsonItemBaseControl GetControl() => new JsonItemDoubleMatrixValueControl(this);
+
+    public override double[][] Value {
+      get => ((DoubleMatrixJsonItem)Item).Value;
+      set {
+        ((DoubleMatrixJsonItem)Item).Value = value;
+        OnPropertyChange(this, nameof(Value));
+      }
+    }
+
+    protected override double MinTypeValue => double.MinValue;
+
+    protected override double MaxTypeValue => double.MaxValue;
+  }
+
+  public abstract class MatrixValueVM<T> : RangedValueBaseVM<T> {
+
+    public MatrixValueVM() {}
+    public void SetCellValue(object obj, int col, int row) {
+      T[][] tmp = Value;
+      
+      if (row >= tmp.Length) { // increasing array
+        T[][] newArr = new T[row + 1][];
+        Array.Copy(tmp, 0, newArr, 0, tmp.Length);
+        newArr[row] = new T[0];
+        tmp = newArr;
+      }
+      for(int i = 0; i < tmp.Length; ++i) {
+        if(col >= tmp[i].Length) {
+          T[] newArr = new T[col + 1];
+          Array.Copy(tmp[i], 0, newArr, 0, tmp[i].Length);
+          tmp[i] = newArr;
+        }
+      }
+      tmp[row][col] = (T)Convert.ChangeType(obj.ToString().Replace(",","."), 
+                                            typeof(T), 
+                                            System.Globalization.CultureInfo.InvariantCulture);
+      Value = tmp;
+    }
+
+    public abstract T[][] Value { get; set; }
+
+  }
+}
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.cs	(revision 17430)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.cs	(revision 17431)
@@ -85,4 +85,6 @@
         VMs.Add(vm);
         vm.Item = item;
+        vm.TreeNode = node;
+        vm.TreeView = treeView;
         UserControl control = vm.GetControl();
         if (control != null) {
Index: anches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemArrayValueControl.Designer.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemArrayValueControl.Designer.cs	(revision 17430)
+++ 	(revision )
@@ -1,72 +1,0 @@
-﻿namespace HeuristicLab.JsonInterface.OptimizerIntegration {
-  partial class JsonItemArrayValueControl {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      this.dataGridView = new System.Windows.Forms.DataGridView();
-      this.numericRangeControl1 = new HeuristicLab.JsonInterface.OptimizerIntegration.NumericRangeControl();
-      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
-      this.SuspendLayout();
-      // 
-      // dataGridView
-      // 
-      this.dataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
-            | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
-      this.dataGridView.Location = new System.Drawing.Point(9, 75);
-      this.dataGridView.Name = "dataGridView";
-      this.dataGridView.Size = new System.Drawing.Size(487, 171);
-      this.dataGridView.TabIndex = 13;
-      // 
-      // numericRangeControl1
-      // 
-      this.numericRangeControl1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.numericRangeControl1.Location = new System.Drawing.Point(9, 252);
-      this.numericRangeControl1.Name = "numericRangeControl1";
-      this.numericRangeControl1.Size = new System.Drawing.Size(487, 128);
-      this.numericRangeControl1.TabIndex = 14;
-      // 
-      // JsonItemArrayValueControl
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.numericRangeControl1);
-      this.Controls.Add(this.dataGridView);
-      this.Name = "JsonItemArrayValueControl";
-      this.Size = new System.Drawing.Size(502, 386);
-      this.Controls.SetChildIndex(this.dataGridView, 0);
-      this.Controls.SetChildIndex(this.numericRangeControl1, 0);
-      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.DataGridView dataGridView;
-    private NumericRangeControl numericRangeControl1;
-  }
-}
Index: anches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemArrayValueControl.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemArrayValueControl.cs	(revision 17430)
+++ 	(revision )
@@ -1,37 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows.Forms;
-
-namespace HeuristicLab.JsonInterface.OptimizerIntegration {
-  
-  public class JsonItemIntArrayValueControl : JsonItemArrayValueControl {
-    public JsonItemIntArrayValueControl(IntArrayValueVM vm) : base(vm, vm.Value) { }
-  }
-
-  public class JsonItemDoubleArrayValueControl : JsonItemArrayValueControl {
-    public JsonItemDoubleArrayValueControl(DoubleArrayValueVM vm) : base(vm, vm.Value) { }
-  }
-  
-  public abstract partial class JsonItemArrayValueControl : JsonItemBaseControl {
-    protected NumericRangeControl NumericRangeControl { get; set; }
-
-    public JsonItemArrayValueControl(JsonItemVMBase vm, object dataSource) : base(vm) {
-      InitializeComponent();
-      dataGridView.DataSource = dataSource;
-      NumericRangeControl = numericRangeControl1;
-
-      NumericRangeControl.TBMinRange.DataBindings.Add("Text", VM, nameof(RangedValueBaseVM.MinRange));
-      NumericRangeControl.TBMaxRange.DataBindings.Add("Text", VM, nameof(RangedValueBaseVM.MaxRange));
-      NumericRangeControl.EnableMinRange.DataBindings.Add("Checked", VM, nameof(RangedValueBaseVM.EnableMinRange),
-        false, DataSourceUpdateMode.OnPropertyChanged);
-      NumericRangeControl.EnableMaxRange.DataBindings.Add("Checked", VM, nameof(RangedValueBaseVM.EnableMaxRange),
-        false, DataSourceUpdateMode.OnPropertyChanged);
-    }
-  }
-}
Index: anches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemArrayValueControl.resx
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemArrayValueControl.resx	(revision 17430)
+++ 	(revision )
@@ -1,120 +1,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-</root>
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemMultiValueControl.Designer.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemMultiValueControl.Designer.cs	(revision 17431)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemMultiValueControl.Designer.cs	(revision 17431)
@@ -0,0 +1,72 @@
+﻿namespace HeuristicLab.JsonInterface.OptimizerIntegration {
+  partial class JsonItemMultiValueControl<T> {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.dataGridView = new System.Windows.Forms.DataGridView();
+      this.numericRangeControl1 = new HeuristicLab.JsonInterface.OptimizerIntegration.NumericRangeControl();
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // dataGridView
+      // 
+      this.dataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+      this.dataGridView.Location = new System.Drawing.Point(9, 75);
+      this.dataGridView.Name = "dataGridView";
+      this.dataGridView.Size = new System.Drawing.Size(487, 171);
+      this.dataGridView.TabIndex = 13;
+      // 
+      // numericRangeControl1
+      // 
+      this.numericRangeControl1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.numericRangeControl1.Location = new System.Drawing.Point(9, 252);
+      this.numericRangeControl1.Name = "numericRangeControl1";
+      this.numericRangeControl1.Size = new System.Drawing.Size(487, 128);
+      this.numericRangeControl1.TabIndex = 14;
+      // 
+      // JsonItemArrayValueControl
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.numericRangeControl1);
+      this.Controls.Add(this.dataGridView);
+      this.Name = "JsonItemArrayValueControl";
+      this.Size = new System.Drawing.Size(502, 386);
+      this.Controls.SetChildIndex(this.dataGridView, 0);
+      this.Controls.SetChildIndex(this.numericRangeControl1, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.DataGridView dataGridView;
+    private NumericRangeControl numericRangeControl1;
+  }
+}
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemMultiValueControl.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemMultiValueControl.cs	(revision 17431)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemMultiValueControl.cs	(revision 17431)
@@ -0,0 +1,101 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace HeuristicLab.JsonInterface.OptimizerIntegration {
+
+  public class JsonItemDoubleMatrixValueControl : JsonItemMultiValueControl<double> {
+
+    public JsonItemDoubleMatrixValueControl(DoubleMatrixValueVM vm) : base(vm, vm.Value) { }
+    protected override void SaveCellData(object data, int col, int row) {
+      DoubleMatrixValueVM vm = VM as DoubleMatrixValueVM;
+      vm.SetCellValue(data, col, row);
+    }
+  }
+
+  public class JsonItemIntArrayValueControl : JsonItemMultiValueControl<int> {
+    public JsonItemIntArrayValueControl(IntArrayValueVM vm) : base(vm, vm.Value) { }
+
+    protected override void SaveCellData(object data, int col, int row) {
+      IntArrayValueVM vm = VM as IntArrayValueVM;
+      vm.SetIndexValue(data, row);
+    }
+  }
+
+  public class JsonItemDoubleArrayValueControl : JsonItemMultiValueControl<double> {
+    public JsonItemDoubleArrayValueControl(DoubleArrayValueVM vm) : base(vm, vm.Value) { }
+
+    protected override void SaveCellData(object data, int col, int row) {
+      DoubleArrayValueVM vm = VM as DoubleArrayValueVM;
+      vm.SetIndexValue(data, row);
+    }
+  }
+  
+  public abstract partial class JsonItemMultiValueControl<T> : JsonItemBaseControl {
+    protected NumericRangeControl NumericRangeControl { get; set; }
+
+    public JsonItemMultiValueControl(JsonItemVMBase vm, T[][] matrix) : base(vm) {
+      InitializeComponent();
+      int rows = matrix.Length;
+      int cols = matrix.Max(x => x.Length);
+
+      // columns must added first
+      for (int c = 0; c < cols; ++c) {
+        dataGridView.Columns.Add($"Column {c}", $"Column {c}");
+      }
+
+      dataGridView.Rows.Add(rows);
+      for (int c = 0; c < cols; ++c) {
+        for(int r = 0; r < rows; ++r) {
+          dataGridView[c, r].Value = matrix[r][c];
+        }
+      }
+
+      dataGridView.CellEndEdit += DataGridView_CellEndEdit;
+      InitRangeBinding();
+    }
+
+    public JsonItemMultiValueControl(JsonItemVMBase vm, T[] array) : base(vm) {
+      InitializeComponent();
+      int length = array.Length;
+
+      dataGridView.Columns.Add("Value", "Value");
+      dataGridView.Rows.Add(length);
+      for(int i = 0; i < length; ++i) {
+        dataGridView[0, i].Value = array[i];
+      }
+      dataGridView.CellEndEdit += DataGridView_CellEndEdit;
+      InitRangeBinding();
+    }
+
+    private void DataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e) {
+      SaveCellData(dataGridView[e.ColumnIndex, e.RowIndex].Value, e.ColumnIndex, e.RowIndex);
+    }
+
+    protected abstract void SaveCellData(object data, int col, int row);
+
+    /*
+public JsonItemMultiValueControl(JsonItemVMBase vm, object dataSource) : base(vm) {
+ InitializeComponent();
+ dataGridView.DataSource = dataSource;
+
+ InitRangeBinding();
+}
+*/
+    private void InitRangeBinding() {
+      NumericRangeControl = numericRangeControl1;
+      NumericRangeControl.TBMinRange.DataBindings.Add("Text", VM, nameof(RangedValueBaseVM.MinRange));
+      NumericRangeControl.TBMaxRange.DataBindings.Add("Text", VM, nameof(RangedValueBaseVM.MaxRange));
+      NumericRangeControl.EnableMinRange.DataBindings.Add("Checked", VM, nameof(RangedValueBaseVM.EnableMinRange),
+        false, DataSourceUpdateMode.OnPropertyChanged);
+      NumericRangeControl.EnableMaxRange.DataBindings.Add("Checked", VM, nameof(RangedValueBaseVM.EnableMaxRange),
+        false, DataSourceUpdateMode.OnPropertyChanged);
+    }
+  }
+}
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemMultiValueControl.resx
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemMultiValueControl.resx	(revision 17431)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemMultiValueControl.resx	(revision 17431)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/GenericJsonItem.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/GenericJsonItem.cs	(revision 17430)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/GenericJsonItem.cs	(revision 17431)
@@ -13,20 +13,22 @@
   public class JsonItem<V,R> : JsonItem {
     public new V Value {
-      get {
-        if(base.Value is IConvertible)
-          return (V)Convert.ChangeType(base.Value, typeof(V));
-
-        if(base.Value is JToken token)
-          return token.ToObject<V>();
-
-        return (V)base.Value;
-      }
+      get => ConvertObject(base.Value);
       set => base.Value = value;
     }
-
+    
     public new IEnumerable<R> Range {
       get => base.Range?.Cast<R>();
       set => base.Range = value.Cast<object>();
     }
+
+    private V ConvertObject(object obj) {
+      if (obj is IConvertible)
+        return (V)Convert.ChangeType(obj, typeof(V));
+
+      if (obj is JToken token)
+        return token.ToObject<V>();
+
+      return (V)obj;
+    }
   }
 }
