diff --git a/org.eclipse.amp.agf/plugins/org.eclipse.amp.agf.chart/src/org/eclipse/amp/agf/chart/ChartViewPart.java b/org.eclipse.amp.agf/plugins/org.eclipse.amp.agf.chart/src/org/eclipse/amp/agf/chart/ChartViewPart.java
index dfbb746..5db9f91 100644
--- a/org.eclipse.amp.agf/plugins/org.eclipse.amp.agf.chart/src/org/eclipse/amp/agf/chart/ChartViewPart.java
+++ b/org.eclipse.amp.agf/plugins/org.eclipse.amp.agf.chart/src/org/eclipse/amp/agf/chart/ChartViewPart.java
@@ -25,37 +25,43 @@
  * The Class ChartViewPart.
  */
 public class ChartViewPart extends EditPartViewPart {
-    CachedColorProvider seriesColorProvider = new CachedColorProvider();
 
-    public RootEditPart createRoot() {
-        return new ScalableRootEditPart() {
-            public void refresh() {
-                ((EditPart) getChildren().get(0)).refresh();
-            }
-        };
-    }
+	public static final String VIEW_ID = "org.eclipse.amp.view.ChartView";
 
-    /**
-     * 
-     * @see org.eclipse.amp.agf.gef.EditPartViewPart#createModelListeners()
-     */
-    public void createModelListeners() {
-        // super.createModelListeners();
-        // getRootListener().setWaitForUpdate(false);
-    }
+	CachedColorProvider seriesColorProvider = new CachedColorProvider();
 
-    @Override
-    public EditPartFactory createFactory(Object contents) {
-        return new EditPartFactory() {
-            public EditPart createEditPart(EditPart context, Object object) {
-                ChartEditPart chartPart = new ChartEditPart();
+	@Override
+	public RootEditPart createRoot() {
+		return new ScalableRootEditPart() {
+			@Override
+			public void refresh() {
+				((EditPart) getChildren().get(0)).refresh();
+			}
+		};
+	}
 
-                chartPart.setSeriesColorProvider(seriesColorProvider);
+	/**
+	 * 
+	 * @see org.eclipse.amp.agf.gef.EditPartViewPart#createModelListeners()
+	 */
+	@Override
+	public void createModelListeners() {
+		// super.createModelListeners();
+		// getRootListener().setWaitForUpdate(false);
+	}
 
-                chartPart.setModel(getModel());
-                return chartPart;
-            };
-        };
-    }
+	@Override
+	public EditPartFactory createFactory(Object contents) {
+		return new EditPartFactory() {
+			public EditPart createEditPart(EditPart context, Object object) {
+				ChartEditPart chartPart = new ChartEditPart();
+
+				chartPart.setSeriesColorProvider(seriesColorProvider);
+
+				chartPart.setModel(getModel());
+				return chartPart;
+			}
+		};
+	}
 
 }
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/META-INF/MANIFEST.MF b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/META-INF/MANIFEST.MF
index 6c5e909..4eef267 100644
--- a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/META-INF/MANIFEST.MF
@@ -3,8 +3,7 @@
 Bundle-Name: Test AXF IDE
 Bundle-SymbolicName: org.eclipse.amp.axf.ide.test;singleton:=true
 Bundle-Version: 0.9.0
-Bundle-Activator: org.eclipse.amp.axf.ide.test.Activator
-Bundle-Vendor: eclipse.org
+Fragment-Host: org.eclipse.amp.axf.ide
 Require-Bundle: org.eclipse.ui,
  org.eclipse.core.runtime,
  org.eclipse.amp.axf.ide,
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/build.properties b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/build.properties
index d16ffb7..62a7813 100644
--- a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/build.properties
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/build.properties
@@ -3,5 +3,6 @@
 bin.includes = META-INF/,\
                .,\
                res/,\
