bug 193606
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaModelManager.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaModelManager.java
index 08ecf88..f69d462 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaModelManager.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaModelManager.java
@@ -33,6 +33,8 @@
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jpt.core.internal.prefs.JpaPreferenceConstants;
 import org.eclipse.wst.common.project.facet.core.FacetedProjectFramework;
+import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectEvent;
+import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectListener;
 
 public class JpaModelManager
 {
@@ -40,6 +42,8 @@
 	
 	private final IResourceChangeListener resourceChangeListener;
 	
+	private final IFacetedProjectListener facetedProjectListener;
+	
 	private final IElementChangedListener elementChangeListener;
 	
 	private final IPropertyChangeListener preferencesListener;
@@ -60,16 +64,18 @@
 	
 	private JpaModelManager() {
 		super();
-		this.model = JpaCoreFactory.eINSTANCE.createJpaModel();
-		this.resourceChangeListener = new ResourceChangeListener();
-		this.elementChangeListener = new ElementChangeListener();
-		this.preferencesListener = new PreferencesListener();
+		model = JpaCoreFactory.eINSTANCE.createJpaModel();
+		resourceChangeListener = new ResourceChangeListener();
+		facetedProjectListener = new FacetedProjectListener();
+		elementChangeListener = new ElementChangeListener();
+		preferencesListener = new PreferencesListener();
 	}
 	
 	void start() {
 		try {
 			this.buildWorkspace();
 			ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceChangeListener);
+			FacetedProjectFramework.addListener(facetedProjectListener, IFacetedProjectEvent.Type.values());
 			JavaCore.addElementChangedListener(elementChangeListener);
 			JptCorePlugin.getPlugin().getPluginPreferences().addPropertyChangeListener(preferencesListener);
 		}
@@ -296,6 +302,7 @@
 				
 				switch (event.getType()){
 					case IResourceChangeEvent.PRE_DELETE :
+					case IResourceChangeEvent.PRE_CLOSE :
 						try {
 							if ((resource.getType() == IResource.PROJECT)
 									&& (FacetedProjectFramework.hasProjectFacet(
@@ -314,9 +321,6 @@
 							checkForFilesBeingAddedOrRemoved(delta);
 						}
 						return;
-						
-					case IResourceChangeEvent.PRE_CLOSE :
-						return;
 				}
 			}
 		}
@@ -403,19 +407,7 @@
 											JptCorePlugin.log(ce);
 										}
 									}
-								} 
-								else {
-									// project has been closed.  dispose jpa project if it exists.
-									if (jpaProject != null) {
-										jpaProject.dispose();
-									}
 								}
-							}
-							else if ((delta.getFlags() & IResourceDelta.DESCRIPTION) != 0) {
-								// again, not sure ...
-							} 
-							else {
-								// ...
 							}		
 							break;
 					}
@@ -481,7 +473,70 @@
 	}
 	
 	
-	// ********** element change listener **********	
+	// **************** faceted project listener ******************************
+	
+	private static class FacetedProjectListener 
+		implements IFacetedProjectListener
+	{
+		ThreadLocal<FacetedProjectChangeProcessor> processors = 
+				new ThreadLocal<FacetedProjectChangeProcessor>();
+		
+		FacetedProjectListener() {
+			super();
+		}
+		
+		public void handleEvent(IFacetedProjectEvent event) {
+			getProcessor().handleEvent(event);
+		}
+		
+		public FacetedProjectChangeProcessor getProcessor() {
+			FacetedProjectChangeProcessor processor = processors.get();
+			if (processor == null) { 
+				processor = new FacetedProjectChangeProcessor();
+				processors.set(processor);
+			}
+			return processor;
+		}
+	}
+	
+	
+	private static class FacetedProjectChangeProcessor
+	{
+		private JpaModel model;
+		
+		FacetedProjectChangeProcessor() {
+			model = JpaModelManager.instance().model;
+		}
+		
+		protected void handleEvent(IFacetedProjectEvent event) {
+			IProject project = event.getProject().getProject();
+			JpaProject jpaProject = (JpaProject) model.getJpaProject(project);
+			boolean jpaFacetExists = false;
+			try {
+				jpaFacetExists = FacetedProjectFramework.hasProjectFacet(project, JptCorePlugin.FACET_ID);
+			}
+			catch (CoreException ce) {
+				// nothing to do, assume facet doesn't exist
+				JptCorePlugin.log(ce);
+			}
+			
+			if (jpaFacetExists && jpaProject == null) {
+				try {
+					JpaModelManager.instance().createFilledJpaProject(project);
+				}
+				catch (CoreException ce) {
+				// nothing to do, nothing we *can* do
+				JptCorePlugin.log(ce);
+				}
+			}
+			else if (jpaProject != null && ! jpaFacetExists) {
+				jpaProject.dispose();
+			}
+		}
+	}
+	
+	
+	// **************** element change listener *******************************
 
 	private static class ElementChangeListener 
 		implements IElementChangedListener
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaProject.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaProject.java
index 3013a57..15b88af 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaProject.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaProject.java
@@ -148,6 +148,12 @@
 	 * This is set to false when that job is completed 
 	 */
 	boolean resynching = false;
+	
+	/**
+	 * Flag to indicate that the disposing job has been scheduled or is running
+	 * (or has been run, in some cases)
+	 */
+	boolean disposing = false;
 
 	/**
 	 * Flag to indicate that the resynchJob needs to be run.  This is
@@ -573,6 +579,10 @@
 	 * Dispose and remove project
 	 */
 	void dispose() {
+		if (disposing) return;
+		
+		disposing = true;
+				
 		Job job = new Job("Disposing JPA project ...") {
 			@Override
 			protected IStatus run(IProgressMonitor monitor) {
@@ -696,7 +706,9 @@
 	//passing it on to the JpaModel.  We don't currently support
 	//multiple projects having cross-references
 	public void resynch() {
-		if (!this.resynching) {
+		if (disposing) return;
+		
+		if (! this.resynching) {
 			this.resynching = true;
 			this.needsToResynch = false;
 			this.resynchJob.schedule();