Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.Designer.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.Designer.cs	(revision 17444)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.Designer.cs	(revision 17446)
@@ -29,7 +29,6 @@
       this.treeView = new System.Windows.Forms.TreeView();
       this.groupBoxDetails = new System.Windows.Forms.GroupBox();
-      this.panel = new System.Windows.Forms.Panel();
+      this.panelParameterDetails = new System.Windows.Forms.Panel();
       this.resultItems = new System.Windows.Forms.CheckedListBox();
-      this.groupBox2 = new System.Windows.Forms.GroupBox();
       this.groupBox3 = new System.Windows.Forms.GroupBox();
       this.treeViewResults = new System.Windows.Forms.TreeView();
@@ -41,7 +40,9 @@
       this.textBoxTemplateName = new System.Windows.Forms.TextBox();
       this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.groupBox = new System.Windows.Forms.GroupBox();
+      this.panelResultDetails = new System.Windows.Forms.Panel();
       this.jsonItemBindingSource = new System.Windows.Forms.BindingSource(this.components);
       this.groupBoxDetails.SuspendLayout();
-      this.groupBox2.SuspendLayout();
       this.groupBox3.SuspendLayout();
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit();
@@ -53,4 +54,9 @@
       this.tabPage2.SuspendLayout();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.groupBox.SuspendLayout();
       ((System.ComponentModel.ISupportInitialize)(this.jsonItemBindingSource)).BeginInit();
       this.SuspendLayout();
@@ -65,5 +71,5 @@
       // 
       this.exportButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-      this.exportButton.Location = new System.Drawing.Point(629, 578);
+      this.exportButton.Location = new System.Drawing.Point(630, 575);
       this.exportButton.Name = "exportButton";
       this.exportButton.Size = new System.Drawing.Size(191, 29);
@@ -75,11 +81,9 @@
       // treeView
       // 
-      this.treeView.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.treeView.CheckBoxes = true;
-      this.treeView.Location = new System.Drawing.Point(6, 19);
+      this.treeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.treeView.Location = new System.Drawing.Point(0, 6);
       this.treeView.Name = "treeView";
-      this.treeView.Size = new System.Drawing.Size(352, 471);
+      this.treeView.Size = new System.Drawing.Size(370, 493);
       this.treeView.TabIndex = 3;
       this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterSelect);
@@ -87,49 +91,31 @@
       // groupBoxDetails
       // 
-      this.groupBoxDetails.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.groupBoxDetails.Controls.Add(this.panel);
-      this.groupBoxDetails.Location = new System.Drawing.Point(3, 0);
+      this.groupBoxDetails.Controls.Add(this.panelParameterDetails);
+      this.groupBoxDetails.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.groupBoxDetails.Location = new System.Drawing.Point(0, 0);
       this.groupBoxDetails.Name = "groupBoxDetails";
-      this.groupBoxDetails.Size = new System.Drawing.Size(415, 496);
+      this.groupBoxDetails.Size = new System.Drawing.Size(422, 499);
       this.groupBoxDetails.TabIndex = 4;
       this.groupBoxDetails.TabStop = false;
       this.groupBoxDetails.Text = "Details";
       // 
-      // panel
-      // 
-      this.panel.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.panel.AutoScroll = true;
-      this.panel.Location = new System.Drawing.Point(7, 20);
-      this.panel.Name = "panel";
-      this.panel.Size = new System.Drawing.Size(402, 470);
-      this.panel.TabIndex = 0;
+      // panelParameterDetails
+      // 
+      this.panelParameterDetails.AutoScroll = true;
+      this.panelParameterDetails.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.panelParameterDetails.Location = new System.Drawing.Point(3, 16);
+      this.panelParameterDetails.Name = "panelParameterDetails";
+      this.panelParameterDetails.Size = new System.Drawing.Size(416, 480);
+      this.panelParameterDetails.TabIndex = 0;
       // 
       // resultItems
       // 
-      this.resultItems.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.resultItems.Dock = System.Windows.Forms.DockStyle.Fill;
       this.resultItems.FormattingEnabled = true;
-      this.resultItems.Location = new System.Drawing.Point(6, 364);
+      this.resultItems.Location = new System.Drawing.Point(0, 6);
       this.resultItems.Name = "resultItems";
