diff --git a/de.bmotionstudio.gef.editor/plugin.xml b/de.bmotionstudio.gef.editor/plugin.xml
index 560ae9ff5d6cd3771d9531f2590c1c0dc55646e5..fcf68ecbf61c2d30b9dcdfc7e75b308106cc13bb 100644
--- a/de.bmotionstudio.gef.editor/plugin.xml
+++ b/de.bmotionstudio.gef.editor/plugin.xml
@@ -19,7 +19,7 @@
             extensions="bmso"
             icon="icons/logo_bmotion.png"
             id="de.bmotionstudio.gef.editor.BMotionStudioEditor"
-            name="BMotion Studio Editor">
+            name="BMotion Studio">
       </editor>
    </extension>
    <extension
@@ -65,6 +65,7 @@
             allowMultiple="true"
             category="de.bmotionstudio.views"
             class="de.bmotionstudio.gef.editor.VisualizationViewPart"
+            icon="icons/logo_bmotion.png"
             id="de.bmotionstudio.gef.editor.VisualizationView"
             name="Visualization"
             restorable="true">
@@ -76,6 +77,14 @@
             name="Palette"
             restorable="true">
       </view>
+      <view
+            allowMultiple="false"
+            category="de.bmotionstudio.views"
+            class="de.bmotionstudio.gef.editor.BMotionOutlineView"
+            id="de.bmotionstudio.gef.editor.OutlineView"
+            name="Outline"
+            restorable="true">
+      </view>
    </extension>
    <extension
          point="org.eclipse.ui.menus">
@@ -164,6 +173,15 @@
          </enabledWhen>
       </handler>
    </extension>
+   <extension
+         point="org.eclipse.ui.perspectives">
+      <perspective
+            class="de.bmotionstudio.gef.editor.BMSPerspectiveFactory"
+            icon="icons/logo_bmotion.png"
+            id="de.bmotionstudio.gef.editor.perspective"
+            name="BMS">
+      </perspective>
+   </extension>
    <extension
          point="de.prob.core.animation">
       <listener
@@ -682,5 +700,5 @@
             </observer>
          </control>
       </include>   
-   </extension>   
+   </extension>
 </plugin>
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMSPaletteView.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMSPaletteView.java
index cd961b33c80cf98989abb87cb116906fb09762d2..b89cc1a7b15a9d55aea764881812578609a2ae46 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMSPaletteView.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMSPaletteView.java
@@ -2,6 +2,7 @@ package de.bmotionstudio.gef.editor;
 
 import org.eclipse.draw2d.ColorConstants;
 import org.eclipse.gef.EditDomain;
+import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
 import org.eclipse.gef.ui.palette.PaletteViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.FillLayout;
