diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ResourceSetWorkbenchEditSynchronizer.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ResourceSetWorkbenchEditSynchronizer.java
index d2efde4..aaf902e 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ResourceSetWorkbenchEditSynchronizer.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ResourceSetWorkbenchEditSynchronizer.java
@@ -29,10 +29,11 @@
 import org.eclipse.core.resources.IResourceChangeEvent;
 import org.eclipse.core.resources.IResourceDelta;
 import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.jobs.IJobManager;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.common.util.WrappedException;
 import org.eclipse.emf.ecore.resource.Resource;
@@ -64,14 +65,6 @@
 
 	protected List autoloadResourcesURIs = new ArrayList();
 
-	private static final ISchedulingRule NULL_SCHEDULING_RULE= new ISchedulingRule() {
-        public boolean contains(ISchedulingRule rule) {
-                return false;
-        }
-        public boolean isConflicting(ISchedulingRule rule) {
-                return false;
-        }
-	};
 
 
 	/**
@@ -106,7 +99,7 @@
 		Resource resource = null;
 		for (int i = 0; i < deferredRemoveResources.size(); i++) {
 			resource = (Resource) deferredRemoveResources.get(i);
-			getResourceSet().getResources().remove(resource);
+			resourceSet.getResources().remove(resource);
 			resource.unload();
 		}
 	}
@@ -124,7 +117,7 @@
 		for (int i = 0; i < deferredLoadResources.size(); i++) {
 			uri = (URI) deferredLoadResources.get(i);
 			try {
-				getResourceSet().getResource(uri, true);
+				resourceSet.getResource(uri, true);
 			} catch (WrappedException ex) {
 				Logger.getLogger().logError(ex);
 			}
@@ -132,24 +125,36 @@
 		}
 	}
 
-	protected void acceptDelta(IResourceChangeEvent event) {
-		IResourceDelta delta = event.getDelta();
-		// search for changes to any projects using a visitor
+	protected void acceptDelta(final IResourceChangeEvent event) {
 
-        ISchedulingRule rule = null;
-        try {
-                rule = acquireResourceRule(project);
-        		if (delta != null) {
-        			try {
-        				delta.accept(this);
-        			} catch (Exception e) {
-        				Logger.getLogger().logError(e);
-        			}
-        		}
-        } finally {
-                releaseResourceRule(rule);
-        }
+		final IResourceDelta delta = event.getDelta();
 
+		if (ResourcesPlugin.getWorkspace().isTreeLocked()) {
+			primAcceptDelta(delta, event);
+		}
+		else {
+			IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
+				public void run(IProgressMonitor monitor) throws CoreException {
+					primAcceptDelta(delta, event);
+				}
+			};
+			try {
+				ResourcesPlugin.getWorkspace().run(runnable, project, IWorkspace.AVOID_UPDATE, null);
+			} catch (CoreException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+		}
+	}
+
+	private void primAcceptDelta(IResourceDelta delta, IResourceChangeEvent event) {
+		if (delta != null) {
+			try {
+				delta.accept(ResourceSetWorkbenchEditSynchronizer.this);
+			} catch (Exception e) {
+				Logger.getLogger().logError(e);
+			}
+		}
 	}
 
 	/**
@@ -159,8 +164,8 @@
 	protected void release() {
 		if (JEMUtilPlugin.isActivated()) {
 			try {
-				if (getResourceSet() instanceof ProjectResourceSet)
-					((ProjectResourceSet) getResourceSet()).release();
+				if (resourceSet instanceof ProjectResourceSet)
+					((ProjectResourceSet) resourceSet).release();
 			} finally {
 				EMFWorkbenchContextFactory.INSTANCE.removeCachedProject(getProject());
 				dispose();
@@ -275,7 +280,8 @@
 	}
 
 	protected Resource getResource(IFile aFile) {
-		return getResourceSet().getResource(URI.createPlatformResourceURI(aFile.getFullPath().toString()), false);
+		
+		return resourceSet.getResource(URI.createPlatformResourceURI(aFile.getFullPath().toString()), false);
 	}
 
 
@@ -356,12 +362,12 @@
 	}
 
 	public void enableAutoload(URI uri) {
-		URI normalized = getResourceSet().getURIConverter().normalize(uri);
+		URI normalized = resourceSet.getURIConverter().normalize(uri);
 		autoloadResourcesURIs.add(normalized);
 	}
 
 	public void disableAutoload(URI uri) {
-		URI normalized = getResourceSet().getURIConverter().normalize(uri);
+		URI normalized = resourceSet.getURIConverter().normalize(uri);
 		autoloadResourcesURIs.remove(normalized);
 	}
 
@@ -374,32 +380,4 @@
 		getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.PRE_DELETE | IResourceChangeEvent.POST_CHANGE);
 	}
 
-	protected synchronized ResourceSet getResourceSet(){
-		return resourceSet;
-	}
-	
-	private static void releaseResourceRule(ISchedulingRule rule) {
-        if(rule == null) return;
-        IJobManager manager= Platform.getJobManager();
-        manager.endRule(rule);
-	}
-	
-	private static ISchedulingRule acquireResourceRule(IResource res) {
-	        ISchedulingRule rule = (res != null ? res : NULL_SCHEDULING_RULE);
-	        IJobManager manager= Platform.getJobManager();
-	        Job currentJob = manager.currentJob();
-	        if (currentJob != null) {
-	                ISchedulingRule currentRule = currentJob.getRule();
-	                if (currentRule != null)                                
-	                        return null;
-	        }
-	        try {
-	                manager.beginRule(rule, null);
-	        } catch (IllegalArgumentException ex){
-	                //Catching Scope exception
-	        }
-	        return rule;
-	}
-	
-	
 }