-      this.resultItems.Size = new System.Drawing.Size(777, 124);
+      this.resultItems.Size = new System.Drawing.Size(373, 393);
       this.resultItems.TabIndex = 5;
-      // 
-      // groupBox2
-      // 
-      this.groupBox2.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.groupBox2.Controls.Add(this.treeView);
-      this.groupBox2.Location = new System.Drawing.Point(0, 0);
-      this.groupBox2.Name = "groupBox2";
-      this.groupBox2.Size = new System.Drawing.Size(364, 496);
-      this.groupBox2.TabIndex = 6;
-      this.groupBox2.TabStop = false;
-      this.groupBox2.Text = "Elements";
+      this.resultItems.SelectedValueChanged += new System.EventHandler(this.resultItems_SelectedValueChanged);
       // 
       // groupBox3
@@ -138,9 +124,9 @@
             | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
+      this.groupBox3.Controls.Add(this.splitContainer1);
       this.groupBox3.Controls.Add(this.treeViewResults);
-      this.groupBox3.Controls.Add(this.resultItems);
       this.groupBox3.Location = new System.Drawing.Point(6, 6);
       this.groupBox3.Name = "groupBox3";
-      this.groupBox3.Size = new System.Drawing.Size(789, 496);
+      this.groupBox3.Size = new System.Drawing.Size(790, 493);
       this.groupBox3.TabIndex = 7;
       this.groupBox3.TabStop = false;
@@ -152,24 +138,23 @@
       this.treeViewResults.Location = new System.Drawing.Point(6, 19);
       this.treeViewResults.Name = "treeViewResults";
-      this.treeViewResults.Size = new System.Drawing.Size(777, 339);
+      this.treeViewResults.Size = new System.Drawing.Size(777, 63);
       this.treeViewResults.TabIndex = 6;
       // 
       // splitContainer2
       // 
-      this.splitContainer2.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.splitContainer2.Location = new System.Drawing.Point(6, 6);
+      this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer2.Location = new System.Drawing.Point(3, 3);
       this.splitContainer2.Name = "splitContainer2";
       // 
       // splitContainer2.Panel1
       // 
-      this.splitContainer2.Panel1.Controls.Add(this.groupBox2);
+      this.splitContainer2.Panel1.Controls.Add(this.treeView);
+      this.splitContainer2.Panel1.Padding = new System.Windows.Forms.Padding(0, 6, 0, 0);
       // 
       // splitContainer2.Panel2
       // 
       this.splitContainer2.Panel2.Controls.Add(this.groupBoxDetails);
-      this.splitContainer2.Size = new System.Drawing.Size(789, 496);
-      this.splitContainer2.SplitterDistance = 367;
+      this.splitContainer2.Size = new System.Drawing.Size(796, 499);
+      this.splitContainer2.SplitterDistance = 370;
       this.splitContainer2.TabIndex = 9;
       // 
@@ -184,5 +169,5 @@
       this.tabControl1.Name = "tabControl1";
       this.tabControl1.SelectedIndex = 0;
-      this.tabControl1.Size = new System.Drawing.Size(809, 534);
+      this.tabControl1.Size = new System.Drawing.Size(810, 531);
       this.tabControl1.TabIndex = 10;
       // 
@@ -193,5 +178,5 @@
       this.tabPage1.Name = "tabPage1";
       this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
-      this.tabPage1.Size = new System.Drawing.Size(801, 508);
+      this.tabPage1.Size = new System.Drawing.Size(802, 505);
       this.tabPage1.TabIndex = 0;
       this.tabPage1.Text = "Parameters";
@@ -204,5 +189,5 @@
       this.tabPage2.Name = "tabPage2";
       this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
-      this.tabPage2.Size = new System.Drawing.Size(801, 508);
+      this.tabPage2.Size = new System.Drawing.Size(802, 505);
       this.tabPage2.TabIndex = 1;
       this.tabPage2.Text = "Results";
@@ -225,5 +210,5 @@
       this.textBoxTemplateName.Location = new System.Drawing.Point(100, 12);
       this.textBoxTemplateName.Name = "textBoxTemplateName";
-      this.textBoxTemplateName.Size = new System.Drawing.Size(720, 20);
+      this.textBoxTemplateName.Size = new System.Drawing.Size(721, 20);
       this.textBoxTemplateName.TabIndex = 12;
       this.textBoxTemplateName.Text = "Template";