@@ -18,7 +19,9 @@ import org.eclipse.ui.part.PageBookView;
 
 public class BMSPaletteView extends PageBookView {
 
-	// private PaletteViewer paletteViewer;
+	private PaletteViewer paletteViewer;
+
+	public static String ID = "de.bmotionstudio.gef.editor.PaletteView";
 
 	@Override
 	protected IWorkbenchPart getBootstrapPart() {
@@ -29,6 +32,17 @@ public class BMSPaletteView extends PageBookView {
 		return null;
 	}
 
+	@Override
+	public void partActivated(IWorkbenchPart part) {
+		if (part instanceof VisualizationViewPart) {
+			VisualizationViewPart visView = (VisualizationViewPart) part;
+			EditDomain domain = visView.getEditDomain();
+			if (domain != null)
+				domain.setPaletteViewer(paletteViewer);
+		}
+		super.partActivated(part);
+	}
+
 	@Override
 	protected PageRec doCreatePage(IWorkbenchPart part) {
 		if (part instanceof VisualizationViewPart) {
@@ -40,11 +54,6 @@ public class BMSPaletteView extends PageBookView {
 		return null;
 	}
 
-	@Override
-	public void partActivated(IWorkbenchPart part) {
-		super.partActivated(part);
-	}
-
 	@Override
 	protected boolean isImportant(IWorkbenchPart part) {
 		return part instanceof VisualizationViewPart;
@@ -55,17 +64,19 @@ public class BMSPaletteView extends PageBookView {
 		private Composite container;
 
 		protected void createPaletteViewer(Composite parent) {
-			PaletteViewer viewer = new PaletteViewer();
-			viewer.createControl(parent);
-			viewer.getControl().setBackground(ColorConstants.green);
-			EditDomain domain = new EditDomain();
-			domain.setPaletteViewer(viewer);
+			paletteViewer = new PaletteViewer();
+			paletteViewer.createControl(parent);
+			paletteViewer.getControl().setBackground(ColorConstants.green);
+			paletteViewer.setPaletteRoot(new EditorPaletteFactory()
+					.createPalette(null));
+			paletteViewer
+					.addDragSourceListener(new TemplateTransferDragSourceListener(
+							paletteViewer));
 		}
 
 		@Override
 		public void createControl(Composite parent) {
 			container = new Composite(parent, SWT.NONE);
-			container.setBackground(ColorConstants.red);
 			container.setLayout(new FillLayout());
 			createPaletteViewer(container);
 		}
@@ -92,8 +103,6 @@ public class BMSPaletteView extends PageBookView {
 
 	@Override
 	protected void doDestroyPage(IWorkbenchPart part, PageRec pageRecord) {
-		// TODO Auto-generated method stub
-
 	}
 
 }
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
new file mode 100644
index 0000000000000000000000000000000000000000..2de5fb53f108b0b665a0a0dcdaa7899db0a6c78e
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMSPerspectiveFactory.java
@@ -0,0 +1,68 @@
+package de.bmotionstudio.gef.editor;
+
+import org.eclipse.ui.IFolderLayout;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+
+import de.bmotionstudio.gef.editor.library.LibraryView;
+import de.bmotionstudio.gef.editor.observer.view.ObserverView;
+
+public class BMSPerspectiveFactory implements IPerspectiveFactory {
+
+	public static String ID = "de.bmotionstudio.gef.editor.perspective";
+
+	@Override
+	public void createInitialLayout(IPageLayout layout) {
+
+		String editorArea = layout.getEditorArea();
+
+		// ProB Event View (Top-Left)
+		IFolderLayout left = layout.createFolder("left", IPageLayout.LEFT,
+				0.15f, editorArea);
+		left.addView("de.prob.ui.OperationView");
+
+		IFolderLayout leftb = layout.createFolder("leftb", IPageLayout.BOTTOM,
+				0.4f, "left");
+		leftb.addView("de.prob.ui.StateView");
+		leftb.addView("de.prob.ui.HistoryView");
+		leftb.addView("de.prob.ui.EventErrorView");
+
+		// Navigator + Rodin Problem View (Bottom-Left)
+		// IFolderLayout leftb = layout.createFolder("leftb",
+		// IPageLayout.BOTTOM,
+		// 0.6f, "left");
+		// leftb.addView("fr.systerel.explorer.navigator.view");
+
+		// Outline View + Palette View + Library View (Right)
+		IFolderLayout right1 = layout.createFolder("right1", IPageLayout.RIGHT,
+				0.80f, editorArea);
+		right1.addView(BMSPaletteView.ID);
+		right1.addView(BMotionOutlineView.ID);
+
+		IFolderLayout right2 = layout.createFolder("right2",
+				IPageLayout.BOTTOM, 0.60f, "right1");
+		right2.addView(LibraryView.ID);
+
+		// ProB State View + ProB History + ProB Event Error View (Right)
+		// IFolderLayout right2 = layout.createFolder("right2",
+		// IPageLayout.RIGHT,
+		// 0.6f, "right1");
+		// right2.addView("de.prob.ui.StateView");
+		// right2.addView("de.prob.ui.HistoryView");
+		// right2.addView("de.prob.ui.EventErrorView");
+
+		// Placeholder for new visualization views
+		IFolderLayout top = layout.createFolder("bottom1", IPageLayout.BOTTOM,
+				0.20f, IPageLayout.ID_EDITOR_AREA);
+		top.addPlaceholder(VisualizationViewPart.ID + ":*");
+
+		// Properties view + observer view + placeholder for new visualization
+		// views
+		IFolderLayout bottom = layout.createFolder("bottom2",
+				IPageLayout.BOTTOM, 0.65f, "bottom1");
+		bottom.addView(IPageLayout.ID_PROP_SHEET);
+		bottom.addView(ObserverView.ID);
+		
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionOutlinePage.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionOutlinePage.java
new file mode 100644
index 0000000000000000000000000000000000000000..d67b5086e0ab812286c1ea2c2d86080f29fe393c
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionOutlinePage.java
@@ -0,0 +1,170 @@
+package de.bmotionstudio.gef.editor;
+
+import org.eclipse.draw2d.LightweightSystem;
+import org.eclipse.draw2d.Viewport;
+import org.eclipse.draw2d.parts.ScrollableThumbnail;
+import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.gef.LayerConstants;
+import org.eclipse.gef.editparts.ScalableRootEditPart;
+import org.eclipse.gef.ui.parts.ContentOutlinePage;
+import org.eclipse.gef.ui.parts.TreeViewer;
+import org.eclipse.jface.action.Action;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.part.IPageSite;
+
+import de.bmotionstudio.gef.editor.part.BMSTreeEditPartFactory;
+
+public class BMotionOutlinePage extends ContentOutlinePage {
+
+	private SashForm sash;
+
+	private ScrollableThumbnail thumbnail;
+
+	private DisposeListener disposeListener;
+
+	private VisualizationViewPart viewPart;
+
+	public BMotionOutlinePage(VisualizationViewPart viewPart) {
+		super(new TreeViewer());
+		this.viewPart = viewPart;
+	}
+
+	@Override
+	public void init(IPageSite pageSite) {
+		super.init(pageSite);
+		// IActionBars bars = pageSite.getActionBars();
+		// ActionRegistry ar = getActionRegistry();
+		// bars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
+		// ar.getAction(ActionFactory.UNDO.getId()));
+		// bars.setGlobalActionHandler(ActionFactory.REDO.getId(),
+		// ar.getAction(ActionFactory.REDO.getId()));
+		// bars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
+		// ar.getAction(ActionFactory.DELETE.getId()));
+		// bars.setGlobalActionHandler(ActionFactory.COPY.getId(),
+		// ar.getAction(ActionFactory.COPY.getId()));
+		// bars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
+		// ar.getAction(ActionFactory.PASTE.getId()));
+		// buildCustomActions(bars, ar);
+		// bars.updateActionBars();
+	}
+
+	protected void configureOutlineViewer() {
+		getViewer().setEditDomain(this.viewPart.getEditDomain());
+		getViewer().setEditPartFactory(new BMSTreeEditPartFactory());
+		// ContextMenuProvider provider = new
+		// BMSContextMenuProvider(getViewer(),
+		// getActionRegistry());
+		// getViewer().setContextMenu(provider);
+		// getViewer().setKeyHandler(getCommonKeyHandler());
+	}
+
+	protected void hookOutlineViewer() {
+		// getSelectionSynchronizer().addViewer(getViewer());
+	}
+
+	protected void unhookOutlineViewer() {
+		GraphicalViewer graphicalViewer = viewPart.getGraphicalViewer();
+		// getSelectionSynchronizer().removeViewer(getViewer());
+		if (graphicalViewer.getControl() != null
+				&& !graphicalViewer.getControl().isDisposed())
+			graphicalViewer.getControl().removeDisposeListener(
+					disposeListener);
+	}
+
+	@Override
+	public void createControl(Composite parent) {
+		initializeOverview(parent);
+		viewPart.getGraphicalViewer().getControl()
+				.addDisposeListener(disposeListener);
+		configureOutlineViewer();
+		// hookOutlineViewer();
+		initializeOutlineViewer();
+		createMenu();
+	}
+
+	private void initializeOutlineViewer() {
+		getViewer().setContents(viewPart.getVisualization());
+	}
+
+	/**
+	 * 
+	 */
+	private void createMenu() {
+
+		Action expandAllAction = new Action("Expand All") {
+
+			@Override
+			public void run() {
+				for (TreeItem item : ((Tree) getViewer().getControl())
+						.getItems()) {
+					item.setExpanded(true);
+				}
+			}
+
+		};
+
+		Action collapseAllAction = new Action("Collapse All") {
+
+			@Override
+			public void run() {
+				for (TreeItem item : ((Tree) getViewer().getControl())
+						.getItems()) {
+					item.setExpanded(false);
+				}
+			}
+
+		};
+
+		getSite().getActionBars().getMenuManager().add(expandAllAction);
+		getSite().getActionBars().getMenuManager().add(collapseAllAction);
+
+	}
+
+	protected void initializeOverview(Composite parent) {
+		sash = new SashForm(parent, SWT.VERTICAL);
+
+		getViewer().createControl(sash);
+
+		Canvas canvas = new Canvas(sash, SWT.BORDER);
+		canvas.setBackground(Display.getDefault().getSystemColor(
+				SWT.COLOR_WHITE));
+		LightweightSystem lws = new LightweightSystem(canvas);
+
+		thumbnail = new ScrollableThumbnail(
+				(Viewport) ((ScalableRootEditPart) this.viewPart
+						.getGraphicalViewer().getRootEditPart()).getFigure());
+		thumbnail.setSource(((ScalableRootEditPart) this.viewPart
+				.getGraphicalViewer().getRootEditPart())
+				.getLayer(LayerConstants.PRINTABLE_LAYERS));
+
+		lws.setContents(thumbnail);
+
+		disposeListener = new DisposeListener() {
+			public void widgetDisposed(DisposeEvent e) {
+				if (thumbnail != null) {
+					thumbnail.deactivate();
+					thumbnail = null;
+				}
+			}
+		};
+	}
+
+	public Control getControl() {
+		return sash;
+	}
+
+	public void dispose() {
+		unhookOutlineViewer();
+		super.dispose();
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionOutlineView.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionOutlineView.java
new file mode 100644
index 0000000000000000000000000000000000000000..8e7b34f6d50c8c30ecb0e6c9ad93bedb7547fd8f
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionOutlineView.java
@@ -0,0 +1,26 @@
+package de.bmotionstudio.gef.editor;
+
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.views.contentoutline.ContentOutline;
+
+public class BMotionOutlineView extends ContentOutline {
+
+	public static final String ID = "de.bmotionstudio.gef.editor.OutlineView";
+
+	@Override
+	protected IWorkbenchPart getBootstrapPart() {
+		IWorkbenchPage page = getSite().getPage();
+		IViewPart view = page.findView(VisualizationViewPart.ID);
+		if (view != null)
+			return view;
+		return null;
+	}
+
+	@Override
+	protected boolean isImportant(IWorkbenchPart part) {
+		return part instanceof VisualizationViewPart;
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioEditor.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioEditor.java
index 842d6bf725dfbbeb91e47fd51902c20bf1a43941..ee9c49c0bc16acc589f5283d1fb9c9709048a3c4 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioEditor.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioEditor.java
@@ -15,6 +15,7 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStreamWriter;
+import java.util.EventObject;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
@@ -31,6 +32,7 @@ import org.eclipse.core.runtime.preferences.InstanceScope;
 import org.eclipse.core.runtime.preferences.PreferenceFilterEntry;
 import org.eclipse.gef.EditDomain;
 import org.eclipse.gef.commands.CommandStack;
+import org.eclipse.gef.commands.CommandStackListener;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
@@ -47,7 +49,6 @@ import org.eclipse.ui.IPerspectiveRegistry;
 import org.eclipse.ui.IViewReference;
 import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.IWorkbenchPartReference;
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.PartInitException;
@@ -114,11 +115,12 @@ public class BMotionStudioEditor extends EditorPart implements IPartListener2 {
 
 		// Yes --> just switch to this perspective
 		if (perspective != null) {
+			System.out.println("Swtich perspective");
 			switchPerspective(perspective.getId());
 		} else {
 			// No --> create a new one
 			IPerspectiveDescriptor originalPerspectiveDescriptor = perspectiveRegistry
-					.findPerspectiveWithId("de.bmotionstudio.perspective.run");
+					.findPerspectiveWithId(BMSPerspectiveFactory.ID);
 			switchPerspective(originalPerspectiveDescriptor.getId());
 			perspective = perspectiveRegistry.clonePerspective(perspectiveId,
 					perspectiveId, originalPerspectiveDescriptor);
@@ -240,6 +242,7 @@ public class BMotionStudioEditor extends EditorPart implements IPartListener2 {
 
 	@Override
 	public void dispose() {
+		getCommandStack().removeCommandStackListener(getCommandStackListener());
 		IWorkbenchPage activePage = PlatformUI.getWorkbench()
 				.getActiveWorkbenchWindow().getActivePage();
 		if (activePage != null)
@@ -255,9 +258,11 @@ public class BMotionStudioEditor extends EditorPart implements IPartListener2 {
 
 		file = ((IFileEditorInput) input).getFile();
 
+		InputStream inputStream = null;
+		
 		try {
 
-			InputStream inputStream = file.getContents();
+			inputStream = file.getContents();
 
 			XStream xstream = new XStream() {
 				@Override
@@ -296,7 +301,8 @@ public class BMotionStudioEditor extends EditorPart implements IPartListener2 {
 						"New Visualization View", visualization);
 
 				String secId = UUID.randomUUID().toString();
-				createVisualizationViewPart(secId, editDomain, visualization);
+				createVisualizationViewPart(secId, editDomain,
+						visualizationView);
 
 				simulation.getVisualizationViews()
 						.put(secId, visualizationView);
@@ -316,47 +322,58 @@ public class BMotionStudioEditor extends EditorPart implements IPartListener2 {
 					vis.setProjectFile(file);
 					// String partName = visView.getPartName();
 					IViewReference viewReference = site.getPage()
-							.findViewReference(
-							VisualizationViewPart.ID, secId);
+							.findViewReference(VisualizationViewPart.ID, secId);
 					// Check if view already exists
+
 					if (viewReference != null) {
-						VisualizationViewPart visualizationView = (VisualizationViewPart) viewReference
-								.getView(false);
-						if (visualizationView != null) {
-							visualizationView.initGraphicalViewer(editDomain,
-									vis);
-						} else {
-							//TODO return some error!
-						}
 					} else {
 						// If not, create a new one
-						createVisualizationViewPart(secId, editDomain, vis);
+						createVisualizationViewPart(secId, editDomain, visView);
 					}
 
 				}
 
+				// Close all unused visualization views
+				for (IViewReference viewReference : site.getPage()
+						.getViewReferences()) {
+					if (viewReference.getId().equals(VisualizationViewPart.ID)) {
+						if (!simulation.getVisualizationViews().containsKey(
+								viewReference.getSecondaryId()))
+							site.getPage().hideView(viewReference);
+					}
+				}
+
 			}
 
 		} catch (CoreException e) {
 			e.printStackTrace();
+		} finally {
+			try {
+				if (inputStream != null)
+					inputStream.close();
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
 		}
 
 		setSite(site);
 		setInput(input);
 
+		getCommandStack().addCommandStackListener(getCommandStackListener());
+
 	}
 
 	private VisualizationViewPart createVisualizationViewPart(String secId,
-			EditDomain editDomain, Visualization visualization)
+			EditDomain editDomain, VisualizationView visualizationView)
 			throws PartInitException {
 		IWorkbenchWindow window = PlatformUI.getWorkbench()
 				.getActiveWorkbenchWindow();
 		IWorkbenchPage activePage = window.getActivePage();
-		VisualizationViewPart visualizationView = (VisualizationViewPart) activePage
+		VisualizationViewPart visualizationViewPart = (VisualizationViewPart) activePage
 				.showView(VisualizationViewPart.ID, secId,
 						IWorkbenchPage.VIEW_VISIBLE);
-		visualizationView.initGraphicalViewer(editDomain, visualization);
-		return visualizationView;
+		return visualizationViewPart;
 	}
 
 	private void switchPerspective(String id) {
@@ -386,13 +403,14 @@ public class BMotionStudioEditor extends EditorPart implements IPartListener2 {
 
 	@Override
 	public void doSave(final IProgressMonitor monitor) {
-
+		PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
+				.savePerspectiveAs(perspective);
 		exportPerspective(perspective);
-
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		OutputStreamWriter writer = null;
 		try {
 			// saveProperties();
-			OutputStreamWriter writer = new OutputStreamWriter(out, "UTF8");
+			writer = new OutputStreamWriter(out, "UTF8");
 			XStream xstream = new XStream();
 			BMotionEditorPlugin.setAliases(xstream);
 			xstream.toXML(simulation, writer);
@@ -404,8 +422,15 @@ public class BMotionStudioEditor extends EditorPart implements IPartListener2 {
 			ce.printStackTrace();
 		} catch (IOException ioe) {
 			ioe.printStackTrace();
+		} finally {
+			try {
+				out.close();
+				if (writer != null)
+					writer.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
 		}
-
 	}
 
 	@Override
@@ -445,14 +470,14 @@ public class BMotionStudioEditor extends EditorPart implements IPartListener2 {
 					Visualization visualization = new Visualization(
 							"RushHour.bmso",
 							"EventB", version);
-					
-					createVisualizationViewPart(secId, editDomain,
-							visualization);
 
 					VisualizationView visualizationView = new VisualizationView(
 							"New Visulization View", visualization);
 					simulation.getVisualizationViews().put(secId,
 							visualizationView);
+					
+					createVisualizationViewPart(secId, editDomain,
+							visualizationView);
 
 					setDirty(true);
 
@@ -473,6 +498,24 @@ public class BMotionStudioEditor extends EditorPart implements IPartListener2 {
 	public void setFocus() {
 	}
 
+	public Simulation getSimulation() {
+		return simulation;
+	}
+
+	public void setSimulation(Simulation simulation) {
+		this.simulation = simulation;
+	}
+
+	private CommandStackListener commandStackListener = new CommandStackListener() {
+		public void commandStackChanged(EventObject event) {
+			setDirty(getCommandStack().isDirty());
+		}
+	};
+
+	protected CommandStackListener getCommandStackListener() {
+		return commandStackListener;
+	}
+
 	public CommandStack getCommandStack() {
 		return getEditDomain().getCommandStack();
 	}
@@ -483,9 +526,9 @@ public class BMotionStudioEditor extends EditorPart implements IPartListener2 {
 
 	@Override
 	public void partActivated(IWorkbenchPartReference partRef) {
-		IWorkbenchPart part = partRef.getPart(false);
-		if (part == this)
-			openPerspective(partRef.getPage());
+		// IWorkbenchPart part = partRef.getPart(false);
+		// if (part == this)
+		// openPerspective(partRef.getPage());
 	}
 
 	@Override
@@ -499,6 +542,11 @@ public class BMotionStudioEditor extends EditorPart implements IPartListener2 {
 			exportPerspective(perspective);
 			closePerspective(partRef.getPage(), perspective);
 			deletePerspective(partRef.getPage(), perspective);
+		} else if (partRef.getPart(true) instanceof VisualizationViewPart) {
+			VisualizationViewPart visPart = (VisualizationViewPart) partRef
+					.getPart(true);
+			String secondaryId = visPart.getViewSite().getSecondaryId();
+			simulation.getVisualizationViews().remove(secondaryId);
 		}
 	}
 
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 cdc04fbfc3160359f04a685e8857fcabba59d212..989afd6d02a77643d4e52bc6e2f0b654b319fe80 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
@@ -1,90 +1,225 @@
 package de.bmotionstudio.gef.editor;
 
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.PositionConstants;
 import org.eclipse.gef.EditDomain;
 import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.commands.CommandStack;
+import org.eclipse.gef.SnapToGeometry;
+import org.eclipse.gef.SnapToGrid;
 import org.eclipse.gef.editparts.ScalableRootEditPart;
-import org.eclipse.gef.editparts.ZoomManager;
+import org.eclipse.gef.rulers.RulerProvider;
 import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
+import org.eclipse.gef.ui.rulers.RulerComposite;
+import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.part.ViewPart;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.IPage;
+import org.eclipse.ui.part.MessagePage;
+import org.eclipse.ui.part.Page;
+import org.eclipse.ui.part.PageBook;
+import org.eclipse.ui.part.PageBookView;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
 import org.eclipse.ui.views.properties.IPropertySheetPage;
 
+import de.bmotionstudio.gef.editor.internal.BControlTransferDropTargetListener;
+import de.bmotionstudio.gef.editor.model.BMotionRuler;
+import de.bmotionstudio.gef.editor.model.BMotionRulerProvider;
+import de.bmotionstudio.gef.editor.model.Simulation;
 import de.bmotionstudio.gef.editor.model.Visualization;
+import de.bmotionstudio.gef.editor.model.VisualizationView;
 import de.bmotionstudio.gef.editor.part.BMSEditPartFactory;
 
-public class VisualizationViewPart extends ViewPart {
+public class VisualizationViewPart extends PageBookView {
 
 	public static String ID = "de.bmotionstudio.gef.editor.VisualizationView";
 	
 	private EditDomain editDomain;
 
-	private GraphicalViewer graphicalViewer;
+	private VisualizationView visualizationView;
 
-	private Visualization visualization;
-
-	public void initGraphicalViewer(EditDomain editDomain,
-			Visualization visualization) {
-		this.editDomain = editDomain;
-		this.visualization = visualization;
-		graphicalViewer.setEditDomain(editDomain);
-		graphicalViewer.setContents(visualization);
-	}
-
-	@Override
-	public void createPartControl(Composite parent) {
-		graphicalViewer = new ScrollingGraphicalViewer();
-		graphicalViewer.createControl(parent);
-		ScalableRootEditPart rootEditPart = new ScalableRootEditPart();
-		rootEditPart.setViewer(graphicalViewer);
-		graphicalViewer.setRootEditPart(rootEditPart);
-		graphicalViewer.setEditPartFactory(new BMSEditPartFactory());
-	}
+	private VisualizationViewPage page;
 
 	@Override
 	public Object getAdapter(@SuppressWarnings("rawtypes") Class type) {
 
-		// Adapter for zoom manager
-		if (type == ZoomManager.class)
-			return ((ScalableRootEditPart) getGraphicalViewer()
-					.getRootEditPart()).getZoomManager();
-//		if (type == IContentOutlinePage.class)
-//			return new BMotionOutlinePage();
-
+		// // Adapter for zoom manager
+		// if (type == ZoomManager.class)
+		// return ((ScalableRootEditPart) getGraphicalViewer()
+		// .getRootEditPart()).getZoomManager();
+		if (type == IContentOutlinePage.class) {
+			return new BMotionOutlinePage(this);
+		}
+		//
 		// Adapter for property page
 		if (type == IPropertySheetPage.class) {
 			BMotionStudioPropertySheet page = new BMotionStudioPropertySheet();
-			page.setRootEntry(new CustomSortPropertySheetEntry(
-					getCommandStack()));
+			page.setRootEntry(new CustomSortPropertySheetEntry(editDomain
+					.getCommandStack()));
 			return page;
 		}
 
 		return super.getAdapter(type);
 
 	}
-	
-	public CommandStack getCommandStack() {
-		return getEditDomain().getCommandStack();
+
+	@Override
+	public void setFocus() {
 	}
-	
-	protected EditDomain getEditDomain() {
-		return editDomain;
+
+	public Visualization getVisualization() {
+		return this.visualizationView.getVisualization();
 	}
 
-	protected GraphicalViewer getGraphicalViewer() {
-		return graphicalViewer;
+	public GraphicalViewer getGraphicalViewer() {
+		return page.getGraphicalViewer();
 	}
-	
+
 	@Override
-	public void setFocus() {
+	protected IPage createDefaultPage(PageBook book) {
+		MessagePage page = new MessagePage();
+		initPage(page);
+		page.createControl(book);
+		page.setMessage("NA");
+		return page;
 	}
 
-	public Visualization getVisualization() {
-		return visualization;
+	@Override
+	protected PageRec doCreatePage(IWorkbenchPart part) {
+		if (part instanceof BMotionStudioEditor) {
+			BMotionStudioEditor editor = (BMotionStudioEditor) part;
+			Simulation simulation = editor.getSimulation();
+			this.editDomain = editor.getEditDomain();
+			this.visualizationView = simulation.getVisualizationViews().get(
+					getViewSite().getSecondaryId());
+			if (this.editDomain == null || this.visualizationView == null)
+				return null;
+			page = new VisualizationViewPage();
+			initPage(page);
+			page.createControl(getPageBook());
+			return new PageRec(part, page);
+		}
+		return null;
+	}
+
+	@Override
+	protected void doDestroyPage(IWorkbenchPart part, PageRec pageRecord) {
+	}
+
+	@Override
+	protected IWorkbenchPart getBootstrapPart() {
+		IWorkbenchPage page = getSite().getPage();
+		if (page != null) {
+			return page.getActiveEditor();
+		}
+		return null;
+	}
+
+	@Override
+	protected boolean isImportant(IWorkbenchPart part) {
+		return part instanceof BMotionStudioEditor;
+	}
+
+	public EditDomain getEditDomain() {
+		return editDomain;
+	}
+
+	public void setEditDomain(EditDomain editDomain) {
+		this.editDomain = editDomain;
 	}
 
-	public void setVisualization(Visualization visualization) {
-		this.visualization = visualization;
+	public VisualizationView getVisualizationView() {
+		return visualizationView;
+	}
+
+	public void setVisualizationView(VisualizationView visualizationView) {
+		this.visualizationView = visualizationView;
+	}
+
+	private class VisualizationViewPage extends Page {
+
+		private RulerComposite container;
+
+		private GraphicalViewer graphicalViewer;
+
+		public GraphicalViewer getGraphicalViewer() {
+			return graphicalViewer;
+		}
+
+		@Override
+		public void createControl(Composite parent) {
+			container = new RulerComposite(parent, SWT.NONE);
+			// container = new Composite(parent, SWT.NONE);
+			// container.setLayout(new FillLayout());
+			graphicalViewer = new ScrollingGraphicalViewer();
+			graphicalViewer.createControl(container);
+			configureGraphicalViewer();
+			initGraphicalViewer();
+			setPartName(getVisualizationView().getName());
+		}
+
+		public void configureGraphicalViewer() {
+			ScalableRootEditPart rootEditPart = new ScalableRootEditPart();
+			rootEditPart.setViewer(graphicalViewer);
+			graphicalViewer.setRootEditPart(rootEditPart);
+			graphicalViewer.setEditPartFactory(new BMSEditPartFactory());
+			graphicalViewer.getControl().setBackground(ColorConstants.red);
+			container
+					.setGraphicalViewer((ScrollingGraphicalViewer) graphicalViewer);
+			graphicalViewer.setEditDomain(getEditDomain());
+			graphicalViewer
+					.addDropTargetListener(new BControlTransferDropTargetListener(
+							graphicalViewer, getVisualization()));
+			graphicalViewer.getControl().setBackground(ColorConstants.white);
+			loadProperties();
+		}
+
+		public void initGraphicalViewer() {
+			graphicalViewer.setContents(getVisualization());
+			loadProperties();
+		}
+
+		@Override
+		public Control getControl() {
+			return container;
+		}
+
+		@Override
+		public void setFocus() {
+		}
+
+		protected void loadProperties() {
+
+			// Ruler properties
+			BMotionRuler ruler = getVisualization().getRuler(
+					PositionConstants.WEST);
+			RulerProvider provider = null;
+			if (ruler != null) {
+				provider = new BMotionRulerProvider(ruler);
+			}
+			getGraphicalViewer().setProperty(
+					RulerProvider.PROPERTY_VERTICAL_RULER, provider);
+			ruler = getVisualization().getRuler(PositionConstants.NORTH);
+			provider = null;
+			if (ruler != null) {
+				provider = new BMotionRulerProvider(ruler);
+			}
+			getGraphicalViewer().setProperty(
+					RulerProvider.PROPERTY_HORIZONTAL_RULER, provider);
+			getGraphicalViewer().setProperty(
+					RulerProvider.PROPERTY_RULER_VISIBILITY,
+					getVisualization().getRulerVisibility());
+			getGraphicalViewer().setProperty(
+					SnapToGeometry.PROPERTY_SNAP_ENABLED,
+					getVisualization().isSnapToGeometryEnabled());
+			getGraphicalViewer().setProperty(SnapToGrid.PROPERTY_GRID_ENABLED,
+					getVisualization().isGridEnabled());
+			getGraphicalViewer().setProperty(SnapToGrid.PROPERTY_GRID_VISIBLE,
+					getVisualization().isGridEnabled());
+
+		}
+
 	}
 
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BMSTreeEditPartFactory.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BMSTreeEditPartFactory.java
index 93336446419897fa1b4daac4bcc009057612fcdc..f092cadc8f3846aad1a181156e41f4cd9c946bc8 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BMSTreeEditPartFactory.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BMSTreeEditPartFactory.java
@@ -18,6 +18,7 @@ import de.bmotionstudio.gef.editor.model.Visualization;
 
 public class BMSTreeEditPartFactory implements EditPartFactory {
 
+	@Override
 	public EditPart createEditPart(EditPart context, Object model) {
 
 		BMSAbstractTreeEditPart part = null;
@@ -51,6 +52,8 @@ public class BMSTreeEditPartFactory implements EditPartFactory {
 		if (part != null)
 			part.setModel(model);
 
+		System.out.println("CREATE EDIT PART!!! " + part);
+
 		return part;
 
 	}