diff --git a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.amf.ide/src/org/eclipse/amp/escape/amf/ide/EclipseEMFOutputRunner.java b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.amf.ide/src/org/eclipse/amp/escape/amf/ide/EclipseEMFOutputRunner.java
index a1d169f..38400d6 100644
--- a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.amf.ide/src/org/eclipse/amp/escape/amf/ide/EclipseEMFOutputRunner.java
+++ b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.amf.ide/src/org/eclipse/amp/escape/amf/ide/EclipseEMFOutputRunner.java
@@ -12,11 +12,11 @@
 	/**
 	 * 
 	 */
-	private final SContext model;
+	private SContext model;
 
-	private final IResource resource;
+	private IResource resource;
 
-	private final AParInterpreter aParInterpreter;
+	private AParInterpreter aParInterpreter;
 
 	public EclipseEMFOutputRunner(SContext model, IResource resource,
 			AParInterpreter aParInterpreter) {
@@ -34,6 +34,7 @@
 	 * 
 	 * @see org.ascape.runtime.Runner#run()
 	 */
+	@Override
 	public synchronized void run() {
 		boolean found = false;
 		ArrayList scapeListeners = new ArrayList(getScape().getScapeListeners());
@@ -55,6 +56,7 @@
 	 * @see org.ascape.runtime.Runner#openImplementation(java.lang.String[],
 	 *      boolean)
 	 */
+	@Override
 	public void openImplementation(String[] args, boolean block) {
 		if (aParInterpreter != null) {
 			aParInterpreter.assignValues(new Object[] { getRootScape(), this },
diff --git a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.amf.ide/src/org/eclipse/amp/escape/amf/ide/ExecuteAMFHandler.java b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.amf.ide/src/org/eclipse/amp/escape/amf/ide/ExecuteAMFHandler.java
index 18b45ef..8084065 100644
--- a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.amf.ide/src/org/eclipse/amp/escape/amf/ide/ExecuteAMFHandler.java
+++ b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.amf.ide/src/org/eclipse/amp/escape/amf/ide/ExecuteAMFHandler.java
@@ -43,7 +43,8 @@
         super(headless);
     }
 
-    protected void executeOpen(EclipseEscapeRunner eclipseRunner, Object executed, IProgressMonitor monitor) {
+    @Override
+		protected EclipseEscapeRunner executeOpen(Object executed, IProgressMonitor monitor) {
         if (executed instanceof IResource) {
             modelResource = (IResource) executed;
             File file = modelResource.getLocation().toFile();
@@ -53,12 +54,15 @@
                     model = MetaABMPersist.create(file).load();
                     SImplementation impl = model.getImplementation();
                     final String modelClassName = getModelClass(impl);
+                    EclipseEscapeRunner eclipseRunner = createRunner();
                     eclipseRunner.open(modelResource, modelClassName, model.getLabel());
+                    return eclipseRunner;
                 } catch (IOException e) {
                     EscapeIDEPlugin.warn("Couldn't load model.", e);
                 }
             }
         }
+        return null;
     }
 
     protected String getModelClass(SImplementation impl) {
@@ -66,7 +70,8 @@
         return modelClassName;
     }
 
-    protected boolean handleSelect(Object sel) {
+    @Override
+		protected boolean handleSelect(Object sel) {
         if (sel instanceof IResource) {
             IResource res = (IResource) sel;
             if (res.getFileExtension() != null && res.getFileExtension().equals("metaabm")) {
diff --git a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.amf.ide/src/org/eclipse/amp/escape/amf/ide/ExecuteParameterHandler.java b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.amf.ide/src/org/eclipse/amp/escape/amf/ide/ExecuteParameterHandler.java
index 4ce96b1..99c74ee 100644
--- a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.amf.ide/src/org/eclipse/amp/escape/amf/ide/ExecuteParameterHandler.java
+++ b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.amf.ide/src/org/eclipse/amp/escape/amf/ide/ExecuteParameterHandler.java
@@ -17,6 +17,7 @@
 
 import org.eclipse.amp.amf.parameters.AParFactory;
 import org.eclipse.amp.amf.parameters.AParInterpreter;
+import org.eclipse.amp.axf.time.TimeGranularity;
 import org.eclipse.amp.escape.command.ExecuteHandler;
 import org.eclipse.amp.escape.ide.EclipseEscapeRunner;
 import org.eclipse.core.resources.IProject;
@@ -58,26 +59,36 @@
      * @see org.eclipse.amp.escape.command.ExecuteHandler#executeOpen(org.eclipse.amp.escape.ide.EclipseEscapeRunner,
      * java.lang.Object, org.eclipse.core.runtime.IProgressMonitor)
      */
-    protected void executeOpen(EclipseEscapeRunner eclipseRunner, Object executed, IProgressMonitor monitor) {
+    @Override
+		protected EclipseEscapeRunner executeOpen(Object executed, IProgressMonitor monitor) {
         if (executed instanceof IResource) {
             modelResource = (IResource) executed;
             IProject project = modelResource.getProject();
             if (modelResource.getFileExtension().equals("apar")) {
                 // a bit awkward..
                 setInterpreter((AParInterpreter) AParFactory.create(null).getInterpreter(modelResource));
-                eclipseRunner.setAutoRestart(false);
                 model = getInterpreter().getRootContext();
+                //If you create the runner sooner the member model and modelResource are null. So the headless run in the output file throw an assertion 
+                EclipseEscapeRunner eclipseRunner = createRunner();
+                if (isHeadless()) {
+                    eclipseRunner.setUpdateGranularity(TimeGranularity.createFrequencyGranularity(Integer.MAX_VALUE));
+                }
+                eclipseRunner.setMonitor(monitor);
+                eclipseRunner.setAutoRestart(false);
                 eclipseRunner.open(project, model.getImplementation().getQualifiedName(),
                                    getInterpreter().getRunName(), getInterpreter().getArgs());
+                return eclipseRunner;
             }
         }
+        return null;
     }
 
     /**
      * @return
      * @see org.eclipse.amp.escape.command.ExecuteHandler#createRunner()
      */
-    protected EclipseEscapeRunner createRunner() {
+    @Override
+		protected EclipseEscapeRunner createRunner() {
         Runner.setDisplayGraphics(!isHeadless());
         EclipseEscapeRunner runner = new EclipseEscapeRunner() {
             private static final long serialVersionUID = 1L;
@@ -87,7 +98,8 @@
              * @param block
              * @see org.ascape.runtime.Runner#openImplementation(java.lang.String[], boolean)
              */
-            public void openImplementation(String[] args, boolean block) {
+            @Override
+						public void openImplementation(String[] args, boolean block) {
                 getInterpreter().assignValues(new Object[] { getRootScape(), this }, null);
                 super.openImplementation(args, block);
             }
@@ -101,7 +113,8 @@
      * 
      * @see org.eclipse.amp.escape.command.ExecuteHandler#handleSelect(java.lang.Object)
      */
-    protected boolean handleSelect(Object sel) {
+    @Override
+		protected boolean handleSelect(Object sel) {
         return sel instanceof IResource && ((IResource) sel).getFileExtension() != null
         && ((IResource) sel).getFileExtension().equals("apar");
     }
diff --git a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ide/src/org/eclipse/amp/escape/command/ExecuteHandler.java b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ide/src/org/eclipse/amp/escape/command/ExecuteHandler.java
index 33c57f7..784c165 100644
--- a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ide/src/org/eclipse/amp/escape/command/ExecuteHandler.java
+++ b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ide/src/org/eclipse/amp/escape/command/ExecuteHandler.java
@@ -55,28 +55,31 @@
      */
     @Override
     public final void execute(final Object executed, String name) throws ExecutionException {
-        final EclipseEscapeRunner eclipseRunner = createRunner();
-        if (isHeadless()) {
-            eclipseRunner.setUpdateGranularity(TimeGranularity.createFrequencyGranularity(Integer.MAX_VALUE));
-        }
         Job escapeRun = new Job("Run " + name) {
-            protected IStatus run(IProgressMonitor monitor) {
+        	private EclipseEscapeRunner eclipseRunner;
+            @Override
+						protected IStatus run(IProgressMonitor monitor) {
                 setMonitor(monitor);
-                eclipseRunner.setMonitor(monitor);
                 try {
-                    executeOpen(eclipseRunner, executed, monitor);
-
+                    eclipseRunner = executeOpen(executed, monitor);
                 } catch (RuntimeException e) {
                     setMonitor(null);
                     throw e;
                 }
                 setMonitor(null);
-                return eclipseRunner.getFinishStatus();
+                if(eclipseRunner != null){
+                	return eclipseRunner.getFinishStatus();
+                }else{
+                	return Status.CANCEL_STATUS;
+                }
             }
 
-            protected void canceling() {
+            @Override
+						protected void canceling() {
+            	if(eclipseRunner != null){
                 eclipseRunner.setFinishStatus(Status.CANCEL_STATUS);
                 eclipseRunner.closeFinally();
+            	}
             }
         };
         escapeRun.setPriority(Job.LONG);
@@ -86,11 +89,10 @@
     /**
      * Execute open.
      * 
-     * @param eclipseRunner the eclipse runner
      * @param executed the executed scape resource/name
      * @param monitor the monitor
      */
-    protected abstract void executeOpen(final EclipseEscapeRunner eclipseRunner, final Object executed,
+    protected abstract EclipseEscapeRunner executeOpen(final Object executed,
             IProgressMonitor monitor);
 
     /**
diff --git a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ide/src/org/eclipse/amp/escape/command/ExecuteJavaHandler.java b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ide/src/org/eclipse/amp/escape/command/ExecuteJavaHandler.java
index e2934a8..32c28a3 100644
--- a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ide/src/org/eclipse/amp/escape/command/ExecuteJavaHandler.java
+++ b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.ide/src/org/eclipse/amp/escape/command/ExecuteJavaHandler.java
@@ -51,14 +51,18 @@
      * @see org.eclipse.amp.escape.command.ExecuteHandler#executeOpen(org.eclipse.amp.escape.ide.EclipseEscapeRunner,
      * java.lang.Object, org.eclipse.core.runtime.IProgressMonitor)
      */
-    protected void executeOpen(final EclipseEscapeRunner eclipseRunner, final Object executed, IProgressMonitor monitor) {
+    @Override
+		protected EclipseEscapeRunner executeOpen(final Object executed, IProgressMonitor monitor) {
         // brain dead Java strikes again..
         if (isSupertype(executed, "org.ascape.model.Scape")) {
             IType javaClass = getType(executed);
             IJavaProject javaProject = javaClass.getJavaProject();
+            EclipseEscapeRunner eclipseRunner = createRunner();
             eclipseRunner.open(javaProject.getProject(), javaClass.getFullyQualifiedName(), javaClass
                                .getElementName());
+            return eclipseRunner;
         }
+        return null;
     }
 
     /*
@@ -66,7 +70,8 @@
      * 
      * @see org.eclipse.amp.escape.command.ExecuteHandler#handleSelect(java.lang.Object)
      */
-    protected boolean handleSelect(Object sel) {
+    @Override
+		protected boolean handleSelect(Object sel) {
         return sel instanceof ICompilationUnit || sel instanceof IType;
     }
 
@@ -89,6 +94,7 @@
                 }
             }
         } catch (JavaModelException e) {
+        	//
         }
         return false;
     }