-               about.html
+               about.html,\
+               fragment.xml
 src.includes = res/
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/fragment.xml b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/fragment.xml
new file mode 100644
index 0000000..2812aef
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/fragment.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<fragment>
+   <extension
+         point="org.eclipse.ui.views">
+      <view
+            allowMultiple="true"
+            class="org.eclipse.amp.axf.ide.EmtyView"
+            id="org.eclipse.amp.axf.ide.EmtyView"
+            name="EmtyView"
+            restorable="true">
+      </view>
+   </extension>
+
+</fragment>
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/src/org/eclipse/amp/axf/ide/EmtyView.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/src/org/eclipse/amp/axf/ide/EmtyView.java
new file mode 100644
index 0000000..1a8662a
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/src/org/eclipse/amp/axf/ide/EmtyView.java
@@ -0,0 +1,7 @@
+package org.eclipse.amp.axf.ide;
+
+import org.eclipse.amp.axf.view.ModelViewPart;
+
+public class EmtyView extends ModelViewPart {
+	public final static  String VIEW_ID = "org.eclipse.amp.axf.ide.EmtyView";
+}
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/src/org/eclipse/amp/axf/ide/ModelViewManagerTest.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/src/org/eclipse/amp/axf/ide/ModelViewManagerTest.java
new file mode 100644
index 0000000..1f6f9d2
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/src/org/eclipse/amp/axf/ide/ModelViewManagerTest.java
@@ -0,0 +1,82 @@
+package org.eclipse.amp.axf.ide;
+
+import static org.junit.Assert.fail;
+
+import org.ascape.model.Scape;
+import org.eclipse.amp.agf.gef.ModelEditPartInput;
+import org.eclipse.amp.axf.core.IEngine;
+import org.eclipse.amp.axf.core.IModel;
+import org.eclipse.amp.escape.ascape.wrap.ScapeWrapperModel;
+import org.eclipse.amp.escape.ide.EclipseEscapeRunner;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ModelViewManagerTest {
+
+	private ModelViewManager classToTest;
+
+	private ModelEditPartInput modelInput;
+
+	@Before
+	public void setUp() throws Exception {
+		classToTest = ModelViewManager.createNewInstance();
+		EclipseEscapeRunner runner = new EclipseEscapeRunner() {
+			@Override
+			public void close() {
+				//
+			}
+		};
+		SimpleModel model = new SimpleModel(new Scape());
+		model.engine = runner;
+		classToTest.register(model, runner);
+		modelInput = new ModelEditPartInput(model, null);
+	}
+
+	/**
+	 * The Method should also be callable if the main Thread is the caller Bug: The Application has a deadlock if the main
+	 * Thread call the method
+	 */
+	@Test
+	public void testCreateViewPart() {
+		ObserverThread thread = new ObserverThread();
+		thread.mainThread = Thread.currentThread();
+		thread.start();
+		classToTest.createViewPart(EmtyView.VIEW_ID, modelInput, "viewName");
+		if(thread.mainThreadInterrupted){
+			fail("Deadlock in createViewPart?");
+		}
+		thread.interrupt();
+	}
+
+	private class ObserverThread extends Thread{
+		Thread mainThread;
+		boolean mainThreadInterrupted = false;
+		public ObserverThread() {
+			// 
+		}
+		@Override
+		public void run() {
+			try {
+				sleep(10000);
+				mainThreadInterrupted = true;
+				mainThread.interrupt();
+			} catch (InterruptedException e) {
+				//
+			}
+		}
+	}
+	
+	private class SimpleModel extends ScapeWrapperModel implements IModel {
+		IEngine engine;
+
+		public SimpleModel(Scape scape) {
+			super(scape);
+		}
+
+		@Override
+		public IEngine getEngine() {
+			return engine;
+		}
+
+	}
+}
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/src/org/eclipse/amp/axf/ide/handlers/ModelRunHandlerTest.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/src/org/eclipse/amp/axf/ide/handlers/ModelRunHandlerTest.java
index 0ad3359..5545dd6 100644
--- a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/src/org/eclipse/amp/axf/ide/handlers/ModelRunHandlerTest.java
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide.test/src/org/eclipse/amp/axf/ide/handlers/ModelRunHandlerTest.java
@@ -148,6 +148,7 @@
 		}
 
 		public void addModelListener(ILifeCycleListener listener) {
+			//
 		}
 
 		public Collection<ILifeCycleListener> getModelListeners() {
@@ -155,6 +156,7 @@
 		}
 
 		public void removeModelListener(ILifeCycleListener listener) {
+			//
 		}
 
 		public String getTimeDescription() {
@@ -180,58 +182,52 @@
 		public IEngine getEngine() {
 			return new IEngine() {
 
-				@Override
 				public void stop() {
+					//
 				}
 
-				@Override
 				public void setUpdateGranularity(ITimeGranularity granularity) {
+					//
 				}
 
-				@Override
 				public void observationComplete(ILifeCycleListener observer) {
+					//
 				}
 
-				@Override
 				public boolean isThreadAlive() {
 					return false;
 				}
 
-				@Override
 				public boolean isRunning() {
 					return false;
 				}
 
-				@Override
 				public boolean isPaused() {
 					return false;
 				}
 
-				@Override
 				public boolean isCloseRequested() {
 					return false;
 				}
 
-				@Override
 				public ITimeGranularity getUpdateGranularity() {
 					return null;
 				}
 
-				@Override
 				public IObservationProvider getModel() {
 					return DummyModel.this;
 				}
 
-				@Override
 				public void control(EngineControl ModelControl) {
+					//
 				}
 
-				@Override
 				public void closeFinally() {
+					//
 				}
 
-				@Override
 				public void close() {
+					//
 				}
 			};
 		}
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ModelViewManager.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ModelViewManager.java
index 5fe76e2..6411f28 100644
--- a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ModelViewManager.java
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.ide/src/org/eclipse/amp/axf/ide/ModelViewManager.java
@@ -56,8 +56,6 @@
 
 	private static ModelViewManager instance;
 
-	boolean updated;
-
 	String priorPerspectiveID;
 
 	Map<IModel, List<IViewPart>> viewsForModel;
@@ -107,6 +105,16 @@
 		return instance;
 	}
 
