[391289] - The QVTo builder is not cancellable 
[431082] - Progress monitoring for TransformationExecutor
[422269] - ExecutionContext does not provide an interface to set config
properties
diff --git a/plugins/org.eclipse.m2m.qvt.oml.debug.core/src/org/eclipse/m2m/qvt/oml/debug/core/vm/QVTODebugEvaluator.java b/plugins/org.eclipse.m2m.qvt.oml.debug.core/src/org/eclipse/m2m/qvt/oml/debug/core/vm/QVTODebugEvaluator.java
index a2d7e7e..3006571 100644
--- a/plugins/org.eclipse.m2m.qvt.oml.debug.core/src/org/eclipse/m2m/qvt/oml/debug/core/vm/QVTODebugEvaluator.java
+++ b/plugins/org.eclipse.m2m.qvt.oml.debug.core/src/org/eclipse/m2m/qvt/oml/debug/core/vm/QVTODebugEvaluator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009,2012 R.Dvorak and others.
+ * Copyright (c) 2009,2014 R.Dvorak and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *     Radek Dvorak - initial API and implementation
- *     Christopher Gerking - bug 394498
+ *     Christopher Gerking - bugs 394498, 431082
  *******************************************************************************/
 package org.eclipse.m2m.qvt.oml.debug.core.vm;
 
@@ -25,8 +25,6 @@
 import org.eclipse.m2m.internal.qvt.oml.ast.env.QvtOperationalEvaluationEnv;
 import org.eclipse.m2m.internal.qvt.oml.compiler.CompiledUnit;
 import org.eclipse.m2m.internal.qvt.oml.evaluator.InternalEvaluator;
-import org.eclipse.m2m.internal.qvt.oml.evaluator.ModelInstance;
-import org.eclipse.m2m.internal.qvt.oml.evaluator.ModuleInstance;
 import org.eclipse.m2m.internal.qvt.oml.evaluator.QvtGenericVisitorDecorator;
 import org.eclipse.m2m.internal.qvt.oml.evaluator.QvtInterruptedExecutionException;
 import org.eclipse.m2m.internal.qvt.oml.evaluator.QvtOperationalEvaluationVisitor;
@@ -46,7 +44,6 @@
 import org.eclipse.m2m.qvt.oml.debug.core.vm.protocol.VMSuspendRequest;
 import org.eclipse.m2m.qvt.oml.debug.core.vm.protocol.VMTerminateRequest;
 import org.eclipse.m2m.qvt.oml.ecore.ImperativeOCL.AssignExp;
-import org.eclipse.m2m.qvt.oml.util.IContext;
 import org.eclipse.ocl.expressions.LoopExp;
 import org.eclipse.ocl.expressions.OCLExpression;
 import org.eclipse.ocl.expressions.Variable;
