diff --git a/pom.xml b/pom.xml
index 9c858d656abc1e935ecbf9b68c689258d6c2314f..453fd7a724a91c0e6a807bbfbd95118fbbc97931 100644
--- a/pom.xml
+++ b/pom.xml
@@ -33,7 +33,7 @@
 
 	<groupId>de.hhu.ba</groupId>
 	<artifactId>yoshikoWrapper</artifactId>
-	<version>0.1.1</version>
+	<version>0.1.3</version>
 
 	<name>YoshikoWrapper</name>
 
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/core/CyCore.java b/src/main/java/de/hhu/ba/yoshikoWrapper/core/CyCore.java
index 5276babe2d4bb9018f4186003989c671df1dee00..e51449e2435f1bf8899a0b74e4b9bb89c888203d 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/core/CyCore.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/core/CyCore.java
@@ -21,6 +21,8 @@
  ******************************************************************************/
 package de.hhu.ba.yoshikoWrapper.core;
 
+import java.util.concurrent.CountDownLatch;
+
 import org.cytoscape.application.CyApplicationManager;
 import org.cytoscape.application.swing.CySwingApplication;
 import org.cytoscape.model.CyNetwork;
@@ -36,6 +38,10 @@ import org.cytoscape.view.presentation.RenderingEngineFactory;
 import org.cytoscape.view.vizmap.VisualMappingFunctionFactory;
 import org.cytoscape.view.vizmap.VisualMappingManager;
 import org.cytoscape.view.vizmap.VisualStyleFactory;
+import org.cytoscape.work.FinishStatus;
+import org.cytoscape.work.ObservableTask;
+import org.cytoscape.work.TaskIterator;
+import org.cytoscape.work.TaskObserver;
 import org.cytoscape.work.swing.DialogTaskManager;
 import org.osgi.framework.BundleContext;
 
