diff --git a/jastadd-mquat-benchmark/src/main/java/de/tudresden/inf/st/mquat/benchmark/SolverFactory.java b/jastadd-mquat-benchmark/src/main/java/de/tudresden/inf/st/mquat/benchmark/SolverFactory.java
index 180b8aa4fc704d7f710dbf8e89ede1d795cc6a2a..30d9a80c57a80a7b9be22b2f294e859177f49ea2 100644
--- a/jastadd-mquat-benchmark/src/main/java/de/tudresden/inf/st/mquat/benchmark/SolverFactory.java
+++ b/jastadd-mquat-benchmark/src/main/java/de/tudresden/inf/st/mquat/benchmark/SolverFactory.java
@@ -1,9 +1,11 @@
 package de.tudresden.inf.st.mquat.benchmark;
 
 import de.tudresden.inf.st.mquat.solving.BenchmarkableSolver;
+import de.tudresden.inf.st.mquat.solving.ilp.GLPKSolver;
+import de.tudresden.inf.st.mquat.solving.ilp.GurobiSolver;
 import de.tudresden.inf.st.mquat.solving.ilp.ILPDirectSolver;
-import de.tudresden.inf.st.mquat.solving.ilp.ILPExternalSolver;
 import de.tudresden.inf.st.mquat.solving.genetic.GeneticSolver;
+import de.tudresden.inf.st.mquat.solving.ilp.SCIPSolver;
 import de.tudresden.inf.st.mquat.solving.random.RandomSolver;
 import de.tudresden.inf.st.mquat.solving.simple.SimpleSolver;
 import ir.ac.ui.eng.ACOSolver;
