From 642a3640bc5bd950c6e9f463d823644022c7c520 Mon Sep 17 00:00:00 2001
From: "Bernhard J. Berger" <bernhard.berger@uni-bremen.de>
Date: Thu, 16 Mar 2023 21:34:41 +0100
Subject: [PATCH] Moved all code that is specific to evolutionary algorithms to
 core.ea. core.main keeps all the stuff that is optimiser
 algorithm-independent. We still have to move some more content back to
 core.main while we implement new optimisers. #19 #15

Fixed regressions with domain-specific language parsing #18. This bug was introduced by d74325cbe24bc9b8010c241906d4b79c6bc3dab6.
---
 .../de.evoal.approximative.density/pom.xml    |   1 +
 .../ea/fitness/DensityBasedFitness.java       |   8 +-
 .../src/main/java/module-info.java            |   1 +
 src/core/de.evoal.core.arff/pom.xml           |   1 +
 src/core/de.evoal.core.ea/pom.xml             |  78 ++++
 .../de/evoal/core/ea/api}/cdi/Fitness.java    |   2 +-
 .../evoal/core/ea/api}/codec/CustomCodec.java |   2 +-
 .../calculation/CalculationFactory.java       |  14 +-
 .../calculation/CalculationStrategy.java      |   6 +-
 .../ea/api}/constraints/model/Constraint.java |   2 +-
 .../constraints/model/ConstraintResult.java   |   2 +-
 .../constraints/model/ConstraintType.java     |   2 +-
 .../api}/constraints/model/Constraints.java   |   2 +-
 .../constraints/model/DataConstraints.java    |   2 +-
 .../api}/constraints/model/package-info.java  |   2 +-
 .../ea/api}/constraints/package-info.java     |   2 +-
 .../strategies/CalculationResult.java         |   4 +-
 .../strategies/HandlingStrategy.java          |   2 +-
 .../strategies/RepairStrategy.java            |   2 +-
 .../fitness/MalusForFitnessStrategy.java      |   8 +-
 .../strategies/fitness/MalusFunction.java     |   2 +-
 .../fitness/internal/ChainFunction.java       |   4 +-
 .../fitness/internal/IdentityFunction.java    |   4 +-
 .../fitness/internal/package-info.java        |   2 +-
 .../strategies/fitness/package-info.java      |   2 +-
 .../ea/api}/correlations/Correlation.java     |   4 +-
 .../ea/api}/correlations/Correlations.java    |   4 +-
 .../core/ea/api}/correlations/Range.java      |   2 +-
 .../api}/correlations/RangedCorrelation.java  |   2 +-
 .../ea/api}/initial/InitialPopulation.java    |   4 +-
 .../de/evoal/core/ea/api}/package-info.java   |   2 +-
 .../core/ea/main}/alterer/AltererFactory.java |  68 +--
 .../crossover/CorrelationCrossover.java       |   6 +-
 .../CorrelationCrossoverMemento.java          |   4 +-
 .../crossover/LineCorrelationCrossover.java   |   4 +-
 .../LineCorrelationCrossoverMemento.java      |   4 +-
 .../MultiPointCorrelationCrossover.java       |   4 +-
 ...MultiPointCorrelationCrossoverMemento.java |   4 +-
 .../PartiallyMatchedCorrelationCrossover.java |   4 +-
 ...llyMatchedCorrelationCrossoverMemento.java |   4 +-
 .../SinglePointCorrelationCrossover.java      |   4 +-
 ...inglePointCorrelationCrossoverMemento.java |   4 +-
 .../UniformCorrelationCrossover.java          |   4 +-
 .../UniformCorrelationCrossoverMemento.java   |   4 +-
 .../internal/AbstractCorrelationAlterer.java  |   2 +-
 .../internal/CorrelationCombineAlterer.java   |   6 +-
 .../internal/CorrelationRecombinator.java     |   2 +-
 .../internal/MeanCorrelationAlterer.java      |   4 +-
 .../alterer/mutator/CorrelationMutator.java   |   8 +-
 .../mutator/CorrelationMutatorFactory.java    |   4 +-
 .../mutator/CorrelationMutatorMemento.java    |   4 +-
 .../mutator/GaussianCorrelationMutator.java   |   6 +-
 .../GaussianCorrelationMutatorMemento.java    |   4 +-
 .../SingleBitFlipCorrelationMutator.java      |   4 +-
 ...ingleBitFlipCorrelationMutatorMemento.java |   4 +-
 .../alterer/mutator/SingleBitFlipMutator.java |   2 +-
 .../mutator/SwapCorrelationMutator.java       |   4 +-
 .../SwapCorrelationMutatorMemento.java        |   4 +-
 .../core/ea/main}/codec/DynamicCodec.java     |  18 +-
 .../ea/main}/codec/DynamicCodecProducer.java  |   5 +-
 .../chromosome/DynamicBitChromosome.java      |  11 +-
 .../DynamicBoundedDoubleChromosome.java       |   2 +-
 .../DynamicBoundedIntegerChromosome.java      |   3 +-
 .../codec/chromosome/DynamicChromosome.java   |   2 +-
 .../chromosome/DynamicChromosomeFactory.java  |   2 +-
 .../chromosome/DynamicDoubleChromosome.java   |   6 +-
 .../chromosome/DynamicGrayChromosome.java     |  12 +-
 .../chromosome/DynamicIntegerChromosome.java  |  10 +-
 .../chromosome/DynamicScaledChromosome.java   |   2 +-
 .../ea/main/comparator/ParetoComparator.java  |  23 +
 .../comparator/ParetoOptimisationValue.java}  |  18 +-
 .../constraint/ConstraintProducer.java        |  16 +-
 .../constraint/ast/BoundaryIdentifier.java    |   8 +-
 .../constraint/ast/ConditionConverter.java    |  24 +-
 .../ast/UnaryBoundaryIdentifier.java          |  10 +-
 .../calculations/NormalCalculation.java       |   8 +-
 .../StandardDeviationCalculation.java         |  14 +-
 .../JeneticsConstraintProducer.java           |  26 +-
 .../JeneticsConstraintStrategy.java           |  16 +-
 .../constraint/RandomGenotypeStrategy.java    |   4 +-
 .../fitness/MalusFunctionProducer.java        |  24 +-
 .../internal/MalusForFitnessFunction.java     |   8 +-
 .../utils/ArithmeticNumberOperations.java     |   2 +-
 .../constraint/utils/ConfigurationUtils.java  |  15 +-
 .../correlation/CorrelationsProducer.java     |  18 +-
 .../constraints/correlation/el/AstHelper.java |   7 +-
 .../correlation/el/RangeSwitch.java           |   6 +-
 .../deviation/DeviationProducer.java          |  19 +-
 .../deviation/model/Deviation.java            |   2 +-
 .../deviation/model/Deviations.java           |   2 +-
 .../ea/main}/constraints/el/CallSwitch.java   |   2 +-
 .../constraints/el/DataReferenceSwitch.java   |   2 +-
 .../ea/main}/constraints/el/ElHelper.java     |   2 +-
 .../ea/main}/constraints/el/LogHelper.java    |   2 +-
 .../ea/main}/constraints/el/NumberSwitch.java |   2 +-
 .../ea/main}/constraints/el/StringSwitch.java |   2 +-
 .../constraints/el/ValueReferenceSwitch.java  |   2 +-
 .../ea/main}/fitness/DistanceFitness.java     |  10 +-
 .../core/ea/main}/fitness/FitnessFactory.java |  18 +-
 .../fitness/JeneticsFitnessFunction.java      |   6 +-
 .../core/ea/main}/fitness/MalusFitness.java   |  15 +-
 .../initial/InitialPopulationFactory.java     |   6 +-
 .../initial/RandomInitialPopulation.java      |   7 +-
 .../core/ea/main}/initial/RandomProducer.java |   6 +-
 .../jenetics/AbstractBoundedChromosome.java   |   2 +-
 .../core/ea}/main/jenetics/BitChromosome.java |   2 +-
 .../core/ea}/main/jenetics/BitHelper.java     |   2 +-
 .../main/jenetics/BoundedBitChromosome.java   |   2 +-
 .../jenetics/BoundedDoubleChromosome.java     |   2 +-
 .../ea}/main/jenetics/BoundedDoubleGene.java  |   2 +-
 .../jenetics/BoundedIntegerChromosome.java    |   3 +-
 .../ea}/main/jenetics/BoundedIntegerGene.java |   2 +-
 .../ea}/main/jenetics/BoundedOperations.java  |   2 +-
 .../core/ea/main/jenetics/ConstraintList.java |  32 ++
 .../ea}/main/jenetics/DecimalFactory.java     |   2 +-
 .../jenetics/GrayBoundedBitChromosome.java    |   2 +-
 .../core/ea}/main/jenetics/GrayHelper.java    |   2 +-
 .../jenetics/NaiveBoundedBitChromosome.java   |   2 +-
 .../ea}/main/jenetics/VariableChromosome.java |   2 +-
 .../main/producer/DataConstraintProducer.java |   7 +-
 .../producer/OptimisingFunctionProducer.java} |  22 +-
 .../PropertiesBoundariesProducer.java         |  10 +-
 .../ea/main}/producer/SelectorFactory.java    |   2 +-
 .../search/EvolutionaryAlgorithmSearch.java   |  50 +-
 .../ea/main/statistics/CandidateAdapter.java  |  63 +++
 .../statistics/IterationResultAdapter.java    |  48 ++
 .../statistics/JeneticsStatisticsWriter.java  |  21 +
 .../src/main/java/module-info.java            |  49 ++
 .../src/main/resources/META-INF/MANIFEST.MF   |   1 +
 .../src/main/resources/META-INF/beans.xml     |  11 +
 .../META-INF/definitions/data/constraints.dl  |  13 +
 .../META-INF/definitions/data/si-units.ddl    |  67 +++
 .../META-INF/definitions/optimisation/core.dl | 434 ++++++++++++++++++
 .../evoal/core/ea/utils/LanguageHelperTest.dl |  12 +
 .../evoal/core/ea/utils/LanguageHelperTest.ol |  16 +
 .../core/ea/utils/regressions/generator.dl    |  25 +
 .../ea/utils/regressions/shekel.generator     |  20 +
 .../evoal/core/ea/utils/regressions/test.ddl  |   3 +
 src/core/de.evoal.core.junit/pom.xml          |   1 +
 .../core/junit/dsl/NoOpBuiltinProvider.java   |  14 +
 .../src/main/java/module-info.java            |   3 +
 src/core/de.evoal.core.main/pom.xml           |  43 --
 src/core/de.evoal.core.main/scripts/paths.env |   6 +-
 .../core/api/ea/fitness/FitnessDecorator.java |  19 -
 .../core/api/ea/fitness/FitnessFunction.java  |  21 -
 .../fitness/comparator/FitnessComparator.java |  25 -
 .../ea/fitness/comparator/FitnessValue.java   |  11 -
 .../core/api/ea/fitness/package-info.java     |   4 -
 .../OptimisationAlgorithm.java                |   4 +-
 .../optimisation/OptimisationFunction.java    |  16 +
 .../OptimisationFunctionDecorator.java        |  19 +
 .../api/optimisation/OptimisationValue.java   |  11 +
 .../OptimisationValueComparator.java          |  34 ++
 .../properties/PropertiesSpecification.java   |   2 -
 .../evoal/core/api/statistics/Candidate.java  |  30 ++
 .../core/api/statistics/IterationResult.java  |  30 ++
 .../core/api/statistics/{ => io}/Writer.java  |   2 +-
 .../statistics/{ => io}/WriterException.java  |   2 +-
 .../statistics/{ => io}/WriterStrategy.java   |   5 +-
 .../core/api/statistics/package-info.java     |   4 +-
 .../AbstractCandidateStatisticsWriter.java    |  59 +++
 .../api/statistics/{ => writer}/Column.java   |   2 +-
 .../statistics/{ => writer}/ColumnType.java   |   2 +-
 .../{ => writer}/StatisticsWriter.java        |  17 +-
 .../{ => writer}/WriterContext.java           |   2 +-
 .../main/java/de/evoal/core/main/Evoal.java   |  36 +-
 .../comparator/WeightedSumComparator.java     |  15 +-
 .../WeightedSumOptimisationValue.java}        |  18 +-
 .../main/ea/comparator/ParetoComparator.java  |  23 -
 .../core/main/jenetics/ConstraintList.java    |  32 --
 .../main/language/ModuleBuiltinProvider.java  |  69 ++-
 .../producer/ConfigurationValueProducer.java  |  14 +
 .../main/producer/SpecificationProducer.java  |   6 +-
 .../search/HeuristicSearchEvaluation.java     |  23 +-
 .../core/main/search/HeuristicSearchMain.java |   7 +-
 .../main/search/HeuristicSearchUtils.java     |   8 +-
 .../main/statistics/StatisticsFactory.java    |   8 +-
 .../statistics/fitness/FitnessStatistics.java |  60 +--
 .../fitness/OptimisingStatistics.java         |  66 +++
 .../fitness/OptimizingStatistics.java         | 104 -----
 .../individuals/IndividualStatistics.java     |  69 +--
 .../internal/MultipleStatisticsWriter.java    |   9 +-
 .../{writer => io}/csv/CsvStrategy.java       |  10 +-
 .../{writer => io}/csv/CsvWriter.java         |  10 +-
 .../main/statistics/nop/NopStatistics.java    |   7 +-
 .../src/main/java/module-info.java            |  55 +--
 .../META-INF/definitions/data/constraints.dl  |  13 +
 .../META-INF/definitions/optimisation/core.dl | 213 ++++-----
 .../utils/LanguageHelperRegressionTest.java   | 102 ++++
 .../api/utils/LanguageHelperUnitTest.java     | 182 ++++++++
 .../core/api/utils/regressions/generator.dl   |  25 +
 .../api/utils/regressions/shekel.generator    |  20 +
 .../evoal/core/api/utils/regressions/test.ddl |   3 +
 src/core/de.evoal.generator.main/pom.xml      |   1 +
 .../generator/main.dl                         |   8 +-
 src/core/de.evoal.releng.parent/pom.xml       |   2 +
 src/core/de.evoal.surrogate.api/pom.xml       |  16 +
 .../api/function/SurrogateFunction.java       |   2 +-
 .../main/ea/SurrogateFitnessFunction.java     |   7 +-
 .../main/ea/TrainingInitialPopulation.java    |   4 +-
 .../surrogate/main/ea/TrainingProducer.java   |   6 +-
 .../main/ea/TrainingRepairStrategy.java       |   4 +-
 .../main/gof/rmse/RMSECalculator.java         |   2 +-
 .../main/gof/rmse/RRSECalculator.java         |   3 +-
 .../constraint/ConstraintStatistics.java      |  56 +--
 .../GenerationStatisticsWriter.java           |  56 ++-
 .../ranged/GenerationStatisticsWriter.java    |  59 ++-
 .../main/statistics/ranged/Hypercube.java     |   2 +-
 .../statistics/ranged/HypercubeBuilder.java   |   2 +-
 .../main/statistics/ranged/PropertyRange.java |   3 +-
 .../surrogate/SurrogateStatistics.java        |  68 +--
 .../src/main/java/module-info.java            |   1 +
 .../neural/NeuralNetworkConfigurator.java     |   2 +-
 src/core/de.evoal.surrogate.simple/pom.xml    |   1 +
 src/core/de.evoal.surrogate.svr/pom.xml       |   1 +
 215 files changed, 2346 insertions(+), 1266 deletions(-)
 create mode 100644 src/core/de.evoal.core.ea/pom.xml
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/cdi/Fitness.java (91%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/codec/CustomCodec.java (93%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/constraints/calculation/CalculationFactory.java (77%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/constraints/calculation/CalculationStrategy.java (85%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/constraints/model/Constraint.java (96%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/constraints/model/ConstraintResult.java (93%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/constraints/model/ConstraintType.java (78%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/constraints/model/Constraints.java (94%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/constraints/model/DataConstraints.java (97%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/constraints/model/package-info.java (62%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/constraints/package-info.java (72%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/constraints/strategies/CalculationResult.java (89%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/constraints/strategies/HandlingStrategy.java (76%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/constraints/strategies/RepairStrategy.java (88%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/constraints/strategies/fitness/MalusForFitnessStrategy.java (85%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/constraints/strategies/fitness/MalusFunction.java (89%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/constraints/strategies/fitness/internal/ChainFunction.java (84%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/constraints/strategies/fitness/internal/IdentityFunction.java (69%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/constraints/strategies/fitness/internal/package-info.java (54%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/constraints/strategies/fitness/package-info.java (81%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/correlations/Correlation.java (89%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/correlations/Correlations.java (95%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/correlations/Range.java (88%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/correlations/RangedCorrelation.java (95%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/initial/InitialPopulation.java (83%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/api/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/api}/package-info.java (75%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/AltererFactory.java (61%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/crossover/CorrelationCrossover.java (95%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/crossover/CorrelationCrossoverMemento.java (71%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/crossover/LineCorrelationCrossover.java (96%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/crossover/LineCorrelationCrossoverMemento.java (87%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/crossover/MultiPointCorrelationCrossover.java (97%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/crossover/MultiPointCorrelationCrossoverMemento.java (89%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/crossover/PartiallyMatchedCorrelationCrossover.java (95%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/crossover/PartiallyMatchedCorrelationCrossoverMemento.java (87%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/crossover/SinglePointCorrelationCrossover.java (94%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/crossover/SinglePointCorrelationCrossoverMemento.java (94%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/crossover/UniformCorrelationCrossover.java (95%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/crossover/UniformCorrelationCrossoverMemento.java (95%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/internal/AbstractCorrelationAlterer.java (92%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/internal/CorrelationCombineAlterer.java (96%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/internal/CorrelationRecombinator.java (98%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/internal/MeanCorrelationAlterer.java (89%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/mutator/CorrelationMutator.java (97%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/mutator/CorrelationMutatorFactory.java (87%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/mutator/CorrelationMutatorMemento.java (70%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/mutator/GaussianCorrelationMutator.java (90%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/mutator/GaussianCorrelationMutatorMemento.java (91%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/mutator/SingleBitFlipCorrelationMutator.java (97%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/mutator/SingleBitFlipCorrelationMutatorMemento.java (96%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/mutator/SingleBitFlipMutator.java (96%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/mutator/SwapCorrelationMutator.java (94%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/alterer/mutator/SwapCorrelationMutatorMemento.java (87%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/codec/DynamicCodec.java (82%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/codec/DynamicCodecProducer.java (78%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/codec/chromosome/DynamicBitChromosome.java (75%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/codec/chromosome/DynamicBoundedDoubleChromosome.java (95%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/codec/chromosome/DynamicBoundedIntegerChromosome.java (92%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/codec/chromosome/DynamicChromosome.java (97%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/codec/chromosome/DynamicChromosomeFactory.java (91%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/codec/chromosome/DynamicDoubleChromosome.java (91%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/codec/chromosome/DynamicGrayChromosome.java (75%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/codec/chromosome/DynamicIntegerChromosome.java (82%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/codec/chromosome/DynamicScaledChromosome.java (95%)
 create mode 100644 src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/comparator/ParetoComparator.java
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea/comparator/ParetoFitnessValue.java => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/comparator/ParetoOptimisationValue.java} (64%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/constraint/ConstraintProducer.java (87%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/constraint/ast/BoundaryIdentifier.java (91%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/constraint/ast/ConditionConverter.java (88%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/constraint/ast/UnaryBoundaryIdentifier.java (93%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/constraint/strategies/calculations/NormalCalculation.java (75%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/constraint/strategies/calculations/StandardDeviationCalculation.java (90%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/constraint/strategies/constraint/JeneticsConstraintProducer.java (71%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/constraint/strategies/constraint/JeneticsConstraintStrategy.java (70%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/constraint/strategies/constraint/RandomGenotypeStrategy.java (84%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/constraint/strategies/fitness/MalusFunctionProducer.java (88%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/constraint/strategies/fitness/internal/MalusForFitnessFunction.java (77%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/constraint/utils/ArithmeticNumberOperations.java (98%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/constraint/utils/ConfigurationUtils.java (73%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/correlation/CorrelationsProducer.java (87%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/correlation/el/AstHelper.java (73%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/correlation/el/RangeSwitch.java (96%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/deviation/DeviationProducer.java (81%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/deviation/model/Deviation.java (86%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/deviation/model/Deviations.java (94%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/el/CallSwitch.java (98%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/el/DataReferenceSwitch.java (98%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/el/ElHelper.java (94%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/el/LogHelper.java (94%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/el/NumberSwitch.java (98%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/el/StringSwitch.java (98%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/constraints/el/ValueReferenceSwitch.java (98%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/fitness/DistanceFitness.java (91%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/fitness/FitnessFactory.java (72%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/fitness/JeneticsFitnessFunction.java (55%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/fitness/MalusFitness.java (60%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/initial/InitialPopulationFactory.java (86%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/initial/RandomInitialPopulation.java (77%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/initial/RandomProducer.java (85%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core => de.evoal.core.ea/src/main/java/de/evoal/core/ea}/main/jenetics/AbstractBoundedChromosome.java (98%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core => de.evoal.core.ea/src/main/java/de/evoal/core/ea}/main/jenetics/BitChromosome.java (99%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core => de.evoal.core.ea/src/main/java/de/evoal/core/ea}/main/jenetics/BitHelper.java (97%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core => de.evoal.core.ea/src/main/java/de/evoal/core/ea}/main/jenetics/BoundedBitChromosome.java (96%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core => de.evoal.core.ea/src/main/java/de/evoal/core/ea}/main/jenetics/BoundedDoubleChromosome.java (99%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core => de.evoal.core.ea/src/main/java/de/evoal/core/ea}/main/jenetics/BoundedDoubleGene.java (99%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core => de.evoal.core.ea/src/main/java/de/evoal/core/ea}/main/jenetics/BoundedIntegerChromosome.java (99%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core => de.evoal.core.ea/src/main/java/de/evoal/core/ea}/main/jenetics/BoundedIntegerGene.java (99%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core => de.evoal.core.ea/src/main/java/de/evoal/core/ea}/main/jenetics/BoundedOperations.java (95%)
 create mode 100644 src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/jenetics/ConstraintList.java
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core => de.evoal.core.ea/src/main/java/de/evoal/core/ea}/main/jenetics/DecimalFactory.java (92%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core => de.evoal.core.ea/src/main/java/de/evoal/core/ea}/main/jenetics/GrayBoundedBitChromosome.java (97%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core => de.evoal.core.ea/src/main/java/de/evoal/core/ea}/main/jenetics/GrayHelper.java (96%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core => de.evoal.core.ea/src/main/java/de/evoal/core/ea}/main/jenetics/NaiveBoundedBitChromosome.java (97%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core => de.evoal.core.ea/src/main/java/de/evoal/core/ea}/main/jenetics/VariableChromosome.java (98%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core => de.evoal.core.ea/src/main/java/de/evoal/core/ea}/main/producer/DataConstraintProducer.java (92%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea/producer/OptimizingFunctionProducer.java => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/OptimisingFunctionProducer.java} (76%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core => de.evoal.core.ea/src/main/java/de/evoal/core/ea}/main/producer/PropertiesBoundariesProducer.java (72%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/producer/SelectorFactory.java (99%)
 rename src/core/{de.evoal.core.main/src/main/java/de/evoal/core/main/ea => de.evoal.core.ea/src/main/java/de/evoal/core/ea/main}/search/EvolutionaryAlgorithmSearch.java (71%)
 create mode 100644 src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/statistics/CandidateAdapter.java
 create mode 100644 src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/statistics/IterationResultAdapter.java
 create mode 100644 src/core/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/statistics/JeneticsStatisticsWriter.java
 create mode 100644 src/core/de.evoal.core.ea/src/main/java/module-info.java
 create mode 100644 src/core/de.evoal.core.ea/src/main/resources/META-INF/MANIFEST.MF
 create mode 100644 src/core/de.evoal.core.ea/src/main/resources/META-INF/beans.xml
 create mode 100644 src/core/de.evoal.core.ea/src/main/resources/META-INF/definitions/data/constraints.dl
 create mode 100644 src/core/de.evoal.core.ea/src/main/resources/META-INF/definitions/data/si-units.ddl
 create mode 100644 src/core/de.evoal.core.ea/src/main/resources/META-INF/definitions/optimisation/core.dl
 create mode 100644 src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/LanguageHelperTest.dl
 create mode 100644 src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/LanguageHelperTest.ol
 create mode 100644 src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/regressions/generator.dl
 create mode 100644 src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/regressions/shekel.generator
 create mode 100644 src/core/de.evoal.core.ea/src/test/resources/de/evoal/core/ea/utils/regressions/test.ddl
 create mode 100644 src/core/de.evoal.core.junit/src/main/java/de/evoal/core/junit/dsl/NoOpBuiltinProvider.java
 delete mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/FitnessDecorator.java
 delete mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/FitnessFunction.java
 delete mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/comparator/FitnessComparator.java
 delete mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/comparator/FitnessValue.java
 delete mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/ea/fitness/package-info.java
 rename src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/{search => optimisation}/OptimisationAlgorithm.java (85%)
 create mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationFunction.java
 create mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationFunctionDecorator.java
 create mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationValue.java
 create mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/optimisation/OptimisationValueComparator.java
 create mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/Candidate.java
 create mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/IterationResult.java
 rename src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/{ => io}/Writer.java (92%)
 rename src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/{ => io}/WriterException.java (83%)
 rename src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/{ => io}/WriterStrategy.java (86%)
 create mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/writer/AbstractCandidateStatisticsWriter.java
 rename src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/{ => writer}/Column.java (88%)
 rename src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/{ => writer}/ColumnType.java (70%)
 rename src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/{ => writer}/StatisticsWriter.java (57%)
 rename src/core/de.evoal.core.main/src/main/java/de/evoal/core/api/statistics/{ => writer}/WriterContext.java (96%)
 rename src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/{ea => }/comparator/WeightedSumComparator.java (65%)
 rename src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/{ea/comparator/WeightedSumFitnessValue.java => comparator/WeightedSumOptimisationValue.java} (72%)
 delete mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/comparator/ParetoComparator.java
 delete mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/jenetics/ConstraintList.java
 create mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/fitness/OptimisingStatistics.java
 delete mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/fitness/OptimizingStatistics.java
 rename src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/{writer => io}/csv/CsvStrategy.java (82%)
 rename src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/statistics/{writer => io}/csv/CsvWriter.java (89%)
 create mode 100644 src/core/de.evoal.core.main/src/main/resources/META-INF/definitions/data/constraints.dl
 create mode 100644 src/core/de.evoal.core.main/src/test/java/de/evoal/core/api/utils/LanguageHelperRegressionTest.java
 create mode 100644 src/core/de.evoal.core.main/src/test/java/de/evoal/core/api/utils/LanguageHelperUnitTest.java
 create mode 100644 src/core/de.evoal.core.main/src/test/resources/de/evoal/core/api/utils/regressions/generator.dl
 create mode 100644 src/core/de.evoal.core.main/src/test/resources/de/evoal/core/api/utils/regressions/shekel.generator
 create mode 100644 src/core/de.evoal.core.main/src/test/resources/de/evoal/core/api/utils/regressions/test.ddl
 rename src/core/de.evoal.generator.main/src/main/resources/META-INF/{specifications => definitions}/generator/main.dl (95%)

diff --git a/src/core/de.evoal.approximative.density/pom.xml b/src/core/de.evoal.approximative.density/pom.xml
index 6a7f9a02..d6d004df 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 abaed5ee..0d2d8435 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 ceeee4e2..ff9fde44 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 e54de0a6..b5952996 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 00000000..168bd7c0
--- /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 f56446d9..ef0c5e39 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 683b2d94..1e15f7a1 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 51ec5676..abd116b8 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 24a389e4..87e1f179 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 c55abd06..d7e6d38c 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 af435030..b5a2cb94 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 3ed3568a..9f306c3a 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 b34928c8..70cb827d 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 6a57f417..69699261 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 31b616e2..e5e3b94f 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 77b586b4..4fe22a2c 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 2c72effc..89283d25 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 3a0687c1..44ea5b58 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 f9b54934..1fe3543c 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 c6d19237..b74ca6b8 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 f05f19b9..ef7bf096 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 1e785595..60a50370 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 268b71c7..5f7d3f7e 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 cc59a125..fc1c069d 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 9ead63b4..678118e2 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 ac64ab6d..501285b7 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 182a46aa..f57489c2 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 598e4636..d173fbd2 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 064a7a94..62de1611 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 1d419270..aad1378b 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 a3ac75c0..436da35f 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 bc094066..17886765 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 6c905c34..85618077 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 904ae719..d68d8672 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 f5b4e587..7fdaa2dc 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 53b7466c..19761ac2 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 6c822877..2b0e3f0e 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 f7513b13..d7acdba9 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 6df51c8c..a9bafbc4 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 37ebc42c..8fa3f211 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 df7d99e3..785edcbb 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 d814190a..2c7d613d 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 f9f8bf64..4a8d095b 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 c48d34fb..4366384e 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 ec6b6646..a7f727ea 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 04c08da2..16b129eb 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 0b05bb86..a2b67712 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 9bf8f08c..07be1b6b 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 9419b4f1..78033e4e 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 a7beee87..84cb1a68 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 c16a79c2..b076919d 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 8fc7d7b5..c4bf3d67 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 d492e41e..826cd7e0 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 b3ce2a63..2b71541a 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 28f26afa..ec047b65 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 2aab3ccf..44bfaa47 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 272ba8e8..ee4b3684 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 c38bf41c..e0fa7d96 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 c9e32d19..714bce24 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 bd7eec67..e8abb952 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 c050bb51..ef50d766 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 2b85fc68..6775e82c 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 70d8330c..18a9b497 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 99527980..aae68706 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 72004b58..8a38301c 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 15ebc323..ccac308e 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 1c18683b..95c0161c 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 44481abd..7b7d2e27 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 9fd9a45c..950267d2 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 00000000..5c955ff5
--- /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 4a975682..9ca49b3c 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 2db5c6e8..a681fa71 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 d452d228..3aa7e14a 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 d424bb6f..9c0a3952 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 c73b01ce..f837106a 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 a12ba46f..6b1cae34 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 0c8dd19c..94e64144 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 6c5ce286..f247107d 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 30672a6d..8791ae18 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 ea28d1f9..56cd879c 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 57371661..5b687c95 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 8d637e5f..c1af10b4 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 79702bbb..d0590f75 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 546a87f2..feae4351 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 0739e389..b26acb27 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 6df67471..231244b5 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 33f382bd..771538cf 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 2c9562be..ca30adc0 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 8ad2917b..7ae4d4a8 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 26f2e235..b2e839b0 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 c1007a8e..1569b034 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 4a01d1a0..37abff7c 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 8913ecda..b3a3981c 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 3fec549b..4d0d70e4 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 ccb30d01..b2f107e2 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 df183422..1dc2d79e 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 b7e4876d..0172ec43 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 d7cc3feb..31a289cb 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 c5ce9b63..0f6fc428 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 5da57327..385fddba 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 6a822987..9e864dcd 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 859982a0..139cba96 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 9ea64a72..21140c0d 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 16840785..fb5ca8ad 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 4b56a149..d002182e 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 f3d7eec0..a0333d81 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 5b476c49..9e05d584 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 b2ea8a64..c3a7c117 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 d0999989..d765bbd5 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 e5bce3eb..b15307ec 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 2421adcb..db4a17bd 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 d29ed1f1..64192d0d 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 7d513c65..4dcb0e28 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 00000000..30207b91
--- /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 fd9e1160..8b0f34f0 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 bf1398b8..ba255604 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 65fe1161..a44369f0 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 20ae13a7..e6d2be3e 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 f180cfb8..2300fde2 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 f9a5a649..0e4adb7b 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 77900cf3..6643c5f4 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 10bb824a..8bcd5595 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 17433b5e..2b201bd1 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 23a6c383..66596c25 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 00000000..9836c62e
--- /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 00000000..76f9b86f
--- /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 00000000..c2d33ee0
--- /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 00000000..a3984f71
--- /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 00000000..9d885be5
--- /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 00000000..36964de4
--- /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 00000000..1ba8690e
--- /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 00000000..b7e8f297
--- /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 00000000..91189620
--- /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 00000000..bde38ea5
--- /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 00000000..59094313
--- /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 00000000..84b046e8
--- /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 00000000..7486510a
--- /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 00000000..0a100d63
--- /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 18a5e744..c2754b4c 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 00000000..76261191
--- /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 ca0735dc..8f2e8717 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 38fb5e77..b0ed4fc7 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 b627c074..afa56377 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 fea17387..00000000
--- 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 fc82aebf..00000000
--- 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 ae502fa9..00000000
--- 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 6b0e79e2..00000000
--- 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 0a81b12d..00000000
--- 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 eb738cc1..4d3701f6 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 00000000..c3407f6d
--- /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 00000000..25fa8e46
--- /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 00000000..3978c729
--- /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 00000000..2bd4e34c
--- /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 55e5ffd6..c4d13c47 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 00000000..3f8ae958
--- /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 00000000..b3acbecf
--- /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 0a1c3189..ca527131 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 62f74d95..12f6a903 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 0c6a4627..dbe478e7 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 87bd9222..22edd163 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 00000000..238018e1
--- /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 8c889217..8cab9328 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 f1b8511d..b7269032 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 50105799..40435739 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 2b417785..0a1edbda 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 c7cc28ce..92ead262 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 90ac991a..4479daef 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 e7f0bb89..5246a7b7 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 21baf965..00000000
--- 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 1f3c7c54..00000000
--- 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 bc783c43..2842415e 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 ffe4d141..13262c3b 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 faf31bd3..c0edffbc 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 d5cabac5..74e94493 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 42900dd8..8f0d469e 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 4e1abf34..bfe4ac00 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 1da6eb6a..dcde046a 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 c5c323f6..2318297e 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 00000000..5709cf8d
--- /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 f8a1b0b6..00000000
--- 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 b8f58b5c..c4473223 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 921a2ad4..9046da28 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 f2bb0506..431192e8 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 e303e505..73bdaa73 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 195ae316..18c1b254 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 bd1fbec6..b422e6e8 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 00000000..1ba8690e
--- /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 501c2516..91189620 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 00000000..85c45e0e
--- /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 00000000..896d0452
--- /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 00000000..84b046e8
--- /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 00000000..7486510a
--- /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 00000000..0a100d63
--- /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 3da6302a..50a1d2f5 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 b6d41817..bd4485c1 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 ccedc18f..623d5c0d 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 7dcf280c..878b1581 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 6f43da87..f5bbbd55 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 84f3c083..f820ef82 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 2064686e..4e44046d 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 cbbbdef6..a0f03db9 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 545eab0a..b2f005aa 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 420d6063..d99fe097 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 9df7d648..aba0ded2 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 cc8621a0..e0d7afff 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 c141bda6..f5ab9a93 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 9a697ea6..38a72042 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 7512c25f..5882138f 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 183b3465..93abed2a 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 69410c58..8b117e35 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 fa81cf87..f1d92d06 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 a4a1a87c..e93c2f8a 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 d3da4e47..129262ad 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 d8205863..a70cdc07 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 c4b6fef8..208fea6d 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>
-- 
GitLab