diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/META-INF/MANIFEST.MF
index 06392fb..3f403dd 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/META-INF/MANIFEST.MF
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/META-INF/MANIFEST.MF
@@ -37,7 +37,8 @@
  org.eclipse.jst.jsf.facesconfig.common,
  org.eclipse.jst.jsf.facesconfig,
  org.eclipse.ui.cheatsheets,
- org.apache.xerces
+ org.apache.xerces,
+ org.eclipse.wst.common.project.facet.core
 Eclipse-LazyStart: true
 Export-Package: org.eclipse.jst.jsf.facesconfig.ui,
  org.eclipse.jst.jsf.facesconfig.ui.dialog,
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigEditor.java
index bdbea68..576c266 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigEditor.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigEditor.java
@@ -19,6 +19,7 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IFolder;
@@ -96,6 +97,10 @@
 import org.eclipse.ui.part.FileEditorInput;
 import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
 import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.IProjectFacet;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
 import org.eclipse.wst.common.ui.properties.internal.provisional.ITabbedPropertySheetPageContributor;
 import org.eclipse.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
 import org.eclipse.wst.sse.ui.StructuredTextEditor;
@@ -146,6 +151,8 @@
 
 	private IProject currentProject;
 
+	private boolean isWebProject;
+
 	public FacesConfigEditor() {
 		initializeEMF();
 	}
