diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/api/search/OptimisationAlgorithm.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/api/search/OptimisationAlgorithm.java
new file mode 100644
index 0000000000000000000000000000000000000000..eb738cc1e5f62063a5cf066eb2068f3505c50ed0
--- /dev/null
+++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/api/search/OptimisationAlgorithm.java
@@ -0,0 +1,22 @@
+package de.evoal.core.api.search;
+
+import de.evoal.languages.model.instance.Instance;
+
+/**
+ * Interface for all optimisation algorithms.
+ */
+public interface OptimisationAlgorithm {
+    /**
+     * Initialises the algorithm based on the given configuration.
+     *
+     * @param instance The configuration to use.
+     *
+     * @return The algrithm itself.
+     */
+    public OptimisationAlgorithm init(final Instance instance);
+
+    /**
+     * Does the actual optimisation.
+     */
+    public void run();
+}
diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearch.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/search/EvolutionaryAlgorithmSearch.java
similarity index 91%
rename from src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearch.java
rename to src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/search/EvolutionaryAlgorithmSearch.java
index 42a66da6a97503c492c6f5e867e468223b034f68..cae627713a052002052fb2d2a9f5d7518b6247e3 100644
--- a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearch.java
+++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/search/EvolutionaryAlgorithmSearch.java
@@ -1,4 +1,4 @@
-package de.evoal.core.main.search;
+package de.evoal.core.main.ea.search;
 
 import java.io.File;
 import java.time.Duration;
@@ -11,6 +11,7 @@ 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.api.utils.LanguageHelper;
 import de.evoal.core.api.ea.fitness.comparator.FitnessValue;
 
@@ -37,7 +38,8 @@ import javax.inject.Named;
 
 @Slf4j
 @Dependent
-public class HeuristicSearch {
+@Named("evolutionary-algorithm")
+public class EvolutionaryAlgorithmSearch implements OptimisationAlgorithm {
 	@Inject
 	private Blackboard board;
 
@@ -56,11 +58,11 @@ public class HeuristicSearch {
 	private String run;
 
 	@Inject
-	@ConfigurationValue(entry = BlackboardEntry.OPTIMISATION_CONFIGURATION, access = "algorithm.number_of_generations")
+	@ConfigurationValue(entry = BlackboardEntry.OPTIMISATION_CONFIGURATION, access = "algorithm.number-of-generations")
 	private int numberOfGenerations;
 
 	@Inject
-	@ConfigurationValue(entry = BlackboardEntry.OPTIMISATION_CONFIGURATION, access = "algorithm.size_of_population")
+	@ConfigurationValue(entry = BlackboardEntry.OPTIMISATION_CONFIGURATION, access = "algorithm.size-of-population")
 	private int sizeOfPopulation;
 
 	@Inject
@@ -68,7 +70,7 @@ public class HeuristicSearch {
 	private Boolean maximize;
 
 	@Inject
-	@ConfigurationValue(entry = BlackboardEntry.OPTIMISATION_CONFIGURATION, access = "algorithm.maximum_age")
+	@ConfigurationValue(entry = BlackboardEntry.OPTIMISATION_CONFIGURATION, access = "algorithm.maximum-age")
 	private int maximumAge;
 
 	private final Map<String, List<Alterer<?, FitnessValue>>> alterers = new HashMap<>();
@@ -100,6 +102,11 @@ public class HeuristicSearch {
 	@Inject @Named("initial")
 	private InitialPopulation initalStream;
 
+	@Override
+	public OptimisationAlgorithm init(de.evoal.languages.model.instance.Instance instance) {
+		return this;
+	}
+
 	public void run() {
 		setup();
 
diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearchEvaluation.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearchEvaluation.java
index 42a8fe1682bf9f202e871c00a3b14b071131d0c3..189f6d099944f06ca03b8ae9d09a3e1666d1aaa4 100644
--- a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearchEvaluation.java
+++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearchEvaluation.java
@@ -12,6 +12,7 @@ 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 lombok.extern.slf4j.Slf4j;
 import org.apache.commons.math3.util.Pair;
 
@@ -103,7 +104,7 @@ public class HeuristicSearchEvaluation implements MainClass {
             board.bind(BlackboardEntry.EVALUATION_RUN, run);
             context.bindColumn(runColumn, i);
 
-            BeanFactory.create(HeuristicSearch.class)
+            BeanFactory.create(EvolutionaryAlgorithmSearch.class)
                        .run();
         }
     }
diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearchMain.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearchMain.java
index d75eae959297c35159596df30beb85446ec0de6d..d7ab7f4aebe23b8224bd60ad8e2a4dfcaa7a1d3e 100644
--- a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearchMain.java
+++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearchMain.java
@@ -3,12 +3,15 @@ package de.evoal.core.main.search;
 import de.evoal.core.api.board.Blackboard;
 import de.evoal.core.api.board.BlackboardEntry;
 import de.evoal.core.api.cdi.BeanFactory;
+import de.evoal.core.api.cdi.ConfigurationValue;
 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.languages.model.instance.Instance;
 import org.apache.commons.math3.util.Pair;
 
 import javax.inject.Inject;
@@ -25,6 +28,10 @@ public class HeuristicSearchMain implements MainClass {
 	@Inject
 	private WriterContext context;
 
+	@Inject
+	@ConfigurationValue(entry = BlackboardEntry.OPTIMISATION_CONFIGURATION, access = "algorithm")
+	private Instance algorithmConfiguration;
+
 	@Override
 	public void run() {
 		final String outputFolder = board.get(BlackboardEntry.EVALUATION_OUTPUT_FOLDER);
@@ -38,7 +45,8 @@ public class HeuristicSearchMain implements MainClass {
 		board.bind(BlackboardEntry.EVALUATION_OUTPUT_FOLDER, outputBaseDir);
 		board.bind(BlackboardEntry.EVALUATION_RUN, "0");
 
-		BeanFactory.create(HeuristicSearch.class)
+		BeanFactory.create(OptimisationAlgorithm.class)
+				   .init(algorithmConfiguration)
 				   .run();
 	}
 
diff --git a/src/core/de.evoal.core/src/main/java/module-info.java b/src/core/de.evoal.core/src/main/java/module-info.java
index 139b49af35fb2522d20898440b4aa780123bb12d..ccef2dd4f137c4fe68425498a6a65f52a6b7ab3f 100644
--- a/src/core/de.evoal.core/src/main/java/module-info.java
+++ b/src/core/de.evoal.core/src/main/java/module-info.java
@@ -54,6 +54,7 @@ module de.evoal.core {
     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.statistics;
     exports de.evoal.core.api.utils;
 
@@ -96,4 +97,6 @@ module de.evoal.core {
     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;
+
 }