diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/core/ParameterSet.java b/src/main/java/de/hhu/ba/yoshikoWrapper/core/ParameterSet.java
index 166d95fa6fea99dd36a3d259c42b1ab359b45377..48f16393d246de1980579ce2ee4d826f293e0d8c 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/core/ParameterSet.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/core/ParameterSet.java
@@ -85,7 +85,7 @@ public class ParameterSet implements TunableValidator
 	 * Default constructor, initializes the column mappings to provide a selection of fitting columns
 	 */
 	public ParameterSet() {
-		
+
 		ArrayList<CyColumn> numericColumns = new ArrayList<CyColumn>();
 		
 		//Only numeric columns are relevant for weight mapping
@@ -108,7 +108,7 @@ public class ParameterSet implements TunableValidator
 		permanentColumn = new ListSingleSelection<CyColumn>(booleanColumns);
 		
 		//Don't select any columns by default
-		weightColumn.setSelectedValue(numericColumns.get(1));
+		weightColumn.setSelectedValue(null);
 		forbiddenColumn.setSelectedValue(null);
 		permanentColumn.setSelectedValue(null);
 
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/BinaryHeap.java b/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/BinaryHeap.java
index cba75fb0352814b5a736c8117b6498e0bfeedbdf..9837502d5317a557d1a7ed7175516efa81d75ab3 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/BinaryHeap.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/BinaryHeap.java
@@ -5,28 +5,42 @@ import java.util.*;
 public class BinaryHeap {
     ArrayList<Double> list = new ArrayList();
     HashMap<Integer, YoshikoEdge> map = new HashMap<>();
+    HashMap<YoshikoEdge, Integer> reverseMap = new HashMap<>();
+    int k = -1;
 
     public BinaryHeap(){
         list.add(Double.NEGATIVE_INFINITY);
         map.put(0, null);
+        reverseMap.put(null, 0);
     }
 
-    public void add(YoshikoEdge edge){
+    public void addMaxIcfIcp(YoshikoEdge edge){
 
         list.add(edge.maxIcfIcp);
         map.put(list.size()-1, edge);
+        reverseMap.put(edge, list.size()-1);
 
         checkParent(list.size()-1);
-    }
 
-    public void add(Set<YoshikoEdge> edgeSet){
-        for(YoshikoEdge edge : edgeSet){
-            add(edge);
+        if (list.size()-1 == 30864){
+            System.out.println("asd");
         }
     }
 
+    public void addIcfMinusIcp(YoshikoEdge edge){
+        list.add(edge.icfMinusIcp);
+        map.put(list.size()-1, edge);
+
+        reverseMap.put(edge, list.size()-1);
+
+        checkParent(list.size()-1);
+    }
+
     public void remove(YoshikoEdge edge){
-        int index = getIndexFromValue(edge);
+        if (!reverseMap.containsKey(edge)){
+            return;
+        }
+        int index = reverseMap.get(edge);
 
         if (edge.weight != Double.NEGATIVE_INFINITY){
             //System.out.println("MELDUNG 5");
@@ -37,23 +51,7 @@ public class BinaryHeap {
             return;
         }
 
-        map.replace(index, map.get(map.size()-1));
-        map.remove(map.size()-1);
-
-        list.set(index, list.get(list.size()-1));
-        list.remove(list.size()-1);
-    }
-
-
-    public void  removeIncidentEdges(int n1, int n2){
-
-    }
-
-
-    public void remove(Set<YoshikoEdge> edgeSet){
-        for (YoshikoEdge edge : edgeSet){
-            remove(edge);
-        }
+        saveRemove(index, edge);
     }
 
     public YoshikoEdge popMax(){
@@ -68,24 +66,46 @@ public class BinaryHeap {
 
         YoshikoEdge e = map.get(index);
 
+        saveRemove(index, e);
+
+        return e;
+    }
+
+    private void saveRemove(int index, YoshikoEdge e) {
         map.replace(index, map.get(map.size()-1));
         map.remove(map.size()-1);
 
+        YoshikoEdge movedEdge = map.get(index);
+
+        reverseMap.replace(movedEdge, index);
+        reverseMap.remove(e);
+
         list.set(index, list.get(list.size()-1));
         list.remove(list.size()-1);
-
-        return e;
     }
 
 
+    public void updateEdge(YoshikoEdge edge){
+        if (!reverseMap.containsKey(edge)){
+            return;
+        }
+        int index = reverseMap.get(edge);
+
+        if (index < 0){
+            return;
+        }
 
-    public void checkUptatedNode(YoshikoEdge edge){
-        int index = getIndexFromValue(edge);
+        if (k<0){
+            list.set(index, edge.maxIcfIcp);
+        }else {
+            list.set(index, edge.icfMinusIcp);
+        }
 
         checkParent(index);
         checkChild(index);
     }
 
+
     public int size(){
         return list.size()-1;
     }
@@ -121,20 +141,17 @@ public class BinaryHeap {
         list.set(index, list.get(parentIndex));
         list.set(parentIndex, tmpVal);
 
-        YoshikoEdge tmpEdge = map.get(index);
-        map.replace(index, map.get(parentIndex));
-        map.replace(parentIndex, tmpEdge);
-    }
 
-    private int getIndexFromValue(YoshikoEdge edge){
-        for (Map.Entry<Integer, YoshikoEdge> entry : map.entrySet()) {
-            if (entry.getKey() == 0){
-                //Der erste DummyEintrag im Heap soll ignoriert werden
-            }
-            else if (entry.getValue().edgeId == edge.edgeId) {
-                return entry.getKey();
-            }
-        }
-        return -1;
+        YoshikoEdge edge1 = map.get(index);
+        YoshikoEdge edge2 = map.get(parentIndex);
+
+        Integer index1 = reverseMap.get(edge1);
+        Integer index2 = reverseMap.get(edge2);
+
+        map.replace(index, edge2);
+        map.replace(parentIndex, edge1);
+
+        reverseMap.replace(edge1, index2);
+        reverseMap.replace(edge2, index1);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/ClusteringAlgorithm.java b/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/ClusteringAlgorithm.java
index c82f42afdf75f71122f742bffcae32fd5efb84f2..35fa265661fa06e77111572846ed898448efdc99 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/ClusteringAlgorithm.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/ClusteringAlgorithm.java
@@ -12,28 +12,32 @@ public class ClusteringAlgorithm {
     private int numberOfNodes;
     List<Integer> nodeList;
     List<List<Integer>> clusters;
+    int k=-1;
+    int nodeInClusters;
 
 
     public ClusteringAlgorithm(YoshikoEdge[][] edgeArray){
         this.edgeArray = edgeArray;
         numberOfNodes = edgeArray.length;
         clusters = new ArrayList<>();
+        clusteringCost = 0;
     }
 
-    public List<List<Integer>> runAlgorithm(){
-        clusteringCost = 0;
+    public List<List<Integer>> runClusteringAlgorithm(){
+        initializeQueue();
 
-        bHeap = new BinaryHeap();
+        if (k < 0) {
+            while (bHeap.size() > 0) {
+                workHeap();
+            }
+        }else {
+            while (numberOfNodes-nodeInClusters > k) {
+                workHeap();
+            }
+        }
 
-        initializeQueue();
 
-        workHeap();
         addSingleNodesToClusters();
-        int counter = 0;
-        List<Integer> list = new ArrayList<>();
-        for (List<Integer> cluster : clusters){
-            counter += cluster.size();
-        }
 
         System.out.println(clusteringCost);
         return clusters;
@@ -41,14 +45,19 @@ public class ClusteringAlgorithm {
 
     private void initializeQueue(){
         bHeap = new BinaryHeap();
+        bHeap.k = k;
 
         for (int i=1; i<numberOfNodes; i++){
             for (int j=0; j<i; j++){
-                YoshikoEdge edge = initIcfIcp(i,j);
-                bHeap.add(edge);
+                YoshikoEdge edge = calculateIcfIcp(i,j);
+                if (k<1){
+                    bHeap.addMaxIcfIcp(edge);
+                } else {
+                    bHeap.addIcfMinusIcp(edge);
+                }
+
             }
         }
-        System.out.println("MELDUNG 2");
         initializeNodeList();
     }
 
@@ -59,11 +68,10 @@ public class ClusteringAlgorithm {
         }
     }
 
-    private YoshikoEdge initIcfIcp(int u, int v){
+    private YoshikoEdge calculateIcfIcp(int u, int v){
         double icf = 0;
         double icp = 0;
 
-
         YoshikoEdge edge = edgeArray[u][v];
 
         if (edge == null){
@@ -105,6 +113,9 @@ public class ClusteringAlgorithm {
         edge.icf = icf;
         edge.icp = icp;
         edge.maxIcfIcp = Math.max(icf, icp);
+        edge.icfMinusIcp = icf-icp;
+
+        bHeap.updateEdge(edge);
 
         return edge;
     }
@@ -118,34 +129,18 @@ public class ClusteringAlgorithm {
 
 
     private void workHeap(){
-        int minH = 99999999;
-        while (bHeap.size() > 0){
-            if (minH < bHeap.size()){
-                System.out.println("MELDUNG 4");
-            }
-            if (bHeap.size()==21649){
-                System.out.println("MELDUNG 6");
-            }
-            minH=bHeap.size();
-            System.out.println(bHeap.size());
-            YoshikoEdge e=bHeap.popMax();
+        System.out.println(bHeap.size());
+        YoshikoEdge e=bHeap.popMax();
 
 
-            if (e.icf >= e.icp){
-                if(e.weight < 0){
-                    clusteringCost -= e.weight;
-                }
-                makeEdgePermanent(e);
-            }
-            else{
-                if(e.weight > 0){
-                    clusteringCost +=e.weight;
-                }
-                makeEdgeForbidden(e);
-            }
-            if (clusteringCost == Double.POSITIVE_INFINITY){
-                System.out.println("MELDUNG 7");
-            }
+        if (e.icf >= e.icp|| k > -1){
+            makeEdgePermanent(e);
+        }
+        else{
+            makeEdgeForbidden(e);
+        }
+        if (clusteringCost == Double.POSITIVE_INFINITY){
+            System.out.println("MELDUNG 7");
         }
     }
 
@@ -164,6 +159,10 @@ public class ClusteringAlgorithm {
     }
 
     private void makeEdgePermanent(YoshikoEdge e){
+        if(e.weight < 0){
+            clusteringCost -= e.weight;
+        }
+
         substactInfluenceOfVerticesOnIcfIcp(e);
 
         mergeVertexes(e);
@@ -206,8 +205,8 @@ public class ClusteringAlgorithm {
                 bHeap.remove(e1);
             }
         }
-        Integer k = n2;
-        nodeList.remove(k);
+        Integer o = n2;
+        nodeList.remove(o);
     }
 
     private void calculateNewEdgesIcfIcp(int node1){
@@ -224,7 +223,7 @@ public class ClusteringAlgorithm {
             if (e.weight == Double.NEGATIVE_INFINITY){
                 continue;
             }
-            initIcfIcp(node1, node2);
+            calculateIcfIcp(node1, node2);
         }
     }
 
@@ -276,6 +275,8 @@ public class ClusteringAlgorithm {
             }
 
             edge.maxIcfIcp = Math.max(edge.icf, edge.icp);
+            edge.icfMinusIcp = edge.icf-edge.icp;
+            bHeap.updateEdge(edge);
         }
     }
 
@@ -307,11 +308,17 @@ public class ClusteringAlgorithm {
                 edge.icp += Math.min(-ux.weight, vx.weight);
             }
 
+            edge.maxIcfIcp = Math.max(edge.icf, edge.icp);
+            edge.icfMinusIcp = edge.icf-edge.icp;
+            bHeap.updateEdge(edge);
         }
     }
 
 
     private void makeEdgeForbidden(YoshikoEdge e) {
+        if(e.weight > 0){
+            clusteringCost +=e.weight;
+        }
         editInfluenzeOfForbiddenEdge(e);
 
         e.weight=Double.NEGATIVE_INFINITY;
@@ -349,6 +356,7 @@ public class ClusteringAlgorithm {
                     edge1.icp += edge2.weight+forbiddenEdge.weight;
                 }
             }
+            bHeap.updateEdge(edge1);
 
             if (forbiddenEdge.weight>0 && edge1.weight > 0){
                 edge2.icf -= Math.min(forbiddenEdge.weight, edge1.weight);
@@ -362,18 +370,17 @@ public class ClusteringAlgorithm {
                     edge2.icp += edge1.weight+forbiddenEdge.weight;
                 }
             }
+            bHeap.updateEdge(edge2);
         }
     }
 
     private void putInCluster(YoshikoEdge edge){
+        nodeInClusters++;
         Integer x1 = edge.source;
         Integer x2 = edge.target;
 
         int indexOfx1 = -1;
         int indexOfx2 = -1;
-        if (edge.source == 242|| edge.target == 242){
-            System.out.println("asdasda");
-        }
         for (List<Integer> cluster : clusters){
             if (cluster.contains(x1)){
                 indexOfx1 = clusters.indexOf(cluster);
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/GraphTranslator.java b/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/GraphTranslator.java
index 0a7aa5cb92b2190e6e22633ddb736fe0259827fb..19625141bb846ebd751666fcc0e81b04237addfc 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/GraphTranslator.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/GraphTranslator.java
@@ -123,7 +123,7 @@ public final class GraphTranslator {
     }
 
     private void addEdgesToResultNetwork(List<List<Integer>> clusters, CySubNetwork resultNetwork){
-        for (List<Integer> cluster : clusters){
+         for (List<Integer> cluster : clusters){
             for (Integer i : cluster){
                 for (Integer j : cluster){
                     if (j<i){
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/YoshikoAlgoritmController.java b/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/YoshikoAlgoritmController.java
index 4c74d695e74b29e11a0f8642a88d0b6e40180431..12c2a44403c51b05cf82be2d32aa0326f766c138 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/YoshikoAlgoritmController.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/YoshikoAlgoritmController.java
@@ -1,20 +1,13 @@
 package de.hhu.ba.yoshikoWrapper.yoshikoAlgorithm;
 
-import de.hhu.ba.yoshikoWrapper.core.CyCore;
 import de.hhu.ba.yoshikoWrapper.core.ParameterSet;
-import org.cytoscape.model.CyEdge;
 import org.cytoscape.model.CyNetwork;
-import org.cytoscape.model.CyNode;
-import org.cytoscape.model.CyTable;
-import org.jgrapht.Graph;
-import org.jgrapht.graph.SimpleWeightedGraph;
 
-import java.util.Collection;
 import java.util.List;
-import java.util.Set;
 
 public class YoshikoAlgoritmController {
 
+    private int k = 19;
     private CyNetwork network;
     private ParameterSet parameterSet;
 
@@ -28,8 +21,15 @@ public class YoshikoAlgoritmController {
         YoshikoEdge[][] edgeArray = translator.translateGraph();
 
         ClusteringAlgorithm clusteringAlgorithm = new ClusteringAlgorithm(edgeArray);
-        List<List<Integer>> clusters = clusteringAlgorithm.runAlgorithm();
+        clusteringAlgorithm.k = k;
+
+        List<List<Integer>> clusters;
+
+        clusters = clusteringAlgorithm.runClusteringAlgorithm();
+
         translator.makeCytoscapeGraph(clusters);
+
+        System.out.println("asdadasd");
     }
 
 
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/YoshikoEdge.java b/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/YoshikoEdge.java
index bed8d8e272f5943a620116038f005f848891c062..e2e7d666df3a8fbb750e3a2a605c56b3c2b60160 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/YoshikoEdge.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/YoshikoEdge.java
@@ -11,6 +11,7 @@ public class YoshikoEdge {
     double icf;
     double icp;
     double maxIcfIcp;
+    double icfMinusIcp;
 
     public YoshikoEdge(long suid, double weight, int edgeId){
         this.suid = suid;