diff --git a/de.bmotionstudio.gef.editor/plugin.xml b/de.bmotionstudio.gef.editor/plugin.xml
index 4db1b733bb67e0e349851bf84f1ef4be3bedd54a..21f1c5c72b1ff9f3474360690467ebeac44e686d 100644
--- a/de.bmotionstudio.gef.editor/plugin.xml
+++ b/de.bmotionstudio.gef.editor/plugin.xml
@@ -721,5 +721,11 @@
             </observer>
          </control>
       </include>   
+   </extension>
+   <extension
+         point="org.eclipse.ui.startup">
+      <startup
+            class="de.bmotionstudio.gef.editor.BMotionStartup">
+      </startup>
    </extension>
 </plugin>
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMSPerspectiveFactory.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMSPerspectiveFactory.java
index c62ac993da67ac68f8a2de13478054ccbe86d849..9582f0be2921741684ee7eb9edebdf5a6d53c6a8 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMSPerspectiveFactory.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMSPerspectiveFactory.java
@@ -46,13 +46,14 @@ public class BMSPerspectiveFactory implements IPerspectiveFactory {
 		IFolderLayout top = layout.createFolder("bottom1", IPageLayout.BOTTOM,
 				0.20f, IPageLayout.ID_EDITOR_AREA);
 		top.addPlaceholder(VisualizationViewPart.ID + ":*");
+		layout.getViewLayout(VisualizationViewPart.ID).setCloseable(false);
 
 		// Properties view + observer view + control panel
 		IFolderLayout bottom = layout.createFolder("bottom2",
 				IPageLayout.BOTTOM, 0.65f, "bottom1");
+		bottom.addView(ControlPanel.ID);
 		bottom.addView(IPageLayout.ID_PROP_SHEET);
 		bottom.addView(ObserverView.ID);
-		bottom.addView(ControlPanel.ID);
 		
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionEditorPlugin.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionEditorPlugin.java
index 6e95833400c5fd288dd135fbb74f512f022e5f5f..9188d03379aa58a582af662553a27d3f1f0b1f57 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionEditorPlugin.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionEditorPlugin.java
@@ -94,6 +94,7 @@ public class BMotionEditorPlugin extends AbstractUIPlugin {
 		super.stop(context);
 	}
 
+
 	/**
 	 * Returns the shared instance
 	 * 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStartup.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStartup.java
new file mode 100644
index 0000000000000000000000000000000000000000..fcc948973435f320a304c913bb206ba522976350
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStartup.java
@@ -0,0 +1,27 @@
+package de.bmotionstudio.gef.editor;
+
+import org.eclipse.ui.IPerspectiveDescriptor;
+import org.eclipse.ui.IPerspectiveRegistry;
+import org.eclipse.ui.IStartup;
+import org.eclipse.ui.PlatformUI;
+
+import de.bmotionstudio.gef.editor.util.PerspectiveUtil;
+
+public class BMotionStartup implements IStartup {
+
+	@Override
+	public void earlyStartup() {
+
+		IPerspectiveRegistry perspectiveRegistry = PlatformUI.getWorkbench()
+				.getPerspectiveRegistry();
+		IPerspectiveDescriptor[] perspectives = perspectiveRegistry
+				.getPerspectives();
+		for (IPerspectiveDescriptor p : perspectives) {
+			if (p.getId().startsWith("BMS_"))
+				PerspectiveUtil.closePerspective(p);
+				PerspectiveUtil.deletePerspective(p);
+		}
+
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioLauncher.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioLauncher.java
index 7c0ec439bfc7fb58b3234fbe892936cd6b37ec0f..621759f759dcdea4a0c02fc88a37a1896de83896 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioLauncher.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioLauncher.java
@@ -1,10 +1,6 @@
 package de.bmotionstudio.gef.editor;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
@@ -12,15 +8,7 @@ import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.preferences.IExportedPreferences;
-import org.eclipse.core.runtime.preferences.IPreferenceFilter;
-import org.eclipse.core.runtime.preferences.IPreferencesService;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.core.runtime.preferences.PreferenceFilterEntry;
 import org.eclipse.ui.IEditorLauncher;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveRegistry;
 import org.eclipse.ui.IViewReference;
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.IWorkbenchPartSite;
@@ -37,8 +25,6 @@ import de.bmotionstudio.gef.editor.util.PerspectiveUtil;
 
 public class BMotionStudioLauncher implements IEditorLauncher {
 
-	private Simulation simulation;
-
 	private IFile file;
 
 	@Override
@@ -47,10 +33,40 @@ public class BMotionStudioLauncher implements IEditorLauncher {
 		file = ResourcesPlugin.getWorkspace().getRoot()
 				.getFileForLocation(path);
 
-		if (BMotionEditorPlugin.getOpenSimulations()
-				.containsKey(file.getName()))
+		Simulation simulation = BMotionEditorPlugin.getOpenSimulations().get(
+				file.getName());
+
+		// final String perspectiveId = PerspectiveUtil
+		// .getPerspectiveIdFromFile(file);
+
+		// The simulation is already open
+		if (simulation != null) {
+			
+			PerspectiveUtil.openPerspective(simulation);
+//
+//			IPerspectiveDescriptor perspective = PlatformUI.getWorkbench()
+//					.getPerspectiveRegistry()
+//					.findPerspectiveWithId(perspectiveId);
+//
+//			// Check if a perspective already exists
+//			if (perspective != null) {
+//				// If yes, just switch the perspective
+//				PerspectiveUtil.switchPerspective(perspective);
+//			} else {
+//				
+//				
+//			}
+//
+//			IFile perspectiveFile = file.getProject().getFile(
+//					getPerspectiveFileName());
+//			if (perspectiveFile.exists()) {
+//
+//			}
+
+//			PerspectiveUtil.openPerspective(simulation);
 			return;
-
+		}
+		
 		InputStream inputStream = null;
 
 		try {
@@ -81,10 +97,6 @@ public class BMotionStudioLauncher implements IEditorLauncher {
 					.getActiveWorkbenchWindow().getActivePage();
 			IWorkbenchPartSite site = activePage.getActivePart().getSite();
 
-			importPerspective(file.getProject().getFile(
-					getPerspectiveFileName()));
-			openPerspective(site.getPage());
-
 			if (obj instanceof Visualization) {
 
 				simulation = new Simulation();
@@ -108,6 +120,9 @@ public class BMotionStudioLauncher implements IEditorLauncher {
 
 				simulation.setProjectFile(file);
 
+				System.out.println("Open Perspecitve");
+				PerspectiveUtil.openPerspective(simulation);
+
 				for (Map.Entry<String, VisualizationView> entry : simulation
 						.getVisualizationViews().entrySet()) {
 
@@ -116,18 +131,29 @@ public class BMotionStudioLauncher implements IEditorLauncher {
 					Visualization vis = visView.getVisualization();
 					vis.setProjectFile(file);
 					// String partName = visView.getPartName();
-					// IViewReference viewReference = site.getPage()
-					// .findViewReference(VisualizationViewPart.ID, secId);
+					IViewReference viewReference = site.getPage()
+							.findViewReference(VisualizationViewPart.ID, secId);
+					VisualizationViewPart visualizationViewPart;
 					// Check if view already exists
-					// if (viewReference != null) {
-					// } else {
-					// If not, create a new one
-					VisualizationViewPart visualizationViewPart = PerspectiveUtil
-							.createVisualizationViewPart(
-							secId, visView);
-					if (!visualizationViewPart.isInitialized())
+					if (viewReference != null) {
+						visualizationViewPart = (VisualizationViewPart) viewReference
+								.getPart(true);
+						System.out.println("    ===> Visualization found: "
+								+ visualizationViewPart);
+					} else {
+						// If not, create a new one
+						visualizationViewPart = PerspectiveUtil
+								.createVisualizationViewPart(secId, visView);
+						System.out.println("    ===> Visualization created: "
+								+ visualizationViewPart);
+					}
+
+					if (visualizationViewPart != null
+							&& !visualizationViewPart.isInitialized()) {
+						System.out
+								.println("       ===> Visualization initialized");
 						visualizationViewPart.init(simulation, visView);
-					// }
+					}
 
 				}
 
@@ -159,87 +185,4 @@ public class BMotionStudioLauncher implements IEditorLauncher {
 
 	}
 
-	private IPerspectiveDescriptor openPerspective(IWorkbenchPage page) {
-
-		if (page == null)
-			return null;
-
-		// Try to get the corresponding perspective
-		IPerspectiveRegistry perspectiveRegistry = page.getWorkbenchWindow()
-				.getWorkbench().getPerspectiveRegistry();
-		String perspectiveId = PerspectiveUtil.getPerspectiveIdFromFile(file);
-		IPerspectiveDescriptor perspective = perspectiveRegistry
-				.findPerspectiveWithId(perspectiveId);
-
-		// Yes --> just switch to this perspective
-		if (perspective != null) {
-			PerspectiveUtil.switchPerspective(perspective);
-		} else {
-			// No --> create a new one
-			IPerspectiveDescriptor originalPerspectiveDescriptor = perspectiveRegistry
-					.findPerspectiveWithId(BMSPerspectiveFactory.ID);
-			PerspectiveUtil.switchPerspective(originalPerspectiveDescriptor);
-			perspective = perspectiveRegistry.clonePerspective(perspectiveId,
-					perspectiveId, originalPerspectiveDescriptor);
-			// save the perspective
-			page.savePerspectiveAs(perspective);
-		}
-
-		return perspective;
-
-	}
-
-	private void importPerspective(IFile perspectiveFile) {
-
-		FileInputStream fis = null;
-
-		try {
-
-			IPreferenceFilter[] transfers = null;
-			transfers = new IPreferenceFilter[1];
-
-			// Only import if a perspective file exists
-			if (perspectiveFile.exists()) {
-
-				File exportFile = new File(perspectiveFile.getLocationURI());
-				fis = new FileInputStream(exportFile);
-				IPreferencesService service = Platform.getPreferencesService();
-				// service.importPreferences(fis);
-				IExportedPreferences prefs = service.readPreferences(fis);
-				transfers[0] = new IPreferenceFilter() {
-					public String[] getScopes() {
-						return new String[] { InstanceScope.SCOPE };
-					}
-
-					public Map<String, PreferenceFilterEntry[]> getMapping(
-							String scope) {
-						Map<String, PreferenceFilterEntry[]> map = new HashMap<String, PreferenceFilterEntry[]>();
-						map.put("org.eclipse.ui.workbench",
-								new PreferenceFilterEntry[] { new PreferenceFilterEntry(
-										PerspectiveUtil
-												.getPerspectiveIdFromFile(file)
-												+ "_persp") });
-						return map;
-					}
-				};
-				service.applyPreferences(prefs, transfers);
-			}
-
-		} catch (FileNotFoundException e) {
-		} catch (CoreException e) {
-		} finally {
-			try {
-				if (fis != null)
-					fis.close();
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-		}
-
-	}
-
-	private String getPerspectiveFileName() {
-		return file.getName().replace(".bmso", ".bmsop");
-	}
-
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/VisualizationViewPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/VisualizationViewPart.java
index e3dad235fa64df73e8ff965ade38d824de7818f2..d79371a09e65e9b813339f7db51d516880b7b756 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/VisualizationViewPart.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/VisualizationViewPart.java
@@ -369,6 +369,7 @@ public class VisualizationViewPart extends ViewPart implements
 
 	@Override
 	public void setFocus() {
+		container.setFocus();
 	}
 
 	public void init(Simulation simulation, VisualizationView visualizationView) {
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/controlpanel/AddVisualizationViewAction.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/controlpanel/AddVisualizationViewAction.java
index 84dfb0bbf5caee16e496aa0ce3dd6d4a8c539899..17663ecf077e4dd0048263e6a48eb0f13d221269 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/controlpanel/AddVisualizationViewAction.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/controlpanel/AddVisualizationViewAction.java
@@ -16,6 +16,7 @@ import org.eclipse.ui.PartInitException;
 
 import de.bmotionstudio.gef.editor.BMotionEditorPlugin;
 import de.bmotionstudio.gef.editor.BMotionStudioImage;
+import de.bmotionstudio.gef.editor.VisualizationViewPart;
 import de.bmotionstudio.gef.editor.model.Simulation;
 import de.bmotionstudio.gef.editor.model.Visualization;
 import de.bmotionstudio.gef.editor.model.VisualizationView;
@@ -41,6 +42,8 @@ public class AddVisualizationViewAction extends Action {
 
 			Simulation simulation = (Simulation) firstElement;
 
+			PerspectiveUtil.openPerspective(simulation);
+
 			try {
 
 				String secId = UUID.randomUUID().toString();
@@ -56,8 +59,10 @@ public class AddVisualizationViewAction extends Action {
 				simulation.getVisualizationViews()
 						.put(secId, visualizationView);
 
-				PerspectiveUtil.createVisualizationViewPart(secId,
+				VisualizationViewPart visualizationViewPart = PerspectiveUtil
+						.createVisualizationViewPart(secId,
 						visualizationView);
+				visualizationViewPart.init(simulation, visualizationView);
 				
 				simulation.setDirty(true);
 				viewer.refresh();
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/controlpanel/CloseSimulationAction.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/controlpanel/CloseSimulationAction.java
index 990c94a21f92f92e8fa97febe89d2f42de6f8347..f2e072e6ed3e3820859227d04c333525118ed35c 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/controlpanel/CloseSimulationAction.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/controlpanel/CloseSimulationAction.java
@@ -11,8 +11,6 @@ import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.ui.IPerspectiveDescriptor;
 import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.PlatformUI;
 
 import de.bmotionstudio.gef.editor.BMotionEditorPlugin;
@@ -38,22 +36,19 @@ public class CloseSimulationAction extends Action {
 		Object firstElement = sel.getFirstElement();
 		if (firstElement instanceof Simulation) {
 
-			IWorkbench workbench = PlatformUI.getWorkbench();
-			IWorkbenchPage page = workbench.getActiveWorkbenchWindow()
-					.getActivePage();
-
-			IPerspectiveRegistry perspectiveRegistry = workbench
-					.getPerspectiveRegistry();
+			IPerspectiveRegistry perspectiveRegistry = PlatformUI
+					.getWorkbench().getPerspectiveRegistry();
 
 			Simulation simulation = (Simulation) firstElement;
 			String perspectiveId = PerspectiveUtil
 					.getPerspectiveIdFromFile(simulation.getProjectFile());
-			IPerspectiveDescriptor perspectiveDescriptor = perspectiveRegistry.findPerspectiveWithId(perspectiveId);
-			if(perspectiveDescriptor != null) {
-				PerspectiveUtil.closePerspective(page, perspectiveDescriptor);
-				PerspectiveUtil.deletePerspective(page, perspectiveDescriptor);
+			IPerspectiveDescriptor perspectiveDescriptor = perspectiveRegistry
+					.findPerspectiveWithId(perspectiveId);
+			if (perspectiveDescriptor != null) {
+				PerspectiveUtil.closePerspective(perspectiveDescriptor);
+				PerspectiveUtil.deletePerspective(perspectiveDescriptor);
 			}
-			
+
 			BMotionEditorPlugin.closeSimulation(simulation);
 
 		}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/controlpanel/ControlPanel.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/controlpanel/ControlPanel.java
index c12f9a244c32f62110af383c0c12bd43e927e2c1..188ce206d2b1941cce2a3c580a5d95b357cf6e05 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/controlpanel/ControlPanel.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/controlpanel/ControlPanel.java
@@ -8,6 +8,8 @@ import java.util.Map;
 
 import org.eclipse.draw2d.ColorConstants;
 import org.eclipse.gef.commands.CommandStackListener;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.action.Separator;
 import org.eclipse.jface.viewers.DoubleClickEvent;
@@ -168,11 +170,30 @@ public class ControlPanel extends ViewPart implements ISimulationListener,
 			treeViewer.expandAll();
 		}
 
+		final CloseSimulationAction closeSimulationAction = new CloseSimulationAction(
+				treeViewer);
+		final SaveSimulationAction saveSimulationAction = new SaveSimulationAction(
+				treeViewer);
+		final AddVisualizationViewAction addVisualizationViewAction = new AddVisualizationViewAction(
+				treeViewer);
+		final Separator separator = new Separator();
+
 		MenuManager manager = new MenuManager();
-		manager.add(new CloseSimulationAction(treeViewer));
-		manager.add(new SaveSimulationAction(treeViewer));
-		manager.add(new Separator());
-		manager.add(new AddVisualizationViewAction(treeViewer));
+		manager.setRemoveAllWhenShown(true);
+		manager.addMenuListener(new IMenuListener() {
+			public void menuAboutToShow(IMenuManager manager) {
+				IStructuredSelection selection = (IStructuredSelection) treeViewer
+						.getSelection();
+				Object firstElement = selection.getFirstElement();
+				if (firstElement instanceof Simulation) {
+					manager.add(closeSimulationAction);
+					manager.add(saveSimulationAction);
+					manager.add(separator);
+					manager.add(addVisualizationViewAction);
+				}
+			}
+		});
+
 		treeViewer.getControl().setMenu(
 				manager.createContextMenu(treeViewer.getControl()));
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/util/PerspectiveUtil.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/util/PerspectiveUtil.java
index a8fbc75999b4c882a05b3a59152706891b3745a0..512c8967b26d2be6283f6a37ca06b36e5fdf42e1 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/util/PerspectiveUtil.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/util/PerspectiveUtil.java
@@ -2,6 +2,7 @@ package de.bmotionstudio.gef.editor.util;
 
 import java.io.ByteArrayInputStream;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -13,6 +14,7 @@ import org.eclipse.core.runtime.Assert;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.IExportedPreferences;
 import org.eclipse.core.runtime.preferences.IPreferenceFilter;
 import org.eclipse.core.runtime.preferences.IPreferencesService;
 import org.eclipse.core.runtime.preferences.InstanceScope;
@@ -26,6 +28,7 @@ import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.WorkbenchException;
 
+import de.bmotionstudio.gef.editor.BMSPerspectiveFactory;
 import de.bmotionstudio.gef.editor.VisualizationViewPart;
 import de.bmotionstudio.gef.editor.model.Simulation;
 import de.bmotionstudio.gef.editor.model.VisualizationView;
@@ -33,19 +36,17 @@ import de.prob.logging.Logger;
 
 public class PerspectiveUtil {
 
-	public static void deletePerspective(IWorkbenchPage page,
+	public static void deletePerspective(
 			IPerspectiveDescriptor perspectiveDescriptor) {
-		if (perspectiveDescriptor == null || page == null)
-			return;
-		IPerspectiveRegistry perspectiveRegistry = page.getWorkbenchWindow()
-				.getWorkbench().getPerspectiveRegistry();
+		IPerspectiveRegistry perspectiveRegistry = PlatformUI.getWorkbench()
+				.getPerspectiveRegistry();
 		perspectiveRegistry.deletePerspective(perspectiveDescriptor);
 	}
 
-	public static void closePerspective(IWorkbenchPage page,
+	public static void closePerspective(
 			IPerspectiveDescriptor perspectiveDescriptor) {
-		if (perspectiveDescriptor == null || page == null)
-			return;
+		IWorkbenchPage page = PlatformUI.getWorkbench()
+				.getActiveWorkbenchWindow().getActivePage();
 		page.closePerspective(perspectiveDescriptor, false, true);
 	}
 
@@ -134,6 +135,10 @@ public class PerspectiveUtil {
 		return "BMS_" + file.getName().replace(".bmso", "");
 	}
 
+	public static String getPerspectiveFileName(IFile file) {
+		return file.getName().replace(".bmso", ".bmsop");
+	}
+
 	public static VisualizationViewPart createVisualizationViewPart(
 			String secId, VisualizationView visualizationView)
 			throws PartInitException {
@@ -146,4 +151,101 @@ public class PerspectiveUtil {
 		return visualizationViewPart;
 	}
 
+	public static void importPerspective(final IFile perspectiveFile,
+			final String perspectiveID) {
+
+		FileInputStream fis = null;
+
+		try {
+
+			IPreferenceFilter[] transfers = null;
+			transfers = new IPreferenceFilter[1];
+
+			// Only import if a perspective file exists
+			if (perspectiveFile.exists()) {
+
+				File exportFile = new File(perspectiveFile.getLocationURI());
+				fis = new FileInputStream(exportFile);
+				IPreferencesService service = Platform.getPreferencesService();
+				// service.importPreferences(fis);
+				IExportedPreferences prefs = service.readPreferences(fis);
+				transfers[0] = new IPreferenceFilter() {
+					public String[] getScopes() {
+						return new String[] { InstanceScope.SCOPE };
+					}
+
+					public Map<String, PreferenceFilterEntry[]> getMapping(
+							String scope) {
+						Map<String, PreferenceFilterEntry[]> map = new HashMap<String, PreferenceFilterEntry[]>();
+						map.put("org.eclipse.ui.workbench",
+								new PreferenceFilterEntry[] { new PreferenceFilterEntry(
+										perspectiveID + "_persp") });
+						return map;
+					}
+				};
+				service.applyPreferences(prefs, transfers);
+			}
+
+		} catch (FileNotFoundException e) {
+		} catch (CoreException e) {
+		} finally {
+			try {
+				if (fis != null)
+					fis.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+
+	}
+
+	public static IPerspectiveDescriptor openPerspective(Simulation simulation) {
+
+		IWorkbenchPage page = PlatformUI.getWorkbench()
+				.getActiveWorkbenchWindow().getActivePage();
+
+		// Try to get the corresponding perspective
+		IPerspectiveRegistry perspectiveRegistry = page.getWorkbenchWindow()
+				.getWorkbench().getPerspectiveRegistry();
+		String perspectiveId = PerspectiveUtil
+				.getPerspectiveIdFromFile(simulation.getProjectFile());
+		IPerspectiveDescriptor perspective = perspectiveRegistry
+				.findPerspectiveWithId(perspectiveId);
+
+		// Yes --> just switch to this perspective
+		if (perspective != null) {
+			PerspectiveUtil.switchPerspective(perspective);
+		} else {
+			// Check if a corresponding perspective file exists
+			IFile perspectiveFile = simulation
+					.getProjectFile()
+					.getProject()
+					.getFile(
+							PerspectiveUtil.getPerspectiveFileName(simulation
+									.getProjectFile()));
+			if (perspectiveFile.exists()) {
+				PerspectiveUtil.importPerspective(perspectiveFile,
+						perspectiveId);
+				perspective = perspectiveRegistry
+						.findPerspectiveWithId(perspectiveId);
+				PerspectiveUtil.switchPerspective(perspective);
+			} else {
+				// No --> create a new one
+				IPerspectiveDescriptor originalPerspectiveDescriptor = perspectiveRegistry
+						.findPerspectiveWithId(BMSPerspectiveFactory.ID);
+				PerspectiveUtil
+						.switchPerspective(originalPerspectiveDescriptor);
+				perspective = perspectiveRegistry.clonePerspective(
+						perspectiveId, perspectiveId,
+						originalPerspectiveDescriptor);
+				// save the perspective
+				page.savePerspectiveAs(perspective);
+			}
+
+		}
+
+		return perspective;
+
+	}
+
 }