@@ -68,4 +74,25 @@ public class CyCore {
 	public static String getConfig(String key) {
 		return cm.getProperties().getProperty(key);
 	}
+
+	/**
+	 * Convenience function that runs all tasks in a task iterator but blocks until all tasks are finished
+	 * @param taskIterator
+	 * @throws InterruptedException
+	 */
+	public static synchronized void runAndWait(TaskIterator taskIterator) throws InterruptedException {
+		CountDownLatch blockLatch = new CountDownLatch(1);
+		dialogTaskManager.execute(taskIterator,new TaskObserver() {
+
+			@Override
+			public void taskFinished(ObservableTask task) {}
+
+			@Override
+			public void allFinished(FinishStatus finishStatus) {
+				blockLatch.countDown();
+			}
+
+		});
+		blockLatch.await();
+	}
 }
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/core/StatusInformer.java b/src/main/java/de/hhu/ba/yoshikoWrapper/core/StatusInformer.java
index 32987a6c85ebdd96999187462c39cabf7dd17cde..cbc49a77cbcdcc91e12c6a13e351ce872eb5bc53 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/core/StatusInformer.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/core/StatusInformer.java
@@ -44,7 +44,9 @@ public class StatusInformer extends CplexInformer {
 	@Override
 	public void updateStatus(YoshikoState state, double value) {
 		if (state == YoshikoState.SOLVING_ILP){
-			taskMonitor.setStatusMessage(LocalizationManager.get("currentGap")+": "+SwingUtil.twoDecimals.format(value)+"%");
+			if (value <= 1.0) {
+				taskMonitor.setStatusMessage(LocalizationManager.get("currentGap")+": "+SwingUtil.twoDecimals.format(value)+"%");
+			}
 		}
 	}
 
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/core/YoshUtil.java b/src/main/java/de/hhu/ba/yoshikoWrapper/core/YoshUtil.java
index 1dee005777ccb195f646d7880b0288cc1930c15f..b85271e2678b27b813e1517ad1980646d9635149 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/core/YoshUtil.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/core/YoshUtil.java
@@ -1,5 +1,6 @@
 package de.hhu.ba.yoshikoWrapper.core;
 
+
 import org.osgi.framework.Version;
 
 public class YoshUtil {
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/cytoUtil/GraphAnalyzer.java b/src/main/java/de/hhu/ba/yoshikoWrapper/cytoUtil/GraphAnalyzer.java
new file mode 100644
index 0000000000000000000000000000000000000000..dfc6d39ea6efbcff99994b46f3b760d66d3610ca
--- /dev/null
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/cytoUtil/GraphAnalyzer.java
@@ -0,0 +1,50 @@
+package de.hhu.ba.yoshikoWrapper.cytoUtil;
+
+import java.util.List;
+
+import org.cytoscape.model.CyEdge;
+import org.cytoscape.model.CyNetwork;
+
+public class GraphAnalyzer {
+	public static boolean isMultiGraph(CyNetwork net) {
+		//TODO: Better algorithm?
+
+
+		int n = net.getNodeCount();
+		List<CyEdge> edges = net.getEdgeList();
+
+		//Easiest check: Check if the graph contains more edges than a complete graph
+		if (edges.size() > (n*(n-1))/2) {
+			return true;
+		}
+
+		for (int i = 0; i < edges.size()-1; i++) {
+			for (int j=i+1; j<edges.size();j++) {
+				if (connectSameNodes(edges.get(i),edges.get(j))){
+					return true;
+				}
+			}
+		}
+
+		return false;
+	}
+
+	private static boolean connectSameNodes(CyEdge e1, CyEdge e2) {
+		if (//Treating all edges as undirected here
+				(e1.getSource() == e2.getTarget() && e1.getTarget() == e2.getSource()) ||
+				(e1.getSource() == e2.getSource() && e1.getTarget() == e2.getTarget())
+				) {
+			return true;
+		}
+		return false;
+	}
+
+	public static boolean isDirected(CyNetwork net) {
+		for (CyEdge e: net.getEdgeList()) {
+			if (e.isDirected()) {
+				return true;
+			}
+		}
+		return false;
+	}
+}
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoCluster.java b/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoCluster.java
index 6495bbe23556c5a9b2a6f21a52a9b8ed5a0e831e..7ad9b61f9d7300e41adf3cbeb2b8d908f0a1e81f 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoCluster.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoCluster.java
@@ -28,7 +28,6 @@ import java.util.List;
 
 import javax.swing.ImageIcon;
 import javax.swing.JLabel;
-import javax.swing.SwingUtilities;
 
 import org.cytoscape.model.CyEdge;
 import org.cytoscape.model.CyNetwork;
@@ -39,9 +38,10 @@ import org.cytoscape.model.subnetwork.CySubNetwork;
 import org.cytoscape.view.layout.CyLayoutAlgorithm;
 import org.cytoscape.view.model.CyNetworkView;
 import org.cytoscape.view.presentation.RenderingEngine;
-import org.cytoscape.work.Task;
+import org.cytoscape.work.FinishStatus;
+import org.cytoscape.work.ObservableTask;
 import org.cytoscape.work.TaskIterator;
-import org.cytoscape.work.TaskMonitor;
+import org.cytoscape.work.TaskObserver;
 import org.slf4j.Logger;
 
 import de.hhu.ba.yoshikoWrapper.core.CyCore;
@@ -61,6 +61,9 @@ public class YoshikoCluster {
 
 	private Image img;
 
+	private CySubNetwork subnet;
+
+
 	//SYMBOLIC LINKS
 	private final YoshikoSolution solution;
 	private Logger logger = YoshikoLogger.getInstance().getLogger();
@@ -90,43 +93,54 @@ public class YoshikoCluster {
 	}
 
 	/**
-	 * Generates a subgraph for this cluster by choosing the nodes and induced edges from the original graph
+	 * Generates a subgraph for this clusters by choosing the nodes and induced edges from the original graph if such a graph doesn't exist yet.
 	 * @return
 	 */
 	public CySubNetwork getSubNetwork() {
 
-		CyRootNetwork originalGraphAsRoot =
-				CyCore.rootNetworkManager.getRootNetwork(solution.getOriginalGraph());
-
-		//Create nested graph and cluster subnet
-		ArrayList<CyEdge> inducedEdges = new ArrayList<CyEdge>();
-		for (CyNode n: nodes) {
-			//Sadly Cytoscape doesnt provide a comfort function here
-			List<CyEdge> adjacentEdges = solution.getOriginalGraph().getAdjacentEdgeList(n, CyEdge.Type.ANY);
-			for (CyEdge e: adjacentEdges) {
-				if (nodes.contains(e.getSource()) && nodes.contains(e.getTarget())) {
-					inducedEdges.add(e);
+		if (subnet == null) {
+			CyRootNetwork originalGraphAsRoot =
+					CyCore.rootNetworkManager.getRootNetwork(solution.getOriginalGraph());
+
+			//Create nested graph and clusters subnet
+			ArrayList<CyEdge> inducedEdges = new ArrayList<CyEdge>();
+			for (CyNode n: nodes) {
+				//Sadly Cytoscape doesnt provide a comfort function here
+				List<CyEdge> adjacentEdges = solution.getOriginalGraph().getAdjacentEdgeList(n, CyEdge.Type.ANY);
+
+				for (CyEdge e: adjacentEdges) {
+					if (nodes.contains(e.getSource()) && nodes.contains(e.getTarget())) {
+						inducedEdges.add(e);
+					}
 				}
 			}
-		}
-
-		CySubNetwork subnet = originalGraphAsRoot.addSubNetwork(nodes ,inducedEdges);
 
-		subnet.getRow(subnet).set(CyNetwork.NAME, LocalizationManager.get("cluster")+" "+(id+1));
+			subnet = originalGraphAsRoot.addSubNetwork(nodes ,inducedEdges);
+			subnet.getRow(subnet).set(CyNetwork.NAME, LocalizationManager.get("clusters")+" "+(id+1));
+		}
 
 		return subnet;
 	}
 
+	public void highlight() {
+		if (CyCore.cy.getCurrentNetwork() == solution.getOriginalGraph()) {
+			highlightInOriginalGraph();
+		}
+		else if (CyCore.cy.getCurrentNetwork() == solution.getMetaGraph()) {
+			solution.highlightInMetaGraph(this);
+		}
+	}
+
 	/**
-	 * Attempt to select the nodes belonging to this cluster in the original Graph given that they still exist
+	 * Attempt to select the nodes belonging to this clusters in the original Graph given that they still exist
 	 */
-	public void highlightInOriginalGraph() {
+	private void highlightInOriginalGraph() {
 		try {
 			List<CyRow> allRows = solution.getOriginalGraph().getDefaultNodeTable().getAllRows();
 			for (CyRow r: allRows) {
 				r.set("selected", false);
 			}
-			//Select nodes corresponding to the cluster
+			//Select nodes corresponding to the clusters
 			for (CyNode n : nodes) {
 				solution.getOriginalGraph().getRow(n).set("selected", true);
 			}
@@ -136,67 +150,38 @@ public class YoshikoCluster {
 		}
 	}
 
-
-	public void applyImage(JLabel label, int width, int height) throws Exception {
-
-		if (img != null) {
-			label.setIcon(new ImageIcon(img));
-		}
-		else {
-			getImage(width,height,label);
-		}
-	}
-
-	private void getImage(int width, int height,JLabel label) {
+	public void generateClusterIcon(int width, int height,JLabel label) throws InterruptedException {
 		final CyNetworkView view = CyCore.networkViewFactory.createNetworkView(getSubNetwork());
 
-		//layout cluster
+		//layout clusters
 		final CyLayoutAlgorithm layout = CyCore.layoutAlgorithmManager.getDefaultLayout();
-		final TaskIterator createLayout = layout.createTaskIterator(
+		CyCore.runAndWait(layout.createTaskIterator(
 			view,
 			layout.getDefaultLayoutContext(),
 			CyLayoutAlgorithm.ALL_NODE_VIEWS,
 			null
+			)
 		);
 
-		createLayout.append(
-			new Task() {
-
-				@Override
-				public void run(TaskMonitor taskMonitor) throws Exception {
-					taskMonitor.setStatusMessage("Generating cluster view for C:"+id);
-
-
-					view.setVisualProperty(NETWORK_WIDTH, new Double(width));
-					view.setVisualProperty(NETWORK_HEIGHT, new Double(height));
-					view.fitContent();
+		view.setVisualProperty(NETWORK_WIDTH, new Double(width));
+		view.setVisualProperty(NETWORK_HEIGHT, new Double(height));
+		view.fitContent();
 
-					StyleManager.style(view, CyCore.visualMappingManager.getCurrentVisualStyle());
+		StyleManager.style(view, CyCore.visualMappingManager.getCurrentVisualStyle());
 
-					RenderingEngine<CyNetwork> renderingEngine = CyCore.renderingEngineFactory.createRenderingEngine(label, view);
-					SwingUtilities.invokeLater(new Runnable() {
+		RenderingEngine<CyNetwork> renderingEngine = CyCore.renderingEngineFactory.createRenderingEngine(label, view);
 
-						@Override
-						public void run() {
-							img = renderingEngine.createImage(width,height);
-							label.setIcon(new ImageIcon(img));
-							renderingEngine.dispose();
-							view.dispose();
-						}
-
-					});
-
-
-				}
-				@Override
-				public void cancel() {}
+		img = renderingEngine.createImage(width,height);
+		label.setIcon(new ImageIcon(img));
 
-			}
-	    );
+		renderingEngine.dispose();
+		view.dispose();
+	}
 
-		CyCore.dialogTaskManager.execute(
-				createLayout
-		);
+	public void delete() {
+		if (subnet != null) {
+			CyCore.networkManager.destroyNetwork(subnet);
+		}
 	}
 
 	public int getSize() {
@@ -215,4 +200,8 @@ public class YoshikoCluster {
 		return solution.getOriginalGraph().getRow(n).get("name", String.class);
 	}
 
+
+
+
+
 }
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoResult.java b/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoResult.java
index 461e136ec5c00c1262ef610079af74eff7b9472a..b2441e51e7f980f045986c10438796b23d953dae 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoResult.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoResult.java
@@ -71,5 +71,11 @@ public class YoshikoResult {
 		return originalGraph;
 	}
 
+	public void delete() {
+		for (YoshikoSolution s: solutions) {
+			s.delete();
+		}
+	}
+
 
 }
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoSolution.java b/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoSolution.java
index bf4a8a1e9a9325a052fe5f4b0778130c141550cc..542cce2a728bd40503573b4951e4b17117eedb55 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoSolution.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoSolution.java
@@ -22,19 +22,36 @@
 package de.hhu.ba.yoshikoWrapper.graphModel;
 
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import javax.swing.JOptionPane;
 
 import org.cytoscape.model.CyNetwork;
+import org.cytoscape.model.CyNode;
+import org.cytoscape.model.CyRow;
+import org.slf4j.Logger;
+
+import de.hhu.ba.yoshikoWrapper.core.CyCore;
+import de.hhu.ba.yoshikoWrapper.logging.YoshikoLogger;
 
 public class YoshikoSolution {
 
 	private final YoshikoResult result;
 
-	public ArrayList<YoshikoCluster> cluster;
+	private CyNetwork metaGraph;
+	private HashMap<YoshikoCluster, CyNode> metaGraphMap;
+
+
+	public ArrayList<YoshikoCluster> clusters;
 
 	private final long id;
 
+	private Logger logger = YoshikoLogger.getInstance().getLogger();
+
+
 	public YoshikoSolution(YoshikoResult yoshikoResult, long id) {
-		cluster = new ArrayList<YoshikoCluster>();
+		clusters = new ArrayList<YoshikoCluster>();
 		this.result = yoshikoResult;
 		this.id = id;
 	}
@@ -42,7 +59,7 @@ public class YoshikoSolution {
 	//_____________GETTER / SETTER ________________//
 
 	public ArrayList<YoshikoCluster> getClusters() {
-		return cluster;
+		return clusters;
 	}
 
 	/**
@@ -56,4 +73,37 @@ public class YoshikoSolution {
 		return result.getOriginalGraph();
 	}
 
+	public void delete() {
+		for (YoshikoCluster c: clusters) {
+			c.delete();
+		}
+		if (this.metaGraph != null) {
+			CyCore.networkManager.destroyNetwork(metaGraph);
+		}
+	}
+
+	public void setMetaGraph(CyNetwork metaGraph, HashMap<YoshikoCluster, CyNode> map) {
+		this.metaGraph = metaGraph;
+		this.metaGraphMap = map;
+	}
+
+	public CyNetwork getMetaGraph() {
+		return metaGraph;
+	}
+
+	public void highlightInMetaGraph(YoshikoCluster yoshikoCluster) {
+		try {
+			List<CyRow> allRows = metaGraph.getDefaultNodeTable().getAllRows();
+			for (CyRow r: allRows) {
+				r.set("selected", false);
+			}
+
+			metaGraph.getRow(metaGraphMap.get(yoshikoCluster)).set("selected", true);
+		}
+		catch (Exception e) {
+			logger.warn("The graph doesn't exist anymore, can't highlight nodes!");
+		}
+
+	}
+
 }
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/help/HelpLinks.java b/src/main/java/de/hhu/ba/yoshikoWrapper/help/HelpLinks.java
index 3b6b5d5ec5f3b7633a0682bcd573fa9ecb63654d..3c77e1c6ed3b106244588407cd430f9bdcaede43 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/help/HelpLinks.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/help/HelpLinks.java
@@ -49,7 +49,8 @@ public final class HelpLinks {
 	/**
 	 * The base location of the bachelor thesis paper
 	 */
-	private static final String docLocation = "file:///home/philipp/workspace/cs/BachelorThesis/YoshikoWrapper/thesis/tex/Thesis.pdf";
+	//TODO: Add final location when published
+	private static final String docLocation = "https://gitlab.cs.uni-duesseldorf.de/spohr/YoshikoWrapper/tree/master";
 
 	/**
 	 * A HashMap linking Classes to a link, pointing to a specific subsection of the BachelorThesis paper that is relevant for understanding the Class
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/swing/components/ClusterView.java b/src/main/java/de/hhu/ba/yoshikoWrapper/swing/components/ClusterView.java
index 2cbb3a4868bb1986b1e687b24400169a54f14ab0..573a1767cadddfb90496405fde813f70c9291a54 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/swing/components/ClusterView.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/swing/components/ClusterView.java
@@ -42,6 +42,7 @@ import de.hhu.ba.yoshikoWrapper.core.LocalizationManager;
 import de.hhu.ba.yoshikoWrapper.graphModel.YoshikoCluster;
 import de.hhu.ba.yoshikoWrapper.swing.GraphicsLoader;
 import de.hhu.ba.yoshikoWrapper.swing.SwingUtil;
+import de.hhu.ba.yoshikoWrapper.tasks.AlgorithmTask;
 
 @SuppressWarnings("serial")
 public class ClusterView extends JPanel {
@@ -76,17 +77,17 @@ public class ClusterView extends JPanel {
 
 		//Swing init
 
-		title = new JLabel(LocalizationManager.get("cluster")+" "+(c.getID()+1));
+		title = new JLabel(LocalizationManager.get("clusters")+" "+(c.getID()+1));
 		clusterSize = new JLabel(LocalizationManager.get("clusterSize")+" "+c.getSize());
 		icon = new JLabel();
 		//icon.setBorder(BorderFactory.createLineBorder(Color.BLACK));
-		cluster.applyImage(icon,CLUSTER_ICON_SIZE, CLUSTER_ICON_SIZE);
+		cluster.generateClusterIcon(CLUSTER_ICON_SIZE, CLUSTER_ICON_SIZE,icon);
 
 		SwingUtil.addAll(this,title,clusterSize,icon);
 
 		nodeList = new BasicCollapsiblePanel(LocalizationManager.get("nodes"));
 
-		//Loop over nodes in the cluster and add them to the view
+		//Loop over nodes in the clusters and add them to the view
 		for (CyNode n : c.getSubNetwork().getNodeList()) {
 			nodeList.add(
 				new JLabel(
@@ -147,7 +148,7 @@ public class ClusterView extends JPanel {
 
 		@Override
 		public void mouseEntered(MouseEvent e) {
-			cluster.highlightInOriginalGraph();
+			cluster.highlight();
 			setBorder(isSelected ? selectedBorder : highlightBorder);
 		}
 
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/swing/components/MainPanel.java b/src/main/java/de/hhu/ba/yoshikoWrapper/swing/components/MainPanel.java
index 5a5289a1e143f89a8ff491cec91f943bed282ef8..b97cc6cfe268a1f09d640c4875159a3bd4221610 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/swing/components/MainPanel.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/swing/components/MainPanel.java
@@ -49,6 +49,7 @@ import javax.swing.ScrollPaneConstants;
 
 import org.cytoscape.application.swing.CytoPanelComponent;
 import org.cytoscape.application.swing.CytoPanelName;
+import org.cytoscape.model.CyNetwork;
 import org.cytoscape.util.swing.BasicCollapsiblePanel;
 import org.cytoscape.work.AbstractTask;
 import org.cytoscape.work.TaskIterator;
@@ -57,6 +58,7 @@ import de.hhu.ba.yoshikoWrapper.core.CyCore;
 import de.hhu.ba.yoshikoWrapper.core.LocalizationManager;
 import de.hhu.ba.yoshikoWrapper.core.ParameterSet;
 import de.hhu.ba.yoshikoWrapper.core.YoshikoLoader;
+import de.hhu.ba.yoshikoWrapper.cytoUtil.GraphAnalyzer;
 import de.hhu.ba.yoshikoWrapper.swing.AboutDialogFactory;
 import de.hhu.ba.yoshikoWrapper.swing.GraphicsLoader;
 import de.hhu.ba.yoshikoWrapper.swing.LanguageSwitcherPanel;
@@ -263,6 +265,32 @@ public class MainPanel extends JPanel implements CytoPanelComponent {
 		@Override
 		public void actionPerformed(ActionEvent e) {
 
+			CyNetwork networkToBeProcessed = CyCore.cy.getCurrentNetwork();
+
+			//WARNINGS FOR FEATURES THAT ARE NOT RESEARCHED
+			//TODO: (Obviously) research!
+			if (GraphAnalyzer.isMultiGraph(networkToBeProcessed)) {
+				JOptionPane.showMessageDialog(
+						null,
+						LocalizationManager.get("multiGraphWarning"),
+						LocalizationManager.get("optionpane_title"),
+						JOptionPane.WARNING_MESSAGE
+				);
+			}
+
+			//Annotation: Currently Cytoscape is really weird concerning directed/undirected edges
+			//There is an API function isDirected() for edges but all edges are directed
+			//I'll leave this commented out until CS makes sense
+
+//			if (GraphAnalyzer.isDirected(networkToBeProcessed)) {
+//				JOptionPane.showMessageDialog(
+//						null,
+//						LocalizationManager.get("directedGraphWarning"),
+//						LocalizationManager.get("optionpane_title"),
+//						JOptionPane.WARNING_MESSAGE
+//				);
+//			}
+
 			//SWING BLACK MAGIC
 			Window noWindow = null;
 			JDialog statusWindow = new JDialog(noWindow);
@@ -277,7 +305,7 @@ public class MainPanel extends JPanel implements CytoPanelComponent {
 			if (YoshikoLoader.isLibraryLoaded()){
 				AbstractTask yoshiko = new AlgorithmTask(
 					popupLevel,
-					CyCore.cy.getCurrentNetwork(),
+					networkToBeProcessed,
 					fetchParameter()
 				);
 				/**
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/swing/components/ResultPanel.java b/src/main/java/de/hhu/ba/yoshikoWrapper/swing/components/ResultPanel.java
index 09d41554c356d1f2b3ef86008dc66b80dfa9bc6a..99c559ec934807e8ce3bf5d4381e334e39aec8a2 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/swing/components/ResultPanel.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/swing/components/ResultPanel.java
@@ -25,20 +25,26 @@ import static javax.swing.GroupLayout.*;
 
 import java.awt.Color;
 import java.awt.Component;
+import java.awt.Dimension;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Properties;
 
 import javax.swing.BoxLayout;
 import javax.swing.GroupLayout;
-import javax.swing.GroupLayout.Group;
+import javax.swing.GroupLayout.ParallelGroup;
+import javax.swing.GroupLayout.SequentialGroup;
 import javax.swing.Icon;
 import javax.swing.JButton;
 import javax.swing.JLabel;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JTabbedPane;
+import javax.swing.LayoutStyle;
+import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
 
 import org.cytoscape.application.swing.CytoPanelComponent;
 import org.cytoscape.application.swing.CytoPanelName;
@@ -55,6 +61,7 @@ import org.cytoscape.model.events.AddedNodesListener;
 import org.cytoscape.model.events.NetworkAboutToBeDestroyedEvent;
 import org.cytoscape.model.events.NetworkAboutToBeDestroyedListener;
 import org.cytoscape.util.swing.BasicCollapsiblePanel;
+import org.cytoscape.view.model.CyNetworkView;
 
 import de.hhu.ba.yoshikoWrapper.core.CyCore;
 import de.hhu.ba.yoshikoWrapper.core.LocalizationManager;
@@ -78,9 +85,6 @@ NetworkAboutToBeDestroyedListener
 
 	//MACRO
 
-	//TODO: (Nächstes Leben) find a good solution with Swing that scales the panel and respects layout
-	private static final int HACKFIX_FIXED_WIDTH = 128+256;
-
 	private final JTabbedPane tabbedPane;
 
 	private final JButton destroyButton;
@@ -93,6 +97,11 @@ NetworkAboutToBeDestroyedListener
 
 	private boolean isValid;
 
+	//SWING LAYOUT
+
+	private ParallelGroup horizontalGroup;
+	private SequentialGroup verticalGroup;
+
 	public ResultPanel(YoshikoResult result) throws Exception {
 
 		this.result = result;
@@ -101,6 +110,7 @@ NetworkAboutToBeDestroyedListener
 
 		//Init subcomponents
 		invalidLabel = new JLabel();
+		invalidLabel.setHorizontalAlignment(SwingConstants.CENTER);
 		tabbedPane = new JTabbedPane();
 
 		solutionTabs = new ArrayList<SolutionTab>();
@@ -114,11 +124,16 @@ NetworkAboutToBeDestroyedListener
 			solutionTabs.add(tab);
 		}
 
+		marker = new BasicCollapsiblePanel(LocalizationManager.get("solutionMarker"));
+		marker.setLayout(new BoxLayout(marker,BoxLayout.Y_AXIS));
+
+		JLabel costLabel = new JLabel(LocalizationManager.get("cost")+" "+result.getFlags().getTotalCost());
+		marker.add(costLabel);
+
 		if (result.getFlags().getIlpGenerated()) {
 			//TODO: Move to MarkerPanel for better codestyle
 			//Optional Markers
-			marker = new BasicCollapsiblePanel(LocalizationManager.get("ilpMarker"));
-			marker.setLayout(new BoxLayout(marker,BoxLayout.Y_AXIS));
+
 			if(result.getFlags().getOptimal()) {
 				JLabel optimalLabel;
 				optimalLabel = new JLabel(LocalizationManager.get("optimal"));
@@ -133,15 +148,15 @@ NetworkAboutToBeDestroyedListener
 				marker.add(new JLabel(result.getFlags().getSolvedInstances()+"/"+result.getFlags().getReducedInstances()+" "+LocalizationManager.get("redSolved")));
 				marker.add(new JLabel(LocalizationManager.get("lastInstanceGap")+" "+(int)(100*result.getFlags().getLastGap())+"%"));
 			}
-			JLabel costLabel = new JLabel(LocalizationManager.get("cost")+" "+result.getFlags().getTotalCost());
-			marker.add(costLabel);
+
 			if (result.getFlags().getTimedOut()) {
 				marker.add(new JLabel(LocalizationManager.get("timeoutMarker")));
 			}
 			marker.setCollapsed(false);
-			this.add(marker);
 		}
 
+		this.add(marker);
+
 		destroyButton = new JButton(LocalizationManager.get("discardSolution"));
 		destroyButton.addActionListener(new ActionListener() {
 
@@ -157,30 +172,35 @@ NetworkAboutToBeDestroyedListener
 		//Layout
 		GroupLayout layout = new GroupLayout(this);
 
-		Group horizontalGroup = layout.createParallelGroup(Alignment.LEADING,true);
-		Group verticalGroup = layout.createSequentialGroup();
+		horizontalGroup = layout.createParallelGroup(Alignment.CENTER,true);
+		verticalGroup = layout.createSequentialGroup();
 
 		layout.setHorizontalGroup(horizontalGroup);
 		layout.setVerticalGroup(verticalGroup);
 
-		if (result.getFlags().getIlpGenerated()) {
-			horizontalGroup.addComponent(marker,DEFAULT_SIZE,DEFAULT_SIZE,DEFAULT_SIZE);
-			verticalGroup.addComponent(marker,DEFAULT_SIZE,DEFAULT_SIZE,PREFERRED_SIZE);
-		}
-
 		horizontalGroup
-			.addComponent(invalidLabel,HACKFIX_FIXED_WIDTH, PREFERRED_SIZE,Short.MAX_VALUE)
-			.addComponent(tabbedPane,HACKFIX_FIXED_WIDTH, PREFERRED_SIZE,Short.MAX_VALUE)
+			.addComponent(marker,DEFAULT_SIZE,DEFAULT_SIZE,DEFAULT_SIZE)
+			.addComponent(invalidLabel,DEFAULT_SIZE, PREFERRED_SIZE,Short.MAX_VALUE)
+			.addComponent(tabbedPane,DEFAULT_SIZE, PREFERRED_SIZE,Short.MAX_VALUE)
 			.addComponent(destroyButton,DEFAULT_SIZE, DEFAULT_SIZE,DEFAULT_SIZE);
 		verticalGroup
-			.addComponent(invalidLabel,DEFAULT_SIZE, PREFERRED_SIZE,Short.MAX_VALUE)
+			.addComponent(marker,DEFAULT_SIZE,DEFAULT_SIZE,PREFERRED_SIZE)
+			.addComponent(invalidLabel,DEFAULT_SIZE, DEFAULT_SIZE,DEFAULT_SIZE)
 			.addComponent(tabbedPane,DEFAULT_SIZE, DEFAULT_SIZE,PREFERRED_SIZE)
+			.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, DEFAULT_SIZE, Short.MAX_VALUE)
 			.addComponent(destroyButton,DEFAULT_SIZE, DEFAULT_SIZE,PREFERRED_SIZE);
 
 		layout.setAutoCreateGaps(true);
 		layout.setAutoCreateContainerGaps(true);
 
+		SwingUtilities.invokeLater(new Runnable() {
+
+			@Override
+			public void run() {
+				revalidate();
+			}
 
+		});
 		this.setLayout(layout);
 
 		registerAllListeners();
@@ -196,6 +216,7 @@ NetworkAboutToBeDestroyedListener
 	}
 
 	public void deleteSolution() {
+
 		int dialogResult = JOptionPane.showConfirmDialog (
 				null,
 				LocalizationManager.get("deleteSolution"),
@@ -205,9 +226,19 @@ NetworkAboutToBeDestroyedListener
 		if (dialogResult != JOptionPane.YES_OPTION) {
 			return;
 		}
+
+		//Restore view
+		if (result.getOriginalGraph() != null) {
+			Collection<CyNetworkView> viewsToReturn = CyCore.networkViewManager.getNetworkViews(result.getOriginalGraph());
+			if (!viewsToReturn.isEmpty()) {
+				CyCore.cy.setCurrentNetworkView(viewsToReturn.iterator().next());
+			}
+		}
+
 		CyCore.registrar.unregisterService(this,CytoPanelComponent.class);
-		removeAll();
+		result.delete();
 		super.setVisible(false);
+
 	}
 
 	private void invalidateResult() {
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/swing/components/SolutionTab.java b/src/main/java/de/hhu/ba/yoshikoWrapper/swing/components/SolutionTab.java
index 0bf5bcac60f8a493aacc75c91ff87e2cc9e433f9..ea88fc6d78134d0aaae55e9474af8381405c0229 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/swing/components/SolutionTab.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/swing/components/SolutionTab.java
@@ -86,14 +86,14 @@ public class SolutionTab extends JPanel {
 		//Declaration of Swing Components
 		clusterViewList = new ClusterViewList();
 
-		for (YoshikoCluster c: solution.cluster) {
+		for (YoshikoCluster c: solution.clusters) {
 			ClusterView clusterView = new ClusterView(c);
 			clusterViewList.add(clusterView);
 		}
 
 		scrollPane = new JScrollPane(clusterViewList);
 
-		clusterCount = new JLabel(LocalizationManager.get("clusterFound")+" "+s.cluster.size());
+		clusterCount = new JLabel(LocalizationManager.get("clusterFound")+" "+s.clusters.size());
 
 		createClusterView = new JButton(LocalizationManager.get("createClusterView"));
 		createMetaGraph = new JButton(LocalizationManager.get("createMetaGraph"));
@@ -170,7 +170,7 @@ public class SolutionTab extends JPanel {
 				.addGap(8)
 				.addComponent(clusterCount,DEFAULT_SIZE,DEFAULT_SIZE,DEFAULT_SIZE)
 				.addGap(8)
-				.addComponent(scrollPane,PREFERRED_SIZE,DEFAULT_SIZE,Short.MAX_VALUE)
+				.addComponent(scrollPane,DEFAULT_SIZE,DEFAULT_SIZE,Short.MAX_VALUE)
 				.addComponent(createClusterView,DEFAULT_SIZE,DEFAULT_SIZE,DEFAULT_SIZE)
 				.addComponent(createMetaGraph,DEFAULT_SIZE,DEFAULT_SIZE,DEFAULT_SIZE)
 		);
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/tasks/AlgorithmTask.java b/src/main/java/de/hhu/ba/yoshikoWrapper/tasks/AlgorithmTask.java
index 70568cf9914887ce8537afca0e515923153f85e2..c3a0af7cf9d43f7ed73d7a696a075fa918513e82 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/tasks/AlgorithmTask.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/tasks/AlgorithmTask.java
@@ -78,7 +78,7 @@ public class AlgorithmTask extends AbstractTask {
 
 	private ResultPanel resultPanel;
 
-	public AlgorithmTask(// <<< Too many variables here, some should be grouped later TODO:
+	public AlgorithmTask(
 			Window statusWindow,
 			CyNetwork net,
 			ParameterSet parameterSet
@@ -92,6 +92,7 @@ public class AlgorithmTask extends AbstractTask {
 	@Override
 	public void run(TaskMonitor taskMonitor) throws Exception {
 
+		//TODO: Improve setProgress values
 
 		taskMonitor.setTitle(LocalizationManager.get("yoshTask"));
 		taskMonitor.setProgress(0.0);
@@ -134,9 +135,9 @@ public class AlgorithmTask extends AbstractTask {
 				parameterSet.solCount,
 				parameterSet.reductionRulesBitMask,
 				parameterSet.snrMultFactor,
+				parameterSet.useHeuristic,
 				parameterSet.usePartitionCuts,
-				parameterSet.useTriangleCuts,
-				parameterSet.useHeuristic
+				parameterSet.useTriangleCuts
 		);
 
 
@@ -169,30 +170,30 @@ public class AlgorithmTask extends AbstractTask {
 			//Fetch number of clusters in the solution
 			long numberOfClusters = result.getNumberOfClusters(i);
 
-			//Loop over cluster
+			//Loop over clusters
 			for (long k=0;k<numberOfClusters;k++) {
 				//Create java instance
 				YoshikoCluster cluster = new YoshikoCluster(solution,k);
 
 
-				taskMonitor.setStatusMessage("Processing cluster "+(k+1)+" of "+numberOfClusters);
+				taskMonitor.setStatusMessage("Processing clusters "+(k+1)+" of "+numberOfClusters);
 
 				IntVector clusterVector = result.getCluster(i, k);
 
 				long sizeOfCluster = clusterVector.size();
 				for (int l=0;l<sizeOfCluster;l++) { //Unsafe mismatch int long
-					taskMonitor.setStatusMessage("Processing node "+(l+1)+ " of "+sizeOfCluster);
+					//taskMonitor.setStatusMessage("Processing node "+(l+1)+ " of "+sizeOfCluster);
 					int nodeID = clusterVector.get(l);
 					CyNode node = nodeMap.indexOf(nodeID); //<<< Another int/long conversion
 					cluster.addNode(node);
 
 					net.getRow(node).set(columnName, ""+(k+1)); //Add Cluster ID in table (Remove in final version?)
 				}
-				//Register cluster with solution for further reference
-				solution.cluster.add(cluster);
+				//Register clusters with solution for further reference
+				solution.clusters.add(cluster);
 			}
 			//Sort clusters by size, descending as the biggest clusters are usually the most relevant
-			solution.cluster.sort(YoshikoCluster.lessThanComparator);
+			solution.clusters.sort(YoshikoCluster.lessThanComparator);
 			//Register solution with result for further reference
 			yoshikoResult.addSolution(solution);
 		}
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/tasks/CreateClusterViews.java b/src/main/java/de/hhu/ba/yoshikoWrapper/tasks/CreateClusterViews.java
index a681836cfa8bd4108aa63e6f35d49a69943a4042..103d03c1d7f44689433c8e3c1c70aa757be47b26 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/tasks/CreateClusterViews.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/tasks/CreateClusterViews.java
@@ -5,8 +5,11 @@ import java.util.ArrayList;
 import org.cytoscape.model.subnetwork.CySubNetwork;
 import org.cytoscape.view.layout.CyLayoutAlgorithm;
 import org.cytoscape.view.model.CyNetworkView;
+import org.cytoscape.work.FinishStatus;
+import org.cytoscape.work.ObservableTask;
 import org.cytoscape.work.Task;
 import org.cytoscape.work.TaskMonitor;
+import org.cytoscape.work.TaskObserver;
 
 import de.hhu.ba.yoshikoWrapper.core.CyCore;
 import de.hhu.ba.yoshikoWrapper.core.LocalizationManager;
@@ -15,38 +18,81 @@ import de.hhu.ba.yoshikoWrapper.graphModel.YoshikoCluster;
 
 public class CreateClusterViews implements Task {
 
+	//TODO: Merge redundant code with CreateMetaGraphTask
+
 	private ArrayList<YoshikoCluster> clusters;
 
+	private boolean isTerminated;
+
+	/**
+	 * Used to fall back upon cancellation
+	 */
+	private CyNetworkView previousView;
+
+	/**
+	 * This internal list is used to track which networks have already been initialized.
+	 * This is used to remove those views upon cancellation.
+	 */
+	private ArrayList<CySubNetwork> initializedSubNetworks;
+
 	public CreateClusterViews(ArrayList<YoshikoCluster> clusters) {
 		this.clusters = clusters;
+
+		this.previousView = CyCore.cy.getCurrentNetworkView();
+		this.isTerminated = false;
+		this.initializedSubNetworks = new ArrayList<CySubNetwork>();
 	}
 
 	@Override
 	public void run(TaskMonitor taskMonitor) throws Exception {
+
+		taskMonitor.setTitle(LocalizationManager.get("task_ccv"));
+
 		CyLayoutAlgorithm layout = CyCore.layoutAlgorithmManager.getDefaultLayout();
 		for (YoshikoCluster c : clusters) {
+			if (this.isTerminated) {
+				throw new Exception("Terminated by user!"); //TODO: Localize
+			}
 			CySubNetwork subnet = c.getSubNetwork();
+			initializedSubNetworks.add(subnet);
 			taskMonitor.setStatusMessage(LocalizationManager.get("status_createCV")+" "+(c.getID()+1));
-			CyCore.networkManager.addNetwork(subnet);
+			CyCore.networkManager.addNetwork(subnet,false);
 			//Create network view and register it
 			CyNetworkView subnetView = CyCore.networkViewFactory.createNetworkView(subnet);
-			//layout cluster
+			//layout clusters
 			CyCore.dialogTaskManager.execute(
 				layout.createTaskIterator(
 						subnetView,
 						layout.getDefaultLayoutContext(),
 						CyLayoutAlgorithm.ALL_NODE_VIEWS,
 						null
-				)
+				),
+				new TaskObserver() {
+
+					@Override
+					public void taskFinished(ObservableTask task) {}
+
+					@Override
+					public void allFinished(FinishStatus finishStatus) {
+						StyleManager.style(subnetView,CyCore.visualMappingManager.getCurrentVisualStyle());
+						CyCore.networkViewManager.addNetworkView(subnetView);
+					}
+
+				}
 			);
 
-			StyleManager.style(subnetView,CyCore.visualMappingManager.getCurrentVisualStyle());
 
-			CyCore.networkViewManager.addNetworkView(subnetView);
 		}
 	}
 
 	@Override
-	public void cancel() {}
+	public void cancel() {
+		this.isTerminated = true;
+		//Remove generated ClusterViews
+		for (CySubNetwork v: initializedSubNetworks) {
+			CyCore.networkManager.destroyNetwork(v);
+		}
+		CyCore.cy.setCurrentNetworkView(previousView);
+	}
 
 }
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/tasks/CreateMetaGraphTask.java b/src/main/java/de/hhu/ba/yoshikoWrapper/tasks/CreateMetaGraphTask.java
index b5fd244dac47e3ddd763bd5913998d8131332f7c..a82a9802e07b1d4417c01d26758edc1f5a9c4c80 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/tasks/CreateMetaGraphTask.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/tasks/CreateMetaGraphTask.java
@@ -1,7 +1,10 @@
 package de.hhu.ba.yoshikoWrapper.tasks;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 
+import javax.swing.SwingUtilities;
+
 import org.cytoscape.model.CyEdge;
 import org.cytoscape.model.CyNetwork;
 import org.cytoscape.model.CyNode;
@@ -10,9 +13,11 @@ import org.cytoscape.model.subnetwork.CySubNetwork;
 import org.cytoscape.view.layout.CyLayoutAlgorithm;
 import org.cytoscape.view.model.CyNetworkView;
 import org.cytoscape.work.AbstractTask;
+import org.cytoscape.work.FinishStatus;
+import org.cytoscape.work.ObservableTask;
 import org.cytoscape.work.Task;
-import org.cytoscape.work.TaskIterator;
 import org.cytoscape.work.TaskMonitor;
+import org.cytoscape.work.TaskObserver;
 
 import de.hhu.ba.yoshikoWrapper.core.CyCore;
 import de.hhu.ba.yoshikoWrapper.core.LocalizationManager;
@@ -20,16 +25,30 @@ import de.hhu.ba.yoshikoWrapper.cytoUtil.StyleManager;
 import de.hhu.ba.yoshikoWrapper.graphModel.YoshikoCluster;
 import de.hhu.ba.yoshikoWrapper.graphModel.YoshikoSolution;
 
-public class CreateMetaGraphTask extends AbstractTask {
+public class CreateMetaGraphTask extends AbstractTask{
 
 	private final YoshikoSolution solution;
 
+	private boolean isTerminated;
+
+	/**
+	 * This internal list is used to track which networks have already been initialized.
+	 * This is used to remove those views upon cancellation.
+	 */
+	private ArrayList<CySubNetwork> initializedSubNetworks;
+
 	public CreateMetaGraphTask(YoshikoSolution s) {
 		this.solution = s;
+
+		this.isTerminated = false;
+		this.initializedSubNetworks = new ArrayList<CySubNetwork>();
 	}
 
 	@Override
 	public void run(TaskMonitor taskMonitor) throws Exception {
+
+		taskMonitor.setTitle(LocalizationManager.get("task_cmg"));
+
 		CyNetwork metaGraph = CyCore.networkFactory.createNetwork();
 
 		metaGraph.getRow(metaGraph).set(CyNetwork.NAME, LocalizationManager.get("metaGraph"));
@@ -44,18 +63,27 @@ public class CreateMetaGraphTask extends AbstractTask {
 		HashMap<YoshikoCluster,CyNode> map = new HashMap<YoshikoCluster,CyNode>();
 
 
+
 		//Add nodes
 		for (YoshikoCluster c: solution.getClusters()) {
 
+			if(isTerminated) {
+				throw new Exception("Terminated by user!");
+			}
+
 			CyNode clusterNode = metaGraph.addNode();
 			CySubNetwork subnet = c.getSubNetwork();
+			//Store reference
+			this.initializedSubNetworks.add(subnet);
 
 			taskMonitor.setStatusMessage(LocalizationManager.get("status_createCV")+" "+(c.getID()+1));
-			CyCore.networkManager.addNetwork(subnet);
+			CyCore.networkManager.addNetwork(subnet,false);
 			//Create network view and register it
 			CyNetworkView subnetView = CyCore.networkViewFactory.createNetworkView(subnet);
-			//layout cluster
-			CyCore.dialogTaskManager.execute(
+
+			//Apply layout
+			CyCore.runAndWait(
+
 				layout.createTaskIterator(
 						subnetView,
 						layout.getDefaultLayoutContext(),
@@ -66,24 +94,37 @@ public class CreateMetaGraphTask extends AbstractTask {
 
 			StyleManager.style(subnetView,CyCore.visualMappingManager.getCurrentVisualStyle());
 
-			CyCore.networkViewManager.addNetworkView(subnetView);
+			CyCore.networkViewManager.addNetworkView(subnetView,false);
 
+			//Link clusters node in meta graph and subnet graph to use Cytoscape Nested Network feature
 			clusterNode.setNetworkPointer(subnet);
 			//Set node attributes
-			metaGraph.getRow(clusterNode).set("name", LocalizationManager.get("cluster")+" "+c.getID());
+			metaGraph.getRow(clusterNode).set("name", LocalizationManager.get("clusters")+" "+c.getID());
 			metaGraph.getRow(clusterNode).set(StyleManager.CLUSTERSIZE_COLUMN_NAME,c.getSize());
 			map.put(c, clusterNode);
 		}
+
+		//EDGE_PROCESSING
+		//We are checking if any edges in the original graph connect clusters, if so we count them
+
 		taskMonitor.setStatusMessage(LocalizationManager.get("metaGraph_edges"));
-		//Add edges (O(|C|^2*|V|^2) can maybe be improved? //TODO
-		for (YoshikoCluster c1:solution.getClusters()) {
-			for (YoshikoCluster c2:solution.getClusters()) {
+
+		for (int x = 0; x <solution.getClusters().size(); x ++) {
+			YoshikoCluster c1 = solution.getClusters().get(x);
+			for (int y = x; y <solution.getClusters().size(); y ++) {
+				YoshikoCluster c2 = solution.getClusters().get(y);
+
+				if(isTerminated) {
+					throw new Exception("Terminated by user!");
+				}
+
 				if (
 						metaGraph.containsEdge(map.get(c1),map.get(c2))
 						|| c1 == c2
 						) {
 					continue;
 				}
+				//TODO: Improve running time here?
 				for (CyNode c1n : c1.getSubNetwork().getNodeList()) {
 					for (CyNode c2n : c2.getSubNetwork().getNodeList()) {
 						if (solution.getOriginalGraph().containsEdge(c1n, c2n) || solution.getOriginalGraph().containsEdge(c2n, c1n)) {
@@ -103,34 +144,24 @@ public class CreateMetaGraphTask extends AbstractTask {
 			}
 		}
 
+		solution.setMetaGraph(metaGraph,map);
+
 		CyNetworkView view = CyCore.networkViewFactory.createNetworkView(metaGraph);
 
 		//Layout and style solution
-
-		TaskIterator it = layout.createTaskIterator(
-				view,
-				layout.getDefaultLayoutContext(),
-				CyLayoutAlgorithm.ALL_NODE_VIEWS,
-				null
+		CyCore.runAndWait(
+			layout.createTaskIterator(
+					view,
+					layout.getDefaultLayoutContext(),
+					CyLayoutAlgorithm.ALL_NODE_VIEWS,
+					null
+			)
 		);
 
-		it.append(new Task() {
-
-			@Override
-			public void run(TaskMonitor taskMonitor) throws Exception {
-				StyleManager.styleWithMapping(view, CyCore.visualMappingManager.getCurrentVisualStyle());
-			}
-
-			@Override
-			public void cancel() {}
+		StyleManager.styleWithMapping(view, CyCore.visualMappingManager.getCurrentVisualStyle());
 
-		});
 
-		CyCore.dialogTaskManager.execute(
-			it
-		);
-
-		CyCore.networkManager.addNetwork(metaGraph);
+		CyCore.networkManager.addNetwork(metaGraph,false);
 		CyCore.networkViewManager.addNetworkView(
 			view
 		);
@@ -138,6 +169,17 @@ public class CreateMetaGraphTask extends AbstractTask {
 		view.updateView();
 
 		CyCore.cy.setCurrentNetworkView(view);
+
+	}
+
+	@Override
+	public void cancel() {
+		//Set killswitch
+		isTerminated = true;
+		//Remove generated ClusterViews
+		for (CySubNetwork v: initializedSubNetworks) {
+			CyCore.networkManager.destroyNetwork(v);
+		}
 	}
 
 }
diff --git a/src/main/resources/YoshikoStrings.properties b/src/main/resources/YoshikoStrings.properties
index 75d34207e234662c01ba1b1a8cad786a651f99e1..6230ba12f61605dbd47eb4271b4b221bb9c8bf40 100644
--- a/src/main/resources/YoshikoStrings.properties
+++ b/src/main/resources/YoshikoStrings.properties
@@ -19,10 +19,14 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 #-------------------------------------------------------------------------------
-about = INSERT SOME AMAZING INFO ABOUT THIS APPLICATION,\n THE AUTHOR AND WHERE TO FIND MORE INFO HERE\n <a href=\"www.hhu.de\" >LINK</a>
+
+
+#TODO: Give more meaningful names to keys, sort
+
+about = Yoshiko Cytoscape App
 aboutButton = About Yoshiko
 aboutTitle = Yoshiko Plugin Info
-cluster = Cluster
+clusters = Cluster
 clusterFound = Clusters found:
 clusterSize = Cluster Size:
 continueTimeout = The ILP has exceeded the given time limit. Do you want to continue? (This may take a long time)
@@ -33,6 +37,7 @@ currentGap = [ILP] Current Instance Gap
 defaultDeletion = Default deletion cost:
 defaultInsertion = Default insertion cost:
 deleteSolution = Do you really want to delete this solution?
+directedGraphWarning = This algorithm works on undirected graphs. Directed edges are \n treated as undirected edges.
 disableMultiThreading = Disable Multithreading
 discardSolution = Discard
 editingCostPanel = Editing Costs
@@ -41,7 +46,6 @@ firstStart = Thanks for using the Yoshiko Clustering Tool!\nIt appears, that thi
 gap = Gap
 getYoshiko = Get Yoshiko Library
 icTooltip = This value is used to determine what the algorithm pays when inserting an edge.\nExisting mappings overwrite this value.\nA higher value means that the algorithm is less likely to insert edges in order to generate a cluster.
-ilpMarker = ILP Properties
 incompleteResult = This run yielded no usable result!
 instance = Instance
 invalidated = No longer valid, original graph changed!
@@ -51,6 +55,7 @@ libraryPanel = Library
 metaGraph = Meta Graph
 metaGraph_edges = Fetching edges and calculating edge strengths
 multFactor = Multiplicative Factor for SNR:
+multiGraphWarning = This graph is a multigraph. This algorithms behavior on multigraphs is not yet researched.
 noFeasible = No feasible solution found!
 noLibMessage = There is no Yoshiko Library currently loaded! You might have to specify its location.
 noLibTitle = Library not loaded!
@@ -71,6 +76,7 @@ resultsPanelTitle = Yoshiko Results
 run = Perform Algorithm
 showAdvanced = Show advanced options
 solution = Solution
+solutionMarker = Solution Properties
 
 status_createCV = Creating cluster view for cluster:
 
@@ -85,6 +91,10 @@ status_reductionSN = Applying "Similar-Neighborhood" reduction rule
 status_solvingILP = Solving ILP
 
 switchLanguage = Plugin language
+
+task_ccv = Yoshiko: Create Cluster Views
+task_cmg = Yoshiko: Create Meta Graph
+
 timeLimitILP = Use time limit for ILP (s):
 timedOutMessage = The ILP exceeded the time-limit!
 timedOutTitle = Timeout
diff --git a/thesis/tex/.gitignore b/thesis/tex/.gitignore
deleted file mode 100644
index 91d7ce4d6e217830768085593ea3fce3175070a9..0000000000000000000000000000000000000000
--- a/thesis/tex/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-*.out
-*.aux
-*.gz
-*.log
-*.toc
diff --git a/thesis/tex/Chapter/alg_overview.tex b/thesis/tex/Chapter/alg_overview.tex
deleted file mode 100644
index c1570bc2bcf7eb0754ffe99389cd266a1630e9b9..0000000000000000000000000000000000000000
--- a/thesis/tex/Chapter/alg_overview.tex
+++ /dev/null
@@ -1,30 +0,0 @@
-\tikzstyle{block} = [rectangle, draw, fill=blue!20, 
-    text width=5em, text centered, rounded corners, minimum height=4em]
-\tikzstyle{line} = [draw, -latex']
-
-\begin{figure}[h]
-
-\begin{tikzpicture}[node distance = 1cm]
-    \node [block] (datamodel) {Data Modeling};
-    \node [block, left=  of datamodel] (input) {Input};
-    \node [block, below= of datamodel] (reduce) {Reduction Rules};
-    \node [block, below right = of reduce] (solveILP) {ILP Solver};
-    \node [block, below left = of reduce] (solveHeuristic) {Heuristic Solver};
-    \node [block, below right= of solveHeuristic] (output) {Generate Output};
-
-	\path [line] (input) -- (datamodel);
-    \path [line] (datamodel) -- (reduce);
-		\path [line] (reduce) -- (solveILP);
-		\path [line] (reduce) -- (solveHeuristic);
-	\path [line] (solveILP) -- (output);
-	\path [line] (solveHeuristic) -- (output);
-
-	 
-\end{tikzpicture}
-
-	\caption{Overview of the Yoshiko Algorithm}  \label{algOverview}
-
-
-\end{figure}
-ROUGH IDEA:
-COMPLETE GRAPH, CHOOSE EDGES SO THAT sum of C(E) is MAX while satisfying Triangle inequalities > Fully Disjunct Clique-Graph
\ No newline at end of file
diff --git a/thesis/tex/Chapter/dm_impl.tex b/thesis/tex/Chapter/dm_impl.tex
deleted file mode 100644
index 086cfec05f35686de4e759a870b577e05553b168..0000000000000000000000000000000000000000
--- a/thesis/tex/Chapter/dm_impl.tex
+++ /dev/null
@@ -1,20 +0,0 @@
-The Yoshiko Wrapper provides a clean and simple interface to generate the model.
-\subparagraph{Mapping edge costs}
-The user has the possibility to use a numeric Cytoscape column of the node table as a source for the edge-cost function $C$.
-\subparagraph{Insertion and deletion cost}
-The default values $C_I$ and $C_D$ can be set by the user with the default values being $C_I=-1$ and $C_D=1$.
-It should be noted, that the insertion cost value is not normalized or in any way adjusted when a mapping is used. This means that the user needs to adjust this value wisely to fit the data.
-As an example the user might have mapped the edge costs to a column containing values in the range of $10^6-10^7$.
-The default insertion cost of $-1$ will be irrelevant in comparison and the algorithm will most likely insert all missing edges and generate one big cluster as a solution.
-Overall the ratio $R = \frac{|C_I|}{C_D}$ should give you a rough idea how the algorithm will operate.\\
-$R > 1$ means, that the algorithm is more likely to delete edges to generate cliques, a value of $R<1$ means insertions are more likely.
-\subparagraph{Mapping permanent or forbidden edges}
-The Yoshiko app has additional convenience functions:
-The user can map edges to a boolean Cytoscape column to mark them as either 
-\textbf{forbidden} (meaning that those edges will never be part of the solution) or
-\textbf{permanent} (meaning that those edges will always be part of the solution).
-Marking an edge e as forbidden is equivalent to $C(e)=-\infty$,
-marking an edge e as permanent is equivalent to $C(e)=\infty$.
-This way the user is able to apply expert knowledge about the input instance to increase the quality of the solution.
-
-
diff --git a/thesis/tex/Chapter/dm_theory.tex b/thesis/tex/Chapter/dm_theory.tex
deleted file mode 100644
index 7e6d4a1b3a6cade379f6f53559c1833885c4bd35..0000000000000000000000000000000000000000
--- a/thesis/tex/Chapter/dm_theory.tex
+++ /dev/null
@@ -1,11 +0,0 @@
-
-The Yoshiko algorithm models the data as a complete graph
-$G=(V,E)$ 
-with an associated edge-cost function 
-$C: E \rightarrow \mathbb{R} 
-\cup \lbrace -\infty \rbrace 
-\cup \lbrace \infty \rbrace $.
-As many input instances do not describe a full graph, missing edges and costs need to be modeled.
-This is achieved by using default values for insertion or deletion.
-A default insertion cost $C_I \in [-\infty,0]$ is used as $C(e)$ whenever the input instance does not contain an edge $e$.
-A default deletion cost  $C_D \in [0,\infty ]$ is used as $C(e)$ whenever the input instance does contain an edge $e$ that has no cost associated yet.
\ No newline at end of file
diff --git a/thesis/tex/Multigraph.pdf b/thesis/tex/Multigraph.pdf
deleted file mode 100644
index d632aeec216d1a3fa56cc600762033f1f9a108dd..0000000000000000000000000000000000000000
Binary files a/thesis/tex/Multigraph.pdf and /dev/null differ
diff --git a/thesis/tex/Multigraph.tex b/thesis/tex/Multigraph.tex
deleted file mode 100644
index d77cdc000710cc0a57c802480aadd56619f8c03b..0000000000000000000000000000000000000000
--- a/thesis/tex/Multigraph.tex
+++ /dev/null
@@ -1,12 +0,0 @@
-\documentclass[10pt,a4paper]{article}
-\usepackage[utf8]{inputenc}
-\usepackage[english]{babel}
-\usepackage{amsmath}
-\usepackage{amsfonts}
-\usepackage{amssymb}
-\author{Philipp Spohr}
-\title{Rough Analysis of Cluster Editing Reduction Rules in Multi-Graphs}
-\begin{document}
-\maketitle
-\section{•}
-\end{document}
\ No newline at end of file
diff --git a/thesis/tex/Thesis.pdf b/thesis/tex/Thesis.pdf
deleted file mode 100644
index 7e2abacb398116dcf8541d79ef4f836411f08309..0000000000000000000000000000000000000000
Binary files a/thesis/tex/Thesis.pdf and /dev/null differ
diff --git a/thesis/tex/Thesis.tex b/thesis/tex/Thesis.tex
deleted file mode 100644
index 720652e37a3b800abaa14ff9ee12c72307e23c9d..0000000000000000000000000000000000000000
--- a/thesis/tex/Thesis.tex
+++ /dev/null
@@ -1,52 +0,0 @@
-\documentclass[10pt,a4paper]{article}
-
-\usepackage[utf8]{inputenc}
-\usepackage[english]{babel}
-\usepackage{amsmath}
-\usepackage{amsfonts}
-\usepackage{amssymb}
-\usepackage{abstract}
-\usepackage{hyperref}
-\usepackage{graphicx}
-\usepackage{tikz}
-\usepackage{verbatim}
-\usepackage{float}
-
-\usetikzlibrary{shapes,arrows}
-\usetikzlibrary{positioning}
-
-\hypersetup{
-    linktoc=all
-}
-
-\author{Philipp Spohr}
-
-\title{Developing and evaluating a Cytoscape app for graph-based clustering}
-
-\begin{document}
-
-\maketitle
-
-\cleardoublepage
-
-\begin{abstract}
-
-\end{abstract}
-
-\tableofcontents
-
-\clearpage
-
-\section{Introduction}
-\section{The Yoshiko-App for Cytoscape}
-	\subsection{Technical Details}
-	\subsection{Algorithm}
-		\input{Chapter/alg_overview}
-		\subsubsection{Data Modeling}
-			\paragraph{Theory}
-			\input{Chapter/dm_theory}
-			\paragraph{Implementation}
-			\input{Chapter/dm_impl}
-\section{Evaluation of the Yoshiko Algorithm}
-\section{Outlook}
-\end{document}
\ No newline at end of file