diff --git a/jastadd-mquat-solver-genetic/build.gradle b/jastadd-mquat-solver-genetic/build.gradle
index 4ff9f9bd38fd0ce07df5eba9e9a082f0826299f5..18918edd3cd6fa370b92ce591a379606fc63d81d 100644
--- a/jastadd-mquat-solver-genetic/build.gradle
+++ b/jastadd-mquat-solver-genetic/build.gradle
@@ -1,5 +1,6 @@
 
 apply plugin: 'java'
+apply plugin: 'application'
 
 sourceCompatibility = 1.8
 
@@ -7,6 +8,16 @@ repositories {
     mavenCentral()
 }
 
+jar {
+    manifest {
+        attributes "Main-Class": 'de.tudresden.inf.st.mquat.solving.genetic.GeneticMain'
+    }
+
+    from {
+        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
+    }
+}
+
 dependencies {
     compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.10.0'
     compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.10.0'
@@ -22,3 +33,12 @@ dependencies {
     compile group: 'org.opt4j', name: 'opt4j-viewer', version: '3.1.4'
     compile group: 'org.opt4j', name: 'opt4j-benchmarks', version: '3.1.4'
 }
+
+
+run {
+    mainClassName = 'de.tudresden.inf.st.mquat.solving.genetic.GeneticMain'
+    standardInput = System.in
+    if (project.hasProperty("appArgs")) {
+        args Eval.me(appArgs)
+    }
+}
\ No newline at end of file
diff --git a/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/GeneticMain.java b/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/GeneticMain.java
new file mode 100644
index 0000000000000000000000000000000000000000..f448680a4f12afe87105e547a18327e63159558f
--- /dev/null
+++ b/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/GeneticMain.java
@@ -0,0 +1,123 @@
+package de.tudresden.inf.st.mquat.solving.genetic;
+
+import de.tudresden.inf.st.mquat.generator.ScenarioDescription;
+import de.tudresden.inf.st.mquat.generator.ScenarioGenerator;
+import de.tudresden.inf.st.mquat.jastadd.model.MquatWriteSettings;
+import de.tudresden.inf.st.mquat.jastadd.model.Root;
+import de.tudresden.inf.st.mquat.solving.BenchmarkableSolver;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import de.tudresden.inf.st.mquat.jastadd.model.Solution;
+import de.tudresden.inf.st.mquat.solving.SolvingException;
+
+import java.io.BufferedWriter;
+import java.nio.file.StandardOpenOption;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.concurrent.TimeUnit;
+
+import static java.nio.file.Files.exists;
+
+
+public class GeneticMain {
+
+    protected static final char SEPARATOR = ',';
+
+    protected static void writeHeader(BufferedWriter writer) throws IOException {
+        writer.append("name").append(SEPARATOR)
+                .append("Solved").append(SEPARATOR)
+                .append("Obj").append(SEPARATOR)
+                .append("Valid").append(SEPARATOR)
+                .append("TimeOut").append("\n");
+    }
+
+    private static void createDirIfNecessary(Path directory) throws IOException {
+        if (!exists(directory)) {
+            Files.createDirectories(directory);
+        }
+    }
+
+    public static void main(String[] args)  throws Exception {
+        Logger logger = LogManager.getLogger(GeneticMain.class);
+
+        String scenario_name = "size_v2_q1_d1_r15";
+
+        int numTopLevelComponents = 1;
+        int avgNumImplSubComponents = 0;
+        int implSubComponentStdDerivation = 0;
+        int avgNumCompSubComponents = 2;
+        int compSubComponentStdDerivation = 0;
+        int componentDepth = 2; //from scenario - depth
+        int numImplementations = 2; //from scenario - variants
+        double excessComputeResourceRatio = 1.5; //from scenario - resources
+        int numRequests = 1; //from scenario - requests
+        int numCpus = 1;
+        long seed = 0; //settings - seed
+
+        long timeoutValue = 20;    //from scenarios.json
+        String timeoutUnit = "SECONDS";   //from scenarios.json, possible values - "SECONDS", "MINUTES"
+
+
+        int generations = 200000;
+        int populationSize = 1000;
+        if (args.length == 2) {
+            System.out.println("============    Args: " + args[0] + " and " + args[1]);
+            generations = Integer.parseInt(args[0]);
+            populationSize = Integer.parseInt(args[1]);
+            System.out.println("============    generations = " + generations + ", populationSize = " + populationSize);
+        }
+
+        ScenarioGenerator generator = new ScenarioGenerator(new ScenarioDescription(numTopLevelComponents,
+                avgNumImplSubComponents, implSubComponentStdDerivation, avgNumCompSubComponents,
+                compSubComponentStdDerivation, componentDepth, numImplementations, excessComputeResourceRatio,
+                numRequests, numCpus, seed));
+
+        Root model = generator.generate();
+        logger.info(model.print(new MquatWriteSettings(" ")));
+
+        BenchmarkableSolver solver = new GeneticSolver(GeneticSolver.SelectorType.NSGA2, generations, populationSize);
+        solver.setTimeout(timeoutValue, TimeUnit.valueOf(timeoutUnit));
+
+        Path path_for_results = Paths.get("results/scenarios");
+        createDirIfNecessary(path_for_results);
+        Path results_file = Paths.get(path_for_results.toString() + "/" + scenario_name + ".csv");
+
+        BufferedWriter bw = null;
+        if (!Files.exists(results_file)) {
+            bw = Files.newBufferedWriter(results_file);
+            writeHeader(bw);
+        }
+
+        if (bw == null)
+            bw = Files.newBufferedWriter(results_file, StandardOpenOption.APPEND, StandardOpenOption.CREATE);
+
+
+        StringBuilder sb = new StringBuilder("genetic_NSGA2").append(SEPARATOR); // name
+
+        Solution solution = null;
+        try {
+            solution = solver.solve(model);
+            if (solution == null) {
+                solution = Solution.emptySolutionOf(model);
+            } else {
+                solution.explain();
+            }
+            sb.append(solver.getLastSolvingTime()).append(SEPARATOR)   // solution time
+                    .append(solution.computeObjective()).append(SEPARATOR)   // objective
+                    .append(solution.isValid());  // valid
+        } catch (SolvingException e) {
+            logger.catching(e);
+            sb.append(-1).append(SEPARATOR)  // solution time
+                    .append(-1).append(SEPARATOR)  // objective
+                    .append(false);  // valid
+        }
+        sb.append(SEPARATOR).append(solver.hadTimeout()) // timeout
+                .append("\n");
+
+        bw.append(sb.toString());
+        bw.close();
+
+    }
+}