diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/Correlation.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/Correlation.java
index d89886cdb5c14ba8cd38a0fcbe37bde04f9c983b..ac64ab6d4668dc1ac60d54ea3d9829016b3c88f9 100644
--- a/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/Correlation.java
+++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/Correlation.java
@@ -28,11 +28,11 @@ public class Correlation {
      */
     private double correlationFactor;
 
-    public boolean matchesSource(int chromosomeIndex, double chromosomeValue) {
+    public boolean matchesSource(int chromosomeIndex, final Number chromosomeValue) {
         return chromosomeOne == chromosomeIndex;
     }
 
-    public boolean matchesTarget(int chromosomeIndex, double chromosomeValue) {
+    public boolean matchesTarget(int chromosomeIndex, final Number chromosomeValue) {
         return chromosomeTwo == chromosomeIndex;
     }
 }
diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/Correlations.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/Correlations.java
index c38a75a710cfb6008c2f16a0a78384e0a2572d78..182a46aac46c686ac439027a4da69da34e151f90 100644
--- a/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/Correlations.java
+++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/Correlations.java
@@ -33,7 +33,7 @@ public class Correlations<G extends Gene<?, G>> {
         final Properties properties = codec.decode(genotype);
 
         return correlations.stream()
-                           .filter(c -> c.matchesSource(chromosomeIndex, properties.getAsDouble(chromosomeIndex)))
+                           .filter(c -> c.matchesSource(chromosomeIndex, (Number)properties.get(chromosomeIndex)))
                            .collect(Collectors.toList());
     }
 
diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/RangedCorrelation.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/RangedCorrelation.java
index c3b4f0ee71649f52c7123b00542bcdf930bd61eb..064a7a9436e10c12882c2d7d58e2ab08f016dc6a 100644
--- a/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/RangedCorrelation.java
+++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/RangedCorrelation.java
@@ -15,20 +15,20 @@ public class RangedCorrelation extends Correlation {
     private Range chromosomeTwoRange;
 
     @Override
-    public boolean matchesSource(int chromosomeIndex, double chromosomeValue) {
+    public boolean matchesSource(int chromosomeIndex, final Number chromosomeValue) {
         if(!super.matchesSource(chromosomeIndex, chromosomeValue)) {
             return false;
         }
 
-        return getChromosomeOneRange().includes(chromosomeValue);
+        return getChromosomeOneRange().includes(chromosomeValue.doubleValue());
     }
 
     @Override
-    public boolean matchesTarget(int chromosomeIndex, double chromosomeValue) {
+    public boolean matchesTarget(int chromosomeIndex, final Number chromosomeValue) {
         if(!super.matchesTarget(chromosomeIndex, chromosomeValue)) {
             return false;
         }
 
-        return getChromosomeTwoRange().includes(chromosomeValue);
+        return getChromosomeTwoRange().includes(chromosomeValue.doubleValue());
     }
 }
diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/constraints/correlation/el/AstHelper.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/constraints/correlation/el/AstHelper.java
index 75543ffd8121228c1b15b8bddddf627e5ef3230d..6df67471eff6f7f60b7e33d3d96fc0cbce624f28 100644
--- a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/constraints/correlation/el/AstHelper.java
+++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/constraints/correlation/el/AstHelper.java
@@ -2,8 +2,9 @@ package de.evoal.core.main.ea.constraints.correlation.el;
 
 import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.core.api.properties.PropertySpecification;
-import de.evoal.core.main.ea.constraints.el.StringSwitch;
+import de.evoal.core.main.ea.constraints.el.DataReferenceSwitch;
 import de.evoal.core.api.ea.correlations.Range;
+import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.el.Expression;
 
 public final class AstHelper {
@@ -15,8 +16,8 @@ public final class AstHelper {
     }
 
     public static int findChromosomeIndex(final PropertiesSpecification specification, final Expression expression) {
-        final String name = new StringSwitch().doSwitch(expression);
+        final DataDescription data = new DataReferenceSwitch().doSwitch(expression);
 
-        return specification.indexOf(name);
+        return specification.indexOf(data.getName());
     }
 }
diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/constraints/el/DataReferenceSwitch.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/constraints/el/DataReferenceSwitch.java
new file mode 100644
index 0000000000000000000000000000000000000000..4a01d1a0ce8b9aa3efe72725f106a60dd0824c04
--- /dev/null
+++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/constraints/el/DataReferenceSwitch.java
@@ -0,0 +1,117 @@
+package de.evoal.core.main.ea.constraints.el;
+
+import de.evoal.languages.model.ddl.DataDescription;
+import de.evoal.languages.model.ddl.DataReference;
+import de.evoal.languages.model.ddl.SelfReference;
+import de.evoal.languages.model.el.*;
+import de.evoal.languages.model.el.util.ELSwitch;
+
+import java.util.Objects;
+
+public class DataReferenceSwitch extends ELSwitch<DataDescription> {
+    @Override
+    public DataDescription caseOrExpression(final OrExpression object) {
+        Objects.equals(object.getSubExpressions().size(), 1);
+
+        return this.doSwitch(object.getSubExpressions().get(0));
+    }
+
+    @Override
+    public DataDescription caseXorExpression(final XorExpression object) {
+        Objects.equals(object.getSubExpressions().size(), 1);
+
+        return this.doSwitch(object.getSubExpressions().get(0));
+    }
+
+    @Override
+    public DataDescription caseAndExpression(final AndExpression object) {
+        Objects.equals(object.getSubExpressions().size(), 1);
+
+        return this.doSwitch(object.getSubExpressions().get(0));
+    }
+
+    @Override
+    public DataDescription caseNotExpression(final NotExpression object) {
+        return this.doSwitch(object.getOperand());
+    }
+
+    @Override
+    public DataDescription caseComparisonExpression(final ComparisonExpression object) {
+        Objects.equals(object.getComparison().size(), 0);
+
+        return this.doSwitch(object.getLeftOperand());
+    }
+
+    @Override
+    public DataDescription caseAddOrSubtractExpression(AddOrSubtractExpression object) {
+        Objects.equals(object.getOperators().size(), 0);
+
+        return this.doSwitch(object.getLeftOperand());
+    }
+
+    @Override
+    public DataDescription caseMultiplyDivideModuloExpression(MultiplyDivideModuloExpression object) {
+        Objects.equals(object.getOperators().size(), 0);
+
+        return this.doSwitch(object.getLeftOperand());
+    }
+
+    @Override
+    public DataDescription casePowerOfExpression(PowerOfExpression object) {
+        Objects.isNull(object.getRightOperand());
+
+        return this.doSwitch(object.getLeftOperand());
+    }
+
+    @Override
+    public DataDescription caseUnaryAddOrSubtractExpression(UnaryAddOrSubtractExpression object) {
+        Objects.equals(object.getOperators().size(), 0);
+
+        return this.doSwitch(object.getSubExpression());
+    }
+    /*
+        @Override
+        public DataDescription caseCallOrLiteralOrReferenceOrParantheses(CallOrLiteralOrReferenceOrParantheses object) {
+            return super.caseCallOrLiteralOrReferenceOrParantheses(object);
+        }
+    */
+
+    @Override
+    public DataDescription caseIntegerLiteral(final IntegerLiteral object) {
+        throw new IllegalStateException("Searching for Data but found a integer literal.");
+    }
+
+    @Override
+    public DataDescription caseDoubleLiteral(final DoubleLiteral object) {
+        throw new IllegalStateException("Searching for Data but found a double literal.");
+    }
+
+    @Override
+    public DataDescription caseStringLiteral(StringLiteral object) {
+        throw new IllegalStateException("Searching for Data but found a string literal.");
+    }
+
+    @Override
+    public DataDescription caseBooleanLiteral(BooleanLiteral object) {
+        throw new IllegalStateException("Searching for Data but found a boolean literal.");
+    }
+
+    @Override
+    public DataDescription caseCall(final Call object) {
+        throw new IllegalStateException("Searching for Data but found a call.");
+    }
+
+    @Override
+    public DataDescription caseParantheses(Parantheses object) {
+        return this.doSwitch(object.getSubExpression());
+    }
+
+    @Override
+    public DataDescription caseValueReference(final ValueReference object) {
+        if(object instanceof SelfReference) {
+            throw  new IllegalStateException("Not yet implemented");
+        } else {
+            return ((DataReference)object).getDefinition();
+        }
+    }
+}