diff --git a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/CPLEXSolver.java b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/CPLEXSolver.java
new file mode 100644
index 0000000000000000000000000000000000000000..8294e6c3cdaa6817da7c2fb5f9fb755f64a90387
--- /dev/null
+++ b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/CPLEXSolver.java
@@ -0,0 +1,84 @@
+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 org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.*;
+import java.nio.file.Path;
+import java.util.List;
+
+public class CPLEXSolver extends ILPExternalSolver {
+
+  private static final Logger logger = LogManager.getLogger(CPLEXSolver.class);
+
+
+  public CPLEXSolver(ILPTransformer transformer) {
+    super(transformer);
+  }
+
+  @Override
+  protected String[] getCommand(Path lp, Path solution, long remainingTimeForSolvingInMillis) {
+    String[] command = {
+        "cplex",
+        "-c",
+        "read " + lp.toAbsolutePath() +"",
+        "set clocktype 2",
+        " set timelimit " + remainingTimeForSolvingInMillis/1000,
+        "optimize",
+        "write " + solution.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 {
+    File file = solution.toFile();
+    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
+        .newInstance();
+
+      DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
+      Document document = documentBuilder.parse(file);
+
+      // iterate over all variables
+      NodeList variables = document.getDocumentElement().getElementsByTagName("variable");
+      logger.debug(variables.getLength());
+
+      for (int nodeIndex = 0; nodeIndex < variables.getLength(); nodeIndex++) {
+        Element variable = (Element)variables.item(nodeIndex);
+        String name = variable.getAttribute("name");
+        int value = Integer.valueOf(variable.getAttribute("value"));
+        logger.info("found variable {} with value {}", name, value);
+        if (value == 1) {
+          IlpVariable ilpVariable = ilp.resolve(name);
+          variablesSetToOne.add(ilpVariable);
+        }
+
+      }
+
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  @Override
+  public String getName() {
+    return "ilp-cplex";
+  }
+
+}
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 0f6686f140da3572f7002ceb5e53b3966f76cfc6..0eaed227347a73b656f15b88c2e541c81a9ae715 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
@@ -79,6 +79,7 @@ public abstract class ILPExternalSolver extends AbstractILPSolver {
       lp = Files.createTempFile("ilp", ".lp");
 //      solution = Files.createTempFile("solution", null);
       solutionReadable = Files.createTempFile("sol-read", ".sol");
+      Files.delete(solutionReadable);
     } 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());
diff --git a/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/AbstractCPLEXHandwrittenTest.java b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/AbstractCPLEXHandwrittenTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..76a9fa9a0dd47cb57934120f2c7dfafb1a99f2ee
--- /dev/null
+++ b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/AbstractCPLEXHandwrittenTest.java
@@ -0,0 +1,13 @@
+package de.tudresden.inf.st.mquat.solving;
+
+import de.tudresden.inf.st.mquat.solving.ilp.AbstractILPTransformer;
+import de.tudresden.inf.st.mquat.solving.ilp.CPLEXSolver;
+import de.tudresden.inf.st.mquat.solving.ilp.GurobiSolver;
+
+public class AbstractCPLEXHandwrittenTest extends AbstractHandwrittenTestSuite {
+  @Override
+  protected Solver getSolver() {
+    // set to false for debugging
+    return new CPLEXSolver(new AbstractILPTransformer()).setDeleteFilesOnExit(false);
+  }
+}
diff --git a/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/CPLEXHandwrittenTest.java b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/CPLEXHandwrittenTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..3d5a9dc17e994b686c8ba3a48a41a4e5de090356
--- /dev/null
+++ b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/CPLEXHandwrittenTest.java
@@ -0,0 +1,12 @@
+package de.tudresden.inf.st.mquat.solving;
+
+import de.tudresden.inf.st.mquat.solving.ilp.CPLEXSolver;
+import de.tudresden.inf.st.mquat.solving.ilp.ConcreteILPTransformer;
+
+public class CPLEXHandwrittenTest extends OptimalHandwrittenTestSuite {
+  @Override
+  protected Solver getSolver() {
+    // set to false for debugging
+    return new CPLEXSolver(new ConcreteILPTransformer()).setDeleteFilesOnExit(false);
+  }
+}