Index: /branches/3073_IA_constraint_splitting/HeuristicLab.Problems.DataAnalysis/3.4/HeuristicLab.Problems.DataAnalysis-3.4.csproj
===================================================================
--- /branches/3073_IA_constraint_splitting/HeuristicLab.Problems.DataAnalysis/3.4/HeuristicLab.Problems.DataAnalysis-3.4.csproj	(revision 17764)
+++ /branches/3073_IA_constraint_splitting/HeuristicLab.Problems.DataAnalysis/3.4/HeuristicLab.Problems.DataAnalysis-3.4.csproj	(revision 17765)
@@ -192,4 +192,5 @@
     <Compile Include="Implementation\Interval\IntervalConstraint.cs" />
     <Compile Include="Implementation\Interval\IntervalConstraintsParser.cs" />
+    <Compile Include="Implementation\Interval\Region.cs" />
     <Compile Include="Implementation\Regression\ConfidenceBoundRegressionSolution.cs" />
     <Compile Include="Implementation\Regression\ConstantRegressionModel.cs" />
@@ -300,4 +301,5 @@
     <Compile Include="Implementation\Classification\ThresholdCalculators\NormalDistributionCutPointsThresholdCalculator.cs" />
     <Compile Include="Implementation\Classification\ThresholdCalculators\ThresholdCalculator.cs" />
+    <None Include=".editorconfig" />
     <None Include="HeuristicLab.snk" />
     <None Include="Plugin.cs.frame" />
Index: /branches/3073_IA_constraint_splitting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/IntervalConstraint.cs
===================================================================
--- /branches/3073_IA_constraint_splitting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/IntervalConstraint.cs	(revision 17764)
+++ /branches/3073_IA_constraint_splitting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/IntervalConstraint.cs	(revision 17765)
@@ -115,6 +115,6 @@
 
     [Storable]
-    private IDictionary<string, Interval> regions = new Dictionary<string, Interval>();
-    public IDictionary<string, Interval> Regions
+    private /*IDictionary<string, Interval>*/ IEnumerable<Region> regions; //= new Dictionary<string, Interval>();
+    public IEnumerable<Region> Regions
     {
       get => regions;
@@ -152,8 +152,8 @@
                               Interval interval, double weight, bool enabled) 
       : this(expression, variable, target, numberOfDerivations, 
-             interval, new Dictionary<string, Interval>(), weight, enabled) { }
+             interval, new List<Region>(), weight, enabled) { }
 
     public IntervalConstraint(string expression, string variable, string target, int numberOfDerivations,
-                              Interval interval, IDictionary<string, Interval> regions, double weight, bool enabled)
+                              Interval interval, IEnumerable<Region> regions, double weight, bool enabled)
     {
       this.expression = expression;
@@ -213,6 +213,6 @@
                                    Interval?.UpperBound,
                                    "]");
-        foreach(var kvp in Regions)
-          expression += $", {kvp.Key}=({kvp.Value.LowerBound} .. {kvp.Value.UpperBound})";
+        foreach(var region in Regions)
+          expression += $", {region.VariableName}=({region.Interval.LowerBound} .. {region.Interval.UpperBound})";
         Expression = expression;
         return;
@@ -227,6 +227,6 @@
                                  "]",
                                  GetDerivationString(numberOfDerivations));
-      foreach (var kvp in Regions)
-        expression += $", {kvp.Key}=({kvp.Value.LowerBound} .. {kvp.Value.UpperBound})";
+      foreach (var region in Regions)
+        expression += $", {region.VariableName}=({region.Interval.LowerBound} .. {region.Interval.UpperBound})";
       Expression = expression;
     }