@@ -325,6 +332,7 @@
 	 */
 	protected void setInput(IEditorInput input) {
 		super.setInput(input);
+		isWebProject = matches(input);
 
 		IFile inputFile = (IFile) input.getAdapter(IFile.class);
 		if (inputFile != null) {
@@ -339,38 +347,44 @@
 	 * 
 	 */
 	private void loadModel(IProject project, IPath modelPath) {
+		if (isWebProject) {
+			IFolder webContentFolder = WebrootUtil.getWebContentFolder(project);
+			Assert
+					.isTrue(webContentFolder != null
+							&& webContentFolder.exists());
 
-		IFolder webContentFolder = WebrootUtil.getWebContentFolder(project);
-		Assert.isTrue(webContentFolder != null && webContentFolder.exists());
+			IPath relativePath = modelPath;
+			if (webContentFolder.getFullPath().isPrefixOf(modelPath)) {
+				relativePath = modelPath.removeFirstSegments(webContentFolder
+						.getFullPath().segmentCount());
+			}
 
-		IPath relativePath = modelPath;
-		if (webContentFolder.getFullPath().isPrefixOf(modelPath)) {
-			relativePath = modelPath.removeFirstSegments(webContentFolder
-					.getFullPath().segmentCount());
+			facesConfigAtrifactEdit = FacesConfigArtifactEdit
+					.getFacesConfigArtifactEditForWrite(project, relativePath
+							.toString());
 		}
-		facesConfigAtrifactEdit = FacesConfigArtifactEdit
-				.getFacesConfigArtifactEditForWrite(project, relativePath
-						.toString());
 	}
 
 	protected void addPages() {
 		try {
-			IntroductionPage page1 = new IntroductionPage(this);
-			addPage(page1, null);
+			if (isWebProject) {
+				IntroductionPage page1 = new IntroductionPage(this);
+				addPage(page1, null);
 
-			IFormPage overviewPage = new OverviewPage(this);
-			addPage(overviewPage, null);
+				IFormPage overviewPage = new OverviewPage(this);
+				addPage(overviewPage, null);
 
-			// Page flow
-			createAndAddPageflowPage();
+				// Page flow
+				createAndAddPageflowPage();
 
-			// pages
-			IFormPage managedBeanPage = new ManagedBeanPage(this);
-			managedBeanPageID = addPage(managedBeanPage, null);
-			IFormPage componentsPage = new ComponentsPage(this);
-			componentsPageID = addPage(componentsPage, null);
-			IFormPage othersPage = new OthersPage(this);
-			othersPageID = addPage(othersPage, null);
+				// pages
+				IFormPage managedBeanPage = new ManagedBeanPage(this);
+				managedBeanPageID = addPage(managedBeanPage, null);
+				IFormPage componentsPage = new ComponentsPage(this);
+				componentsPageID = addPage(componentsPage, null);
+				IFormPage othersPage = new OthersPage(this);
+				othersPageID = addPage(othersPage, null);
+			}
 
 			sourcePage = new StructuredTextEditor();
 
@@ -442,9 +456,8 @@
 	 * @return - the action registry
 	 */
 	protected ActionRegistry getActionRegistry() {
-		if (null == actionRegistry) {
+		if (null == actionRegistry)
 			actionRegistry = new ActionRegistry();
-		}
 
 		return actionRegistry;
 	}
@@ -489,12 +502,12 @@
 		 */
 		public void addCommandStack(CommandStack commandStack,
 				IEditorPart editor) {
-			if (commandStack == null) {
+			if (commandStack == null)
 				return;
-			}
-			if (mapEditorCommandStack.get(commandStack) == editor) {
+
+			if (mapEditorCommandStack.get(commandStack) == editor)
 				return;
-			}
+
 			commandStacks.add(commandStack);
 			commandStack.addCommandStackListener(this);
 			mapEditorCommandStack.put(commandStack, editor);
@@ -509,7 +522,6 @@
 		 *            true or false
 		 */
 		private void setEditorDirty(IEditorPart editor, boolean dirty) {
-
 		}
 
 		/** the list of action ids that are to CommandStack actions */
@@ -618,9 +630,9 @@
 	 * @return the <code>CommandStackListener</code>
 	 */
 	protected MultiPageCommandStackListener getMultiPageCommandStackListener() {
-		if (null == multiPageCommandStackListener) {
+		if (null == multiPageCommandStackListener)
 			multiPageCommandStackListener = new MultiPageCommandStackListener();
-		}
+
 		return multiPageCommandStackListener;
 	}
 
@@ -633,12 +645,15 @@
 		WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
 			public void execute(IProgressMonitor monitor) {
 				try {
-					// modelResource.save(Collections.EMPTY_MAP);
-					facesConfigAtrifactEdit.getDeploymentDescriptorResource()
-							.save(Collections.EMPTY_MAP);
-					IFile file = ((IFileEditorInput) getEditorInput())
-							.getFile();
-					pageflowPage.doSave(file, monitor);
+					if (isWebProject) {
+						// modelResource.save(Collections.EMPTY_MAP);
+						facesConfigAtrifactEdit
+								.getDeploymentDescriptorResource().save(
+										Collections.EMPTY_MAP);
+						IFile file = ((IFileEditorInput) getEditorInput())
+								.getFile();
+						pageflowPage.doSave(file, monitor);
+					}
 					sourcePage.doSave(monitor);
 					getMultiPageCommandStackListener().markSaveLocations();
 				} catch (Exception e) {
@@ -747,7 +762,7 @@
 	 * @return - the <code>DelegatingZoomManager</code>
 	 */
 	protected DelegatingZoomManager getDelegatingZoomManager() {
-		if (!isValidInput(getEditorInput())) {
+		if (!isValidInput(getEditorInput()) || !isWebProject) {
 			return null;
 		}
 		if (null == delegatingZoomManager) {
@@ -969,7 +984,7 @@
 	/**
 	 * get the project of the faces config file that the editor is working on.
 	 * 
-	 * @return
+	 * @return IProject
 	 */
 	public IProject getProject() {
 		if (currentProject == null) {
@@ -1000,7 +1015,6 @@
 
 	public void addSelectionChangedListener(ISelectionChangedListener listener) {
 		selectionChangedListeners.add(listener);
-
 	}
 
 	public ISelection getSelection() {
@@ -1047,7 +1061,7 @@
 				.openQuestion(
 						getSite().getShell(),
 						"File Conflict",
-						" There are unsaved changes that conflict with changes made outside the editor.  Do you wish to discard this editor's changes?");
+						"There are unsaved changes that conflict with changes made outside the editor.  Do you wish to discard this editor's changes?");
 	}
 
 	/**
@@ -1089,4 +1103,46 @@
 			setActivePage(othersPageID);
 		}
 	}
+
+	private boolean matches(IEditorInput input) {
+		final IResource file = (IResource) input.getAdapter(IResource.class);
+		boolean hasWebFacet = false;
+		boolean hasJSFFacet = false;
+
+		if (file != null) {
+			final IProject project = file.getProject();
+
+			if (project != null) {
+				try {
+					final IFacetedProject facetedProject = ProjectFacetsManager
+							.create(project);
+
+					if (facetedProject != null) {
+						final Set facets = facetedProject.getProjectFacets();
+
+						for (final Iterator it = facets.iterator(); it
+								.hasNext();) {
+							final IProjectFacetVersion version = (IProjectFacetVersion) it
+									.next();
+
+							IProjectFacet facet = version.getProjectFacet();
+							if ("jst.jsf".equals(facet.getId())) {
+								hasJSFFacet = true;
+							} else if ("jst.web".equals(facet.getId())) {
+								hasWebFacet = true;
+							}
+						}
+					}
+				} catch (CoreException ex) {
+					EditorPlugin.getDefault().getLog().log(
+							new Status(IStatus.ERROR, EditorPlugin
+									.getPluginId(), IStatus.OK,
+									ex.getMessage() == null ? "" : ex
+											.getMessage(), ex));
+				}
+			}
+		}
+
+		return hasWebFacet && hasJSFFacet;
+	}
 }