+	/**
+	 * Only used for Unittests.
+	 * 
+	 * @return
+	 */
+	static ModelViewManager createNewInstance() {
+		instance = null;
+		return getInstance();
+	}
+
 	private final class PartCreator implements Runnable {
 		private final String name;
 
@@ -116,7 +124,7 @@
 
 		IViewPart part;
 
-		private PartCreator(String name, ModelInput editorInput, String id) {
+		PartCreator(String name, ModelInput editorInput, String id) {
 			this.name = name;
 			this.editorInput = editorInput;
 			this.id = id;
@@ -149,13 +157,12 @@
 						}
 					}.start();
 				} else if (part instanceof ErrorViewPart) {
+					//
 				} else {
 					throw new RuntimeException("Couldn't create model view part.");
 				}
 			} catch (org.eclipse.ui.PartInitException e) {
 				throw new RuntimeException("Couldn't instantiate model view " + this, e);
-			} finally {
-				updated = true;
 			}
 		}
 
@@ -168,7 +175,7 @@
 	 * 
 	 * @author mparker
 	 */
-	private final class ActivationListener implements IPartListener {
+	final class ActivationListener implements IPartListener {
 		private void assignPart(final IWorkbenchPart part) {
 			if (part instanceof IModelPart && ((IModelPart) part).getAdapter(IModel.class) != null) {
 				new Thread() {
@@ -201,6 +208,7 @@
 		}
 
 		public void partDeactivated(IWorkbenchPart part) {
+			//
 		}
 
 		public void partOpened(IWorkbenchPart part) {
@@ -393,16 +401,8 @@
 	 *          the name
 	 */
 	public IViewPart createViewPart(final String id, final ModelInput editorInput, final String name) {
-		updated = false;
 		PartCreator creator = new PartCreator(name, editorInput, id);
-		PlatformUI.getWorkbench().getDisplay().asyncExec(creator);
-		while (!updated) {
-			try {
-				Thread.sleep(50);
-
-			} catch (InterruptedException e) {
-			}
-		}
+		PlatformUI.getWorkbench().getDisplay().syncExec(creator);
 		return creator.getPart();
 	}
 
@@ -487,6 +487,7 @@
 
 		wb.addWorkbenchListener(new IWorkbenchListener() {
 			public void postShutdown(IWorkbench workbench) {
+				//
 			}
 
 			public boolean preShutdown(IWorkbench workbench, boolean forced) {
@@ -572,8 +573,7 @@
 	 * @param adaptableObject
 	 * @param adapterType
 	 * @return
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object,
-	 *      java.lang.Class)
+	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
 	 */
 	public Object getAdapter(Object adaptableObject, Class adapterType) {
 		if (adapterType == IEngine.class && adaptableObject instanceof IModel) {
@@ -592,6 +592,7 @@
 	 * @return
 	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
 	 */
+	@SuppressWarnings("rawtypes")
 	public Class[] getAdapterList() {
 		return new Class[] { IEngine.class, IModel.class };
 	}
diff --git a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.amf.ide/src/org/eclipse/amp/escape/view/EMFDataOutputView.java b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.amf.ide/src/org/eclipse/amp/escape/view/EMFDataOutputView.java
index 34c47ff..3264fe6 100644
--- a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.amf.ide/src/org/eclipse/amp/escape/view/EMFDataOutputView.java
+++ b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.amf.ide/src/org/eclipse/amp/escape/view/EMFDataOutputView.java
@@ -70,6 +70,7 @@
 	private ResourceSet resourceSet;
 
 	private Catalog catalog;
+
 	private Run currentRun;
 
 	Map<DataSeries, Measurement> measureForSeries = new HashMap<DataSeries, Measurement>();
diff --git a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ascape.chart/src/org/ascape/view/vis/ChartView.java b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ascape.chart/src/org/ascape/view/vis/ChartView.java
index b670d83..234f097 100644
--- a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ascape.chart/src/org/ascape/view/vis/ChartView.java
+++ b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ascape.chart/src/org/ascape/view/vis/ChartView.java
@@ -15,6 +15,7 @@
 import org.ascape.util.data.DataSelection;
 import org.eclipse.amp.agf.chart.CachedColorProvider;
 import org.eclipse.amp.agf.chart.ChartEditPart;
+import org.eclipse.amp.agf.chart.ChartViewPart;
 import org.eclipse.amp.escape.ascape.view.EditPartScapeView;
 import org.eclipse.gef.EditPart;
 import org.eclipse.swt.graphics.Color;
@@ -29,7 +30,7 @@
     CachedColorProvider seriesColorProvider = new CachedColorProvider();
 
     public ChartView() {
-        super("org.eclipse.amp.view.ChartView", null, "Chart View");
+        super(ChartViewPart.VIEW_ID, null, "Chart View");
     }
 
     public EditPart createEditPart(EditPart context, Object model) {
diff --git a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ascape.chart/src/org/eclipse/amp/escape/ascape/chart/ChartCustomizer.java b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ascape.chart/src/org/eclipse/amp/escape/ascape/chart/ChartCustomizer.java
index 4ef6591..01a1e26 100644
--- a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ascape.chart/src/org/eclipse/amp/escape/ascape/chart/ChartCustomizer.java
+++ b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ascape.chart/src/org/eclipse/amp/escape/ascape/chart/ChartCustomizer.java
@@ -25,8 +25,6 @@
 import org.eclipse.amp.agf.chart.ChartEditPart;
 import org.eclipse.amp.agf.chart.ChartViewPart;
 import org.eclipse.amp.escape.ascape.wrap.ScapeWrapperModel;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.draw2d.SWTGraphics;
 import org.eclipse.jface.viewers.ArrayContentProvider;
 import org.eclipse.jface.viewers.CellEditor;
 import org.eclipse.jface.viewers.CheckboxCellEditor;
@@ -44,24 +42,19 @@
 import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.IActionBars;
 import org.eclipse.ui.IPartListener;
 import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.statushandlers.StatusManager;
 
-// TODO: Auto-generated Javadoc
-/**
- * The Class ChartCustomizer.
- */
+
 public class ChartCustomizer extends ViewPart {
+	
+	public static final String VIEW_ID = "org.eclipse.amp.view.customizer.Chart";
 
 	protected Scape scape;
 	protected DataSelection dataSelection;
@@ -148,7 +141,7 @@
 		protected CellEditor getCellEditor(final Object element) {
 			CheckboxCellEditor checkboxCellEditor = checkBoxFor.get(element);
 			if (checkboxCellEditor == null) {
-				checkboxCellEditor = new CheckboxCellEditor(selectTable
+				checkboxCellEditor = new CheckboxCellEditor(getSelectTable()
 						.getTable());
 			}
 			return checkboxCellEditor;
@@ -185,13 +178,13 @@
 				getSite().getShell().getDisplay().syncExec(new Runnable() {
 					public void run() {
 						chartEditPart.refresh();
-					};
+					}
 				});
 				getSite().getShell().getDisplay().asyncExec(new Runnable() {
 					public void run() {
-						selectTable.getTable().deselectAll();
-						selectTable.refresh(true);
-					};
+						getSelectTable().getTable().deselectAll();
+						getSelectTable().refresh(true);
+					}
 				});
 			}
 		}
@@ -222,6 +215,7 @@
 		 * @return
 		 * @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
 		 */
+		@Override
 		public String getText(Object element) {
 			return null;
 		}
@@ -263,6 +257,7 @@
 		 * @return
 		 * @see org.eclipse.jface.viewers.ColumnLabelProvider#getBackground(java.lang.Object)
 		 */
+		@Override
 		public Color getBackground(Object element) {
 			DataSeries dataSeries = getDataSeries(element);
 			if (dataSeries == null) {
@@ -291,6 +286,7 @@
 	 * @param parent
 	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
 	 */
+	@Override
 	public void createPartControl(Composite parent) {
 		// Overall
 		control = new Composite(parent, SWT.HORIZONTAL);
@@ -370,15 +366,19 @@
 			}
 
 			public void partBroughtToTop(IWorkbenchPart part) {
+				//
 			}
 
 			public void partClosed(IWorkbenchPart part) {
+				//
 			}
 
 			public void partDeactivated(IWorkbenchPart part) {
+				//
 			}
 
 			public void partOpened(IWorkbenchPart part) {
+				//
 			}
 
 		});
@@ -403,6 +403,7 @@
 				SWT.LEFT);
 		statNameColumn.getColumn().setText("Name");
 		statNameColumn.setLabelProvider(new ColumnLabelProvider() {
+			@Override
 			public String getText(Object element) {
 				return ((StatCollector) element).getName();
 			}
@@ -466,15 +467,7 @@
 	 */
 	@Override
 	public void setFocus() {
-	}
-
-	/**
-	 * Sets the action bars.
-	 * 
-	 * @param actionBars
-	 *            the new action bars
-	 */
-	public void setActionBars(IActionBars actionBars) {
+		//
 	}
 
 	public ChartEditPart getChartEditPart() {
@@ -484,4 +477,8 @@
 	public void refresh() {
 		selectTable.refresh();
 	}
+	
+	TableViewer getSelectTable() {
+		return selectTable;
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ide/src/org/eclipse/amp/escape/ide/EclipseEscapeRunner.java b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ide/src/org/eclipse/amp/escape/ide/EclipseEscapeRunner.java
index f79165b..602f9c6 100644
--- a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ide/src/org/eclipse/amp/escape/ide/EclipseEscapeRunner.java
+++ b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ide/src/org/eclipse/amp/escape/ide/EclipseEscapeRunner.java
@@ -59,19 +59,23 @@
 
 	protected IProgressMonitor modelMonitor;
 
-	IModel model;
+	private IModel model;
 
-	IProject project;
+	private IProject project;
 
 	private IStatus finishStatus = Status.OK_STATUS;
 
-	TimeGranularity updateGranularity = TimeGranularity.DEFAULT_GRANULARITY;
+	private ITimeGranularity updateGranularity = TimeGranularity.DEFAULT_GRANULARITY;
 
 	public final static long KILL_AFTER_NO_RESPONSE_TIME = 5000;
 
 	// would be nice to have this in Ascape proper but not worth IP submission
 	private boolean closeOnStop = false;
 
+	boolean modelShutdown = false;
+
+	private Job escapeRun;
+
 	/**
 	 * Open.
 	 * 
@@ -117,6 +121,26 @@
 	 *          true if this method should only return on execution completion.
 	 */
 	public void open(final IResource projectResource, final String modelClassName, String modelName, String[] args, boolean block) {
+		openNotStart(projectResource, modelClassName, modelName, args);
+		start();
+		if (block) {
+			while (!modelShutdown) {
+				try {
+					Thread.sleep(30L);
+				} catch (InterruptedException e) {
+					//
+				}
+			}
+		}
+	}
+	/**
+	 * Open all Files and initialize the Simulation, but don't run it.
+	 * @param projectResource
+	 * @param modelClassName
+	 * @param modelName
+	 * @param args
+	 */
+	public void openNotStart(final IResource projectResource, final String modelClassName, String modelName, String[] args){
 		this.project = projectResource.getProject();
 		setStartOnOpen(false);
 		setAutoRestart(false);
@@ -162,17 +186,8 @@
 				model.addModelListener(listenerWrapper);
 			}
 		}
-		start();
-		if (block) {
-			while (!modelShutdown) {
-				try {
-					Thread.sleep(30L);
-				} catch (InterruptedException e) {
-				}
-			}
-		}
 	}
-
+	
 	protected void addConsole(String modelName) {
 		final MessageConsole eclipseConsole = new MessageConsole("Run " + modelName, null);
 		getEnvironment().getConsole().setIMessageStream(new MessageAdapter(eclipseConsole));
@@ -242,10 +257,6 @@
 		escapeRun.schedule();
 	}
 
-	boolean modelShutdown = false;
-
-	private Job escapeRun;
-
 	/**
 	 * 
 	 * @see org.ascape.runtime.Runner#close()
@@ -284,6 +295,7 @@
 				elapsed += 30;
 			}
 		} catch (InterruptedException e) {
+			//
 		}
 		if (modelMonitor != null) {
 			modelMonitor.setTaskName("Closed");
@@ -439,7 +451,7 @@
 	 * @see org.eclipse.amp.axf.core.IEngine#setUpdateGranularity(org.eclipse.amp.axf.time.ITimeGranularity)
 	 */
 	public void setUpdateGranularity(ITimeGranularity granularity) {
-		this.updateGranularity = (TimeGranularity) granularity;
+		this.updateGranularity = granularity;
 	}
 
 	public IProject getExecutingProject() {
@@ -484,5 +496,8 @@
 	public boolean isThreadAlive() {
 		return isModelThreadAlive();
 	}
-
+	
+	public Job getEscapeRun() {
+		return escapeRun;
+	}
 }
