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 a544813e6949fdcbf6d665f35b555baa8e115b7a..a9156e409187bf8fb31c8585aa5dc1f281c5f3e1 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/BinaryHeap.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/BinaryHeap.java
@@ -4,7 +4,7 @@ import java.util.*;
 
 public class BinaryHeap {
     ArrayList<Double> list = new ArrayList();
-    HashMap<Integer, Integer> map = new HashMap<>();
+    HashMap<Integer, YoshikoEdge> map = new HashMap<>();
 
     public BinaryHeap(){
         list.add(Double.NEGATIVE_INFINITY);
@@ -14,7 +14,7 @@ public class BinaryHeap {
     public void add(YoshikoEdge edge){
 
         list.add(edge.maxIcfIcp);
-        map.put(list.size()-1, edge.edgeId);
+        map.put(list.size()-1, edge);
 
         checkParent(list.size()-1);
     }
@@ -46,7 +46,7 @@ public class BinaryHeap {
         }
     }
 
-    public int popMax(){
+    public YoshikoEdge popMax(){
         double maxVal = Double.NEGATIVE_INFINITY;
         for (Double i : list){
             if (i > maxVal){
@@ -56,7 +56,7 @@ public class BinaryHeap {
 
         int index = list.indexOf(maxVal);
 
-        int e = map.get(index);
+        YoshikoEdge e = map.get(index);
 
         map.replace(index, map.get(map.size()-1));
         map.remove(map.size()-1);
@@ -111,13 +111,13 @@ public class BinaryHeap {
         list.set(index, list.get(parentIndex));
         list.set(parentIndex, tmpVal);
 
-        int tmpId = map.get(index);
+        YoshikoEdge tmpEdge = map.get(index);
         map.replace(index, map.get(parentIndex));
-        map.replace(parentIndex, tmpId);
+        map.replace(parentIndex, tmpEdge);
     }
 
     private int getIndexFromValue(YoshikoEdge edge){
-        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
+        for (Map.Entry<Integer, YoshikoEdge> entry : map.entrySet()) {
             if (entry.getKey() == 0){
                 //Der erste DummyEintrag im Heap soll ignoriert werden
             }
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 cca1df2f7be2fc5b0a74dd9750b2702fd82686b8..2b3dc00f7ba47e60d1eb139703ad9fde4bc948da 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/ClusteringAlgorithm.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/ClusteringAlgorithm.java
@@ -133,20 +133,20 @@ public class ClusteringAlgorithm {
     private void workHeap(){
         while (bHeap.size() > 0){
             System.out.println(bHeap.size());
-            int edgeId = bHeap.popMax();
-            YoshikoEdge e = getEdge(edgeId);
+            YoshikoEdge e= bHeap.popMax();
+
 
             if (e.icf >= e.icp){
                 if(e.weight < 0){
                     clusteringCost -= e.weight;
                 }
-                //makeEdgePermanent(e);
+                makeEdgePermanent(e);
             }
             else{
                 if(e.weight > 0){
                     clusteringCost +=e.weight;
                 }
-                makeEdgeForbidden(e);
+                //makeEdgeForbidden(e);
             }
         }
     }
@@ -157,8 +157,15 @@ public class ClusteringAlgorithm {
 
         return edgeArray[u][v];
     }
-    /*
-    private void makeEdgePermanent(MyDefaultWeightedEdge e){
+
+    private YoshikoEdge getEdge(int u, int v){
+        if (u > v){
+            return edgeArray[u][v];
+        }
+        return edgeArray[v][u];
+    }
+
+    private void makeEdgePermanent(YoshikoEdge e){
         substactInfluenceOfVerticesOnIcfIcp(e);
 
         MyVertex mergedVertex = mergeVertexes(e);
@@ -169,6 +176,13 @@ public class ClusteringAlgorithm {
         System.out.println("perm");
     }
 
+    private void mergeVertexes(YoshikoEdge e){
+        e.weight = Double.POSITIVE_INFINITY;
+
+        
+    }
+
+
     /*
     private MyVertex mergeVertexes(MyDefaultWeightedEdge e){
         MyVertex p1 = g.getEdgeSource(e);
@@ -218,61 +232,56 @@ public class ClusteringAlgorithm {
             bHeap.add(edge);
         }
 
-    }
+    }*/
 
-    private void substactInfluenceOfVerticesOnIcfIcp(MyDefaultWeightedEdge e){
-        MyVertex p1 = g.getEdgeSource(e);
-        MyVertex p2 = g.getEdgeTarget(e);
+    private void substactInfluenceOfVerticesOnIcfIcp(YoshikoEdge e){
+        int p1 = e.source;
+        int p2 = e.target;
 
-        Set<MyDefaultWeightedEdge> edgeSet = g.edgeSet();
-        for (MyDefaultWeightedEdge edge : edgeSet){
-            MyVertex v1 = g.getEdgeSource(edge);
-            MyVertex v2 = g.getEdgeTarget(edge);
+        for (YoshikoEdge edge : bHeap.map.values()){
+            int v1 = edge.source;
+            int v2 = edge.target;
 
-            if (v1.equals(p1)||v1.equals(p2)||v2.equals(p1)||v2.equals(p2)){
+            if (v1==p1||v1==p2||v2==p1||v2==p2){
                 continue;
             }
 
             //Subtraiere Einfluss des Dreiecks v1p1v2 auf icf
-            MyDefaultWeightedEdge ux = g.getEdge(v1, p1);
-            MyDefaultWeightedEdge vx = g.getEdge(v2, p1);
+            YoshikoEdge ux = getEdge(v1, p1);
+            YoshikoEdge vx = getEdge(v2, p1);
 
-            if (g.getEdgeWeight(ux) > 0 && g.getEdgeWeight(vx) > 0){
-                edge.icf -= Math.min(g.getEdgeWeight(ux), g.getEdgeWeight(vx));
+            if (ux.weight > 0 && vx.weight > 0){
+                edge.icf -= Math.min(ux.weight, vx.weight);
             }
 
-            //Subtraiere Einfluss des Dreiecks v1p2v2 auf icf
-            ux = g.getEdge(v1, p2);
-            vx = g.getEdge(v2, p2);
+            //Subtraiere Einfluss des Dreiecks v1p1v2 auf icp
 
-            if (g.getEdgeWeight(ux) > 0 && g.getEdgeWeight(vx) > 0){
-                edge.icf -= Math.min(g.getEdgeWeight(ux), g.getEdgeWeight(vx));
+            if (ux.weight > 0 && vx.weight < 0){
+                edge.icp -= Math.min(ux.weight, -vx.weight);
+            }else if (ux.weight < 0 && vx.weight > 0){
+                edge.icp -= Math.min(-ux.weight, vx.weight);
             }
 
-            //Subtraiere Einfluss des Dreiecks v1p1v2 auf icp
-            ux = g.getEdge(v1, p1);
-            vx = g.getEdge(v2, p1);
+            //Subtraiere Einfluss des Dreiecks v1p2v2 auf icf
+            ux = getEdge(v1, p2);
+            vx = getEdge(v2, p2);
 
-            if (g.getEdgeWeight(ux) > 0 && g.getEdgeWeight(vx) < 0){
-                edge.icp -= Math.min(g.getEdgeWeight(ux), -g.getEdgeWeight(vx));
-            }else if (g.getEdgeWeight(ux) < 0 && g.getEdgeWeight(vx) > 0){
-                edge.icp -= Math.min(-g.getEdgeWeight(ux), g.getEdgeWeight(vx));
+            if (ux.weight > 0 && vx.weight > 0){
+                edge.icf -= Math.min(ux.weight, vx.weight);
             }
 
             //Subtraiere Einfluss des Dreiecks v1p2v2 auf icp
-            ux = g.getEdge(v1, p2);
-            vx = g.getEdge(v2, p2);
 
-            if (g.getEdgeWeight(ux) > 0 && g.getEdgeWeight(vx) < 0){
-                edge.icp -= Math.min(g.getEdgeWeight(ux), -g.getEdgeWeight(vx));
-            }else if (g.getEdgeWeight(ux) < 0 && g.getEdgeWeight(vx) > 0){
-                edge.icp -= Math.min(-g.getEdgeWeight(ux), g.getEdgeWeight(vx));
+            if (ux.weight > 0 && vx.weight < 0){
+                edge.icp -= Math.min(ux.weight, -vx.weight);
+            }else if (ux.weight < 0 && vx.weight > 0){
+                edge.icp -= Math.min(-ux.weight, vx.weight);
             }
 
-            edge.maxIcfIcp = Math.max(edge.icf, edge.icf);
+            edge.maxIcfIcp = Math.max(edge.icf, edge.icp);
         }
     }
-
+/*
     private void addInfluenceOfVertexOnIcfIcp(MyVertex mergedVertex) {
         Set<MyDefaultWeightedEdge> edgeSet = g.edgeSet();
 
@@ -305,6 +314,7 @@ public class ClusteringAlgorithm {
 
         }
     }*/
+    /*
 
     private void makeEdgeForbidden(MyDefaultWeightedEdge e){
         editInfluenzeOfForbiddenEdge(e);
@@ -312,7 +322,7 @@ public class ClusteringAlgorithm {
         g.setEdgeWeight(e, Double.NEGATIVE_INFINITY);
         bHeap.remove(e);
         System.out.println("rm");
-    }
+    }*/
 /*
     private void editInfluenzeOfForbiddenEdge(MyDefaultWeightedEdge forbiddenEdge){
         MyVertex x1 = g.getEdgeSource(forbiddenEdge);