@@ -235,4 +220,44 @@
       this.errorProvider.ContainerControl = this;
       // 
+      // splitContainer1
+      // 
+      this.splitContainer1.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.splitContainer1.Location = new System.Drawing.Point(6, 88);
+      this.splitContainer1.Name = "splitContainer1";
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.resultItems);
+      this.splitContainer1.Panel1.Padding = new System.Windows.Forms.Padding(0, 6, 0, 0);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.groupBox);
+      this.splitContainer1.Size = new System.Drawing.Size(778, 399);
+      this.splitContainer1.SplitterDistance = 373;
+      this.splitContainer1.TabIndex = 7;
+      // 
+      // groupBox
+      // 
+      this.groupBox.Controls.Add(this.panelResultDetails);
+      this.groupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.groupBox.Location = new System.Drawing.Point(0, 0);
+      this.groupBox.Name = "groupBox";
+      this.groupBox.Size = new System.Drawing.Size(401, 399);
+      this.groupBox.TabIndex = 5;
+      this.groupBox.TabStop = false;
+      this.groupBox.Text = "Details";
+      // 
+      // panelResultDetails
+      // 
+      this.panelResultDetails.AutoScroll = true;
+      this.panelResultDetails.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.panelResultDetails.Location = new System.Drawing.Point(3, 16);
+      this.panelResultDetails.Name = "panelResultDetails";
+      this.panelResultDetails.Size = new System.Drawing.Size(395, 380);
+      this.panelResultDetails.TabIndex = 0;
+      // 
       // jsonItemBindingSource
       // 
@@ -243,5 +268,5 @@
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.ClientSize = new System.Drawing.Size(833, 619);
+      this.ClientSize = new System.Drawing.Size(834, 616);
       this.Controls.Add(this.textBoxTemplateName);
       this.Controls.Add(this.label1);
@@ -253,5 +278,4 @@
       this.Text = "Export Json";
       this.groupBoxDetails.ResumeLayout(false);
-      this.groupBox2.ResumeLayout(false);
       this.groupBox3.ResumeLayout(false);
       this.splitContainer2.Panel1.ResumeLayout(false);
@@ -263,4 +287,9 @@
       this.tabPage2.ResumeLayout(false);
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
+      this.splitContainer1.ResumeLayout(false);
+      this.groupBox.ResumeLayout(false);
       ((System.ComponentModel.ISupportInitialize)(this.jsonItemBindingSource)).EndInit();
       this.ResumeLayout(false);
@@ -277,7 +306,6 @@
     private System.Windows.Forms.TreeView treeView;
     private System.Windows.Forms.GroupBox groupBoxDetails;
-    private System.Windows.Forms.Panel panel;
+    private System.Windows.Forms.Panel panelParameterDetails;
     private System.Windows.Forms.CheckedListBox resultItems;
-    private System.Windows.Forms.GroupBox groupBox2;
     private System.Windows.Forms.GroupBox groupBox3;
     private System.Windows.Forms.SplitContainer splitContainer2;
@@ -289,4 +317,7 @@
     private System.Windows.Forms.TextBox textBoxTemplateName;
     private System.Windows.Forms.ErrorProvider errorProvider;
+    private System.Windows.Forms.SplitContainer splitContainer1;
+    private System.Windows.Forms.GroupBox groupBox;
+    private System.Windows.Forms.Panel panelResultDetails;
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.cs	(revision 17444)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.cs	(revision 17446)
@@ -18,8 +18,8 @@
     private static FolderBrowserDialog FolderBrowserDialog { get; set; }
     private IDictionary<int, UserControl> Hash2Control { get; set; } = new Dictionary<int, UserControl>();
-    private IDictionary<TreeNode, JsonItemVMBase> Node2VM { get; set; } = new Dictionary<TreeNode, JsonItemVMBase>();
+    private IDictionary<TreeNode, IJsonItemVM> Node2VM { get; set; } = new Dictionary<TreeNode, IJsonItemVM>();
     private IJsonItem Root { get; set; }
     private IOptimizer Optimizer { get; set; }
-    private IList<JsonItemVMBase> VMs { get; set; }
+    private IList<IJsonItemVM> VMs { get; set; }
     private JCGenerator Generator { get; set; } = new JCGenerator();
     private IDictionary<string, IJsonItem> ResultItems { get; set; } = new Dictionary<string, IJsonItem>();
