Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/HeuristicLab.JsonInterface.OptimizerIntegration.csproj
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/HeuristicLab.JsonInterface.OptimizerIntegration.csproj	(revision 17410)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/HeuristicLab.JsonInterface.OptimizerIntegration.csproj	(revision 17411)
@@ -133,5 +133,4 @@
       <DependentUpon>JsonItemValidValuesControl.cs</DependentUpon>
     </Compile>
-    <Compile Include="ViewModels\JsonItemVM.cs" />
     <Compile Include="MenuItems\ImportJsonTemplateMenuItem.cs" />
     <Compile Include="MenuItems\ExportJsonTemplateMenuItem.cs" />
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Shared/NumericRangeControl.Designer.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Shared/NumericRangeControl.Designer.cs	(revision 17410)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Shared/NumericRangeControl.Designer.cs	(revision 17411)
@@ -43,5 +43,4 @@
       this.textBoxFrom.Size = new System.Drawing.Size(164, 20);
       this.textBoxFrom.TabIndex = 2;
-      this.textBoxFrom.Leave += new System.EventHandler(this.textBoxFrom_Leave);
       // 
       // label6
@@ -81,5 +80,4 @@
       this.checkBoxFrom.TabIndex = 4;
       this.checkBoxFrom.UseVisualStyleBackColor = true;
-      this.checkBoxFrom.CheckStateChanged += new System.EventHandler(this.checkBoxFrom_CheckStateChanged);
       // 
       // checkBoxTo
@@ -91,5 +89,4 @@
       this.checkBoxTo.TabIndex = 7;
       this.checkBoxTo.UseVisualStyleBackColor = true;
-      this.checkBoxTo.CheckStateChanged += new System.EventHandler(this.checkBoxTo_CheckStateChanged);
       // 
       // textBoxTo
@@ -102,5 +99,4 @@
       this.textBoxTo.Size = new System.Drawing.Size(164, 20);
       this.textBoxTo.TabIndex = 6;
