diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilProject.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilProject.java
index 5bcc899..755fa02 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilProject.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilProject.java
@@ -51,6 +51,7 @@
 import org.apache.felix.sigil.repository.ResolutionMonitorAdapter;
 import org.apache.felix.sigil.utils.GlobCompiler;
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.ProjectScope;
@@ -110,11 +111,18 @@
 
     public void save( IProgressMonitor monitor ) throws CoreException
     {
+        save(monitor, true);
+    }
+    
+    public void save( IProgressMonitor monitor, boolean rebuildDependencies ) throws CoreException
+    {
         SubMonitor progress = SubMonitor.convert( monitor, 100 );
 
         bldProjectFile.setContents( buildContents(), IFile.KEEP_HISTORY, progress.newChild( 10 ) );
-        
-        rebuildDependencies(progress.newChild(90));
+     
+        if ( rebuildDependencies ) {
+            rebuildDependencies(progress.newChild(90));
+        }
     }
 
     public void rebuildDependencies(IProgressMonitor monitor) throws CoreException {
@@ -123,26 +131,79 @@
         calculateUses();
 
         IRepositoryManager manager = SigilCore.getRepositoryManager( this );
-        ResolutionConfig config = new ResolutionConfig( ResolutionConfig.INCLUDE_OPTIONAL );
+        ResolutionConfig config = new ResolutionConfig( ResolutionConfig.INCLUDE_OPTIONAL | ResolutionConfig.IGNORE_ERRORS );
 
         try
         {
-            IResolution res = manager.getBundleResolver().resolve( this, config,
+            IResolution resolution = manager.getBundleResolver().resolve( this, config,
                 new ResolutionMonitorAdapter( progress.newChild( 10 ) ) );
-            if ( !res.isSynchronized() )
+            
+            getProject().deleteMarkers( SigilCore.MARKER_UNRESOLVED_DEPENDENCY, true,
+                IResource.DEPTH_ONE );
+
+            // Find missing imports
+            Collection<IPackageImport> imports = getBundle().getBundleInfo().getImports();
+            for ( IPackageImport pkgImport : imports )
             {
-                res.synchronize( progress.newChild( 60 ) );
+                if ( resolution.getProvider( pkgImport ) == null )
+                {
+                    markMissingImport( pkgImport, getProject() );
+                }
             }
+
+            // Find missing required bundles
+            Collection<IRequiredBundle> requiredBundles = getBundle().getBundleInfo()
+            .getRequiredBundles();
+            for ( IRequiredBundle requiredBundle : requiredBundles )
+            {
+                if ( resolution.getProvider( requiredBundle ) == null )
+                {
+                    markMissingRequiredBundle( requiredBundle, getProject() );
+                }
+            }
+            
+            if ( !resolution.isSynchronized() )
+            {
+                resolution.synchronize( progress.newChild( 60 ) );
+            }
+            
+
         }
         catch ( ResolutionException e )
         {
-            throw SigilCore.newCoreException( "Failed to synchronize dependencies", e );
+            throw SigilCore.newCoreException( "Failed to resolve dependencies", e );
         }
 
         progress.setWorkRemaining( 30 );
 
         SigilCore.rebuildBundleDependencies( this, progress.newChild( 30 ) );
     }
+    
+
+
+    private static void markMissingImport( IPackageImport pkgImport, IProject project ) throws CoreException
+    {
+        IMarker marker = project.getProject().createMarker( SigilCore.MARKER_UNRESOLVED_IMPORT_PACKAGE );
+        marker.setAttribute( "element", pkgImport.getPackageName() );
+        marker.setAttribute( "versionRange", pkgImport.getVersions().toString() );
+        marker.setAttribute( IMarker.MESSAGE, "Cannot resolve imported package \"" + pkgImport.getPackageName()
+            + "\" with version range " + pkgImport.getVersions() );
+        marker.setAttribute( IMarker.SEVERITY, pkgImport.isOptional() ? IMarker.SEVERITY_WARNING
+            : IMarker.SEVERITY_ERROR );
+        marker.setAttribute( IMarker.PRIORITY, IMarker.PRIORITY_HIGH );
+    }
+
+
+    private static void markMissingRequiredBundle( IRequiredBundle req, IProject project ) throws CoreException
+    {
+        IMarker marker = project.getProject().createMarker( SigilCore.MARKER_UNRESOLVED_REQUIRE_BUNDLE );
+        marker.setAttribute( "element", req.getSymbolicName() );
+        marker.setAttribute( "versionRange", req.getVersions().toString() );
+        marker.setAttribute( IMarker.MESSAGE, "Cannot resolve required bundle \"" + req.getSymbolicName()
+            + "\" with version range " + req.getVersions() );
+        marker.setAttribute( IMarker.SEVERITY, req.isOptional() ? IMarker.SEVERITY_WARNING : IMarker.SEVERITY_ERROR );
+        marker.setAttribute( IMarker.PRIORITY, IMarker.PRIORITY_HIGH );
+    }    
 
     /**
      * Returns the project custom preference pool.
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/job/ResolveProjectsJob.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/job/ResolveProjectsJob.java
index f9bddd8..b2efef0 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/job/ResolveProjectsJob.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/job/ResolveProjectsJob.java
@@ -22,53 +22,34 @@
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Set;
 
 import org.apache.felix.sigil.eclipse.SigilCore;
 import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.model.osgi.IPackageImport;
-import org.apache.felix.sigil.model.osgi.IRequiredBundle;
-import org.apache.felix.sigil.repository.IBundleResolver;
-import org.apache.felix.sigil.repository.IRepositoryManager;
-import org.apache.felix.sigil.repository.IResolution;
-import org.apache.felix.sigil.repository.ResolutionConfig;
-import org.apache.felix.sigil.repository.ResolutionException;
-import org.apache.felix.sigil.repository.ResolutionMonitorAdapter;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
 
 
 public class ResolveProjectsJob extends Job
 {
-
-    private final IWorkspace workspace;
-    private final IProject project;
-
-
+    final Collection<ISigilProjectModel> sigilProjects;
+    
     public ResolveProjectsJob( IWorkspace workspace )
     {
         super( "Resolving Sigil projects" );
-        this.workspace = workspace;
-        this.project = null;
-        setRule( ResourcesPlugin.getWorkspace().getRoot() );
+        setRule( workspace.getRoot() );
+        sigilProjects = SigilCore.getRoot().getProjects();
     }
 
 
-    public ResolveProjectsJob( IProject project )
+    public ResolveProjectsJob(ISigilProjectModel project)
     {
         super( "Resolving Sigil project" );
-        this.workspace = null;
-        this.project = project;
-        setRule( project.getFile( SigilCore.SIGIL_PROJECT_FILE ) );
+        setRule( project.getProject() );
+        sigilProjects = Collections.singleton(project);
     }
 
 
@@ -77,18 +58,11 @@
     {
         MultiStatus status = new MultiStatus( SigilCore.PLUGIN_ID, 0, "Error resolving Sigil projects", null );
 
-        Collection<ISigilProjectModel> sigilProjects = null;
-
-        if ( workspace != null )
-        {
-            sigilProjects = SigilCore.getRoot().getProjects();
-        }
-        else if ( project != null )
+        for ( ISigilProjectModel sigilProject : sigilProjects )
         {
             try
             {
-                ISigilProjectModel sigilProject = SigilCore.create( project );
-                sigilProjects = Collections.singleton( sigilProject );
+                sigilProject.rebuildDependencies(monitor);
             }
             catch ( CoreException e )
             {
@@ -96,84 +70,6 @@
             }
         }
 
-        if ( sigilProjects != null )
-        {
-            for ( ISigilProjectModel sigilProject : sigilProjects )
-            {
-                try
-                {
-                    // Delete existing dependency markers on project
-                    sigilProject.getProject().deleteMarkers( SigilCore.MARKER_UNRESOLVED_DEPENDENCY, true,
-                        IResource.DEPTH_ONE );
-
-                    IRepositoryManager repository = SigilCore.getRepositoryManager( sigilProject );
-                    ResolutionMonitorAdapter resolutionMonitor = new ResolutionMonitorAdapter( monitor );
-
-                    IBundleResolver resolver = repository.getBundleResolver();
-                    ResolutionConfig config = new ResolutionConfig( ResolutionConfig.IGNORE_ERRORS );
-
-                    // Execute resolver
-                    IResolution resolution = resolver.resolve( sigilProject, config, resolutionMonitor );
-
-                    // Find missing imports
-                    Collection<IPackageImport> imports = sigilProject.getBundle().getBundleInfo().getImports();
-                    for ( IPackageImport pkgImport : imports )
-                    {
-                        if ( resolution.getProvider( pkgImport ) == null )
-                        {
-                            markMissingImport( pkgImport, sigilProject.getProject() );
-                        }
-                    }
-
-                    // Find missing required bundles
-                    Collection<IRequiredBundle> requiredBundles = sigilProject.getBundle().getBundleInfo()
-                        .getRequiredBundles();
-                    for ( IRequiredBundle requiredBundle : requiredBundles )
-                    {
-                        if ( resolution.getProvider( requiredBundle ) == null )
-                        {
-                            markMissingRequiredBundle( requiredBundle, sigilProject.getProject() );
-                        }
-                    }
-                }
-                catch ( ResolutionException e )
-                {
-                    status.add( new Status( IStatus.ERROR, SigilCore.PLUGIN_ID, 0, "Error resolving project "
-                        + sigilProject.getProject().getName(), e ) );
-                }
-                catch ( CoreException e )
-                {
-                    status.add( e.getStatus() );
-                }
-            }
-        }
-
         return status;
     }
-
-
-    private static void markMissingImport( IPackageImport pkgImport, IProject project ) throws CoreException
-    {
-        IMarker marker = project.getProject().createMarker( SigilCore.MARKER_UNRESOLVED_IMPORT_PACKAGE );
-        marker.setAttribute( "element", pkgImport.getPackageName() );
-        marker.setAttribute( "versionRange", pkgImport.getVersions().toString() );
-        marker.setAttribute( IMarker.MESSAGE, "Cannot resolve imported package \"" + pkgImport.getPackageName()
-            + "\" with version range " + pkgImport.getVersions() );
-        marker.setAttribute( IMarker.SEVERITY, pkgImport.isOptional() ? IMarker.SEVERITY_WARNING
-            : IMarker.SEVERITY_ERROR );
-        marker.setAttribute( IMarker.PRIORITY, IMarker.PRIORITY_HIGH );
-    }
-
-
-    private static void markMissingRequiredBundle( IRequiredBundle req, IProject project ) throws CoreException
-    {
-        IMarker marker = project.getProject().createMarker( SigilCore.MARKER_UNRESOLVED_REQUIRE_BUNDLE );
-        marker.setAttribute( "element", req.getSymbolicName() );
-        marker.setAttribute( "versionRange", req.getVersions().toString() );
-        marker.setAttribute( IMarker.MESSAGE, "Cannot resolve required bundle \"" + req.getSymbolicName()
-            + "\" with version range " + req.getVersions() );
-        marker.setAttribute( IMarker.SEVERITY, req.isOptional() ? IMarker.SEVERITY_WARNING : IMarker.SEVERITY_ERROR );
-        marker.setAttribute( IMarker.PRIORITY, IMarker.PRIORITY_HIGH );
-    }
-
 }
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/ISigilProjectModel.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/ISigilProjectModel.java
index 3866a5f..29c2d8f 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/ISigilProjectModel.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/ISigilProjectModel.java
@@ -72,7 +72,15 @@
      *            should be reported and that the operation cannot be cancelled
      * @throws CoreException
      */
-    void save( IProgressMonitor monitor ) throws CoreException;
+    void save(IProgressMonitor monitor) throws CoreException;
+    
+    /**
+     * Save the project and optionally rebuildDependencies
+     * @param monitor
+     * @param rebuildDependencies
+     * @throws CoreException
+     */
+    void save( IProgressMonitor monitor, boolean rebuildDependencies ) throws CoreException;
     
     void rebuildDependencies(IProgressMonitor monitor) throws CoreException;
 
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/ui/eclipse/ui/editors/project/SigilProjectEditorPart.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/ui/eclipse/ui/editors/project/SigilProjectEditorPart.java
index 93025d7..ebc66fa 100644
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/ui/eclipse/ui/editors/project/SigilProjectEditorPart.java
+++ b/sigil/eclipse/ui/src/org/apache/felix/sigil/ui/eclipse/ui/editors/project/SigilProjectEditorPart.java
@@ -28,6 +28,7 @@
 
 import org.apache.felix.sigil.common.osgi.VersionRange;
 import org.apache.felix.sigil.eclipse.SigilCore;
+import org.apache.felix.sigil.eclipse.job.ResolveProjectsJob;
 import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
 import org.apache.felix.sigil.model.IModelElement;
 import org.apache.felix.sigil.model.ModelElementFactory;
@@ -66,7 +67,7 @@
 {
 
     private final Set<IModelElement> unresolvedElements = Collections.synchronizedSet( new HashSet<IModelElement>() );
-    private ISigilProjectModel projectx;
+    private ISigilProjectModel project;
     private ISigilProjectModel tempProject;
     private volatile boolean saving = false;
     private int dependenciesPageIndex;
@@ -101,8 +102,10 @@
                     try
                     {
                         if ( doInternalSave(monitor) ) {
-                            projectx.setBundle( null );
-                            projectx.rebuildDependencies(monitor);                            
+                            project.setBundle( null );
+                            tempProject.setBundle(null);
+                            project.rebuildDependencies(monitor);
+                            refreshAllPages();
                         }
 
                         monitor.done();
@@ -116,7 +119,7 @@
         }
         catch ( InvocationTargetException e )
         {
-            SigilCore.error( "Failed to save " + projectx, e.getTargetException() );
+            SigilCore.error( "Failed to save " + project, e.getTargetException() );
         }
         catch ( InterruptedException e )
         {
@@ -147,11 +150,12 @@
         else if ( isDirty() )
         {
             commitPages( true );
-            tempProject.save( monitor );
+            tempProject.save( monitor, false );
             SigilUI.runInUISync( new Runnable()
             {
                 public void run()
                 {
+                    textPage.setInput(getEditorInput());
                     editorDirtyStateChanged();
                 }
             } );
@@ -177,7 +181,7 @@
             addPage( new ExportsForm( this, tempProject ) );
             textPage = new PropertiesForm( this, tempProject );
             addPage( textPage, getEditorInput() );
-            setPartName( projectx.getSymbolicName() );
+            setPartName( project.getSymbolicName() );
 
             refreshTabImages();
         }
@@ -231,6 +235,27 @@
 
     public void resourceChanged( IResourceChangeEvent event )
     {
+        switch (event.getType()) {
+            case IResourceChangeEvent.PRE_REFRESH:
+                handleRefresh(event);
+                break;
+            case IResourceChangeEvent.POST_CHANGE:
+                handleChange(event);
+                break;
+        }
+
+    }
+
+
+    private void handleRefresh(IResourceChangeEvent event)
+    {
+        ResolveProjectsJob job = new ResolveProjectsJob(project);
+        job.schedule();        
+    }
+
+
+    private void handleChange(IResourceChangeEvent event)
+    {
         IResourceDelta delta = event.getDelta();
         final IFile editorFile = ( ( IFileEditorInput ) getEditorInput() ).getFile();
         try
@@ -243,43 +268,13 @@
                     IResource resource = delta.getResource();
                     if ( resource instanceof IProject )
                     {
-                        if ( !editorFile.getProject().equals( resource ) )
-                        {
-                            return false;
-                        }
-                        if ( kind == IResourceDelta.CHANGED && ( delta.getFlags() & IResourceDelta.MARKERS ) > 0 )
-                        {
-                            loadUnresolvedDependencies();
-                            refreshAllPages();
-                        }
-                        return true;
+                        int flags = delta.getFlags();
+                        return handleProjectChange(editorFile, (IProject) resource, kind, flags);
                     }
 
                     if ( resource instanceof IFile )
                     {
-                        IFile affectedFile = ( IFile ) resource;
-                        if ( affectedFile.equals( editorFile ) )
-                        {
-                            switch ( kind )
-                            {
-                                case IResourceDelta.REMOVED:
-                                    close( false );
-                                    break;
-                                case IResourceDelta.CHANGED:
-                                    if ( !saving )
-                                    {
-                                        reload();
-                                    }
-                                    SigilUI.runInUISync( new Runnable()
-                                    {
-                                        public void run()
-                                        {
-                                            setPartName( projectx.getSymbolicName() );
-                                        }
-                                    } );
-                                    break;
-                            }
-                        }
+                        handleFileChange(editorFile, (IFile) resource, kind);
                         // Recurse no more
                         return false;
                     }
@@ -295,6 +290,48 @@
     }
 
 
+    protected void handleFileChange(IFile editorFile, IFile affectedFile, int kind)
+    {
+        if ( affectedFile.equals( editorFile ) )
+        {
+            switch ( kind )
+            {
+                case IResourceDelta.REMOVED:
+                    close( false );
+                    break;
+                case IResourceDelta.CHANGED:
+                    if ( !saving )
+                    {
+                        reload();
+                    }
+                    SigilUI.runInUISync( new Runnable()
+                    {
+                        public void run()
+                        {
+                            setPartName( project.getSymbolicName() );
+                        }
+                    } );
+                    break;
+            }
+        }
+    }
+
+
+    private boolean handleProjectChange(IResource editorFile, IProject project, int kind, int flags) throws CoreException
+    {
+        if ( !editorFile.getProject().equals( project ) )
+        {
+            return false;
+        }
+        if ( kind == IResourceDelta.CHANGED && ( flags & IResourceDelta.MARKERS ) > 0 )
+        {
+            loadUnresolvedDependencies();
+            refreshAllPages();
+        }
+        return true;
+    }
+
+
     protected void refreshAllPages()
     {
         Runnable op = new Runnable()
@@ -319,7 +356,7 @@
                     }
                 }
                 firePropertyChange( IEditorPart.PROP_DIRTY );
-                setPartName( projectx.getSymbolicName() );
+                setPartName( project.getSymbolicName() );
                 refreshTabImages();
             }
         };
@@ -327,9 +364,9 @@
     }
 
 
-    protected void reload()
+    private void reload()
     {
-        projectx.setBundle( null );
+        project.setBundle( null );
         refreshAllPages();
     }
 
@@ -341,15 +378,15 @@
 
         try
         {
-            this.projectx = SigilCore.create( getProject() );
-            this.tempProject = (ISigilProjectModel) projectx.clone();
+            this.project = SigilCore.create( getProject() );
+            this.tempProject = (ISigilProjectModel) project.clone();
         }
         catch ( CoreException e )
         {
             throw new PartInitException( "Error creating Sigil project", e );
         }
 
-        ResourcesPlugin.getWorkspace().addResourceChangeListener( this, IResourceChangeEvent.POST_CHANGE );
+        ResourcesPlugin.getWorkspace().addResourceChangeListener( this, IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_REFRESH );
 
         if ( input instanceof IFileEditorInput )
         {