@@ -493,7 +490,7 @@
 
 		@Override
 		protected Object genericPreVisitAST(ASTNode visited) {
-			if (getContext().getMonitor() != null && getContext().getMonitor().isCanceled()) {    				
+			if (getContext().getProgressMonitor() != null && getContext().getProgressMonitor().isCanceled()) {    				
 				throwQVTException(new QvtInterruptedExecutionException());    				
 			}
 			return preElementVisit(visited);
diff --git a/plugins/org.eclipse.m2m.qvt.oml.editor.ui/src/org/eclipse/m2m/internal/qvt/oml/editor/ui/QvtCompilerFacade.java b/plugins/org.eclipse.m2m.qvt.oml.editor.ui/src/org/eclipse/m2m/internal/qvt/oml/editor/ui/QvtCompilerFacade.java
index 645ede2..338879b 100644
--- a/plugins/org.eclipse.m2m.qvt.oml.editor.ui/src/org/eclipse/m2m/internal/qvt/oml/editor/ui/QvtCompilerFacade.java
+++ b/plugins/org.eclipse.m2m.qvt.oml.editor.ui/src/org/eclipse/m2m/internal/qvt/oml/editor/ui/QvtCompilerFacade.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2009 Borland Software Corporation and others.
+ * Copyright (c) 2007, 2014 Borland Software Corporation and others.
  * 
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -8,6 +8,7 @@
  * 
  * Contributors:
  *     Borland Software Corporation - initial API and implementation
+ *     Christopher Gerking - bug 431082
  *******************************************************************************/
 package org.eclipse.m2m.internal.qvt.oml.editor.ui;
 
@@ -56,7 +57,7 @@
         if (monitor == null) {
             monitor = new NullProgressMonitor();
         }
-        monitor.beginTask(Messages.QvtCompilerFacade_compilingDoc , 4);
+        monitor.beginTask(Messages.QvtCompilerFacade_compilingDoc, 4);
         CompiledUnit result = null;
 		
 		try {
@@ -73,7 +74,7 @@
 				final UnitProxy inMemoryUnit = new InMemoryUnitProxy(unit.getNamespace(), unit.getName(), unit.getURI(), contents, unitResolver);
 				
 				QVTOCompiler compiler = CompilerUtils.createCompiler();				
-                result = compiler.compile(inMemoryUnit, options, new BasicMonitor.EclipseSubProgress(monitor, 2));
+                result = compiler.compile(inMemoryUnit, options, CompilerUtils.createMonitor(BasicMonitor.toMonitor(monitor), 3));
                 
                 if (result != null) {
                     documentProvider.setMappingModule(result);
diff --git a/plugins/org.eclipse.m2m.qvt.oml.editor.ui/src/org/eclipse/m2m/internal/qvt/oml/editor/ui/QvtReconcilingStrategy.java b/plugins/org.eclipse.m2m.qvt.oml.editor.ui/src/org/eclipse/m2m/internal/qvt/oml/editor/ui/QvtReconcilingStrategy.java
index 58ee25e..16a63ca 100644
--- a/plugins/org.eclipse.m2m.qvt.oml.editor.ui/src/org/eclipse/m2m/internal/qvt/oml/editor/ui/QvtReconcilingStrategy.java
+++ b/plugins/org.eclipse.m2m.qvt.oml.editor.ui/src/org/eclipse/m2m/internal/qvt/oml/editor/ui/QvtReconcilingStrategy.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2009 Borland Software Corporation and others.
+ * Copyright (c) 2007, 2014 Borland Software Corporation and others.
  * 
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -8,11 +8,13 @@
  * 
  * Contributors:
  *     Borland Software Corporation - initial API and implementation
+ *     Christopher Gerking - bug 391289
  *******************************************************************************/
 package org.eclipse.m2m.internal.qvt.oml.editor.ui;
 
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.IRegion;
@@ -69,7 +71,7 @@
         CompiledUnit compilationResult = null;
         try {
 			myReconcilingListener.aboutToBeReconciled();			
-	        compilationResult = getCompiler(editingInQvtSourceContainer);	        
+	        compilationResult = getCompilationResult(editingInQvtSourceContainer);	        
         } 
         catch (Exception ex) {
             handleError(ex);
@@ -78,7 +80,7 @@
         }
     }
 
-	private CompiledUnit getCompiler(boolean editingInQvtSourceContainer) {
+	private CompiledUnit getCompilationResult(boolean editingInQvtSourceContainer) {
 		CompiledUnit compilationResult;
 		QvtCompilerOptions options = new QvtCompilerOptions();
 		options.setShowAnnotations(editingInQvtSourceContainer);
@@ -90,6 +92,11 @@
 	}
 
 	private void handleError(Exception ex) {
+		
+		if (ex instanceof OperationCanceledException) {
+			return;
+		}
+		
 		if (myLoggedCompilationExceptionsCount < MAX_LOGGED_COMPILATION_EXCEPTIONS) {
 		    myLoggedCompilationExceptionsCount ++;
 		    Activator.log(ex);
diff --git a/plugins/org.eclipse.m2m.qvt.oml.editor.ui/src/org/eclipse/m2m/internal/qvt/oml/editor/ui/completion/QvtCompletionCompiler.java b/plugins/org.eclipse.m2m.qvt.oml.editor.ui/src/org/eclipse/m2m/internal/qvt/oml/editor/ui/completion/QvtCompletionCompiler.java
index f49d797..489f978 100644
--- a/plugins/org.eclipse.m2m.qvt.oml.editor.ui/src/org/eclipse/m2m/internal/qvt/oml/editor/ui/completion/QvtCompletionCompiler.java
+++ b/plugins/org.eclipse.m2m.qvt.oml.editor.ui/src/org/eclipse/m2m/internal/qvt/oml/editor/ui/completion/QvtCompletionCompiler.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Borland Software Corporation and others.
+ * Copyright (c) 2008, 2014 Borland Software Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *   
  * Contributors:
  *     Borland Software Corporation - initial API and implementation
+ *     Christopher Gerking - bug 391289
  *******************************************************************************/
 package org.eclipse.m2m.internal.qvt.oml.editor.ui.completion;
 
@@ -19,6 +20,7 @@
 import lpg.runtime.IPrsStream;
 import lpg.runtime.IToken;
 
+import org.eclipse.emf.common.util.Monitor;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.m2m.internal.qvt.oml.ast.env.QvtOperationalEnv;
@@ -113,8 +115,8 @@
     }
     
     @Override
-    protected QvtOperationalVisitorCS createAnalyzer(AbstractQVTParser parser, QvtCompilerOptions options) {
-		return new QvtCompletionVisitorCS(parser, options) {
+    protected QvtOperationalVisitorCS createAnalyzer(AbstractQVTParser parser, QvtCompilerOptions options, Monitor monitor) {
+		return new QvtCompletionVisitorCS(parser, options, monitor) {
 			@Override
 			protected void setEnv(QvtOperationalEnv env) {			
 				super.setEnv(env);
diff --git a/plugins/org.eclipse.m2m.qvt.oml.editor.ui/src/org/eclipse/m2m/internal/qvt/oml/editor/ui/completion/QvtCompletionVisitorCS.java b/plugins/org.eclipse.m2m.qvt.oml.editor.ui/src/org/eclipse/m2m/internal/qvt/oml/editor/ui/completion/QvtCompletionVisitorCS.java
index cb87120..7e60c3b 100644
--- a/plugins/org.eclipse.m2m.qvt.oml.editor.ui/src/org/eclipse/m2m/internal/qvt/oml/editor/ui/completion/QvtCompletionVisitorCS.java
+++ b/plugins/org.eclipse.m2m.qvt.oml.editor.ui/src/org/eclipse/m2m/internal/qvt/oml/editor/ui/completion/QvtCompletionVisitorCS.java
@@ -11,6 +11,7 @@
  *******************************************************************************/
 package org.eclipse.m2m.internal.qvt.oml.editor.ui.completion;
 
+import org.eclipse.emf.common.util.Monitor;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.m2m.internal.qvt.oml.ast.binding.ASTBindingHelper;
@@ -34,10 +35,8 @@
 public class QvtCompletionVisitorCS extends QvtOperationalVisitorCS {
     private QvtOperationalEnv myEnv; 
 
-    public QvtCompletionVisitorCS(
-            AbstractQVTParser parser,
-            QvtCompilerOptions options) {
-        super(parser, options);
+    public QvtCompletionVisitorCS(AbstractQVTParser parser, QvtCompilerOptions options, Monitor monitor) {
+        super(parser, options, monitor);
         myEnv = (QvtOperationalEnv) parser.getEnvironment();
     }
 
diff --git a/plugins/org.eclipse.m2m.qvt.oml.project/src/org/eclipse/m2m/internal/qvt/oml/project/builder/QVTOBuilder.java b/plugins/org.eclipse.m2m.qvt.oml.project/src/org/eclipse/m2m/internal/qvt/oml/project/builder/QVTOBuilder.java
index 8815a23..854df32 100644
--- a/plugins/org.eclipse.m2m.qvt.oml.project/src/org/eclipse/m2m/internal/qvt/oml/project/builder/QVTOBuilder.java
+++ b/plugins/org.eclipse.m2m.qvt.oml.project/src/org/eclipse/m2m/internal/qvt/oml/project/builder/QVTOBuilder.java
@@ -8,6 +8,7 @@
  * 
  * Contributors:
  *     Borland Software Corporation - initial API and implementation
+ *     Christopher Gerking - bugs 391289, 431082
  *******************************************************************************/
 package org.eclipse.m2m.internal.qvt.oml.project.builder;
 
@@ -35,6 +36,9 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.ProgressMonitorWrapper;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
 import org.eclipse.emf.common.util.BasicMonitor;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EPackage;
@@ -82,27 +86,32 @@
     
 	@Override
 	protected IProject[] build(int kind, Map<String,String> args, IProgressMonitor monitor) throws CoreException {
-    	if(monitor == null) {
-    		monitor = new NullProgressMonitor();
-    	}
+    					
+   		monitor = new ProgressMonitorWrapper(monitor == null ? new NullProgressMonitor() : monitor) {
+   			@Override
+   			public boolean isCanceled() {
+   				return super.isCanceled() || isInterrupted();
+   			}
+   		};
     	
-    	monitor.beginTask(getProject().getFullPath().toString(), 1);
-    	
-        if (kind == IncrementalProjectBuilder.FULL_BUILD) {
-            fullBuild(monitor);
-        } else {
-            incrementalBuild(monitor);
-        }
-        
+   		try {
+	    	monitor.setTaskName("Build " + getProject().getFullPath().toString()); //$NON-NLS-1$
+	    		    	
+	        if (kind == IncrementalProjectBuilder.FULL_BUILD) {
+	            fullBuild(monitor);
+	        } else {
+	            incrementalBuild(monitor);
+	        }
+   		} finally {
+   			monitor.done();
+   		}
+   		
         fireBuildEvent();
-        
-        monitor.worked(1);
-        
+                
         IProject[] projectDependencies = getConfig().getProjectDependencies(true);
         
-        
-        monitor.done();        
-		return projectDependencies;
+        return projectDependencies;
+	    	    
     }
     
     private void fullBuild(IProgressMonitor monitor) throws CoreException {
@@ -112,6 +121,8 @@
     @Override
 	protected void clean(final IProgressMonitor monitor) throws CoreException {        
         
+   		monitor.setTaskName("Clean " + getProject().getFullPath().toString()); //$NON-NLS-1$
+		
     	getProject().accept(new IResourceProxyVisitor() {
 			public boolean visit(IResourceProxy proxy) throws CoreException {
 				if (proxy.getType() == IResource.FILE) {
@@ -124,6 +135,8 @@
 			}
     		
     	}, IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS);
+    	
+    	monitor.done();
     }
     
     private void incrementalBuild(IProgressMonitor monitor) throws CoreException {
@@ -201,8 +214,9 @@
     
     private void rebuildAll(IProgressMonitor monitor) throws CoreException {
     	
-        IFile[] files = collectFiles();
-        monitor.worked(1);
+		SubMonitor progress = SubMonitor.convert(monitor, "Rebuild all", 10); //$NON-NLS-1$
+		
+        IFile[] files = collectFiles(progress.newChild(1, SubMonitor.SUPPRESS_NONE));
         
         CompiledUnit[] units;
 		try {
@@ -220,7 +234,7 @@
 	        List<UnitProxy> allUnits = ResolverUtils.findAllUnits(resolver);
 
 	        units = compiler.compile(allUnits.toArray(new UnitProxy[allUnits.size()]),
-						options, new BasicMonitor.EclipseSubProgress(monitor, 1));
+						options, CompilerUtils.createMonitor(BasicMonitor.toMonitor(progress.newChild(8, SubMonitor.SUPPRESS_NONE)), 8));
 	        
 	        if(shouldSaveXMI()) {
 	        	ResourceSet metamodelResourceSet = compiler.getResourceSet();
@@ -228,7 +242,7 @@
 	        	ExeXMISerializer.saveUnitXMI(units, registry != null ? registry : EPackage.Registry.INSTANCE);
 	        }
 		}
-		catch(OperationCanceledException e) {
+		catch (OperationCanceledException e) {
 			throw e;
 		}
 		catch (Exception e) {
@@ -236,8 +250,8 @@
 		}
 		
         for (int i = 0; i < units.length; i++) {                    
-            if(monitor.isCanceled()) {
-            	throw new OperationCanceledException();
+        	if(monitor.isCanceled()) {
+            	CompilerUtils.throwOperationCanceled();
             }
             
         	CompiledUnit nextUnit = units[i];
@@ -251,6 +265,8 @@
                 createQvtMarker(sourceFile, nextMessage);
             }
         }
+        
+        progress.worked(1);
     }
         
     private void createQvtMarker(IFile curFile, QvtMessage e) {
@@ -279,9 +295,10 @@
         return myConfig;
     }
     
-    private IFile[] collectFiles() throws CoreException {
+    private IFile[] collectFiles(IProgressMonitor monitor) throws CoreException {
+    	
         final ArrayList<IFile> result = new ArrayList<IFile>();
-        getProject().refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
+        getProject().refreshLocal(IResource.DEPTH_INFINITE, new SubProgressMonitor(monitor, 1));
         
         IContainer srcContainer = null;
         try {
diff --git a/plugins/org.eclipse.m2m.qvt.oml.runtime/src/org/eclipse/m2m/internal/qvt/oml/runtime/launch/QvtLaunchConfigurationDelegate.java b/plugins/org.eclipse.m2m.qvt.oml.runtime/src/org/eclipse/m2m/internal/qvt/oml/runtime/launch/QvtLaunchConfigurationDelegate.java
index cdb7770..88b3b55 100644
--- a/plugins/org.eclipse.m2m.qvt.oml.runtime/src/org/eclipse/m2m/internal/qvt/oml/runtime/launch/QvtLaunchConfigurationDelegate.java
+++ b/plugins/org.eclipse.m2m.qvt.oml.runtime/src/org/eclipse/m2m/internal/qvt/oml/runtime/launch/QvtLaunchConfigurationDelegate.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2009 Borland Software Corporation and others.
+ * Copyright (c) 2007, 2014 Borland Software Corporation and others.
  * 
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -8,6 +8,7 @@
  * 
  * Contributors:
  *     Borland Software Corporation - initial API and implementation
+ *     Christopher Gerking - bug 431082
  *******************************************************************************/
 package org.eclipse.m2m.internal.qvt.oml.runtime.launch;
 
@@ -28,7 +29,6 @@
 import org.eclipse.m2m.internal.qvt.oml.runtime.QvtRuntimePlugin;
 import org.eclipse.m2m.internal.qvt.oml.runtime.project.QvtInterpretedTransformation;
 import org.eclipse.m2m.internal.qvt.oml.runtime.project.QvtTransformation;
-import org.eclipse.m2m.qvt.oml.util.EvaluationMonitor;
 import org.eclipse.m2m.qvt.oml.util.WriterLog;
 
 public class QvtLaunchConfigurationDelegate extends QvtLaunchConfigurationDelegateBase {
@@ -42,12 +42,11 @@
 	}
 	
 	// FIXME - do refactoring of this area 
-	public void launch(final ILaunchConfiguration configuration, String mode, final ILaunch launch, IProgressMonitor monitor) throws CoreException {
+	public void launch(final ILaunchConfiguration configuration, String mode, final ILaunch launch, final IProgressMonitor monitor) throws CoreException {
         
 		try {
             final QvtTransformation qvtTransformation = new QvtInterpretedTransformation(getQvtModule(configuration));
-            final EvaluationMonitor execMonitor = createMonitor();
-                                    
+                                                
             final StreamsProxy streamsProxy = new StreamsProxy();
    
             ShallowProcess.IRunnable r = new ShallowProcess.IRunnable() {
@@ -60,7 +59,7 @@
                 	
                 	Context context = QvtLaunchUtil.createContext(configuration);
                     context.setLog(new WriterLog(streamsProxy.getOutputWriter()));
-                    context.setMonitor(execMonitor);
+                    context.setProgressMonitor(monitor);
                     
                 	QvtLaunchConfigurationDelegateBase.doLaunch(qvtTransformation, configuration, context);
                 	
@@ -74,7 +73,7 @@
             	boolean isTerminated = false;
             	@Override
             	public void terminate() throws DebugException {            		
-            		execMonitor.cancel();
+            		monitor.setCanceled(true);
             		isTerminated = true;	            		
             		super.terminate();            		
             	}
@@ -129,20 +128,6 @@
 			throw new CoreException(org.eclipse.m2m.internal.qvt.oml.runtime.util.MiscUtil.makeErrorStatus(e));
 		}
 	}
-
-	private EvaluationMonitor createMonitor() {
-		return new EvaluationMonitor() {
-			boolean fIsCanceled = false;
-			
-			public void cancel() {
-				fIsCanceled = true;
-			}
-			
-			public boolean isCanceled() {
-				return fIsCanceled;
-			}
-		};
-	}
     
   
 // FIXME - do we need such an annoying generic check ?
diff --git a/plugins/org.eclipse.m2m.qvt.oml.runtime/src/org/eclipse/m2m/internal/qvt/oml/runtime/launch/QvtLaunchConfigurationDelegateBase.java b/plugins/org.eclipse.m2m.qvt.oml.runtime/src/org/eclipse/m2m/internal/qvt/oml/runtime/launch/QvtLaunchConfigurationDelegateBase.java
index ff34fc1..74b7ba6 100644
--- a/plugins/org.eclipse.m2m.qvt.oml.runtime/src/org/eclipse/m2m/internal/qvt/oml/runtime/launch/QvtLaunchConfigurationDelegateBase.java
+++ b/plugins/org.eclipse.m2m.qvt.oml.runtime/src/org/eclipse/m2m/internal/qvt/oml/runtime/launch/QvtLaunchConfigurationDelegateBase.java
@@ -198,7 +198,7 @@
         Iterator<ModelExtentContents> itrExtent = out.getExtents().iterator();
         for (TargetUriData outUriData : targetData) {
         	if (!itrExtent.hasNext()) {
-        		throw new MdaException("Imcomplete transformation results"); //$NON-NLS-1$
+        		throw new MdaException("Incomplete transformation results"); //$NON-NLS-1$
         	}
         	saveTransformationResult(itrExtent.next(), outUriData, resSet);
         }
diff --git a/plugins/org.eclipse.m2m.qvt.oml.runtime/src/org/eclipse/m2m/internal/qvt/oml/runtime/project/QvtCompilerFacade.java b/plugins/org.eclipse.m2m.qvt.oml.runtime/src/org/eclipse/m2m/internal/qvt/oml/runtime/project/QvtCompilerFacade.java
index 19e1a8f..1fb90cf 100644
--- a/plugins/org.eclipse.m2m.qvt.oml.runtime/src/org/eclipse/m2m/internal/qvt/oml/runtime/project/QvtCompilerFacade.java
+++ b/plugins/org.eclipse.m2m.qvt.oml.runtime/src/org/eclipse/m2m/internal/qvt/oml/runtime/project/QvtCompilerFacade.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2009 Borland Software Corporation and others.
+ * Copyright (c) 2007, 2014 Borland Software Corporation and others.
  * 
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -8,6 +8,7 @@
  * 
  * Contributors:
  *     Borland Software Corporation - initial API and implementation
+ *     Christopher Gerking - bug 431082
  *******************************************************************************/
 package org.eclipse.m2m.internal.qvt.oml.runtime.project;
 
@@ -79,7 +80,7 @@
 
 			final QVTOCompiler compiler = CompilerUtils.createCompiler();
 			final CompiledUnit module = compiler.compile(sourceUnit, compilerOptions, 
-					new BasicMonitor.EclipseSubProgress(monitor, 0));
+					BasicMonitor.toMonitor(monitor));
 			
 			return new CompilationResult() {
 				public CompiledUnit getCompiledModule() {
diff --git a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/InternalTransformationExecutor.java b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/InternalTransformationExecutor.java
index cda8a06..8e192fa 100644
--- a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/InternalTransformationExecutor.java
+++ b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/InternalTransformationExecutor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2013 R.Dvorak and others.
+ * Copyright (c) 2009, 2014 R.Dvorak and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,13 +7,18 @@
  *
  * Contributors:
  *     Radek Dvorak - initial API and implementation
+ *     Christopher Gerking - bug 431082
  *******************************************************************************/
 package org.eclipse.m2m.internal.qvt.oml;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.SubMonitor;
 import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.BasicMonitor;
 import org.eclipse.emf.common.util.Diagnostic;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.URI;
@@ -123,11 +128,16 @@
 	 * 
 	 * @return the diagnostic indicating possible problems of the load action
 	 */
-	public Diagnostic loadTransformation() {
-		if (fLoadDiagnostic == null) {
-			doLoad();
+	public Diagnostic loadTransformation(IProgressMonitor monitor) {
+		try {
+			if (fLoadDiagnostic == null) {
+				doLoad(monitor);
+			}
+			return fLoadDiagnostic;
+		} 
+		finally {
+			monitor.done();
 		}
-		return fLoadDiagnostic;
 	}
 	
 	/**
@@ -141,7 +151,7 @@
 	 * @return compiled unit or <code>null</code> if it failed to be obtained
 	 */
 	public CompiledUnit getUnit() {
-		loadTransformation();
+		loadTransformation(new NullProgressMonitor());
 		return fCompiledUnit;
 	}	
 
@@ -160,30 +170,40 @@
 	 *             if the context or any of the model parameters is
 	 *             <code>null</code>
 	 */
-	public ExecutionDiagnostic execute(ExecutionContext executionContext,
-			ModelExtent... modelParameters) {
+	public ExecutionDiagnostic execute(ExecutionContext executionContext, ModelExtent... modelParameters) {
 		// Java API check for nulls etc.
 		if (executionContext == null) {
 			throw new IllegalArgumentException();
 		}
-		checkLegalModelParams(modelParameters);
-
-		// ensure transformation unit is loaded
-		loadTransformation();
-
-		// check if we have successfully loaded the transformation unit
-		if (!isSuccess(fLoadDiagnostic)) {
-			return fLoadDiagnostic;
-		}
-
-		try {
-			return doExecute(modelParameters,
-					createInternalContext(executionContext));
-		} catch (QvtRuntimeException e) {
-			Log logger = executionContext.getLog();
-			logger.log(EvaluationMessages.TerminatingExecution);
-
-			return createExecutionFailure(e);
+		
+		IProgressMonitor monitor = executionContext.getProgressMonitor();
+				
+		try {							
+			SubMonitor progress = SubMonitor.convert(monitor, "Execute " + getURI().toString(), 2); //$NON-NLS-1$
+						
+			checkLegalModelParams(modelParameters);
+	
+			// ensure transformation unit is loaded
+			loadTransformation(progress.newChild(1));
+			
+			// check if we have successfully loaded the transformation unit
+			if (!isSuccess(fLoadDiagnostic)) {
+				return fLoadDiagnostic;
+			}
+	
+			try {
+				return doExecute(modelParameters,
+						createInternalContext(executionContext, progress.newChild(1)));
+			} catch (QvtRuntimeException e) {
+				Log logger = executionContext.getLog();
+				logger.log(EvaluationMessages.TerminatingExecution);
+	
+				return createExecutionFailure(e);
+			}
+		} finally {
+			if (monitor != null) {
+				monitor.done();
+			}
 		}
 	}
 
@@ -237,7 +257,7 @@
 		// nothing interesting here
 	}
 
-	private void doLoad() {
+	private void doLoad(IProgressMonitor monitor) {
 		fLoadDiagnostic = ExecutionDiagnosticImpl.OK_INSTANCE;
 
 		UnitProxy unit = UnitResolverFactory.Registry.INSTANCE.getUnit(fURI);
@@ -250,7 +270,7 @@
 
 		QVTOCompiler compiler = createCompiler();
 		try {
-			fCompiledUnit = compiler.compile(unit, null, null);
+			fCompiledUnit = compiler.compile(unit, null, BasicMonitor.toMonitor(monitor));
 			fCompilationRs = compiler.getResourceSet();
 		//	fCompilerKernel = compiler.getKernel();
 
@@ -442,11 +462,10 @@
 				|| severity == Diagnostic.INFO;
 	}
 
-	private static IContext createInternalContext(
-			ExecutionContext executionContext) {
+	private static IContext createInternalContext(ExecutionContext executionContext, IProgressMonitor monitor) {
 		Context ctx = new Context();
 		ctx.setLog(executionContext.getLog());
-		ctx.setMonitor(executionContext.getMonitor());
+		ctx.setProgressMonitor(monitor);
 
 		for (String key : executionContext.getConfigPropertyNames()) {
 			Object value = executionContext.getConfigProperty(key);
diff --git a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/TransformationRunner.java b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/TransformationRunner.java
index 6b5b46e..15441ce 100644
--- a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/TransformationRunner.java
+++ b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/TransformationRunner.java
@@ -1,226 +1,228 @@
-/*******************************************************************************

- * Copyright (c) 2009, 2013 R.Dvorak and others.

- * All rights reserved. This program and the accompanying materials

- * are made available under the terms of the Eclipse Public License v1.0

- * which accompanies this distribution, and is available at

- * http://www.eclipse.org/legal/epl-v10.html

- *

- * Contributors:

- *     Radek Dvorak - initial API and implementation

- *******************************************************************************/

-package org.eclipse.m2m.internal.qvt.oml;

-

-import java.io.IOException;

-import java.util.HashMap;

-import java.util.List;

-import java.util.Map;

-

-import org.eclipse.emf.common.util.BasicDiagnostic;

-import org.eclipse.emf.common.util.Diagnostic;

-import org.eclipse.emf.common.util.DiagnosticException;

-import org.eclipse.emf.common.util.URI;

-import org.eclipse.emf.ecore.EPackage;

-import org.eclipse.emf.ecore.EPackage.Registry;

-import org.eclipse.emf.ecore.resource.Resource;

-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;

-import org.eclipse.emf.ecore.xmi.XMLResource;

-import org.eclipse.m2m.internal.qvt.oml.ast.env.QvtOperationalEnvFactory;

-import org.eclipse.m2m.internal.qvt.oml.expressions.OperationalTransformation;

-import org.eclipse.m2m.internal.qvt.oml.trace.Trace;

-import org.eclipse.m2m.qvt.oml.ExecutionContext;

-import org.eclipse.m2m.qvt.oml.ExecutionDiagnostic;

-import org.eclipse.m2m.qvt.oml.ModelExtent;

-

-public class TransformationRunner  {

-

-	protected static class Executor extends InternalTransformationExecutor {

-		

-		Trace fTraces;

-		

-		public Executor(URI uri, Registry registry) {

-			super(uri, registry);

-		}

-

-		public Executor(URI uri) {

-			super(uri);

-		}

-

-		@Override

-		protected void handleExecutionTraces(Trace traces) {				

-			super.handleExecutionTraces(traces);

-			fTraces = traces;

-		}

-

-	}

-		

-	private final URI fTransformationURI;	

-	private final Executor fExecutor;

-	private final List<URI> fModelParamURIs;

-	private URI fTraceFileURI;

-	

-	private BasicDiagnostic fDiagnostic;

-	private List<ModelExtent> fModelParams;		

-	private ModelExtentHelper fExtentHelper;

-	

-	

-	public TransformationRunner(URI transformationURI, 

-			EPackage.Registry packageRegistry,

-			List<URI> modelParamURIs) {

-		

-		if (transformationURI == null || modelParamURIs == null

-				|| modelParamURIs.contains(null)) {

-			throw new IllegalArgumentException();

-		}

-

-		fExecutor = new Executor(transformationURI, packageRegistry);

-		fTransformationURI = transformationURI;

-		fModelParamURIs = modelParamURIs;

-	}

-	

-	protected InternalTransformationExecutor getExecutor() {

-		return fExecutor;

-	};

-	

-	public URI getTransformationURI() {

-		return fTransformationURI;

-	}

-	

-	public void setTraceFile(URI traceFileURI) {

-		fTraceFileURI = traceFileURI;

-	}

-	

-	public URI getTraceFileURI() {

-		return fTraceFileURI;

-	}

-

-	public Diagnostic initialize() {

-		if(fDiagnostic != null) {

-			return fDiagnostic;

-		}

-		

-		fDiagnostic = QvtPlugin.createDiagnostic("Transformation runner initiliaze");

-		

-		Diagnostic loadDiagnostic = fExecutor.loadTransformation();

-		if(!QvtPlugin.isSuccess(loadDiagnostic)) {

-			fDiagnostic.add(loadDiagnostic);

-		}

-

-		handleLoadTransformation(loadDiagnostic);

-		

-		OperationalTransformation transformation = fExecutor.getTransformation();

-		if(transformation == null) {

-			return fDiagnostic;

-		}

-		

-		// Note: initialized here already loaded transformation is required

-		fExtentHelper = new ModelExtentHelper(transformation, fModelParamURIs, fExecutor.getResourceSet());

-		

-		Diagnostic extentsDiagnostic = Diagnostic.OK_INSTANCE; 

-		try {

-			fModelParams = fExtentHelper.loadExtents();

-		} catch (DiagnosticException e) {

-			extentsDiagnostic = e.getDiagnostic();

-		}

-		

-		handleLoadExtents(extentsDiagnostic);

-		if(!QvtPlugin.isSuccess(extentsDiagnostic)) {

-			fDiagnostic.add(extentsDiagnostic);

-		}

-		

-		// FIXME - 

-		// add validation for configuration properties and param count

-		// into the internal executor

-

-		// TODO - collect WARN, INFO diagnostics?

-		return fDiagnostic;

-	}

-	

-	protected QvtOperationalEnvFactory getEnvFactory() {

-		return new QvtOperationalEnvFactory(); 

-	}

-	

-	protected void handleLoadTransformation(Diagnostic diagnostic) {

-		// do nothing

-	}	

-			

-	protected void handleLoadExtents(Diagnostic diagnostic) {

-		// do nothing

-	}	

-

-	protected void handleExecution(ExecutionDiagnostic execDiagnostic) {

-		// do nothing

-	}

-	

-	protected void handleSaveExtents(Diagnostic diagnostic) {

-		// do nothing

-	}		

-

-

-	public Diagnostic execute(ExecutionContext context) {

-		Diagnostic diagnostic = initialize();

-		

-		if(!isSuccess(diagnostic)) {

-			return diagnostic;

-		}

-

-		fExecutor.setEnvironmentFactory(getEnvFactory());

-		try {			

-			ModelExtent[] params = fModelParams.toArray(new ModelExtent[fModelParams.size()]);

-			

-			ExecutionDiagnostic execDiagnostic = fExecutor.execute(context, params);

-			handleExecution(execDiagnostic);

-			

-			Trace traces = fExecutor.fTraces;

-			fExecutor.fTraces = null;

-

-			if(!isSuccess(execDiagnostic)) {

-				// skip saving any output

-				return execDiagnostic;

-			}

-

-			// can continue and save output

-			Diagnostic saveExtentsDiagnostic = fExtentHelper.saveExtents();

-			handleSaveExtents(saveExtentsDiagnostic);

-			

-			if(!isSuccess(saveExtentsDiagnostic)) {

-				return saveExtentsDiagnostic;

-			}

-

-			Diagnostic saveTracesDiagnostic = saveTraces(traces);

-			if(!isSuccess(saveTracesDiagnostic)) {

-				return saveTracesDiagnostic;

-			}

-

-			return execDiagnostic;

-		} finally {

-			fExecutor.cleanup();

-		}			

-	}

-	

-	private Diagnostic saveTraces(Trace trace) { 

-		if(fTraceFileURI != null) {

-			Resource resource = new ResourceSetImpl().createResource(fTraceFileURI);

-			resource.getContents().add(trace);

-			try {

-		        Map<String, String> options = new HashMap<String, String>();

-		        options.put(XMLResource.OPTION_PROCESS_DANGLING_HREF, XMLResource.OPTION_PROCESS_DANGLING_HREF_DISCARD);

-				resource.save(options);

-			} catch (IOException e) {

-				String message = NLS.bind("Failed to save trace model uri={0}", fTraceFileURI);

-				return new BasicDiagnostic(Diagnostic.ERROR, QvtPlugin.ID, 0,

-						message, new Object[] { e });

-			}

-		}

-		

-		return Diagnostic.OK_INSTANCE;

-	}

-	

-	/**

-	 * Successfully finished execution, no errors and user interruption 

-	 */

-	private static boolean isSuccess(Diagnostic diagnostic) {

-		int severity = diagnostic.getSeverity();

-		return severity != Diagnostic.ERROR && severity != Diagnostic.CANCEL;

-	}

-		

+/*******************************************************************************
+ * Copyright (c) 2009, 2014 R.Dvorak and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Radek Dvorak - initial API and implementation
+ *     Christopher Gerking - bug 431082
+ *******************************************************************************/
+package org.eclipse.m2m.internal.qvt.oml;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticException;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EPackage.Registry;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.xmi.XMLResource;
+import org.eclipse.m2m.internal.qvt.oml.ast.env.QvtOperationalEnvFactory;
+import org.eclipse.m2m.internal.qvt.oml.expressions.OperationalTransformation;
+import org.eclipse.m2m.internal.qvt.oml.trace.Trace;
+import org.eclipse.m2m.qvt.oml.ExecutionContext;
+import org.eclipse.m2m.qvt.oml.ExecutionDiagnostic;
+import org.eclipse.m2m.qvt.oml.ModelExtent;
+
+public class TransformationRunner  {
+
+	protected static class Executor extends InternalTransformationExecutor {
+		
+		Trace fTraces;
+		
+		public Executor(URI uri, Registry registry) {
+			super(uri, registry);
+		}
+
+		public Executor(URI uri) {
+			super(uri);
+		}
+
+		@Override
+		protected void handleExecutionTraces(Trace traces) {				
+			super.handleExecutionTraces(traces);
+			fTraces = traces;
+		}
+
+	}
+		
+	private final URI fTransformationURI;	
+	private final Executor fExecutor;
+	private final List<URI> fModelParamURIs;
+	private URI fTraceFileURI;
+	
+	private BasicDiagnostic fDiagnostic;
+	private List<ModelExtent> fModelParams;		
+	private ModelExtentHelper fExtentHelper;
+	
+	
+	public TransformationRunner(URI transformationURI, 
+			EPackage.Registry packageRegistry,
+			List<URI> modelParamURIs) {
+		
+		if (transformationURI == null || modelParamURIs == null
+				|| modelParamURIs.contains(null)) {
+			throw new IllegalArgumentException();
+		}
+
+		fExecutor = new Executor(transformationURI, packageRegistry);
+		fTransformationURI = transformationURI;
+		fModelParamURIs = modelParamURIs;
+	}
+	
+	protected InternalTransformationExecutor getExecutor() {
+		return fExecutor;
+	};
+	
+	public URI getTransformationURI() {
+		return fTransformationURI;
+	}
+	
+	public void setTraceFile(URI traceFileURI) {
+		fTraceFileURI = traceFileURI;
+	}
+	
+	public URI getTraceFileURI() {
+		return fTraceFileURI;
+	}
+
+	public Diagnostic initialize() {
+		if(fDiagnostic != null) {
+			return fDiagnostic;
+		}
+		
+		fDiagnostic = QvtPlugin.createDiagnostic("Transformation runner initialize"); //$NON-NLS-1$
+		
+		Diagnostic loadDiagnostic = fExecutor.loadTransformation(new NullProgressMonitor());
+		if(!QvtPlugin.isSuccess(loadDiagnostic)) {
+			fDiagnostic.add(loadDiagnostic);
+		}
+
+		handleLoadTransformation(loadDiagnostic);
+		
+		OperationalTransformation transformation = fExecutor.getTransformation();
+		if(transformation == null) {
+			return fDiagnostic;
+		}
+		
+		// Note: initialized here already loaded transformation is required
+		fExtentHelper = new ModelExtentHelper(transformation, fModelParamURIs, fExecutor.getResourceSet());
+		
+		Diagnostic extentsDiagnostic = Diagnostic.OK_INSTANCE; 
+		try {
+			fModelParams = fExtentHelper.loadExtents();
+		} catch (DiagnosticException e) {
+			extentsDiagnostic = e.getDiagnostic();
+		}
+		
+		handleLoadExtents(extentsDiagnostic);
+		if(!QvtPlugin.isSuccess(extentsDiagnostic)) {
+			fDiagnostic.add(extentsDiagnostic);
+		}
+		
+		// FIXME - 
+		// add validation for configuration properties and param count
+		// into the internal executor
+
+		// TODO - collect WARN, INFO diagnostics?
+		return fDiagnostic;
+	}
+	
+	protected QvtOperationalEnvFactory getEnvFactory() {
+		return new QvtOperationalEnvFactory(); 
+	}
+	
+	protected void handleLoadTransformation(Diagnostic diagnostic) {
+		// do nothing
+	}	
+			
+	protected void handleLoadExtents(Diagnostic diagnostic) {
+		// do nothing
+	}	
+
+	protected void handleExecution(ExecutionDiagnostic execDiagnostic) {
+		// do nothing
+	}
+	
+	protected void handleSaveExtents(Diagnostic diagnostic) {
+		// do nothing
+	}		
+
+
+	public Diagnostic execute(ExecutionContext context) {
+		Diagnostic diagnostic = initialize();
+		
+		if(!isSuccess(diagnostic)) {
+			return diagnostic;
+		}
+
+		fExecutor.setEnvironmentFactory(getEnvFactory());
+		try {			
+			ModelExtent[] params = fModelParams.toArray(new ModelExtent[fModelParams.size()]);
+			
+			ExecutionDiagnostic execDiagnostic = fExecutor.execute(context, params);
+			handleExecution(execDiagnostic);
+			
+			Trace traces = fExecutor.fTraces;
+			fExecutor.fTraces = null;
+
+			if(!isSuccess(execDiagnostic)) {
+				// skip saving any output
+				return execDiagnostic;
+			}
+
+			// can continue and save output
+			Diagnostic saveExtentsDiagnostic = fExtentHelper.saveExtents();
+			handleSaveExtents(saveExtentsDiagnostic);
+			
+			if(!isSuccess(saveExtentsDiagnostic)) {
+				return saveExtentsDiagnostic;
+			}
+
+			Diagnostic saveTracesDiagnostic = saveTraces(traces);
+			if(!isSuccess(saveTracesDiagnostic)) {
+				return saveTracesDiagnostic;
+			}
+
+			return execDiagnostic;
+		} finally {
+			fExecutor.cleanup();
+		}			
+	}
+	
+	private Diagnostic saveTraces(Trace trace) { 
+		if(fTraceFileURI != null) {
+			Resource resource = new ResourceSetImpl().createResource(fTraceFileURI);
+			resource.getContents().add(trace);
+			try {
+		        Map<String, String> options = new HashMap<String, String>();
+		        options.put(XMLResource.OPTION_PROCESS_DANGLING_HREF, XMLResource.OPTION_PROCESS_DANGLING_HREF_DISCARD);
+				resource.save(options);
+			} catch (IOException e) {
+				String message = NLS.bind("Failed to save trace model uri={0}", fTraceFileURI);
+				return new BasicDiagnostic(Diagnostic.ERROR, QvtPlugin.ID, 0,
+						message, new Object[] { e });
+			}
+		}
+		
+		return Diagnostic.OK_INSTANCE;
+	}
+	
+	/**
+	 * Successfully finished execution, no errors and user interruption 
+	 */
+	private static boolean isSuccess(Diagnostic diagnostic) {
+		int severity = diagnostic.getSeverity();
+		return severity != Diagnostic.ERROR && severity != Diagnostic.CANCEL;
+	}
+		
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/ast/parser/QvtOperationalVisitorCS.java b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/ast/parser/QvtOperationalVisitorCS.java
index 8a92cca..83fb698 100644
--- a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/ast/parser/QvtOperationalVisitorCS.java
+++ b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/ast/parser/QvtOperationalVisitorCS.java
@@ -7,7 +7,7 @@
  *   
  * Contributors:
  *     Borland Software Corporation - initial API and implementation
- *     Christopher Gerking - bugs 302594, 310991, 289982, 427237, 425634
+ *     Christopher Gerking - bugs 302594, 310991, 289982, 391289, 425634, 427237
  *     Alex Paperno - bugs 272869, 268636, 404647, 414363, 414363, 401521,
  *                         419299, 414619, 403440, 415024, 420970, 413391,
  *                         424584, 424869
@@ -29,9 +29,11 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.emf.common.util.BasicEMap;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.EMap;
+import org.eclipse.emf.common.util.Monitor;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EAttribute;
@@ -60,6 +62,7 @@
 import org.eclipse.m2m.internal.qvt.oml.ast.env.QvtOperationalStdLibrary;
 import org.eclipse.m2m.internal.qvt.oml.blackbox.BlackboxRegistry;
 import org.eclipse.m2m.internal.qvt.oml.compiler.CompilerMessages;
+import org.eclipse.m2m.internal.qvt.oml.compiler.CompilerUtils;
 import org.eclipse.m2m.internal.qvt.oml.compiler.QvtCompilerOptions;
 import org.eclipse.m2m.internal.qvt.oml.compiler.UnitProxy;
 import org.eclipse.m2m.internal.qvt.oml.cst.AssertExpCS;
@@ -262,16 +265,24 @@
 	 */
     private List<ResolveExp> myLateResolveExps;
     
+    private final Monitor myMonitor;
+    
 	public QvtOperationalVisitorCS(
 			OCLLexer lexStream,
 			Environment<EPackage, EClassifier, EOperation, EStructuralFeature, EEnumLiteral, EParameter, EObject, CallOperationAction, SendSignalAction, Constraint, EClass, EObject> environment, QvtCompilerOptions options) {
 		super(new OCLParser(lexStream));
         myCompilerOptions = options;
+        myMonitor = CompilerUtils.createNullMonitor();
 	}
 	
 	public QvtOperationalVisitorCS(AbstractQVTParser parser, QvtCompilerOptions options) {
+		this(parser, options, CompilerUtils.createNullMonitor());
+	}
+	
+	public QvtOperationalVisitorCS(AbstractQVTParser parser, QvtCompilerOptions options, Monitor monitor) {
 		super(parser);		
 		myCompilerOptions = options;
+		myMonitor = monitor;
 	}
 	
 	public QvtCompilerOptions getCompilerOptions() {
@@ -665,6 +676,11 @@
 	        Environment<EPackage, EClassifier, EOperation, EStructuralFeature, 
 	        EEnumLiteral, EParameter, EObject, CallOperationAction, SendSignalAction,
 	        Constraint, EClass, EObject> env) {
+		
+		if (isAborted()) {
+			CompilerUtils.throwOperationCanceled();
+		}
+		
 	    try {
             if (oclExpressionCS instanceof BlockExpCS) {
                 return visitBlockExpCS((BlockExpCS) oclExpressionCS, env);
@@ -774,6 +790,9 @@
 	        QvtPlugin.error(ex);
 	        QvtOperationalUtil.reportError(env, ValidationMessages.QvtOperationalVisitorCS_oclParseNPE, oclExpressionCS);
 	    }
+		catch (OperationCanceledException ex) {
+			throw ex;
+	 	}
 	    catch (RuntimeException ex) {
 	        //QvtPlugin.log(ex);
 	    	QvtOperationalUtil.reportError(env, ValidationMessages.QvtOperationalVisitorCS_oclParseNPE, oclExpressionCS);
@@ -5791,4 +5810,9 @@
 		}
 		return null;
 	}
+	
+	private boolean isAborted() {
+		return myMonitor.isCanceled();
+	}
+	
 }
diff --git a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/compiler/CompilerUtils.java b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/compiler/CompilerUtils.java
index 74d5f65..494c588 100644
--- a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/compiler/CompilerUtils.java
+++ b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/compiler/CompilerUtils.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2010 Borland Software Corporation and others.
+ * Copyright (c) 2009, 2014 Borland Software Corporation and others.
  * 
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -8,14 +8,15 @@
  *   
  * Contributors:
  *     Borland Software Corporation - initial API and implementation
+ *     Christopher Gerking - bug 391289
  *******************************************************************************/
 package org.eclipse.m2m.internal.qvt.oml.compiler;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.SubProgressMonitor;
 import org.eclipse.emf.common.EMFPlugin;
 import org.eclipse.emf.common.util.BasicDiagnostic;
 import org.eclipse.emf.common.util.BasicMonitor;
@@ -78,7 +79,7 @@
 		return unitDiagnostic;
 	}
 	
-	static Monitor createMonitor(Monitor monitor, int ticks) {
+	public static Monitor createMonitor(Monitor monitor, int ticks) {
 		if (EMFPlugin.IS_ECLIPSE_RUNNING) {
 			return Eclipse.createMonitor(monitor, ticks);			
 		}
@@ -86,7 +87,7 @@
 		return monitor;
 	}
 	
-	static void throwOperationCanceled() throws RuntimeException {
+	public static void throwOperationCanceled() throws RuntimeException {
 		if(EMFPlugin.IS_ECLIPSE_RUNNING) {
 			Eclipse.throwOperationCanceled();
 		} else {
@@ -94,7 +95,7 @@
 		}
 	}
 	
-	static Monitor createNullMonitor() {
+	public static Monitor createNullMonitor() {
 		return new BasicMonitor();
 	}
 	
@@ -118,7 +119,7 @@
     }
     
     public static QVTOCompiler createCompiler() {
-    	// FIXME - eliminate eclipse dependency here, the call should be should be responsible
+    	// FIXME - eliminate eclipse dependency here, the call should be responsible
     	// for setting this up, as different domains have different requirements,
     	// like editor, builders etc.
     	if(EMFPlugin.IS_ECLIPSE_RUNNING && EMFPlugin.IS_RESOURCES_BUNDLE_AVAILABLE) {
@@ -135,11 +136,7 @@
         }    	
 
     	static Monitor createMonitor(Monitor monitor, int ticks) {
-			if (monitor instanceof IProgressMonitor) {
-				return new BasicMonitor.EclipseSubProgress((IProgressMonitor) monitor, ticks);
-			} else {
-				return new BasicMonitor.EclipseSubProgress(BasicMonitor.toIProgressMonitor(monitor), ticks);
-			}
+			return new BasicMonitor.EclipseSubProgress(BasicMonitor.toIProgressMonitor(monitor), ticks, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK);
     	}
     	
     	static void throwOperationCanceled() throws RuntimeException {
diff --git a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/compiler/QVTOCompiler.java b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/compiler/QVTOCompiler.java
index 67f8e7a..9b0823f 100644
--- a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/compiler/QVTOCompiler.java
+++ b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/compiler/QVTOCompiler.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2013 Borland Software Corporation and others.
+ * Copyright (c) 2009, 2014 Borland Software Corporation and others.
  * 
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -9,6 +9,7 @@
  * Contributors:
  *     Borland Software Corporation - initial API and implementation
  *     Alex Paperno - bugs 416584
+ *     Christopher Gerking - bugs 391289, 431082
  *******************************************************************************/
 package org.eclipse.m2m.internal.qvt.oml.compiler;
 
@@ -199,19 +200,15 @@
 		CompiledUnit[] result = new CompiledUnit[sources.length];
 
 		try {
-			monitor.beginTask("", sources.length); //$NON-NLS-1$
+			monitor.beginTask("Compile sources", sources.length); //$NON-NLS-1$
 			
 			int i = 0;
 			for (UnitProxy nextSource : sources) {
-	            if(monitor.isCanceled()) {
+	            if(isAborted(monitor)) {
 	            	CompilerUtils.throwOperationCanceled();
 	            }
 				
-				monitor.setTaskName(nextSource.getURI().toString());
-				
-				result[i++] = compileSingleFile(nextSource, options, monitor);
-				
-				monitor.worked(1);
+				result[i++] = compileSingleFile(nextSource, options, CompilerUtils.createMonitor(monitor, 1));
 			}
 		} finally {
 			fDependencyWalkPath.clear();
@@ -224,20 +221,7 @@
 	}
 	
 	public CompiledUnit compile(UnitProxy source, QvtCompilerOptions options, Monitor monitor) throws MdaException {
-		if(monitor == null) {
-			monitor = CompilerUtils.createNullMonitor();
-		}
-		
-		if(options == null) {
-			options = getDefaultOptions();			
-		}		
-		
-		try {
-			return compileSingleFile(source, options, monitor);
-		} finally {
-			fDependencyWalkPath.clear();
-			afterCompileCleanup();
-		}
+		return compile(new UnitProxy[] { source }, options, monitor)[0];
 	}
 	
     protected CSTParseResult parse(UnitProxy source, QvtCompilerOptions options) throws ParserException {
@@ -291,13 +275,15 @@
 		return getContentReader(unit);
 	}
     
-	protected CSTAnalysisResult analyze(CSTParseResult parseResult, UnitProxy unit, ExternalUnitElementsProvider externalUnitElementsProvider, QvtCompilerOptions options) {
+	private CSTAnalysisResult analyze(CSTParseResult parseResult, UnitProxy unit,
+			ExternalUnitElementsProvider externalUnitElementsProvider, QvtCompilerOptions options, Monitor monitor) {
+		
 		QvtOperationalFileEnv env = parseResult.env;
 		env.setQvtCompilerOptions(options);
 
 		CSTAnalysisResult result = new CSTAnalysisResult();
 		try {
-			QvtOperationalVisitorCS visitor = createAnalyzer(parseResult.parser, options);
+			QvtOperationalVisitorCS visitor = createAnalyzer(parseResult.parser, options, monitor);
 			UnitCS unitCS = parseResult.unitCS;
 			if(unitCS != null && !unitCS.getModules().isEmpty()) {
 				result.moduleEnvs = visitor.visitUnitCS(unitCS, unit, env, externalUnitElementsProvider, getResourceSet());
@@ -320,8 +306,8 @@
 		return result;
 	}
     
-    protected QvtOperationalVisitorCS createAnalyzer(AbstractQVTParser parser, QvtCompilerOptions options) {
-    	return new QvtOperationalVisitorCS(parser, options);
+    protected QvtOperationalVisitorCS createAnalyzer(AbstractQVTParser parser, QvtCompilerOptions options, Monitor monitor) {
+    	return new QvtOperationalVisitorCS(parser, options, monitor);
     }    
     
     protected void afterCompileCleanup() {
@@ -351,17 +337,18 @@
     }
 		
     private CompiledUnit doCompile(final UnitProxy source, QvtCompilerOptions options, Monitor monitor) throws ParserException, IOException {
-    	if(fSource2Compiled.containsKey(source.getURI())) {
-    		return fSource2Compiled.get(source.getURI());
-    	}
-
-    	monitor = CompilerUtils.createMonitor(monitor, 1); //new SubProgressMonitor(monitor, 1);
-    	monitor.beginTask(source.getURI().toString(), 3);
-    	
-		List<CompiledUnit> compiledImports = null;
-		DependencyPathElement dependencyElement = new DependencyPathElement(source);
     	try {
-        	fDependencyWalkPath.push(dependencyElement);
+        	monitor.beginTask('\'' + source.getURI().toString() + '\'', 3);
+        	monitor.subTask(""); //$NON-NLS-1$
+        	
+    		List<CompiledUnit> compiledImports = null;
+    		DependencyPathElement dependencyElement = new DependencyPathElement(source);
+
+    		fDependencyWalkPath.push(dependencyElement);
+
+        	if(fSource2Compiled.containsKey(source.getURI())) {
+        		return fSource2Compiled.get(source.getURI());
+        	}
 
         	if(fUseCompiledXMI) {
 	        	CompiledUnit binXMIUnit = getCompiledExeXMIUnit(source);
@@ -375,7 +362,6 @@
         		CompiledUnit loadBlackboxUnit = loadBlackboxUnit(source);        		
         		fSource2Compiled.put(source.getURI(), loadBlackboxUnit);
 
-        		monitor.worked(1);        		
 				return loadBlackboxUnit;
         	}
         	
@@ -390,6 +376,9 @@
 			UnitResolverImpl unitResolver = new UnitResolverImpl(source);
 	    	List<ImportCS> allUnitImportsCS = parseResult.getImports();
 	    	
+	    	Monitor importsMonitor = CompilerUtils.createMonitor(monitor, 1);
+	    	importsMonitor.beginTask("Process imports", allUnitImportsCS.size()); //$NON-NLS-1$
+	    	
 			for (ImportCS nextImportCS : allUnitImportsCS) {
 	            String importQNameStr = getQualifiedName(nextImportCS);
 	            if(importQNameStr == null || importQNameStr.length() == 0) {
@@ -419,13 +408,15 @@
 		            	continue;			            		
             		}
             		
-            		compiledImport = doCompile(importedUnit, options, monitor);
+            		compiledImport = doCompile(importedUnit, options, CompilerUtils.createMonitor(importsMonitor, 1));
             		
             	} else {
             		// report that unit was not resolved
         			String notFoundMessage = NLS.bind(CompilerMessages.importedCompilationUnitNotFound, 
         					QvtOperationalParserUtil.getStringRepresentation(nextImportCS.getPathNameCS(), NAMESPACE_SEP));
 	        		env.reportError(notFoundMessage, nextImportCS.getPathNameCS());
+	        		
+	        		importsMonitor.worked(1);
             	}
 
         		if(compiledImport != null) {
@@ -453,14 +444,17 @@
 	    	} // end of imports processing
 			    	
 	    	// announce CST and imports done
-	    	monitor.worked(1); 
-	
+	    	importsMonitor.done();
+	    	monitor.subTask(""); //$NON-NLS-1$
+			
 	    	// perform CST analysis
-	    	CSTAnalysisResult analysisResult = analyze(parseResult, source, unitResolver, options);
+	    	CSTAnalysisResult analysisResult = analyze(parseResult, source, unitResolver, options, monitor);
 			if(options.isSourceLineNumbersEnabled()) {
 	        	addSourceLineNumberInfo(parseResult.parser, analysisResult, source);
 	    	}
 			
+			monitor.worked(1);
+			
 			// load black-box implementation bindings
 	    	//AST2BlackboxImplBinder.ensureImplementationBinding(source, analysisResult.modules);
 							    	
@@ -482,13 +476,12 @@
 	    	// TODO - better to use this one as unit resolver 
 	    	fSource2Compiled.put(source.getURI(), result);
 
-	    	monitor.worked(1);	    	
 	    	return result;
 	    	
     	} finally {
-    		fDependencyWalkPath.pop();
+    		fDependencyWalkPath.pop();   		
     		
-	    	monitor.done();    		
+    		monitor.done();
     	}
     }
 
@@ -775,4 +768,9 @@
 			}
 		};
 	}
+	
+	private boolean isAborted(Monitor monitor) {
+		return monitor.isCanceled();
+	}
+	
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/evaluator/EvaluationUtil.java b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/evaluator/EvaluationUtil.java
index 894436e..a57f52a 100644
--- a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/evaluator/EvaluationUtil.java
+++ b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/evaluator/EvaluationUtil.java
@@ -8,7 +8,7 @@
  *   
  * Contributors:
  *     Borland Software Corporation - initial API and implementation
- *     Christopher Gerking - bugs 388801, 358709, 427237
+ *     Christopher Gerking - bugs 388801, 358709, 427237, 431082
  *     Alex Paperno - bug 419299 
  *******************************************************************************/
 package org.eclipse.m2m.internal.qvt.oml.evaluator;
@@ -206,7 +206,7 @@
 		};
 
 		nestedContext.setLog(parentContext.getLog());
-		nestedContext.setMonitor(parentContext.getMonitor());
+		nestedContext.setProgressMonitor(parentContext.getProgressMonitor());
 		nestedContext.getSessionData().setValue(AGGREGATING_ROOT_ENV, evalEnv);
 
 		return nestedContext;
diff --git a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/evaluator/QvtOperationalEvaluationVisitorImpl.java b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/evaluator/QvtOperationalEvaluationVisitorImpl.java
index ca37c8f..8d93ea0 100644
--- a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/evaluator/QvtOperationalEvaluationVisitorImpl.java
+++ b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/evaluator/QvtOperationalEvaluationVisitorImpl.java
@@ -29,6 +29,7 @@
 import java.util.ListIterator;
 import java.util.Map;
 
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.emf.common.notify.Adapter;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EClass;
@@ -138,7 +139,6 @@
 import org.eclipse.m2m.qvt.oml.ecore.ImperativeOCL.VariableInitExp;
 import org.eclipse.m2m.qvt.oml.ecore.ImperativeOCL.WhileExp;
 import org.eclipse.m2m.qvt.oml.util.Dictionary;
-import org.eclipse.m2m.qvt.oml.util.EvaluationMonitor;
 import org.eclipse.m2m.qvt.oml.util.IContext;
 import org.eclipse.m2m.qvt.oml.util.Log;
 import org.eclipse.m2m.qvt.oml.util.MutableList;
@@ -2492,7 +2492,7 @@
     }
     
     protected InternalEvaluator createInterruptibleVisitor() {
-    	final EvaluationMonitor monitor = getContext().getMonitor();
+    	final IProgressMonitor monitor = getContext().getProgressMonitor();
     	    
     	class InterruptVisitor extends QvtGenericVisitorDecorator.Any {
     		
diff --git a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/library/Context.java b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/library/Context.java
index 3321c50..ee26701 100644
--- a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/library/Context.java
+++ b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/library/Context.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2010 Borland Software Corporation and others.
+ * Copyright (c) 2007, 2014 Borland Software Corporation and others.
  * 
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -8,6 +8,7 @@
  * 
  * Contributors:
  *     Borland Software Corporation - initial API and implementation
+ *     Christopher Gerking - bug 431082
  *******************************************************************************/
 package org.eclipse.m2m.internal.qvt.oml.library;
 
@@ -15,6 +16,8 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.m2m.qvt.oml.util.EvaluationMonitor;
 import org.eclipse.m2m.qvt.oml.util.IContext;
 import org.eclipse.m2m.qvt.oml.util.ISessionData;
@@ -23,18 +26,19 @@
 /**
  * @noextend
  */
+@SuppressWarnings("deprecation")
 public class Context implements IContext {
 
     private final Map<String, Object>  myConfiguration;
     private SessionDataImpl myData;
 
     private Log myLog;
-    private EvaluationMonitor myMonitor;
+    private IProgressMonitor myMonitor;
     
     public Context() {
     	myConfiguration = new HashMap<String, Object>();
     	myLog = Log.NULL_LOG;
-		myMonitor = new DefaultMonitor();
+		myMonitor = new NullProgressMonitor();
 		myData = new SessionDataImpl();
     }
 
@@ -46,7 +50,7 @@
     	return new SessionDataImpl(myData);
     }
 
-    public void setMonitor(EvaluationMonitor monitor) {
+    public void setProgressMonitor(IProgressMonitor monitor) {
     	if(monitor == null) {
     		throw new IllegalArgumentException("Non-null monitor required"); //$NON-NLS-1$
     	}
@@ -54,10 +58,17 @@
 		this.myMonitor = monitor;
 	}
     
-    public EvaluationMonitor getMonitor() {    
+    public IProgressMonitor getProgressMonitor() {    
     	return myMonitor;
     }
     
+    /**
+     * @deprecated Use getProgressMonitor() method
+     */
+    public EvaluationMonitor getMonitor() {    
+    	return EvaluationMonitor.EvaluationMonitorWrapper.convert(myMonitor);
+    }
+    
     public void setLog(Log log) {
     	if(log == null) {
     		throw new IllegalArgumentException("Non-null logger required"); //$NON-NLS-1$
@@ -92,19 +103,6 @@
     }
     
             
-    private static class DefaultMonitor implements EvaluationMonitor {
-    	
-		private boolean myIsCancelled;
-
-		public void cancel() {
-			myIsCancelled = true;
-		}
-
-		public boolean isCanceled() {
-			return myIsCancelled;
-		}
-	}
-    
     private static class SessionDataImpl implements ISessionData {
     	
     	private HashMap<Object, Object> fData;
diff --git a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/ExecutionContext.java b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/ExecutionContext.java
index b899fcb..9cd3c8b 100644
--- a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/ExecutionContext.java
+++ b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/ExecutionContext.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009 Borland Software Corporation and others.
+ * Copyright (c) 2009, 2014 Borland Software Corporation and others.
  * 
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -8,11 +8,13 @@
  *   
  * Contributors:
  *     Borland Software Corporation - initial API and implementation
+ *     Christopher Gerking - bugs 422269, 431082
  *******************************************************************************/
 package org.eclipse.m2m.qvt.oml;
 
 import java.util.Set;
 
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.m2m.qvt.oml.util.EvaluationMonitor;
 import org.eclipse.m2m.qvt.oml.util.Log;
 
@@ -24,6 +26,7 @@
  * 
  * @noimplement This interface is not intended to be implemented by clients.
  */
+@SuppressWarnings("deprecation")
 public interface ExecutionContext {
 
 	/**
@@ -63,6 +66,18 @@
 	 * request.
 	 * 
 	 * @return the monitor implementation, never <code>null</code>
+	 * @deprecated Use getProgressMonitor() method
 	 */
 	EvaluationMonitor getMonitor();
+	
+	/**
+	 * Gets the evaluation monitor assigned to this context. The execution
+	 * engine will query the monitor the check for the user interruption
+	 * request.
+	 * 
+	 * @return the monitor implementation, never <code>null</code>
+	 * @since 3.4
+	 */
+	IProgressMonitor getProgressMonitor();
+	
 }
diff --git a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/ExecutionContextImpl.java b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/ExecutionContextImpl.java
index f8fb64a..de90ceb 100644
--- a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/ExecutionContextImpl.java
+++ b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/ExecutionContextImpl.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009 Borland Software Corporation and others.
+ * Copyright (c) 2009, 2014 Borland Software Corporation and others.
  * 
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -8,6 +8,7 @@
  *   
  * Contributors:
  *     Borland Software Corporation - initial API and implementation
+ *     Christopher Gerking - bugs 422269, 431082
  *******************************************************************************/
 package org.eclipse.m2m.qvt.oml;
 
@@ -16,6 +17,8 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.m2m.qvt.oml.util.EvaluationMonitor;
 import org.eclipse.m2m.qvt.oml.util.Log;
 
@@ -27,12 +30,12 @@
  * @noextend This class is not intended to be subclassed by clients.
  * @see TransformationExecutor
  */
+@SuppressWarnings("deprecation")
 public final class ExecutionContextImpl implements ExecutionContext {
 
-	private Map<String, Object> fConfigProperties = new HashMap<String, Object>(
-			5);
+	private Map<String, Object> fConfigProperties = new HashMap<String, Object>(5);
 
-	private EvaluationMonitor fMonitor;
+	private IProgressMonitor fMonitor;
 
 	private Log fLog;
 
@@ -41,15 +44,14 @@
 	 */
 	public ExecutionContextImpl() {
 		fLog = Log.NULL_LOG;
-		fMonitor = ExecutionContextImpl.createDefaultMonitor();
+		fMonitor = createDefaultMonitor();
 	}
 
 	/*
 	 * (non-Javadoc)
 	 * 
 	 * @see
-	 * org.eclipse.m2m.qvt.oml.ExecutionContext#getConfigProperty(java.lang.
-	 * String)
+	 * org.eclipse.m2m.qvt.oml.ExecutionContext#getConfigProperty(java.lang.String)
 	 */
 	public Object getConfigProperty(String name) {
 		if (name == null) {
@@ -113,6 +115,13 @@
 	 * @see org.eclipse.m2m.qvt.oml.ExecutionContext#getMonitor()
 	 */
 	public EvaluationMonitor getMonitor() {
+		return EvaluationMonitor.EvaluationMonitorWrapper.convert(fMonitor);
+	}
+
+	/**
+	 * @since 3.4
+	 */
+	public IProgressMonitor getProgressMonitor() {
 		return fMonitor;
 	}
 
@@ -121,26 +130,32 @@
 	 * 
 	 * @param monitor
 	 *            the monitor implementation, never <code>null</code>
+	 * @deprecated
 	 */
 	public void setMonitor(EvaluationMonitor monitor) {
 		if (monitor == null) {
 			throw new IllegalArgumentException("null monitor"); //$NON-NLS-1$
 		}
 
-		fMonitor = monitor;
+		setProgressMonitor(EvaluationMonitor.EvaluationMonitorWrapper.convert(monitor));
 	}
 
-	private static EvaluationMonitor createDefaultMonitor() {
-		return new EvaluationMonitor() {
-			boolean myIsCancelled;
+	/**
+	 * Set evaluation monitor to this context
+	 * 
+	 * @param monitor
+	 *            the monitor implementation, never <code>null</code>
+	 * @since 3.4
+	 */
+	public void setProgressMonitor(IProgressMonitor monitor) {
+		if (monitor == null) {
+			throw new IllegalArgumentException("null monitor"); //$NON-NLS-1$
+		}
 
-			public void cancel() {
-				myIsCancelled = true;
-			}
-
-			public boolean isCanceled() {
-				return myIsCancelled;
-			}
-		};
+		fMonitor = monitor;
+	}
+	
+	private static IProgressMonitor createDefaultMonitor() {
+		return new NullProgressMonitor();
 	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/TransformationExecutor.java b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/TransformationExecutor.java
index 7217451..92147fb 100644
--- a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/TransformationExecutor.java
+++ b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/TransformationExecutor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009 Borland Software Corporation and others.
+ * Copyright (c) 2009, 2014 Borland Software Corporation and others.
  * 
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -8,9 +8,12 @@
  *   
  * Contributors:
  *     Borland Software Corporation - initial API and implementation
+ *     Christopher Gerking - bug 431082
  *******************************************************************************/
 package org.eclipse.m2m.qvt.oml;
 
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.emf.common.util.Diagnostic;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EPackage;
@@ -65,7 +68,23 @@
 	 * @return the diagnostic indicating possible problems of the load action
 	 */
 	public Diagnostic loadTransformation() {
-		return fExector.loadTransformation();
+		return loadTransformation(new NullProgressMonitor());
+	}
+	
+	/**
+	 * Attempts to load the transformation referred by this executor and checks
+	 * if it is valid for execution.
+	 * <p>
+	 * <b>Remark:</b></br> Only the first performs the actual transformation
+	 * loading, subsequent calls to this method will return the existing
+	 * diagnostic.
+	 * 
+	 * @since 3.4
+	 * @param the monitor indicating load progress and cancellation
+	 * @return the diagnostic indicating possible problems of the load action
+	 */
+	public Diagnostic loadTransformation(IProgressMonitor monitor) {
+		return fExector.loadTransformation(monitor);
 	}
 
 	/**
diff --git a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/util/EvaluationMonitor.java b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/util/EvaluationMonitor.java
index 9a63ed0..7a14815 100644
--- a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/util/EvaluationMonitor.java
+++ b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/util/EvaluationMonitor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2009 Borland Software Corporation and others.
+ * Copyright (c) 2007, 2014 Borland Software Corporation and others.
  * 
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -8,11 +8,17 @@
  *   
  * Contributors:
  *     Borland Software Corporation - initial API and implementation
+ *     Christopher Gerking - bug 431082
  *******************************************************************************/
 package org.eclipse.m2m.qvt.oml.util;
 
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.ProgressMonitorWrapper;
+
 /**
  * @since 2.0
+ * @deprecated Use IProgressMonitor instance instead
  */
 public interface EvaluationMonitor {
 	/**
@@ -25,4 +31,36 @@
 	 * canceled by calling {@link #cancel()}.
 	 */
 	boolean isCanceled();
+	
+
+	/**
+	 * The purpose of this class is to support wrapping of the IProgressMonitor interface to
+	 * deprecated <code>EvaluationMonitor</code> interface for API compatibility reason. 
+	 * 
+	 * @since 3.4
+	 */
+	class EvaluationMonitorWrapper extends ProgressMonitorWrapper implements EvaluationMonitor {
+
+		private EvaluationMonitorWrapper(IProgressMonitor monitor) {
+			super(monitor);
+		}
+
+		public void cancel() {
+			setCanceled(true);
+		}
+
+		public static EvaluationMonitor convert(IProgressMonitor monitor) {
+			return new EvaluationMonitorWrapper(monitor);
+		}
+
+		public static IProgressMonitor convert(final EvaluationMonitor monitor) {
+			return new NullProgressMonitor() {
+				@Override
+				public boolean isCanceled() {
+					return monitor.isCanceled();
+				}
+			};
+		}
+	}	
+	
 }
diff --git a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/util/IContext.java b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/util/IContext.java
index 4841061..254e7db 100644
--- a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/util/IContext.java
+++ b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/qvt/oml/util/IContext.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2010 Borland Software Corporation and others.
+ * Copyright (c) 2007, 2014 Borland Software Corporation and others.
  * 
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -8,11 +8,14 @@
  * 
  * Contributors:
  *     Borland Software Corporation - initial API and implementation
+ *     Christopher Gerking - bug 431082
  *******************************************************************************/
 package org.eclipse.m2m.qvt.oml.util;
 
 import java.util.Map;
 
+import org.eclipse.core.runtime.IProgressMonitor;
+
 
 /**
  * @noimplement
@@ -34,11 +37,17 @@
 	/**
 	 * Retrieve the monitor associated with this context.
 	 * <p>
-	 * It can be used to interrupt execution from another thread then the
+	 * It can be used to interrupt execution from another thread than the
 	 * execution thread.
 	 * 
 	 * @return the monitor object, never <code>null</code>
+	 * @since 3.4
 	 */
+    IProgressMonitor getProgressMonitor();
+    
+    /**
+     * @deprecated Use getProgressMonitor() method
+     */
     EvaluationMonitor getMonitor();
 		
     Map<String, Object> getConfigProperties();
diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/bbox/AnnotatedJavaLibrary.java b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/bbox/AnnotatedJavaLibrary.java
index 93bb961..13decc9 100644
--- a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/bbox/AnnotatedJavaLibrary.java
+++ b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/bbox/AnnotatedJavaLibrary.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008, 2010 Borland Software Corporation and others.
+ * Copyright (c) 2008, 2014 Borland Software Corporation and others.
  * 
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -8,6 +8,7 @@
  * 
  * Contributors:
  *     Borland Software Corporation - initial API and implementation
+ *     Christopher Gerking - bug 431082
  *******************************************************************************/
 package org.eclipse.m2m.tests.qvt.oml.bbox;
 
@@ -384,9 +385,11 @@
 		context.getLog().log(param);
 	}
 
+	@SuppressWarnings("deprecation")
 	@Operation (withExecutionContext=true)
 	public void cancelExecution(IContext context) {
 		context.getMonitor().cancel();
+		// context.getProgressMonitor().setCanceled(true);
 	}
 	
 	@Operation (contextual=true, withExecutionContext=true)
diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/callapi/InvocationTest.java b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/callapi/InvocationTest.java
index e27d102..9290f6a 100644
--- a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/callapi/InvocationTest.java
+++ b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/callapi/InvocationTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009 Borland Software Corporation and others.
+ * Copyright (c) 2009, 2014 Borland Software Corporation and others.
  * 
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -8,6 +8,7 @@
  *   
  * Contributors:
  *     Borland Software Corporation - initial API and implementation
+ *     Christopher Gerking - bugs 422269, 431082
  *******************************************************************************/
 package org.eclipse.m2m.tests.qvt.oml.callapi;
 
@@ -20,6 +21,8 @@
 import junit.framework.TestCase;
 
 import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.emf.common.util.Diagnostic;
 import org.eclipse.emf.common.util.URI;
@@ -33,7 +36,6 @@
 import org.eclipse.m2m.qvt.oml.ExecutionDiagnostic;
 import org.eclipse.m2m.qvt.oml.ModelExtent;
 import org.eclipse.m2m.qvt.oml.TransformationExecutor;
-import org.eclipse.m2m.qvt.oml.util.EvaluationMonitor;
 import org.eclipse.m2m.qvt.oml.util.Log;
 import org.eclipse.m2m.qvt.oml.util.StringBufferLog;
 import org.eclipse.m2m.tests.qvt.oml.util.TestUtil;
@@ -154,39 +156,30 @@
 	}
 
 	public void testInterruption() throws Exception {
-		final EvaluationMonitor monitor = new EvaluationMonitor() {
-			boolean canceled = false;
-			
-			public void cancel() {
-				canceled = true;
-			}			
-			public boolean isCanceled() {			
-				return canceled;
-			}
-		};
+		final IProgressMonitor monitor = new NullProgressMonitor();
 		
 		Log log = new Log() {
 			public void log(int level, String message, Object param) {
-				monitor.cancel();
+				monitor.setCanceled(true);
 			}
 
 			public void log(int level, String message) {
-				monitor.cancel();				
+				monitor.setCanceled(true);				
 			}
 
 			public void log(String message, Object param) {
-				monitor.cancel();				
+				monitor.setCanceled(true);		
 			}
 
 			public void log(String message) {
-				monitor.cancel();				
+				monitor.setCanceled(true);				
 			}
 		};
 		
-		fContext.setMonitor(monitor);
+		fContext.setProgressMonitor(monitor);
 		fContext.setLog(log);
 
-		final ExecutionDiagnostic  diagnostic = fExecutor.execute(fContext, fInput, fOutput);	
+		final ExecutionDiagnostic diagnostic = fExecutor.execute(fContext, fInput, fOutput);	
 		assertEquals(Diagnostic.CANCEL, diagnostic.getSeverity());
 		assertEquals(ExecutionDiagnostic.USER_INTERRUPTED, diagnostic.getCode());		
 		assertEquals(1, diagnostic.getStackTrace().size());