-      this.textBoxTo.Leave += new System.EventHandler(this.textBoxTo_Leave);
       // 
       // label1
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Shared/NumericRangeControl.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Shared/NumericRangeControl.cs	(revision 17410)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Shared/NumericRangeControl.cs	(revision 17411)
@@ -12,72 +12,24 @@
 namespace HeuristicLab.JsonInterface.OptimizerIntegration {
   public partial class NumericRangeControl : UserControl {
-
-    private JsonItemVM vm;
-    public JsonItemVM VM {
-      get => vm; 
-      set {
-        vm = value;
-        Init();
-      } 
-    }
-    public bool IsDouble { get; set; }
-
+    public TextBox TBMinRange { get; set; }
+    public TextBox TBMaxRange { get; set; }
+    public CheckBox EnableMinRange { get; set; }
+    public CheckBox EnableMaxRange { get; set; }
     public NumericRangeControl() {
       InitializeComponent();
-      Init();
+      TBMinRange = textBoxFrom;
+      TBMaxRange = textBoxTo;
+      EnableMinRange = checkBoxFrom;
+      EnableMaxRange = checkBoxTo;
+      checkBoxFrom.CheckedChanged += ToggleFromInput;
+      checkBoxTo.CheckedChanged += ToggleToInput;
     }
 
-    private void Init() {
-      textBoxFrom.Text = "";
-      textBoxTo.Text = "";
-      textBoxFrom.ReadOnly = true;
-      textBoxTo.ReadOnly = true;
-      checkBoxFrom.Checked = false;
-      checkBoxFrom.Checked = false;
-    }
-    
-    private void checkBoxFrom_CheckStateChanged(object sender, EventArgs e) {
-      textBoxFrom.ReadOnly = !checkBoxFrom.Checked;
-      textBoxFrom.Text = "";
-      if(!checkBoxFrom.Checked)
-        SetRange();
+    private void ToggleToInput(object sender, EventArgs e) {
+      textBoxTo.ReadOnly = !checkBoxTo.Checked;
     }
 
-    private void checkBoxTo_CheckStateChanged(object sender, EventArgs e) {
-      textBoxTo.ReadOnly = !checkBoxTo.Checked;
-      textBoxTo.Text = "";
-      if (!checkBoxTo.Checked)
-        SetRange();
-    }
-
-    private void textBoxFrom_Leave(object sender, EventArgs e) {
-      if (checkBoxFrom.Checked)
-        SetRange();
-    }
-
-    private void textBoxTo_Leave(object sender, EventArgs e) {
-      if (checkBoxTo.Checked)
-        SetRange();
-    }
-
-    private void SetRange() {
-      object[] range = new object[2];
-      if (checkBoxFrom.Checked && !string.IsNullOrWhiteSpace(textBoxFrom.Text))
-        range[0] = Parse(textBoxFrom.Text);
-      else
-        range[0] = IsDouble ? double.MinValue : int.MinValue;
-
-      if (checkBoxTo.Checked && !string.IsNullOrWhiteSpace(textBoxTo.Text))
-        range[1] = Parse(textBoxTo.Text);
-      else
-        range[1] = IsDouble ? double.MinValue : int.MinValue;
-      VM.Item.Range = range;
-    }
-
-    private object Parse(string s) {
-      if (IsDouble) {
-        return double.Parse(s.Replace(",", "."), NumberStyles.Any, CultureInfo.InvariantCulture);
-      }
-      return int.Parse(s);
+    private void ToggleFromInput(object sender, EventArgs e) {
+      textBoxFrom.ReadOnly = !checkBoxFrom.Checked;
     }
   }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/JsonItemVM.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/JsonItemVM.cs	(revision 17410)
+++ 	(revision )
@@ -1,78 +1,0 @@
-﻿using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows.Forms;
-
-namespace HeuristicLab.JsonInterface.OptimizerIntegration {
-
-  //TODO: controls/views only initcomponents and delegate events to this, this has parsers and other actions?
-  // maybe different VMs?
-  public class JsonItemVM : JsonItemVMBase {
-
-    public override Type JsonItemType => typeof(JsonItem);
-
-    //protected IJsonItemValueParser Parser { get; set; }
-    //child tree
-    //private IList<JsonItemVM> nodes = new List<JsonItemVM>();
-
-    //public IEnumerable<JsonItemVM> Nodes { get => nodes; }
-    //public JsonItemVM Parent { get; private set; }
-
-
-    private bool selected = true;
-    public bool Selected {
-      get => selected;
-      set {
-        selected = value;
-        OnPropertyChange(this, nameof(Selected));
-      }
-    }
-
-    public string Name {
-      get => Item.Name;
-      set {
-        Item.Name = value;
-        OnPropertyChange(this, nameof(Name));
-      }
-    }
-
-    public string ActualName {
-      get => Item.ActualName;
-      set {
-        Item.ActualName = value;
-        OnPropertyChange(this, nameof(ActualName));
-      }
-    }
-    public override JsonItemBaseControl GetControl() {
-      return new JsonItemBaseControl(this);
-    }
-
-
-    /*
-    public abstract UserControl Control { get; }
-
-    public void OnSelectChange(object sender, EventArgs e) {
-      CheckBox checkBox = sender as CheckBox;
-      Selected = checkBox.Checked;
-    }
-
-    public void OnNameChange(object sender, EventArgs e) {
-      TextBox textBox = sender as TextBox;
-      Item.Name = textBox.Text;
-    }
-
-    public void OnActualNameChange(object sender, EventArgs e) {
-      TextBox textBox = sender as TextBox;
-      Item.ActualName = textBox.Text;
-    }
-
-    public abstract void OnValueChange(object sender, EventArgs e);
-
-    public abstract void OnRangeChange(object sender, EventArgs e);
-    */
-  }
-}
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/JsonItemVMBase.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/JsonItemVMBase.cs	(revision 17410)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/JsonItemVMBase.cs	(revision 17411)
@@ -7,5 +7,5 @@
 
 namespace HeuristicLab.JsonInterface.OptimizerIntegration {
-  public abstract class JsonItemVMBase : INotifyPropertyChanged {
+  public class JsonItemVMBase : INotifyPropertyChanged {
     public event PropertyChangedEventHandler PropertyChanged;
     public IJsonItem Item { get; set; }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/RangeVM.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/RangeVM.cs	(revision 17410)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/RangeVM.cs	(revision 17411)
@@ -18,5 +18,5 @@
   }
 
-  public abstract class RangeVM<T> : JsonItemVM {
+  public abstract class RangeVM<T> : JsonItemVMBase {
 
     public T MinValue {
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/SingleValueVM.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/SingleValueVM.cs	(revision 17410)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/SingleValueVM.cs	(revision 17411)
@@ -10,4 +10,8 @@
   public class IntValueVM : SingleValueVM<int> {
     public override Type JsonItemType => typeof(IntJsonItem);
+
+    protected override int MinTypeValue => int.MinValue;
+    protected override int MaxTypeValue => int.MaxValue;
+
     public override JsonItemBaseControl GetControl() =>
       new JsonItemIntValueControl(this);
@@ -15,5 +19,9 @@
 
   public class DoubleValueVM : SingleValueVM<double> {
-    public override Type JsonItemType => typeof(DoubleJsonItem); 
+    public override Type JsonItemType => typeof(DoubleJsonItem);
+
+    protected override double MinTypeValue => double.MinValue;
+    protected override double MaxTypeValue => double.MaxValue;
+
     public override JsonItemBaseControl GetControl() =>
        new JsonItemDoubleValueControl(this);
@@ -22,9 +30,13 @@
   public class BoolValueVM : SingleValueVM<bool> {
     public override Type JsonItemType => typeof(BoolJsonItem);
+
+    protected override bool MinTypeValue => false;
+    protected override bool MaxTypeValue => true;
+
     public override JsonItemBaseControl GetControl() =>
        new JsonItemBoolControl(this);
   }
 
-  public abstract class SingleValueVM<T> : JsonItemVM {
+  public abstract class SingleValueVM<T> : JsonItemVMBase {
     
     public T Value { 
@@ -52,4 +64,26 @@
     }
 
+    private bool enableMinRange = false;
+    public bool EnableMinRange {
+      get => enableMinRange;
+      set {
+        enableMinRange = value;
+        if (!enableMinRange)
+          MinRange = MinTypeValue;
+        OnPropertyChange(this, nameof(EnableMinRange));
+      }
+    }
+
+    private bool enableMaxRange = false;
+    public bool EnableMaxRange {
+      get => enableMaxRange;
+      set {
+        enableMaxRange = value;
+        if (!enableMaxRange)
+          MaxRange = MaxTypeValue;
+        OnPropertyChange(this, nameof(EnableMaxRange));
+      }
+    }
+
     private T Cast(object obj) => (T)Convert.ChangeType(obj, typeof(T));
 
@@ -59,4 +93,6 @@
     }
 
+    protected abstract T MinTypeValue { get; }
+    protected abstract T MaxTypeValue { get; }
   }
 }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/StringValueVM.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/StringValueVM.cs	(revision 17410)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/ViewModels/StringValueVM.cs	(revision 17411)
@@ -6,5 +6,5 @@
 
 namespace HeuristicLab.JsonInterface.OptimizerIntegration {
-  public class StringValueVM : JsonItemVM {
+  public class StringValueVM : JsonItemVMBase {
     public override Type JsonItemType => typeof(StringJsonItem);
     public override JsonItemBaseControl GetControl() =>
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.cs	(revision 17410)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.cs	(revision 17411)
@@ -16,11 +16,12 @@
 namespace HeuristicLab.JsonInterface.OptimizerIntegration {
   public partial class ExportJsonDialog : Form {
+    private static SaveFileDialog SaveFileDialog { get; set; }
+    private IDictionary<int, UserControl> Hash2Control { get; set; } = new Dictionary<int, UserControl>();
+    private IJsonItem Root { get; set; }
+    private IOptimizer Optimizer { get; set; }
+    private IList<JsonItemVMBase> VMs { get; set; }
+    private JCGenerator Generator { get; set; } = new JCGenerator();
+
     private IContent content;
-    private static SaveFileDialog saveFileDialog;
-    private IDictionary<int, UserControl> ctrlCollection = new Dictionary<int, UserControl>();
-    private IJsonItem root;
-    private IOptimizer optimizer;
-    private IList<JsonItemVM> vms;
-    private JCGenerator generator = new JCGenerator();
     public IContent Content {
       get => content;
@@ -28,24 +29,24 @@
         content = value;
 
-        //IEnumerable<JsonItem> items = generator.FetchJsonItems(content as IOptimizer);
-        vms = new List<JsonItemVM>();
+        VMs = new List<JsonItemVMBase>();
         treeView.Nodes.Clear();
         
-        optimizer = content as IOptimizer;
-        root = JsonItemConverter.Extract(optimizer);
-        TreeNode parent = new TreeNode(root.Name);
+        Optimizer = content as IOptimizer;
+        Root = JsonItemConverter.Extract(Optimizer);
+        TreeNode parent = new TreeNode(Root.Name);
       
-        BuildTreeNode(parent, root);
+        BuildTreeNode(parent, Root);
         treeView.Nodes.Add(parent);
       } 
     }
 
-    private IDictionary<Type, JsonItemVMBase> VMs { get; set; }
+    private IDictionary<Type, Type> JI2VM { get; set; }
 
 
     private void InitCache() {
-      VMs = new Dictionary<Type, JsonItemVMBase>();
-      foreach (var vm in ApplicationManager.Manager.GetInstances<JsonItemVMBase>()) {
-        VMs.Add(vm.JsonItemType, vm);
+      JI2VM = new Dictionary<Type, Type>();
+      foreach (var vmType in ApplicationManager.Manager.GetTypes(typeof(JsonItemVMBase))) {
+        JsonItemVMBase vm = (JsonItemVMBase)Activator.CreateInstance(vmType);
+        JI2VM.Add(vm.JsonItemType, vmType);
       }
     }
@@ -57,5 +58,5 @@
 
     private void exportButton_Click(object sender, EventArgs e) {
-      foreach(var x in vms) {
+      foreach(var x in VMs) {
         if (!x.Selected) {
           x.Item.Parent.Children.Remove(x.Item);
@@ -63,16 +64,16 @@
       }
 
-      if (saveFileDialog == null) {
-        saveFileDialog = new SaveFileDialog();
-        saveFileDialog.Title = "Export .json-Template";
-        saveFileDialog.DefaultExt = "json";
-        saveFileDialog.Filter = ".json-Template|*.json|All Files|*.*";
-        saveFileDialog.FilterIndex = 1;
+      if (SaveFileDialog == null) {
+        SaveFileDialog = new SaveFileDialog();
+        SaveFileDialog.Title = "Export .json-Template";
+        SaveFileDialog.DefaultExt = "json";
+        SaveFileDialog.Filter = ".json-Template|*.json|All Files|*.*";
+        SaveFileDialog.FilterIndex = 1;
       }
       
-      saveFileDialog.FileName = "template";
+      SaveFileDialog.FileName = "template";
 
-      if (saveFileDialog.ShowDialog() == DialogResult.OK) {
-        File.WriteAllText(saveFileDialog.FileName, generator.GenerateTemplate(root, optimizer));
+      if (SaveFileDialog.ShowDialog() == DialogResult.OK) {
+        File.WriteAllText(SaveFileDialog.FileName, Generator.GenerateTemplate(Root, Optimizer));
       }
 
@@ -81,13 +82,14 @@
 
     private void BuildTreeNode(TreeNode node, IJsonItem item) {
-
-      if (VMs.TryGetValue(item.GetType(), out JsonItemVMBase vm)) {
-        //vm.Item = item;
-        //UserControl control = vm.GetControl();
-        //if (control != null) {
-        //  control.Dock = DockStyle.Fill;
-        //  control.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
-        //}
-        //ctrlCollection.Add(node.GetHashCode(), control);
+      if (JI2VM.TryGetValue(item.GetType(), out Type vmType)) {
+        JsonItemVMBase vm = (JsonItemVMBase)Activator.CreateInstance(vmType);
+        VMs.Add(vm);
+        vm.Item = item;
+        UserControl control = vm.GetControl();
+        if (control != null) {
+          control.Dock = DockStyle.Fill;
+          control.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
+        }
+        Hash2Control.Add(node.GetHashCode(), control);
         if (item.Children != null) {
           foreach (var c in item.Children) {
@@ -99,11 +101,8 @@
                 node.Nodes.Add(childNode);
                 BuildTreeNode(childNode, c);
-                //vm.AddChild(BuildTreeNode(childNode, c));
               }
             }
           }
         }
-      } else {
-        Console.WriteLine();
       }
     }
@@ -121,5 +120,5 @@
     
     private void treeView_AfterSelect(object sender, TreeViewEventArgs e) {
-      if(ctrlCollection.TryGetValue(treeView.SelectedNode.GetHashCode(), out UserControl ctrl)) {
+      if(Hash2Control.TryGetValue(treeView.SelectedNode.GetHashCode(), out UserControl ctrl)) {
         panel.Controls.Clear();
         if (ctrl != null) {
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemBoolControl.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemBoolControl.cs	(revision 17410)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemBoolControl.cs	(revision 17411)
@@ -11,7 +11,10 @@
 namespace HeuristicLab.JsonInterface.OptimizerIntegration {
   public partial class JsonItemBoolControl : JsonItemBaseControl {
+    private BoolValueVM VM { get; set; }
 
     public JsonItemBoolControl(BoolValueVM vm) : base(vm) {
       InitializeComponent();
+      VM = vm;
+      checkBoxValue.DataBindings.Add("Checked", VM, nameof(BoolValueVM.Value));
       //checkBoxValue.Checked = (bool)vm.Item.Value;
     }
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemValueControl.Designer.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemValueControl.Designer.cs	(revision 17410)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemValueControl.Designer.cs	(revision 17411)
@@ -49,10 +49,8 @@
       // numericRangeControl1
       // 
-      this.numericRangeControl1.IsDouble = false;
       this.numericRangeControl1.Location = new System.Drawing.Point(9, 101);
       this.numericRangeControl1.Name = "numericRangeControl1";
       this.numericRangeControl1.Size = new System.Drawing.Size(487, 112);
       this.numericRangeControl1.TabIndex = 16;
-      this.numericRangeControl1.VM = null;
       // 
       // JsonItemValueControl
Index: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemValueControl.cs
===================================================================
--- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemValueControl.cs	(revision 17410)
+++ branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/JsonItemValueControl.cs	(revision 17411)
@@ -13,14 +13,37 @@
 
   public class JsonItemIntValueControl : JsonItemValueControl {
+    private readonly IntValueVM vm;
 
-    public JsonItemIntValueControl(SingleValueVM<int> vm) : base(vm) { }
+    #region Overriden Properties
+    protected override object VM => vm;
+    protected override string ValuePropertyId => nameof(IntValueVM.Value);
+    protected override string MinRangePropertyId => nameof(IntValueVM.MinRange);
+    protected override string MaxRangePropertyId => nameof(IntValueVM.MaxRange);
+    protected override string EnableMinRangePropertyId => nameof(IntValueVM.EnableMinRange);
+    protected override string EnableMaxRangePropertyId => nameof(IntValueVM.EnableMaxRange);
+    #endregion
+
+    public JsonItemIntValueControl(IntValueVM vm) : base(vm) {
+      this.vm = vm;
+      Init();
+    }
 
   }
 
   public class JsonItemDoubleValueControl : JsonItemValueControl {
-    private SingleValueVM<double> VM { get; set; }
+    private readonly DoubleValueVM vm;
 
-    public JsonItemDoubleValueControl(SingleValueVM<double> vm) : base(vm) {
-      VM = vm;
+    #region Overriden Properties
+    protected override object VM => vm;
+    protected override string ValuePropertyId => nameof(DoubleValueVM.Value);
+    protected override string MinRangePropertyId => nameof(DoubleValueVM.MinRange);
+    protected override string MaxRangePropertyId => nameof(DoubleValueVM.MaxRange);
+    protected override string EnableMinRangePropertyId => nameof(DoubleValueVM.EnableMinRange);
+    protected override string EnableMaxRangePropertyId => nameof(DoubleValueVM.EnableMaxRange);
+    #endregion
+
+    public JsonItemDoubleValueControl(DoubleValueVM vm) : base(vm) {
+      this.vm = vm;
+      Init();
     }
 
@@ -28,7 +51,32 @@
 
   public abstract partial class JsonItemValueControl : JsonItemBaseControl {
+    #region Protected Properties
+    protected TextBox TBValue { get; set; }
+    protected NumericRangeControl NumericRangeControl { get; set; }
+    #endregion
+
+    #region Abstract Properties
+    protected abstract object VM { get; }
+    protected abstract string ValuePropertyId { get; }
+    protected abstract string MinRangePropertyId { get; }
+    protected abstract string MaxRangePropertyId { get; }
+    protected abstract string EnableMinRangePropertyId { get; }
+    protected abstract string EnableMaxRangePropertyId { get; }
+    #endregion
 
     public JsonItemValueControl(JsonItemVMBase vm) : base(vm) {
       InitializeComponent();
+      TBValue = textBoxValue;
+      NumericRangeControl = numericRangeControl1;
+    }
+
+    protected void Init() {
+      TBValue.DataBindings.Add("Text", VM, ValuePropertyId);
+      NumericRangeControl.TBMinRange.DataBindings.Add("Text", VM, MinRangePropertyId);
+      NumericRangeControl.TBMaxRange.DataBindings.Add("Text", VM, MaxRangePropertyId);
+      NumericRangeControl.EnableMinRange.DataBindings.Add("Checked", VM, EnableMinRangePropertyId,
+        false, DataSourceUpdateMode.OnPropertyChanged);
+      NumericRangeControl.EnableMaxRange.DataBindings.Add("Checked", VM, EnableMaxRangePropertyId,
+        false, DataSourceUpdateMode.OnPropertyChanged);
     }
 