Index: /branches/3073_IA_constraint_splitting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/IntervalConstraintsParser.cs
===================================================================
--- /branches/3073_IA_constraint_splitting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/IntervalConstraintsParser.cs	(revision 17764)
+++ /branches/3073_IA_constraint_splitting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/IntervalConstraintsParser.cs	(revision 17765)
@@ -93,14 +93,18 @@
             if (match.Groups[10].Success)
             {
-              IDictionary<string, Interval> pairs = new Dictionary<string, Interval>();
+              IList<Region> regions = new List<Region>();
               // option variables found
               for(int idx = 0; idx < match.Groups[10].Captures.Count; ++idx)
               {
-                AddRegion(pairs,
+                Region region = ParseRegion(
                   match.Groups[11].Captures[idx].Value,
                   match.Groups[13].Captures[idx].Value,
                   match.Groups[15].Captures[idx].Value);
+                if(!regions.Any(r => r.VariableName == region.VariableName))
+                  regions.Add(region);
+                else
+                  throw new ArgumentException("A constraint cannot contain multiple regions of the same variable.");
               }
-              yield return new IntervalConstraint(expression, variable, parsedTarget, numberOfDerivation, interval, pairs, weight, isEnabled);
+              yield return new IntervalConstraint(expression, variable, parsedTarget, numberOfDerivation, interval, regions, weight, isEnabled);
             }
             else
@@ -180,14 +184,18 @@
             if(match.Groups[17].Success)
             {
-              IDictionary<string, Interval> pairs = new Dictionary<string, Interval>();
+              IList<Region> regions = new List<Region>();
               // option variables found
               for (int idx = 0; idx < match.Groups[17].Captures.Count; ++idx)
               {
-                AddRegion(pairs, 
-                  match.Groups[18].Captures[idx].Value, 
-                  match.Groups[20].Captures[idx].Value, 
+                Region region = ParseRegion(
+                  match.Groups[18].Captures[idx].Value,
+                  match.Groups[20].Captures[idx].Value,
                   match.Groups[22].Captures[idx].Value);
+                if (!regions.Any(r => r.VariableName == region.VariableName))
+                  regions.Add(region);
+                else
+                  throw new ArgumentException("A constraint cannot contain multiple regions of the same variable.");
               }
-              yield return new IntervalConstraint(expression, variable, parsedTarget, numberOfDerivation, interval, pairs, weight, isEnabled);
+              yield return new IntervalConstraint(expression, variable, parsedTarget, numberOfDerivation, interval, regions, weight, isEnabled);
             } else
               yield return new IntervalConstraint(expression, variable, parsedTarget, numberOfDerivation, interval, weight, isEnabled);
@@ -209,11 +217,9 @@
     }
 
-    private static void AddRegion(IDictionary<string, Interval> dict, string variable, string lb, string ub)
+    private static Region ParseRegion(string variable, string lb, string ub)
     {
       var regionLb = ParseIntervalBounds(lb);
       var regionUb = ParseIntervalBounds(ub);
-      if (dict.ContainsKey(variable))
-        throw new ArgumentException("A constraint cannot contain multiple regions of the same variable.");
-      dict.Add(variable, new Interval(regionLb, regionUb));
+      return new Region(variable, new Interval(regionLb, regionUb));
     }
 
Index: /branches/3073_IA_constraint_splitting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/Region.cs
===================================================================
--- /branches/3073_IA_constraint_splitting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/Region.cs	(revision 17765)
+++ /branches/3073_IA_constraint_splitting/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/Region.cs	(revision 17765)
@@ -0,0 +1,55 @@
+﻿using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [StorableType("8E3FEB9B-0B1A-4F06-8CFC-CB8D468EF7EC")]
+  [Item("Region", "A region for an interval constraint.")]
+  public class Region : Item {
+
+    [Storable] private string variableName;
+    public string VariableName {
+      get => variableName;
+      private set {
+        if(variableName != value) {
+          variableName = value;
+          OnChanged();
+        }
+      }
+    }
+
+    [Storable] private Interval interval;
+    public Interval Interval {
+      get => Interval;
+      private set {
+        if (!interval.Equals(value)) {
+          interval = value;
+          OnChanged();
+        }
+      }
+    }
+
+    public Region(string variableName, Interval interval) {
+      VariableName = variableName;
+      Interval = interval;
+    }
+
+    private Region(Region original, Cloner cloner)
+      : base(original, cloner) {
+      VariableName = original.VariableName;
+      Interval = original.Interval;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Region(this, cloner);
+    }
+
+    public event EventHandler Changed;
+    private void OnChanged() => Changed?.Invoke(this, EventArgs.Empty);
+  }
+}
