Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.Designer.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.Designer.cs	(revision 17480)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.Designer.cs	(revision 17481)
@@ -273,5 +273,4 @@
     #endregion
 
-    private System.Windows.Forms.GroupBox groupBox1;
     private System.Windows.Forms.BindingSource jsonItemBindingSource;
     private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn1;
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.cs	(revision 17480)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface.OptimizerIntegration/Views/ExportJsonDialog.cs	(revision 17481)
@@ -69,12 +69,11 @@
       // clear all runs
       Optimizer.Runs.Clear();
-      
-      IList<IJsonItem> faultyItems = new List<IJsonItem>();
-      
-      if (!Root.GetValidator().Validate(ref faultyItems)) {
+
+      var validationResult = Root.GetValidator().Validate();
+      if (!validationResult.Success) {
         IList<Exception> list = new List<Exception>();
         //print faultyItems
-        foreach (var x in faultyItems) {
-          list.Add(new Exception($"Combination of value and range is not valid for {x.Name}"));
+        foreach (var x in validationResult.Errors) {
+          list.Add(new Exception(x));
         }
         ErrorHandling.ShowErrorDialog(this, new AggregateException(list));
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Interfaces/IJsonItemValidator.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Interfaces/IJsonItemValidator.cs	(revision 17480)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Interfaces/IJsonItemValidator.cs	(revision 17481)
@@ -7,5 +7,5 @@
 namespace HeuristicLab.JsonInterface {
   public interface IJsonItemValidator {
-    bool Validate(ref IList<IJsonItem> faultyItems);
+    ValidationResult Validate();
   }
 }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateInstantiator.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateInstantiator.cs	(revision 17480)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateInstantiator.cs	(revision 17481)
@@ -14,7 +14,12 @@
 
 namespace HeuristicLab.JsonInterface {
-  public struct InstantiatorResult {
-    public IOptimizer Optimizer { get; set; }
-    public IEnumerable<IResultJsonItem> ConfiguredResultItems { get; set; }
+  public readonly struct InstantiatorResult {
+    public InstantiatorResult(IOptimizer optimizer, IEnumerable<IResultJsonItem> configuredResultItems) {
+      Optimizer = optimizer;
+      ConfiguredResultItems = configuredResultItems;
+    }
+
+    public IOptimizer Optimizer { get; }
+    public IEnumerable<IResultJsonItem> ConfiguredResultItems { get; }
   }
 
@@ -44,5 +49,4 @@
     #region Helper
     private InstantiatorResult ExecuteInstantiaton(string templateFile, string configFile = null) {
-      InstantiatorResult result = new InstantiatorResult();
 
       #region Parse Files
@@ -58,5 +62,4 @@
       ProtoBufSerializer serializer = new ProtoBufSerializer();
       IOptimizer optimizer = (IOptimizer)serializer.Deserialize(hLFileLocation);
-      result.Optimizer = optimizer;
       #endregion
 
@@ -73,7 +76,5 @@
       JsonItemConverter.Inject(optimizer, rootItem);
 
-      result.ConfiguredResultItems = CollectResults();
-
-      return result;
+      return new InstantiatorResult(optimizer, CollectResults());
     }
 
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/BoolJsonItems.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/BoolJsonItems.cs	(revision 17480)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/BoolJsonItems.cs	(revision 17481)
@@ -7,13 +7,13 @@
 namespace HeuristicLab.JsonInterface {
   public class BoolJsonItem : ValueJsonItem<bool> {
-    protected override bool Validate() => true;
+    protected override ValidationResult Validate() => ValidationResult.Successful();
   }
 
   public class BoolArrayJsonItem : ArrayJsonItem<bool> {
-    protected override bool Validate() => true;
+    protected override ValidationResult Validate() => ValidationResult.Successful();
   }
 
   public class BoolMatrixJsonItem : MatrixJsonItem<bool> {
-    protected override bool Validate() => true;
+    protected override ValidationResult Validate() => ValidationResult.Successful();
   }
 }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ConcreteRestrictedArrayJsonItem.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ConcreteRestrictedArrayJsonItem.cs	(revision 17480)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ConcreteRestrictedArrayJsonItem.cs	(revision 17481)
@@ -9,6 +9,7 @@
     public IEnumerable<T> ConcreteRestrictedItems { get; set; }
 
-    protected override bool Validate() {
+    protected override ValidationResult Validate() {
       bool res = true;
+      IList<string> errors = new List<string>();
       foreach(var x in Value) {
         bool tmp = false;
@@ -16,7 +17,13 @@
           tmp = tmp || x.Equals(restrictedItem); //if one tmp is true, it stays true (match found)
         }
+        if (!tmp)
+          errors.Add($"[{Path}]: Value '{x}' is not one of the allowed values: " +
+                     $"'{ string.Join(",", ConcreteRestrictedItems.Select(s => s.ToString()).ToArray()) }'.");
         res = res && tmp; //if one tmp is false, res will set false
       }
-      return res;
+      if (res) 
+        return ValidationResult.Successful();
+      else 
+        return ValidationResult.Faulty(errors);
     }
   }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ConcreteRestrictedValueJsonItem.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ConcreteRestrictedValueJsonItem.cs	(revision 17480)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ConcreteRestrictedValueJsonItem.cs	(revision 17481)
@@ -9,9 +9,11 @@
     public IEnumerable<T> ConcreteRestrictedItems { get; set; }
 
-    protected override bool Validate() {
-      if (ConcreteRestrictedItems == null) return true;
+    protected override ValidationResult Validate() {
+      if (ConcreteRestrictedItems == null) return ValidationResult.Successful();
       foreach (var x in ConcreteRestrictedItems)
-        if (Value.Equals(x)) return true;
-      return false;
+        if (Value.Equals(x)) return ValidationResult.Successful();
+      return ValidationResult.Faulty(
+        $"[{Path}]: Value {Value} is not one of the allowed values: " +
+        $"'{ string.Join(",", ConcreteRestrictedItems.Select(s => s.ToString()).ToArray()) }'.");
     }
   }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/DateTimeJsonItem.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/DateTimeJsonItem.cs	(revision 17480)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/DateTimeJsonItem.cs	(revision 17481)
@@ -8,5 +8,4 @@
 namespace HeuristicLab.JsonInterface {
   public class DateTimeJsonItem : IntervalRestrictedValueJsonItem<DateTime> {
-    protected override bool Validate() => Minimum.CompareTo(Value) >= 0 && Maximum.CompareTo(Value) <= 0;
     
     public override JObject GenerateJObject() {
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/EmptyJsonItem.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/EmptyJsonItem.cs	(revision 17480)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/EmptyJsonItem.cs	(revision 17481)
@@ -7,5 +7,5 @@
 namespace HeuristicLab.JsonInterface {
   public class EmptyJsonItem : JsonItem {
-    protected override bool Validate() => true;
+    protected override ValidationResult Validate() => ValidationResult.Successful();
   }
 }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedArrayJsonItem.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedArrayJsonItem.cs	(revision 17480)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedArrayJsonItem.cs	(revision 17481)
@@ -12,10 +12,14 @@
     public T Maximum { get; set; }
 
-    protected override bool Validate() {
-      foreach(var x in Value) {
-        if (Minimum.CompareTo(x) > 0 || Maximum.CompareTo(x) < 0)
-          return false;
+    protected override ValidationResult Validate() {
+      IList<string> errors = new List<string>();
+      bool success = true;
+      foreach (var x in Value) {
+        if (Minimum.CompareTo(x) > 0 && Maximum.CompareTo(x) < 0) {
+          success = false;
+          errors.Add($"[{Path}]: Value {x} is not between {Minimum} and {Maximum}.");
+        }
       }
-      return true;
+      return new ValidationResult(success, errors);
     }
 
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedMatrixJsonItem.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedMatrixJsonItem.cs	(revision 17480)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedMatrixJsonItem.cs	(revision 17481)
@@ -11,13 +11,19 @@
     public T Minimum { get; set; }
     public T Maximum { get; set; }
-    protected override bool Validate() {
+
+    protected override ValidationResult Validate() {
+      IList<string> errors = new List<string>();
+      bool success = true;
       foreach (var x in Value) {
-        foreach(var y in x) {
-          if (Minimum.CompareTo(y) > 0 || Maximum.CompareTo(y) < 0)
-            return false;
+        foreach (var y in x) {
+          if (Minimum.CompareTo(y) > 0 || Maximum.CompareTo(y) < 0) {
+            success = false;
+            errors.Add($"[{Path}]: Value {y} is not between {Minimum} and {Maximum}.");
+          }
         }
       }
-      return true;
+      return new ValidationResult(success, errors);
     }
+
     public override void SetJObject(JObject jObject) {
       base.SetJObject(jObject);
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedValueJsonItem.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedValueJsonItem.cs	(revision 17480)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedValueJsonItem.cs	(revision 17481)
@@ -12,5 +12,9 @@
     public T Maximum { get; set; }
 
-    protected override bool Validate() => Minimum.CompareTo(Value) <= 0 && Maximum.CompareTo(Value) >= 0;
+    protected override ValidationResult Validate() {
+      bool res = Minimum.CompareTo(Value) <= 0 && Maximum.CompareTo(Value) >= 0;
+      if (res) return ValidationResult.Successful();
+      else return ValidationResult.Faulty($"[{Path}]: Value {Value} is not between {Minimum} and {Maximum}.");
+    }
 
     public override void SetJObject(JObject jObject) {
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/JsonItem.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/JsonItem.cs	(revision 17480)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/JsonItem.cs	(revision 17481)
@@ -8,4 +8,25 @@
 
 namespace HeuristicLab.JsonInterface {
+
+  public readonly struct ValidationResult {
+
+    public static ValidationResult Successful() => new ValidationResult(true, Enumerable.Empty<string>());
+    public static ValidationResult Faulty(IEnumerable<string> errors) => new ValidationResult(false, errors);
+    public static ValidationResult Faulty(string error) => new ValidationResult(false, error);
+
+    public ValidationResult(bool success, IEnumerable<string> errors) {
+      Success = success;
+      Errors = errors;
+    }
+
+    public ValidationResult(bool success, string error) {
+      Success = success;
+      Errors = Enumerable.Repeat(error, 1);
+    }
+
+    public bool Success { get; }
+    public IEnumerable<string> Errors { get; }
+  }
+
   /// <summary>
   /// Main data class for json interface.
@@ -20,24 +41,14 @@
       }
 
-      public bool Validate(ref IList<IJsonItem> faultyItems) {
-        faultyItems = new List<IJsonItem>();
-        return ValidateHelper(Root, ref faultyItems);
-      }
-
-      // TODO: return ValidationResult ?
-      private bool ValidateHelper(JsonItem item, ref IList<IJsonItem> faultyItems) {
-        int hash = item.GetHashCode();
-        if (Cache.TryGetValue(hash, out bool r))
-          return r;
-
-        bool res = item.Validate();
-        if (!res) faultyItems.Add(item);
-        Cache.Add(hash, res);
-        if(item.Children != null) {
-          foreach (var child in item.Children)
-            if (!ValidateHelper(child as JsonItem, ref faultyItems))
-              res = false && res;
+      public ValidationResult Validate() {
+        IEnumerable<string> errors = Enumerable.Empty<string>();
+        bool success = true;
+        foreach(var x in Root) {
+          var res = ((JsonItem)x).Validate();
+          //if one success is false -> whole validation is false
+          success = success && res.Success; 
+          errors.Concat(res.Errors);
         }
-        return res;
+        return new ValidationResult(success, errors);
       }
     }
@@ -96,5 +107,5 @@
     }
 
-    public virtual IJsonItemValidator GetValidator() => new JsonItemValidator(this);
+    public IJsonItemValidator GetValidator() => new JsonItemValidator(this);
 
     public void FixatePath() => fixedPath = Path;
@@ -112,5 +123,5 @@
 
     #region Abstract Methods
-    protected abstract bool Validate();
+    protected abstract ValidationResult Validate();
     #endregion
 
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/LookupJsonItem.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/LookupJsonItem.cs	(revision 17480)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/LookupJsonItem.cs	(revision 17481)
@@ -15,5 +15,5 @@
     }
 
-    protected override bool Validate() => true;
+    protected override ValidationResult Validate() => ValidationResult.Successful();
   }
 }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/RangedJsonItem.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/RangedJsonItem.cs	(revision 17480)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/RangedJsonItem.cs	(revision 17481)
@@ -13,7 +13,14 @@
     public T Maximum { get; set; }
 
-    protected override bool Validate() =>
-      (Minimum.CompareTo(MinValue) <= 0 && Maximum.CompareTo(MinValue) >= 0) &&
-      (Minimum.CompareTo(MaxValue) <= 0 && Maximum.CompareTo(MaxValue) >= 0);
+    protected override ValidationResult Validate() {
+      IList<string> errors = new List<string>();
+      bool successMin = (Minimum.CompareTo(MinValue) <= 0 && Maximum.CompareTo(MinValue) >= 0);
+      bool successMax = (Minimum.CompareTo(MaxValue) <= 0 && Maximum.CompareTo(MaxValue) >= 0);
+      if (!successMin) errors.Add($"[{Path}]: Value {MinValue} is not between {Minimum} and {Maximum}.");
+      if (!successMax) errors.Add($"[{Path}]: Value {MaxValue} is not between {Minimum} and {Maximum}.");
+      return new ValidationResult((successMin && successMax), errors);
+
+    }
+      
   }
 }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ResultJsonItem.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ResultJsonItem.cs	(revision 17480)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ResultJsonItem.cs	(revision 17481)
@@ -7,5 +7,5 @@
 namespace HeuristicLab.JsonInterface {
   public class ResultJsonItem : JsonItem, IResultJsonItem {
-    protected override bool Validate() => true;
+    protected override ValidationResult Validate() => ValidationResult.Successful();
   }
 }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/UnsupportedJsonItem.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/UnsupportedJsonItem.cs	(revision 17480)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/UnsupportedJsonItem.cs	(revision 17481)
@@ -34,5 +34,5 @@
     }
 
-    protected override bool Validate() => true;
+    protected override ValidationResult Validate() => ValidationResult.Successful();
   }
 }
Index: /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ValueLookupJsonItem.cs
===================================================================
--- /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ValueLookupJsonItem.cs	(revision 17480)
+++ /branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ValueLookupJsonItem.cs	(revision 17481)
@@ -12,8 +12,7 @@
     public IJsonItem ActualValue { get; set; }
 
-    protected override bool Validate() {
-      if (ActualValue == null) return true;
-      IList<IJsonItem> faultyItems = new List<IJsonItem>();
-      return ActualValue.GetValidator().Validate(ref faultyItems);
+    protected override ValidationResult Validate() {
+      if (ActualValue == null) return ValidationResult.Successful();
+      return ActualValue.GetValidator().Validate();
     }
 
