diff --git a/src/core/de.evoal.approximative.density/pom.xml b/src/core/de.evoal.approximative.density/pom.xml
index 6a7f9a02465579a59aa1117a841a6c5cffcc4819..d6d004dfdc8810de5c5942e30262ecfef75191fc 100644
--- a/src/core/de.evoal.approximative.density/pom.xml
+++ b/src/core/de.evoal.approximative.density/pom.xml
@@ -7,6 +7,7 @@
 		<groupId>de.evoal</groupId>
 		<artifactId>core.plugin</artifactId>
 		<version>0.9.0-SNAPSHOT</version>
+		<relativePath>../de.evoal.core.plugin</relativePath>
 	</parent>
 	
 	<artifactId>approximative.density</artifactId>
diff --git a/src/core/de.evoal.approximative.density/src/main/java/de/evoal/approximative/density/ea/fitness/DensityBasedFitness.java b/src/core/de.evoal.approximative.density/src/main/java/de/evoal/approximative/density/ea/fitness/DensityBasedFitness.java
index abaed5ee3f73c7c306ea0ec9eb098a2a7e5215d0..0d2d84351b10b884eb03754ea5195daf2f0698d9 100644
--- a/src/core/de.evoal.approximative.density/src/main/java/de/evoal/approximative/density/ea/fitness/DensityBasedFitness.java
+++ b/src/core/de.evoal.approximative.density/src/main/java/de/evoal/approximative/density/ea/fitness/DensityBasedFitness.java
@@ -1,13 +1,13 @@
 package de.evoal.approximative.density.ea.fitness;
 
 import de.evoal.approximative.density.model.DensityData;
-import de.evoal.core.api.ea.fitness.FitnessFunction;
+import de.evoal.core.api.optimisation.OptimisationFunction;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.core.api.properties.info.PropertiesRanges;
 import de.evoal.core.api.utils.LanguageHelper;
 import de.evoal.core.api.utils.Requirements;
-import de.evoal.core.api.ea.fitness.FitnessDecorator;
+import de.evoal.core.api.optimisation.OptimisationFunctionDecorator;
 import de.evoal.languages.model.instance.Instance;
 import de.evoal.surrogate.api.configuration.PartialFunctionConfiguration;
 import de.evoal.surrogate.api.function.FunctionCombiner;
@@ -22,7 +22,7 @@ import java.util.function.BiFunction;
 
 @Slf4j
 @Vetoed
