diff --git a/jastadd-mquat-benchmark/build.gradle b/jastadd-mquat-benchmark/build.gradle
index 945310193b6bb88de3fef9a266ed74a72d9d5436..8af65710869459ddde81c454925f1e17388b603d 100644
--- a/jastadd-mquat-benchmark/build.gradle
+++ b/jastadd-mquat-benchmark/build.gradle
@@ -30,7 +30,7 @@ task benchmarkCustom(type: JavaExec, dependsOn: assemble) {
     classpath = sourceSets.test.runtimeClasspath
     main = 'de.tudresden.inf.st.mquat.benchmark.CustomBenchmarkMain'
     systemProperty "java.library.path", project.glpkPath
-    jvmArgs("-XX:+UnlockCommercialFeatures", "-XX:+FlightRecorder", "-XX:StartFlightRecording=settings=profile", "-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,dumponexitpath=results/fr", "-Xverify:none")
+//    jvmArgs("-XX:+UnlockCommercialFeatures", "-XX:+FlightRecorder", "-XX:StartFlightRecording=settings=profile", "-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,dumponexitpath=results/fr", "-Xverify:none")
 }
 
 task benchmarkFull(type: JavaExec, dependsOn: assemble) {
diff --git a/jastadd-mquat-solver-ilp/build.gradle b/jastadd-mquat-solver-ilp/build.gradle
index fcdb26bacaed33bbb4b969877546967edd1b4dc4..8c4fec8f2d50a8f5c986b0eb6fce44e64ca78ea7 100644
--- a/jastadd-mquat-solver-ilp/build.gradle
+++ b/jastadd-mquat-solver-ilp/build.gradle
@@ -13,6 +13,7 @@ dependencies {
     compile group: 'org.gnu.glpk', name: 'glpk-java', version: '1.11.0'
     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'
+    compile 'nz.ac.waikato.cms.weka:weka-stable:3.8.3'
     compile project(':jastadd-mquat-base')
     compile project(':jastadd-mquat-solver')
     testCompile project(path: ':jastadd-mquat-solver', configuration: 'testArtifacts')
diff --git a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/clustering/HardwareComponent.java b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/clustering/HardwareComponent.java
new file mode 100644
index 0000000000000000000000000000000000000000..5f334aafebf7769a311fffff28899a9e13ab04a9
--- /dev/null
+++ b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/clustering/HardwareComponent.java
@@ -0,0 +1,35 @@
+package de.tudresden.inf.st.mquat.solving.clustering;
+
+import de.tudresden.inf.st.mquat.jastadd.model.Resource;
+import weka.core.DenseInstance;
+import weka.core.Instance;
+
+/***
+ * An entity unifying WEKA instances and Jastadd resources
+ */
+public class HardwareComponent {
+
+    private Resource resource;
+    private Instance instance;
+
+    public HardwareComponent(Resource resource, int attributes_number) {
+        this.resource = resource;
+        this.instance = new DenseInstance(attributes_number);
+    }
+
+    public Resource getResource() {
+        return resource;
+    }
+
+    public void setResource(Resource resource) {
+        this.resource = resource;
+    }
+
+    public Instance getInstance() {
+        return instance;
+    }
+
+    public void setInstance(Instance instance) {
+        this.instance = instance;
+    }
+}
diff --git a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/clustering/KMeans.java b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/clustering/KMeans.java
new file mode 100644
index 0000000000000000000000000000000000000000..04ea64d311d9ef28b6a7bb9e4017636ecf6c6a59
--- /dev/null
+++ b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/clustering/KMeans.java
@@ -0,0 +1,106 @@
+package de.tudresden.inf.st.mquat.solving.clustering;
+
+import de.tudresden.inf.st.mquat.jastadd.model.Resource;
+import de.tudresden.inf.st.mquat.jastadd.model.Root;
+import weka.clusterers.*;
+import weka.core.Attribute;
+import weka.core.Instances;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+/***
+ * Wrapper for WEKA SimpleKMeans. Clustering based on:
+ * CPU frequency
+ * RAM total
+ * Disk total
+ * Network throughput
+ *
+ * @author Dmytro Pukhkaiev
+ * @version 0.1
+ */
+public class KMeans{
+    // dataset
+    private Instances resources;
+    // number of clusters
+    private int k;
+    // list of resources
+    private ArrayList<HardwareComponent> hardwareComponentList = new ArrayList<>();
+
+    public KMeans(Root model) {
+        // create attributes for instances
+        Attribute cpu = new Attribute("cpu");
+        Attribute ram = new Attribute("ram");
+        Attribute disk = new Attribute("disk");
+        Attribute network = new Attribute("network");
+        ArrayList<Attribute> attributeList = new ArrayList<Attribute>();
+        attributeList.add(cpu);
+        attributeList.add(ram);
+        attributeList.add(disk);
+        attributeList.add(network);
+
+        // create a dataset
+        resources = new Instances("resources", attributeList, 0);
+
+        //instantiate items in the dataset
+        for (Resource resource : model.getHardwareModel().getResourceList()) {
+            if (resource.getType().getName().getName().equals("ComputeNode")) {
+                HardwareComponent hardwareComponent = new HardwareComponent(resource, resource.getNumSubResource());
+                hardwareComponent.getInstance().setDataset(resources);
+
+                for (Resource sub : resource.getSubResourceList()) {
+                    String typeName = sub.getType().getName().getName();
+                    switch (typeName) {
+                        case "CPU":
+                            hardwareComponent.getInstance().setValue(cpu, sub.getCurrentValueByPropertyName("frequency"));
+                            break;
+                        case "RAM":
+                            hardwareComponent.getInstance().setValue(ram, sub.getCurrentValueByPropertyName("total"));
+                            break;
+                        case "DISK":
+                            hardwareComponent.getInstance().setValue(disk, sub.getCurrentValueByPropertyName("total"));
+                            break;
+                        case "NETWORK":
+                            hardwareComponent.getInstance().setValue(network, sub.getCurrentValueByPropertyName("throughput"));
+                            break;
+                        default:
+                            throw new RuntimeException("Unable to transform unknown resource of type" + typeName);
+                    }
+                }
+
+                hardwareComponentList.add(hardwareComponent);
+            }
+        }
+
+        for (HardwareComponent hwc : hardwareComponentList)
+            resources.add(hwc.getInstance());
+
+        k = (int) (0.2 * model.getHardwareModel().getResourceList().asJavaCollection().size());
+
+    }
+
+    public Map<Integer, ArrayList<Resource>> buildClusters(){
+
+        SimpleKMeans algorithm = new SimpleKMeans();
+        Map<Integer, ArrayList<Resource>> Clusters = new HashMap<>();
+
+        for (int i = 0; i < k; i ++)
+            Clusters.put(i, new ArrayList<>());
+        try {
+            algorithm.setNumClusters(k);
+            algorithm.setPreserveInstancesOrder(true);
+            algorithm.buildClusterer(resources);
+
+            int[] assignments = algorithm.getAssignments();
+
+            for (int i = 0; i < assignments.length; i++){
+                Clusters.get(assignments[i]).add(hardwareComponentList.get(i).getResource());
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return Clusters;
+    }
+}
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 3538ce52d36b140ab926dd76e7258b5e32872da5..cb99848e7a313b5abc14df936495e46eb3fbac74 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
@@ -2,12 +2,10 @@ package de.tudresden.inf.st.mquat.solving.ilp;
 
 import de.tudresden.inf.st.mquat.generator.ScenarioDescription;
 import de.tudresden.inf.st.mquat.generator.ScenarioGenerator;
-import de.tudresden.inf.st.mquat.jastadd.model.ILP;
-import de.tudresden.inf.st.mquat.jastadd.model.MquatWriteSettings;
-import de.tudresden.inf.st.mquat.jastadd.model.Root;
-import de.tudresden.inf.st.mquat.jastadd.model.Solution;
+import de.tudresden.inf.st.mquat.jastadd.model.*;
 import de.tudresden.inf.st.mquat.solving.Solver;
 import de.tudresden.inf.st.mquat.solving.SolvingException;
+import de.tudresden.inf.st.mquat.solving.clustering.KMeans;
 import de.tudresden.inf.st.mquat.utils.StopWatch;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -16,6 +14,8 @@ import org.gnu.glpk.GLPK;
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Map;
 import java.util.Scanner;
 import java.util.concurrent.TimeUnit;
 
@@ -90,6 +90,8 @@ 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();
+    KMeans kMeans = new KMeans(model);
+    Map<Integer, ArrayList<Resource>> clusters = kMeans.buildClusters();
     Solver external = new GLPKSolver().setDeleteFilesOnExit(false);
     Solution solution = external.solve(model);
     logger.info(model.print(new MquatWriteSettings(" ")));