diff --git a/pom.xml b/pom.xml
index f3b7f648c8c7b7d1d498ee809904eca8856f4930..453fd7a724a91c0e6a807bbfbd95118fbbc97931 100644
--- a/pom.xml
+++ b/pom.xml
@@ -33,7 +33,7 @@
 
 	<groupId>de.hhu.ba</groupId>
 	<artifactId>yoshikoWrapper</artifactId>
-	<version>0.1.2</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/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/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/ResultPanel.java b/src/main/java/de/hhu/ba/yoshikoWrapper/swing/components/ResultPanel.java
index 907ea0179d4916e793d840901da5f3136abb5294..db8158ba05ba03df11aa7e20d082b4b6ba555005 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,9 +25,11 @@ 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;
@@ -58,6 +60,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;
@@ -123,11 +126,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"));
@@ -142,15 +150,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() {
 
@@ -172,16 +180,13 @@ NetworkAboutToBeDestroyedListener
 		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(marker,DEFAULT_SIZE,DEFAULT_SIZE,DEFAULT_SIZE)
 			.addComponent(invalidLabel,DEFAULT_SIZE, PREFERRED_SIZE,Short.MAX_VALUE)
 			.addComponent(tabbedPane,HACKFIX_FIXED_WIDTH, PREFERRED_SIZE,Short.MAX_VALUE)
 			.addComponent(destroyButton,DEFAULT_SIZE, DEFAULT_SIZE,DEFAULT_SIZE);
 		verticalGroup
+			.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)
@@ -190,6 +195,8 @@ NetworkAboutToBeDestroyedListener
 		layout.setAutoCreateGaps(true);
 		layout.setAutoCreateContainerGaps(true);
 
+		//SWING BLACK MAGIC FOR ADEPTS
+		this.setMinimumSize(new Dimension(HACKFIX_FIXED_WIDTH,this.getMinimumSize().height));
 
 		this.setLayout(layout);
 
@@ -206,6 +213,7 @@ NetworkAboutToBeDestroyedListener
 	}
 
 	public void deleteSolution() {
+
 		int dialogResult = JOptionPane.showConfirmDialog (
 				null,
 				LocalizationManager.get("deleteSolution"),
@@ -215,9 +223,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 fbe450f777d3eb576cdf6c36fe80bc9417b6a007..7791070c58c1bd3d3ef70457767fd6a0c6c4d26a 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/tasks/AlgorithmTask.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/tasks/AlgorithmTask.java
@@ -71,7 +71,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
@@ -85,6 +85,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);
@@ -127,9 +128,9 @@ public class AlgorithmTask extends AbstractTask {
 				parameterSet.solCount,
 				parameterSet.reductionRulesBitMask,
 				parameterSet.snrMultFactor,
+				parameterSet.useHeuristic,
 				parameterSet.usePartitionCuts,
-				parameterSet.useTriangleCuts,
-				parameterSet.useHeuristic
+				parameterSet.useTriangleCuts
 		);
 
 
@@ -162,30 +163,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 28bc3faea2f10eb11808512439dc56ebfdb2088a..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;
@@ -56,19 +59,29 @@ public class CreateClusterViews implements Task {
 			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);
 		}
 	}
 
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 caa8663bee3816c97e8d836b2585bf9e2145e443..a82a9802e07b1d4417c01d26758edc1f5a9c4c80 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/tasks/CreateMetaGraphTask.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/tasks/CreateMetaGraphTask.java
@@ -3,6 +3,8 @@ 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;
@@ -11,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;
@@ -21,7 +25,7 @@ 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;
 
@@ -76,8 +80,10 @@ public class CreateMetaGraphTask extends AbstractTask {
 			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(),
@@ -90,17 +96,23 @@ public class CreateMetaGraphTask extends AbstractTask {
 
 			CyCore.networkViewManager.addNetworkView(subnetView,false);
 
-			//Link cluster node in meta graph and subnet graph to use Cytoscape Nested Network feature
+			//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!");
@@ -112,6 +124,7 @@ public class CreateMetaGraphTask extends AbstractTask {
 						) {
 					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)) {
@@ -131,32 +144,22 @@ 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,false);
 		CyCore.networkViewManager.addNetworkView(
@@ -166,6 +169,7 @@ public class CreateMetaGraphTask extends AbstractTask {
 		view.updateView();
 
 		CyCore.cy.setCurrentNetworkView(view);
+
 	}
 
 	@Override
diff --git a/src/main/resources/YoshikoStrings.properties b/src/main/resources/YoshikoStrings.properties
index a5051e928a1c17aa405e3c1af3b03317e4d76e94..7c9a4c402998a8b89b5bbb800d8c62609a5da89f 100644
--- a/src/main/resources/YoshikoStrings.properties
+++ b/src/main/resources/YoshikoStrings.properties
@@ -26,7 +26,7 @@
 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>
 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)
@@ -46,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!
@@ -77,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:
 
diff --git a/thesis/tex/Thesis.pdf b/thesis/tex/Thesis.pdf
index 7e2abacb398116dcf8541d79ef4f836411f08309..aa9d60cf5eb118209f5c083603204ff449156719 100644
Binary files a/thesis/tex/Thesis.pdf and b/thesis/tex/Thesis.pdf differ
diff --git a/thesis/tex/Thesis.tex b/thesis/tex/Thesis.tex
index 720652e37a3b800abaa14ff9ee12c72307e23c9d..b3c8541bbb37a124c26b2df00a98bcde3cd5cf8c 100644
--- a/thesis/tex/Thesis.tex
+++ b/thesis/tex/Thesis.tex
@@ -30,6 +30,14 @@
 \cleardoublepage
 
 \begin{abstract}
+This paper describes an implementation of the Yoshiko-alorithm,
+which clusters data based on the weighted cluster-editing problem,
+as a plugin for Cytoscape.
+
+Cytoscape is a network visualization and analysis tool (insert info)
+
+Yoshiko is based on work from (insert info)
+
 
 \end{abstract}
 
@@ -40,6 +48,8 @@
 \section{Introduction}
 \section{The Yoshiko-App for Cytoscape}
 	\subsection{Technical Details}
+		\subsubsection{Program Structure}
+		\subsubsection{JNI}
 	\subsection{Algorithm}
 		\input{Chapter/alg_overview}
 		\subsubsection{Data Modeling}
@@ -49,4 +59,6 @@
 			\input{Chapter/dm_impl}
 \section{Evaluation of the Yoshiko Algorithm}
 \section{Outlook}
+	\subsection{Multigraph Analysis}
+	\subsection{Integration in other frameworks}
 \end{document}
\ No newline at end of file