@@ -28,7 +30,9 @@ public class SolverFactory {
       availableSolvers = Stream.of(
           new ACOSolver(),
           new EMFeRSolver(),
-          new ILPExternalSolver(),
+          new GLPKSolver(),
+          new SCIPSolver(),
+          new GurobiSolver(),
           new ILPDirectSolver(),
           new SimpleSolver(),
           new RandomSolver(0, 0),
diff --git a/jastadd-mquat-benchmark/src/main/resources/scenarios.json b/jastadd-mquat-benchmark/src/main/resources/scenarios.json
index e9163b0d186054d7c07d36da5786ab42521065c5..54b41792909b98907ea47a5293eda672b172c6c0 100644
--- a/jastadd-mquat-benchmark/src/main/resources/scenarios.json
+++ b/jastadd-mquat-benchmark/src/main/resources/scenarios.json
@@ -5,7 +5,8 @@
     "aco",
     "emfer",
     "ilp-direct",
-//    "ilp-external",
+    "ilp-glpk",
+    "ilp-scip",
     "random",
     "genetic",
     "simple"
diff --git a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/AbstractILPSolver.java b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/AbstractILPSolver.java
index 4c50b7a290bcf1458aa23bfa59d7820e8d95dd9d..91cb89dcfa4efc60f54f39b44ad5af1bf2ae7eb9 100644
--- a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/AbstractILPSolver.java
+++ b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/AbstractILPSolver.java
@@ -85,7 +85,7 @@ public abstract class AbstractILPSolver implements BenchmarkableSolver {
 
     // call to abstract method
     try {
-      solve0(model, watch, variablesSetToOne);
+      solve0(model, ilp, watch, variablesSetToOne);
       this.lastSolving = watch.time(TimeUnit.MILLISECONDS) - this.lastGeneration;
       // translate ilp-encoded solution to MQuAT solution
       return populateSolution(variablesSetToOne, new ILPSolution(model));
@@ -103,12 +103,11 @@ public abstract class AbstractILPSolver implements BenchmarkableSolver {
    * @return the objective value
    * @throws SolvingException if anything went wrong
    */
-  protected abstract double solve0(Root model, StopWatch watch, List<IlpVariable> variablesSetToOne) throws SolvingException;
+  protected abstract double solve0(Root model, ILP ilp, StopWatch watch, List<IlpVariable> variablesSetToOne) throws SolvingException;
 
   protected ILPSolution populateSolution(List<IlpVariable> variablesSetToOne, ILPSolution result) throws SolvingException {
     List<Assignment> listOfAssignments = new ArrayList<>();
     for (IlpVariable var : variablesSetToOne) {
-      logger.debug("Found, that {} = 1", var.getName());
       if (var.isMappingVariable()) {
         IlpMappingVariable mappingVar = var.asMappingVariable();
         Assignment assignment = new Assignment();
diff --git a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/GLPKSolver.java b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/GLPKSolver.java
new file mode 100644
index 0000000000000000000000000000000000000000..254bd331c408fd0239930154c2bc2c936b09ecb9
--- /dev/null
+++ b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/GLPKSolver.java
@@ -0,0 +1,104 @@
+package de.tudresden.inf.st.mquat.solving.ilp;
+
+import de.tudresden.inf.st.mquat.jastadd.model.ILP;
+import de.tudresden.inf.st.mquat.jastadd.model.IlpVariable;
+import de.tudresden.inf.st.mquat.solving.SolvingException;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class GLPKSolver extends ILPExternalSolver {
+
+  /**
+   * Create a new GLPK solver with default settings.
+   * Default is:
+   * <ul>
+   *   <li>1 minute timeout</li>
+   *   <li>delete temporary files on exit.</li>
+   * </ul>
+   * @see GLPKSolver#setDeleteFilesOnExit(boolean)
+   */
+  public GLPKSolver() {
+  }
+
+  @Override
+  protected String[] getCommand(Path lp, Path solution, long remainingTimeForSolvingInMillis) {
+    return new String[] {"glpsol", "--lp", lp.toAbsolutePath().toString(), "--cuts",
+        "-o", String.valueOf(solution.toAbsolutePath())};
+  }
+
+  @Override
+  public String getName() {
+    return "ilp-glpk";
+  }
+
+  @Override
+  protected void readFromPlainTextSolution(ILP ilp, Path solution, ILPSolution result,
+                                                List<IlpVariable> variablesSetToOne) throws SolvingException {
+    List<String> varNamesSetToOne = new ArrayList<>();
+    String name = null;
+    int phase = 1;
+    try (Stream<String> lines = Files.lines(solution)) {
+      for (String line : lines.collect(Collectors.toList())) {
+        if (phase < 3) {
+          if (line.startsWith("Objective")) {
+            int equalsIndex = line.indexOf('=');
+            int bracketIndex = line.lastIndexOf('(');
+            result.setObjective(Double.valueOf(line.substring(equalsIndex + 1, bracketIndex).trim()));
+          }
+          if (line.startsWith("---")) {
+            phase += 1;
+          }
+          continue;
+        }
+        line = line.trim();
+        if (line.isEmpty()) {
+          continue;
+        }
+        String[] tokens = line.split("\\s+");
+        if (tokens.length == 6) {
+          // tokens: index, name, star, activity, lb, rb
+          if(Integer.valueOf(tokens[3]) == 1) {
+            varNamesSetToOne.add(tokens[1]);
+          }
+          phase = 3;
+        } else if (phase == 3) {
+          if(line.startsWith("Integer")) {
+            break;
+          }
+          // tokens: index, name
+          name = tokens[1];
+          phase = 4;
+        } else if (phase == 4) {
+          // tokens: star, activity, lb, rb
+          if (name == null) {
+            throw new SolvingException("Error in parsing solution. Name is null. Tokens: " + Arrays.toString(tokens));
+          }
+          if (Integer.valueOf(tokens[1]) == 1) {
+            varNamesSetToOne.add(name);
+            name = null;
+          }
+          phase = 3;
+        }
+      }
+    } catch (IOException e) {
+      throw new SolvingException("Could not open solution file", e);
+    } catch (NumberFormatException | IndexOutOfBoundsException e) {
+      throw new SolvingException("Could not parse solution file", e);
+    }
+    for (String varName : varNamesSetToOne) {
+      IlpVariable variable = ilp.resolve(varName);
+      if (variable == null) {
+        throw new SolvingException("Could not find variable with name " + varName);
+      }
+      variablesSetToOne.add(variable);
+    }
+  }
+
+}
diff --git a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/GurobiSolver.java b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/GurobiSolver.java
new file mode 100644
index 0000000000000000000000000000000000000000..53238dadb87c2775c6428efdbbb7e6d168977351
--- /dev/null
+++ b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/GurobiSolver.java
@@ -0,0 +1,77 @@
+package de.tudresden.inf.st.mquat.solving.ilp;
+
+import de.tudresden.inf.st.mquat.jastadd.model.ILP;
+import de.tudresden.inf.st.mquat.jastadd.model.IlpVariable;
+import de.tudresden.inf.st.mquat.solving.SolvingException;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class GurobiSolver extends ILPExternalSolver {
+
+  /**
+   * Create a new GLPK solver with default settings.
+   * Default is:
+   * <ul>
+   *   <li>1 minute timeout</li>
+   *   <li>delete temporary files on exit.</li>
+   * </ul>
+   * @see GurobiSolver#setDeleteFilesOnExit(boolean)
+   */
+  public GurobiSolver() {
+
+  }
+
+
+  @Override
+  protected String[] getCommand(Path lp, Path solution, long remainingTimeForSolvingInMillis) {
+    String[] command = {"gurobi_cl", "ResultFile=" + solution.toAbsolutePath(), "TimeLimit=" + remainingTimeForSolvingInMillis/1000, String.valueOf(lp.toAbsolutePath())};
+    return command;
+  }
+
+  @Override
+  protected void readFromPlainTextSolution(ILP ilp, Path solution, ILPSolution result,
+                                                List<IlpVariable> variablesSetToOne) throws SolvingException {
+
+    logger.debug("reading solution from {}.", solution);
+
+    try(BufferedReader br = new BufferedReader(new FileReader(solution.toFile()))) {
+      for(String line; (line = br.readLine()) != null; ) {
+        if (line.startsWith("#")) {
+          // comment line
+
+          if (line.startsWith("# Objective Value =")) {
+            result.setObjective(Double.valueOf(line.substring(20).trim()));
+            logger.debug("read objective {}", Double.valueOf(line.substring(20).trim()));
+          }
+        } else {
+          if (line.endsWith(" 1")) {
+            String varString = line.substring(0,line.length()-2);
+            IlpVariable variable = ilp.resolve(varString);
+            if (variable == null) {
+              throw new SolvingException("Could not find variable with name " + varString);
+            }
+            variablesSetToOne.add(variable);
+          }
+        }
+      }
+    } catch (FileNotFoundException e) {
+      e.printStackTrace();
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+  }
+
+  @Override
+  public String getName() {
+    return "ilp-gurobi";
+  }
+
+}
diff --git a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPDirectSolver.java b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPDirectSolver.java
index 12f6d952ed95324a366dc10eb307af41b336ca34..ef9ad6b002261fcf9a8f4b0fdaf64fc3f9a69736 100644
--- a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPDirectSolver.java
+++ b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPDirectSolver.java
@@ -57,8 +57,7 @@ public class ILPDirectSolver extends AbstractILPSolver {
     this.prob = null;
   }
 
-  protected double solve0(Root model, StopWatch watch, List<IlpVariable> variablesSetToOne) throws SolvingException {
-    ILP ilp = model.getILP();
+  protected double solve0(Root model, ILP ilp, StopWatch watch, List<IlpVariable> variablesSetToOne) throws SolvingException {
 
     if (logger.isTraceEnabled()) {
       logger.trace(ilp.printIlp().toString());
diff --git a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPExternalSolver.java b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPExternalSolver.java
index f6f8ab36a35dad7cb5235b994015f528b22535e9..ef53166b8740f48b403d1b9a81b16f7e71f50002 100644
--- a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPExternalSolver.java
+++ b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPExternalSolver.java
@@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-public class ILPExternalSolver extends AbstractILPSolver {
+public abstract class ILPExternalSolver extends AbstractILPSolver {
 
   private boolean deleteFilesOnExit;
   private Path lp, solutionReadable;
@@ -70,22 +70,24 @@ public class ILPExternalSolver extends AbstractILPSolver {
     }
   }
 
-  protected double solve0(Root model, StopWatch watch, List<IlpVariable> variablesSetToOne) throws SolvingException {
+  protected double solve0(Root model, ILP ilp, StopWatch watch, List<IlpVariable> variablesSetToOne) throws SolvingException {
 
     long startOfWriteOutInMillis = watch.time(TimeUnit.MILLISECONDS);
 
     // Create temporary files
     try {
-      lp = Files.createTempFile("ilp", null);
+      lp = Files.createTempFile("ilp", ".lp");
 //      solution = Files.createTempFile("solution", null);
-      solutionReadable = Files.createTempFile("sol-read", null);
+      solutionReadable = Files.createTempFile("sol-read", ".sol");
     } catch (IOException e) { throw new SolvingException("Can not create lp or solution file", e); }
     if (!deleteFilesOnExit) {
       logger.info("Writing ILP to {}, solving now", lp.toAbsolutePath());
     }
 
     // write out lp file
-    IlpString output = model.getILP().printIlp();
+    logger.debug("Starting ILP string construction.");
+    IlpString output = ilp.printIlp();
+    logger.debug("ILP string construction completed.");
     try (BufferedWriter writer = Files.newBufferedWriter(
         lp, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) {
       writer.write(output.toString());
@@ -101,16 +103,12 @@ public class ILPExternalSolver extends AbstractILPSolver {
 
     // start GLPK to solve the lp file just written, writing out the solution
     Process process;
-    String command = "glpsol --lp " + lp.toAbsolutePath() +
-//        " -w " + solution.toAbsolutePath() +
-        " --tmlim " + remainingTimeForSolvingInMillis/1000 +
-        " --cuts" +
-        " -o " + solutionReadable.toAbsolutePath();
-    logger.debug("Call: '{}'", command);
+    String[] command = getCommand(lp, solutionReadable, remainingTimeForSolvingInMillis);
+    logger.debug("Call: '{}'", String.join(" ", command));
     try {
       process = Runtime.getRuntime().exec(command,null, new File("."));
     } catch (IOException e) {
-      throw new SolvingException("Problem calling glpsol. Is it installed?", e);
+      throw new SolvingException("Problem calling solver. Is it installed?", e);
     }
     boolean finishedInTime;
     try {
@@ -144,76 +142,16 @@ public class ILPExternalSolver extends AbstractILPSolver {
     // read the solution file
     ILPSolution result = new ILPSolution(model);
 
+    logger.debug("created empty solution");
+
 //    readFromPrintableSolution(ilp, solution, result, variablesSetToOne);
-    readFromPlainTextSolution(model.getILP(), solutionReadable, result, variablesSetToOne);
+    readFromPlainTextSolution(ilp, solutionReadable, result, variablesSetToOne);
     return result.getObjective();
   }
 
-  private static void readFromPlainTextSolution(ILP ilp, Path solution, ILPSolution result,
-                                                List<IlpVariable> variablesSetToOne) throws SolvingException {
-    List<String> varNamesSetToOne = new ArrayList<>();
-    String name = null;
-    int phase = 1;
-    try (Stream<String> lines = Files.lines(solution)) {
-      for (String line : lines.collect(Collectors.toList())) {
-        if (phase < 3) {
-          if (line.startsWith("Objective")) {
-            int equalsIndex = line.indexOf('=');
-            int bracketIndex = line.lastIndexOf('(');
-            result.setObjective(Double.valueOf(line.substring(equalsIndex + 1, bracketIndex).trim()));
-          }
-          if (line.startsWith("---")) {
-            phase += 1;
-          }
-          continue;
-        }
-        line = line.trim();
-        if (line.isEmpty()) {
-          continue;
-        }
-        String[] tokens = line.split("\\s+");
-        if (tokens.length == 6) {
-          // tokens: index, name, star, activity, lb, rb
-          if(Integer.valueOf(tokens[3]) == 1) {
-            varNamesSetToOne.add(tokens[1]);
-          }
-          phase = 3;
-        } else if (phase == 3) {
-          if(line.startsWith("Integer")) {
-            break;
-          }
-          // tokens: index, name
-          name = tokens[1];
-          phase = 4;
-        } else if (phase == 4) {
-          // tokens: star, activity, lb, rb
-          if (name == null) {
-            throw new SolvingException("Error in parsing solution. Name is null. Tokens: " + Arrays.toString(tokens));
-          }
-          if (Integer.valueOf(tokens[1]) == 1) {
-            varNamesSetToOne.add(name);
-            name = null;
-          }
-          phase = 3;
-        }
-      }
-    } catch (IOException e) {
-      throw new SolvingException("Could not open solution file", e);
-    } catch (NumberFormatException | IndexOutOfBoundsException e) {
-      throw new SolvingException("Could not parse solution file", e);
-    }
-    for (String varName : varNamesSetToOne) {
-      IlpVariable variable = ilp.resolve(varName);
-      if (variable == null) {
-        throw new SolvingException("Could not find variable with name " + varName);
-      }
-      variablesSetToOne.add(variable);
-    }
-  }
+  protected abstract void readFromPlainTextSolution(ILP ilp, Path solution, ILPSolution result,
+                                                List<IlpVariable> variablesSetToOne) throws SolvingException;
 
-  @Override
-  public String getName() {
-    return "ilp-external";
-  }
+  protected abstract String[] getCommand(Path lp, Path solution, long remainingTimeForSolvingInMillis);
 
 }
diff --git a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPMain.java b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPMain.java
index bc8b5f2761be6d9367e16530dd52af52bacba405..3538ce52d36b140ab926dd76e7258b5e32872da5 100644
--- a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPMain.java
+++ b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPMain.java
@@ -74,7 +74,7 @@ public class ILPMain {
   }
 
   private static void solveILPWithSolver(Root model) throws SolvingException {
-    ILPExternalSolver solver = new ILPExternalSolver();
+    ILPExternalSolver solver = new GLPKSolver().setDeleteFilesOnExit(false);
     Solution solution = solver.solve(model);
     System.out.println(solution);
   }
@@ -90,7 +90,7 @@ public class ILPMain {
     System.out.println(version);
     ScenarioGenerator gen = new ScenarioGenerator(new ScenarioDescription(1, 2, 0, 0, 0, 2, 2, 2.5, 3, 1, 0));
     Root model = gen.generate();
-    Solver external = new ILPExternalSolver().setDeleteFilesOnExit(false);
+    Solver external = new GLPKSolver().setDeleteFilesOnExit(false);
     Solution solution = external.solve(model);
     logger.info(model.print(new MquatWriteSettings(" ")));
     solution.explain();
diff --git a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/SCIPSolver.java b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/SCIPSolver.java
new file mode 100644
index 0000000000000000000000000000000000000000..4d8cb9f52ffe9474fe296424b4d47c9b827b6152
--- /dev/null
+++ b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/SCIPSolver.java
@@ -0,0 +1,77 @@
+package de.tudresden.inf.st.mquat.solving.ilp;
+
+import de.tudresden.inf.st.mquat.jastadd.model.ILP;
+import de.tudresden.inf.st.mquat.jastadd.model.IlpVariable;
+import de.tudresden.inf.st.mquat.solving.SolvingException;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class SCIPSolver extends ILPExternalSolver {
+
+  /**
+   * Create a new GLPK solver with default settings.
+   * Default is:
+   * <ul>
+   * <li>1 minute timeout</li>
+   * <li>delete temporary files on exit.</li>
+   * </ul>
+   *
+   * @see SCIPSolver#setDeleteFilesOnExit(boolean)
+   */
+  public SCIPSolver() {
+  }
+
+
+  @Override
+  protected String[] getCommand(Path lp, Path solution, long remainingTimeForSolvingInMillis) {
+    String[] command = {"scip", "-c", "read " + lp.toAbsolutePath() + " set timing reading true set timing clocktype 2 set limit time " + remainingTimeForSolvingInMillis / 1000 + " optimize write solution " + solution.toAbsolutePath() + " quit"};
+    return command;
+  }
+
+  @Override
+  protected void readFromPlainTextSolution(ILP ilp, Path solution, ILPSolution result,
+                                           List<IlpVariable> variablesSetToOne) throws SolvingException {
+    try (Stream<String> lines = Files.lines(solution)) {
+      for (String line : lines.collect(Collectors.toList())) {
+        if (line.startsWith("objective value:")) {
+          result.setObjective(Double.valueOf(line.substring(16).trim()));
+          logger.debug("read objective {}", Double.valueOf(line.substring(16).trim()));
+        } else if (line.startsWith("solution status:")) {
+          logger.debug("we got a solution status {}", line.substring(16).trim());
+        } else if (line.startsWith("no solution available")) {
+          logger.debug("no solution was found!");
+          return;
+        } else {
+          String[] tokens = line.split("\\s+");
+          if (tokens.length == 3) {
+            // tokens: name, value, objective
+
+            if (Math.round(Double.parseDouble(tokens[1]) * 1000000000) == 1000000000) {
+              logger.debug("found new variable {} with value {}", tokens[0], tokens[1]);
+              IlpVariable variable = ilp.resolve(tokens[0]);
+              if (variable == null) {
+                throw new SolvingException("Could not find variable with name " + tokens[0]);
+              }
+              variablesSetToOne.add(variable);
+            }
+          }
+        }
+      }
+    } catch (IOException e) {
+      throw new SolvingException("Could not open solution file", e);
+    } catch (NumberFormatException e) {
+      throw new SolvingException("Could not parse solution file", e);
+    }
+  }
+
+  @Override
+  public String getName() {
+    return "ilp-scip";
+  }
+
+}
diff --git a/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/GLPKHandwrittenTest.java b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/GLPKHandwrittenTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..afc71a9b17a811cfad2b6bc6d8876957783895c6
--- /dev/null
+++ b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/GLPKHandwrittenTest.java
@@ -0,0 +1,11 @@
+package de.tudresden.inf.st.mquat.solving;
+
+import de.tudresden.inf.st.mquat.solving.ilp.GLPKSolver;
+
+public class GLPKHandwrittenTest extends HandwrittenTestSuite {
+  @Override
+  protected Solver getSolver() {
+    // set to false for debugging
+    return new GLPKSolver().setDeleteFilesOnExit(false);
+  }
+}
diff --git a/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/GurobiHandwrittenTest.java b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/GurobiHandwrittenTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..57bc15dc26511efefb7266865f0ff20086e9454d
--- /dev/null
+++ b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/GurobiHandwrittenTest.java
@@ -0,0 +1,11 @@
+package de.tudresden.inf.st.mquat.solving;
+
+import de.tudresden.inf.st.mquat.solving.ilp.GurobiSolver;
+
+public class GurobiHandwrittenTest extends HandwrittenTestSuite {
+  @Override
+  protected Solver getSolver() {
+    // set to false for debugging
+    return new GurobiSolver().setDeleteFilesOnExit(false);
+  }
+}
diff --git a/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/ILPExternalHandwrittenTest.java b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/ILPExternalHandwrittenTest.java
deleted file mode 100644
index 2abeb4dbdfe7b1f766d040c7826d984b98968b3e..0000000000000000000000000000000000000000
--- a/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/ILPExternalHandwrittenTest.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package de.tudresden.inf.st.mquat.solving;
-
-import de.tudresden.inf.st.mquat.solving.ilp.ILPExternalSolver;
-
-public class ILPExternalHandwrittenTest extends HandwrittenTestSuite {
-  @Override
-  protected Solver getSolver() {
-    // set to false for debugging
-    return new ILPExternalSolver().setDeleteFilesOnExit(true);
-  }
-}
diff --git a/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/ILPObjectiveTest.java b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/ILPObjectiveTest.java
index 7e5c761bb7d2b829ad0db0cb75864e80bcb48a3e..bd7868edae83d9b0979c86926511ae8df915e63e 100644
--- a/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/ILPObjectiveTest.java
+++ b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/ILPObjectiveTest.java
@@ -4,6 +4,7 @@ import de.tudresden.inf.st.mquat.generator.ScenarioDescription;
 import de.tudresden.inf.st.mquat.generator.ScenarioGenerator;
 import de.tudresden.inf.st.mquat.jastadd.model.Root;
 import de.tudresden.inf.st.mquat.jastadd.model.Solution;
+import de.tudresden.inf.st.mquat.solving.ilp.GLPKSolver;
 import de.tudresden.inf.st.mquat.solving.ilp.ILPExternalSolver;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -36,7 +37,7 @@ public class ILPObjectiveTest {
 
     ScenarioGenerator generator = new ScenarioGenerator(new ScenarioDescription(tlc, iac, isd, cac, csd, dep, imp, res, req, cpu, seed));
     Root model = generator.generate();
-    ILPExternalSolver solver = new ILPExternalSolver().setDeleteFilesOnExit(false);
+    ILPExternalSolver solver = new GLPKSolver().setDeleteFilesOnExit(false);
     Solution solution = solver.solve(model);
     Assert.assertTrue(solution.isValid());
     logger.info("Solution (objective={}): {}", solution.computeObjective(), solution);
diff --git a/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/ILPSolveTest.java b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/ILPSolveTest.java
index 63ac7cbd3e402be32cbc1150ede363c0871994fc..a802fa02acb3a01b78c05b9a4eb095134fffaa1a 100644
--- a/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/ILPSolveTest.java
+++ b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/ILPSolveTest.java
@@ -2,6 +2,7 @@ package de.tudresden.inf.st.mquat.solving;
 
 import de.tudresden.inf.st.mquat.data.TestGeneratorSettings;
 import de.tudresden.inf.st.mquat.generator.ScenarioGenerator;
+import de.tudresden.inf.st.mquat.solving.ilp.GLPKSolver;
 import de.tudresden.inf.st.mquat.utils.TestUtils;
 import de.tudresden.inf.st.mquat.jastadd.model.Root;
 import de.tudresden.inf.st.mquat.jastadd.model.Solution;
@@ -106,7 +107,7 @@ public class ILPSolveTest {
 
   private Solver externalSolver() {
     // set to false to analyse created temporary files
-    return new ILPExternalSolver().setDeleteFilesOnExit(true).setTimeout(10, TimeUnit.SECONDS);
+    return new GLPKSolver().setDeleteFilesOnExit(true).setTimeout(10, TimeUnit.SECONDS);
   }
 
   private Solver directSolver() {
diff --git a/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/SCIPHandwrittenTest.java b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/SCIPHandwrittenTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..791e02ce345304e4025a68e14495e5dfef127d86
--- /dev/null
+++ b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/SCIPHandwrittenTest.java
@@ -0,0 +1,11 @@
+package de.tudresden.inf.st.mquat.solving;
+
+import de.tudresden.inf.st.mquat.solving.ilp.SCIPSolver;
+
+public class SCIPHandwrittenTest extends HandwrittenTestSuite {
+  @Override
+  protected Solver getSolver() {
+    // set to false for debugging
+    return new SCIPSolver().setDeleteFilesOnExit(false);
+  }
+}