-public abstract class DensityBasedFitness extends FitnessDecorator {
+public abstract class DensityBasedFitness extends OptimisationFunctionDecorator {
 
     private final BiFunction<PartialFunctionConfiguration, String, DensityData> modelCreator;
 
@@ -55,7 +55,7 @@ public abstract class DensityBasedFitness extends FitnessDecorator {
     }
 
     @Override
-    public FitnessFunction init(final Instance config) {
+    public OptimisationFunction init(final Instance config) {
         log.info("Setting up density-based fitness calculation.");
         super.init(config);
 
diff --git a/src/core/de.evoal.approximative.density/src/main/java/module-info.java b/src/core/de.evoal.approximative.density/src/main/java/module-info.java
index ceeee4e243e62d31148c92dccdf11b45fb6d383c..ff9fde44b68bb8ab9118212da16205f15e4c6c3a 100644
--- a/src/core/de.evoal.approximative.density/src/main/java/module-info.java
+++ b/src/core/de.evoal.approximative.density/src/main/java/module-info.java
@@ -12,6 +12,7 @@ module de.evoal.approximative.density {
     requires de.evoal.surrogate.api;
 
     requires smile.math;
+    requires de.evoal.core.ea;
 
     opens de.evoal.approximative.density.ea.fitness to weld.core.impl;
     opens de.evoal.approximative.density.ea.surrogate.gof to weld.core.impl;
diff --git a/src/core/de.evoal.core.arff/pom.xml b/src/core/de.evoal.core.arff/pom.xml
index e54de0a6b515129a5c0d8dbaed480a11b6275a50..b5952996272360c97667b28aa933540e639c6776 100644
--- a/src/core/de.evoal.core.arff/pom.xml
+++ b/src/core/de.evoal.core.arff/pom.xml
@@ -7,6 +7,7 @@
 		<groupId>de.evoal</groupId>
 		<artifactId>core.plugin</artifactId>
 		<version>0.9.0-SNAPSHOT</version>
+		<relativePath>../de.evoal.core.plugin</relativePath>
 	</parent>
 
 	<artifactId>core.arff</artifactId>
diff --git a/src/core/de.evoal.core.ea/pom.xml b/src/core/de.evoal.core.ea/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..168bd7c0906964a4c298cad2f15bd337bd1413ed
--- /dev/null
+++ b/src/core/de.evoal.core.ea/pom.xml
@@ -0,0 +1,78 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>de.evoal</groupId>
+		<artifactId>core.plugin</artifactId>
+		<version>0.9.0-SNAPSHOT</version>
+		<relativePath>../de.evoal.core.plugin</relativePath>
+	</parent>
+
+	<artifactId>core.ea</artifactId>
+	<name>EvoAl - Core - Evolutionary Algorithm</name>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.decimal4j</groupId>
+			<artifactId>decimal4j</artifactId>
+			<version>1.0.3</version>
+			<scope>compile</scope>
+		</dependency>
+
+	    <dependency>
+			<groupId>io.jenetics</groupId>
+			<artifactId>jenetics.ext</artifactId>
+			<version>${jenetics.version}</version>
+			<scope>compile</scope>
+	    </dependency>
+
+		<dependency>
+			<groupId>com.github.haifengl</groupId>
+			<artifactId>smile-math</artifactId>
+			<version>${smile.version}</version>
+			<scope>compile</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.junit.jupiter</groupId>
+			<artifactId>junit-jupiter</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>${project.groupId}</groupId>
+			<artifactId>core.junit</artifactId>
+			<version>${project.version}</version>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.10.1</version>
+				<configuration>
+					<annotationProcessorPaths>
+						<path>
+							<groupId>org.projectlombok</groupId>
+							<artifactId>lombok</artifactId>
+							<version>${lombok.version}</version>
+						</path>
+					</annotationProcessorPaths>
+					<compilerArgs>
+						<arg>--add-exports</arg>
+						<arg>io.jenetics.base/io.jenetics.internal.math=de.evoal.core.ea</arg>
+						<arg>--add-exports</arg>
+						<arg>io.jenetics.base/io.jenetics.internal.util=de.evoal.core.ea</arg>
+						<arg>--add-exports</arg>
+						<arg>io.jenetics.base/io.jenetics.internal.collection=de.evoal.core.ea</arg>
+					</compilerArgs>
+					<forceJavacCompilerUse>true</forceJavacCompilerUse>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+</project>
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/cdi/Fitness.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/cdi/Fitness.java
similarity index 91%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/cdi/Fitness.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/cdi/Fitness.java
index f56446d97d73fab6676103d6a3015dca00ce0b1f..ef0c5e39b26f4bf8fea9bc015623d59986ff6b4e 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/cdi/Fitness.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/cdi/Fitness.java
@@ -1,4 +1,4 @@
-package de.evoal.core.api.ea.cdi;
+package de.evoal.core.ea.api.cdi;
 
 import javax.enterprise.util.Nonbinding;
 import javax.inject.Qualifier;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/codec/CustomCodec.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/codec/CustomCodec.java
similarity index 93%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/codec/CustomCodec.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/codec/CustomCodec.java
index 683b2d94a773a641e924b8952739471b6ed17c2d..1e15f7a100d52199bc7eeb2966886493f1be0f2f 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/codec/CustomCodec.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/codec/CustomCodec.java
@@ -1,4 +1,4 @@
-package de.evoal.core.api.ea.codec;
+package de.evoal.core.ea.api.codec;
 
 import de.evoal.core.api.properties.Properties;
 import io.jenetics.Gene;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/calculation/CalculationFactory.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/calculation/CalculationFactory.java
similarity index 77%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/calculation/CalculationFactory.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/calculation/CalculationFactory.java
index 51ec56767a84b7ebb8578f06b90e24e708f317b0..abd116b8b93aa37845258bbf84da6e6945d1ba7e 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/calculation/CalculationFactory.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/calculation/CalculationFactory.java
@@ -1,6 +1,7 @@
-package de.evoal.core.api.ea.constraints.calculation;
+package de.evoal.core.ea.api.constraints.calculation;
 
-import de.evoal.core.api.ea.constraints.model.Constraint;
+import de.evoal.core.api.cdi.BeanFactory;
+import de.evoal.core.ea.api.constraints.model.Constraint;
 import de.evoal.core.api.board.CoreBlackboardEntries;
 import de.evoal.core.api.cdi.ConfigurationValue;
 import javax.enterprise.context.ApplicationScoped;
@@ -8,9 +9,9 @@ import javax.enterprise.context.ApplicationScoped;
 import de.evoal.core.api.utils.LanguageHelper;
 import de.evoal.languages.model.instance.Array;
 import de.evoal.languages.model.instance.Instance;
-import org.apache.deltaspike.core.api.provider.BeanProvider;
 
 import javax.inject.Inject;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -19,9 +20,8 @@ public class CalculationFactory {
     private final Map<String, Instance> calculationConfigurationByCategory = new HashMap<>();
 
     @Inject
-    public CalculationFactory(final @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.handlers") Array handlerConfigurations) {
-        handlerConfigurations.getValues()
-                             .stream()
+    public CalculationFactory(final @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.handlers") Instance [] handlerConfigurations) {
+        Arrays.stream(handlerConfigurations)
                              .map(Instance.class::cast)
                              .filter(LanguageHelper.filterInstanceByType("constraint-handler"))
                              .forEach(i -> {
@@ -36,7 +36,7 @@ public class CalculationFactory {
         final Instance config = calculationConfigurationByCategory.get(constraint.getGroup());
         final String calculationName = LanguageHelper.lookup(config, "name");
 
-        final CalculationStrategy strategy = BeanProvider.getContextualReference(calculationName, false, CalculationStrategy.class);
+        final CalculationStrategy strategy = BeanFactory.create(calculationName, CalculationStrategy.class);
         strategy.init(constraint, config);
 
         return strategy;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/calculation/CalculationStrategy.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/calculation/CalculationStrategy.java
similarity index 85%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/calculation/CalculationStrategy.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/calculation/CalculationStrategy.java
index 24a389e4df5ec84f6800aecc0263dfefefc68d19..87e1f1790b29adc7f16d0dcfec23d8dd541037cb 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/calculation/CalculationStrategy.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/calculation/CalculationStrategy.java
@@ -1,7 +1,7 @@
-package de.evoal.core.api.ea.constraints.calculation;
+package de.evoal.core.ea.api.constraints.calculation;
 
-import de.evoal.core.api.ea.constraints.strategies.CalculationResult;
-import de.evoal.core.api.ea.constraints.model.Constraint;
+import de.evoal.core.ea.api.constraints.strategies.CalculationResult;
+import de.evoal.core.ea.api.constraints.model.Constraint;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.languages.model.instance.Instance;
 import lombok.NonNull;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/model/Constraint.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/model/Constraint.java
similarity index 96%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/model/Constraint.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/model/Constraint.java
index c55abd06ba5ede6833bcf6623809477ff4c6d37e..d7e6d38c2e7fcacd13e4554d6d442c669ec26ac4 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/model/Constraint.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/model/Constraint.java
@@ -1,4 +1,4 @@
-package de.evoal.core.api.ea.constraints.model;
+package de.evoal.core.ea.api.constraints.model;
 
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertySpecification;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/model/ConstraintResult.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/model/ConstraintResult.java
similarity index 93%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/model/ConstraintResult.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/model/ConstraintResult.java
index af43503062aeec3e5fb0249957816daab9dd1477..b5a2cb947166cfc34d6180b7a32511e2c6289c95 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/model/ConstraintResult.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/model/ConstraintResult.java
@@ -1,4 +1,4 @@
-package de.evoal.core.api.ea.constraints.model;
+package de.evoal.core.ea.api.constraints.model;
 
 import de.evoal.core.api.properties.PropertySpecification;
 import lombok.Data;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/model/ConstraintType.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/model/ConstraintType.java
similarity index 78%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/model/ConstraintType.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/model/ConstraintType.java
index 3ed3568a2d911de0ddeba80054377d8b4d1f31c8..9f306c3a2ed255245e6d585bc134a79d75a3c7b2 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/model/ConstraintType.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/model/ConstraintType.java
@@ -1,4 +1,4 @@
-package de.evoal.core.api.ea.constraints.model;
+package de.evoal.core.ea.api.constraints.model;
 
 /**
  * Type of the constraint. A constraint can either be an equality constraint
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/model/Constraints.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/model/Constraints.java
similarity index 94%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/model/Constraints.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/model/Constraints.java
index b34928c867e0e42f3b26c63de17738d416c3046a..70cb827ddbce81a963b9d71d221aa432478d688a 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/model/Constraints.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/model/Constraints.java
@@ -1,4 +1,4 @@
-package de.evoal.core.api.ea.constraints.model;
+package de.evoal.core.ea.api.constraints.model;
 
 import de.evoal.core.api.properties.Properties;
 import javax.enterprise.inject.Vetoed;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/model/DataConstraints.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/model/DataConstraints.java
similarity index 97%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/model/DataConstraints.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/model/DataConstraints.java
index 6a57f4171ef362dcd8a6a9f18682992e991eca3f..69699261c0ed9c585e38bc1c57a5e2cf46485bfe 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/model/DataConstraints.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/model/DataConstraints.java
@@ -1,4 +1,4 @@
-package de.evoal.core.api.ea.constraints.model;
+package de.evoal.core.ea.api.constraints.model;
 
 import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.ddl.DataDescriptionModel;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/model/package-info.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/model/package-info.java
similarity index 62%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/model/package-info.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/model/package-info.java
index 31b616e2623cae00c5072441414b7a0b35d99250..e5e3b94fcc7f9f1f0ecc8bb4a13a08efe0ccb10d 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/model/package-info.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/model/package-info.java
@@ -1,4 +1,4 @@
 /**
  * The constraint model that can be used by implementing extensions.
  */
-package de.evoal.core.api.ea.constraints.model;
\ No newline at end of file
+package de.evoal.core.ea.api.constraints.model;
\ No newline at end of file
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/package-info.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/package-info.java
similarity index 72%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/package-info.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/package-info.java
index 77b586b44bffab64e59bd74a25afd22b9bd55dc2..4fe22a2cf6d137a8479df115b2017ccc60efb5e7 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/package-info.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/package-info.java
@@ -2,4 +2,4 @@
  * This package contains everything that has to do with constraints of
  *   genotypes or individuals.
  */
-package de.evoal.core.api.ea.constraints;
\ No newline at end of file
+package de.evoal.core.ea.api.constraints;
\ No newline at end of file
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/CalculationResult.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/CalculationResult.java
similarity index 89%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/CalculationResult.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/CalculationResult.java
index 2c72effcd0d5a723b4fbebc0896b1918397559e9..89283d257539bcdd337b0d04036a957a65ae8da1 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/CalculationResult.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/CalculationResult.java
@@ -1,6 +1,6 @@
-package de.evoal.core.api.ea.constraints.strategies;
+package de.evoal.core.ea.api.constraints.strategies;
 
-import de.evoal.core.api.ea.constraints.model.ConstraintResult;
+import de.evoal.core.ea.api.constraints.model.ConstraintResult;
 import lombok.Data;
 
 /**
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/HandlingStrategy.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/HandlingStrategy.java
similarity index 76%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/HandlingStrategy.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/HandlingStrategy.java
index 3a0687c18a99c947255ec7a360d0fbca6ca18145..44ea5b58cfe3d61b9f2d8c5153b2a8e2b7d6e965 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/HandlingStrategy.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/HandlingStrategy.java
@@ -1,4 +1,4 @@
-package de.evoal.core.api.ea.constraints.strategies;
+package de.evoal.core.ea.api.constraints.strategies;
 
 /**
  * A constraint handling strategy. The actual implementation decides what to do with
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/RepairStrategy.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/RepairStrategy.java
similarity index 88%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/RepairStrategy.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/RepairStrategy.java
index f9b5493420738592d63296b6a069709b0ab13e8d..1fe3543c54493fb058f14173f08353ea1fc1752b 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/RepairStrategy.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/RepairStrategy.java
@@ -1,4 +1,4 @@
-package de.evoal.core.api.ea.constraints.strategies;
+package de.evoal.core.ea.api.constraints.strategies;
 
 import de.evoal.languages.model.instance.Instance;
 import io.jenetics.Gene;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/fitness/MalusForFitnessStrategy.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/fitness/MalusForFitnessStrategy.java
similarity index 85%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/fitness/MalusForFitnessStrategy.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/fitness/MalusForFitnessStrategy.java
index c6d19237bdb0e9b48de7c196e459d4814d5a96de..b74ca6b8a7f381f9689a37029e70245bdf34b0d6 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/fitness/MalusForFitnessStrategy.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/fitness/MalusForFitnessStrategy.java
@@ -1,8 +1,8 @@
-package de.evoal.core.api.ea.constraints.strategies.fitness;
+package de.evoal.core.ea.api.constraints.strategies.fitness;
 
-import de.evoal.core.api.ea.constraints.strategies.HandlingStrategy;
-import de.evoal.core.api.ea.constraints.strategies.fitness.internal.ChainFunction;
-import de.evoal.core.api.ea.constraints.strategies.fitness.internal.IdentityFunction;
+import de.evoal.core.ea.api.constraints.strategies.HandlingStrategy;
+import de.evoal.core.ea.api.constraints.strategies.fitness.internal.ChainFunction;
+import de.evoal.core.ea.api.constraints.strategies.fitness.internal.IdentityFunction;
 import de.evoal.core.api.properties.Properties;
 
 /**
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/fitness/MalusFunction.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/fitness/MalusFunction.java
similarity index 89%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/fitness/MalusFunction.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/fitness/MalusFunction.java
index f05f19b9b929957117a9e4570cb8bd08a4801771..ef7bf0962f285114901fc6ed6114e61f216f6906 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/fitness/MalusFunction.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/fitness/MalusFunction.java
@@ -1,4 +1,4 @@
-package de.evoal.core.api.ea.constraints.strategies.fitness;
+package de.evoal.core.ea.api.constraints.strategies.fitness;
 
 import de.evoal.core.api.properties.Properties;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/fitness/internal/ChainFunction.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/fitness/internal/ChainFunction.java
similarity index 84%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/fitness/internal/ChainFunction.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/fitness/internal/ChainFunction.java
index 1e78559538c904a0747faf1727a056cd00e10efd..60a503701dbaa32edc9fef30759e0407af319f96 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/fitness/internal/ChainFunction.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/fitness/internal/ChainFunction.java
@@ -1,6 +1,6 @@
-package de.evoal.core.api.ea.constraints.strategies.fitness.internal;
+package de.evoal.core.ea.api.constraints.strategies.fitness.internal;
 
-import de.evoal.core.api.ea.constraints.strategies.fitness.MalusFunction;
+import de.evoal.core.ea.api.constraints.strategies.fitness.MalusFunction;
 import de.evoal.core.api.properties.Properties;
 
 public class ChainFunction implements MalusFunction {
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/fitness/internal/IdentityFunction.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/fitness/internal/IdentityFunction.java
similarity index 69%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/fitness/internal/IdentityFunction.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/fitness/internal/IdentityFunction.java
index 268b71c7354233a3a684cec01c6aed298dee57bb..5f7d3f7e941ada2e4b91ab3fede2148bbd0cda7d 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/fitness/internal/IdentityFunction.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/fitness/internal/IdentityFunction.java
@@ -1,6 +1,6 @@
-package de.evoal.core.api.ea.constraints.strategies.fitness.internal;
+package de.evoal.core.ea.api.constraints.strategies.fitness.internal;
 
-import de.evoal.core.api.ea.constraints.strategies.fitness.MalusFunction;
+import de.evoal.core.ea.api.constraints.strategies.fitness.MalusFunction;
 import de.evoal.core.api.properties.Properties;
 
 public class IdentityFunction implements MalusFunction {
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/fitness/internal/package-info.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/fitness/internal/package-info.java
similarity index 54%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/fitness/internal/package-info.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/fitness/internal/package-info.java
index cc59a125f9fee7dc504421da26d3cd79c5246ceb..fc1c069dc9124fef0af3bc5ccc9a92d8c59705a6 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/fitness/internal/package-info.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/fitness/internal/package-info.java
@@ -1,4 +1,4 @@
 /**
  * Internal classes that are not inteded for usage by clients.
  */
-package de.evoal.core.api.ea.constraints.strategies.fitness.internal;
\ No newline at end of file
+package de.evoal.core.ea.api.constraints.strategies.fitness.internal;
\ No newline at end of file
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/fitness/package-info.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/fitness/package-info.java
similarity index 81%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/fitness/package-info.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/fitness/package-info.java
index 9ead63b4869bf58610ae0ebfec29bbef32124180..678118e2be0ea74b85eec1128e1248d2a9c684e7 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/constraints/strategies/fitness/package-info.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/constraints/strategies/fitness/package-info.java
@@ -4,4 +4,4 @@
  *   this strategy is to reduce the fitness based on the calculated constraint
  *   difference.
  */
-package de.evoal.core.api.ea.constraints.strategies.fitness;
\ No newline at end of file
+package de.evoal.core.ea.api.constraints.strategies.fitness;
\ No newline at end of file
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/correlations/Correlation.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/correlations/Correlation.java
similarity index 89%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/correlations/Correlation.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/correlations/Correlation.java
index ac64ab6d4668dc1ac60d54ea3d9829016b3c88f9..501285b70c6a0a631bcdd40713701dd6f87f24d2 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/correlations/Correlation.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/correlations/Correlation.java
@@ -1,6 +1,6 @@
-package de.evoal.core.api.ea.correlations;
+package de.evoal.core.ea.api.correlations;
 
-import de.evoal.core.api.ea.codec.CustomCodec;
+import de.evoal.core.ea.api.codec.CustomCodec;
 import lombok.Data;
 
 /**
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/correlations/Correlations.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/correlations/Correlations.java
similarity index 95%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/correlations/Correlations.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/correlations/Correlations.java
index 182a46aac46c686ac439027a4da69da34e151f90..f57489c259ebbc2bf43e2b9482ce10af1bb8843f 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/correlations/Correlations.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/correlations/Correlations.java
@@ -1,6 +1,6 @@
-package de.evoal.core.api.ea.correlations;
+package de.evoal.core.ea.api.correlations;
 
-import de.evoal.core.api.ea.codec.CustomCodec;
+import de.evoal.core.ea.api.codec.CustomCodec;
 import de.evoal.core.api.properties.Properties;
 import io.jenetics.Gene;
 import io.jenetics.Genotype;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/correlations/Range.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/correlations/Range.java
similarity index 88%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/correlations/Range.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/correlations/Range.java
index 598e46364c33b1c844bc0121d0c80c32a02b665a..d173fbd205a50aaa3b2c3ef2ab495b6c6cca1a80 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/correlations/Range.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/correlations/Range.java
@@ -1,4 +1,4 @@
-package de.evoal.core.api.ea.correlations;
+package de.evoal.core.ea.api.correlations;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/correlations/RangedCorrelation.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/correlations/RangedCorrelation.java
similarity index 95%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/correlations/RangedCorrelation.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/correlations/RangedCorrelation.java
index 064a7a9436e10c12882c2d7d58e2ab08f016dc6a..62de16112d4bc43667177e699336047ac4f95bba 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/correlations/RangedCorrelation.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/correlations/RangedCorrelation.java
@@ -1,4 +1,4 @@
-package de.evoal.core.api.ea.correlations;
+package de.evoal.core.ea.api.correlations;
 
 import lombok.Data;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/initial/InitialPopulation.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/initial/InitialPopulation.java
similarity index 83%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/initial/InitialPopulation.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/initial/InitialPopulation.java
index 1d4192704c6a6cf104330aefc639726062c1b14a..aad1378be071788a69d0c0f8ad8af6ec5809117e 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/initial/InitialPopulation.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/initial/InitialPopulation.java
@@ -1,12 +1,10 @@
-package de.evoal.core.api.ea.initial;
+package de.evoal.core.ea.api.initial;
 
 import de.evoal.languages.model.instance.Instance;
 import io.jenetics.Gene;
 import io.jenetics.engine.Engine;
 import io.jenetics.engine.EvolutionStream;
 
-import java.util.function.Function;
-
 public interface InitialPopulation<G extends Gene<?, G>, C extends Comparable<C>> {
     InitialPopulation init(final Instance initialization);
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/package-info.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/package-info.java
similarity index 75%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/package-info.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/package-info.java
index a3ac75c03170a0588590326a18c540ea6b860a98..436da35f9f979d4213d1d61609bad76877f85f9f 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/package-info.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/package-info.java
@@ -1,4 +1,4 @@
 /**
  * Base package for all classes that are related to the evolutionary algorithm.
  */
-package de.evoal.core.api.ea;
\ No newline at end of file
+package de.evoal.core.ea.api;
\ No newline at end of file
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/AltererFactory.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/AltererFactory.java
similarity index 61%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/AltererFactory.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/AltererFactory.java
index bc094066f3bc5b62824fddf67392392e8eed6712..17886765ae9ce23f4030d2fa786ac66b8a1212b8 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/AltererFactory.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/AltererFactory.java
@@ -1,14 +1,14 @@
-package de.evoal.core.main.ea.alterer;
+package de.evoal.core.ea.main.alterer;
 
 import java.util.function.BiFunction;
 
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
-import de.evoal.core.main.ea.alterer.crossover.*;
-import de.evoal.core.main.ea.alterer.internal.MeanCorrelationAlterer;
-import de.evoal.core.main.ea.alterer.mutator.SingleBitFlipCorrelationMutator;
-import de.evoal.core.main.ea.alterer.mutator.SingleBitFlipMutator;
-import de.evoal.core.main.ea.alterer.mutator.SwapCorrelationMutator;
-import de.evoal.core.api.ea.correlations.Correlations;
+import de.evoal.core.api.optimisation.OptimisationValue;
+import de.evoal.core.ea.main.alterer.internal.MeanCorrelationAlterer;
+import de.evoal.core.ea.main.alterer.mutator.SingleBitFlipMutator;
+import de.evoal.core.ea.main.alterer.crossover.*;
+import de.evoal.core.ea.main.alterer.mutator.SingleBitFlipCorrelationMutator;
+import de.evoal.core.ea.main.alterer.mutator.SwapCorrelationMutator;
+import de.evoal.core.ea.api.correlations.Correlations;
 import de.evoal.languages.model.instance.Instance;
 import de.evoal.core.api.utils.LanguageHelper;
 import io.jenetics.*;
@@ -36,7 +36,7 @@ public class AltererFactory {
 	 *   <li>None</li>
 	 * </ul>
 	 */
-	public <G extends Gene<?, G>> Alterer<G, FitnessValue> create(final Instance config) {
+	public <G extends Gene<?, G>> Alterer<G, OptimisationValue> create(final Instance config) {
 		final String name = LanguageHelper.lookup(config, "name");
 
 		log.info("Creating alterer with name '{}'.", name);
@@ -44,7 +44,7 @@ public class AltererFactory {
 		switch(name) {
 			//case "CompositeAlterer": return createCompositeAlterer(config);
 			case "mean-alterer": return createMeanAlterer(config);
-			case "correlation-mean-alterer": return (Alterer<G, FitnessValue>) createCorrelationMeanAlterer(config);
+			case "correlation-mean-alterer": return (Alterer<G, OptimisationValue>) createCorrelationMeanAlterer(config);
 			case "partial-matched-alterer": return createPartiallyMatchedAlterer(config);
 			case "correlation-partial-matched-alterer": return createCorrelationPartiallyMatchedAlterer(config);
 
@@ -68,128 +68,128 @@ public class AltererFactory {
 		throw new IllegalStateException("Selector '" + name + "' is unknown.");
 	}
 
-	private <G extends Gene<?, G>> Alterer<G, FitnessValue> createUniformCrossover(final Instance config) {
+	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createUniformCrossover(final Instance config) {
 		final Double crossoverProbability = LanguageHelper.lookup(config, "crossover-probability");
 		final Double swapProbability = LanguageHelper.lookup(config,"swap-probability");
 
 		return new UniformCrossover<>(crossoverProbability, swapProbability);
 	}
 
-	private <G extends Gene<?, G>> Alterer<G, FitnessValue> createCorrelationUniformCrossover(final Instance config) {
+	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createCorrelationUniformCrossover(final Instance config) {
 		final Double crossoverProbability = LanguageHelper.lookup(config, "crossover-probability");
 		final Double swapProbability = LanguageHelper.lookup(config,"swap-probability");
 		
 		return new UniformCorrelationCrossover(crossoverProbability, swapProbability, correlations);
 	}
 
-	private <G extends Gene<?, G>> Alterer<G, FitnessValue> createBitFlipMutator (final Instance config) {
+	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createBitFlipMutator (final Instance config) {
 		final Double probability = LanguageHelper.lookup(config, "probability");
 
 		return new SingleBitFlipMutator(probability);
 	}
 
-	private <G extends Gene<?, G>> Alterer<G, FitnessValue> createCorrelationBitFlipMutator (final Instance config) {
+	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createCorrelationBitFlipMutator (final Instance config) {
 		final Double probability = LanguageHelper.lookup(config, "probability");
 		final Double threshold = LanguageHelper.lookup(config, "threshold");
 
 		return new SingleBitFlipCorrelationMutator(probability, threshold, correlations);
 	}
 
-	private <G extends Gene<?, G>> Alterer<G, FitnessValue> createSwapMutator (final Instance config) {
+	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createSwapMutator (final Instance config) {
 		final Double probability = LanguageHelper.lookup(config, "probability");
 
 		return new SwapMutator<>(probability);
 	}
 
-	private <G extends Gene<?, G>> Alterer<G, FitnessValue> createCorrelationSwapMutator (final Instance config) {
+	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createCorrelationSwapMutator (final Instance config) {
 		final Double probability = LanguageHelper.lookup(config, "probability");
 		final Double threshold = LanguageHelper.lookup(config, "threshold");
 
 		return new SwapCorrelationMutator<>(probability, threshold, correlations);
 	}
 
-	private <G extends Gene<?, G>> Alterer<G, FitnessValue> createSinglePointCrossover(final Instance config) {
+	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createSinglePointCrossover(final Instance config) {
 		final Double probability = LanguageHelper.lookup(config, "probability");
 
 		return new SinglePointCrossover<>(probability);
 	}
 
-	private <G extends Gene<?, G>> Alterer<G, FitnessValue> createCorrelationSinglePointCrossover(final Instance config) {
+	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createCorrelationSinglePointCrossover(final Instance config) {
 		final Double probability = LanguageHelper.lookup(config, "probability");
 
 		return new SinglePointCorrelationCrossover(probability, correlations);
 	}
 
-	private <G extends Gene<?, G>> Alterer<G, FitnessValue> createPartiallyMatchedAlterer(final Instance config) {
+	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createPartiallyMatchedAlterer(final Instance config) {
 		final Double probability = LanguageHelper.lookup(config, "probability");
 
-		return (Alterer<G, FitnessValue>) new PartiallyMatchedCrossover(probability);
+		return (Alterer<G, OptimisationValue>) new PartiallyMatchedCrossover(probability);
 	}
 
-	private <G extends Gene<?, G>> Alterer<G, FitnessValue> createCorrelationPartiallyMatchedAlterer(final Instance config) {
+	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createCorrelationPartiallyMatchedAlterer(final Instance config) {
 		final Double probability = LanguageHelper.lookup(config, "probability");
 
-		return (Alterer<G, FitnessValue>) new PartiallyMatchedCorrelationCrossover<G, FitnessValue>(probability, correlations);
+		return (Alterer<G, OptimisationValue>) new PartiallyMatchedCorrelationCrossover<G, OptimisationValue>(probability, correlations);
 	}
 
-	private <G extends Gene<?, G>> Alterer<G, FitnessValue> createMultiPointCrossover(final Instance config) {
+	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createMultiPointCrossover(final Instance config) {
 		final Double probability = LanguageHelper.lookup(config, "probability");
 		final Integer count = LanguageHelper.lookup(config, "count");
 
 		return new MultiPointCrossover<>(probability, count);
 	}
 
-	private <G extends Gene<?, G>> Alterer<G, FitnessValue> createCorrelationMultiPointCrossover(final Instance config) {
+	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createCorrelationMultiPointCrossover(final Instance config) {
 		final Double probability = LanguageHelper.lookup(config, "probability");
 		final Integer count = LanguageHelper.lookup(config, "count");
 
 		return new MultiPointCorrelationCrossover<>(probability, count, correlations);
 	}
 
-	private <G extends Gene<?, G>> Alterer<G, FitnessValue> createMeanAlterer(final Instance config) {
+	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createMeanAlterer(final Instance config) {
 		final Double probability = LanguageHelper.lookup(config, "probability");
 
-		return  (Alterer<G, FitnessValue>) new MeanAlterer(probability);
+		return  (Alterer<G, OptimisationValue>) new MeanAlterer(probability);
 	}
 
-	private <G extends NumericGene<?, G> & Mean<G>> Alterer<G, FitnessValue> createCorrelationMeanAlterer(final Instance config) {
+	private <G extends NumericGene<?, G> & Mean<G>> Alterer<G, OptimisationValue> createCorrelationMeanAlterer(final Instance config) {
 		final Double probability = LanguageHelper.lookup(config, "probability");
 
-		return  (Alterer<G, FitnessValue>) new MeanCorrelationAlterer<G, FitnessValue>(probability, correlations);
+		return  (Alterer<G, OptimisationValue>) new MeanCorrelationAlterer<G, OptimisationValue>(probability, correlations);
 	}
 
-	private <G extends Gene<?, G>> Alterer<G, FitnessValue> createLineCrossover(final Instance config) {
+	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createLineCrossover(final Instance config) {
 		final Double probability = LanguageHelper.lookup(config, "probability");
 		final Double position = LanguageHelper.lookup(config, "position");
 
 		return new LineCrossover(probability, position);
 	}
 
-	private <G extends Gene<?, G>> Alterer<G, FitnessValue> createCorrelationLineCrossover(final Instance config) {
+	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createCorrelationLineCrossover(final Instance config) {
 		final Double probability = LanguageHelper.lookup(config, "probability");
 		final Double position = LanguageHelper.lookup(config, "position");
 
 		return new LineCorrelationCrossover(probability, position, correlations);
 	}
 
-	private <G extends Gene<?, G>> Alterer<G, FitnessValue> createIntermediateCrossover(final Instance config) {
+	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createIntermediateCrossover(final Instance config) {
 		throw new IllegalStateException("Unsupported alterer.");
 	}
 
-	private <G extends Gene<?,G>> Alterer<G, FitnessValue> createGaussianMutator(final Instance config) {
+	private <G extends Gene<?,G>> Alterer<G, OptimisationValue> createGaussianMutator(final Instance config) {
 		final Double probability = LanguageHelper.lookup(config, "probability");
 		
 		return  new GaussianMutator(probability);
 	}
 
-	private <G extends Gene<?, G>> Alterer<G, FitnessValue> createGaussianCorrelationMutator(final Instance config) {
+	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createGaussianCorrelationMutator(final Instance config) {
 		final Double probability = LanguageHelper.lookup(config, "probability");
 		final Double threshold = LanguageHelper.lookup(config, "threshold");
 
 		return factory.apply(probability, threshold);
 	}
 
-	private <G extends Gene<?, G>> Alterer<G, FitnessValue> createCompositeAlterer(final Instance config) {
+	private <G extends Gene<?, G>> Alterer<G, OptimisationValue> createCompositeAlterer(final Instance config) {
 		throw new IllegalStateException("Unsupported alterer.");
 	}
 }
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/CorrelationCrossover.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/CorrelationCrossover.java
similarity index 95%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/CorrelationCrossover.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/CorrelationCrossover.java
index 6c905c34f7451349bb308839f7e4660bf2824f44..8561807797763dd22c66271e90f4ed09ecd84b13 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/CorrelationCrossover.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/CorrelationCrossover.java
@@ -1,7 +1,7 @@
-package de.evoal.core.main.ea.alterer.crossover;
+package de.evoal.core.ea.main.alterer.crossover;
 
-import de.evoal.core.api.ea.correlations.Correlation;
-import de.evoal.core.api.ea.correlations.Correlations;
+import de.evoal.core.ea.api.correlations.Correlation;
+import de.evoal.core.ea.api.correlations.Correlations;
 import io.jenetics.*;
 import io.jenetics.util.MSeq;
 import io.jenetics.util.RandomRegistry;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/CorrelationCrossoverMemento.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/CorrelationCrossoverMemento.java
similarity index 71%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/CorrelationCrossoverMemento.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/CorrelationCrossoverMemento.java
index 904ae7192a4ad72a8eaeb850a80ecea18a4780a4..d68d8672bb926d572248d05b54fb147cfd71d033 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/CorrelationCrossoverMemento.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/CorrelationCrossoverMemento.java
@@ -1,6 +1,6 @@
-package de.evoal.core.main.ea.alterer.crossover;
+package de.evoal.core.ea.main.alterer.crossover;
 
-import de.evoal.core.api.ea.correlations.Correlation;
+import de.evoal.core.ea.api.correlations.Correlation;
 
 public interface CorrelationCrossoverMemento<T extends CorrelationCrossoverMemento<T>> {
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/LineCorrelationCrossover.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/LineCorrelationCrossover.java
similarity index 96%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/LineCorrelationCrossover.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/LineCorrelationCrossover.java
index f5b4e587614f4f2a5908a078d939db991d87d0dc..7fdaa2dc36accff2693c32d5b04ac6814956be36 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/LineCorrelationCrossover.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/LineCorrelationCrossover.java
@@ -1,7 +1,7 @@
-package de.evoal.core.main.ea.alterer.crossover;
+package de.evoal.core.ea.main.alterer.crossover;
 
 import de.evoal.core.api.utils.Requirements;
-import de.evoal.core.api.ea.correlations.Correlations;
+import de.evoal.core.ea.api.correlations.Correlations;
 import io.jenetics.NumericGene;
 import io.jenetics.util.MSeq;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/LineCorrelationCrossoverMemento.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/LineCorrelationCrossoverMemento.java
similarity index 87%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/LineCorrelationCrossoverMemento.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/LineCorrelationCrossoverMemento.java
index 53b7466cbfe64fcbb14e2acd5e5f051035d28c01..19761ac27cbf340a58e258bb7ce8c93a9b8c103c 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/LineCorrelationCrossoverMemento.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/LineCorrelationCrossoverMemento.java
@@ -1,6 +1,6 @@
-package de.evoal.core.main.ea.alterer.crossover;
+package de.evoal.core.ea.main.alterer.crossover;
 
-import de.evoal.core.api.ea.correlations.Correlation;
+import de.evoal.core.ea.api.correlations.Correlation;
 import io.jenetics.util.RandomRegistry;
 import lombok.Data;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/MultiPointCorrelationCrossover.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/MultiPointCorrelationCrossover.java
similarity index 97%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/MultiPointCorrelationCrossover.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/MultiPointCorrelationCrossover.java
index 6c8228779ee5b8f8d3aa5487afd1799b8a009d4b..2b0e3f0e684b5cb3838061ffb21da44ccf1448ae 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/MultiPointCorrelationCrossover.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/MultiPointCorrelationCrossover.java
@@ -1,6 +1,6 @@
-package de.evoal.core.main.ea.alterer.crossover;
+package de.evoal.core.ea.main.alterer.crossover;
 
-import de.evoal.core.api.ea.correlations.Correlations;
+import de.evoal.core.ea.api.correlations.Correlations;
 import io.jenetics.Gene;
 import io.jenetics.util.MSeq;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/MultiPointCorrelationCrossoverMemento.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/MultiPointCorrelationCrossoverMemento.java
similarity index 89%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/MultiPointCorrelationCrossoverMemento.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/MultiPointCorrelationCrossoverMemento.java
index f7513b13e73e437b64349c9e3f23a30121fac4c8..d7acdba94660a02b0f67f7ba8dd3f28f9b9c45c5 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/MultiPointCorrelationCrossoverMemento.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/MultiPointCorrelationCrossoverMemento.java
@@ -1,6 +1,6 @@
-package de.evoal.core.main.ea.alterer.crossover;
+package de.evoal.core.ea.main.alterer.crossover;
 
-import de.evoal.core.api.ea.correlations.Correlation;
+import de.evoal.core.ea.api.correlations.Correlation;
 import io.jenetics.internal.math.Subset;
 import io.jenetics.util.RandomRegistry;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/PartiallyMatchedCorrelationCrossover.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/PartiallyMatchedCorrelationCrossover.java
similarity index 95%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/PartiallyMatchedCorrelationCrossover.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/PartiallyMatchedCorrelationCrossover.java
index 6df51c8c7baf1117c6d1497bf84c28a8e33a6c45..a9bafbc4bf1100ed97b9551c995a76c6b47dc3ae 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/PartiallyMatchedCorrelationCrossover.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/PartiallyMatchedCorrelationCrossover.java
@@ -1,6 +1,6 @@
-package de.evoal.core.main.ea.alterer.crossover;
+package de.evoal.core.ea.main.alterer.crossover;
 
-import de.evoal.core.api.ea.correlations.Correlations;
+import de.evoal.core.ea.api.correlations.Correlations;
 import io.jenetics.EnumGene;
 import io.jenetics.util.MSeq;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/PartiallyMatchedCorrelationCrossoverMemento.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/PartiallyMatchedCorrelationCrossoverMemento.java
similarity index 87%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/PartiallyMatchedCorrelationCrossoverMemento.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/PartiallyMatchedCorrelationCrossoverMemento.java
index 37ebc42c21b2e3f32c3d29919a78ca0097dca48c..8fa3f211abc884c0d8be60a41a31bee6dfafa575 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/PartiallyMatchedCorrelationCrossoverMemento.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/PartiallyMatchedCorrelationCrossoverMemento.java
@@ -1,6 +1,6 @@
-package de.evoal.core.main.ea.alterer.crossover;
+package de.evoal.core.ea.main.alterer.crossover;
 
-import de.evoal.core.api.ea.correlations.Correlation;
+import de.evoal.core.ea.api.correlations.Correlation;
 import io.jenetics.internal.math.Subset;
 import io.jenetics.util.RandomRegistry;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/SinglePointCorrelationCrossover.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/SinglePointCorrelationCrossover.java
similarity index 94%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/SinglePointCorrelationCrossover.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/SinglePointCorrelationCrossover.java
index df7d99e346c22e0d425f1aaaa37f5d1fbf2c48bf..785edcbb29ddfa53c1533d0fcce754a664f43cad 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/SinglePointCorrelationCrossover.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/SinglePointCorrelationCrossover.java
@@ -1,6 +1,6 @@
-package de.evoal.core.main.ea.alterer.crossover;
+package de.evoal.core.ea.main.alterer.crossover;
 
-import de.evoal.core.api.ea.correlations.Correlations;
+import de.evoal.core.ea.api.correlations.Correlations;
 import io.jenetics.Gene;
 import io.jenetics.util.MSeq;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/SinglePointCorrelationCrossoverMemento.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/SinglePointCorrelationCrossoverMemento.java
similarity index 94%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/SinglePointCorrelationCrossoverMemento.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/SinglePointCorrelationCrossoverMemento.java
index d814190a7a46a5c3d09f8dc9bbc2a751120e4c0d..2c7d613d4c089cbe146d1f26b19fd491ce127616 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/SinglePointCorrelationCrossoverMemento.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/SinglePointCorrelationCrossoverMemento.java
@@ -1,6 +1,6 @@
-package de.evoal.core.main.ea.alterer.crossover;
+package de.evoal.core.ea.main.alterer.crossover;
 
-import de.evoal.core.api.ea.correlations.Correlation;
+import de.evoal.core.ea.api.correlations.Correlation;
 import io.jenetics.util.RandomRegistry;
 import lombok.Getter;
 import lombok.Setter;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/UniformCorrelationCrossover.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/UniformCorrelationCrossover.java
similarity index 95%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/UniformCorrelationCrossover.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/UniformCorrelationCrossover.java
index f9f8bf64592a83afa2690a90b1aa71cfc680c8d5..4a8d095bce7b011544961c94982f1c4f214bb206 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/UniformCorrelationCrossover.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/UniformCorrelationCrossover.java
@@ -1,7 +1,7 @@
-package de.evoal.core.main.ea.alterer.crossover;
+package de.evoal.core.ea.main.alterer.crossover;
 
 import de.evoal.core.api.utils.Requirements;
-import de.evoal.core.api.ea.correlations.Correlations;
+import de.evoal.core.ea.api.correlations.Correlations;
 import io.jenetics.Gene;
 import io.jenetics.util.MSeq;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/UniformCorrelationCrossoverMemento.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/UniformCorrelationCrossoverMemento.java
similarity index 95%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/UniformCorrelationCrossoverMemento.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/UniformCorrelationCrossoverMemento.java
index c48d34fb500d5b380dea892dd28e81816559e186..4366384e2709b76cbae115560621469b2f6364d7 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/crossover/UniformCorrelationCrossoverMemento.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/crossover/UniformCorrelationCrossoverMemento.java
@@ -1,6 +1,6 @@
-package de.evoal.core.main.ea.alterer.crossover;
+package de.evoal.core.ea.main.alterer.crossover;
 
-import de.evoal.core.api.ea.correlations.Correlation;
+import de.evoal.core.ea.api.correlations.Correlation;
 import io.jenetics.util.RandomRegistry;
 import lombok.Getter;
 import lombok.Setter;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/internal/AbstractCorrelationAlterer.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/internal/AbstractCorrelationAlterer.java
similarity index 92%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/internal/AbstractCorrelationAlterer.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/internal/AbstractCorrelationAlterer.java
index ec6b6646247e49cf6e1a2c0d348e14ab8d452d48..a7f727eae16609f601673d8f2bbae655342bd423 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/internal/AbstractCorrelationAlterer.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/internal/AbstractCorrelationAlterer.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.alterer.internal;
+package de.evoal.core.ea.main.alterer.internal;
 
 import io.jenetics.AbstractAlterer;
 import io.jenetics.Gene;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/internal/CorrelationCombineAlterer.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/internal/CorrelationCombineAlterer.java
similarity index 96%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/internal/CorrelationCombineAlterer.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/internal/CorrelationCombineAlterer.java
index 04c08da2183233e8e0670de5b80dc9679f4d4f3e..16b129ebf4ae1c39e2c6659e6c38b7f10ff9f349 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/internal/CorrelationCombineAlterer.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/internal/CorrelationCombineAlterer.java
@@ -1,7 +1,7 @@
-package de.evoal.core.main.ea.alterer.internal;
+package de.evoal.core.ea.main.alterer.internal;
 
-import de.evoal.core.api.ea.correlations.Correlation;
-import de.evoal.core.api.ea.correlations.Correlations;
+import de.evoal.core.ea.api.correlations.Correlation;
+import de.evoal.core.ea.api.correlations.Correlations;
 import io.jenetics.*;
 import io.jenetics.util.BaseSeq;
 import io.jenetics.util.MSeq;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/internal/CorrelationRecombinator.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/internal/CorrelationRecombinator.java
similarity index 98%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/internal/CorrelationRecombinator.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/internal/CorrelationRecombinator.java
index 0b05bb86bd62a4181114209d0f0bb5d6f41f9885..a2b677126101f58b2352d870fc24702ca1cc2ef3 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/internal/CorrelationRecombinator.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/internal/CorrelationRecombinator.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.alterer.internal;
+package de.evoal.core.ea.main.alterer.internal;
 
 import io.jenetics.AltererResult;
 import io.jenetics.Gene;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/internal/MeanCorrelationAlterer.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/internal/MeanCorrelationAlterer.java
similarity index 89%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/internal/MeanCorrelationAlterer.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/internal/MeanCorrelationAlterer.java
index 9bf8f08c8bdfabeb9e41bb679645a9807a484891..07be1b6bcab0e040c078513e470f7a3c62689794 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/internal/MeanCorrelationAlterer.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/internal/MeanCorrelationAlterer.java
@@ -1,6 +1,6 @@
-package de.evoal.core.main.ea.alterer.internal;
+package de.evoal.core.ea.main.alterer.internal;
 
-import de.evoal.core.api.ea.correlations.Correlations;
+import de.evoal.core.ea.api.correlations.Correlations;
 import io.jenetics.*;
 import io.jenetics.util.Mean;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/CorrelationMutator.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/CorrelationMutator.java
similarity index 97%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/CorrelationMutator.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/CorrelationMutator.java
index 9419b4f1436b7811ab63376a1831eb6f089750de..78033e4ee3c09df3289b895650ca550926517339 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/CorrelationMutator.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/CorrelationMutator.java
@@ -1,8 +1,8 @@
-package de.evoal.core.main.ea.alterer.mutator;
+package de.evoal.core.ea.main.alterer.mutator;
 
-import de.evoal.core.main.ea.alterer.internal.AbstractCorrelationAlterer;
-import de.evoal.core.api.ea.correlations.Correlation;
-import de.evoal.core.api.ea.correlations.Correlations;
+import de.evoal.core.ea.main.alterer.internal.AbstractCorrelationAlterer;
+import de.evoal.core.ea.api.correlations.Correlation;
+import de.evoal.core.ea.api.correlations.Correlations;
 import io.jenetics.*;
 import io.jenetics.internal.math.Probabilities;
 import io.jenetics.util.ISeq;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/CorrelationMutatorFactory.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/CorrelationMutatorFactory.java
similarity index 87%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/CorrelationMutatorFactory.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/CorrelationMutatorFactory.java
index a7beee876d6ba64d240a5f1204db291355b1e166..84cb1a681b4fa2ea24110ad58beb4fe2e181dcf1 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/CorrelationMutatorFactory.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/CorrelationMutatorFactory.java
@@ -1,7 +1,7 @@
-package de.evoal.core.main.ea.alterer.mutator;
+package de.evoal.core.ea.main.alterer.mutator;
 
 import de.evoal.core.api.board.Blackboard;
-import de.evoal.core.api.ea.correlations.Correlations;
+import de.evoal.core.ea.api.correlations.Correlations;
 import io.jenetics.Alterer;
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.inject.Produces;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/CorrelationMutatorMemento.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/CorrelationMutatorMemento.java
similarity index 70%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/CorrelationMutatorMemento.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/CorrelationMutatorMemento.java
index c16a79c272e9e403da78360e8d20ce5a2c7abf47..b076919dbdc4ce3cc9829bd0bfb3e1639f87abc6 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/CorrelationMutatorMemento.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/CorrelationMutatorMemento.java
@@ -1,7 +1,7 @@
-package de.evoal.core.main.ea.alterer.mutator;
+package de.evoal.core.ea.main.alterer.mutator;
 
 
-import de.evoal.core.api.ea.correlations.Correlation;
+import de.evoal.core.ea.api.correlations.Correlation;
 
 /**
  * Memento to preserve the state of correlation-aware mutator.
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/GaussianCorrelationMutator.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/GaussianCorrelationMutator.java
similarity index 90%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/GaussianCorrelationMutator.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/GaussianCorrelationMutator.java
index 8fc7d7b58586881201c069cbd3a85f09a9fd02d5..c4bf3d67d5aad964cda9c7bc0cec3717f6329860 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/GaussianCorrelationMutator.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/GaussianCorrelationMutator.java
@@ -1,6 +1,6 @@
-package de.evoal.core.main.ea.alterer.mutator;
+package de.evoal.core.ea.main.alterer.mutator;
 
-import de.evoal.core.api.ea.correlations.Correlations;
+import de.evoal.core.ea.api.correlations.Correlations;
 import io.jenetics.NumericGene;
 
 import java.util.random.RandomGenerator;
@@ -47,7 +47,7 @@ public class GaussianCorrelationMutator<
 
     @Override
     public String toString() {
-        return format("%s[p=%f]", getClass().getSimpleName(), _probability);
+        return String.format("%s[p=%f]", getClass().getSimpleName(), _probability);
     }
 
     @Override
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/GaussianCorrelationMutatorMemento.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/GaussianCorrelationMutatorMemento.java
similarity index 91%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/GaussianCorrelationMutatorMemento.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/GaussianCorrelationMutatorMemento.java
index d492e41e5ed2758ebe231b8d8d15ea57c3940c8f..826cd7e0704d0b91d7c96df5430a46ad981f8ef9 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/GaussianCorrelationMutatorMemento.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/GaussianCorrelationMutatorMemento.java
@@ -1,6 +1,6 @@
-package de.evoal.core.main.ea.alterer.mutator;
+package de.evoal.core.ea.main.alterer.mutator;
 
-import de.evoal.core.api.ea.correlations.Correlation;
+import de.evoal.core.ea.api.correlations.Correlation;
 import lombok.Data;
 
 import java.util.Random;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/SingleBitFlipCorrelationMutator.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/SingleBitFlipCorrelationMutator.java
similarity index 97%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/SingleBitFlipCorrelationMutator.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/SingleBitFlipCorrelationMutator.java
index b3ce2a63af51bf707d15be3df599684354b1ba7f..2b71541a7f1091c7c4307f66611da1a9f5747845 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/SingleBitFlipCorrelationMutator.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/SingleBitFlipCorrelationMutator.java
@@ -1,6 +1,6 @@
-package de.evoal.core.main.ea.alterer.mutator;
+package de.evoal.core.ea.main.alterer.mutator;
 
-import de.evoal.core.api.ea.correlations.Correlations;
+import de.evoal.core.ea.api.correlations.Correlations;
 import io.jenetics.*;
 import io.jenetics.util.MSeq;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/SingleBitFlipCorrelationMutatorMemento.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/SingleBitFlipCorrelationMutatorMemento.java
similarity index 96%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/SingleBitFlipCorrelationMutatorMemento.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/SingleBitFlipCorrelationMutatorMemento.java
index 28f26afae665ef743f4ed68426b1f76b124add26..ec047b651e14d1c137181062ccc71d345d62a901 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/SingleBitFlipCorrelationMutatorMemento.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/SingleBitFlipCorrelationMutatorMemento.java
@@ -1,6 +1,6 @@
-package de.evoal.core.main.ea.alterer.mutator;
+package de.evoal.core.ea.main.alterer.mutator;
 
-import de.evoal.core.api.ea.correlations.Correlation;
+import de.evoal.core.ea.api.correlations.Correlation;
 import lombok.Getter;
 import lombok.Setter;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/SingleBitFlipMutator.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/SingleBitFlipMutator.java
similarity index 96%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/SingleBitFlipMutator.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/SingleBitFlipMutator.java
index 2aab3ccf4fdac70b79765e3721caa05d66848179..44bfaa470d0b547e9cf521661b4fc94e53af80a6 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/SingleBitFlipMutator.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/SingleBitFlipMutator.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.alterer.mutator;
+package de.evoal.core.ea.main.alterer.mutator;
 
 import io.jenetics.*;
 import io.jenetics.util.MSeq;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/SwapCorrelationMutator.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/SwapCorrelationMutator.java
similarity index 94%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/SwapCorrelationMutator.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/SwapCorrelationMutator.java
index 272ba8e8d961daf6b0f0a0bbc3242aa4d2f3b873..ee4b36848d3b9e21a1a2a0afb61f6e5ee1eea1a9 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/SwapCorrelationMutator.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/SwapCorrelationMutator.java
@@ -1,6 +1,6 @@
-package de.evoal.core.main.ea.alterer.mutator;
+package de.evoal.core.ea.main.alterer.mutator;
 
-import de.evoal.core.api.ea.correlations.Correlations;
+import de.evoal.core.ea.api.correlations.Correlations;
 import io.jenetics.Chromosome;
 import io.jenetics.Gene;
 import io.jenetics.MutatorResult;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/SwapCorrelationMutatorMemento.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/SwapCorrelationMutatorMemento.java
similarity index 87%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/SwapCorrelationMutatorMemento.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/SwapCorrelationMutatorMemento.java
index c38bf41c1568948b17a7c0d03d90abddc6cce750..e0fa7d9642a13b125be1cc389afc399634fc54d3 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/alterer/mutator/SwapCorrelationMutatorMemento.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/SwapCorrelationMutatorMemento.java
@@ -1,6 +1,6 @@
-package de.evoal.core.main.ea.alterer.mutator;
+package de.evoal.core.ea.main.alterer.mutator;
 
-import de.evoal.core.api.ea.correlations.Correlation;
+import de.evoal.core.ea.api.correlations.Correlation;
 
 import java.util.random.RandomGenerator;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/DynamicCodec.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/DynamicCodec.java
similarity index 82%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/DynamicCodec.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/DynamicCodec.java
index c9e32d1922cc407871fb9046dd051dd55a794e8f..714bce241a21d798db1e6c90fe68e966004260e3 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/DynamicCodec.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/DynamicCodec.java
@@ -1,23 +1,20 @@
-package de.evoal.core.main.ea.codec;
+package de.evoal.core.ea.main.codec;
 
 import de.evoal.core.api.cdi.BeanFactory;
-import de.evoal.core.api.ea.codec.CustomCodec;
+import de.evoal.core.ea.api.codec.CustomCodec;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertiesSpecification;
-import de.evoal.core.main.ea.codec.chromosome.DynamicChromosome;
-import de.evoal.core.main.ea.codec.chromosome.DynamicChromosomeFactory;
-import de.evoal.languages.model.ddl.DataDescription;
+import de.evoal.core.ea.main.codec.chromosome.DynamicChromosome;
+import de.evoal.core.ea.main.codec.chromosome.DynamicChromosomeFactory;
 import de.evoal.languages.model.instance.Array;
-import de.evoal.languages.model.instance.Attribute;
-import de.evoal.languages.model.instance.DataReference;
 import de.evoal.languages.model.instance.Instance;
 import io.jenetics.Chromosome;
 import io.jenetics.Gene;
 import io.jenetics.Genotype;
 import io.jenetics.util.Factory;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.math3.util.Pair;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -34,10 +31,9 @@ public class DynamicCodec<G extends Gene<?, G>> implements CustomCodec<G> {
         this.dynamicTemplates = dynamicTemplates;
     }
 
-    static DynamicCodec from(final Array config, final PropertiesSpecification specification) {
+    static DynamicCodec from(final Instance [] config, final PropertiesSpecification specification) {
         final DynamicChromosomeFactory factory = BeanFactory.create(DynamicChromosomeFactory.class);
-        final List<DynamicChromosome> chromosomes = config.getValues()
-                                                          .stream()
+        final List<DynamicChromosome> chromosomes = Arrays.stream(config)
                                                           .map(Instance.class::cast)
                                                           .map(factory::create)
                                                           .collect(Collectors.toList());
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/DynamicCodecProducer.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/DynamicCodecProducer.java
similarity index 78%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/DynamicCodecProducer.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/DynamicCodecProducer.java
index bd7eec67b605969700a4862a35225f1802d7de7d..e8abb95275970d8401d21970198a37e95be4678f 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/DynamicCodecProducer.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/DynamicCodecProducer.java
@@ -1,9 +1,10 @@
-package de.evoal.core.main.ea.codec;
+package de.evoal.core.ea.main.codec;
 
 import de.evoal.core.api.board.CoreBlackboardEntries;
 import de.evoal.core.api.cdi.ConfigurationValue;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.languages.model.instance.Array;
+import de.evoal.languages.model.instance.Instance;
 import lombok.extern.slf4j.Slf4j;
 
 import javax.enterprise.context.ApplicationScoped;
@@ -14,7 +15,7 @@ import javax.inject.Named;
 @Slf4j
 public class DynamicCodecProducer {
     @Produces @ApplicationScoped
-    public DynamicCodec create(@ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.genotype") Array config, final @Named("genotype-specification") PropertiesSpecification specification) {
+    public DynamicCodec create(@ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.genotype") Instance[] config, final @Named("genotype-specification") PropertiesSpecification specification) {
         log.info("Creating encoding for EA problem.");
 
         return DynamicCodec.from(config, specification);
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicBitChromosome.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicBitChromosome.java
similarity index 75%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicBitChromosome.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicBitChromosome.java
index c050bb51a6b61fa159dd91a822ce9882fcae909b..ef50d766d86ee71969abd8a86c8943c49a86e5a5 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicBitChromosome.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicBitChromosome.java
@@ -1,14 +1,9 @@
-package de.evoal.core.main.ea.codec.chromosome;
+package de.evoal.core.ea.main.codec.chromosome;
 
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertySpecification;
-import de.evoal.core.api.utils.Requirements;
-import de.evoal.core.main.jenetics.BitHelper;
-import de.evoal.core.main.jenetics.GrayBoundedBitChromosome;
-import de.evoal.core.main.jenetics.NaiveBoundedBitChromosome;
-import de.evoal.languages.model.el.IntegerLiteral;
-import de.evoal.languages.model.instance.Instance;
-import de.evoal.languages.model.instance.LiteralValue;
+import de.evoal.core.ea.main.jenetics.BitHelper;
+import de.evoal.core.ea.main.jenetics.NaiveBoundedBitChromosome;
 import io.jenetics.Chromosome;
 import io.jenetics.util.DoubleRange;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicBoundedDoubleChromosome.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicBoundedDoubleChromosome.java
similarity index 95%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicBoundedDoubleChromosome.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicBoundedDoubleChromosome.java
index 2b85fc688b952118d4a63e333924c2b64b1b6e95..6775e82ca79d990ca62b33ff7744b69670c43dbc 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicBoundedDoubleChromosome.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicBoundedDoubleChromosome.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.codec.chromosome;
+package de.evoal.core.ea.main.codec.chromosome;
 
 import de.evoal.core.api.properties.PropertySpecification;
 import de.evoal.core.api.properties.info.PropertiesBoundaries;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicBoundedIntegerChromosome.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicBoundedIntegerChromosome.java
similarity index 92%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicBoundedIntegerChromosome.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicBoundedIntegerChromosome.java
index 70d8330cc5a798453e69031e55f6f1e258c1c42d..18a9b49749210fcc9ee2b181c3fc97efb38b6e38 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicBoundedIntegerChromosome.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicBoundedIntegerChromosome.java
@@ -1,10 +1,9 @@
-package de.evoal.core.main.ea.codec.chromosome;
+package de.evoal.core.ea.main.codec.chromosome;
 
 import de.evoal.core.api.properties.PropertySpecification;
 import de.evoal.core.api.properties.info.PropertiesBoundaries;
 import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.instance.Instance;
-import io.jenetics.util.DoubleRange;
 import io.jenetics.util.IntRange;
 
 import javax.inject.Inject;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicChromosome.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicChromosome.java
similarity index 97%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicChromosome.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicChromosome.java
index 99527980fa8293f59cf1cb0cde05d15982bd7463..aae68706f1c30a374a1c21168b8fac1644505b45 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicChromosome.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicChromosome.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.codec.chromosome;
+package de.evoal.core.ea.main.codec.chromosome;
 
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertiesSpecification;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicChromosomeFactory.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicChromosomeFactory.java
similarity index 91%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicChromosomeFactory.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicChromosomeFactory.java
index 72004b58ea2878f5d2fa214ed5dbe0cbdfe722d4..8a38301c0130caa5987650e2cd1ad7d0e4909cb5 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicChromosomeFactory.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicChromosomeFactory.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.codec.chromosome;
+package de.evoal.core.ea.main.codec.chromosome;
 
 import de.evoal.core.api.cdi.BeanFactory;
 import de.evoal.languages.model.instance.Instance;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicDoubleChromosome.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicDoubleChromosome.java
similarity index 91%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicDoubleChromosome.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicDoubleChromosome.java
index 15ebc323fb77189c87da86336ffe4a4d56dc4f91..ccac308e80d43672def7dcc69ce92e8bf2422791 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicDoubleChromosome.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicDoubleChromosome.java
@@ -1,9 +1,9 @@
-package de.evoal.core.main.ea.codec.chromosome;
+package de.evoal.core.ea.main.codec.chromosome;
 
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertySpecification;
-import de.evoal.core.main.jenetics.BoundedDoubleChromosome;
-import de.evoal.core.main.jenetics.BoundedDoubleGene;
+import de.evoal.core.ea.main.jenetics.BoundedDoubleChromosome;
+import de.evoal.core.ea.main.jenetics.BoundedDoubleGene;
 import io.jenetics.Chromosome;
 import io.jenetics.util.DoubleRange;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicGrayChromosome.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicGrayChromosome.java
similarity index 75%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicGrayChromosome.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicGrayChromosome.java
index 1c18683bf94e54e5b623e397c761b1c886b530c2..95c0161c638140f440fe2bd7dab353fb240adba6 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicGrayChromosome.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicGrayChromosome.java
@@ -1,20 +1,14 @@
-package de.evoal.core.main.ea.codec.chromosome;
+package de.evoal.core.ea.main.codec.chromosome;
 
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertySpecification;
-import de.evoal.core.api.utils.Requirements;
-import de.evoal.core.main.jenetics.GrayBoundedBitChromosome;
-import de.evoal.core.main.jenetics.GrayHelper;
-import de.evoal.languages.model.el.IntegerLiteral;
-import de.evoal.languages.model.instance.Instance;
-import de.evoal.languages.model.instance.LiteralValue;
+import de.evoal.core.ea.main.jenetics.GrayBoundedBitChromosome;
+import de.evoal.core.ea.main.jenetics.GrayHelper;
 import io.jenetics.Chromosome;
 import io.jenetics.util.DoubleRange;
 
 import javax.enterprise.context.Dependent;
 import javax.inject.Named;
-import java.util.List;
-import java.util.stream.Collectors;
 
 @Dependent
 @Named("gray-chromosome")
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicIntegerChromosome.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicIntegerChromosome.java
similarity index 82%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicIntegerChromosome.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicIntegerChromosome.java
index 44481abd0aa38d7577ea04334e4cce4a1e56d071..7b7d2e276dee160ca6d85f468e114aa118d0e73e 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicIntegerChromosome.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicIntegerChromosome.java
@@ -1,17 +1,13 @@
-package de.evoal.core.main.ea.codec.chromosome;
+package de.evoal.core.ea.main.codec.chromosome;
 
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertySpecification;
-import de.evoal.core.api.properties.info.PropertiesBoundaries;
-import de.evoal.core.main.jenetics.BoundedDoubleChromosome;
-import de.evoal.core.main.jenetics.BoundedDoubleGene;
-import de.evoal.core.main.jenetics.BoundedIntegerChromosome;
-import de.evoal.core.main.jenetics.BoundedIntegerGene;
+import de.evoal.core.ea.main.jenetics.BoundedIntegerChromosome;
+import de.evoal.core.ea.main.jenetics.BoundedIntegerGene;
 import io.jenetics.Chromosome;
 import io.jenetics.util.IntRange;
 
 import javax.enterprise.context.Dependent;
-import javax.inject.Inject;
 import javax.inject.Named;
 import java.util.ArrayList;
 import java.util.List;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicScaledChromosome.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicScaledChromosome.java
similarity index 95%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicScaledChromosome.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicScaledChromosome.java
index 9fd9a45c50d23cd93100539e3f3d32daa7d56953..950267d28da833754dc3d6f90fee3f2161dbb74e 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/codec/chromosome/DynamicScaledChromosome.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicScaledChromosome.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.codec.chromosome;
+package de.evoal.core.ea.main.codec.chromosome;
 
 import de.evoal.core.api.utils.Requirements;
 import de.evoal.languages.model.ddl.DataDescription;
diff --git a/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/comparator/ParetoComparator.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/comparator/ParetoComparator.java
new file mode 100644
index 0000000000000000000000000000000000000000..5c955ff50f061a30532209ad78ae7f27a1b29289
--- /dev/null
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/comparator/ParetoComparator.java
@@ -0,0 +1,23 @@
+package de.evoal.core.ea.main.comparator;
+
+import de.evoal.core.api.optimisation.OptimisationValueComparator;
+import de.evoal.core.api.optimisation.OptimisationValue;
+import de.evoal.languages.model.instance.Instance;
+
+import javax.enterprise.context.ApplicationScoped;
+
+import javax.inject.Named;
+
+@ApplicationScoped
+@Named("pareto")
+public class ParetoComparator implements OptimisationValueComparator {
+    @Override
+    public OptimisationValue toValue(final double[] optimisationValues) {
+        return ParetoOptimisationValue.of(optimisationValues);
+    }
+
+    @Override
+    public ParetoComparator init(Instance config) {
+        return this;
+    }
+}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/comparator/ParetoFitnessValue.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/comparator/ParetoOptimisationValue.java
similarity index 64%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/comparator/ParetoFitnessValue.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/comparator/ParetoOptimisationValue.java
index 4a97568219d391d9a517109edd73479d84b8568e..9ca49b3c2e2664d2804f26e945392d2d22d59c3c 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/comparator/ParetoFitnessValue.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/comparator/ParetoOptimisationValue.java
@@ -1,29 +1,29 @@
-package de.evoal.core.main.ea.comparator;
+package de.evoal.core.ea.main.comparator;
 
 import java.util.Arrays;
 
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
+import de.evoal.core.api.optimisation.OptimisationValue;
 import io.jenetics.ext.moea.Vec;
 import lombok.NonNull;
 
-public class ParetoFitnessValue implements FitnessValue {
+public class ParetoOptimisationValue implements OptimisationValue {
     private final Vec<double []> fitnessValues;
 
-    private ParetoFitnessValue(final @NonNull double[] fitnessValues) {
+    private ParetoOptimisationValue(final @NonNull double[] fitnessValues) {
         this.fitnessValues = Vec.of(fitnessValues);
     }
 
-    public static FitnessValue of(final double [] fitnessValues) {
-        return new ParetoFitnessValue(fitnessValues);
+    public static OptimisationValue of(final double [] fitnessValues) {
+        return new ParetoOptimisationValue(fitnessValues);
     }
 
     @Override
-    public int compareTo(final FitnessValue other) {
-        if(!(other instanceof ParetoFitnessValue)) {
+    public int compareTo(final OptimisationValue other) {
+        if(!(other instanceof ParetoOptimisationValue)) {
             throw new IllegalArgumentException("Only allowed to compare pareto fitness values");
         }
 
-        return this.makeAbsolute().compareTo(((ParetoFitnessValue)other).makeAbsolute());
+        return this.makeAbsolute().compareTo(((ParetoOptimisationValue)other).makeAbsolute());
     }
     
     private final Vec<double[]> makeAbsolute(){
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/ConstraintProducer.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/ConstraintProducer.java
similarity index 87%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/ConstraintProducer.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/ConstraintProducer.java
index 2db5c6e812fe58f2436c3e457ccce1974c00e3d4..a681fa71f9721152f85dfcb4fe2e15848a2f606c 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/ConstraintProducer.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/ConstraintProducer.java
@@ -1,28 +1,26 @@
-package de.evoal.core.main.ea.constraints.constraint;
+package de.evoal.core.ea.main.constraints.constraint;
 
 import de.evoal.core.api.board.CoreBlackboardEntries;
 import de.evoal.core.api.cdi.ConfigurationValue;
-import de.evoal.core.api.ea.constraints.model.Constraint;
-import de.evoal.core.api.ea.constraints.model.Constraints;
-import de.evoal.core.api.ea.constraints.model.DataConstraints;
+import de.evoal.core.ea.api.constraints.model.Constraint;
+import de.evoal.core.ea.api.constraints.model.Constraints;
+import de.evoal.core.ea.api.constraints.model.DataConstraints;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.inject.Produces;
 import javax.inject.Named;
 
-import de.evoal.core.main.ea.constraints.el.ElHelper;
-import de.evoal.core.main.ea.constraints.el.LogHelper;
+import de.evoal.core.ea.main.constraints.constraint.ast.ConditionConverter;
+import de.evoal.core.ea.main.constraints.el.ElHelper;
+import de.evoal.core.ea.main.constraints.el.LogHelper;
 import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.ddl.FunctionName;
-import de.evoal.languages.model.ddl.dsl.DataDescriptionLanguageStandaloneSetup;
 import de.evoal.languages.model.el.Call;
-import de.evoal.core.main.ea.constraints.constraint.ast.ConditionConverter;
 import de.evoal.languages.model.instance.Array;
 import de.evoal.languages.model.instance.Attribute;
 import de.evoal.languages.model.instance.DataReference;
 import de.evoal.languages.model.instance.Instance;
 import lombok.extern.slf4j.Slf4j;
-import org.eclipse.xtext.serializer.impl.Serializer;
 
 import java.util.Objects;
 import java.util.Optional;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/ast/BoundaryIdentifier.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/ast/BoundaryIdentifier.java
similarity index 91%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/ast/BoundaryIdentifier.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/ast/BoundaryIdentifier.java
index d452d228fddb472813dff1078a63032b874120c3..3aa7e14a5f0d8d1c92c428abe84ac4451d5a435e 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/ast/BoundaryIdentifier.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/ast/BoundaryIdentifier.java
@@ -1,15 +1,11 @@
-package de.evoal.core.main.ea.constraints.constraint.ast;
+package de.evoal.core.ea.main.constraints.constraint.ast;
 
-import de.evoal.core.api.ea.constraints.model.DataConstraints;
+import de.evoal.core.ea.api.constraints.model.DataConstraints;
 import de.evoal.core.api.properties.PropertySpecification;
 import de.evoal.core.api.properties.info.PropertiesBoundaries;
-import de.evoal.core.api.utils.Requirements;
 import de.evoal.languages.model.ddl.DataDescription;
-import de.evoal.languages.model.ddl.DataReference;
 import de.evoal.languages.model.ddl.RepresentationType;
-import de.evoal.languages.model.ddl.SelfReference;
 import de.evoal.languages.model.el.*;
-import de.evoal.languages.model.el.util.ELSwitch;
 import lombok.extern.slf4j.Slf4j;
 
 import java.util.*;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/ast/ConditionConverter.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/ast/ConditionConverter.java
similarity index 88%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/ast/ConditionConverter.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/ast/ConditionConverter.java
index d424bb6f9598b6ed985faef89efbc20dbb11ef91..9c0a3952860de6c4a8032faaa162917968ef1179 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/ast/ConditionConverter.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/ast/ConditionConverter.java
@@ -1,12 +1,12 @@
-package de.evoal.core.main.ea.constraints.constraint.ast;
+package de.evoal.core.ea.main.constraints.constraint.ast;
 
 import de.evoal.core.api.utils.Requirements;
-import de.evoal.core.api.ea.constraints.model.ConstraintType;
+import de.evoal.core.ea.api.constraints.model.ConstraintType;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.core.api.properties.PropertySpecification;
-import static de.evoal.core.main.ea.constraints.constraint.utils.ArithmeticNumberOperations.*;
 
+import de.evoal.core.ea.main.constraints.constraint.utils.ArithmeticNumberOperations;
 import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.ddl.DataReference;
 import de.evoal.languages.model.ddl.SelfReference;
@@ -79,13 +79,13 @@ public class ConditionConverter extends ELSwitch<Object> {
             case EQUAL:
             case GREATER_EQUAL:
             case GREATER_THAN: {
-                function = (gen, fit) -> minus(leftValue.apply(gen, fit), rightValue.apply(gen, fit));
+                function = (gen, fit) -> ArithmeticNumberOperations.minus(leftValue.apply(gen, fit), rightValue.apply(gen, fit));
                 break;
             }
             case LESS_EQUAL:
             case LESS_THAN:
             {
-                function = (gen, fit) -> minus(rightValue.apply(gen, fit), leftValue.apply(gen, fit));
+                function = (gen, fit) -> ArithmeticNumberOperations.minus(rightValue.apply(gen, fit), leftValue.apply(gen, fit));
                 break;
             }
             case UNEQUAL: {
@@ -125,13 +125,13 @@ public class ConditionConverter extends ELSwitch<Object> {
             switch (operator) {
                 case ADD: {
                     final BiFunction<Properties, Properties, Object> lOp = value;
-                    value = (gen, fit) -> add(lOp.apply(gen, fit), rOp.apply(gen, fit));
+                    value = (gen, fit) -> ArithmeticNumberOperations.add(lOp.apply(gen, fit), rOp.apply(gen, fit));
                     break;
                 }
 
                 case SUBTRACT: {
                     final BiFunction<Properties, Properties, Object> lOp = value;
-                    value = (gen, fit) -> minus(lOp.apply(gen, fit), rOp.apply(gen, fit));
+                    value = (gen, fit) -> ArithmeticNumberOperations.minus(lOp.apply(gen, fit), rOp.apply(gen, fit));
                     break;
                 }
             }
@@ -150,19 +150,19 @@ public class ConditionConverter extends ELSwitch<Object> {
             switch (operator) {
                 case DIVIDE: {
                     final BiFunction<Properties, Properties, Object> lOp = value;
-                    value = (gen, fit) -> divide(lOp.apply(gen, fit), rOp.apply(gen, fit));
+                    value = (gen, fit) -> ArithmeticNumberOperations.divide(lOp.apply(gen, fit), rOp.apply(gen, fit));
                     break;
                 }
 
                 case MODULO: {
                     final BiFunction<Properties, Properties, Object> lOp = value;
-                    value = (gen, fit) -> modulo(lOp.apply(gen, fit), rOp.apply(gen, fit));
+                    value = (gen, fit) -> ArithmeticNumberOperations.modulo(lOp.apply(gen, fit), rOp.apply(gen, fit));
                     break;
                 }
 
                 case MULTIPLY: {
                     final BiFunction<Properties, Properties, Object> lOp = value;
-                    value = (gen, fit) -> multiply(lOp.apply(gen, fit), rOp.apply(gen, fit));
+                    value = (gen, fit) -> ArithmeticNumberOperations.multiply(lOp.apply(gen, fit), rOp.apply(gen, fit));
                     break;
                 }
             }
@@ -178,7 +178,7 @@ public class ConditionConverter extends ELSwitch<Object> {
             final BiFunction<Properties, Properties, Object> lOp = value;
             final BiFunction<Properties, Properties, Object> rOp = (BiFunction<Properties, Properties, Object>) doSwitch(object.getRightOperand());
 
-            value = (gen, fit) -> pow(lOp.apply(gen, fit), rOp.apply(gen, fit));
+            value = (gen, fit) -> ArithmeticNumberOperations.pow(lOp.apply(gen, fit), rOp.apply(gen, fit));
         }
         return value;
     }
@@ -196,7 +196,7 @@ public class ConditionConverter extends ELSwitch<Object> {
 
                 case SUBTRACT: {
                     final BiFunction<Properties, Properties, Object> lOp = value;
-                    value = (gen, fit) -> minus(0, lOp.apply(gen, fit));
+                    value = (gen, fit) -> ArithmeticNumberOperations.minus(0, lOp.apply(gen, fit));
                     break;
                 }
             }
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/ast/UnaryBoundaryIdentifier.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/ast/UnaryBoundaryIdentifier.java
similarity index 93%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/ast/UnaryBoundaryIdentifier.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/ast/UnaryBoundaryIdentifier.java
index c73b01ce8b160e21310c34e72471f4dfdc376ca9..f837106ad183216ff800f9697ac787865bb1146b 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/ast/UnaryBoundaryIdentifier.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/ast/UnaryBoundaryIdentifier.java
@@ -1,21 +1,13 @@
-package de.evoal.core.main.ea.constraints.constraint.ast;
+package de.evoal.core.ea.main.constraints.constraint.ast;
 
-import de.evoal.core.api.ea.constraints.model.DataConstraints;
-import de.evoal.core.api.properties.PropertySpecification;
-import de.evoal.core.api.properties.info.PropertiesBoundaries;
 import de.evoal.core.api.utils.Requirements;
 import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.ddl.DataReference;
-import de.evoal.languages.model.ddl.RepresentationType;
 import de.evoal.languages.model.ddl.SelfReference;
 import de.evoal.languages.model.el.*;
 import de.evoal.languages.model.el.util.ELSwitch;
 import lombok.extern.slf4j.Slf4j;
 
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
 @Slf4j
 public class UnaryBoundaryIdentifier extends ELSwitch<Object> {
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/calculations/NormalCalculation.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/calculations/NormalCalculation.java
similarity index 75%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/calculations/NormalCalculation.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/calculations/NormalCalculation.java
index a12ba46fce9ba845f9bf37d304859f1a8331afcc..6b1cae346b5787f4102339f3c7d5a95033d27a88 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/calculations/NormalCalculation.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/calculations/NormalCalculation.java
@@ -1,8 +1,8 @@
-package de.evoal.core.main.ea.constraints.constraint.strategies.calculations;
+package de.evoal.core.ea.main.constraints.constraint.strategies.calculations;
 
-import de.evoal.core.api.ea.constraints.model.Constraint;
-import de.evoal.core.api.ea.constraints.strategies.CalculationResult;
-import de.evoal.core.api.ea.constraints.calculation.CalculationStrategy;
+import de.evoal.core.ea.api.constraints.model.Constraint;
+import de.evoal.core.ea.api.constraints.strategies.CalculationResult;
+import de.evoal.core.ea.api.constraints.calculation.CalculationStrategy;
 import de.evoal.core.api.properties.Properties;
 import javax.enterprise.context.Dependent;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/calculations/StandardDeviationCalculation.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/calculations/StandardDeviationCalculation.java
similarity index 90%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/calculations/StandardDeviationCalculation.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/calculations/StandardDeviationCalculation.java
index 0c8dd19ca36c87deead86a206bdb8b328ae595c8..94e6414425a4009f41445f728ad2e9efc1d27aaa 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/calculations/StandardDeviationCalculation.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/calculations/StandardDeviationCalculation.java
@@ -1,17 +1,17 @@
-package de.evoal.core.main.ea.constraints.constraint.strategies.calculations;
+package de.evoal.core.ea.main.constraints.constraint.strategies.calculations;
 
-import de.evoal.core.api.ea.constraints.model.Constraint;
-import de.evoal.core.api.ea.constraints.model.ConstraintResult;
-import de.evoal.core.api.ea.constraints.strategies.CalculationResult;
+import de.evoal.core.ea.api.constraints.model.Constraint;
+import de.evoal.core.ea.api.constraints.model.ConstraintResult;
+import de.evoal.core.ea.api.constraints.strategies.CalculationResult;
 import de.evoal.core.api.utils.LanguageHelper;
-import de.evoal.core.api.ea.constraints.calculation.CalculationStrategy;
+import de.evoal.core.ea.api.constraints.calculation.CalculationStrategy;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.core.api.properties.PropertySpecification;
 import javax.enterprise.context.Dependent;
 
-import de.evoal.core.main.ea.constraints.constraint.utils.ArithmeticNumberOperations;
-import de.evoal.core.main.ea.constraints.deviation.model.Deviations;
+import de.evoal.core.ea.main.constraints.constraint.utils.ArithmeticNumberOperations;
+import de.evoal.core.ea.main.constraints.deviation.model.Deviations;
 import de.evoal.languages.model.instance.Instance;
 import lombok.NonNull;
 import org.apache.commons.math3.util.Pair;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/constraint/JeneticsConstraintProducer.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/constraint/JeneticsConstraintProducer.java
similarity index 71%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/constraint/JeneticsConstraintProducer.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/constraint/JeneticsConstraintProducer.java
index 6c5ce286c25f3a75b40f853188779c2dec87dc91..f247107d9688d86d3faebf80acb349a27b8e9ea8 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/constraint/JeneticsConstraintProducer.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/constraint/JeneticsConstraintProducer.java
@@ -1,18 +1,18 @@
-package de.evoal.core.main.ea.constraints.constraint.strategies.constraint;
+package de.evoal.core.ea.main.constraints.constraint.strategies.constraint;
 
 import de.evoal.core.api.cdi.BeanFactory;
-import de.evoal.core.api.ea.constraints.calculation.CalculationStrategy;
-import de.evoal.core.api.ea.constraints.model.Constraint;
-import de.evoal.core.api.ea.constraints.model.Constraints;
-import de.evoal.core.api.ea.constraints.calculation.CalculationFactory;
+import de.evoal.core.api.optimisation.OptimisationFunction;
+import de.evoal.core.ea.api.constraints.calculation.CalculationStrategy;
+import de.evoal.core.ea.api.constraints.model.Constraint;
+import de.evoal.core.ea.api.constraints.model.Constraints;
+import de.evoal.core.ea.api.constraints.calculation.CalculationFactory;
 import de.evoal.core.api.board.CoreBlackboardEntries;
 import de.evoal.core.api.cdi.ConfigurationValue;
-import de.evoal.core.api.ea.codec.CustomCodec;
-import de.evoal.core.api.ea.constraints.strategies.RepairStrategy;
-import de.evoal.core.api.ea.fitness.FitnessFunction;
+import de.evoal.core.ea.api.codec.CustomCodec;
+import de.evoal.core.ea.api.constraints.strategies.RepairStrategy;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.core.api.utils.LanguageHelper;
-import de.evoal.core.main.ea.constraints.constraint.utils.ConfigurationUtils;
+import de.evoal.core.ea.main.constraints.constraint.utils.ConfigurationUtils;
 import de.evoal.languages.model.instance.*;
 
 import javax.enterprise.context.ApplicationScoped;
@@ -27,9 +27,9 @@ import java.util.stream.Collectors;
 public class JeneticsConstraintProducer {
     @Produces
     public List<io.jenetics.engine.Constraint> create(
-            final @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.handlers") Array handlerConfigurations,
-            final @Named("optimization-function-output") PropertiesSpecification optimizationSpec,
-            final @Named("optimization-function")  FitnessFunction function,
+            final @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.handlers") Instance [] handlerConfigurations,
+            final @Named("optimisation-function-output") PropertiesSpecification optimisationSpec,
+            final @Named("optimisation-function") OptimisationFunction function,
             final CustomCodec codec,
             final Constraints constraints,
             final CalculationFactory factory) {
@@ -51,7 +51,7 @@ public class JeneticsConstraintProducer {
                         final RepairStrategy rStrategy = BeanFactory.create(repairConfiguration.getDefinition().getName(), RepairStrategy.class)
                                                                     .init(repairConfiguration);
 
-                        return new JeneticsConstraintStrategy(cStrategy, codec, function, optimizationSpec, rStrategy);
+                        return new JeneticsConstraintStrategy(cStrategy, codec, function, optimisationSpec, rStrategy);
                     })
                     .collect(Collectors.toList());
     }
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/constraint/JeneticsConstraintStrategy.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/constraint/JeneticsConstraintStrategy.java
similarity index 70%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/constraint/JeneticsConstraintStrategy.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/constraint/JeneticsConstraintStrategy.java
index 30672a6db8d7d86cfa80230ac97ac7f07d7a0ce0..8791ae18a09cc1affa5707b1bb0df5ba82138de5 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/constraint/JeneticsConstraintStrategy.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/constraint/JeneticsConstraintStrategy.java
@@ -1,10 +1,10 @@
-package de.evoal.core.main.ea.constraints.constraint.strategies.constraint;
+package de.evoal.core.ea.main.constraints.constraint.strategies.constraint;
 
-import de.evoal.core.api.ea.constraints.calculation.CalculationStrategy;
-import de.evoal.core.api.ea.constraints.strategies.HandlingStrategy;
-import de.evoal.core.api.ea.codec.CustomCodec;
-import de.evoal.core.api.ea.constraints.strategies.RepairStrategy;
-import de.evoal.core.api.ea.fitness.FitnessFunction;
+import de.evoal.core.api.optimisation.OptimisationFunction;
+import de.evoal.core.ea.api.constraints.calculation.CalculationStrategy;
+import de.evoal.core.ea.api.constraints.strategies.HandlingStrategy;
+import de.evoal.core.ea.api.codec.CustomCodec;
+import de.evoal.core.ea.api.constraints.strategies.RepairStrategy;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import io.jenetics.Gene;
@@ -17,11 +17,11 @@ public class JeneticsConstraintStrategy<
 
     private final CalculationStrategy calculation;
     private final CustomCodec<G> codec;
-    private final FitnessFunction function;
+    private final OptimisationFunction function;
     private final PropertiesSpecification fitnessSpec;
     private final RepairStrategy repair;
 
-    public JeneticsConstraintStrategy(final CalculationStrategy calculation, final CustomCodec<G> codec, final FitnessFunction function, final PropertiesSpecification fitnessSpec, final RepairStrategy repair) {
+    public JeneticsConstraintStrategy(final CalculationStrategy calculation, final CustomCodec<G> codec, final OptimisationFunction function, final PropertiesSpecification fitnessSpec, final RepairStrategy repair) {
         this.calculation = calculation;
         this.codec = codec;
         this.function = function;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/constraint/RandomGenotypeStrategy.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/constraint/RandomGenotypeStrategy.java
similarity index 84%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/constraint/RandomGenotypeStrategy.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/constraint/RandomGenotypeStrategy.java
index ea28d1f90cedd0b0eaf0222cdf207985e697d095..56cd879cf662a3e470ac83611091adbc7a57baa9 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/constraint/RandomGenotypeStrategy.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/constraint/RandomGenotypeStrategy.java
@@ -1,6 +1,6 @@
-package de.evoal.core.main.ea.constraints.constraint.strategies.constraint;
+package de.evoal.core.ea.main.constraints.constraint.strategies.constraint;
 
-import de.evoal.core.api.ea.constraints.strategies.RepairStrategy;
+import de.evoal.core.ea.api.constraints.strategies.RepairStrategy;
 import de.evoal.languages.model.instance.Instance;
 import io.jenetics.Gene;
 import io.jenetics.Genotype;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/fitness/MalusFunctionProducer.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/fitness/MalusFunctionProducer.java
similarity index 88%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/fitness/MalusFunctionProducer.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/fitness/MalusFunctionProducer.java
index 57371661129f4e54c8ad43c95cbc89ec50f20d91..5b687c95bb54460b5a79b5c96f9691790cbc91e7 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/fitness/MalusFunctionProducer.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/fitness/MalusFunctionProducer.java
@@ -1,13 +1,13 @@
-package de.evoal.core.main.ea.constraints.constraint.strategies.fitness;
+package de.evoal.core.ea.main.constraints.constraint.strategies.fitness;
 
-import de.evoal.core.api.ea.constraints.model.Constraint;
-import de.evoal.core.api.ea.constraints.model.Constraints;
-import de.evoal.core.api.ea.constraints.strategies.fitness.MalusForFitnessStrategy;
-import de.evoal.core.api.ea.constraints.strategies.fitness.MalusFunction;
+import de.evoal.core.ea.api.constraints.model.Constraint;
+import de.evoal.core.ea.api.constraints.model.Constraints;
+import de.evoal.core.ea.api.constraints.strategies.fitness.MalusForFitnessStrategy;
+import de.evoal.core.ea.api.constraints.strategies.fitness.MalusFunction;
 import de.evoal.core.api.properties.info.PropertiesDependencies;
 import de.evoal.core.api.utils.LanguageHelper;
-import de.evoal.core.api.ea.constraints.calculation.CalculationFactory;
-import de.evoal.core.api.ea.constraints.calculation.CalculationStrategy;
+import de.evoal.core.ea.api.constraints.calculation.CalculationFactory;
+import de.evoal.core.ea.api.constraints.calculation.CalculationStrategy;
 import de.evoal.core.api.board.CoreBlackboardEntries;
 import de.evoal.core.api.cdi.ConfigurationValue;
 import de.evoal.core.api.properties.PropertiesSpecification;
@@ -15,8 +15,8 @@ import de.evoal.core.api.properties.PropertySpecification;
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.inject.Produces;
 
-import de.evoal.core.main.ea.constraints.constraint.strategies.fitness.internal.MalusForFitnessFunction;
-import de.evoal.core.main.ea.constraints.constraint.utils.ConfigurationUtils;
+import de.evoal.core.ea.main.constraints.constraint.strategies.fitness.internal.MalusForFitnessFunction;
+import de.evoal.core.ea.main.constraints.constraint.utils.ConfigurationUtils;
 import de.evoal.languages.model.instance.*;
 import org.apache.commons.math3.util.Pair;
 
@@ -28,9 +28,9 @@ import java.util.stream.Collectors;
 public class MalusFunctionProducer {
     @ApplicationScoped @Produces
     public MalusForFitnessStrategy create(
-            final @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.handlers") Array handlers,
-            final @Named("optimization-function-input") PropertiesSpecification source,
-            final @Named("optimization-function-output") PropertiesSpecification target,
+            final @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.handlers") Instance [] handlers,
+            final @Named("optimisation-function-input") PropertiesSpecification source,
+            final @Named("optimisation-function-output") PropertiesSpecification target,
             final @Named("output-dependencies") PropertiesDependencies dependencies,
             final Constraints constraints,
             final CalculationFactory factory) {
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/fitness/internal/MalusForFitnessFunction.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/fitness/internal/MalusForFitnessFunction.java
similarity index 77%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/fitness/internal/MalusForFitnessFunction.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/fitness/internal/MalusForFitnessFunction.java
index 8d637e5fc7cf56d7b4226d519c622eea5d4ee72b..c1af10b45e73069fa20c50213e8e34d8c3f4e325 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/strategies/fitness/internal/MalusForFitnessFunction.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/strategies/fitness/internal/MalusForFitnessFunction.java
@@ -1,8 +1,8 @@
-package de.evoal.core.main.ea.constraints.constraint.strategies.fitness.internal;
+package de.evoal.core.ea.main.constraints.constraint.strategies.fitness.internal;
 
-import de.evoal.core.api.ea.constraints.model.Constraint;
-import de.evoal.core.api.ea.constraints.model.ConstraintResult;
-import de.evoal.core.api.ea.constraints.strategies.fitness.MalusFunction;
+import de.evoal.core.ea.api.constraints.model.Constraint;
+import de.evoal.core.ea.api.constraints.model.ConstraintResult;
+import de.evoal.core.ea.api.constraints.strategies.fitness.MalusFunction;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.utils.LanguageHelper;
 import de.evoal.languages.model.instance.Instance;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/utils/ArithmeticNumberOperations.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/utils/ArithmeticNumberOperations.java
similarity index 98%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/utils/ArithmeticNumberOperations.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/utils/ArithmeticNumberOperations.java
index 79702bbb75b71dde965986d63d5acfbf95a5ace4..d0590f75701f39a6923848dbe76c7d2f8a85920a 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/utils/ArithmeticNumberOperations.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/utils/ArithmeticNumberOperations.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.constraints.constraint.utils;
+package de.evoal.core.ea.main.constraints.constraint.utils;
 
 import de.evoal.core.api.utils.Requirements;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/utils/ConfigurationUtils.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/utils/ConfigurationUtils.java
similarity index 73%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/utils/ConfigurationUtils.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/utils/ConfigurationUtils.java
index 546a87f235c1075885ad2bba16bf619263f6e51e..feae43512e5dc1d83610b76216e70eda6e5e8c39 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/utils/ConfigurationUtils.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/constraint/utils/ConfigurationUtils.java
@@ -1,11 +1,10 @@
-package de.evoal.core.main.ea.constraints.constraint.utils;
+package de.evoal.core.ea.main.constraints.constraint.utils;
 
 import de.evoal.core.api.utils.LanguageHelper;
 import de.evoal.languages.model.instance.Array;
-import de.evoal.languages.model.instance.Attribute;
 import de.evoal.languages.model.instance.Instance;
 
-import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -13,18 +12,16 @@ public final class ConfigurationUtils {
     private ConfigurationUtils() {
     }
 
-    public static List<Instance> findConstraintHandlerByHandlingStrategy(final Array handlers, final String name) {
-        return handlers.getValues()
-                       .stream()
+    public static List<Instance> findConstraintHandlerByHandlingStrategy(final Instance [] handlers, final String name) {
+        return Arrays.stream(handlers)
                        .map(Instance.class::cast)
                        .filter(LanguageHelper.filterInstanceByType("constraint-handler"))
                        .filter(LanguageHelper.filterByAttributesInstanceType("constraint-handling", name))
                        .collect(Collectors.toList());
     }
 
-    public static Instance findConstraintHandlerByHandlingStrategyAndCategory(final Array handlers, final String name, final String category) {
-        return handlers.getValues()
-                .stream()
+    public static Instance findConstraintHandlerByHandlingStrategyAndCategory(final Instance [] handlers, final String name, final String category) {
+        return Arrays.stream(handlers)
                 .map(Instance.class::cast)
                 .filter(LanguageHelper.filterInstanceByType("constraint-handler"))
                 .filter(LanguageHelper.filterByAttributesInstanceType("constraint-handling", name))
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/correlation/CorrelationsProducer.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/correlation/CorrelationsProducer.java
similarity index 87%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/correlation/CorrelationsProducer.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/correlation/CorrelationsProducer.java
index 0739e38950f0139f63e78d2f1c765583ab1fa2e8..b26acb2706987e2c2f82059cee154f6e3f25c5bb 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/correlation/CorrelationsProducer.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/correlation/CorrelationsProducer.java
@@ -1,17 +1,17 @@
-package de.evoal.core.main.ea.constraints.correlation;
+package de.evoal.core.ea.main.constraints.correlation;
 
-import de.evoal.core.api.ea.codec.CustomCodec;
-import de.evoal.core.api.ea.constraints.model.DataConstraints;
+import de.evoal.core.ea.api.codec.CustomCodec;
+import de.evoal.core.ea.api.constraints.model.DataConstraints;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.inject.Produces;
 
-import de.evoal.core.main.ea.constraints.correlation.el.AstHelper;
-import de.evoal.core.main.ea.constraints.el.ElHelper;
-import de.evoal.core.api.ea.correlations.Correlation;
-import de.evoal.core.api.ea.correlations.Correlations;
-import de.evoal.core.api.ea.correlations.RangedCorrelation;
-import de.evoal.core.main.ea.constraints.el.LogHelper;
+import de.evoal.core.ea.main.constraints.correlation.el.AstHelper;
+import de.evoal.core.ea.main.constraints.el.ElHelper;
+import de.evoal.core.ea.api.correlations.Correlation;
+import de.evoal.core.ea.api.correlations.Correlations;
+import de.evoal.core.ea.api.correlations.RangedCorrelation;
+import de.evoal.core.ea.main.constraints.el.LogHelper;
 import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.el.Call;
 import lombok.extern.slf4j.Slf4j;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/correlation/el/AstHelper.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/correlation/el/AstHelper.java
similarity index 73%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/correlation/el/AstHelper.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/correlation/el/AstHelper.java
index 6df67471eff6f7f60b7e33d3d96fc0cbce624f28..231244b528dcca4abcba7e7e2bfe46cf3df8ee59 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/correlation/el/AstHelper.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/correlation/el/AstHelper.java
@@ -1,9 +1,8 @@
-package de.evoal.core.main.ea.constraints.correlation.el;
+package de.evoal.core.ea.main.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.DataReferenceSwitch;
-import de.evoal.core.api.ea.correlations.Range;
+import de.evoal.core.ea.main.constraints.el.DataReferenceSwitch;
+import de.evoal.core.ea.api.correlations.Range;
 import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.el.Expression;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/correlation/el/RangeSwitch.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/correlation/el/RangeSwitch.java
similarity index 96%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/correlation/el/RangeSwitch.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/correlation/el/RangeSwitch.java
index 33f382bd1d5742a62eb58e7d900a8d067cc92071..771538cfdbea9bd7f3a577310e28a11c7a30f07c 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/correlation/el/RangeSwitch.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/correlation/el/RangeSwitch.java
@@ -1,7 +1,7 @@
-package de.evoal.core.main.ea.constraints.correlation.el;
+package de.evoal.core.ea.main.constraints.correlation.el;
 
-import de.evoal.core.main.ea.constraints.el.ElHelper;
-import de.evoal.core.api.ea.correlations.Range;
+import de.evoal.core.ea.main.constraints.el.ElHelper;
+import de.evoal.core.ea.api.correlations.Range;
 import de.evoal.languages.model.el.*;
 import de.evoal.languages.model.el.util.ELSwitch;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/deviation/DeviationProducer.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/deviation/DeviationProducer.java
similarity index 81%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/deviation/DeviationProducer.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/deviation/DeviationProducer.java
index 2c9562be6ff54533476f2fb5499f0836484c1d99..ca30adc0dd1baf1314cdbcafdd4bf052e99d1555 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/deviation/DeviationProducer.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/deviation/DeviationProducer.java
@@ -1,25 +1,20 @@
-package de.evoal.core.main.ea.constraints.deviation;
+package de.evoal.core.ea.main.constraints.deviation;
 
-import de.evoal.core.api.ea.codec.CustomCodec;
-import de.evoal.core.api.ea.constraints.model.DataConstraints;
+import de.evoal.core.ea.api.codec.CustomCodec;
+import de.evoal.core.ea.api.constraints.model.DataConstraints;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.core.api.properties.PropertySpecification;
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.inject.Produces;
 
-import javax.inject.Named;
-
-import de.evoal.core.main.ea.constraints.deviation.model.Deviation;
-import de.evoal.core.main.ea.constraints.deviation.model.Deviations;
-import de.evoal.core.main.ea.constraints.el.ElHelper;
-import de.evoal.core.main.ea.constraints.el.LogHelper;
+import de.evoal.core.ea.main.constraints.deviation.model.Deviation;
+import de.evoal.core.ea.main.constraints.deviation.model.Deviations;
+import de.evoal.core.ea.main.constraints.el.ElHelper;
+import de.evoal.core.ea.main.constraints.el.LogHelper;
 import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.el.Call;
-import de.evoal.languages.model.el.Expression;
-import de.evoal.languages.model.el.FunctionName;
 import lombok.extern.slf4j.Slf4j;
 
-import java.util.Collection;
 import java.util.Objects;
 import java.util.Optional;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/deviation/model/Deviation.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/deviation/model/Deviation.java
similarity index 86%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/deviation/model/Deviation.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/deviation/model/Deviation.java
index 8ad2917bb70cc10db2b736bfe54b63db9957bd09..7ae4d4a845a12010cdfe6a398d2b032b47771e9a 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/deviation/model/Deviation.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/deviation/model/Deviation.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.constraints.deviation.model;
+package de.evoal.core.ea.main.constraints.deviation.model;
 
 import de.evoal.core.api.properties.PropertySpecification;
 import lombok.Data;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/deviation/model/Deviations.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/deviation/model/Deviations.java
similarity index 94%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/deviation/model/Deviations.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/deviation/model/Deviations.java
index 26f2e2357a41f04949e3547b92b39b676e382a34..b2e839b01e002b80c34c9d50a35a0baf48848924 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/deviation/model/Deviations.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/deviation/model/Deviations.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.constraints.deviation.model;
+package de.evoal.core.ea.main.constraints.deviation.model;
 
 import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.core.api.properties.PropertySpecification;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/CallSwitch.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/CallSwitch.java
similarity index 98%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/CallSwitch.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/CallSwitch.java
index c1007a8e3dc1fd24ed9019030b6c516de2af90de..1569b03444b9f255effdfb1214be2922dd80841f 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/CallSwitch.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/CallSwitch.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.constraints.el;
+package de.evoal.core.ea.main.constraints.el;
 
 import de.evoal.languages.model.el.*;
 import de.evoal.languages.model.el.util.ELSwitch;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/DataReferenceSwitch.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/DataReferenceSwitch.java
similarity index 98%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/DataReferenceSwitch.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/DataReferenceSwitch.java
index 4a01d1a0ce8b9aa3efe72725f106a60dd0824c04..37abff7c48f952ab35db486d9af499e282f4a00a 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/DataReferenceSwitch.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/DataReferenceSwitch.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.constraints.el;
+package de.evoal.core.ea.main.constraints.el;
 
 import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.ddl.DataReference;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/ElHelper.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/ElHelper.java
similarity index 94%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/ElHelper.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/ElHelper.java
index 8913ecdad556c2d50e4bbf117fa4b5d58a10dc2c..b3a3981c82ddd0dd8cf8776b5adfafb49aba146b 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/ElHelper.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/ElHelper.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.constraints.el;
+package de.evoal.core.ea.main.constraints.el;
 
 import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.el.Call;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/LogHelper.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/LogHelper.java
similarity index 94%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/LogHelper.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/LogHelper.java
index 3fec549bbb0f9a32c226a65d6a2fb3a78c895e61..4d0d70e40601f031632b1bc0aae1c9fd51eb9375 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/LogHelper.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/LogHelper.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.constraints.el;
+package de.evoal.core.ea.main.constraints.el;
 
 import de.evoal.languages.model.ddl.dsl.DataDescriptionLanguageStandaloneSetup;
 import de.evoal.languages.model.el.Call;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/NumberSwitch.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/NumberSwitch.java
similarity index 98%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/NumberSwitch.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/NumberSwitch.java
index ccb30d01d5229a6c942e63f5fae09594cc831f85..b2f107e249cb7defca6f25d7c4c145525ef5c63f 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/NumberSwitch.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/NumberSwitch.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.constraints.el;
+package de.evoal.core.ea.main.constraints.el;
 
 import de.evoal.languages.model.el.*;
 import de.evoal.languages.model.el.util.ELSwitch;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/StringSwitch.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/StringSwitch.java
similarity index 98%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/StringSwitch.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/StringSwitch.java
index df1834226708af97c4a157c06e4ee355f3e4ca1c..1dc2d79e2b26a99f4f1919649edc3c3e73293f90 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/StringSwitch.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/StringSwitch.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.constraints.el;
+package de.evoal.core.ea.main.constraints.el;
 
 import de.evoal.languages.model.el.*;
 import de.evoal.languages.model.el.util.ELSwitch;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/ValueReferenceSwitch.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/ValueReferenceSwitch.java
similarity index 98%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/ValueReferenceSwitch.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/ValueReferenceSwitch.java
index b7e4876d28a70e35d22b40f50712f5e50068ff3a..0172ec4383b15d633d887ff151dc4241952f469c 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/ValueReferenceSwitch.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraints/el/ValueReferenceSwitch.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.constraints.el;
+package de.evoal.core.ea.main.constraints.el;
 
 import de.evoal.core.api.utils.Requirements;
 import de.evoal.languages.model.ddl.DataDescription;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/fitness/DistanceFitness.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/fitness/DistanceFitness.java
similarity index 91%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/fitness/DistanceFitness.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/fitness/DistanceFitness.java
index d7cc3febb98ba5dabe5afcb834206c92dd90f074..31a289cbfe2dc4b1fccfe9938f0076e2a9edc377 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/fitness/DistanceFitness.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/fitness/DistanceFitness.java
@@ -1,9 +1,9 @@
-package de.evoal.core.main.ea.fitness;
+package de.evoal.core.ea.main.fitness;
 
 import de.evoal.core.api.board.Blackboard;
 import de.evoal.core.api.board.CoreBlackboardEntries;
-import de.evoal.core.api.ea.fitness.FitnessDecorator;
-import de.evoal.core.api.ea.fitness.FitnessFunction;
+import de.evoal.core.api.optimisation.OptimisationFunction;
+import de.evoal.core.api.optimisation.OptimisationFunctionDecorator;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.core.api.utils.Requirements;
@@ -17,7 +17,7 @@ import javax.inject.Named;
 @Dependent
 @Named("distance")
 @Slf4j
-public class DistanceFitness extends FitnessDecorator {
+public class DistanceFitness extends OptimisationFunctionDecorator {
 
     @Inject
     private Blackboard board;
@@ -47,7 +47,7 @@ public class DistanceFitness extends FitnessDecorator {
     }
 
     @Override
-    public FitnessFunction init(final Instance config) {
+    public OptimisationFunction init(final Instance config) {
         super.init(config);
 
         final Attribute target = config.findAttribute("target");
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/fitness/FitnessFactory.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/fitness/FitnessFactory.java
similarity index 72%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/fitness/FitnessFactory.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/fitness/FitnessFactory.java
index c5ce9b63763ab38961b86bc625eefcce4b2f0ae2..0f6fc428d7792c32bb8bca09291db922fa442f2e 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/fitness/FitnessFactory.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/fitness/FitnessFactory.java
@@ -1,19 +1,19 @@
-package de.evoal.core.main.ea.fitness;
+package de.evoal.core.ea.main.fitness;
 
 import de.evoal.core.api.board.CoreBlackboardEntries;
+import de.evoal.core.api.cdi.BeanFactory;
 import de.evoal.core.api.cdi.ConfigurationValue;
 
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.context.Dependent;
 import javax.enterprise.inject.Produces;
 
-import de.evoal.core.api.ea.fitness.FitnessFunction;
-import de.evoal.core.api.ea.fitness.comparator.FitnessComparator;
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
+import de.evoal.core.api.optimisation.OptimisationFunction;
+import de.evoal.core.api.optimisation.OptimisationValueComparator;
+import de.evoal.core.api.optimisation.OptimisationValue;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.languages.model.instance.Instance;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.deltaspike.core.api.provider.BeanProvider;
 
 @ApplicationScoped
 @Slf4j
@@ -38,16 +38,16 @@ public class FitnessFactory {
 
 		log.info("Creating fitness function {} and using comparator {}.", fitnessName, comparatorName);
 
-		final FitnessFunction ff = BeanProvider.getContextualReference(fitnessName, false, FitnessFunction.class)
+		final OptimisationFunction ff = BeanFactory.create(fitnessName, OptimisationFunction.class)
 				                               .init(fitnessConfig);
-		final FitnessComparator cmp = BeanProvider.getContextualReference(comparatorName, false, FitnessComparator.class)
+		final OptimisationValueComparator cmp = BeanFactory.create(comparatorName, OptimisationValueComparator.class)
 				                                  .init(comparatorConfig);
 
 		return new JeneticsFitnessFunction() {
 			@Override
-			public FitnessValue apply(final Properties properties) {
+			public OptimisationValue apply(final Properties properties) {
 				double [] values = ff.evaluate(properties);
-				return cmp.compare(values);
+				return cmp.toValue(values);
 			}
 		};
 	}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/fitness/JeneticsFitnessFunction.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/fitness/JeneticsFitnessFunction.java
similarity index 55%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/fitness/JeneticsFitnessFunction.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/fitness/JeneticsFitnessFunction.java
index 5da57327355a1db7f3914fe8ef6a74e4c9eefb5e..385fddba8a2899b0087af37e85ea180f326883f1 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/fitness/JeneticsFitnessFunction.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/fitness/JeneticsFitnessFunction.java
@@ -1,9 +1,9 @@
-package de.evoal.core.main.ea.fitness;
+package de.evoal.core.ea.main.fitness;
 
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
+import de.evoal.core.api.optimisation.OptimisationValue;
 import de.evoal.core.api.properties.Properties;
 
 import java.util.function.Function;
 
-public interface JeneticsFitnessFunction extends Function<Properties, FitnessValue> {
+public interface JeneticsFitnessFunction extends Function<Properties, OptimisationValue> {
 }
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/fitness/MalusFitness.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/fitness/MalusFitness.java
similarity index 60%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/fitness/MalusFitness.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/fitness/MalusFitness.java
index 6a822987666eef56708c0dda6039a36ad670ccef..9e864dcd026390003f91196b2f7edcf2f668dbde 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/fitness/MalusFitness.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/fitness/MalusFitness.java
@@ -1,14 +1,9 @@
-package de.evoal.core.main.ea.fitness;
+package de.evoal.core.ea.main.fitness;
 
-import de.evoal.core.api.board.Blackboard;
-import de.evoal.core.api.board.BlackboardEntry;
-import de.evoal.core.api.ea.constraints.strategies.fitness.MalusForFitnessStrategy;
-import de.evoal.core.api.ea.fitness.FitnessDecorator;
-import de.evoal.core.api.ea.fitness.FitnessFunction;
+import de.evoal.core.ea.api.constraints.strategies.fitness.MalusForFitnessStrategy;
+import de.evoal.core.api.optimisation.OptimisationFunctionDecorator;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertiesSpecification;
-import de.evoal.core.api.utils.Requirements;
-import de.evoal.languages.model.instance.*;
 import lombok.extern.slf4j.Slf4j;
 
 import javax.enterprise.context.Dependent;
@@ -18,10 +13,10 @@ import javax.inject.Named;
 @Dependent
 @Named("malus")
 @Slf4j
-public class MalusFitness extends FitnessDecorator {
+public class MalusFitness extends OptimisationFunctionDecorator {
 
     @Inject
-    @Named("optimization-function-output")
+    @Named("optimisation-function-output")
     private PropertiesSpecification fitnessSpecification;
 
     @Inject
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/initial/InitialPopulationFactory.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/initial/InitialPopulationFactory.java
similarity index 86%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/initial/InitialPopulationFactory.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/initial/InitialPopulationFactory.java
index 859982a02ffcf4b286a1b8f577da4dc7ec6c38f1..139cba9653bf37c66b1c5b599aa60a643c22c7d3 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/initial/InitialPopulationFactory.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/initial/InitialPopulationFactory.java
@@ -1,9 +1,9 @@
-package de.evoal.core.main.ea.initial;
+package de.evoal.core.ea.main.initial;
 
 import de.evoal.core.api.board.CoreBlackboardEntries;
 import de.evoal.core.api.cdi.BeanFactory;
 import de.evoal.core.api.cdi.ConfigurationValue;
-import de.evoal.core.api.ea.initial.InitialPopulation;
+import de.evoal.core.ea.api.initial.InitialPopulation;
 import de.evoal.languages.model.instance.Instance;
 
 import javax.enterprise.context.Dependent;
@@ -15,7 +15,7 @@ import javax.inject.Named;
 public class InitialPopulationFactory {
 
 	@Inject
-	@ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.initialization")
+	@ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.initialisation")
 	private Instance initialization;
 
 	/**
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/initial/RandomInitialPopulation.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/initial/RandomInitialPopulation.java
similarity index 77%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/initial/RandomInitialPopulation.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/initial/RandomInitialPopulation.java
index 9ea64a72fa31208ced48e34eed27fbd527c00536..21140c0dd730a53b197d50f1ea0e75bd25339b08 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/initial/RandomInitialPopulation.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/initial/RandomInitialPopulation.java
@@ -1,14 +1,11 @@
-package de.evoal.core.main.ea.initial;
+package de.evoal.core.ea.main.initial;
 
-import de.evoal.core.api.ea.initial.InitialPopulation;
+import de.evoal.core.ea.api.initial.InitialPopulation;
 import de.evoal.languages.model.instance.Instance;
 import io.jenetics.Gene;
 import io.jenetics.engine.Engine;
 import io.jenetics.engine.EvolutionStream;
 
-import javax.enterprise.context.Dependent;
-import javax.inject.Named;
-
 public class RandomInitialPopulation<G extends Gene<?, G>, C extends Comparable<C>> implements InitialPopulation<G, C> {
     @Override
     public InitialPopulation init(final Instance initialization) {
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/initial/RandomProducer.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/initial/RandomProducer.java
similarity index 85%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/initial/RandomProducer.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/initial/RandomProducer.java
index 168407850ea77deca4ae5dcfdbca5bccaaf7b929..fb5ca8adba21dfc6cde853ee269a8155a3433e74 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/initial/RandomProducer.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/initial/RandomProducer.java
@@ -1,9 +1,9 @@
-package de.evoal.core.main.ea.initial;
+package de.evoal.core.ea.main.initial;
 
 import de.evoal.core.api.board.CoreBlackboardEntries;
 import de.evoal.core.api.cdi.BeanFactory;
 import de.evoal.core.api.cdi.ConfigurationValue;
-import de.evoal.core.api.ea.initial.InitialPopulation;
+import de.evoal.core.ea.api.initial.InitialPopulation;
 import de.evoal.languages.model.instance.Instance;
 
 import javax.enterprise.context.ApplicationScoped;
@@ -20,7 +20,7 @@ public class RandomProducer {
     @Produces
     @Dependent
     @Named("random")
-    public InitialPopulation create(@ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.initialization") Instance initialization) {
+    public InitialPopulation create(@ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.initialisation") Instance initialization) {
         final InitialPopulation population = new RandomInitialPopulation();
         BeanFactory.injectFields(population);
         population.init(initialization);
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/AbstractBoundedChromosome.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/AbstractBoundedChromosome.java
similarity index 98%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/AbstractBoundedChromosome.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/AbstractBoundedChromosome.java
index 4b56a1493e18bf06993ecfb884aaa4fd3005f21f..d002182ec860ee524b45e2b19b865f163deb0dae 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/AbstractBoundedChromosome.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/AbstractBoundedChromosome.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.jenetics;
+package de.evoal.core.ea.main.jenetics;
 import static io.jenetics.internal.util.Hashes.hash;
 
 import java.util.Objects;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BitChromosome.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BitChromosome.java
similarity index 99%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BitChromosome.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BitChromosome.java
index f3d7eec0c9f8f0e78f2118ab26aac80a8c121f64..a0333d81f908ae38610ba6a2d19f0f1faa755078 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BitChromosome.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BitChromosome.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.jenetics;
+package de.evoal.core.ea.main.jenetics;
 
 import static java.lang.Math.min;
 import static java.util.Objects.requireNonNull;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BitHelper.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BitHelper.java
similarity index 97%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BitHelper.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BitHelper.java
index 5b476c49cf3f694d8eee98971c5642ae2c60138b..9e05d5844b4cfeb8e41bb456a41f574a58079053 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BitHelper.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BitHelper.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.jenetics;
+package de.evoal.core.ea.main.jenetics;
 
 import org.decimal4j.api.ImmutableDecimal;
 import org.decimal4j.factory.Factories;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BoundedBitChromosome.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BoundedBitChromosome.java
similarity index 96%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BoundedBitChromosome.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BoundedBitChromosome.java
index b2ea8a64feaf43ce589c65cd5292ea44f7de5edb..c3a7c1172d8eb0fc4c91344d926deb78d0d6417c 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BoundedBitChromosome.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BoundedBitChromosome.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.jenetics;
+package de.evoal.core.ea.main.jenetics;
 
 import io.jenetics.BitGene;
 import io.jenetics.util.ISeq;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BoundedDoubleChromosome.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BoundedDoubleChromosome.java
similarity index 99%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BoundedDoubleChromosome.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BoundedDoubleChromosome.java
index d0999989bee80b2ded4d58a3116a7f9e4b4b06c1..d765bbd517ef1d745176124f09a23ee21a60dac9 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BoundedDoubleChromosome.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BoundedDoubleChromosome.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.jenetics;
+package de.evoal.core.ea.main.jenetics;
 
 import io.jenetics.*;
 import io.jenetics.util.DoubleRange;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BoundedDoubleGene.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BoundedDoubleGene.java
similarity index 99%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BoundedDoubleGene.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BoundedDoubleGene.java
index e5bce3ebd9acf91a480ed61291df6f6284dc49f0..b15307ec161c9a6ac84f0f9fef6af3da79050c19 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BoundedDoubleGene.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BoundedDoubleGene.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.jenetics;
+package de.evoal.core.ea.main.jenetics;
 
 import io.jenetics.DoubleGene;
 import io.jenetics.NumericGene;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BoundedIntegerChromosome.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BoundedIntegerChromosome.java
similarity index 99%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BoundedIntegerChromosome.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BoundedIntegerChromosome.java
index 2421adcb1d76d3daa2fbe89aad75c68589b58d3c..db4a17bdca01aaded5e0d8d9bcf12dcb7bef3fb8 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BoundedIntegerChromosome.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BoundedIntegerChromosome.java
@@ -1,8 +1,7 @@
-package de.evoal.core.main.jenetics;
+package de.evoal.core.ea.main.jenetics;
 
 import io.jenetics.DoubleGene;
 import io.jenetics.NumericChromosome;
-import io.jenetics.util.DoubleRange;
 import io.jenetics.util.ISeq;
 import io.jenetics.util.IntRange;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BoundedIntegerGene.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BoundedIntegerGene.java
similarity index 99%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BoundedIntegerGene.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BoundedIntegerGene.java
index d29ed1f14fbdb530aa5646c82eb8c65f0c13a8ae..64192d0d6fd42dabf3c521325e629a15e8b27a98 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BoundedIntegerGene.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BoundedIntegerGene.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.jenetics;
+package de.evoal.core.ea.main.jenetics;
 
 import io.jenetics.DoubleGene;
 import io.jenetics.NumericGene;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BoundedOperations.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BoundedOperations.java
similarity index 95%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BoundedOperations.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BoundedOperations.java
index 7d513c65672115aa66aeb5680e09905d9fb85872..4dcb0e288c50200d62f580bf7b3c12894211ebb6 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/BoundedOperations.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/BoundedOperations.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.jenetics;
+package de.evoal.core.ea.main.jenetics;
 
 import io.jenetics.util.RandomRegistry;
 
diff --git a/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/ConstraintList.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/ConstraintList.java
new file mode 100644
index 0000000000000000000000000000000000000000..30207b914012990d4c7779dc840a51b50c4e0a30
--- /dev/null
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/ConstraintList.java
@@ -0,0 +1,32 @@
+package de.evoal.core.ea.main.jenetics;
+
+import de.evoal.core.api.optimisation.OptimisationValue;
+import io.jenetics.Gene;
+import io.jenetics.Phenotype;
+import io.jenetics.engine.Constraint;
+
+import java.util.List;
+
+public class ConstraintList<G extends Gene<?, G>> implements Constraint<G, OptimisationValue> {
+    private final List<Constraint<G, OptimisationValue>> constraints;
+
+    public ConstraintList(final List<Constraint<G, OptimisationValue>> constraints) {
+        this.constraints = constraints;
+    }
+
+    @Override
+    public boolean test(final Phenotype<G, OptimisationValue> individual) {
+        return constraints.stream().allMatch(c -> c.test(individual));
+    }
+
+    @Override
+    public Phenotype<G, OptimisationValue> repair(Phenotype<G, OptimisationValue> individual, long generation) {
+        Phenotype<G, OptimisationValue> phenotype = individual;
+
+        for(final Constraint<G, OptimisationValue> c : constraints) {
+            phenotype = c.repair(phenotype, generation);
+        }
+
+        return phenotype;
+    }
+}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/DecimalFactory.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/DecimalFactory.java
similarity index 92%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/DecimalFactory.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/DecimalFactory.java
index fd9e1160bf38d0f72d0e06be6c379889b07303a5..8b0f34f05a932e640d4e2d7924dec783a0db6c6e 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/DecimalFactory.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/DecimalFactory.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.jenetics;
+package de.evoal.core.ea.main.jenetics;
 
 import org.decimal4j.api.ImmutableDecimal;
 import org.decimal4j.factory.Factories;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/GrayBoundedBitChromosome.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/GrayBoundedBitChromosome.java
similarity index 97%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/GrayBoundedBitChromosome.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/GrayBoundedBitChromosome.java
index bf1398b8101ad170334d20c10979afc4ed2d1c94..ba255604be98aaab64e29e84b4de69cbd0775052 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/GrayBoundedBitChromosome.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/GrayBoundedBitChromosome.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.jenetics;
+package de.evoal.core.ea.main.jenetics;
 
 import io.jenetics.util.RandomRegistry;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/GrayHelper.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/GrayHelper.java
similarity index 96%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/GrayHelper.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/GrayHelper.java
index 65fe1161df8b12bf0178b16d75c3c48b6e28ab16..a44369f035e551cb1b186c462c902d78f24af708 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/GrayHelper.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/GrayHelper.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.jenetics;
+package de.evoal.core.ea.main.jenetics;
 
 /**
  * Helper class for the gray encoding
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/NaiveBoundedBitChromosome.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/NaiveBoundedBitChromosome.java
similarity index 97%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/NaiveBoundedBitChromosome.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/NaiveBoundedBitChromosome.java
index 20ae13a7bff17c6395ea98b25bfaa8f372244d1b..e6d2be3e22050af609cb1f421118da154c2945c2 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/NaiveBoundedBitChromosome.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/NaiveBoundedBitChromosome.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.jenetics;
+package de.evoal.core.ea.main.jenetics;
 
 import io.jenetics.util.RandomRegistry;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/VariableChromosome.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/VariableChromosome.java
similarity index 98%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/VariableChromosome.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/VariableChromosome.java
index f180cfb880c53c519d3cc244ebd2d7eaef013039..2300fde219e5efaee161b7822706cdfe41e433ff 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/VariableChromosome.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/VariableChromosome.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.jenetics;
+package de.evoal.core.ea.main.jenetics;
 
 import static java.lang.String.format;
 import static java.util.Objects.requireNonNull;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/DataConstraintProducer.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/DataConstraintProducer.java
similarity index 92%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/DataConstraintProducer.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/DataConstraintProducer.java
index f9a5a649d821230bb871d1003265e4e31ba7ebc2..0e4adb7bc0cc3ff49292fdfa3dc2148086eb7f26 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/DataConstraintProducer.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/DataConstraintProducer.java
@@ -1,11 +1,10 @@
-package de.evoal.core.main.producer;
+package de.evoal.core.ea.main.producer;
 
-import de.evoal.core.api.ea.constraints.model.DataConstraints;
+import de.evoal.core.ea.api.constraints.model.DataConstraints;
 import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.ddl.DataDescriptionModel;
 import de.evoal.languages.model.ddl.TypedDataDescription;
 import de.evoal.languages.model.ol.OptimisationModel;
-import de.evoal.languages.model.el.Expression;
 import de.evoal.languages.model.instance.DataReference;
 import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.ecore.EObject;
@@ -13,8 +12,6 @@ import org.eclipse.emf.ecore.EObject;
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.context.Dependent;
 import javax.enterprise.inject.Produces;
-import javax.inject.Named;
-import java.util.Collection;
 import java.util.HashSet;
 import java.util.Objects;
 import java.util.Set;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/producer/OptimizingFunctionProducer.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/OptimisingFunctionProducer.java
similarity index 76%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/producer/OptimizingFunctionProducer.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/OptimisingFunctionProducer.java
index 77900cf3b87e9835e35da15ac8a122ad36c2ed4c..6643c5f49d0d8f452811d70eda3cb6b179f2959d 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/producer/OptimizingFunctionProducer.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/OptimisingFunctionProducer.java
@@ -1,14 +1,14 @@
-package de.evoal.core.main.ea.producer;
+package de.evoal.core.ea.main.producer;
 
 import de.evoal.core.api.board.CoreBlackboardEntries;
+import de.evoal.core.api.cdi.BeanFactory;
 import de.evoal.core.api.cdi.ConfigurationValue;
-import de.evoal.core.api.ea.fitness.FitnessFunction;
+import de.evoal.core.api.optimisation.OptimisationFunction;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.languages.model.instance.Array;
 import de.evoal.languages.model.instance.Attribute;
 import de.evoal.languages.model.instance.DataReference;
 import de.evoal.languages.model.instance.Instance;
-import org.apache.deltaspike.core.api.provider.BeanProvider;
 
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.context.Dependent;
@@ -16,35 +16,35 @@ import javax.enterprise.inject.Produces;
 import javax.inject.Named;
 
 @ApplicationScoped
-public class OptimizingFunctionProducer {
+public class OptimisingFunctionProducer {
     @Produces
     @Dependent
-    @Named("optimization-function-input")
+    @Named("optimisation-function-input")
     public PropertiesSpecification createInputSpec(final @Named("genotype-specification") PropertiesSpecification genotypeSpec) {
         return genotypeSpec;
     }
 
     @Produces
     @ApplicationScoped
-    @Named("optimization-function-configuration")
+    @Named("optimisation-function-configuration")
     public Instance find(final @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.fitness") Instance fitnessConfiguration) {
         return findInner(fitnessConfiguration);
     }
 
     @Produces
     @Dependent
-    @Named("optimization-function-output")
-    public PropertiesSpecification createOutputSpec(final @Named("optimization-function-configuration") Instance configuration) {
+    @Named("optimisation-function-output")
+    public PropertiesSpecification createOutputSpec(final @Named("optimisation-function-configuration") Instance configuration) {
         return toSpecification(configuration);
     }
 
     @Produces
     @ApplicationScoped
-    @Named("optimization-function")
-    private FitnessFunction create(final @Named("optimization-function-configuration") Instance configuration) {
+    @Named("optimisation-function")
+    private OptimisationFunction create(final @Named("optimisation-function-configuration") Instance configuration) {
         final String fitnessName = configuration.getDefinition().getName();
 
-        return BeanProvider.getContextualReference(fitnessName, false, FitnessFunction.class)
+        return BeanFactory.create(fitnessName, OptimisationFunction.class)
                 .init(configuration);
     }
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/PropertiesBoundariesProducer.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/PropertiesBoundariesProducer.java
similarity index 72%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/PropertiesBoundariesProducer.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/PropertiesBoundariesProducer.java
index 10bb824a14c58a69a97b2152caee71dad7542568..8bcd55951d40f83455d9d3fe800bed9b01024d62 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/PropertiesBoundariesProducer.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/PropertiesBoundariesProducer.java
@@ -1,17 +1,13 @@
-package de.evoal.core.main.producer;
+package de.evoal.core.ea.main.producer;
 
-import de.evoal.core.api.ea.constraints.model.DataConstraints;
+import de.evoal.core.ea.api.constraints.model.DataConstraints;
 import de.evoal.core.api.properties.PropertiesSpecification;
-import de.evoal.core.api.properties.PropertySpecification;
 import de.evoal.core.api.properties.info.PropertiesBoundaries;
-import de.evoal.core.api.properties.info.PropertiesRanges;
-import de.evoal.core.main.ea.constraints.constraint.ast.BoundaryIdentifier;
-import de.evoal.languages.model.el.Expression;
+import de.evoal.core.ea.main.constraints.constraint.ast.BoundaryIdentifier;
 
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.inject.Produces;
 import javax.inject.Named;
-import java.util.Collection;
 
 @ApplicationScoped
 public class PropertiesBoundariesProducer {
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/producer/SelectorFactory.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/SelectorFactory.java
similarity index 99%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/producer/SelectorFactory.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/SelectorFactory.java
index 17433b5e20e27fb2d28b467c69951a2a6bd128a7..2b201bd1054b145134af66b8cd56d30990030553 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/producer/SelectorFactory.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/SelectorFactory.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.producer;
+package de.evoal.core.ea.main.producer;
 
 import de.evoal.core.api.board.CoreBlackboardEntries;
 import de.evoal.core.api.cdi.ConfigurationValue;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/search/EvolutionaryAlgorithmSearch.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/search/EvolutionaryAlgorithmSearch.java
similarity index 71%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/search/EvolutionaryAlgorithmSearch.java
rename to src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/search/EvolutionaryAlgorithmSearch.java
index 23a6c383b5de9acabd43d9dda4dd58bc8057ee5a..66596c25cba77d98bf953ad4eda5bc40e58c1d6c 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/search/EvolutionaryAlgorithmSearch.java
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/search/EvolutionaryAlgorithmSearch.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.ea.search;
+package de.evoal.core.ea.main.search;
 
 import java.io.File;
 import java.time.Duration;
@@ -10,16 +10,17 @@ import de.evoal.core.api.board.CoreBlackboardEntries;
 import de.evoal.core.api.board.Blackboard;
 import de.evoal.core.api.cdi.BlackboardValue;
 import de.evoal.core.api.cdi.ConfigurationValue;
-import de.evoal.core.api.ea.initial.InitialPopulation;
-import de.evoal.core.api.search.OptimisationAlgorithm;
+import de.evoal.core.ea.api.initial.InitialPopulation;
+import de.evoal.core.api.optimisation.OptimisationAlgorithm;
 import de.evoal.core.api.utils.LanguageHelper;
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
-
-import de.evoal.core.api.statistics.StatisticsWriter;
-import de.evoal.core.main.ea.alterer.AltererFactory;
-import de.evoal.core.main.ea.codec.DynamicCodec;
-import de.evoal.core.main.ea.fitness.JeneticsFitnessFunction;
-import de.evoal.core.main.jenetics.ConstraintList;
+import de.evoal.core.api.optimisation.OptimisationValue;
+
+import de.evoal.core.api.statistics.writer.StatisticsWriter;
+import de.evoal.core.ea.main.fitness.JeneticsFitnessFunction;
+import de.evoal.core.ea.main.jenetics.ConstraintList;
+import de.evoal.core.ea.main.alterer.AltererFactory;
+import de.evoal.core.ea.main.codec.DynamicCodec;
+import de.evoal.core.ea.main.statistics.JeneticsStatisticsWriter;
 import de.evoal.languages.model.instance.Array;
 import de.evoal.languages.model.instance.Attribute;
 import de.evoal.languages.model.instance.Value;
@@ -65,14 +66,14 @@ public class EvolutionaryAlgorithmSearch implements OptimisationAlgorithm {
 	private int sizeOfPopulation;
 
 	@Inject
-	@ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.maximize")
+	@ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.maximise")
 	private Boolean maximize;
 
 	@Inject
 	@ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.maximum-age")
 	private int maximumAge;
 
-	private final Map<String, List<Alterer<?, FitnessValue>>> alterers = new HashMap<>();
+	private final Map<String, List<Alterer<?, OptimisationValue>>> alterers = new HashMap<>();
 
 	@Inject
 	private DynamicCodec encoding;
@@ -109,9 +110,9 @@ public class EvolutionaryAlgorithmSearch implements OptimisationAlgorithm {
 	public void run() {
 		setup();
 
-		final Constraint<?, FitnessValue> constraint = new ConstraintList(constraints.get());
+		final Constraint<?, OptimisationValue> constraint = new ConstraintList(constraints.get());
 
-        final Engine<?, FitnessValue> engine= Engine.builder(this.fitnessFunction, encoding)
+        final Engine<?, OptimisationValue> engine= Engine.builder(this.fitnessFunction, encoding)
 											.alterers(flattenAltererMap())
 											.offspringSelector(this.offspringSelector)
 											.survivorsSelector(this.survivorSelector)
@@ -122,14 +123,15 @@ public class EvolutionaryAlgorithmSearch implements OptimisationAlgorithm {
 											.executor(executor)
 											.build();
         
-        EvolutionStatistics<FitnessValue, MinMax<FitnessValue>> statistics = EvolutionStatistics.ofComparable();
-		EvolutionStream<?, FitnessValue> initialStream = initalStream.create(engine);
+        EvolutionStatistics<OptimisationValue, MinMax<OptimisationValue>> statistics = EvolutionStatistics.ofComparable();
+		EvolutionStream<?, OptimisationValue> initialStream = initalStream.create(engine);
+		JeneticsStatisticsWriter writer = new JeneticsStatisticsWriter(this.statistics);
 
-        final EvolutionResult<?, FitnessValue> result
+        final EvolutionResult<?, OptimisationValue> result
         		=  initialStream.limit(Limits.byFixedGeneration(numberOfGenerations))
         						.limit(Limits.byExecutionTime(Duration.ofMinutes(5)))
 //		        				.parallel()
-		        				.peek(this.statistics::add)
+		        				.peek(writer::add)
 		                		.peek(statistics)
         						.collect(EvolutionResult.toBestEvolutionResult());
 		this.statistics.write();
@@ -158,15 +160,15 @@ public class EvolutionaryAlgorithmSearch implements OptimisationAlgorithm {
 		}
 	}
 
-	private <G extends Gene<?, G>> Alterer<?, FitnessValue> flattenAltererMap() {
-		Alterer<G, FitnessValue> result = null;
+	private <G extends Gene<?, G>> Alterer<?, OptimisationValue> flattenAltererMap() {
+		Alterer<G, OptimisationValue> result = null;
 
-		for(final Map.Entry<String, List<Alterer<?, FitnessValue>>> entry : alterers.entrySet()) {
-			for(final Alterer<?, FitnessValue> e : entry.getValue()) {
+		for(final Map.Entry<String, List<Alterer<?, OptimisationValue>>> entry : alterers.entrySet()) {
+			for(final Alterer<?, OptimisationValue> e : entry.getValue()) {
 				if(result == null) {
-					result = (Alterer<G, FitnessValue>) e;
+					result = (Alterer<G, OptimisationValue>) e;
 				} else {
-					result = Alterer.of(result, (Alterer<G, FitnessValue>)  e);
+					result = Alterer.of(result, (Alterer<G, OptimisationValue>)  e);
 				}
 			}
 		}
diff --git a/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/statistics/CandidateAdapter.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/statistics/CandidateAdapter.java
new file mode 100644
index 0000000000000000000000000000000000000000..9836c62e3b15a723cff930e9bd9b6d8f6da2b63d
--- /dev/null
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/statistics/CandidateAdapter.java
@@ -0,0 +1,63 @@
+package de.evoal.core.ea.main.statistics;
+
+import de.evoal.core.api.optimisation.OptimisationValue;
+import de.evoal.core.api.properties.Properties;
+import de.evoal.core.api.statistics.Candidate;
+import de.evoal.core.ea.main.codec.DynamicCodec;
+import io.jenetics.Phenotype;
+
+import javax.enterprise.context.Dependent;
+import javax.inject.Inject;
+
+/**
+ * An adapter, c.f. GOF: adapter pattern, for adapting Jenetic's {@link Phenotype} to
+ *   EvoAl's {@link Candidate}.
+ */
+@Dependent
+public class CandidateAdapter implements Candidate {
+
+    /**
+     * Generation for which the adapter was created for (necessary for calculating
+     *   the candidate's age).
+     */
+    private int generation;
+
+    /**
+     * The candidate's phenotype.
+     */
+    private Phenotype<?, OptimisationValue> phenotype;
+
+    @Inject
+    private DynamicCodec codec;
+
+    public CandidateAdapter init(final Phenotype<?, OptimisationValue> phenotype, final int generation) {
+        this.phenotype = phenotype;
+        this.generation = generation;
+
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Properties searchSpaceRepresentation() {
+        return (Properties) codec.decoder().apply(phenotype.genotype());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int age() {
+        return (int) phenotype.age(generation);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public OptimisationValue value() {
+        return phenotype.fitness();
+    }
+}
diff --git a/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/statistics/IterationResultAdapter.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/statistics/IterationResultAdapter.java
new file mode 100644
index 0000000000000000000000000000000000000000..76f9b86fdb6cfaf0cb5e5310bfbbcc2cd3512ae1
--- /dev/null
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/statistics/IterationResultAdapter.java
@@ -0,0 +1,48 @@
+package de.evoal.core.ea.main.statistics;
+
+import de.evoal.core.api.cdi.BeanFactory;
+import de.evoal.core.api.optimisation.OptimisationValue;
+import de.evoal.core.api.statistics.Candidate;
+import de.evoal.core.api.statistics.IterationResult;
+import io.jenetics.Phenotype;
+import io.jenetics.engine.EvolutionResult;
+
+import java.util.Optional;
+import java.util.stream.Stream;
+
+/**
+ * An adapter, c.f. GOF: adapter pattern, for adapting Jenetic's {@link EvolutionResult} to
+ *   EvoAl's {@link IterationResult}.
+ */
+public class IterationResultAdapter implements IterationResult {
+
+    private final EvolutionResult<?, OptimisationValue> statistics;
+
+    public IterationResultAdapter(final EvolutionResult<?, OptimisationValue> statistics) {
+        this.statistics = statistics;
+    }
+
+    @Override
+    public int iteration() {
+        return (int)statistics.generation();
+    }
+
+    @Override
+    public Stream<Candidate> candidates() {
+        return statistics.population()
+                .stream()
+                .map(p -> BeanFactory.create(CandidateAdapter.class).init(p, (int)statistics.generation()))
+                .map(Candidate.class::cast);
+    }
+
+    @Override
+    public Optional<Integer> candidateCount() {
+        return Optional.empty();
+    }
+
+    @Override
+    public Candidate bestCandidate() {
+        return BeanFactory.create(CandidateAdapter.class)
+                .init(statistics.bestPhenotype(), (int)statistics.generation());
+    }
+}
diff --git a/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/statistics/JeneticsStatisticsWriter.java b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/statistics/JeneticsStatisticsWriter.java
new file mode 100644
index 0000000000000000000000000000000000000000..c2d33ee092dcb532064a0b1e5f30d1f8c1c387e4
--- /dev/null
+++ b/src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/statistics/JeneticsStatisticsWriter.java
@@ -0,0 +1,21 @@
+package de.evoal.core.ea.main.statistics;
+
+import de.evoal.core.api.optimisation.OptimisationValue;
+import de.evoal.core.api.statistics.writer.StatisticsWriter;
+import io.jenetics.engine.EvolutionResult;
+
+/**
+ * Adapter for converting Jenetis statistics information into EvoAl
+ *   statistics information.
+ */
+public class JeneticsStatisticsWriter {
+    private final StatisticsWriter writer;
+
+    public JeneticsStatisticsWriter(final StatisticsWriter writer) {
+        this.writer = writer;
+    }
+
+    public void add(final EvolutionResult<?, OptimisationValue> result) {
+        writer.add(new IterationResultAdapter(result));
+    }
+}
diff --git a/src/core/de.evoal.core.ea/src/main/java/module-info.java b/src/core/de.evoal.core.ea/src/main/java/module-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..a3984f71de6bc9627b425189c8cb9f4065f3446d
--- /dev/null
+++ b/src/core/de.evoal.core.ea/src/main/java/module-info.java
@@ -0,0 +1,49 @@
+module de.evoal.core.ea {
+    exports de.evoal.core.ea.api.codec;
+    exports de.evoal.core.ea.api.initial;
+    exports de.evoal.core.ea.api.constraints.strategies;
+    exports de.evoal.core.ea.api.correlations;
+    exports de.evoal.core.ea.api.constraints.calculation;
+    exports de.evoal.core.ea.api.constraints.model;
+    requires jakarta.enterprise.cdi.api;
+    requires jakarta.inject.api;
+
+    requires lombok;
+
+    requires org.slf4j;
+
+    requires commons.math3;
+    requires io.jenetics.ext;
+
+    requires org.eclipse.emf.common;
+
+    requires de.evoal.languages.model.ddl;
+    requires de.evoal.languages.model.el;
+    requires de.evoal.languages.model.instance;
+
+    requires de.evoal.core.main;
+    requires java.annotation;
+    requires decimal4j;
+    requires de.evoal.languages.model.ol;
+
+    opens de.evoal.core.ea.api.correlations to weld.core.impl;
+    opens de.evoal.core.ea.api.constraints.model to weld.core.impl;
+    opens de.evoal.core.ea.api.constraints.calculation to weld.core.impl;
+
+    opens de.evoal.core.ea.main.alterer to weld.core.impl;
+    opens de.evoal.core.ea.main.alterer.mutator to weld.core.impl;
+    opens de.evoal.core.ea.main.codec to weld.core.impl;
+    opens de.evoal.core.ea.main.codec.chromosome to weld.core.impl;
+    opens de.evoal.core.ea.main.comparator to weld.core.impl;
+    opens de.evoal.core.ea.main.constraints.constraint to weld.core.impl;
+    opens de.evoal.core.ea.main.constraints.constraint.strategies.constraint to weld.core.impl;
+    opens de.evoal.core.ea.main.constraints.constraint.strategies.calculations to weld.core.impl;
+    opens de.evoal.core.ea.main.constraints.constraint.strategies.fitness to weld.core.impl;
+    opens de.evoal.core.ea.main.constraints.correlation to weld.core.impl;
+    opens de.evoal.core.ea.main.constraints.deviation to weld.core.impl;
+    opens de.evoal.core.ea.main.fitness to weld.core.impl;
+    opens de.evoal.core.ea.main.initial to weld.core.impl;
+    opens de.evoal.core.ea.main.producer to weld.core.impl;
+    opens de.evoal.core.ea.main.search to weld.core.impl;
+    opens de.evoal.core.ea.main.statistics to weld.core.impl;
+}
diff --git a/src/core/de.evoal.core.ea/src/main/resources/META-INF/MANIFEST.MF b/src/core/de.evoal.core.ea/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..9d885be534121a9f146924f4832955dfe2ee2d4b
--- /dev/null
+++ b/src/core/de.evoal.core.ea/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1 @@
+Manifest-Version: 1.0
diff --git a/src/core/de.evoal.core.ea/src/main/resources/META-INF/beans.xml b/src/core/de.evoal.core.ea/src/main/resources/META-INF/beans.xml
new file mode 100644
index 0000000000000000000000000000000000000000..36964de4bdc1dbcbbf02c9552692e62804947dc3
--- /dev/null
+++ b/src/core/de.evoal.core.ea/src/main/resources/META-INF/beans.xml
@@ -0,0 +1,11 @@
+<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
+       bean-discovery-mode="annotated"
+       version="2.0">
+    <scan>
+        <exclude name="org.apache.deltaspike.core.impl.throttling.ThrottledInterceptor" />
+        <exclude name="org.apache.deltaspike.core.impl.scope.window.DefaultWindowContextQuotaHandler" />
+        <exclude name="org.apache.deltaspike.core.impl.scope.window.WindowBeanHolder" />
+    </scan>
+</beans>
\ No newline at end of file
diff --git a/src/core/de.evoal.core.ea/src/main/resources/META-INF/definitions/data/constraints.dl b/src/core/de.evoal.core.ea/src/main/resources/META-INF/definitions/data/constraints.dl
new file mode 100644
index 0000000000000000000000000000000000000000..1ba8690e74f9ad2ba8fd29a3979296932e3c9ee7
--- /dev/null
+++ b/src/core/de.evoal.core.ea/src/main/resources/META-INF/definitions/data/constraints.dl
@@ -0,0 +1,13 @@
+/**
+ * Sets the variance of some data.
+ *
+ * <b>Parameters:</b>
+ * <ol>
+ *   <li>Reference to the data ...</li>
+ * </ol>
+ */
+def void variance(data reference, float variance);
+
+def void connection(data ref1, data ref2, float connection);
+
+def void constraint(expression exp, string category);
diff --git a/src/core/de.evoal.core.ea/src/main/resources/META-INF/definitions/data/si-units.ddl b/src/core/de.evoal.core.ea/src/main/resources/META-INF/definitions/data/si-units.ddl
new file mode 100644
index 0000000000000000000000000000000000000000..b7e8f2976ccf4269c5d941834c9e8f2a99c168c6
--- /dev/null
+++ b/src/core/de.evoal.core.ea/src/main/resources/META-INF/definitions/data/si-units.ddl
@@ -0,0 +1,67 @@
+types:
+	cardinal type Newton description : "SI-Unit for force, measure in Newton[N=kg*m/s*s]."
+		with constraints:
+			value >= 0.0;
+	;
+	
+	quotient type Meter description: "SI-Unit for lengths, measured in metres[m]."
+		with constraints: 
+			value >= 0.0;
+	;
+	
+	quotient type Second description: "SI-Unit for time, measured in seconds[s]."
+		with constraints: 
+			value >= 0.0;
+	;
+	
+	quotient type Kilogram description: "SI-Unit for mass, measured in kilogram[kg]."
+		with constraints: 
+			value >= 0.0;
+	;
+	
+	quotient type Ampere description: "SI-Unit for eletric current, measured in ampere[A]."
+		with constraints: 
+			value >= 0.0;
+	;
+	
+	quotient type Kelvin description: "SI-Unit for thermodynamic temperature, measured in kelvin[K]."
+		with constraints:
+			value >= 0.0;
+	;
+	
+	quotient type Mole description: "SI-Unit for amount of substance, measure in mole[mol]."
+		with constraints:
+			value >= 0.0;
+	;
+	
+	quotient type Candela description: "SI-Unit for luminous intensity, measured in candela[cd]."
+		with constraints:
+			value >= 0.0;
+	;
+	
+	quotient type Hertz description: "SI-Unit for frequency, measured in hertz[Hz=1/s]."
+		with constraints: 
+			value >= 0.0;
+	;
+	
+	quotient type Speed description: "SI-Unit for frequency, measured in metre per second[m/s]."
+		with constraints:
+			value >= 0.0;
+	;
+	
+	quotient type Pascal description: "SI-Unit for pressure, measure in Pascal[Pa=kg/m*s*s]."
+		with constraints:
+			value >= 0.0;
+	;
+	
+	cardinal type Celsius description: "SI-Unit for temperature relative to 273.15 K, measured in Celsius[°C=K]"
+		with constraints:
+			value >= -273.15; 
+	;
+	
+	quotient type Area description: "SI-Unit for areas, measured in square meter[m*m]"
+		with constraints:
+			value >= 0.0;
+	;
+	
+	
\ No newline at end of file
diff --git a/src/core/de.evoal.core.ea/src/main/resources/META-INF/definitions/optimisation/core.dl b/src/core/de.evoal.core.ea/src/main/resources/META-INF/definitions/optimisation/core.dl
new file mode 100644
index 0000000000000000000000000000000000000000..911896202f48220753f39a88c2e76c6a525f617b
--- /dev/null
+++ b/src/core/de.evoal.core.ea/src/main/resources/META-INF/definitions/optimisation/core.dl
@@ -0,0 +1,434 @@
+/**
+ * Root element for an evolutionary algorithm configuration.
+ */
+type configuration {
+	/**
+	 * A freely selectable name for the configuration.
+	 */
+	name : string;
+	
+	/**
+	 * The algorithm configuration.
+	 */
+	algorithm : instance algorithm;
+	
+	/**
+	 * Configuration of statistics to measure and to write.
+	 */
+	statistics : instance statistics;
+}
+
+abstract type algorithm {}
+
+type 'evolutionary-algorithm' extends 'algorithm' {
+	'number-of-generations' : int;
+	'size-of-population' : int;
+	'maximum-age' : int;
+	maximize : boolean;
+
+	genotype : array instance chromosome;
+
+	initialization : instance 'initial-population';
+	handlers : array instance 'handler';
+	selectors : instance selectors;
+	alterers : instance alterers;
+
+	fitness : instance 'fitness-function';
+	comparator : instance comparator;
+}
+
+abstract type chromosome {
+	genes : array instance gene;
+}
+
+type 'bit-chromosome' extends chromosome {
+    scale : int;
+}
+
+type 'gray-chromosome' extends 'bit-chromosome' {
+    scale : int;
+}
+
+type 'double-chromosome' extends chromosome {
+}
+
+type 'integer-chromosome' extends chromosome {
+}
+
+type gene { content : data; }
+
+abstract type comparator {}
+
+type 'weighted-sum' extends comparator {
+	weights : array float;
+}
+
+type pareto extends comparator {
+}
+
+/**
+ * Abstract base class for functions to map the individual to the target values.
+ */
+abstract type 'fitness-function' {}
+
+/**
+ * Abstract base class for all fitness functions that call a subsequent fitness function during calculation.
+ */
+abstract type 'decorated-fitness-function' extends 'fitness-function' {
+	/**
+	 * Fitness function we are calling during the fitness calculation.
+	 */
+	function : instance 'fitness-function';
+}
+
+type 'malus' extends 'decorated-fitness-function' {
+}
+
+/**
+ * Fitness function that calculates the difference between a fitness value and a
+ *   target value to optimize to:<br/>
+ *
+ * <mathml>
+ *   <math>
+ *     <mrow>
+ *       <mi>f</mi>
+ *       <mi>i</mi>
+ *       <mi>t</mi>
+ *       <mi>n</mi>
+ *       <mi>e</mi>
+ *       <mi>s</mi>
+ *       <mi>s</mi>
+ *       <mo>=</mo>
+ *       <mi>f</mi>
+ *       <mi>u</mi>
+ *       <mi>n</mi>
+ *       <mi>c</mi>
+ *       <mi>t</mi>
+ *       <mi>i</mi>
+ *       <mi>o</mi>
+ *       <mi>n</mi>
+ *       <mo form="prefix" stretchy="false">(</mo>
+ *       <mi>i</mi>
+ *       <mi>n</mi>
+ *       <mi>d</mi>
+ *       <mo form="postfix" stretchy="false">)</mo>
+ *       <mo>−</mo>
+ *       <mi>t</mi>
+ *       <mi>a</mi>
+ *       <mi>r</mi>
+ *       <mi>g</mi>
+ *       <mi>e</mi>
+ *       <mi>t</mi>
+ *     </mrow>
+ *   </math>
+ * </mathml>
+ */
+type distance extends 'decorated-fitness-function' {
+		target : array instance variable;
+}
+
+type variable {
+	name : data;
+	val : literal;
+}
+
+abstract type 'goal-function' extends 'fitness-function' {
+	'maps-to' : array data;
+}
+
+/**
+ * Calculating fitness value by using a surrogate function:<br/>
+ *
+ * <mathml>
+ *   <math>
+ *     <mrow>
+ *       <mi>f</mi>
+ *       <mi>i</mi>
+ *       <mi>t</mi>
+ *       <mi>n</mi>
+ *       <mi>e</mi>
+ *       <mi>s</mi>
+ *       <mi>s</mi>
+ *       <mo>=</mo>
+ *       <mi>s</mi>
+ *       <mi>u</mi>
+ *       <mi>r</mi>
+ *       <mi>r</mi>
+ *       <mi>o</mi>
+ *       <mi>g</mi>
+ *       <mi>a</mi>
+ *       <mi>t</mi>
+ *       <mi>e</mi>
+ *       <mo form="prefix" stretchy="false">(</mo>
+ *       <mi>i</mi>
+ *       <mi>n</mi>
+ *       <mi>d</mi>
+ *       <mo form="postfix" stretchy="false">)</mo>
+ *     </mrow>
+ *   </math>
+ * </mathml>
+ */
+type surrogate extends 'goal-function' {
+}
+
+/**
+ * Calculating fitness value by using a known function:<br/>
+ *
+ * <mathml>
+ *   <math>
+ *     <mrow>
+ *       <mi>f</mi>
+ *       <mi>i</mi>
+ *       <mi>t</mi>
+ *       <mi>n</mi>
+ *       <mi>e</mi>
+ *       <mi>s</mi>
+ *       <mi>s</mi>
+ *       <mo>=</mo>
+ *       <mi>n</mi>
+ *       <mi>o</mi>
+ *       <mi>r</mi>
+ *       <mi>m</mi>
+ *       <mi>a</mi>
+ *       <mi>l</mi>
+ *       <mo form="prefix" stretchy="false">(</mo>
+ *       <mi>i</mi>
+ *       <mi>n</mi>
+ *       <mi>d</mi>
+ *       <mo form="postfix" stretchy="false">)</mo>
+ *     </mrow>
+ *   </math>
+ * </mathml>
+ */
+type normal extends 'fitness-function' {
+}
+
+abstract type 'initial-population' {}
+
+type 'random-population' extends 'initial-population' {
+}
+
+abstract type handler {}
+
+type 'constraint-handler' extends handler {
+	category : string;
+	calculation : instance normal | 'standard-deviation';
+	'constraint-handling' : instance 'kill-at-birth' | 'malus-for-fitness';
+}
+
+type 'standard-deviation' {
+	factor : float;
+}
+
+type 'kill-at-birth' {
+	'repair-strategy' : instance 'repair-strategy';
+}
+
+abstract type 'repair-strategy' {}
+
+type 'repair-with-random' extends 'repair-strategy' {}
+
+type 'malus-for-fitness' {
+	smoothing : float;
+}
+
+type selectors {
+	survivor : instance selector;
+	offspring : instance selector;
+}
+
+abstract type selector {
+}
+
+type 'elite-selector' extends selector {
+	'size-factor' : float;
+	'non-elite-selector' : instance selector;
+}
+
+type 'boltzmann-selector' extends selector {
+	beta : float;
+}
+
+type 'exponential-rank-selector' extends selector {
+}
+
+type 'linear-rank-selector' extends selector {
+	nminus : int;
+}
+
+type 'monte-carlo-selector' extends selector {
+}
+
+type 'probability-selector' extends selector {
+}
+
+type 'stochastic-universal-selector' extends selector {
+}
+
+type 'tournament-selector' extends selector {
+	'size-factor' : float;
+}
+
+type 'truncation-selector' extends selector {
+	'worst-rank' : int;
+}
+
+type alterers {
+	crossover : array instance crossover;
+	mutator : array instance mutator ;
+}
+
+abstract type crossover {}
+
+type 'mean-alterer' extends crossover {
+	probability : float;
+}
+
+type 'correlation-mean-alterer' extends crossover {
+	probability : float;
+}
+
+type 'partial-matched-alterer' extends crossover {
+	probability : float;
+}
+
+type 'correlation-partial-matched-alterer' extends crossover {
+	probability : float;
+}
+
+type 'line-crossover' extends crossover {
+	probability : float;
+	position : float;
+}
+
+type 'correlation-line-crossover' extends crossover {
+	probability : float;
+	position : float;
+}
+
+type 'multi-point-crossover' extends crossover {
+	probability : float;
+	count : int;
+}
+
+type 'correlation-multi-point-crossover' extends crossover {
+	probability : float;
+	count : int;
+}
+
+type 'single-point-crossover' extends crossover {
+	probability : float;
+}
+
+type 'correlation-single-point-crossover' extends crossover {
+	probability : float;
+}
+
+type 'uniform-crossover' extends crossover {
+	'crossover-probability' : float;
+	'swap-probability' : float;
+}
+
+type 'correlation-uniform-crossover' extends crossover {
+	'crossover-probability' : float;
+	'swap-probability' : float;
+}
+
+abstract type mutator {
+}
+
+type 'gaussian-mutator' extends mutator {
+	probability : float;
+}
+
+type 'correlation-gaussian-mutator' extends mutator {
+	probability : float;
+	threshold : float;
+}
+
+type 'swap-mutator' extends mutator {
+	probability : float;
+}
+
+type 'correlation-swap-mutator' extends mutator {
+	probability : float;
+	threshold : float;
+}
+
+type 'bit-flip-mutator' extends mutator  {
+	probability : float;
+}
+
+type 'correlation-bit-flip-mutator' extends mutator {
+	probability : float;
+	threshold : float;
+}
+
+type statistics {
+	writer : array instance 'statistics-writer';
+}
+
+abstract type 'statistics-writer' {
+}
+
+/**
+ * Creates a file named '<tt>constraint-statistics.csv</tt>' containing
+ *   information on each generation and constraint violations:
+ *
+ * <ul>
+ *   <li>generation</li>
+ *   <li>for each constraint:
+ *      <ul>
+ *        <li>number of violating individuals</li>
+ *        <li>sum of differences</li>
+ *        <li>min of differences</li>
+ *        <li>avg of differences</li>
+ *        <li>max of differences</li>
+ *      </ul>
+ *   </li>
+ * </ul>
+ */
+type 'constraint-statistics' extends 'statistics-writer' {}
+
+/**
+ * Creates a file named '<tt>fitness-by-individual.csv</tt>' containing for each individual
+ *   of each generation the following information:
+ *
+ *  <ul>
+ *    <li>generation</li>
+ *    <li>index of individual</li>
+ *    <li>fitness value of each predicted value of the individual</li>
+ *  </ul>
+ */
+type 'fitness-per-individual' extends 'statistics-writer' {}
+
+/**
+ * Creates a file named '<tt>individuals.csv</tt>' containing for each individual
+ *   the following information:
+ *
+ *  <ul>
+ *    <li>generation</li>
+ *    <li>index of individual</li>
+ *    <li>text representation of individual</li>
+ *    <li>age</li>
+ *    <li>each property value of the individual</li>
+ *  </ul>
+ */
+type individuals extends 'statistics-writer' {}
+
+/**
+ * Does not write any statistics. Can be used to disable statistics output.
+ */
+type none extends 'statistics-writer' {}
+
+/**
+ * Creates a file named '<tt>prediction-by-individual.csv</tt>' containing the
+ *   predicted value(s) of each individual for each generation of the EA run:
+ *
+ * <ul>
+ *   <li>generation</li>
+ *   <li>index of individual</li>
+ *   <li>each predicted value of the individual</li>
+ * </ul>
+ */
+type 'prediction-per-individual' extends 'statistics-writer' {}
diff --git a/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/LanguageHelperTest.dl b/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/LanguageHelperTest.dl
new file mode 100644
index 0000000000000000000000000000000000000000..bde38ea56930869c08d8c5628facff9ce8549e30
--- /dev/null
+++ b/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/LanguageHelperTest.dl
@@ -0,0 +1,12 @@
+type 'parent' {
+	child : instance A;
+}
+
+type A {
+    'float-field'    : float;
+    'string-field'   : string;
+    'integer-field'  : int;
+    'boolean-field'  : boolean;
+    'array-1D-float' : array float;
+    'array-2D-int'   : array  array int;
+}
\ No newline at end of file
diff --git a/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/LanguageHelperTest.ol b/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/LanguageHelperTest.ol
new file mode 100644
index 0000000000000000000000000000000000000000..590943138468706539bb1fb18c6f5ab0e18731d6
--- /dev/null
+++ b/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/LanguageHelperTest.ol
@@ -0,0 +1,16 @@
+use "LanguageHelperTest.dl";
+
+parent {
+	child := A {
+		'boolean-field' := true;	
+		'float-field' := 1.3;
+		'integer-field' := 4;
+		'string-field' := "FOOBAR";
+		'array-1D-float' := [4.2, 3.1, 1.0];
+		'array-2D-int' := [
+			[ 1, 2, 3, 4, 5],
+			[ 3, 2, 1],
+			[42]
+		];
+	};
+}
\ No newline at end of file
diff --git a/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/regressions/generator.dl b/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/regressions/generator.dl
new file mode 100644
index 0000000000000000000000000000000000000000..84b046e8f5db1071b6a220fd41d550b9fa7438f4
--- /dev/null
+++ b/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/regressions/generator.dl
@@ -0,0 +1,25 @@
+/**
+ * Shekel's foxholes.
+ *
+ * https://www.sfu.ca/~ssurjano/shekel.html
+ */
+type 'shekel' {
+    /**
+	 * The recommended value for the vector a is (1/m)*{1,2,2,4,4,6,3,7,5,5}.
+	 */
+	'a' : array float;
+
+    /**
+	 * The recommended value for the constant c is {
+     * {4.0, 1.0, 8.0, 6.0, 3.0, 2.0, 5.0, 8.0, 6.0, 7.0},
+     * {4.0, 1.0, 8.0, 6.0, 7.0, 9.0, 3.0, 1.0, 2.0, 3.6},
+     * {4.0, 1.0, 8.0, 6.0, 3.0, 2.0, 5.0, 8.0, 6.0, 7.0},
+     * {4.0, 1.0, 8.0, 6.0, 7.0, 9.0, 3.0, 1.0, 2.0, 3.6}}.
+	 */
+	'c' : array array float;
+
+    /**
+	 * The recommended value for the constant m is 10.
+	 */
+	'm' : float;
+}
diff --git a/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/regressions/shekel.generator b/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/regressions/shekel.generator
new file mode 100644
index 0000000000000000000000000000000000000000..7486510a4391b0837bc10ad685c2e5bcf8b06b53
--- /dev/null
+++ b/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/regressions/shekel.generator
@@ -0,0 +1,20 @@
+use "generator.dl";
+use "test.ddl";
+
+pipeline example [
+     step {
+     	component 'shekel' {
+            'a' := [1.0,2.0,2.0,4.0,4.0,6.0,3.0,7.0,5.0,5.0];
+            'c' := [
+                 	[4.0,1.0,8.0,6.0,3.0,2.0,5.0,8.0,6.0,7.0],
+                    [4.0,1.0,8.0,6.0,7.0,9.0,3.0,1.0,2.0,3.6],
+                    [4.0,1.0,8.0,6.0,3.0,2.0,5.0,8.0,6.0,7.0],
+                    [4.0,1.0,8.0,6.0,7.0,9.0,3.0,1.0,2.0,3.6]
+            ];
+            'm' := 10.0;
+     	}
+
+     	reads [data 'x:0'];
+     	writes [data 'x:1'];
+     }
+]
diff --git a/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/regressions/test.ddl b/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/regressions/test.ddl
new file mode 100644
index 0000000000000000000000000000000000000000..0a100d6397a8fdf5ddd81abe08ae60078ff8f7aa
--- /dev/null
+++ b/src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/regressions/test.ddl
@@ -0,0 +1,3 @@
+data:
+	quotient real data 'x:0';
+	quotient real data 'x:1';
\ No newline at end of file
diff --git a/src/core/de.evoal.core.junit/pom.xml b/src/core/de.evoal.core.junit/pom.xml
index 18a5e744436027f83c39af47638c2afc2c749ee3..c2754b4c2f2237fae65501e664da1455a3b36891 100644
--- a/src/core/de.evoal.core.junit/pom.xml
+++ b/src/core/de.evoal.core.junit/pom.xml
@@ -7,6 +7,7 @@
 		<groupId>de.evoal</groupId>
 		<artifactId>releng.parent</artifactId>
 		<version>0.9.0-SNAPSHOT</version>
+		<relativePath>../de.evoal.releng.parent</relativePath>
 	</parent>
 
 	<artifactId>core.junit</artifactId>
diff --git a/src/core/de.evoal.core.junit/src/main/java/de/evoal/core/junit/dsl/NoOpBuiltinProvider.java b/src/core/de.evoal.core.junit/src/main/java/de/evoal/core/junit/dsl/NoOpBuiltinProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..76261191afbf917ee20756608b8864871d3ce9e8
--- /dev/null
+++ b/src/core/de.evoal.core.junit/src/main/java/de/evoal/core/junit/dsl/NoOpBuiltinProvider.java
@@ -0,0 +1,14 @@
+package de.evoal.core.junit.dsl;
+
+import de.evoal.languages.model.utils.builtin.BuiltinProvider;
+
+import java.net.URI;
+import java.util.Collection;
+import java.util.Collections;
+
+public class NoOpBuiltinProvider implements BuiltinProvider {
+    @Override
+    public Collection<URI> findBuiltins(String s) {
+        return Collections.emptyList();
+    }
+}
diff --git a/src/core/de.evoal.core.junit/src/main/java/module-info.java b/src/core/de.evoal.core.junit/src/main/java/module-info.java
index ca0735dc163a81868abfdc47878feef831f2ebc7..8f2e8717619e52df5d81515d2669bf687af79087 100644
--- a/src/core/de.evoal.core.junit/src/main/java/module-info.java
+++ b/src/core/de.evoal.core.junit/src/main/java/module-info.java
@@ -22,7 +22,10 @@ module de.evoal.core.junit {
     requires de.evoal.languages.model.generator.dsl;
     requires de.evoal.languages.model.mll.dsl;
     requires de.evoal.languages.model.ol.dsl;
+    requires de.evoal.languages.model.utils;
 
     exports de.evoal.core.junit.dsl;
     exports de.evoal.core.junit.resources;
+
+    provides de.evoal.languages.model.utils.builtin.BuiltinProvider with de.evoal.core.junit.dsl.NoOpBuiltinProvider;
 }
\ No newline at end of file
diff --git a/src/core/de.evoal.core.main/pom.xml b/src/core/de.evoal.core.main/pom.xml
index 38fb5e77723ed895c8ac0e9b4e1511d810d1d318..b0ed4fc71389a3629053d3496039c5028d1d327f 100644
--- a/src/core/de.evoal.core.main/pom.xml
+++ b/src/core/de.evoal.core.main/pom.xml
@@ -250,21 +250,6 @@
 			<scope>compile</scope>
 		</dependency>
 
-		<dependency>
-			<groupId>io.jenetics</groupId>
-			<artifactId>jenetics.ext</artifactId>
-			<version>${jenetics.version}</version>
-			<scope>compile</scope>
-		</dependency>
-
-		<dependency>
-			<groupId>org.decimal4j</groupId>
-			<artifactId>decimal4j</artifactId>
-			<version>1.0.3</version>
-			<scope>compile</scope>
-		</dependency>
-
-
 		<!-- Math stuff -->
 		<dependency>
 			<groupId>org.apache.commons</groupId>
@@ -273,13 +258,6 @@
 			<scope>compile</scope>
 		</dependency>
 
-		<dependency>
-			<groupId>com.github.haifengl</groupId>
-			<artifactId>smile-math</artifactId>
-			<version>${smile.version}</version>
-			<scope>compile</scope>
-		</dependency>
-
 		<dependency>
 			<groupId>org.junit.jupiter</groupId>
 			<artifactId>junit-jupiter</artifactId>
@@ -317,27 +295,6 @@
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-compiler-plugin</artifactId>
-				<version>3.10.1</version>
-				<configuration>
-					<annotationProcessorPaths>
-						<path>
-							<groupId>org.projectlombok</groupId>
-							<artifactId>lombok</artifactId>
-							<version>${lombok.version}</version>
-						</path>
-					</annotationProcessorPaths>
-					<compilerArgs>
-						<arg>--add-exports</arg>
-						<arg>io.jenetics.base/io.jenetics.internal.math=de.evoal.core.main</arg>
-						<arg>--add-exports</arg>
-						<arg>io.jenetics.base/io.jenetics.internal.util=de.evoal.core.main</arg>
-						<arg>--add-exports</arg>
-						<arg>io.jenetics.base/io.jenetics.internal.collection=de.evoal.core.main</arg>
-						<!--<arg>- -add-exports</arg>
-						<arg>org.eclipse.xtext.util/org.eclipse.xtext.util=de.evoal.core.main</arg>-->
-					</compilerArgs>
-					<forceJavacCompilerUse>true</forceJavacCompilerUse>
-				</configuration>
 			</plugin>
 		</plugins>
 	</build>
diff --git a/src/core/de.evoal.core.main/scripts/paths.env b/src/core/de.evoal.core.main/scripts/paths.env
index b627c074ea53d921bad3d9d0d9d61079c4b6c2e0..afa5637770b472eac02c3be7c98c149e6348d5e0 100644
--- a/src/core/de.evoal.core.main/scripts/paths.env
+++ b/src/core/de.evoal.core.main/scripts/paths.env
@@ -4,7 +4,7 @@ PLUGIN_PATHS=`ls -d "${EVOALPATH}/plugins"/* | tr '\n' ':'`
 CLASSPATH="-Dorg.jboss.logging.provider=slf4j \
           --module-path ${EVOALPATH}/modules/:$PLUGIN_PATHS \
           --add-modules ALL-MODULE-PATH \
-          --add-exports io.jenetics.base/io.jenetics.internal.math=de.evoal.core.main \
-          --add-exports io.jenetics.base/io.jenetics.internal.collection=de.evoal.core.main \
-          --add-exports io.jenetics.base/io.jenetics.internal.util=de.evoal.core.main \
+          --add-exports io.jenetics.base/io.jenetics.internal.math=de.evoal.core.ea \
+          --add-exports io.jenetics.base/io.jenetics.internal.collection=de.evoal.core.ea \
+          --add-exports io.jenetics.base/io.jenetics.internal.util=de.evoal.core.ea \
           -m de.evoal.core.main/de.evoal.core.main.Evoal"
\ No newline at end of file
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/FitnessDecorator.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/FitnessDecorator.java
deleted file mode 100644
index fea17387f53473ba0fe4cc30bb0eaf9dec49fe14..0000000000000000000000000000000000000000
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/FitnessDecorator.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package de.evoal.core.api.ea.fitness;
-
-import de.evoal.core.api.cdi.BeanFactory;
-import de.evoal.core.api.ea.fitness.FitnessFunction;
-import de.evoal.languages.model.instance.Instance;
-
-public abstract class FitnessDecorator implements FitnessFunction {
-    protected FitnessFunction decoratedFunction;
-
-    @Override
-    public FitnessFunction init(final Instance config) {
-        final Instance decoratedConfig = (Instance) config.findAttribute("function").getValue();
-
-        decoratedFunction = BeanFactory.create(decoratedConfig.getDefinition().getName(), FitnessFunction.class);
-        decoratedFunction.init(decoratedConfig);
-
-        return this;
-    }
-}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/FitnessFunction.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/FitnessFunction.java
deleted file mode 100644
index fc82aebf1e2962cfaea1c66dd3b3a06f9731ce37..0000000000000000000000000000000000000000
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/FitnessFunction.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package de.evoal.core.api.ea.fitness;
-
-import de.evoal.core.api.properties.Properties;
-import de.evoal.core.api.properties.PropertiesSpecification;
-import de.evoal.languages.model.instance.Instance;
-
-import java.util.function.Function;
-
-/**
- * A fitness function calculates a list of doubles for a given individual,
- *   expressing some kind of similarity measures.
- */
-public interface FitnessFunction extends Function<Properties, double []> {
-    public default double [] apply(final Properties properties) {
-        return evaluate(properties);
-    }
-
-    public double [] evaluate(final Properties properties);
-
-    FitnessFunction init(final Instance config);
-}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/comparator/FitnessComparator.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/comparator/FitnessComparator.java
deleted file mode 100644
index ae502fa9608935e260b09111d90eac48299195f2..0000000000000000000000000000000000000000
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/comparator/FitnessComparator.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package de.evoal.core.api.ea.fitness.comparator;
-
-import de.evoal.languages.model.instance.Instance;
-
-import java.util.function.Function;
-
-/**
- * Converts a given set of fitness values (result of {@link de.evoal.core.api.ea.fitness.FitnessFunction}
- * into a {@link FitnessValue} for Jenetics.
- */
-public interface FitnessComparator extends Function<double [], FitnessValue> {
-    /**
-     * Creates a fitness type instance for the given fitness values.
-     *
-     * @param fitnessValues The calculated fitness values to convert.
-     * @return The calculated FitnessType.
-     */
-    public FitnessValue compare(final double [] fitnessValues);
-
-    public default FitnessValue apply(final double [] fitnessValues) {
-        return compare(fitnessValues);
-    }
-
-    FitnessComparator init(final Instance config);
-}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/comparator/FitnessValue.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/comparator/FitnessValue.java
deleted file mode 100644
index 6b0e79e2d536d1c9416eccdfb9a15903cfd7a530..0000000000000000000000000000000000000000
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/comparator/FitnessValue.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package de.evoal.core.api.ea.fitness.comparator;
-
-/**
- * The fitness value is an abstract type that allows comparing them.
- */
-public interface FitnessValue extends Comparable<FitnessValue> {
-    /**
-     * @return A list of serializable information for fitness value statistics.
-     */
-    public Object [] toStatistics();
-}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/package-info.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/package-info.java
deleted file mode 100644
index 0a81b12d924f5f6638ea7aaea5bc043899b451de..0000000000000000000000000000000000000000
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * API package for fitness calculators.
- */
-package de.evoal.core.api.ea.fitness;
\ No newline at end of file
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/search/OptimisationAlgorithm.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationAlgorithm.java
similarity index 85%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/search/OptimisationAlgorithm.java
rename to src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationAlgorithm.java
index eb738cc1e5f62063a5cf066eb2068f3505c50ed0..4d3701f6646fde2c07143722b80caf94663350e8 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/search/OptimisationAlgorithm.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationAlgorithm.java
@@ -1,4 +1,4 @@
-package de.evoal.core.api.search;
+package de.evoal.core.api.optimisation;
 
 import de.evoal.languages.model.instance.Instance;
 
@@ -11,7 +11,7 @@ public interface OptimisationAlgorithm {
      *
      * @param instance The configuration to use.
      *
-     * @return The algrithm itself.
+     * @return The algorithm itself.
      */
     public OptimisationAlgorithm init(final Instance instance);
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationFunction.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationFunction.java
new file mode 100644
index 0000000000000000000000000000000000000000..c3407f6d29d86cdc3c2c9afbc3a64c89676de1c6
--- /dev/null
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationFunction.java
@@ -0,0 +1,16 @@
+package de.evoal.core.api.optimisation;
+
+import de.evoal.core.api.properties.Properties;
+import de.evoal.languages.model.instance.Instance;
+
+import java.util.function.Function;
+
+public interface OptimisationFunction extends Function<Properties, double []> {
+    public default double [] apply(final Properties candidate) {
+        return apply(candidate);
+    }
+
+    public double [] evaluate(final Properties candidate);
+
+    public OptimisationFunction init(final Instance config);
+}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationFunctionDecorator.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationFunctionDecorator.java
new file mode 100644
index 0000000000000000000000000000000000000000..25fa8e466af3d36b8f8615a30a6bb7ccbd4d4f64
--- /dev/null
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationFunctionDecorator.java
@@ -0,0 +1,19 @@
+package de.evoal.core.api.optimisation;
+
+import de.evoal.core.api.cdi.BeanFactory;
+import de.evoal.core.api.optimisation.OptimisationFunction;
+import de.evoal.languages.model.instance.Instance;
+
+public abstract class OptimisationFunctionDecorator implements OptimisationFunction {
+    protected OptimisationFunction decoratedFunction;
+
+    @Override
+    public OptimisationFunction init(final Instance config) {
+        final Instance decoratedConfig = (Instance) config.findAttribute("function").getValue();
+
+        decoratedFunction = BeanFactory.create(decoratedConfig.getDefinition().getName(), OptimisationFunction.class);
+        decoratedFunction.init(decoratedConfig);
+
+        return this;
+    }
+}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationValue.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationValue.java
new file mode 100644
index 0000000000000000000000000000000000000000..3978c729810e47662c0b4583d57aa681f8dbd4f4
--- /dev/null
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationValue.java
@@ -0,0 +1,11 @@
+package de.evoal.core.api.optimisation;
+
+/**
+ * The optimisation value is an abstract type that allows comparing them.
+ */
+public interface OptimisationValue extends Comparable<OptimisationValue> {
+    /**
+     * @return A list of serializable information for optimisation value statistics.
+     */
+    public Object [] toStatistics();
+}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationValueComparator.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationValueComparator.java
new file mode 100644
index 0000000000000000000000000000000000000000..2bd4e34cf63aa56ea7ae328586ea2931f304faaa
--- /dev/null
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationValueComparator.java
@@ -0,0 +1,34 @@
+package de.evoal.core.api.optimisation;
+
+import de.evoal.languages.model.instance.Instance;
+
+import java.util.function.Function;
+
+/**
+ * Converts a given optimisation value (result of {@link de.evoal.core.api.optimisation.OptimisationFunction})
+ * into a {@link OptimisationValue} for comparison.
+ */
+public interface OptimisationValueComparator extends Function<double [], OptimisationValue> {
+
+    /**
+     * Applies the comparator to a given set of raw optimisation values.
+     *
+     * @param optimisationValues the raw values.
+     * @return the optimisation value for comparison.
+     */
+    public default OptimisationValue apply(final double [] optimisationValues) {
+        return toValue(optimisationValues);
+    }
+
+    /**
+     * Creates an optimisation value instance for raw fitness values.
+     *
+     * @param optimisationValues the raw values.
+     * @return The calculated optimisation value.
+     */
+    public OptimisationValue toValue(final double [] optimisationValues);
+
+
+
+    OptimisationValueComparator init(final Instance config);
+}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/properties/PropertiesSpecification.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/properties/PropertiesSpecification.java
index 55e5ffd65adcf29c94bec6ed61a450dca5a8e099..c4d13c47554cec7514764e023a7dd38308861c2f 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/properties/PropertiesSpecification.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/properties/PropertiesSpecification.java
@@ -1,8 +1,6 @@
 package de.evoal.core.api.properties;
 
 import de.evoal.languages.model.ddl.DataDescription;
-import org.apache.commons.math3.util.Pair;
-import org.slf4j.LoggerFactory;
 
 import java.util.*;
 import java.util.stream.Collectors;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/Candidate.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/Candidate.java
new file mode 100644
index 0000000000000000000000000000000000000000..3f8ae958f39b3eb3af6a5496259cca2a9e36de60
--- /dev/null
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/Candidate.java
@@ -0,0 +1,30 @@
+package de.evoal.core.api.statistics;
+
+import de.evoal.core.api.optimisation.OptimisationValue;
+import de.evoal.core.api.properties.Properties;
+
+/**
+ * A solution candidate for the optimisation problem
+ */
+public interface Candidate {
+    /**
+     * Returns the age of the candidate that is always related to an optimisation
+     * iteration, c.f., {@link IterationResult}. If there is no age in the
+     * optimisation algorithm this value defaults to {@code 1}.
+     *
+     * @return The age of the candidate For iteration-based approaches.
+     */
+    public default int age() {
+        return 1;
+    }
+
+    /**
+     * @return The candidate's search space representation.
+     */
+    public Properties searchSpaceRepresentation();
+
+    /**
+     * @return The optimisation value of the candidate.
+     */
+    public OptimisationValue value();
+}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/IterationResult.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/IterationResult.java
new file mode 100644
index 0000000000000000000000000000000000000000..b3acbecf912d107cb0bb5b072673ff085698909e
--- /dev/null
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/IterationResult.java
@@ -0,0 +1,30 @@
+package de.evoal.core.api.statistics;
+
+import java.util.Optional;
+import java.util.stream.Stream;
+
+/**
+ * Result of a single iteration of an optimisation
+ */
+public interface IterationResult {
+    /**
+     * @return The current iteration number.
+     */
+    public int iteration();
+
+    /**
+     * @return Stream of all candidates of the iteration. May be empty.
+     */
+    public Stream<Candidate> candidates();
+
+    /**
+     * The number of candidates of this iteration if available.
+     */
+    public Optional<Integer> candidateCount();
+
+    /**
+     * @return The best candidate of the iteration.
+     */
+    public Candidate bestCandidate();
+
+}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/Writer.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/io/Writer.java
similarity index 92%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/Writer.java
rename to src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/io/Writer.java
index 0a1c31895ab74ea4ca0015e9ff4880ce14f1c142..ca52713132811e068311c9ccafd0b4f5b5be11cd 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/Writer.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/io/Writer.java
@@ -1,4 +1,4 @@
-package de.evoal.core.api.statistics;
+package de.evoal.core.api.statistics.io;
 
 /**
  * Base interface for all statistics writer.
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/WriterException.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/io/WriterException.java
similarity index 83%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/WriterException.java
rename to src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/io/WriterException.java
index 62f74d95c03867b8f5e29d9296ed5dd1ec1b639c..12f6a90394a2c67a1ca4b849f7698fb60be3ba0e 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/WriterException.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/io/WriterException.java
@@ -1,4 +1,4 @@
-package de.evoal.core.api.statistics;
+package de.evoal.core.api.statistics.io;
 
 /**
  * Exception for signaling errors while writing.
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/WriterStrategy.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/io/WriterStrategy.java
similarity index 86%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/WriterStrategy.java
rename to src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/io/WriterStrategy.java
index 0c6a46270cf99a10a27c71cd7a52d3ce2b2b1897..dbe478e7358e31fb6af5d3887ec251017db51926 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/WriterStrategy.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/io/WriterStrategy.java
@@ -1,4 +1,7 @@
-package de.evoal.core.api.statistics;
+package de.evoal.core.api.statistics.io;
+
+import de.evoal.core.api.statistics.writer.Column;
+import de.evoal.core.api.statistics.writer.WriterContext;
 
 import javax.inject.Inject;
 import java.util.List;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/package-info.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/package-info.java
index 87bd9222827c21571fdc8c6984face331dc6e4eb..22edd16303b019864815dde9a982036ccb6ca919 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/package-info.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/package-info.java
@@ -1,6 +1,6 @@
 /**
  * This package contains all API functionality necessary to implement
- * custom {@link de.evoal.core.api.statistics.StatisticsWriter} and to add
- * custom {@link de.evoal.core.api.statistics.WriterStrategy}.
+ * custom {@link de.evoal.core.api.statistics.writer.StatisticsWriter} and to add
+ * custom {@link de.evoal.core.api.statistics.io.WriterStrategy}.
  */
 package de.evoal.core.api.statistics;
\ No newline at end of file
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/writer/AbstractCandidateStatisticsWriter.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/writer/AbstractCandidateStatisticsWriter.java
new file mode 100644
index 0000000000000000000000000000000000000000..238018e165aa10c9d071829eb981fe1fd0b0fb33
--- /dev/null
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/writer/AbstractCandidateStatisticsWriter.java
@@ -0,0 +1,59 @@
+package de.evoal.core.api.statistics.writer;
+
+import de.evoal.core.api.statistics.Candidate;
+import de.evoal.core.api.statistics.IterationResult;
+import de.evoal.core.api.statistics.io.Writer;
+import de.evoal.core.api.statistics.io.WriterException;
+import de.evoal.core.api.statistics.io.WriterStrategy;
+import de.evoal.languages.model.instance.Instance;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.inject.Inject;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+@Slf4j
+public abstract class AbstractCandidateStatisticsWriter implements StatisticsWriter {
+
+    @Inject
+    protected WriterStrategy strategy;
+
+    private Writer writer;
+
+    @Override
+    public void add(final IterationResult result) {
+        final AtomicInteger counter = new AtomicInteger(0);
+
+        result.candidates()
+                .map(c -> toData(counter.getAndIncrement(), result.iteration(), c))
+                .forEach(r -> {
+                    try {
+                        writer.addRecord(r);
+                    } catch (final WriterException e) {
+                        log.warn("Failed to writer statistics record.");
+                    }
+                });
+    }
+
+    @Override
+    @SneakyThrows(WriterException.class)
+    public StatisticsWriter init(final Instance configuration) {
+        writer = createWriter();
+
+        return this;
+    }
+
+    protected abstract Writer createWriter() throws WriterException ;
+
+    protected abstract Object [] toData(final int index, final int iteration, final Candidate candidate);
+
+    public void write() {
+        try {
+            strategy.close(writer);
+        } catch (final WriterException e) {
+            log.error("Failed to write statistics:", e);
+        }
+    }
+}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/Column.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/writer/Column.java
similarity index 88%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/Column.java
rename to src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/writer/Column.java
index 8c88921717efc28f8472a009e519173f13ee0b24..8cab93285306f67fc955e7c324e5c8364418bbf9 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/Column.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/writer/Column.java
@@ -1,4 +1,4 @@
-package de.evoal.core.api.statistics;
+package de.evoal.core.api.statistics.writer;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/ColumnType.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/writer/ColumnType.java
similarity index 70%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/ColumnType.java
rename to src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/writer/ColumnType.java
index f1b8511d2e74aacb3b3946df22b93546add9c081..b726903245d86a17c0ec40b962fc14965c3b46b5 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/ColumnType.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/writer/ColumnType.java
@@ -1,4 +1,4 @@
-package de.evoal.core.api.statistics;
+package de.evoal.core.api.statistics.writer;
 
 /**
  * Possible column types.
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/StatisticsWriter.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/writer/StatisticsWriter.java
similarity index 57%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/StatisticsWriter.java
rename to src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/writer/StatisticsWriter.java
index 501057998afce3a4385f4ec42000ef98ebb81d34..40435739d0cf801306fdeab737b0d1e949474bff 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/StatisticsWriter.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/writer/StatisticsWriter.java
@@ -1,8 +1,7 @@
-package de.evoal.core.api.statistics;
+package de.evoal.core.api.statistics.writer;
 
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
+import de.evoal.core.api.statistics.IterationResult;
 import de.evoal.languages.model.instance.Instance;
-import io.jenetics.engine.EvolutionResult;
 
 /**
  * Evaluation-specific data writer for evaluation results. The information
@@ -10,16 +9,16 @@ import io.jenetics.engine.EvolutionResult;
  * a certain technique under investigation. What all writer have in common
  * is the table-like structure of data (think of a CSV file).
  *
- * The framework will call {@link #init(Instance)} once before the evolutionary
- * algorithm starts. While the EA runs, it will call {@link #add(EvolutionResult)}
- * for each generation of individuals. When the EA terminated, the framework calls
- * {@link #write()} once to force a serialization of the data.
+ * The framework will call {@link #init(Instance)} once before the optimisation
+ * algorithm starts. While the algorithm runs, it will call {@link #add(IterationResult)}
+ * for each generation step. When the algorithm terminates, the framework calls
+ * {@link #write()} once to force data serialization.
  */
 public interface StatisticsWriter {
     /**
-     * Adds a evaluation result to the statistics.
+     * Adds an optimisation result to the statistics.
      */
-    public void add(final EvolutionResult<?, FitnessValue> result);
+    public void add(final IterationResult result);
 
     /**
      * Passes the writer configuration.
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/WriterContext.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/writer/WriterContext.java
similarity index 96%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/WriterContext.java
rename to src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/writer/WriterContext.java
index 2b417785b384b1d78ff0526eef0a67c3e4241285..0a1edbda968c8fda0fe84c65bf61893169a65f46 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/WriterContext.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/writer/WriterContext.java
@@ -1,4 +1,4 @@
-package de.evoal.core.api.statistics;
+package de.evoal.core.api.statistics.writer;
 
 import javax.enterprise.context.ApplicationScoped;
 import java.util.*;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/Evoal.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/Evoal.java
index c7cc28ce4920587c0a2a43d44f7c8438b3d44948..92ead2624fa731ebe7a4bead86ff623b5fd32c7e 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/Evoal.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/Evoal.java
@@ -16,10 +16,6 @@ import org.apache.deltaspike.core.api.provider.BeanProvider;
 import org.apache.deltaspike.core.util.metadata.AnnotationInstanceProvider;
 import org.slf4j.bridge.SLF4JBridgeHandler;
 
-import java.io.IOException;
-import java.io.UncheckedIOException;
-import java.lang.module.ModuleReader;
-import java.lang.module.ResolvedModule;
 import java.lang.reflect.Field;
 import java.util.*;
 
@@ -29,25 +25,18 @@ import java.util.*;
  */
 @Slf4j
 public final class Evoal {
+
+    /**
+     * Some libraries use Java's unified logging facility. This method installs
+     *   a logging bridge that reroutes all logging from JUL to SLF4J.
+     */
+    private static void installJavaLoggingToSLF4JBridge() {
+        SLF4JBridgeHandler.removeHandlersForRootLogger();
+        SLF4JBridgeHandler.install();
+    }
+
     public static void main(final String ... args) {
         installJavaLoggingToSLF4JBridge();
-/*
-        final ModuleLayer layer = ModuleLayer.boot();
-        ModuleLayer.boot().configuration().modules().stream()
-                .map(ResolvedModule::reference)
-                .forEach(mref -> {
-
-                    System.out.println(mref.descriptor().name() + " --> " + mref.location().get());
-                    try (ModuleReader reader = mref.open()) {
-                        reader.list().forEach(f -> System.out.println("   " + f));
-                    } catch (IOException ioe) {
-                        throw new UncheckedIOException(ioe);
-                    }
-                });
-
-
-        System.exit(1);
-*/
         log.info("Starting up EvoAl");
 
         log.info("Booting CDI container");
@@ -86,11 +75,6 @@ public final class Evoal {
         cdiContainer.shutdown();
     }
 
-    private static void installJavaLoggingToSLF4JBridge() {
-        SLF4JBridgeHandler.removeHandlersForRootLogger();
-        SLF4JBridgeHandler.install();
-    }
-
     private static void printUsage() {
         System.out.println();
         System.out.println();
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/comparator/WeightedSumComparator.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/comparator/WeightedSumComparator.java
similarity index 65%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/comparator/WeightedSumComparator.java
rename to src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/comparator/WeightedSumComparator.java
index 90ac991abc22da1fa977d2f3164965117a27be58..4479daefd3f0e3d454fcafa98fb1da46342beaf1 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/comparator/WeightedSumComparator.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/comparator/WeightedSumComparator.java
@@ -1,28 +1,27 @@
-package de.evoal.core.main.ea.comparator;
+package de.evoal.core.main.comparator;
 
-import de.evoal.core.api.ea.fitness.comparator.FitnessComparator;
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
+import de.evoal.core.api.optimisation.OptimisationValueComparator;
+import de.evoal.core.api.optimisation.OptimisationValue;
 import de.evoal.languages.model.el.DoubleLiteral;
 import de.evoal.languages.model.instance.Array;
 import de.evoal.languages.model.instance.Instance;
 import de.evoal.languages.model.instance.LiteralValue;
-import de.evoal.languages.model.instance.Value;
 
 import javax.enterprise.context.Dependent;
 import javax.inject.Named;
 
 @Dependent
 @Named("weighted-sum")
-public class WeightedSumComparator implements FitnessComparator {
+public class WeightedSumComparator implements OptimisationValueComparator {
     private double [] weights;
 
     @Override
-    public FitnessValue compare(final double[] fitnessValues) {
-        return WeightedSumFitnessValue.of(weights, fitnessValues);
+    public OptimisationValue toValue(final double[] fitnessValues) {
+        return WeightedSumOptimisationValue.of(weights, fitnessValues);
     }
 
     @Override
-    public FitnessComparator init(final Instance config) {
+    public OptimisationValueComparator init(final Instance config) {
         final Array weights = (Array) config.findAttribute("weights")
                                             .getValue();
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/comparator/WeightedSumFitnessValue.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/comparator/WeightedSumOptimisationValue.java
similarity index 72%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/comparator/WeightedSumFitnessValue.java
rename to src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/comparator/WeightedSumOptimisationValue.java
index e7f0bb89e9be7aa535fc4640f1c62e597d5502e8..5246a7b72e0bf0987307f6a30e29bb3e59f18413 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/comparator/WeightedSumFitnessValue.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/comparator/WeightedSumOptimisationValue.java
@@ -1,6 +1,6 @@
-package de.evoal.core.main.ea.comparator;
+package de.evoal.core.main.comparator;
 
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
+import de.evoal.core.api.optimisation.OptimisationValue;
 import de.evoal.core.api.utils.Requirements;
 import lombok.Getter;
 import lombok.NonNull;
@@ -9,12 +9,12 @@ import java.util.Arrays;
 
 import static de.evoal.core.api.utils.Requirements.requireSameSize;
 
-public class WeightedSumFitnessValue implements FitnessValue {
+public class WeightedSumOptimisationValue implements OptimisationValue {
     @Getter
     private final @NonNull double[] fitnessValues;
     private final @NonNull double[] normalizedWeights;
 
-    private WeightedSumFitnessValue(final @NonNull double[] weights, final @NonNull double[] fitnessValues) {
+    private WeightedSumOptimisationValue(final @NonNull double[] weights, final @NonNull double[] fitnessValues) {
         Requirements.requireSameSize(weights, fitnessValues);
 
         this.normalizedWeights = new double[weights.length];
@@ -27,13 +27,13 @@ public class WeightedSumFitnessValue implements FitnessValue {
         }
     }
 
-    public static FitnessValue of(final double [] weights, final double [] fitnessValues) {
-        return new WeightedSumFitnessValue(weights, fitnessValues);
+    public static OptimisationValue of(final double [] weights, final double [] fitnessValues) {
+        return new WeightedSumOptimisationValue(weights, fitnessValues);
     }
 
     @Override
-    public int compareTo(final FitnessValue other) {
-        if(!(other instanceof WeightedSumFitnessValue)) {
+    public int compareTo(final OptimisationValue other) {
+        if(!(other instanceof WeightedSumOptimisationValue)) {
             throw new IllegalArgumentException("Only allowed to compare WeightedSumFitnessValue");
         }
 
@@ -42,7 +42,7 @@ public class WeightedSumFitnessValue implements FitnessValue {
 
         for(int index = 0; index < fitnessValues.length; ++index) {
             ownFitness = ownFitness + this.normalizedWeights[index] * Math.abs(this.fitnessValues[index]);
-            otherFitness = otherFitness + this.normalizedWeights[index] * Math.abs(((WeightedSumFitnessValue)other).getFitnessValues()[index]);
+            otherFitness = otherFitness + this.normalizedWeights[index] * Math.abs(((WeightedSumOptimisationValue)other).getFitnessValues()[index]);
         }
 
         return ownFitness == otherFitness ? 0 : (int)Math.signum(ownFitness - otherFitness);
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/comparator/ParetoComparator.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/comparator/ParetoComparator.java
deleted file mode 100644
index 21baf96561ba22f36a0d9204f0454664acbca926..0000000000000000000000000000000000000000
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/comparator/ParetoComparator.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package de.evoal.core.main.ea.comparator;
-
-import de.evoal.core.api.ea.fitness.comparator.FitnessComparator;
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
-import de.evoal.languages.model.instance.Instance;
-
-import javax.enterprise.context.ApplicationScoped;
-
-import javax.inject.Named;
-
-@ApplicationScoped
-@Named("pareto")
-public class ParetoComparator implements FitnessComparator {
-    @Override
-    public FitnessValue compare(final double[] fitnessValues) {
-        return ParetoFitnessValue.of(fitnessValues);
-    }
-
-    @Override
-    public ParetoComparator init(Instance config) {
-        return this;
-    }
-}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/ConstraintList.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/ConstraintList.java
deleted file mode 100644
index 1f3c7c540b9f3f17376f2195303cf4c4b89bf5e9..0000000000000000000000000000000000000000
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/ConstraintList.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package de.evoal.core.main.jenetics;
-
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
-import io.jenetics.Gene;
-import io.jenetics.Phenotype;
-import io.jenetics.engine.Constraint;
-
-import java.util.List;
-
-public class ConstraintList<G extends Gene<?, G>> implements Constraint<G, FitnessValue> {
-    private final List<Constraint<G, FitnessValue>> constraints;
-
-    public ConstraintList(final List<Constraint<G, FitnessValue>> constraints) {
-        this.constraints = constraints;
-    }
-
-    @Override
-    public boolean test(final Phenotype<G, FitnessValue> individual) {
-        return constraints.stream().allMatch(c -> c.test(individual));
-    }
-
-    @Override
-    public Phenotype<G, FitnessValue> repair(Phenotype<G, FitnessValue> individual, long generation) {
-        Phenotype<G, FitnessValue> phenotype = individual;
-
-        for(final Constraint<G, FitnessValue> c : constraints) {
-            phenotype = c.repair(phenotype, generation);
-        }
-
-        return phenotype;
-    }
-}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/language/ModuleBuiltinProvider.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/language/ModuleBuiltinProvider.java
index bc783c435d23285b0aa99993dc58a4737502bb83..2842415e76dcdf80d628c8dee7789eaa0e216e37 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/language/ModuleBuiltinProvider.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/language/ModuleBuiltinProvider.java
@@ -3,14 +3,77 @@ package de.evoal.core.main.language;
 import de.evoal.languages.model.utils.builtin.BuiltinProvider;
 import lombok.extern.slf4j.Slf4j;
 
+import java.io.IOException;
+import java.lang.module.ModuleReader;
+import java.lang.module.ModuleReference;
+import java.lang.module.ResolvedModule;
 import java.net.URI;
-import java.util.Collection;
-import java.util.Collections;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
+/**
+ * Builtin provider for Java SE module environment.
+ */
 @Slf4j
 public class ModuleBuiltinProvider implements BuiltinProvider {
+    private static Map<String, Collection<URI>> builtinCache = new HashMap<>();
+
     @Override
     public Collection<URI> findBuiltins(final String name) {
-        return Collections.emptyList();
+        Collection<URI> result = builtinCache.get(name);
+
+        if(result != null) {
+            return result;
+        }
+
+        result = ModuleLayer.boot()
+                .configuration()
+                .modules()
+                .stream()
+                .map(ResolvedModule::reference)
+                .flatMap(m -> findBuiltins(m, name))
+                .collect(Collectors.toList());
+
+        log.info("Found {} builtins for {}.", result.size(), name);
+        result.forEach(u -> log.info("  {}", u));
+        builtinCache.put(name, result);
+
+        return result;
+    }
+
+    private Stream<URI> findBuiltins(final ModuleReference module, final String basename) {
+        final String completeBase = "META-INF/definitions/" + basename;
+
+        try (ModuleReader reader = module.open()) {
+            return reader.list()
+                    .filter(f -> f.startsWith(completeBase))
+                    .filter(f -> f.endsWith(".dl"))
+                    .map(f -> {
+                        try {
+                            log.info("Found builtin {} in {}.", f, module.location().get().getPath());
+                            final Path modulePath = Paths.get(module.location().get().getPath());
+
+                            if(modulePath.toFile().isDirectory()) {
+                                return modulePath.resolve(f).toUri();
+                            } else {
+                                final FileSystem zipFS = FileSystems.newFileSystem(modulePath);
+                                final Path fileInZip = zipFS.getPath(f);
+
+                                return fileInZip.toUri();
+                            }
+                        } catch (final Exception e) {
+                            log.error("Unable to create URI for {} in {}.", f, module.location().get(), e);
+                            return null;
+                        }
+                    })
+                    .filter(Objects::nonNull);
+        } catch (IOException ioe) {
+            return Stream.<URI>builder().build();
+        }
     }
 }
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/ConfigurationValueProducer.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/ConfigurationValueProducer.java
index ffe4d141c9262387bbfc896d7eaded23e847a5e6..13262c3b3dcf469fa976d5298dec03ad1bae3b40 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/ConfigurationValueProducer.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/ConfigurationValueProducer.java
@@ -50,6 +50,19 @@ public class ConfigurationValueProducer {
         return lookup(board.get(value.entry()), value.access());
     }
 
+    @Produces
+    @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "")
+    public final Instance [] injectInstanceArrayValue(final InjectionPoint ip, final Blackboard board) {
+        final ConfigurationValue value = ip.getAnnotated().getAnnotation(ConfigurationValue.class);
+
+        final Object [] array = lookup(board.get(value.entry()), value.access());
+        final Instance [] copy = new Instance[array.length];
+
+        System.arraycopy(array, 0, copy, 0, copy.length);
+
+        return copy;
+    }
+
     @Produces
     @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "")
     public final Instance injectInstanceValue(final InjectionPoint ip, final Blackboard board) {
@@ -79,6 +92,7 @@ public class ConfigurationValueProducer {
     }
 
     private static <T> T lookup(final OptimisationModel model, final String access) {
+        log.info("Looking up configuration value {}", access);
         return LanguageHelper.lookup(model.getInstance(), access);
     }
 }
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/SpecificationProducer.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/SpecificationProducer.java
index faf31bd308b230f574d61b83ae94d6d0669a62f9..c0edffbc3fb45b175d7a03a1ad40b371e88c2757 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/SpecificationProducer.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/producer/SpecificationProducer.java
@@ -13,6 +13,7 @@ import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.context.Dependent;
 import javax.enterprise.inject.Produces;
 import javax.inject.Named;
+import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -21,9 +22,8 @@ public class SpecificationProducer {
     @Produces
     @Dependent
     @Named("genotype-description")
-    public List<DataDescription> createSourceSpecification(final @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.genotype") Array genotype) {
-        final List<DataDescription> descriptors = genotype.getValues()
-                .stream()
+    public List<DataDescription> createSourceSpecification(final @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.genotype") Instance [] genotype) {
+        final List<DataDescription> descriptors = Arrays.stream(genotype)
                 .map(Instance.class::cast)
                 .map(i -> i.findAttribute("genes"))
                 .map(Attribute::getValue)
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/search/HeuristicSearchEvaluation.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/search/HeuristicSearchEvaluation.java
index d5cabac5a5fc18784cf2ba9c5fca9a97ebacdd18..74e944936ba41547802dab76510bb2b1e55f16cf 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/search/HeuristicSearchEvaluation.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/search/HeuristicSearchEvaluation.java
@@ -1,19 +1,17 @@
 package de.evoal.core.main.search;
 
 import de.evoal.core.api.board.CoreBlackboardEntries;
-import de.evoal.core.api.cdi.Application;
-import de.evoal.core.api.cdi.BeanFactory;
-import de.evoal.core.api.cdi.BlackboardValue;
-import de.evoal.core.api.cdi.MainClass;
+import de.evoal.core.api.cdi.*;
+import de.evoal.core.api.optimisation.OptimisationAlgorithm;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertiesPair;
 import de.evoal.core.api.board.Blackboard;
 import javax.enterprise.context.ApplicationScoped;
 
-import de.evoal.core.api.statistics.Column;
-import de.evoal.core.api.statistics.ColumnType;
-import de.evoal.core.api.statistics.WriterContext;
-import de.evoal.core.main.ea.search.EvolutionaryAlgorithmSearch;
+import de.evoal.core.api.statistics.writer.Column;
+import de.evoal.core.api.statistics.writer.ColumnType;
+import de.evoal.core.api.statistics.writer.WriterContext;
+import de.evoal.languages.model.instance.Instance;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.math3.util.Pair;
 
@@ -65,6 +63,10 @@ public class HeuristicSearchEvaluation implements MainClass {
     private Column targetColumn;
     private Column runColumn;
 
+    @Inject
+    @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm")
+    private Instance algorithmConfiguration;
+
     @Override
     public void run() {
         log.info("Running heuristic search evaluation with the following configuration:");
@@ -113,8 +115,9 @@ public class HeuristicSearchEvaluation implements MainClass {
             board.bind(CoreBlackboardEntries.EVALUATION_RUN, run);
             context.bindColumn(runColumn, i);
 
-            BeanFactory.create(EvolutionaryAlgorithmSearch.class)
-                       .run();
+            BeanFactory.create(OptimisationAlgorithm.class)
+                    .init(algorithmConfiguration)
+                    .run();
         }
     }
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/search/HeuristicSearchMain.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/search/HeuristicSearchMain.java
index 42900dd8b117cc00bb0dcfea40d51179ba1fecff..8f0d469ed193607e472c7dfc21a4f97e458f4d62 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/search/HeuristicSearchMain.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/search/HeuristicSearchMain.java
@@ -9,14 +9,13 @@ import de.evoal.core.api.cdi.MainClass;
 import de.evoal.core.api.properties.Properties;
 import javax.enterprise.context.ApplicationScoped;
 
-import de.evoal.core.api.search.OptimisationAlgorithm;
-import de.evoal.core.api.statistics.ColumnType;
-import de.evoal.core.api.statistics.WriterContext;
+import de.evoal.core.api.optimisation.OptimisationAlgorithm;
+import de.evoal.core.api.statistics.writer.ColumnType;
+import de.evoal.core.api.statistics.writer.WriterContext;
 import de.evoal.languages.model.instance.Instance;
 import org.apache.commons.math3.util.Pair;
 
 import javax.inject.Inject;
-import javax.inject.Named;
 import java.io.File;
 import java.util.stream.Stream;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/search/HeuristicSearchUtils.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/search/HeuristicSearchUtils.java
index 4e1abf34f31e785565070087a7a8711cee671e2b..bfe4ac00df1beec4bb4cfd52ed256652a4b08424 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/search/HeuristicSearchUtils.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/search/HeuristicSearchUtils.java
@@ -1,11 +1,9 @@
 package de.evoal.core.main.search;
 
-import de.evoal.core.api.statistics.Column;
-import de.evoal.core.api.statistics.ColumnType;
-import de.evoal.core.api.statistics.WriterContext;
+import de.evoal.core.api.statistics.writer.Column;
+import de.evoal.core.api.statistics.writer.ColumnType;
+import de.evoal.core.api.statistics.writer.WriterContext;
 import lombok.extern.slf4j.Slf4j;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import java.io.File;
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/StatisticsFactory.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/StatisticsFactory.java
index 1da6eb6ad378fdb34641c1a6d28654888971e890..dcde046a03d8f2aff4b9978ae933852a01569431 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/StatisticsFactory.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/StatisticsFactory.java
@@ -1,12 +1,14 @@
 package de.evoal.core.main.statistics;
 
 import de.evoal.core.api.board.CoreBlackboardEntries;
+import de.evoal.core.api.cdi.BeanFactory;
 import de.evoal.core.api.cdi.ConfigurationValue;
-import de.evoal.core.api.statistics.StatisticsWriter;
+import de.evoal.core.api.statistics.writer.StatisticsWriter;
 import de.evoal.core.api.utils.Requirements;
+import de.evoal.core.main.statistics.internal.MultipleStatisticsWriter;
 import de.evoal.languages.model.instance.Array;
 import de.evoal.languages.model.instance.Instance;
-import de.evoal.core.main.statistics.internal.MultipleStatisticsWriter;
+
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.context.Dependent;
 import javax.enterprise.inject.Produces;
@@ -28,7 +30,7 @@ public class StatisticsFactory {
         final StatisticsWriter [] writers = array.getValues()
                                                  .stream()
                                                  .map(Instance.class::cast)
-                                                 .map(i -> new Pair<>(BeanProvider.getContextualReference(i.getDefinition().getName(), false, StatisticsWriter.class), i))
+                                                 .map(i -> new Pair<>(BeanFactory.create(i.getDefinition().getName(), StatisticsWriter.class), i))
                                                  .map(p -> p.getFirst().init(p.getSecond()))
                                                  .toArray(i -> new StatisticsWriter[i]);
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/fitness/FitnessStatistics.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/fitness/FitnessStatistics.java
index c5c323f6ed21c1a8b46393140c633c548097fed8..2318297ea54a6b9b79699b7971a0ba064b92ea85 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/fitness/FitnessStatistics.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/fitness/FitnessStatistics.java
@@ -1,14 +1,14 @@
 package de.evoal.core.main.statistics.fitness;
 
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.core.api.statistics.*;
-import de.evoal.languages.model.instance.Instance;
-import io.jenetics.Phenotype;
-import io.jenetics.engine.EvolutionResult;
-import io.jenetics.util.ISeq;
+import de.evoal.core.api.statistics.io.Writer;
+import de.evoal.core.api.statistics.io.WriterException;
+import de.evoal.core.api.statistics.writer.AbstractCandidateStatisticsWriter;
+import de.evoal.core.api.statistics.writer.Column;
+import de.evoal.core.api.statistics.writer.ColumnType;
+
 import javax.enterprise.context.Dependent;
-import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 
 import javax.inject.Inject;
@@ -23,26 +23,14 @@ import java.util.List;
 @Slf4j
 @Named("fitness-per-individual")
 @Dependent
-public class FitnessStatistics implements StatisticsWriter {
+public class FitnessStatistics extends AbstractCandidateStatisticsWriter {
 
     @Inject
-    @Named("optimization-function-output")
+    @Named("optimisation-function-output")
     private Provider<PropertiesSpecification> targetSpecification;
 
-    @Inject
-    private WriterStrategy strategy;
-
-    private Writer writer;
-
     @Override
-    @SneakyThrows(WriterException.class)
-    public StatisticsWriter init(Instance configuration) {
-        createWriter();
-
-        return this;
-    }
-
-    private void createWriter() throws WriterException {
+    protected Writer createWriter() throws WriterException {
         final List<Column> columns = new LinkedList<>();
 
         columns.add(new Column("generation", ColumnType.Integer));
@@ -52,38 +40,20 @@ public class FitnessStatistics implements StatisticsWriter {
             columns.add(new Column("fitness-value-" + targetSpecification.get().get(i).name(), ColumnType.Double));
         }
 
-        writer = strategy.create("fitness-by-individual", columns);
+        return strategy.create("fitness-by-individual", columns);
     }
 
-    private Object[] dataOfPhenotype(final int index, final long generation, Phenotype<?, FitnessValue> phenotype) {
+    @Override
+    protected Object[] toData(final int index, final int iteration, final Candidate candidate) {
         final Object [] data = new Object[2 + targetSpecification.get().size()];
 
-        data[0] = generation;
+        data[0] = iteration;
         data[1] = index;
 
-        final Object [] fitnessValues = phenotype.fitness().toStatistics();
+        final Object [] fitnessValues = candidate.value().toStatistics();
 
-        for(int i = 0; i < fitnessValues.length; ++i) {
-            data[2 + i] = fitnessValues[i];
-        }
+        System.arraycopy(fitnessValues, 0, data, 2, fitnessValues.length);
 
         return data;
     }
-
-    @SneakyThrows(WriterException.class)
-    public void add(final EvolutionResult<?, FitnessValue> evolutionResult) {
-        final ISeq<Phenotype<?, FitnessValue>> population = (ISeq<Phenotype<?, FitnessValue>>)(Object)evolutionResult.population();
-
-        for(int i = 0; i < population.size(); ++i) {
-            writer.addRecord(dataOfPhenotype(i, evolutionResult.generation(), population.get(i)));
-        }
-    }
-
-    public void write() {
-        try {
-            strategy.close(writer);
-        } catch (final WriterException e) {
-            log.error("Failed to write statistics:", e);
-        }
-    }
 }
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/fitness/OptimisingStatistics.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/fitness/OptimisingStatistics.java
new file mode 100644
index 0000000000000000000000000000000000000000..5709cf8d3b5a9af7a490da0e03b4bb659a5da3a0
--- /dev/null
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/fitness/OptimisingStatistics.java
@@ -0,0 +1,66 @@
+package de.evoal.core.main.statistics.fitness;
+
+import de.evoal.core.api.optimisation.OptimisationFunction;
+import de.evoal.core.api.properties.Properties;
+import de.evoal.core.api.properties.PropertiesSpecification;
+import de.evoal.core.api.statistics.*;
+import de.evoal.core.api.statistics.io.Writer;
+import de.evoal.core.api.statistics.io.WriterException;
+import de.evoal.core.api.statistics.writer.AbstractCandidateStatisticsWriter;
+import de.evoal.core.api.statistics.writer.Column;
+import de.evoal.core.api.statistics.writer.ColumnType;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.enterprise.context.Dependent;
+import javax.inject.Inject;
+import javax.inject.Named;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Small helper class for collecting and writing the generation-based statistics.
+ */
+@Slf4j
+@Named("optimising-per-individual")
+@Dependent
+public class OptimisingStatistics extends AbstractCandidateStatisticsWriter {
+
+    @Inject
+    @Named("optimisation-function")
+    private OptimisationFunction optimisationFunction;
+
+    @Inject
+    @Named("optimisation-function-output")
+    private PropertiesSpecification targetSpecification;
+
+    @Override
+    protected Writer createWriter() throws WriterException {
+        final List<Column> columns = new LinkedList<>();
+
+        columns.add(new Column("generation", ColumnType.Integer));
+        columns.add(new Column("index", ColumnType.Integer));
+
+        for(int i = 0; i < targetSpecification.size(); ++i) {
+            columns.add(new Column("optimisation-value-" + targetSpecification.get(i).name(), ColumnType.Double));
+        }
+
+        return strategy.create("optimisation-by-individual", columns);
+    }
+
+    @Override
+    protected Object [] toData(final int index, final int iteration, final Candidate candidate) {
+        final Object [] data = new Object[2 + targetSpecification.size()];
+
+        data[0] = iteration;
+        data[1] = index;
+
+        final Properties individual = candidate.searchSpaceRepresentation();
+        final double [] raw = optimisationFunction.evaluate(individual);
+
+        for(int i = 0; i < raw.length; ++i) {
+            data[2 + i] = raw[i];
+        }
+
+        return data;
+    }
+}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/fitness/OptimizingStatistics.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/fitness/OptimizingStatistics.java
deleted file mode 100644
index f8a1b0b6c6a5aba75d738a1f389355b5f80de02c..0000000000000000000000000000000000000000
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/fitness/OptimizingStatistics.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package de.evoal.core.main.statistics.fitness;
-
-import de.evoal.core.api.board.BlackboardEntry;
-import de.evoal.core.api.cdi.BlackboardValue;
-import de.evoal.core.api.ea.codec.CustomCodec;
-import de.evoal.core.api.ea.fitness.FitnessFunction;
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
-import de.evoal.core.api.properties.Properties;
-import de.evoal.core.api.properties.PropertiesSpecification;
-import de.evoal.core.api.statistics.*;
-import de.evoal.languages.model.instance.Instance;
-import io.jenetics.Genotype;
-import io.jenetics.Phenotype;
-import io.jenetics.engine.EvolutionResult;
-import io.jenetics.util.ISeq;
-import lombok.SneakyThrows;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.enterprise.context.Dependent;
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Provider;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Small helper class for collecting and writing the generation-based statistics.
- */
-@Slf4j
-@Named("optimizing-per-individual")
-@Dependent
-public class OptimizingStatistics implements StatisticsWriter {
-
-    @Inject
-    private CustomCodec codec;
-
-    @Inject
-    @Named("optimization-function")
-    private FitnessFunction optimization;
-
-    @Inject
-    @Named("optimization-function-output")
-    private PropertiesSpecification targetSpecification;
-
-    @Inject
-    private WriterStrategy strategy;
-
-    private Writer writer;
-
-    @Override
-    @SneakyThrows(WriterException.class)
-    public StatisticsWriter init(Instance configuration) {
-        createWriter();
-
-        return this;
-    }
-
-    private void createWriter() throws WriterException {
-        final List<Column> columns = new LinkedList<>();
-
-        columns.add(new Column("generation", ColumnType.Integer));
-        columns.add(new Column("index", ColumnType.Integer));
-
-        for(int i = 0; i < targetSpecification.size(); ++i) {
-            columns.add(new Column("optimization-value-" + targetSpecification.get(i).name(), ColumnType.Double));
-        }
-
-        writer = strategy.create("optimization-by-individual", columns);
-    }
-
-    private Object[] dataOfPhenotype(final int index, final long generation, Phenotype<?, FitnessValue> phenotype) {
-        final Object [] data = new Object[2 + targetSpecification.size()];
-
-        data[0] = generation;
-        data[1] = index;
-
-        final Genotype<?> genotype = phenotype.genotype();
-        final Properties individual = (Properties)codec.decode(genotype);
-        final double [] raw = optimization.evaluate(individual);
-
-        for(int i = 0; i < raw.length; ++i) {
-            data[2 + i] = raw[i];
-        }
-
-        return data;
-    }
-
-    @SneakyThrows(WriterException.class)
-    public void add(final EvolutionResult<?, FitnessValue> evolutionResult) {
-        final ISeq<Phenotype<?, FitnessValue>> population = (ISeq<Phenotype<?, FitnessValue>>)(Object)evolutionResult.population();
-
-        for(int i = 0; i < population.size(); ++i) {
-            writer.addRecord(dataOfPhenotype(i, evolutionResult.generation(), population.get(i)));
-        }
-    }
-
-    public void write() {
-        try {
-            strategy.close(writer);
-        } catch (final WriterException e) {
-            log.error("Failed to write statistics:", e);
-        }
-    }
-}
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/individuals/IndividualStatistics.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/individuals/IndividualStatistics.java
index b8f58b5c641f4a2b45a021c4b632bd84da30b013..c4473223da06b4c0b0768f2f3ba718eb19b03cd5 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/individuals/IndividualStatistics.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/individuals/IndividualStatistics.java
@@ -1,26 +1,28 @@
 package de.evoal.core.main.statistics.individuals;
 
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
+import de.evoal.core.api.statistics.IterationResult;
 import de.evoal.core.api.statistics.*;
+import de.evoal.core.api.statistics.io.Writer;
+import de.evoal.core.api.statistics.io.WriterException;
+import de.evoal.core.api.statistics.io.WriterStrategy;
+import de.evoal.core.api.statistics.writer.AbstractCandidateStatisticsWriter;
+import de.evoal.core.api.statistics.writer.Column;
+import de.evoal.core.api.statistics.writer.ColumnType;
+import de.evoal.core.api.statistics.writer.StatisticsWriter;
 import de.evoal.languages.model.instance.Instance;
-import de.evoal.core.api.ea.codec.CustomCodec;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertiesSpecification;
-import io.jenetics.Genotype;
 import javax.annotation.PostConstruct;
 import javax.enterprise.context.Dependent;
 
-import io.jenetics.Phenotype;
-import io.jenetics.engine.EvolutionResult;
-import io.jenetics.util.ISeq;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 
-import javax.enterprise.inject.Produces;
 import javax.inject.Inject;
 import javax.inject.Named;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * Small helper class for collecting and writing the generation-based statistics.
@@ -28,33 +30,13 @@ import java.util.List;
 @Slf4j
 @Named("individuals")
 @Dependent
-public class IndividualStatistics implements StatisticsWriter {
-    /**
-     * Encoding for converting between ea and domain.
-     */
-    @Inject
-    private CustomCodec encoding;
+public class IndividualStatistics extends AbstractCandidateStatisticsWriter {
 
     @Inject @Named("genotype-specification")
     private PropertiesSpecification sourceSpecification;
 
-    @Inject
-    private WriterStrategy strategy;
-
-    private Writer writer;
-
-    @PostConstruct
-    @SneakyThrows(WriterException.class)
-    private void init() {
-        createWriter();
-    }
-
     @Override
-    public StatisticsWriter init(Instance configuration) {
-        return this;
-    }
-
-    private void createWriter() throws WriterException {
+    protected Writer createWriter() throws WriterException {
         final List<Column> columns = new ArrayList<>();
 
         columns.add(new Column("generation", ColumnType.Integer));
@@ -65,18 +47,18 @@ public class IndividualStatistics implements StatisticsWriter {
             columns.add(new Column(sourceSpecification.getProperties().get(i).name(), ColumnType.Double));
         }
 
-        writer = strategy.create("individuals", columns);
+        return strategy.create("individuals", columns);
     }
 
-    private Object[] dataOfPhenotype(final int index, final long generation, Phenotype<?, FitnessValue> phenotype) {
+    @Override
+    protected Object[] toData(final int index, final int iteration, final Candidate candidate) {
         final Object [] data = new Object[3 + sourceSpecification.size()];
 
-        final Genotype<?> genotype = phenotype.genotype();
-        final Properties individual = (Properties) encoding.decode(genotype);
+        final Properties individual = candidate.searchSpaceRepresentation();
 
-        data[0] = generation;
+        data[0] = iteration;
         data[1] = index;
-        data[2] = phenotype.age(generation);
+        data[2] = candidate.age();
 
         for(int i = 0; i < individual.size(); ++i) {
             data[3 + i] = individual.getValues()[i];
@@ -84,21 +66,4 @@ public class IndividualStatistics implements StatisticsWriter {
 
         return data;
     }
-
-    @SneakyThrows(WriterException.class)
-    public void add(final EvolutionResult<?, FitnessValue> evolutionResult) {
-        final ISeq<Phenotype<?, FitnessValue>> population = (ISeq<Phenotype<?, FitnessValue>>)(Object)evolutionResult.population();
-
-        for(int i = 0; i < population.size(); ++i) {
-            writer.addRecord(dataOfPhenotype(i, evolutionResult.generation(), population.get(i)));
-        }
-    }
-
-    public void write() {
-        try {
-            strategy.close(writer);
-        } catch (final WriterException e) {
-            log.error("Failed to write statistics:", e);
-        }
-    }
 }
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/internal/MultipleStatisticsWriter.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/internal/MultipleStatisticsWriter.java
index 921a2ad4538268eaaea743abbffa9692dc0d2246..9046da28d7bbf5f863cd3f8aa55b41d5c476eca2 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/internal/MultipleStatisticsWriter.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/internal/MultipleStatisticsWriter.java
@@ -1,9 +1,8 @@
 package de.evoal.core.main.statistics.internal;
 
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
+import de.evoal.core.api.statistics.IterationResult;
 import de.evoal.languages.model.instance.Instance;
-import de.evoal.core.api.statistics.StatisticsWriter;
-import io.jenetics.engine.EvolutionResult;
+import de.evoal.core.api.statistics.writer.StatisticsWriter;
 
 import java.util.Arrays;
 
@@ -15,8 +14,8 @@ public class MultipleStatisticsWriter implements StatisticsWriter {
     }
 
     @Override
-    public void add(final EvolutionResult<?, FitnessValue> evolutionResult) {
-        Arrays.stream(writers).forEach(w -> w.add(evolutionResult));
+    public void add(final IterationResult result) {
+        Arrays.stream(writers).forEach(w -> w.add(result));
     }
 
     @Override
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/writer/csv/CsvStrategy.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/io/csv/CsvStrategy.java
similarity index 82%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/writer/csv/CsvStrategy.java
rename to src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/io/csv/CsvStrategy.java
index f2bb050689bf434d60cb452eacdcd5b357b485ac..431192e84a8b74e5757e49b6c20d181da274b8cb 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/writer/csv/CsvStrategy.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/io/csv/CsvStrategy.java
@@ -1,11 +1,11 @@
-package de.evoal.core.main.statistics.writer.csv;
+package de.evoal.core.main.statistics.io.csv;
 
 import de.evoal.core.api.board.CoreBlackboardEntries;
 import de.evoal.core.api.cdi.BlackboardValue;
-import de.evoal.core.api.statistics.Column;
-import de.evoal.core.api.statistics.Writer;
-import de.evoal.core.api.statistics.WriterException;
-import de.evoal.core.api.statistics.WriterStrategy;
+import de.evoal.core.api.statistics.writer.Column;
+import de.evoal.core.api.statistics.io.Writer;
+import de.evoal.core.api.statistics.io.WriterException;
+import de.evoal.core.api.statistics.io.WriterStrategy;
 
 import javax.enterprise.context.ApplicationScoped;
 import javax.inject.Inject;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/writer/csv/CsvWriter.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/io/csv/CsvWriter.java
similarity index 89%
rename from src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/writer/csv/CsvWriter.java
rename to src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/io/csv/CsvWriter.java
index e303e5053a1477bfe95c4833afbf7239d9ed3601..73bdaa7313e655633324236568cf4b9a1b062a99 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/writer/csv/CsvWriter.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/io/csv/CsvWriter.java
@@ -1,9 +1,9 @@
-package de.evoal.core.main.statistics.writer.csv;
+package de.evoal.core.main.statistics.io.csv;
 
-import de.evoal.core.api.statistics.Column;
-import de.evoal.core.api.statistics.Writer;
-import de.evoal.core.api.statistics.WriterContext;
-import de.evoal.core.api.statistics.WriterException;
+import de.evoal.core.api.statistics.writer.Column;
+import de.evoal.core.api.statistics.io.Writer;
+import de.evoal.core.api.statistics.writer.WriterContext;
+import de.evoal.core.api.statistics.io.WriterException;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.csv.CSVFormat;
 import org.apache.commons.csv.CSVPrinter;
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/nop/NopStatistics.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/nop/NopStatistics.java
index 195ae316e57a342ff0b062d271d774ee762d469d..18c1b25433ccc9eaf5ed266df889833960d760f1 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/nop/NopStatistics.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/nop/NopStatistics.java
@@ -1,9 +1,8 @@
 package de.evoal.core.main.statistics.nop;
 
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
+import de.evoal.core.api.statistics.IterationResult;
 import de.evoal.languages.model.instance.Instance;
-import de.evoal.core.api.statistics.StatisticsWriter;
-import io.jenetics.engine.EvolutionResult;
+import de.evoal.core.api.statistics.writer.StatisticsWriter;
 
 import javax.enterprise.context.Dependent;
 
@@ -13,7 +12,7 @@ import javax.inject.Named;
 @Dependent
 public class NopStatistics implements StatisticsWriter {
     @Override
-    public void add(final EvolutionResult<?, FitnessValue> evolutionResult) {
+    public void add(final IterationResult evolutionResult) {
     }
 
     @Override
diff --git a/src/core/de.evoal.core.main/src/main/java/module-info.java b/src/core/de.evoal.core.main/src/main/java/module-info.java
index bd1fbec6ed89fde20a30b1dcc41437c0956db713..b422e6e8827cd3aa7a75e7d975f60039ae2793dd 100644
--- a/src/core/de.evoal.core.main/src/main/java/module-info.java
+++ b/src/core/de.evoal.core.main/src/main/java/module-info.java
@@ -16,13 +16,7 @@ module de.evoal.core.main {
     requires jul.to.slf4j;
     requires ch.qos.logback.classic;
 
-    requires io.jenetics.base;
-    requires io.jenetics.ext;
-    requires commons.math3;
     requires commons.csv;
-    requires smile.math;
-
-    requires decimal4j;
 
     requires com.fasterxml.jackson.databind;
 
@@ -41,66 +35,41 @@ module de.evoal.core.main {
     requires de.evoal.languages.model.instance;
     requires de.evoal.languages.model.utils;
     requires com.google.guice;
+    requires commons.math3;
 
     exports de.evoal.core.api.board;
     exports de.evoal.core.api.cdi;
-    exports de.evoal.core.api.ea.codec;
-    exports de.evoal.core.api.ea.constraints.model;
-    exports de.evoal.core.api.ea.constraints.strategies;
-    exports de.evoal.core.api.ea.constraints.calculation;
-    exports de.evoal.core.api.ea.constraints.strategies.fitness;
-    exports de.evoal.core.api.ea.correlations;
-    exports de.evoal.core.api.ea.fitness;
-    exports de.evoal.core.api.ea.fitness.comparator;
-    exports de.evoal.core.api.ea.initial;
     exports de.evoal.core.api.properties;
     exports de.evoal.core.api.properties.info;
     exports de.evoal.core.api.properties.io;
     exports de.evoal.core.api.properties.stream;
-    exports de.evoal.core.api.search;
+    exports de.evoal.core.api.optimisation;
     exports de.evoal.core.api.statistics;
+    exports de.evoal.core.api.statistics.io;
+    exports de.evoal.core.api.statistics.writer;
     exports de.evoal.core.api.utils;
 
     opens de.evoal.core.api.board to weld.core.impl;
     opens de.evoal.core.api.cdi to weld.core.impl;
-    opens de.evoal.core.api.ea to weld.core.impl;
-    opens de.evoal.core.api.ea.constraints to weld.core.impl;
-    opens de.evoal.core.api.ea.constraints.model to weld.core.impl;
-    opens de.evoal.core.api.ea.constraints.strategies.fitness to weld.core.impl;
-    opens de.evoal.core.api.ea.fitness to weld.core.impl;
+    opens de.evoal.core.api.optimisation to weld.core.impl;
     opens de.evoal.core.api.properties to weld.core.impl;
+    opens de.evoal.core.api.properties.info to weld.core.impl;
     opens de.evoal.core.api.properties.io to weld.core.impl;
     opens de.evoal.core.api.properties.stream to weld.core.impl;
     opens de.evoal.core.api.statistics to weld.core.impl;
     opens de.evoal.core.api.utils to weld.core.impl;
 
-    opens de.evoal.core.main.ea.alterer to weld.core.impl;
-    opens de.evoal.core.main.ea.alterer.mutator to weld.core.impl;
-    opens de.evoal.core.main.ea.codec to weld.core.impl;
-    opens de.evoal.core.main.ea.codec.chromosome to weld.core.impl;
-    opens de.evoal.core.main.ea.comparator to weld.core.impl;
-    opens de.evoal.core.main.ea.constraints.deviation to weld.core.impl;
-    opens de.evoal.core.main.ea.constraints.constraint to weld.core.impl;
-    opens de.evoal.core.main.ea.constraints.constraint.strategies.calculations to weld.core.impl;
-    opens de.evoal.core.main.ea.constraints.constraint.strategies.constraint to weld.core.impl;
-    opens de.evoal.core.main.ea.constraints.constraint.strategies.fitness to weld.core.impl;
-    opens de.evoal.core.main.ea.constraints.correlation to weld.core.impl;
-    opens de.evoal.core.main.ea.fitness to weld.core.impl;
-    opens de.evoal.core.main.ea.initial to weld.core.impl;
-    opens de.evoal.core.main.ea.producer to weld.core.impl;
+    opens de.evoal.core.main.comparator to weld.core.impl;
     opens de.evoal.core.main.producer to weld.core.impl;
+    opens de.evoal.core.main.properties to weld.core.impl;
     opens de.evoal.core.main.search to weld.core.impl;
     opens de.evoal.core.main.statistics to weld.core.impl;
     opens de.evoal.core.main.statistics.fitness to weld.core.impl;
     opens de.evoal.core.main.statistics.individuals to weld.core.impl;
     opens de.evoal.core.main.statistics.nop to weld.core.impl;
-    opens de.evoal.core.main.statistics.writer.csv to weld.core.impl;
-    opens de.evoal.core.api.ea.correlations to weld.core.impl;
-    opens de.evoal.core.api.ea.constraints.calculation to weld.core.impl;
-    opens de.evoal.core.api.properties.info to weld.core.impl;
-    opens de.evoal.core.api.ea.constraints.strategies to weld.core.impl;
-    opens de.evoal.core.main.properties to weld.core.impl;
-    opens de.evoal.core.main.ea.search to weld.core.impl;
+    opens de.evoal.core.main.statistics.io.csv to weld.core.impl;
+    opens de.evoal.core.api.statistics.io to weld.core.impl;
+    opens de.evoal.core.api.statistics.writer to weld.core.impl;
 
-    provides de.evoal.languages.model.utils.builtin.BuiltinProvider with de.evoal.core.main.language.ModuleBuiltinProvider;
+    //provides de.evoal.languages.model.utils.builtin.BuiltinProvider with ModuleBuiltinProvider;
 }
diff --git a/src/core/de.evoal.core.main/src/main/resources/META-INF/definitions/data/constraints.dl b/src/core/de.evoal.core.main/src/main/resources/META-INF/definitions/data/constraints.dl
new file mode 100644
index 0000000000000000000000000000000000000000..1ba8690e74f9ad2ba8fd29a3979296932e3c9ee7
--- /dev/null
+++ b/src/core/de.evoal.core.main/src/main/resources/META-INF/definitions/data/constraints.dl
@@ -0,0 +1,13 @@
+/**
+ * Sets the variance of some data.
+ *
+ * <b>Parameters:</b>
+ * <ol>
+ *   <li>Reference to the data ...</li>
+ * </ol>
+ */
+def void variance(data reference, float variance);
+
+def void connection(data ref1, data ref2, float connection);
+
+def void constraint(expression exp, string category);
diff --git a/src/core/de.evoal.core.main/src/main/resources/META-INF/definitions/optimisation/core.dl b/src/core/de.evoal.core.main/src/main/resources/META-INF/definitions/optimisation/core.dl
index 501c25165a7c0490fb893aabf99ef1018c3edd0b..911896202f48220753f39a88c2e76c6a525f617b 100644
--- a/src/core/de.evoal.core.main/src/main/resources/META-INF/definitions/optimisation/core.dl
+++ b/src/core/de.evoal.core.main/src/main/resources/META-INF/definitions/optimisation/core.dl
@@ -18,17 +18,18 @@ type configuration {
 	statistics : instance statistics;
 }
 
-type algorithm {
-	number_of_generations : int;
-	size_of_population : int;
-	maximum_age : int;
+abstract type algorithm {}
+
+type 'evolutionary-algorithm' extends 'algorithm' {
+	'number-of-generations' : int;
+	'size-of-population' : int;
+	'maximum-age' : int;
 	maximize : boolean;
-	
+
 	genotype : array instance chromosome;
 
-	initialization : instance random | training;
-	encoding  : instance encoding;
-	constraint_handling : instance constraint_handling;
+	initialization : instance 'initial-population';
+	handlers : array instance 'handler';
 	selectors : instance selectors;
 	alterers : instance alterers;
 
@@ -54,10 +55,8 @@ type 'double-chromosome' extends chromosome {
 type 'integer-chromosome' extends chromosome {
 }
 
-
 type gene { content : data; }
 
-
 abstract type comparator {}
 
 type 'weighted-sum' extends comparator {
@@ -80,13 +79,15 @@ abstract type 'decorated-fitness-function' extends 'fitness-function' {
 	 * Fitness function we are calling during the fitness calculation.
 	 */
 	function : instance 'fitness-function';
-	
+}
+
+type 'malus' extends 'decorated-fitness-function' {
 }
 
 /**
  * Fitness function that calculates the difference between a fitness value and a
  *   target value to optimize to:<br/>
- * 
+ *
  * <mathml>
  *   <math>
  *     <mrow>
@@ -137,7 +138,7 @@ abstract type 'goal-function' extends 'fitness-function' {
 
 /**
  * Calculating fitness value by using a surrogate function:<br/>
- * 
+ *
  * <mathml>
  *   <math>
  *     <mrow>
@@ -172,7 +173,7 @@ type surrogate extends 'goal-function' {
 
 /**
  * Calculating fitness value by using a known function:<br/>
- * 
+ *
  * <mathml>
  *   <math>
  *     <mrow>
@@ -202,63 +203,32 @@ type surrogate extends 'goal-function' {
 type normal extends 'fitness-function' {
 }
 
-type adjusted extends 'decorated-fitness-function' {
-}
-
-type 'adjusted-modified' extends 'decorated-fitness-function' {
-}
+abstract type 'initial-population' {}
 
-type density extends 'decorated-fitness-function' {
-	exponent : float;
-	root_exponent : float;
-	
-	kind : string;
+type 'random-population' extends 'initial-population' {
 }
 
-type density2 extends 'decorated-fitness-function' {
-	exponent : float;
-	root_exponent : float;
-
-	kind : string;
-}
-
-type training {
-}
-
-type random {
-}
-
-abstract type encoding {}
-
-type double_to_properties extends encoding {
-	bounded_operations : boolean;
-}
-
-type bit_to_properties extends encoding {
-	bounded_operations : boolean;
-}
+abstract type handler {}
 
-type gray_bit_to_properties extends encoding {
-	bounded_operations : boolean;
+type 'constraint-handler' extends handler {
+	category : string;
+	calculation : instance normal | 'standard-deviation';
+	'constraint-handling' : instance 'kill-at-birth' | 'malus-for-fitness';
 }
 
-type constraint_handling {
-	unnamed : instance handling;
+type 'standard-deviation' {
+	factor : float;
 }
 
-type handling {
-	calculation : instance normal | standard_deviation;
-	handling : instance kill_at_birth | malus_for_fitness;
+type 'kill-at-birth' {
+	'repair-strategy' : instance 'repair-strategy';
 }
 
-type standard_deviation {
-	factor : float;
-}
+abstract type 'repair-strategy' {}
 
-type kill_at_birth {
-}
+type 'repair-with-random' extends 'repair-strategy' {}
 
-type malus_for_fitness {
+type 'malus-for-fitness' {
 	smoothing : float;
 }
 
@@ -270,37 +240,37 @@ type selectors {
 abstract type selector {
 }
 
-type elite_selector extends selector {
-	count : int;
-	nonEliteSelector : instance selector;
+type 'elite-selector' extends selector {
+	'size-factor' : float;
+	'non-elite-selector' : instance selector;
 }
 
-type boltzmann_selector extends selector {
+type 'boltzmann-selector' extends selector {
 	beta : float;
 }
 
-type exponential_rank_selector extends selector {
+type 'exponential-rank-selector' extends selector {
 }
 
-type linear_rank_selector extends selector {
+type 'linear-rank-selector' extends selector {
 	nminus : int;
 }
 
-type monte_carlo_selector extends selector {	
+type 'monte-carlo-selector' extends selector {
 }
 
-type probability_selector extends selector {	
+type 'probability-selector' extends selector {
 }
 
-type stochastic_universal_selector extends selector {	
+type 'stochastic-universal-selector' extends selector {
 }
 
-type tournament_selector extends selector {
-	size : int;
+type 'tournament-selector' extends selector {
+	'size-factor' : float;
 }
 
-type truncation_selector extends selector {
-	worst_rank : int;
+type 'truncation-selector' extends selector {
+	'worst-rank' : int;
 }
 
 type alterers {
@@ -310,109 +280,101 @@ type alterers {
 
 abstract type crossover {}
 
-type mean_alterer extends crossover {
+type 'mean-alterer' extends crossover {
 	probability : float;
 }
 
-type correlation_mean_alterer extends crossover {
+type 'correlation-mean-alterer' extends crossover {
 	probability : float;
 }
 
-type partial_matched_alterer extends crossover {
+type 'partial-matched-alterer' extends crossover {
 	probability : float;
 }
 
-type correlation_partial_matched_alterer extends crossover {
+type 'correlation-partial-matched-alterer' extends crossover {
 	probability : float;
 }
 
-type line_crossover extends crossover {
+type 'line-crossover' extends crossover {
 	probability : float;
 	position : float;
 }
 
-type correlation_line_crossover extends crossover {
+type 'correlation-line-crossover' extends crossover {
 	probability : float;
 	position : float;
 }
 
-type multi_point_crossover extends crossover {
+type 'multi-point-crossover' extends crossover {
 	probability : float;
 	count : int;
 }
 
-type correlation_multi_point_crossover extends crossover {
+type 'correlation-multi-point-crossover' extends crossover {
 	probability : float;
 	count : int;
 }
 
-type single_point_crossover extends crossover {
+type 'single-point-crossover' extends crossover {
 	probability : float;
 }
 
-type correlation_single_point_crossover extends crossover {
+type 'correlation-single-point-crossover' extends crossover {
 	probability : float;
 }
 
-type uniform_crossover extends crossover {
-	crossover_probability : float;
-	swap_probability : float;
+type 'uniform-crossover' extends crossover {
+	'crossover-probability' : float;
+	'swap-probability' : float;
 }
 
-type correlation_uniform_crossover extends crossover {
-	crossover_probability : float;
-	swap_probability : float;
+type 'correlation-uniform-crossover' extends crossover {
+	'crossover-probability' : float;
+	'swap-probability' : float;
 }
 
 abstract type mutator {
 }
 
-type gaussian_mutator extends mutator {
+type 'gaussian-mutator' extends mutator {
 	probability : float;
 }
 
-type correlation_gaussian_mutator {
+type 'correlation-gaussian-mutator' extends mutator {
 	probability : float;
 	threshold : float;
-}	
+}
 
-type swap_mutator extends mutator {
+type 'swap-mutator' extends mutator {
 	probability : float;
 }
 
-type correlation_swap_mutator extends mutator {
+type 'correlation-swap-mutator' extends mutator {
 	probability : float;
 	threshold : float;
 }
 
-type bit_flip_mutator extends mutator  {
+type 'bit-flip-mutator' extends mutator  {
 	probability : float;
-}	
+}
 
-type correlation_bit_flip_mutator extends mutator {
+type 'correlation-bit-flip-mutator' extends mutator {
 	probability : float;
 	threshold : float;
-}	
-
-type statistics {
-	writer : array instance statistics_writer;
 }
 
-abstract type statistics_writer {
+type statistics {
+	writer : array instance 'statistics-writer';
 }
 
-/**
- * Not functional at the moment.
- */
-type approximative extends statistics_writer {
-	fitness : array instance 'fitness-function';
-	
+abstract type 'statistics-writer' {
 }
 
 /**
  * Creates a file named '<tt>constraint-statistics.csv</tt>' containing
  *   information on each generation and constraint violations:
- * 
+ *
  * <ul>
  *   <li>generation</li>
  *   <li>for each constraint:
@@ -426,37 +388,24 @@ type approximative extends statistics_writer {
  *   </li>
  * </ul>
  */
-type constraint_statistics extends statistics_writer {}
-
-/**
- * Creates a file named '<tt>best-individual-statistics.csv</tt>' containing the
- *   following information for the individual with the best fitness result:
- * 
- * <ul>
- *   <li>generation</li>
- *   <li>individual string</li>
- *   <li>age of individual</li>
- *   <li>???</li>
- * </ul>
- */
-type correlated extends statistics_writer {}
+type 'constraint-statistics' extends 'statistics-writer' {}
 
 /**
  * Creates a file named '<tt>fitness-by-individual.csv</tt>' containing for each individual
  *   of each generation the following information:
- * 
+ *
  *  <ul>
  *    <li>generation</li>
  *    <li>index of individual</li>
  *    <li>fitness value of each predicted value of the individual</li>
  *  </ul>
  */
-type fitness_per_individual extends statistics_writer {}
+type 'fitness-per-individual' extends 'statistics-writer' {}
 
 /**
  * Creates a file named '<tt>individuals.csv</tt>' containing for each individual
  *   the following information:
- * 
+ *
  *  <ul>
  *    <li>generation</li>
  *    <li>index of individual</li>
@@ -465,27 +414,21 @@ type fitness_per_individual extends statistics_writer {}
  *    <li>each property value of the individual</li>
  *  </ul>
  */
-type individuals extends statistics_writer {}
+type individuals extends 'statistics-writer' {}
 
 /**
  * Does not write any statistics. Can be used to disable statistics output.
  */
-type none extends statistics_writer {}
+type none extends 'statistics-writer' {}
 
 /**
  * Creates a file named '<tt>prediction-by-individual.csv</tt>' containing the
  *   predicted value(s) of each individual for each generation of the EA run:
- * 
+ *
  * <ul>
  *   <li>generation</li>
  *   <li>index of individual</li>
  *   <li>each predicted value of the individual</li>
  * </ul>
  */
-type prediction_per_individual extends statistics_writer {}
-
-/**
- * Creates a file named '<tt'>hypercube-correlation-distances.csv</tt>' with
- *   some weird hypercube info.
- */
-type range_correlated extends statistics_writer {}
\ No newline at end of file
+type 'prediction-per-individual' extends 'statistics-writer' {}
diff --git a/src/core/de.evoal.core.main/src/test/java/de/evoal/core/api/utils/LanguageHelperRegressionTest.java b/src/core/de.evoal.core.main/src/test/java/de/evoal/core/api/utils/LanguageHelperRegressionTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..85c45e0e93abc333cbfc6eff506deb327eaefc9d
--- /dev/null
+++ b/src/core/de.evoal.core.main/src/test/java/de/evoal/core/api/utils/LanguageHelperRegressionTest.java
@@ -0,0 +1,102 @@
+package de.evoal.core.api.utils;
+
+import de.evoal.core.junit.dsl.LanguageHelper;
+import de.evoal.languages.model.dl.*;
+import de.evoal.languages.model.el.DoubleLiteral;
+import de.evoal.languages.model.generator.Configuration;
+import de.evoal.languages.model.generator.Step;
+import de.evoal.languages.model.instance.*;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.Optional;
+
+public class LanguageHelperRegressionTest {
+    private void assertAttributeTypeOfA(final AttributeDefinition attribute) {
+        Assertions.assertNotNull(attribute);
+        Assertions.assertEquals("a", attribute.getName());
+        Assertions.assertTrue(attribute.getType() instanceof ArrayType);
+        final ArrayType typeA = (ArrayType) attribute.getType();
+        Assertions.assertEquals(1, typeA.getElements().size());
+        Assertions.assertTrue(typeA.getElements().get(0) instanceof FloatType);
+    }
+
+    private void assertAttributeTypeOfC(final AttributeDefinition attribute) {
+        Assertions.assertNotNull(attribute);
+        Assertions.assertTrue(attribute.getType() instanceof ArrayType);
+        final ArrayType typeC = (ArrayType) attribute.getType();
+        Assertions.assertEquals(1, typeC.getElements().size());
+        Assertions.assertTrue(typeC.getElements().get(0) instanceof ArrayType);
+        final ArrayType typetypeC = (ArrayType) typeC.getElements().get(0);
+        Assertions.assertEquals(1, typetypeC.getElements().size());
+        Assertions.assertTrue(typetypeC.getElements().get(0) instanceof FloatType);
+    }
+
+    private void assertAttributeTypeOfM(final AttributeDefinition attribute) {
+        Assertions.assertNotNull(attribute);
+        Assertions.assertTrue(attribute.getType() instanceof FloatType);
+    }
+
+    @Test
+    public void testDefinitionLanguageParser() {
+        final DefinitionModel model = LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/regressions/generator.dl");
+
+        Assertions.assertNotNull(model);
+        Assertions.assertNotNull(model.getTypes());
+        Assertions.assertEquals(1, model.getTypes().size());
+
+        final TypeDefinition type = model.getTypes().get(0);
+        Assertions.assertEquals("shekel", type.getName());
+        Assertions.assertNull(type.getSuperType());
+        Assertions.assertEquals(3, type.getAttributes().size());
+
+        final Optional<AttributeDefinition> attributeA = type.getAttributes().stream().map(AttributeDefinition.class::cast).filter(a -> "a".equals(a.getName())).findFirst();
+        final Optional<AttributeDefinition> attributeC = type.getAttributes().stream().map(AttributeDefinition.class::cast).filter(a -> "c".equals(a.getName())).findFirst();
+        final Optional<AttributeDefinition> attributeM = type.getAttributes().stream().map(AttributeDefinition.class::cast).filter(a -> "m".equals(a.getName())).findFirst();
+
+        assertAttributeTypeOfA(attributeA.get());
+        assertAttributeTypeOfC(attributeC.get());
+        assertAttributeTypeOfM(attributeM.get());
+    }
+
+    @Test
+    public void testLoading() {
+        final Configuration configuration = LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/regressions/shekel.generator");
+
+        // fetch step configuration for testee
+        final Step step = configuration.getPipelines().get(0).getSteps().get(0);
+
+        Assertions.assertNotNull(step);
+        Assertions.assertNotNull(step.getInstance());
+        Assertions.assertEquals(3, step.getInstance().getAttributes().size());
+
+        final Attribute attributeA = step.getInstance().findAttribute("a");
+        final Attribute attributeC = step.getInstance().findAttribute("c");
+        final Attribute attributeM = step.getInstance().findAttribute("m");
+
+        assertAttributeTypeOfA(attributeA.getDefinition());
+        assertAttributeTypeOfC(attributeC.getDefinition());
+        assertAttributeTypeOfM(attributeM.getDefinition());
+
+        {
+            Assertions.assertTrue(attributeA.getValue() instanceof Array);
+            final Array array = (Array)attributeA.getValue();
+            Assertions.assertEquals(10, array.getValues().size());
+            Assertions.assertTrue(array.getValues().get(0) instanceof LiteralValue);
+            final LiteralValue literal = (LiteralValue) array.getValues().get(0);
+            Assertions.assertTrue(literal.getLiteral() instanceof DoubleLiteral);
+            Assertions.assertEquals(1.0, literal.getLiteral().getValue());
+        }
+
+        {
+            Assertions.assertTrue(attributeC.getValue() instanceof Array);
+            final Array array = (Array)attributeC.getValue();
+            Assertions.assertEquals(4, array.getValues().size());
+            Assertions.assertTrue(array.getValues().get(0) instanceof Array);
+            final Array array2 = (Array) array.getValues().get(0);
+            Assertions.assertEquals(10, array2.getValues().size());
+        }
+
+    }
+
+}
diff --git a/src/core/de.evoal.core.main/src/test/java/de/evoal/core/api/utils/LanguageHelperUnitTest.java b/src/core/de.evoal.core.main/src/test/java/de/evoal/core/api/utils/LanguageHelperUnitTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..896d04525ac8b69de13611fdc0bcf9002530b165
--- /dev/null
+++ b/src/core/de.evoal.core.main/src/test/java/de/evoal/core/api/utils/LanguageHelperUnitTest.java
@@ -0,0 +1,182 @@
+package de.evoal.core.api.utils;
+
+import de.evoal.languages.model.instance.Instance;
+import de.evoal.languages.model.ol.OptimisationModel;
+import org.junit.jupiter.api.*;
+
+import static de.evoal.core.api.utils.LanguageHelper.*;
+
+public class LanguageHelperUnitTest {
+    @Order(1)
+    @Test
+    public void testLoading() {
+        final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
+        final Instance instance = model.getInstance();
+
+        Assertions.assertNotNull(instance);
+    }
+
+    @Test
+    public void testLookupForNullInstance() {
+        Assertions.assertThrows(IllegalStateException.class, () -> lookup(null, "child"));
+    }
+
+    @Test
+    public void testLookupForNullPath() {
+        final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
+        final Instance instance = model.getInstance();
+
+        Assertions.assertThrows(IllegalArgumentException.class, () -> lookup(instance, null));
+    }
+
+    @Test
+    public void testLookupForEmptyPath() {
+        final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
+        final Instance instance = model.getInstance();
+
+        final Object result = lookup(instance, "");
+
+        Assertions.assertNotNull(result);
+        Assertions.assertTrue(instance == result);
+    }
+
+    @Test
+    public void testLookupForExistingChild() {
+        final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
+        final Instance instance = model.getInstance();
+
+        final Object result = lookup(instance, "child");
+
+        Assertions.assertNotNull(result);
+        Assertions.assertTrue(result instanceof Instance);
+
+        final Instance child = (Instance)result;
+        Assertions.assertEquals("A", child.getDefinition().getName());
+    }
+
+    @Test
+    public void testLookupName() {
+        final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
+        final Instance instance = model.getInstance();
+
+        final Object result = lookup(instance, "name");
+
+        Assertions.assertNotNull(result);
+        Assertions.assertEquals("parent", result);
+   }
+
+    @Test
+    public void testLookupChildOfLiteral() {
+        final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
+        final Instance instance = model.getInstance();
+
+        Assertions.assertThrows(IllegalStateException.class, () -> lookup(instance, "child.string-field.non-existing"));
+    }
+
+    @Test
+    public void testLookupNonExistingChild() {
+        final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
+        final Instance instance = model.getInstance();
+
+        Assertions.assertThrows(IllegalStateException.class, () -> lookup(instance, "child.non-existing"));
+    }
+
+    @Test
+    public void testLookupBooleanField() {
+        final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
+        final Instance instance = model.getInstance();
+
+        final Object result = lookup(instance, "child.boolean-field");
+
+        Assertions.assertNotNull(result);
+        Assertions.assertTrue(result instanceof Boolean);
+        Assertions.assertEquals(true, result);
+    }
+
+    @Test
+    public void testLookupFlotField() {
+        final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
+        final Instance instance = model.getInstance();
+
+        final Object result = lookup(instance, "child.float-field");
+
+        Assertions.assertNotNull(result);
+        Assertions.assertTrue(result instanceof Double);
+        Assertions.assertEquals(1.3, result);
+    }
+
+    @Test
+    public void testLookupIntegerField() {
+        final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
+        final Instance instance = model.getInstance();
+
+        final Object result = lookup(instance, "child.integer-field");
+
+        Assertions.assertNotNull(result);
+        Assertions.assertTrue(result instanceof Integer);
+        Assertions.assertEquals(4, result);
+    }
+
+    @Test
+    public void testLookupStringField() {
+        final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
+        final Instance instance = model.getInstance();
+
+        final Object result = lookup(instance, "child.string-field");
+
+        Assertions.assertNotNull(result);
+        Assertions.assertTrue(result instanceof String);
+        Assertions.assertEquals("FOOBAR", result);
+    }
+
+    @Test
+    public void testLookup1DArrayField() {
+        final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
+        final Instance instance = model.getInstance();
+
+        final Object result = lookup(instance, "child.array-1D-float");
+
+        Assertions.assertNotNull(result);
+        Assertions.assertTrue(result instanceof Object []);
+
+        final Object [] array = (Object[]) result;
+        Assertions.assertEquals(3, array.length);
+        Assertions.assertEquals(4.2, array[0]);
+        Assertions.assertEquals(3.1, array[1]);
+        Assertions.assertEquals(1.0, array[2]);
+    }
+
+    @Test
+    public void testLookup2DArrayField() {
+        final OptimisationModel model = de.evoal.core.junit.dsl.LanguageHelper.loadFromClasspath("de/evoal/core/api/utils/LanguageHelperTest.ol");
+        final Instance instance = model.getInstance();
+
+        final Object result = lookup(instance, "child.array-2D-int");
+
+        Assertions.assertNotNull(result);
+        Assertions.assertTrue(result instanceof Object []);
+
+        final Object [] array = (Object[]) result;
+        Assertions.assertEquals(3, array.length);
+
+        final Object [] array0 = (Object[]) array[0];
+        final Object [] array1 = (Object[]) array[1];
+        final Object [] array2 = (Object[]) array[2];
+
+        Assertions.assertEquals(5, array0.length);
+        Assertions.assertEquals(3, array1.length);
+        Assertions.assertEquals(1, array2.length);
+
+        Assertions.assertEquals(1, array0[0]);
+        Assertions.assertEquals(2, array0[1]);
+        Assertions.assertEquals(3, array0[2]);
+        Assertions.assertEquals(4, array0[3]);
+        Assertions.assertEquals(5, array0[4]);
+
+        Assertions.assertEquals(3, array1[0]);
+        Assertions.assertEquals(2, array1[1]);
+        Assertions.assertEquals(1, array1[2]);
+
+        Assertions.assertEquals(42, array2[0]);
+    }
+}
diff --git a/src/core/de.evoal.core.main/src/test/resources/de/evoal/core/api/utils/regressions/generator.dl b/src/core/de.evoal.core.main/src/test/resources/de/evoal/core/api/utils/regressions/generator.dl
new file mode 100644
index 0000000000000000000000000000000000000000..84b046e8f5db1071b6a220fd41d550b9fa7438f4
--- /dev/null
+++ b/src/core/de.evoal.core.main/src/test/resources/de/evoal/core/api/utils/regressions/generator.dl
@@ -0,0 +1,25 @@
+/**
+ * Shekel's foxholes.
+ *
+ * https://www.sfu.ca/~ssurjano/shekel.html
+ */
+type 'shekel' {
+    /**
+	 * The recommended value for the vector a is (1/m)*{1,2,2,4,4,6,3,7,5,5}.
+	 */
+	'a' : array float;
+
+    /**
+	 * The recommended value for the constant c is {
+     * {4.0, 1.0, 8.0, 6.0, 3.0, 2.0, 5.0, 8.0, 6.0, 7.0},
+     * {4.0, 1.0, 8.0, 6.0, 7.0, 9.0, 3.0, 1.0, 2.0, 3.6},
+     * {4.0, 1.0, 8.0, 6.0, 3.0, 2.0, 5.0, 8.0, 6.0, 7.0},
+     * {4.0, 1.0, 8.0, 6.0, 7.0, 9.0, 3.0, 1.0, 2.0, 3.6}}.
+	 */
+	'c' : array array float;
+
+    /**
+	 * The recommended value for the constant m is 10.
+	 */
+	'm' : float;
+}
diff --git a/src/core/de.evoal.core.main/src/test/resources/de/evoal/core/api/utils/regressions/shekel.generator b/src/core/de.evoal.core.main/src/test/resources/de/evoal/core/api/utils/regressions/shekel.generator
new file mode 100644
index 0000000000000000000000000000000000000000..7486510a4391b0837bc10ad685c2e5bcf8b06b53
--- /dev/null
+++ b/src/core/de.evoal.core.main/src/test/resources/de/evoal/core/api/utils/regressions/shekel.generator
@@ -0,0 +1,20 @@
+use "generator.dl";
+use "test.ddl";
+
+pipeline example [
+     step {
+     	component 'shekel' {
+            'a' := [1.0,2.0,2.0,4.0,4.0,6.0,3.0,7.0,5.0,5.0];
+            'c' := [
+                 	[4.0,1.0,8.0,6.0,3.0,2.0,5.0,8.0,6.0,7.0],
+                    [4.0,1.0,8.0,6.0,7.0,9.0,3.0,1.0,2.0,3.6],
+                    [4.0,1.0,8.0,6.0,3.0,2.0,5.0,8.0,6.0,7.0],
+                    [4.0,1.0,8.0,6.0,7.0,9.0,3.0,1.0,2.0,3.6]
+            ];
+            'm' := 10.0;
+     	}
+
+     	reads [data 'x:0'];
+     	writes [data 'x:1'];
+     }
+]
diff --git a/src/core/de.evoal.core.main/src/test/resources/de/evoal/core/api/utils/regressions/test.ddl b/src/core/de.evoal.core.main/src/test/resources/de/evoal/core/api/utils/regressions/test.ddl
new file mode 100644
index 0000000000000000000000000000000000000000..0a100d6397a8fdf5ddd81abe08ae60078ff8f7aa
--- /dev/null
+++ b/src/core/de.evoal.core.main/src/test/resources/de/evoal/core/api/utils/regressions/test.ddl
@@ -0,0 +1,3 @@
+data:
+	quotient real data 'x:0';
+	quotient real data 'x:1';
\ No newline at end of file
diff --git a/src/core/de.evoal.generator.main/pom.xml b/src/core/de.evoal.generator.main/pom.xml
index 3da6302a8f7d06a42081708b032483e5081fa90d..50a1d2f5ddc31252bf67979dd1cd8b6e51d63bed 100644
--- a/src/core/de.evoal.generator.main/pom.xml
+++ b/src/core/de.evoal.generator.main/pom.xml
@@ -7,6 +7,7 @@
 		<groupId>de.evoal</groupId>
 		<artifactId>core.plugin</artifactId>
 		<version>0.9.0-SNAPSHOT</version>
+		<relativePath>../de.evoal.core.plugin</relativePath>
 	</parent>
 
 	<artifactId>generator.main</artifactId>
diff --git a/src/core/de.evoal.generator.main/src/main/resources/META-INF/specifications/generator/main.dl b/src/core/de.evoal.generator.main/src/main/resources/META-INF/definitions/generator/main.dl
similarity index 95%
rename from src/core/de.evoal.generator.main/src/main/resources/META-INF/specifications/generator/main.dl
rename to src/core/de.evoal.generator.main/src/main/resources/META-INF/definitions/generator/main.dl
index b6d41817d14b645f36e7d0589f2b30077d8f0045..bd4485c14e5d73d400bacb3a3bd7a488b414c6b7 100644
--- a/src/core/de.evoal.generator.main/src/main/resources/META-INF/specifications/generator/main.dl
+++ b/src/core/de.evoal.generator.main/src/main/resources/META-INF/definitions/generator/main.dl
@@ -1,6 +1,6 @@
 /**
- * In mathematical optimization, the Ackley function is a non-convex function
- * used as a performance test problem for optimization algorithms. It was proposed
+ * In mathematical optimisation, the Ackley function is a non-convex function
+ * used as a performance test problem for optimisation algorithms. It was proposed
  * by David Ackley in his 1987 PhD dissertation. ... <a href="https://en.wikipedia.org/wiki/Ackley_function">Wikipedia</a>.
  * 
  * <math display="block">
@@ -121,8 +121,8 @@ type ackley {
 }
 
 /**
- * In mathematical optimization, the Rastrigin function is a non-convex function
- * used as a performance test problem for optimization algorithms. ... <a href="https://en.wikipedia.org/wiki/Rastrigin_function">Wikipedia</a>
+ * In mathematical optimisation, the Rastrigin function is a non-convex function
+ * used as a performance test problem for optimisation algorithms. ... <a href="https://en.wikipedia.org/wiki/Rastrigin_function">Wikipedia</a>
  * 
  * <math display="block">
  *   <mrow>
diff --git a/src/core/de.evoal.releng.parent/pom.xml b/src/core/de.evoal.releng.parent/pom.xml
index ccedc18fbeb757e830cf13136a549e507dd7a5cc..623d5c0de57c2c670f664691db0b81b9ca9a2528 100644
--- a/src/core/de.evoal.releng.parent/pom.xml
+++ b/src/core/de.evoal.releng.parent/pom.xml
@@ -29,6 +29,7 @@
         <module>../de.evoal.core.main</module>
         <module>../de.evoal.core.plugin</module>
 
+        <module>../de.evoal.core.ea</module>
         <module>../de.evoal.core.arff</module>
         <module>../de.evoal.core.junit</module>
 
@@ -266,6 +267,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-source-plugin</artifactId>
+                <version>3.2.1</version>
                 <executions>
                     <execution>
                         <id>attach-sources</id>
diff --git a/src/core/de.evoal.surrogate.api/pom.xml b/src/core/de.evoal.surrogate.api/pom.xml
index 7dcf280c5d184aac9ad5522b50f0b1b2559efba7..878b15814ed58062b3b6ec1b275b27ba1e89ab71 100644
--- a/src/core/de.evoal.surrogate.api/pom.xml
+++ b/src/core/de.evoal.surrogate.api/pom.xml
@@ -7,8 +7,24 @@
 		<groupId>de.evoal</groupId>
 		<artifactId>core.plugin</artifactId>
 		<version>0.9.0-SNAPSHOT</version>
+		<relativePath>../de.evoal.core.plugin</relativePath>
 	</parent>
 
 	<artifactId>surrogate.api</artifactId>
 	<name>EvoAl - Surrogate - API</name>
+
+	<dependencies>
+		<dependency>
+			<groupId>${project.groupId}</groupId>
+			<artifactId>core.ea</artifactId>
+			<version>${project.version}</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>de.evoal</groupId>
+			<artifactId>core.ea</artifactId>
+			<version>0.9.0-SNAPSHOT</version>
+			<scope>compile</scope>
+		</dependency>
+	</dependencies>
 </project>
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/function/SurrogateFunction.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/function/SurrogateFunction.java
index 6f43da8756dd92bb9a6dbe1fe4203a069f16c984..f5bbbd55f71cacca8a6d04e581dc4df49397cf12 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/function/SurrogateFunction.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/api/function/SurrogateFunction.java
@@ -9,7 +9,7 @@ import lombok.NonNull;
 import java.util.List;
 
 /**
- * A surrogate function replaces the actual function used in the optimization
+ * A surrogate function replaces the actual function used in the optimisation
  * if the actual function is too expensive to calculate or even unknown. A
  * surrogate function transforms input properties into output properties
  * according to a known oder learned function.
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/ea/SurrogateFitnessFunction.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/ea/SurrogateFitnessFunction.java
index 84f3c0837a45b4010d31ec64b11e2105db713339..f820ef8286feb52a9560989749dc352f35bc5529 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/ea/SurrogateFitnessFunction.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/ea/SurrogateFitnessFunction.java
@@ -1,8 +1,7 @@
 package de.evoal.surrogate.main.ea;
 
-import de.evoal.core.api.ea.fitness.FitnessFunction;
+import de.evoal.core.api.optimisation.OptimisationFunction;
 import de.evoal.core.api.properties.Properties;
-import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.languages.model.instance.Instance;
 import de.evoal.surrogate.api.function.SurrogateFunction;
 
@@ -12,7 +11,7 @@ import javax.inject.Named;
 
 @Dependent
 @Named("surrogate")
-public class SurrogateFitnessFunction implements FitnessFunction {
+public class SurrogateFitnessFunction implements OptimisationFunction {
 
     @Inject
     private SurrogateFunction function;
@@ -23,7 +22,7 @@ public class SurrogateFitnessFunction implements FitnessFunction {
     }
 
     @Override
-    public FitnessFunction init(final Instance config) {
+    public OptimisationFunction init(final Instance config) {
         return this;
     }
 }
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/ea/TrainingInitialPopulation.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/ea/TrainingInitialPopulation.java
index 2064686ef965c31936a26c96f34d0bf40fa3dd0c..4e44046daf9f9a70fca8cfcd5e80f224106e5155 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/ea/TrainingInitialPopulation.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/ea/TrainingInitialPopulation.java
@@ -3,12 +3,12 @@ package de.evoal.surrogate.main.ea;
 import de.evoal.core.api.board.Blackboard;
 import de.evoal.core.api.board.CoreBlackboardEntries;
 import de.evoal.core.api.cdi.ConfigurationValue;
-import de.evoal.core.api.ea.codec.CustomCodec;
-import de.evoal.core.api.ea.initial.InitialPopulation;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.core.api.properties.stream.FileBasedPropertiesStreamSupplier;
 import de.evoal.core.api.properties.stream.PropertiesStreamSupplier;
+import de.evoal.core.ea.api.codec.CustomCodec;
+import de.evoal.core.ea.api.initial.InitialPopulation;
 import de.evoal.languages.model.instance.Instance;
 import de.evoal.surrogate.api.SurrogateBlackboardEntries;
 import io.jenetics.Gene;
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/ea/TrainingProducer.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/ea/TrainingProducer.java
index cbbbdef6c4999e582cfb8cdc609fc90ca91116e0..a0f03db9db57453055483ba5bc9245e7cef373c4 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/ea/TrainingProducer.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/ea/TrainingProducer.java
@@ -3,9 +3,9 @@ package de.evoal.surrogate.main.ea;
 import de.evoal.core.api.board.CoreBlackboardEntries;
 import de.evoal.core.api.cdi.BeanFactory;
 import de.evoal.core.api.cdi.ConfigurationValue;
-import de.evoal.core.api.ea.initial.InitialPopulation;
+import de.evoal.core.ea.api.constraints.strategies.RepairStrategy;
+import de.evoal.core.ea.api.initial.InitialPopulation;
 import de.evoal.languages.model.instance.Instance;
-import de.evoal.core.api.ea.constraints.strategies.RepairStrategy;
 
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.context.Dependent;
@@ -21,7 +21,7 @@ public class TrainingProducer {
     @Produces
     @Dependent
     @Named("training")
-    public InitialPopulation create(@ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.initialization") Instance initialization) {
+    public InitialPopulation create(@ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.initialisation") Instance initialization) {
         final TrainingInitialPopulation population = new TrainingInitialPopulation();
         BeanFactory.injectFields(population);
         population.init();
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/ea/TrainingRepairStrategy.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/ea/TrainingRepairStrategy.java
index 545eab0a60366f380a9f1f7014ad4eaec4678d48..b2f005aa5a3f6c439ba45e1f3d226a9e673a7550 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/ea/TrainingRepairStrategy.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/ea/TrainingRepairStrategy.java
@@ -1,12 +1,12 @@
 package de.evoal.surrogate.main.ea;
 
 import de.evoal.core.api.board.Blackboard;
-import de.evoal.core.api.ea.codec.CustomCodec;
-import de.evoal.core.api.ea.constraints.strategies.RepairStrategy;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.core.api.properties.stream.FileBasedPropertiesStreamSupplier;
 import de.evoal.core.api.properties.stream.PropertiesStreamSupplier;
+import de.evoal.core.ea.api.codec.CustomCodec;
+import de.evoal.core.ea.api.constraints.strategies.RepairStrategy;
 import de.evoal.languages.model.instance.Instance;
 import de.evoal.surrogate.api.SurrogateBlackboardEntries;
 import io.jenetics.Gene;
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/gof/rmse/RMSECalculator.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/gof/rmse/RMSECalculator.java
index 420d60636fbaefbd8cfe0ac656c745639af72411..d99fe097e0eebcbe0574819bcc1805a4142d66d4 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/gof/rmse/RMSECalculator.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/gof/rmse/RMSECalculator.java
@@ -41,7 +41,7 @@ public class RMSECalculator implements SurrogateInformationCalculator {
 	private SurrogateFunction function;
 
 	/**
-	 * Supplier for the trainings data.
+	 * Supplier for the training data.
 	 */
 	private PropertiesStreamSupplier trainingData;
 
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/gof/rmse/RRSECalculator.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/gof/rmse/RRSECalculator.java
index 9df7d648a780083e74121413d9bf98c8eddadeb7..aba0ded2139f6aea61a365479d2d416a873a8d09 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/gof/rmse/RRSECalculator.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/gof/rmse/RRSECalculator.java
@@ -35,7 +35,7 @@ public class RRSECalculator implements SurrogateInformationCalculator {
 	private SurrogateFunction function;
 
 	/**
-	 * Supplier for the trainings data.
+	 * Supplier for the training data.
 	 */
 	private PropertiesStreamSupplier trainingData;
 
@@ -58,7 +58,6 @@ public class RRSECalculator implements SurrogateInformationCalculator {
 					final Properties actual = function.apply(source);
 
 					for(int i = 0; i < expected.size(); ++i) {
-						System.err.println("  " + expected.getAsDouble(i) + " -- " + actual.getAsDouble(i));
 						data.get(i).add(Math.pow((expected.getAsDouble(i) - actual.getAsDouble(i)) / expected.getAsDouble(i), 2.0));
 					}
 				});
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/constraint/ConstraintStatistics.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/constraint/ConstraintStatistics.java
index cc8621a000613311e7ca94f06f951c8973e04a9e..e0d7afff7d6cce87d43344ee647c0c936dd8de34 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/constraint/ConstraintStatistics.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/constraint/ConstraintStatistics.java
@@ -1,18 +1,18 @@
 package de.evoal.surrogate.main.statistics.constraint;
 
-import de.evoal.core.api.ea.constraints.calculation.CalculationFactory;
-import de.evoal.core.api.ea.constraints.calculation.CalculationStrategy;
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
 import de.evoal.core.api.statistics.*;
+import de.evoal.core.api.statistics.io.Writer;
+import de.evoal.core.api.statistics.io.WriterException;
+import de.evoal.core.api.statistics.io.WriterStrategy;
+import de.evoal.core.api.statistics.writer.Column;
+import de.evoal.core.api.statistics.writer.ColumnType;
+import de.evoal.core.api.statistics.writer.StatisticsWriter;
+import de.evoal.core.ea.api.constraints.calculation.CalculationFactory;
+import de.evoal.core.ea.api.constraints.calculation.CalculationStrategy;
+import de.evoal.core.ea.api.constraints.model.ConstraintResult;
+import de.evoal.core.ea.api.constraints.model.Constraints;
+import de.evoal.core.ea.api.constraints.strategies.CalculationResult;
 import de.evoal.languages.model.instance.Instance;
-import de.evoal.core.api.ea.codec.CustomCodec;
-import de.evoal.core.api.ea.constraints.model.ConstraintResult;
-import de.evoal.core.api.ea.constraints.model.Constraints;
-import de.evoal.core.api.ea.constraints.strategies.CalculationResult;
-import de.evoal.core.api.properties.Properties;
-import io.jenetics.Phenotype;
-import io.jenetics.engine.EvolutionResult;
-import io.jenetics.util.ISeq;
 import javax.annotation.PostConstruct;
 import javax.enterprise.context.Dependent;
 import lombok.SneakyThrows;
@@ -24,6 +24,7 @@ import java.util.ArrayList;
 import java.util.DoubleSummaryStatistics;
 import java.util.List;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * Small helper class for collecting and writing the generation-based statistics.
@@ -42,15 +43,8 @@ public class ConstraintStatistics implements StatisticsWriter {
     @Inject
     private Constraints constraints;
 
-    @Inject
-    private CustomCodec codec;
-
     private CalculationStrategy[] calculators;
 
-    private long endTime;
-
-    private long startTime;
-
     @Inject
     private WriterStrategy strategy;
 
@@ -58,8 +52,6 @@ public class ConstraintStatistics implements StatisticsWriter {
 
     @PostConstruct @SneakyThrows(WriterException.class)
     private void init() {
-        startTime = System.currentTimeMillis();
-
         createColumns();
 
         writer = strategy.create("constraint-statistics", columns);
@@ -82,7 +74,7 @@ public class ConstraintStatistics implements StatisticsWriter {
         }
     }
 
-    private Object[] toData(final long generation, final ISeq<Phenotype<?, FitnessValue>> population) {
+    private Object[] toData(final int generation, final Stream<Candidate> candidates) {
         final Object [] data = new Object[1 + constraints.getConstraints().size() * NUMBER_OF_STATISTICS_PER_CONSTRAINT];
 
         data[0] = generation;
@@ -91,10 +83,9 @@ public class ConstraintStatistics implements StatisticsWriter {
             final CalculationStrategy strategy = calculators[index];
 
             final List<CalculationResult> calculationResults =
-                population.stream()
-                        .map(Phenotype::genotype)
-                        .map(g -> (Properties)codec.decode(g))
-                        // TODO .map(strategy::calculate)
+                candidates
+                        .map(Candidate::searchSpaceRepresentation)
+// TODO                        .map(strategy::calculate)
                         .map(CalculationResult.class::cast)
                         .collect(Collectors.toList());
 
@@ -121,11 +112,14 @@ public class ConstraintStatistics implements StatisticsWriter {
         return data;
     }
 
-    @SneakyThrows(WriterException.class)
-    public void add(final EvolutionResult<?, FitnessValue> evolutionResult) {
-        final ISeq<Phenotype<?, FitnessValue>> population = (ISeq<Phenotype<?, FitnessValue>>)(Object)evolutionResult.population();
-
-        writer.addRecord(toData(evolutionResult.generation(), population));
+    @Override
+    public void add(final IterationResult result) {
+            try {
+                final Object [] data = toData(result.iteration(), result.candidates());
+                writer.addRecord(data);
+            } catch (final WriterException e) {
+                log.error("Failed to add record.", e);
+            }
     }
 
     @Override
@@ -133,8 +127,8 @@ public class ConstraintStatistics implements StatisticsWriter {
         return this;
     }
 
+    @Override
     public void write() {
-        endTime = System.currentTimeMillis();
         try {
             strategy.close(writer);
         } catch (final WriterException e) {
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/correlated/GenerationStatisticsWriter.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/correlated/GenerationStatisticsWriter.java
index c141bda6165947df9c5c69ad9a1c545eec1ca745..f5ab9a93086481fa0efea14d990e262f63e1d571 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/correlated/GenerationStatisticsWriter.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/correlated/GenerationStatisticsWriter.java
@@ -2,17 +2,19 @@ package de.evoal.surrogate.main.statistics.correlated;
 
 import de.evoal.core.api.board.CoreBlackboardEntries;
 import de.evoal.core.api.cdi.ConfigurationValue;
+import de.evoal.core.api.optimisation.OptimisationValue;
 import de.evoal.core.api.statistics.*;
+import de.evoal.core.api.statistics.io.Writer;
+import de.evoal.core.api.statistics.io.WriterException;
+import de.evoal.core.api.statistics.io.WriterStrategy;
+import de.evoal.core.api.statistics.writer.Column;
+import de.evoal.core.api.statistics.writer.ColumnType;
+import de.evoal.core.api.statistics.writer.StatisticsWriter;
 import de.evoal.core.api.utils.LanguageHelper;
 import de.evoal.languages.model.instance.Instance;
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
-import de.evoal.core.api.ea.codec.CustomCodec;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.surrogate.api.training.TrainingDataManager;
-import io.jenetics.Genotype;
-import io.jenetics.engine.EvolutionResult;
-import io.jenetics.util.ISeq;
 import javax.annotation.PostConstruct;
 import javax.enterprise.context.Dependent;
 import lombok.extern.slf4j.Slf4j;
@@ -25,6 +27,7 @@ import javax.inject.Provider;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -46,15 +49,10 @@ public class GenerationStatisticsWriter implements StatisticsWriter {
     // TODO @Inject @Named("function-names")
     private List<String> functionNames;
 
-    /**
-     * Encoding for converting between ea and domain.
-     */
-    @Inject
-    private CustomCodec encoding;
 
     private long startTime;
 
-    private EvolutionResult<?, FitnessValue> generationWithBestIndividual;
+    private IterationResult generationWithBestIndividual;
     private long endTime;
 
     @Inject
@@ -169,16 +167,17 @@ public class GenerationStatisticsWriter implements StatisticsWriter {
     }
 
     private Matrix createBestGenerationMatrix() {
-        final ISeq<Genotype<?>> genotypes = (ISeq<Genotype<?>>)(Object)generationWithBestIndividual.genotypes();
+        final List<Candidate> candidates = generationWithBestIndividual.candidates().collect(Collectors.toList());
 
         final int dimensions = sourceSpec.size();
-        final int size = genotypes.size();
+        final Optional<Integer> optSize = generationWithBestIndividual.candidateCount();
+        final int size = optSize.orElse(candidates.size());
 
         final Matrix result = new Matrix(dimensions, size);
 
         for(int i = 0; i < size; ++i) {
-            final Genotype<?> genotype = genotypes.get(i);
-            final Properties individual = (Properties) encoding.decode(genotype);
+            final Candidate candidate = candidates.get(i);
+            final Properties individual = candidate.searchSpaceRepresentation();
 
             final Object [] data = individual.getValues();
 
@@ -245,17 +244,15 @@ public class GenerationStatisticsWriter implements StatisticsWriter {
 
         final Object [] data = new Object[3 + functionNames.size() + (int)Math.pow(sourceSpec.size(), 2) + 2 + (int)Math.pow(sourceSpec.size(), 2) + 2 + 1];
 
-        final Genotype<?> genotype = generationWithBestIndividual.bestPhenotype().genotype();
-        final Properties individual = (Properties) encoding.decode(genotype);
+        final Candidate bestCandidate = generationWithBestIndividual.bestCandidate();
+        final Properties candidate = bestCandidate.searchSpaceRepresentation();
 
-        data[0] = generationWithBestIndividual.generation();
-        data[1] = Arrays.toString(individual.getValues());
-        data[2] = generationWithBestIndividual.bestPhenotype().age(generationWithBestIndividual.generation());
-
-        final Properties candidate = (Properties) encoding.decode(generationWithBestIndividual.bestPhenotype().genotype());
+        data[0] = generationWithBestIndividual.iteration();
+        data[1] = Arrays.toString(candidate.getValues());
+        data[2] = bestCandidate.age();
 
         for(int i = 0; i < functions.size(); ++i) {
-            final FitnessValue fitness = (FitnessValue) functions.get(i).apply(candidate);
+            final OptimisationValue fitness = (OptimisationValue) functions.get(i).apply(candidate);
             data[3 + i] = fitness;
             throw new IllegalArgumentException("fix me");
         }
@@ -286,15 +283,16 @@ public class GenerationStatisticsWriter implements StatisticsWriter {
         throw new IllegalStateException("We have to change the actual fitness type by looking up the correct definition.");
     }
 
-    public void add(final EvolutionResult<?, FitnessValue> evolutionResult) {
-        updateBestGeneration(evolutionResult);
+    @Override
+    public void add(final IterationResult result) {
+        updateBestGeneration(result);
     }
 
-    private void updateBestGeneration(final EvolutionResult<?, FitnessValue> generation) {
+    private void updateBestGeneration(final IterationResult result) {
         if(generationWithBestIndividual == null) {
-            generationWithBestIndividual = generation;
-        } else if(generationWithBestIndividual.bestFitness().compareTo(generation.bestFitness()) <= 0) {
-            generationWithBestIndividual = generation;
+            generationWithBestIndividual = result;
+        } else if(generationWithBestIndividual.bestCandidate().value().compareTo(result.bestCandidate().value()) <= 0) {
+            generationWithBestIndividual = result;
         }
     }
 
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/ranged/GenerationStatisticsWriter.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/ranged/GenerationStatisticsWriter.java
index 9a697ea6fa38c1c76589c7a471f0b128025b65e6..38a72042fe9008369bb8812f117b3488541947c6 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/ranged/GenerationStatisticsWriter.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/ranged/GenerationStatisticsWriter.java
@@ -1,19 +1,20 @@
 package de.evoal.surrogate.main.statistics.ranged;
 
-import de.evoal.core.api.ea.correlations.Range;
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
 import de.evoal.core.api.properties.PropertiesSpecification;
 import de.evoal.core.api.properties.PropertySpecification;
 import de.evoal.core.api.properties.info.PropertiesBoundaries;
 import de.evoal.core.api.statistics.*;
-import de.evoal.core.api.ea.codec.CustomCodec;
-import de.evoal.core.api.properties.Properties;
-import de.evoal.core.api.ea.correlations.Correlation;
-import de.evoal.core.api.ea.correlations.Correlations;
-import de.evoal.core.api.ea.correlations.RangedCorrelation;
+import de.evoal.core.api.statistics.io.Writer;
+import de.evoal.core.api.statistics.io.WriterException;
+import de.evoal.core.api.statistics.io.WriterStrategy;
+import de.evoal.core.api.statistics.writer.Column;
+import de.evoal.core.api.statistics.writer.ColumnType;
+import de.evoal.core.api.statistics.writer.StatisticsWriter;
+import de.evoal.core.ea.api.correlations.Correlation;
+import de.evoal.core.ea.api.correlations.Correlations;
+import de.evoal.core.ea.api.correlations.RangedCorrelation;
 import de.evoal.languages.model.instance.Instance;
-import io.jenetics.Genotype;
-import io.jenetics.engine.EvolutionResult;
+
 import java.util.*;
 import javax.annotation.PostConstruct;
 import javax.enterprise.context.Dependent;
@@ -30,12 +31,6 @@ import lombok.extern.slf4j.Slf4j;
 @Named("range-correlated")
 @Dependent
 public class GenerationStatisticsWriter implements StatisticsWriter {
-    /**
-     * Encoding for converting between ea and domain.
-     */
-    @Inject
-    private CustomCodec encoding;
-
     @Inject
     private PropertiesBoundaries limits;
 
@@ -96,19 +91,19 @@ public class GenerationStatisticsWriter implements StatisticsWriter {
     }
 
     @Override
-    public void add(final EvolutionResult<?, FitnessValue> evolutionResult) {
-        if(evolutionResult.generation() == 1) {
-            initialGenerationCubes = fillHypercubes(evolutionResult);
+    public void add(final IterationResult result) {
+        if(initialGenerationCubes == null) {
+            initialGenerationCubes = fillHypercubes(result);
         }
 
-        final List<Hypercube> currentCubes = fillHypercubes(evolutionResult);
+        final List<Hypercube> currentCubes = fillHypercubes(result);
     	double[] arrayOfDistances = new double[initialGenerationCubes.size()];
     	for(int i=0; i< arrayOfDistances.length; i++) {
    			arrayOfDistances[i] = currentCubes.get(i).computeSquaredDistanceToCovarianceMatrix(initialGenerationCubes.get(i));
     	}
 
     	Object[] data = new Object[1+ arrayOfDistances.length + 1];
-    	data[0] = evolutionResult.generation();
+    	data[0] = result.iteration();
     	double sum = 0.0;
     	for(int i = 0; i < arrayOfDistances.length; i++) {
     		data[i+1] = arrayOfDistances[i];
@@ -118,23 +113,23 @@ public class GenerationStatisticsWriter implements StatisticsWriter {
     	try {
 			writer.addRecord(data);
 		} catch (Exception e) {
-			log.error("The csv printing didn't work in generation {}", evolutionResult.generation(), e);
+			log.error("The csv printing didn't work in generation {}", result.iteration(), e);
 		}
     }
     
-    private List<Hypercube> fillHypercubes(final EvolutionResult<?, FitnessValue> evolutionResult){
-    	List<Hypercube> currentGeneration = new ArrayList<>();
+    private List<Hypercube> fillHypercubes(final IterationResult result){
+    	final List<Hypercube> currentCandidates = new ArrayList<>();
+
     	for(int j = 0; j < hypercubeDefinitions.size(); j++) {
-    		Hypercube hypercube = new Hypercube(hypercubeDefinitions.get(j));
-    		for(int i= 0; i < evolutionResult.population().asList().size(); i++) {
-                final Genotype<?> genotype = evolutionResult.population().asList().get(i).genotype();
-                final Properties domainValues = (Properties) encoding.decode(genotype);
-
-                hypercube.addDataPoint(domainValues);
-        	}
-    		currentGeneration.add(hypercube); 
+    		final Hypercube hypercube = new Hypercube(hypercubeDefinitions.get(j));
+
+            result.candidates()
+                    .map(Candidate::searchSpaceRepresentation)
+                    .forEach(hypercube::addDataPoint);
+
+    		currentCandidates.add(hypercube);
     	}
-    	return currentGeneration;
+    	return currentCandidates;
     }
 
     public void write() {
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/ranged/Hypercube.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/ranged/Hypercube.java
index 7512c25f004f2955d061ce6867e74d90a103ea2d..5882138f757799903465b2e4547d23657c29b73a 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/ranged/Hypercube.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/ranged/Hypercube.java
@@ -5,7 +5,7 @@ import java.util.List;
 
 import de.evoal.core.api.properties.Properties;
 
-import de.evoal.core.api.ea.correlations.Range;
+import de.evoal.core.ea.api.correlations.Range;
 import smile.math.matrix.Matrix;
 
 public class Hypercube {
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/ranged/HypercubeBuilder.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/ranged/HypercubeBuilder.java
index 183b3465c6e2a61000a81813a3a4fec5db50b19f..93abed2a688b54250a307f94ef21f5201a4b25da 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/ranged/HypercubeBuilder.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/ranged/HypercubeBuilder.java
@@ -1,6 +1,6 @@
 package de.evoal.surrogate.main.statistics.ranged;
 
-import de.evoal.core.api.ea.correlations.Range;
+import de.evoal.core.ea.api.correlations.Range;
 
 import java.util.LinkedList;
 import java.util.List;
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/ranged/PropertyRange.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/ranged/PropertyRange.java
index 69410c582899e8680d7e2f568d1d59862a52afda..8b117e3573fc8cc22f9403a8d41ce96b0c3c861c 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/ranged/PropertyRange.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/ranged/PropertyRange.java
@@ -1,6 +1,7 @@
 package de.evoal.surrogate.main.statistics.ranged;
 
-import de.evoal.core.api.ea.correlations.Range;
+
+import de.evoal.core.ea.api.correlations.Range;
 
 public class PropertyRange {
 	private final int indexOfChromosome;
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/surrogate/SurrogateStatistics.java b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/surrogate/SurrogateStatistics.java
index fa81cf87e7c0ca140e1f7382144faac0a74dc49d..f1d92d06170f538c6113324b48d0226aff0a1c89 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/surrogate/SurrogateStatistics.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/de/evoal/surrogate/main/statistics/surrogate/SurrogateStatistics.java
@@ -3,23 +3,19 @@ package de.evoal.surrogate.main.statistics.surrogate;
 import java.util.LinkedList;
 import java.util.List;
 
-import javax.annotation.PostConstruct;
 import javax.enterprise.context.Dependent;
 import javax.inject.Inject;
 import javax.inject.Named;
 
 import de.evoal.core.api.statistics.*;
-import de.evoal.core.api.ea.codec.CustomCodec;
-import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
 import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertiesSpecification;
-import de.evoal.languages.model.instance.Instance;
+import de.evoal.core.api.statistics.io.Writer;
+import de.evoal.core.api.statistics.io.WriterException;
+import de.evoal.core.api.statistics.writer.AbstractCandidateStatisticsWriter;
+import de.evoal.core.api.statistics.writer.Column;
+import de.evoal.core.api.statistics.writer.ColumnType;
 import de.evoal.surrogate.api.function.SurrogateFunction;
-import io.jenetics.Genotype;
-import io.jenetics.Phenotype;
-import io.jenetics.engine.EvolutionResult;
-import io.jenetics.util.ISeq;
-import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 
 /**
@@ -28,40 +24,19 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 @Named("prediction-per-individual")
 @Dependent
-public class SurrogateStatistics implements StatisticsWriter {
+public class SurrogateStatistics extends AbstractCandidateStatisticsWriter {
     /**
      * The predictive function used.
      */
     //@Inject
     protected SurrogateFunction predictive;
 
-    /**
-     * Encoding for converting between ea and domain.
-     */
-    @Inject
-    private CustomCodec encoding;
-
     @Inject
     @Named("surrogate-target-properties-specification")
     private PropertiesSpecification targetSpecification;
 
-    @Inject
-    private WriterStrategy strategy;
-
-    private Writer writer;
-
-    @PostConstruct
-    @SneakyThrows(WriterException.class)
-    private void init() {
-        createWriter();
-    }
-
     @Override
-    public StatisticsWriter init(Instance configuration) {
-        return this;
-    }
-
-    private void createWriter() throws WriterException {
+    protected Writer createWriter() throws WriterException {
         final List<Column> columns = new LinkedList<>();
 
         columns.add(new Column("generation", ColumnType.Integer));
@@ -71,18 +46,18 @@ public class SurrogateStatistics implements StatisticsWriter {
             columns.add(new Column(targetSpecification.getProperties().get(i).name(), ColumnType.Double));
         }
 
-        writer = strategy.create("prediction-by-individual", columns);
+        return strategy.create("prediction-by-individual", columns);
     }
 
-    private Object[] dataOfPhenotype(final int index, final long generation, Phenotype<?, FitnessValue> phenotype) {
+    @Override
+    protected Object[] toData(final int index, final int iteration, final Candidate candidate) {
         final Object [] data = new Object[2 + targetSpecification.size()];
 
-        data[0] = generation;
+        data[0] = iteration;
         data[1] = index;
 
-        final Genotype<?> genotype = phenotype.genotype();
-        final Properties individual = (Properties) encoding.decode(genotype);
-        final Properties predicted = predictive.apply(individual);
+        final Properties representation = candidate.searchSpaceRepresentation();
+        final Properties predicted = predictive.apply(representation);
 
         for(int i = 0; i < predicted.size(); ++i) {
             data[2 + i] = predicted.getValues()[i];
@@ -90,21 +65,4 @@ public class SurrogateStatistics implements StatisticsWriter {
 
         return data;
     }
-
-    @SneakyThrows(WriterException.class)
-    public void add(final EvolutionResult<?, FitnessValue> evolutionResult) {
-        final ISeq<Phenotype<?, FitnessValue>> population = (ISeq<Phenotype<?, FitnessValue>>)(Object)evolutionResult.population();
-
-        for(int i = 0; i < population.size(); ++i) {
-            writer.addRecord(dataOfPhenotype(i, evolutionResult.generation(), population.get(i)));
-        }
-    }
-
-    public void write() {
-        try {
-            strategy.close(writer);
-        } catch (final WriterException e) {
-            log.error("Failed to write statistics:", e);
-        }
-    }
 }
diff --git a/src/core/de.evoal.surrogate.api/src/main/java/module-info.java b/src/core/de.evoal.surrogate.api/src/main/java/module-info.java
index a4a1a87c8f3d195a67618b96ab07d418e6103743..e93c2f8acb31c58b8968cd1465b6bb2d416eff2a 100644
--- a/src/core/de.evoal.surrogate.api/src/main/java/module-info.java
+++ b/src/core/de.evoal.surrogate.api/src/main/java/module-info.java
@@ -27,6 +27,7 @@ module de.evoal.surrogate.api {
     requires de.evoal.languages.model.el.dsl;
     requires de.evoal.languages.model.mll.dsl;
     requires de.evoal.languages.model.instance;
+    requires de.evoal.core.ea;
 
     exports de.evoal.surrogate.api;
     exports de.evoal.surrogate.api.function;
diff --git a/src/core/de.evoal.surrogate.neural/src/main/java/de/evoal/surrogates/neural/NeuralNetworkConfigurator.java b/src/core/de.evoal.surrogate.neural/src/main/java/de/evoal/surrogates/neural/NeuralNetworkConfigurator.java
index d3da4e47e1ddd4e0c13a2133021dd394e635c9e9..129262ad00bab094085b2bfb782ec6c5466c4c04 100644
--- a/src/core/de.evoal.surrogate.neural/src/main/java/de/evoal/surrogates/neural/NeuralNetworkConfigurator.java
+++ b/src/core/de.evoal.surrogate.neural/src/main/java/de/evoal/surrogates/neural/NeuralNetworkConfigurator.java
@@ -94,7 +94,7 @@ public final class NeuralNetworkConfigurator {
     }
 
     private OptimizationAlgorithm optimizationAlgorithm() {
-        final String name = parameter("optimization-algorithm");
+        final String name = parameter("optimisation-algorithm");
 
         return OptimizationAlgorithm.valueOf(name);
     }
diff --git a/src/core/de.evoal.surrogate.simple/pom.xml b/src/core/de.evoal.surrogate.simple/pom.xml
index d8205863ab2a67ea59396973f7cacffc3b77cfe7..a70cdc07f3378c85857a70bbdac924a9f283463d 100644
--- a/src/core/de.evoal.surrogate.simple/pom.xml
+++ b/src/core/de.evoal.surrogate.simple/pom.xml
@@ -7,6 +7,7 @@
 		<groupId>de.evoal</groupId>
 		<artifactId>core.plugin</artifactId>
 		<version>0.9.0-SNAPSHOT</version>
+		<relativePath>../de.evoal.core.plugin</relativePath>
 	</parent>
 
 	<artifactId>surrogate.simple</artifactId>
diff --git a/src/core/de.evoal.surrogate.svr/pom.xml b/src/core/de.evoal.surrogate.svr/pom.xml
index c4b6fef8f9c697654f90fb7c9a13e5615de5db6c..208fea6df3fc53ce953e6aa5954d528cd9f584fe 100644
--- a/src/core/de.evoal.surrogate.svr/pom.xml
+++ b/src/core/de.evoal.surrogate.svr/pom.xml
@@ -7,6 +7,7 @@
 		<groupId>de.evoal</groupId>
 		<artifactId>core.plugin</artifactId>
 		<version>0.9.0-SNAPSHOT</version>
+		<relativePath>../de.evoal.core.plugin</relativePath>
 	</parent>
 
 	<artifactId>surrogate.svr</artifactId>