@@ -31,5 +31,5 @@
         content = value;
 
-        VMs = new List<JsonItemVMBase>();
+        VMs = new List<IJsonItemVM>();
         treeView.Nodes.Clear();
         ResultItems.Clear();
@@ -49,5 +49,5 @@
     private void TreeView_AfterCheck(object sender, TreeViewEventArgs e) {
       if (e.Action != TreeViewAction.Unknown) {
-        if (Node2VM.TryGetValue(e.Node, out JsonItemVMBase vm)) {
+        if (Node2VM.TryGetValue(e.Node, out IJsonItemVM vm)) {
           vm.Selected = e.Node.Checked;
         }
@@ -72,5 +72,5 @@
     private void exportButton_Click(object sender, EventArgs e) {
       foreach (var x in VMs) {
-        if (!x.Selected) {
+        if (!(x is ResultItemVM) && !x.Selected) {
           x.Item.Parent.Children.Remove(x.Item);
         }
@@ -104,36 +104,44 @@
         if (FolderBrowserDialog.ShowDialog() == DialogResult.OK) {
           Generator.GenerateTemplate(FolderBrowserDialog.SelectedPath, textBoxTemplateName.Text, Optimizer, Root);
+          Close();
         }
-
-        Close();
       }
     }
 
     private void BuildTreeNode(TreeNode node, IJsonItem item) {
+      RegisterItem(node, item);
+      if (item.Children != null) {
+        foreach (var c in item.Children) {
+          if (IsDrawableItem(c)) {
+            if (c is ResultItem) {
+              resultItems.Items.Add(c.Name, true);
+              ResultItems.Add(c.Name, c);
+              TreeNode childNode = new TreeNode(c.Name);
+              treeViewResults.Nodes.Add(childNode);
+              RegisterItem(childNode, c);
+              //Hash2Control.Add(c.GetHashCode(), new JsonItemBaseControl(new JsonItemVMBase() { Item = c }));
+            } else {
+              TreeNode childNode = new TreeNode(c.Name);
+              node.Nodes.Add(childNode);
+              BuildTreeNode(childNode, c);
+            }
+          }
+        }
+      }
+    }
+
+    private void RegisterItem(TreeNode node, IJsonItem item) {
       if (JI2VM.TryGetValue(item.GetType(), out Type vmType)) {
-        JsonItemVMBase vm = (JsonItemVMBase)Activator.CreateInstance(vmType);
-        VMs.Add(vm);
+        IJsonItemVM vm = (IJsonItemVM)Activator.CreateInstance(vmType);
+
         vm.Item = item;
         vm.TreeNode = node;
         vm.TreeView = treeView;
+        node.Checked = vm.Selected;
+
+        VMs.Add(vm);
         Node2VM.Add(node, vm);
-        node.Checked = vm.Selected;
-        UserControl control = vm.GetControl();
+        UserControl control = vm.Control;
         Hash2Control.Add(node.GetHashCode(), control);
-        if (item.Children != null) {
-          foreach (var c in item.Children) {
-            if (IsDrawableItem(c)) {
-              if (c is ResultItem) {
-                resultItems.Items.Add(c.Name, true);
-                
-                ResultItems.Add(c.Name, c);
-              } else {
-                TreeNode childNode = new TreeNode(c.Name);
-                node.Nodes.Add(childNode);
-                BuildTreeNode(childNode, c);
-              }
-            }
-          }
-        }
       }
     }
@@ -152,13 +160,5 @@
     private void treeView_AfterSelect(object sender, TreeViewEventArgs e) {
       if(Hash2Control.TryGetValue(treeView.SelectedNode.GetHashCode(), out UserControl control)) {
-        panel.Controls.Clear();
-        if (control != null) {
-          panel.Controls.Add(control);
-          control.Width = panel.Width;
-          control.Height = panel.Height;
-          control.Dock = DockStyle.Fill;
-          control.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
-        }
-        panel.Refresh();
+        SetControlOnPanel(control, panelParameterDetails);
       }
     }
@@ -172,4 +172,23 @@
       }
     }
+
+    private void resultItems_SelectedValueChanged(object sender, EventArgs e) {
+      if(ResultItems.TryGetValue(resultItems.SelectedItem.ToString(), out IJsonItem item) &&
+        Hash2Control.TryGetValue(item.GetHashCode(), out UserControl control)) {
+        SetControlOnPanel(control, panelResultDetails);
+      }
+    }
+
+    private void SetControlOnPanel(UserControl control, Panel panel) {
+      panel.Controls.Clear();
+      if (control != null) {
+        panel.Controls.Add(control);
+        control.Width = panel.Width;
+        control.Height = panel.Height;
+        control.Dock = DockStyle.Fill;
+        control.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
+      }
+      panel.Refresh();
+    }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemBoolControl.Designer.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemBoolControl.Designer.cs	(revision 17444)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemBoolControl.Designer.cs	(revision 17446)
@@ -26,4 +26,5 @@
       this.checkBoxValue = new System.Windows.Forms.CheckBox();
       this.label2 = new System.Windows.Forms.Label();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.SuspendLayout();
       // 
@@ -42,5 +43,5 @@
       // 
       this.label2.AutoSize = true;
-      this.label2.Location = new System.Drawing.Point(6, 101);
+      this.label2.Location = new System.Drawing.Point(6, 102);
       this.label2.Name = "label2";
       this.label2.Size = new System.Drawing.Size(34, 13);
@@ -54,8 +55,10 @@
       this.Controls.Add(this.label2);
       this.Controls.Add(this.checkBoxValue);
+      this.errorProvider.SetIconAlignment(this, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
       this.Name = "JsonItemBoolControl";
-      this.Size = new System.Drawing.Size(500, 140);
+      this.Size = new System.Drawing.Size(500, 121);
       this.Controls.SetChildIndex(this.checkBoxValue, 0);
       this.Controls.SetChildIndex(this.label2, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
       this.ResumeLayout(false);
       this.PerformLayout();
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemBoolControl.resx
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemBoolControl.resx	(revision 17444)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemBoolControl.resx	(revision 17446)
@@ -118,3 +118,6 @@
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
 </root>
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemMultiValueControl.Designer.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemMultiValueControl.Designer.cs	(revision 17444)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemMultiValueControl.Designer.cs	(revision 17446)
@@ -26,16 +26,27 @@
       this.dataGridView = new System.Windows.Forms.DataGridView();
       this.numericRangeControl1 = new HeuristicLab.JsonInterface.OptimizerIntegration.NumericRangeControl();
+      this.groupBox1 = new System.Windows.Forms.GroupBox();
+      this.textBoxRows = new System.Windows.Forms.TextBox();
+      this.checkBoxColumns = new System.Windows.Forms.CheckBox();
+      this.checkBoxRows = new System.Windows.Forms.CheckBox();
+      this.textBoxColumns = new System.Windows.Forms.TextBox();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+      this.groupBox1.SuspendLayout();
       this.SuspendLayout();
       // 
       // dataGridView
       // 
+      this.dataGridView.AllowUserToAddRows = false;
+      this.dataGridView.AllowUserToDeleteRows = false;
+      this.dataGridView.AllowUserToResizeColumns = false;
+      this.dataGridView.AllowUserToResizeRows = false;
       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, 101);
+      this.dataGridView.Location = new System.Drawing.Point(6, 67);
       this.dataGridView.Name = "dataGridView";
-      this.dataGridView.Size = new System.Drawing.Size(487, 208);
+      this.dataGridView.Size = new System.Drawing.Size(473, 192);
       this.dataGridView.TabIndex = 13;
       // 
@@ -44,8 +55,71 @@
       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, 315);
+      this.numericRangeControl1.Location = new System.Drawing.Point(9, 372);
       this.numericRangeControl1.Name = "numericRangeControl1";
-      this.numericRangeControl1.Size = new System.Drawing.Size(487, 128);
+      this.numericRangeControl1.Size = new System.Drawing.Size(487, 71);
       this.numericRangeControl1.TabIndex = 14;
+      // 
+      // groupBox1
+      // 
+      this.groupBox1.Controls.Add(this.textBoxColumns);
+      this.groupBox1.Controls.Add(this.textBoxRows);
+      this.groupBox1.Controls.Add(this.checkBoxColumns);
+      this.groupBox1.Controls.Add(this.checkBoxRows);
+      this.groupBox1.Controls.Add(this.dataGridView);
+      this.groupBox1.Location = new System.Drawing.Point(9, 101);
+      this.groupBox1.Name = "groupBox1";
+      this.groupBox1.Size = new System.Drawing.Size(485, 265);
+      this.groupBox1.TabIndex = 15;
+      this.groupBox1.TabStop = false;
+      this.groupBox1.Text = "Value";
+      this.groupBox1.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)));
+      // 
+      // textBoxRows
+      // 
+      this.textBoxRows.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.errorProvider.SetIconAlignment(this.textBoxRows, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.textBoxRows.Location = new System.Drawing.Point(83, 17);
+      this.textBoxRows.Name = "textBoxRows";
+      this.textBoxRows.ReadOnly = true;
+      this.textBoxRows.Size = new System.Drawing.Size(396, 20);
+      this.textBoxRows.TabIndex = 16;
+      this.textBoxRows.TextChanged += new System.EventHandler(this.textBoxRows_TextChanged);
+      this.textBoxRows.Validating += new System.ComponentModel.CancelEventHandler(this.textBoxRows_Validating);
+      // 
+      // checkBoxColumns
+      // 
+      this.checkBoxColumns.AutoSize = true;
+      this.checkBoxColumns.Location = new System.Drawing.Point(7, 43);
+      this.checkBoxColumns.Name = "checkBoxColumns";
+      this.checkBoxColumns.Size = new System.Drawing.Size(69, 17);
+      this.checkBoxColumns.TabIndex = 15;
+      this.checkBoxColumns.Text = "Columns:";
+      this.checkBoxColumns.UseVisualStyleBackColor = true;
+      // 
+      // checkBoxRows
+      // 
+      this.checkBoxRows.AutoSize = true;
+      this.checkBoxRows.Location = new System.Drawing.Point(7, 20);
+      this.checkBoxRows.Name = "checkBoxRows";
+      this.checkBoxRows.Size = new System.Drawing.Size(56, 17);
+      this.checkBoxRows.TabIndex = 14;
+      this.checkBoxRows.Text = "Rows:";
+      this.checkBoxRows.UseVisualStyleBackColor = true;
+      // 
+      // textBoxColumns
+      // 
+      this.textBoxColumns.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.errorProvider.SetIconAlignment(this.textBoxColumns, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.textBoxColumns.Location = new System.Drawing.Point(83, 43);
+      this.textBoxColumns.Name = "textBoxColumns";
+      this.textBoxColumns.ReadOnly = true;
+      this.textBoxColumns.Size = new System.Drawing.Size(396, 20);
+      this.textBoxColumns.TabIndex = 17;
+      this.textBoxColumns.TextChanged += new System.EventHandler(this.textBoxColumns_TextChanged);
+      this.textBoxColumns.Validating += new System.ComponentModel.CancelEventHandler(this.textBoxColumns_Validating);
       // 
       // JsonItemMultiValueControl
@@ -53,11 +127,15 @@
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.groupBox1);
       this.Controls.Add(this.numericRangeControl1);
-      this.Controls.Add(this.dataGridView);
+      this.errorProvider.SetIconAlignment(this, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
       this.Name = "JsonItemMultiValueControl";
       this.Size = new System.Drawing.Size(502, 449);
-      this.Controls.SetChildIndex(this.dataGridView, 0);
       this.Controls.SetChildIndex(this.numericRangeControl1, 0);
+      this.Controls.SetChildIndex(this.groupBox1, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
       ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+      this.groupBox1.ResumeLayout(false);
+      this.groupBox1.PerformLayout();
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -69,4 +147,9 @@
     private System.Windows.Forms.DataGridView dataGridView;
     private NumericRangeControl numericRangeControl1;
+    private System.Windows.Forms.GroupBox groupBox1;
+    private System.Windows.Forms.CheckBox checkBoxColumns;
+    private System.Windows.Forms.CheckBox checkBoxRows;
+    private System.Windows.Forms.TextBox textBoxRows;
+    private System.Windows.Forms.TextBox textBoxColumns;
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemMultiValueControl.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemMultiValueControl.cs	(revision 17444)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemMultiValueControl.cs	(revision 17446)
@@ -14,7 +14,7 @@
 
     public JsonItemDoubleMatrixValueControl(DoubleMatrixValueVM vm) : base(vm, vm.Value) { }
-    protected override void SaveCellData(object data, int col, int row) {
+    protected override void SaveCellData(double data, int row, int col) {
       DoubleMatrixValueVM vm = VM as DoubleMatrixValueVM;
-      vm.SetCellValue(data, col, row);
+      vm.SetCellValue(data, row, col);
     }
   }
@@ -23,5 +23,5 @@
     public JsonItemIntArrayValueControl(IntArrayValueVM vm) : base(vm, vm.Value) { }
 
-    protected override void SaveCellData(object data, int col, int row) {
+    protected override void SaveCellData(int data, int row, int col) {
       IntArrayValueVM vm = VM as IntArrayValueVM;
       vm.SetIndexValue(data, row);
@@ -32,5 +32,5 @@
     public JsonItemDoubleArrayValueControl(DoubleArrayValueVM vm) : base(vm, vm.Value) { }
 
-    protected override void SaveCellData(object data, int col, int row) {
+    protected override void SaveCellData(double data, int row, int col) {
       DoubleArrayValueVM vm = VM as DoubleArrayValueVM;
       vm.SetIndexValue(data, row);
@@ -40,44 +40,115 @@
   public abstract partial class JsonItemMultiValueControl<T> : JsonItemBaseControl {
     protected NumericRangeControl NumericRangeControl { get; set; }
-
-    public JsonItemMultiValueControl(JsonItemVMBase vm, T[][] matrix) : base(vm) {
+    private int _rows;
+    private int Rows {
+      get => _rows;
+      set {
+        _rows = value;
+        RefreshMatrix();
+      }
+    }
+
+    private int _cols;
+    private int Columns {
+      get => _cols; 
+      set {
+        _cols = value;
+        RefreshMatrix();
+      } 
+    }
+
+    private T[][] Matrix { get; set; }
+
+    public JsonItemMultiValueControl(IMatrixJsonItemVM vm, T[][] matrix) : base(vm) {
       InitializeComponent();
+
+      checkBoxRows.DataBindings.Add("Checked", vm, nameof(IMatrixJsonItemVM.RowsResizable));
+      checkBoxColumns.DataBindings.Add("Checked", vm, nameof(IMatrixJsonItemVM.ColumnsResizable));
+
       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];
-        }
-      }
-
+      Matrix = matrix;
+      _cols = cols;
+      _rows = rows;
+      RefreshMatrix();
+      InitSizeConfiguration(rows, cols);
       dataGridView.CellEndEdit += DataGridView_CellEndEdit;
       InitRangeBinding();
     }
-
-    public JsonItemMultiValueControl(JsonItemVMBase vm, T[] array) : base(vm) {
+    
+    public JsonItemMultiValueControl(IArrayJsonItemVM vm, T[] array) : base(vm) {
       InitializeComponent();
+
+      checkBoxRows.DataBindings.Add("Checked", vm, nameof(IArrayJsonItemVM.Resizable));
+
       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];
-      }
+      Matrix = new T[array.Length][];
+      for (int r = 0; r < length; ++r) {
+        Matrix[r] = new T[1];
+        Matrix[r][0] = array[r];
+      }
+
+      _cols = 1;
+      _rows = length;
+      RefreshMatrix();
+
+      InitSizeConfiguration(length, null);
       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);
+    
+    protected abstract void SaveCellData(T data, int row, int col);
+
+    private void InitSizeConfiguration(int? rows, int? columns) {
+      if(rows != null) {
+        checkBoxRows.CheckedChanged += CheckBoxRows_CheckedChanged;
+        textBoxRows.Text = rows.ToString();
+      } else {
+        checkBoxRows.Enabled = false;
+        textBoxRows.ReadOnly = true;
+      }
+
+      if (columns != null) {
+        checkBoxColumns.CheckedChanged += CheckBoxColumns_CheckedChanged;
+        textBoxColumns.Text = columns.ToString();
+      } else {
+        checkBoxColumns.Enabled = false;
+        textBoxColumns.ReadOnly = true;
+      }
+    }
+
+    private void RefreshMatrix() {
+      dataGridView.Rows.Clear();
+      dataGridView.Columns.Clear();
+
+      T[][] tmp = Matrix;
+      Matrix = new T[Rows][];
+
+      // columns must added first
+      for(int c = 0; c < Columns; ++c) {
+        dataGridView.Columns.Add($"Column {c}", $"Column {c}");
+      }
+
+      for (int r = 0; r < Rows; ++r) {
+        T[] newCol = new T[Columns];
+        if(r < tmp.Length)
+          Array.Copy(tmp[r], 0, newCol, 0, Math.Min(tmp[r].Length, Columns));
+        Matrix[r] = newCol;
+      }
+
+      if(Rows > 0 && Columns > 0) {
+        dataGridView.Rows.Add(Rows);
+        for (int c = 0; c < Columns; ++c) {
+          for (int r = 0; r < Rows; ++r) {
+            //col and row is switched for dataGridView
+            dataGridView[c, r].Value = Matrix[r][c];
+            dataGridView.Rows[r].HeaderCell.Value = $"Row {r}";
+          }
+        }
+      }
+      dataGridView.RowHeadersWidth = 100;
+    }
 
     private void InitRangeBinding() {
@@ -90,4 +161,62 @@
         false, DataSourceUpdateMode.OnPropertyChanged);
     }
+
+    private void textBoxRows_Validating(object sender, CancelEventArgs e) {
+      if (string.IsNullOrWhiteSpace(textBoxRows.Text)) {
+        errorProvider.SetError(textBoxRows, "'Rows' must not be empty.");
+        e.Cancel = true;
+      } else if (!int.TryParse(textBoxRows.Text, out int r)) {
+        errorProvider.SetError(textBoxRows, "Value of 'Rows' must be an integer.");
+        e.Cancel = true;
+      } else if (r == 0) {
+        errorProvider.SetError(textBoxRows, "Value of 'Rows' must be an integer larger than 0.");
+        e.Cancel = true;
+      } else {
+        errorProvider.SetError(textBoxRows, null);
+      }
+    }
+
+    private void textBoxColumns_Validating(object sender, CancelEventArgs e) {
+      if (string.IsNullOrWhiteSpace(textBoxColumns.Text)) {
+        errorProvider.SetError(textBoxColumns, "'Columns' must not be empty.");
+        e.Cancel = true;
+      } else if (!int.TryParse(textBoxColumns.Text, out int r)) {
+        errorProvider.SetError(textBoxColumns, "Value of 'Columns' must be an integer.");
+        e.Cancel = true;
+      } else if (r == 0) {
+        errorProvider.SetError(textBoxColumns, "Value of 'Columns' must be an integer larger than 0.");
+        e.Cancel = true;
+      } else {
+        errorProvider.SetError(textBoxColumns, null);
+      }
+    }
+    
+    private void textBoxRows_TextChanged(object sender, EventArgs e) {
+      if(int.TryParse(textBoxRows.Text, out int r)) {
+        Rows = r;
+      }
+    }
+
+    private void textBoxColumns_TextChanged(object sender, EventArgs e) {
+      if (int.TryParse(textBoxColumns.Text, out int c)) {
+        Columns = c;
+      }
+    }
+
+    private void CheckBoxColumns_CheckedChanged(object sender, EventArgs e) {
+      textBoxColumns.ReadOnly = !checkBoxColumns.Checked;
+    }
+
+    private void CheckBoxRows_CheckedChanged(object sender, EventArgs e) {
+      textBoxRows.ReadOnly = !checkBoxRows.Checked;
+    }
+
+    private void DataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e) {
+      object val = dataGridView[e.ColumnIndex, e.RowIndex].Value;
+      Matrix[e.RowIndex][e.ColumnIndex] = (T)Convert.ChangeType(val.ToString().Replace(",", "."),
+                                            typeof(T),
+                                            System.Globalization.CultureInfo.InvariantCulture);
+      SaveCellData(Matrix[e.RowIndex][e.ColumnIndex], e.RowIndex, e.ColumnIndex);
+    }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemMultiValueControl.resx
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemMultiValueControl.resx	(revision 17444)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemMultiValueControl.resx	(revision 17446)
@@ -118,3 +118,6 @@
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
 </root>
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemValidValuesControl.Designer.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemValidValuesControl.Designer.cs	(revision 17444)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemValidValuesControl.Designer.cs	(revision 17446)
@@ -35,5 +35,4 @@
       this.tableOptions.AutoScroll = true;
       this.tableOptions.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
-      this.tableOptions.BackColor = System.Drawing.SystemColors.Control;
       this.tableOptions.ColumnCount = 2;
       this.tableOptions.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
